Statistics
| Branch: | Revision:

root / hw / pxa2xx_gpio.c @ 7bc3018b

History | View | Annotate | Download (10 kB)

1 c1713132 balrog
/*
2 c1713132 balrog
 * Intel XScale PXA255/270 GPIO controller emulation.
3 c1713132 balrog
 *
4 c1713132 balrog
 * Copyright (c) 2006 Openedhand Ltd.
5 c1713132 balrog
 * Written by Andrzej Zaborowski <balrog@zabor.org>
6 c1713132 balrog
 *
7 c1713132 balrog
 * This code is licensed under the GPL.
8 c1713132 balrog
 */
9 c1713132 balrog
10 87ecb68b pbrook
#include "hw.h"
11 0bb53337 Dmitry Eremin-Solenikov
#include "sysbus.h"
12 87ecb68b pbrook
#include "pxa.h"
13 c1713132 balrog
14 c1713132 balrog
#define PXA2XX_GPIO_BANKS        4
15 c1713132 balrog
16 0bb53337 Dmitry Eremin-Solenikov
typedef struct PXA2xxGPIOInfo PXA2xxGPIOInfo;
17 bc24a225 Paul Brook
struct PXA2xxGPIOInfo {
18 0bb53337 Dmitry Eremin-Solenikov
    SysBusDevice busdev;
19 55a8b801 Benoît Canet
    MemoryRegion iomem;
20 0bb53337 Dmitry Eremin-Solenikov
    qemu_irq irq0, irq1, irqX;
21 c1713132 balrog
    int lines;
22 0bb53337 Dmitry Eremin-Solenikov
    int ncpu;
23 95d42bb5 Andreas Färber
    ARMCPU *cpu;
24 c1713132 balrog
25 c1713132 balrog
    /* XXX: GNU C vectors are more suitable */
26 c1713132 balrog
    uint32_t ilevel[PXA2XX_GPIO_BANKS];
27 c1713132 balrog
    uint32_t olevel[PXA2XX_GPIO_BANKS];
28 c1713132 balrog
    uint32_t dir[PXA2XX_GPIO_BANKS];
29 c1713132 balrog
    uint32_t rising[PXA2XX_GPIO_BANKS];
30 c1713132 balrog
    uint32_t falling[PXA2XX_GPIO_BANKS];
31 c1713132 balrog
    uint32_t status[PXA2XX_GPIO_BANKS];
32 2b76bdc9 balrog
    uint32_t gpsr[PXA2XX_GPIO_BANKS];
33 c1713132 balrog
    uint32_t gafr[PXA2XX_GPIO_BANKS * 2];
34 c1713132 balrog
35 c1713132 balrog
    uint32_t prev_level[PXA2XX_GPIO_BANKS];
36 38641a52 balrog
    qemu_irq handler[PXA2XX_GPIO_BANKS * 32];
37 38641a52 balrog
    qemu_irq read_notify;
38 c1713132 balrog
};
39 c1713132 balrog
40 c1713132 balrog
static struct {
41 c1713132 balrog
    enum {
42 c1713132 balrog
        GPIO_NONE,
43 c1713132 balrog
        GPLR,
44 c1713132 balrog
        GPSR,
45 c1713132 balrog
        GPCR,
46 c1713132 balrog
        GPDR,
47 c1713132 balrog
        GRER,
48 c1713132 balrog
        GFER,
49 c1713132 balrog
        GEDR,
50 c1713132 balrog
        GAFR_L,
51 c1713132 balrog
        GAFR_U,
52 c1713132 balrog
    } reg;
53 c1713132 balrog
    int bank;
54 c1713132 balrog
} pxa2xx_gpio_regs[0x200] = {
55 c1713132 balrog
    [0 ... 0x1ff] = { GPIO_NONE, 0 },
56 c1713132 balrog
#define PXA2XX_REG(reg, a0, a1, a2, a3)        \
57 5fafdf24 ths
    [a0] = { reg, 0 }, [a1] = { reg, 1 }, [a2] = { reg, 2 }, [a3] = { reg, 3 },
58 c1713132 balrog
59 c1713132 balrog
    PXA2XX_REG(GPLR, 0x000, 0x004, 0x008, 0x100)
60 c1713132 balrog
    PXA2XX_REG(GPSR, 0x018, 0x01c, 0x020, 0x118)
61 c1713132 balrog
    PXA2XX_REG(GPCR, 0x024, 0x028, 0x02c, 0x124)
62 c1713132 balrog
    PXA2XX_REG(GPDR, 0x00c, 0x010, 0x014, 0x10c)
63 c1713132 balrog
    PXA2XX_REG(GRER, 0x030, 0x034, 0x038, 0x130)
64 c1713132 balrog
    PXA2XX_REG(GFER, 0x03c, 0x040, 0x044, 0x13c)
65 c1713132 balrog
    PXA2XX_REG(GEDR, 0x048, 0x04c, 0x050, 0x148)
66 c1713132 balrog
    PXA2XX_REG(GAFR_L, 0x054, 0x05c, 0x064, 0x06c)
67 c1713132 balrog
    PXA2XX_REG(GAFR_U, 0x058, 0x060, 0x068, 0x070)
68 c1713132 balrog
};
69 c1713132 balrog
70 bc24a225 Paul Brook
static void pxa2xx_gpio_irq_update(PXA2xxGPIOInfo *s)
71 c1713132 balrog
{
72 c1713132 balrog
    if (s->status[0] & (1 << 0))
73 0bb53337 Dmitry Eremin-Solenikov
        qemu_irq_raise(s->irq0);
74 c1713132 balrog
    else
75 0bb53337 Dmitry Eremin-Solenikov
        qemu_irq_lower(s->irq0);
76 c1713132 balrog
77 c1713132 balrog
    if (s->status[0] & (1 << 1))
78 0bb53337 Dmitry Eremin-Solenikov
        qemu_irq_raise(s->irq1);
79 c1713132 balrog
    else
80 0bb53337 Dmitry Eremin-Solenikov
        qemu_irq_lower(s->irq1);
81 c1713132 balrog
82 c1713132 balrog
    if ((s->status[0] & ~3) | s->status[1] | s->status[2] | s->status[3])
83 0bb53337 Dmitry Eremin-Solenikov
        qemu_irq_raise(s->irqX);
84 c1713132 balrog
    else
85 0bb53337 Dmitry Eremin-Solenikov
        qemu_irq_lower(s->irqX);
86 c1713132 balrog
}
87 c1713132 balrog
88 c1713132 balrog
/* Bitmap of pins used as standby and sleep wake-up sources.  */
89 38641a52 balrog
static const int pxa2xx_gpio_wake[PXA2XX_GPIO_BANKS] = {
90 c1713132 balrog
    0x8003fe1b, 0x002001fc, 0xec080000, 0x0012007f,
91 c1713132 balrog
};
92 c1713132 balrog
93 38641a52 balrog
static void pxa2xx_gpio_set(void *opaque, int line, int level)
94 c1713132 balrog
{
95 bc24a225 Paul Brook
    PXA2xxGPIOInfo *s = (PXA2xxGPIOInfo *) opaque;
96 c1713132 balrog
    int bank;
97 c1713132 balrog
    uint32_t mask;
98 c1713132 balrog
99 c1713132 balrog
    if (line >= s->lines) {
100 c1713132 balrog
        printf("%s: No GPIO pin %i\n", __FUNCTION__, line);
101 c1713132 balrog
        return;
102 c1713132 balrog
    }
103 c1713132 balrog
104 c1713132 balrog
    bank = line >> 5;
105 c1713132 balrog
    mask = 1 << (line & 31);
106 c1713132 balrog
107 c1713132 balrog
    if (level) {
108 c1713132 balrog
        s->status[bank] |= s->rising[bank] & mask &
109 c1713132 balrog
                ~s->ilevel[bank] & ~s->dir[bank];
110 c1713132 balrog
        s->ilevel[bank] |= mask;
111 c1713132 balrog
    } else {
112 c1713132 balrog
        s->status[bank] |= s->falling[bank] & mask &
113 c1713132 balrog
                s->ilevel[bank] & ~s->dir[bank];
114 c1713132 balrog
        s->ilevel[bank] &= ~mask;
115 c1713132 balrog
    }
116 c1713132 balrog
117 c1713132 balrog
    if (s->status[bank] & mask)
118 c1713132 balrog
        pxa2xx_gpio_irq_update(s);
119 c1713132 balrog
120 c1713132 balrog
    /* Wake-up GPIOs */
121 95d42bb5 Andreas Färber
    if (s->cpu->env.halted && (mask & ~s->dir[bank] & pxa2xx_gpio_wake[bank])) {
122 95d42bb5 Andreas Färber
        cpu_interrupt(&s->cpu->env, CPU_INTERRUPT_EXITTB);
123 95d42bb5 Andreas Färber
    }
124 c1713132 balrog
}
125 c1713132 balrog
126 bc24a225 Paul Brook
static void pxa2xx_gpio_handler_update(PXA2xxGPIOInfo *s) {
127 c1713132 balrog
    uint32_t level, diff;
128 c1713132 balrog
    int i, bit, line;
129 c1713132 balrog
    for (i = 0; i < PXA2XX_GPIO_BANKS; i ++) {
130 c1713132 balrog
        level = s->olevel[i] & s->dir[i];
131 c1713132 balrog
132 c1713132 balrog
        for (diff = s->prev_level[i] ^ level; diff; diff ^= 1 << bit) {
133 c1713132 balrog
            bit = ffs(diff) - 1;
134 c1713132 balrog
            line = bit + 32 * i;
135 38641a52 balrog
            qemu_set_irq(s->handler[line], (level >> bit) & 1);
136 c1713132 balrog
        }
137 c1713132 balrog
138 c1713132 balrog
        s->prev_level[i] = level;
139 c1713132 balrog
    }
140 c1713132 balrog
}
141 c1713132 balrog
142 55a8b801 Benoît Canet
static uint64_t pxa2xx_gpio_read(void *opaque, target_phys_addr_t offset,
143 55a8b801 Benoît Canet
                                 unsigned size)
144 c1713132 balrog
{
145 bc24a225 Paul Brook
    PXA2xxGPIOInfo *s = (PXA2xxGPIOInfo *) opaque;
146 c1713132 balrog
    uint32_t ret;
147 c1713132 balrog
    int bank;
148 c1713132 balrog
    if (offset >= 0x200)
149 c1713132 balrog
        return 0;
150 c1713132 balrog
151 c1713132 balrog
    bank = pxa2xx_gpio_regs[offset].bank;
152 c1713132 balrog
    switch (pxa2xx_gpio_regs[offset].reg) {
153 c1713132 balrog
    case GPDR:                /* GPIO Pin-Direction registers */
154 c1713132 balrog
        return s->dir[bank];
155 c1713132 balrog
156 2b76bdc9 balrog
    case GPSR:                /* GPIO Pin-Output Set registers */
157 2b76bdc9 balrog
        printf("%s: Read from a write-only register " REG_FMT "\n",
158 2b76bdc9 balrog
                        __FUNCTION__, offset);
159 2b76bdc9 balrog
        return s->gpsr[bank];        /* Return last written value.  */
160 2b76bdc9 balrog
161 e1dad5a6 balrog
    case GPCR:                /* GPIO Pin-Output Clear registers */
162 e1dad5a6 balrog
        printf("%s: Read from a write-only register " REG_FMT "\n",
163 e1dad5a6 balrog
                        __FUNCTION__, offset);
164 e1dad5a6 balrog
        return 31337;                /* Specified as unpredictable in the docs.  */
165 e1dad5a6 balrog
166 c1713132 balrog
    case GRER:                /* GPIO Rising-Edge Detect Enable registers */
167 c1713132 balrog
        return s->rising[bank];
168 c1713132 balrog
169 c1713132 balrog
    case GFER:                /* GPIO Falling-Edge Detect Enable registers */
170 c1713132 balrog
        return s->falling[bank];
171 c1713132 balrog
172 c1713132 balrog
    case GAFR_L:        /* GPIO Alternate Function registers */
173 c1713132 balrog
        return s->gafr[bank * 2];
174 c1713132 balrog
175 c1713132 balrog
    case GAFR_U:        /* GPIO Alternate Function registers */
176 c1713132 balrog
        return s->gafr[bank * 2 + 1];
177 c1713132 balrog
178 c1713132 balrog
    case GPLR:                /* GPIO Pin-Level registers */
179 c1713132 balrog
        ret = (s->olevel[bank] & s->dir[bank]) |
180 c1713132 balrog
                (s->ilevel[bank] & ~s->dir[bank]);
181 38641a52 balrog
        qemu_irq_raise(s->read_notify);
182 c1713132 balrog
        return ret;
183 c1713132 balrog
184 c1713132 balrog
    case GEDR:                /* GPIO Edge Detect Status registers */
185 c1713132 balrog
        return s->status[bank];
186 c1713132 balrog
187 c1713132 balrog
    default:
188 2ac71179 Paul Brook
        hw_error("%s: Bad offset " REG_FMT "\n", __FUNCTION__, offset);
189 c1713132 balrog
    }
190 c1713132 balrog
191 c1713132 balrog
    return 0;
192 c1713132 balrog
}
193 c1713132 balrog
194 55a8b801 Benoît Canet
static void pxa2xx_gpio_write(void *opaque, target_phys_addr_t offset,
195 55a8b801 Benoît Canet
                              uint64_t value, unsigned size)
196 c1713132 balrog
{
197 bc24a225 Paul Brook
    PXA2xxGPIOInfo *s = (PXA2xxGPIOInfo *) opaque;
198 c1713132 balrog
    int bank;
199 c1713132 balrog
    if (offset >= 0x200)
200 c1713132 balrog
        return;
201 c1713132 balrog
202 c1713132 balrog
    bank = pxa2xx_gpio_regs[offset].bank;
203 c1713132 balrog
    switch (pxa2xx_gpio_regs[offset].reg) {
204 c1713132 balrog
    case GPDR:                /* GPIO Pin-Direction registers */
205 c1713132 balrog
        s->dir[bank] = value;
206 c1713132 balrog
        pxa2xx_gpio_handler_update(s);
207 c1713132 balrog
        break;
208 c1713132 balrog
209 c1713132 balrog
    case GPSR:                /* GPIO Pin-Output Set registers */
210 c1713132 balrog
        s->olevel[bank] |= value;
211 c1713132 balrog
        pxa2xx_gpio_handler_update(s);
212 2b76bdc9 balrog
        s->gpsr[bank] = value;
213 c1713132 balrog
        break;
214 c1713132 balrog
215 c1713132 balrog
    case GPCR:                /* GPIO Pin-Output Clear registers */
216 c1713132 balrog
        s->olevel[bank] &= ~value;
217 c1713132 balrog
        pxa2xx_gpio_handler_update(s);
218 c1713132 balrog
        break;
219 c1713132 balrog
220 c1713132 balrog
    case GRER:                /* GPIO Rising-Edge Detect Enable registers */
221 c1713132 balrog
        s->rising[bank] = value;
222 c1713132 balrog
        break;
223 c1713132 balrog
224 c1713132 balrog
    case GFER:                /* GPIO Falling-Edge Detect Enable registers */
225 c1713132 balrog
        s->falling[bank] = value;
226 c1713132 balrog
        break;
227 c1713132 balrog
228 c1713132 balrog
    case GAFR_L:        /* GPIO Alternate Function registers */
229 c1713132 balrog
        s->gafr[bank * 2] = value;
230 c1713132 balrog
        break;
231 c1713132 balrog
232 c1713132 balrog
    case GAFR_U:        /* GPIO Alternate Function registers */
233 c1713132 balrog
        s->gafr[bank * 2 + 1] = value;
234 c1713132 balrog
        break;
235 c1713132 balrog
236 c1713132 balrog
    case GEDR:                /* GPIO Edge Detect Status registers */
237 c1713132 balrog
        s->status[bank] &= ~value;
238 c1713132 balrog
        pxa2xx_gpio_irq_update(s);
239 c1713132 balrog
        break;
240 c1713132 balrog
241 c1713132 balrog
    default:
242 2ac71179 Paul Brook
        hw_error("%s: Bad offset " REG_FMT "\n", __FUNCTION__, offset);
243 c1713132 balrog
    }
244 c1713132 balrog
}
245 c1713132 balrog
246 55a8b801 Benoît Canet
static const MemoryRegionOps pxa_gpio_ops = {
247 55a8b801 Benoît Canet
    .read = pxa2xx_gpio_read,
248 55a8b801 Benoît Canet
    .write = pxa2xx_gpio_write,
249 55a8b801 Benoît Canet
    .endianness = DEVICE_NATIVE_ENDIAN,
250 c1713132 balrog
};
251 c1713132 balrog
252 0bb53337 Dmitry Eremin-Solenikov
DeviceState *pxa2xx_gpio_init(target_phys_addr_t base,
253 5ae93306 Andreas Färber
                CPUARMState *env, DeviceState *pic, int lines)
254 aa941b94 balrog
{
255 0bb53337 Dmitry Eremin-Solenikov
    DeviceState *dev;
256 aa941b94 balrog
257 0bb53337 Dmitry Eremin-Solenikov
    dev = qdev_create(NULL, "pxa2xx-gpio");
258 0bb53337 Dmitry Eremin-Solenikov
    qdev_prop_set_int32(dev, "lines", lines);
259 0bb53337 Dmitry Eremin-Solenikov
    qdev_prop_set_int32(dev, "ncpu", env->cpu_index);
260 0bb53337 Dmitry Eremin-Solenikov
    qdev_init_nofail(dev);
261 aa941b94 balrog
262 0bb53337 Dmitry Eremin-Solenikov
    sysbus_mmio_map(sysbus_from_qdev(dev), 0, base);
263 e1f8c729 Dmitry Eremin-Solenikov
    sysbus_connect_irq(sysbus_from_qdev(dev), 0,
264 e1f8c729 Dmitry Eremin-Solenikov
                    qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_0));
265 e1f8c729 Dmitry Eremin-Solenikov
    sysbus_connect_irq(sysbus_from_qdev(dev), 1,
266 e1f8c729 Dmitry Eremin-Solenikov
                    qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_1));
267 e1f8c729 Dmitry Eremin-Solenikov
    sysbus_connect_irq(sysbus_from_qdev(dev), 2,
268 e1f8c729 Dmitry Eremin-Solenikov
                    qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_X));
269 aa941b94 balrog
270 0bb53337 Dmitry Eremin-Solenikov
    return dev;
271 aa941b94 balrog
}
272 aa941b94 balrog
273 0bb53337 Dmitry Eremin-Solenikov
static int pxa2xx_gpio_initfn(SysBusDevice *dev)
274 c1713132 balrog
{
275 bc24a225 Paul Brook
    PXA2xxGPIOInfo *s;
276 c1713132 balrog
277 0bb53337 Dmitry Eremin-Solenikov
    s = FROM_SYSBUS(PXA2xxGPIOInfo, dev);
278 c1713132 balrog
279 95d42bb5 Andreas Färber
    s->cpu = arm_env_get_cpu(qemu_get_cpu(s->ncpu));
280 c1713132 balrog
281 0bb53337 Dmitry Eremin-Solenikov
    qdev_init_gpio_in(&dev->qdev, pxa2xx_gpio_set, s->lines);
282 0bb53337 Dmitry Eremin-Solenikov
    qdev_init_gpio_out(&dev->qdev, s->handler, s->lines);
283 c1713132 balrog
284 55a8b801 Benoît Canet
    memory_region_init_io(&s->iomem, &pxa_gpio_ops, s, "pxa2xx-gpio", 0x1000);
285 750ecd44 Avi Kivity
    sysbus_init_mmio(dev, &s->iomem);
286 0bb53337 Dmitry Eremin-Solenikov
    sysbus_init_irq(dev, &s->irq0);
287 0bb53337 Dmitry Eremin-Solenikov
    sysbus_init_irq(dev, &s->irq1);
288 0bb53337 Dmitry Eremin-Solenikov
    sysbus_init_irq(dev, &s->irqX);
289 c1713132 balrog
290 0bb53337 Dmitry Eremin-Solenikov
    return 0;
291 c1713132 balrog
}
292 c1713132 balrog
293 c1713132 balrog
/*
294 c1713132 balrog
 * Registers a callback to notify on GPLR reads.  This normally
295 c1713132 balrog
 * shouldn't be needed but it is used for the hack on Spitz machines.
296 c1713132 balrog
 */
297 0bb53337 Dmitry Eremin-Solenikov
void pxa2xx_gpio_read_notifier(DeviceState *dev, qemu_irq handler)
298 38641a52 balrog
{
299 0bb53337 Dmitry Eremin-Solenikov
    PXA2xxGPIOInfo *s = FROM_SYSBUS(PXA2xxGPIOInfo, sysbus_from_qdev(dev));
300 c1713132 balrog
    s->read_notify = handler;
301 c1713132 balrog
}
302 0bb53337 Dmitry Eremin-Solenikov
303 0bb53337 Dmitry Eremin-Solenikov
static const VMStateDescription vmstate_pxa2xx_gpio_regs = {
304 0bb53337 Dmitry Eremin-Solenikov
    .name = "pxa2xx-gpio",
305 0bb53337 Dmitry Eremin-Solenikov
    .version_id = 1,
306 0bb53337 Dmitry Eremin-Solenikov
    .minimum_version_id = 1,
307 0bb53337 Dmitry Eremin-Solenikov
    .minimum_version_id_old = 1,
308 0bb53337 Dmitry Eremin-Solenikov
    .fields = (VMStateField []) {
309 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_INT32(lines, PXA2xxGPIOInfo),
310 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(ilevel, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
311 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(olevel, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
312 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(dir, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
313 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(rising, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
314 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(falling, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
315 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(status, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
316 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(gafr, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS * 2),
317 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_END_OF_LIST(),
318 0bb53337 Dmitry Eremin-Solenikov
    },
319 0bb53337 Dmitry Eremin-Solenikov
};
320 0bb53337 Dmitry Eremin-Solenikov
321 999e12bb Anthony Liguori
static Property pxa2xx_gpio_properties[] = {
322 999e12bb Anthony Liguori
    DEFINE_PROP_INT32("lines", PXA2xxGPIOInfo, lines, 0),
323 999e12bb Anthony Liguori
    DEFINE_PROP_INT32("ncpu", PXA2xxGPIOInfo, ncpu, 0),
324 999e12bb Anthony Liguori
    DEFINE_PROP_END_OF_LIST(),
325 999e12bb Anthony Liguori
};
326 999e12bb Anthony Liguori
327 999e12bb Anthony Liguori
static void pxa2xx_gpio_class_init(ObjectClass *klass, void *data)
328 999e12bb Anthony Liguori
{
329 39bffca2 Anthony Liguori
    DeviceClass *dc = DEVICE_CLASS(klass);
330 999e12bb Anthony Liguori
    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
331 999e12bb Anthony Liguori
332 999e12bb Anthony Liguori
    k->init = pxa2xx_gpio_initfn;
333 39bffca2 Anthony Liguori
    dc->desc = "PXA2xx GPIO controller";
334 39bffca2 Anthony Liguori
    dc->props = pxa2xx_gpio_properties;
335 999e12bb Anthony Liguori
}
336 999e12bb Anthony Liguori
337 39bffca2 Anthony Liguori
static TypeInfo pxa2xx_gpio_info = {
338 39bffca2 Anthony Liguori
    .name          = "pxa2xx-gpio",
339 39bffca2 Anthony Liguori
    .parent        = TYPE_SYS_BUS_DEVICE,
340 39bffca2 Anthony Liguori
    .instance_size = sizeof(PXA2xxGPIOInfo),
341 39bffca2 Anthony Liguori
    .class_init    = pxa2xx_gpio_class_init,
342 0bb53337 Dmitry Eremin-Solenikov
};
343 0bb53337 Dmitry Eremin-Solenikov
344 83f7d43a Andreas Färber
static void pxa2xx_gpio_register_types(void)
345 0bb53337 Dmitry Eremin-Solenikov
{
346 39bffca2 Anthony Liguori
    type_register_static(&pxa2xx_gpio_info);
347 0bb53337 Dmitry Eremin-Solenikov
}
348 83f7d43a Andreas Färber
349 83f7d43a Andreas Färber
type_init(pxa2xx_gpio_register_types)