Statistics
| Branch: | Revision:

root / hw / pxa2xx_gpio.c @ 7830cf78

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 a8170e5e Avi Kivity
static uint64_t pxa2xx_gpio_read(void *opaque, hwaddr 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 a8170e5e Avi Kivity
static void pxa2xx_gpio_write(void *opaque, hwaddr 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 a8170e5e Avi Kivity
DeviceState *pxa2xx_gpio_init(hwaddr base,
253 55e5c285 Andreas Färber
                              ARMCPU *cpu, DeviceState *pic, int lines)
254 aa941b94 balrog
{
255 55e5c285 Andreas Färber
    CPUState *cs = CPU(cpu);
256 0bb53337 Dmitry Eremin-Solenikov
    DeviceState *dev;
257 aa941b94 balrog
258 0bb53337 Dmitry Eremin-Solenikov
    dev = qdev_create(NULL, "pxa2xx-gpio");
259 0bb53337 Dmitry Eremin-Solenikov
    qdev_prop_set_int32(dev, "lines", lines);
260 55e5c285 Andreas Färber
    qdev_prop_set_int32(dev, "ncpu", cs->cpu_index);
261 0bb53337 Dmitry Eremin-Solenikov
    qdev_init_nofail(dev);
262 aa941b94 balrog
263 1356b98d Andreas Färber
    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
264 1356b98d Andreas Färber
    sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
265 e1f8c729 Dmitry Eremin-Solenikov
                    qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_0));
266 1356b98d Andreas Färber
    sysbus_connect_irq(SYS_BUS_DEVICE(dev), 1,
267 e1f8c729 Dmitry Eremin-Solenikov
                    qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_1));
268 1356b98d Andreas Färber
    sysbus_connect_irq(SYS_BUS_DEVICE(dev), 2,
269 e1f8c729 Dmitry Eremin-Solenikov
                    qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_X));
270 aa941b94 balrog
271 0bb53337 Dmitry Eremin-Solenikov
    return dev;
272 aa941b94 balrog
}
273 aa941b94 balrog
274 0bb53337 Dmitry Eremin-Solenikov
static int pxa2xx_gpio_initfn(SysBusDevice *dev)
275 c1713132 balrog
{
276 bc24a225 Paul Brook
    PXA2xxGPIOInfo *s;
277 c1713132 balrog
278 0bb53337 Dmitry Eremin-Solenikov
    s = FROM_SYSBUS(PXA2xxGPIOInfo, dev);
279 c1713132 balrog
280 38d8f5c8 Andreas Färber
    s->cpu = ARM_CPU(qemu_get_cpu(s->ncpu));
281 c1713132 balrog
282 0bb53337 Dmitry Eremin-Solenikov
    qdev_init_gpio_in(&dev->qdev, pxa2xx_gpio_set, s->lines);
283 0bb53337 Dmitry Eremin-Solenikov
    qdev_init_gpio_out(&dev->qdev, s->handler, s->lines);
284 c1713132 balrog
285 55a8b801 Benoît Canet
    memory_region_init_io(&s->iomem, &pxa_gpio_ops, s, "pxa2xx-gpio", 0x1000);
286 750ecd44 Avi Kivity
    sysbus_init_mmio(dev, &s->iomem);
287 0bb53337 Dmitry Eremin-Solenikov
    sysbus_init_irq(dev, &s->irq0);
288 0bb53337 Dmitry Eremin-Solenikov
    sysbus_init_irq(dev, &s->irq1);
289 0bb53337 Dmitry Eremin-Solenikov
    sysbus_init_irq(dev, &s->irqX);
290 c1713132 balrog
291 0bb53337 Dmitry Eremin-Solenikov
    return 0;
292 c1713132 balrog
}
293 c1713132 balrog
294 c1713132 balrog
/*
295 c1713132 balrog
 * Registers a callback to notify on GPLR reads.  This normally
296 c1713132 balrog
 * shouldn't be needed but it is used for the hack on Spitz machines.
297 c1713132 balrog
 */
298 0bb53337 Dmitry Eremin-Solenikov
void pxa2xx_gpio_read_notifier(DeviceState *dev, qemu_irq handler)
299 38641a52 balrog
{
300 1356b98d Andreas Färber
    PXA2xxGPIOInfo *s = FROM_SYSBUS(PXA2xxGPIOInfo, SYS_BUS_DEVICE(dev));
301 c1713132 balrog
    s->read_notify = handler;
302 c1713132 balrog
}
303 0bb53337 Dmitry Eremin-Solenikov
304 0bb53337 Dmitry Eremin-Solenikov
static const VMStateDescription vmstate_pxa2xx_gpio_regs = {
305 0bb53337 Dmitry Eremin-Solenikov
    .name = "pxa2xx-gpio",
306 0bb53337 Dmitry Eremin-Solenikov
    .version_id = 1,
307 0bb53337 Dmitry Eremin-Solenikov
    .minimum_version_id = 1,
308 0bb53337 Dmitry Eremin-Solenikov
    .minimum_version_id_old = 1,
309 0bb53337 Dmitry Eremin-Solenikov
    .fields = (VMStateField []) {
310 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_INT32(lines, PXA2xxGPIOInfo),
311 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(ilevel, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
312 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(olevel, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
313 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(dir, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
314 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(rising, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
315 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(falling, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
316 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(status, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
317 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(gafr, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS * 2),
318 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_END_OF_LIST(),
319 0bb53337 Dmitry Eremin-Solenikov
    },
320 0bb53337 Dmitry Eremin-Solenikov
};
321 0bb53337 Dmitry Eremin-Solenikov
322 999e12bb Anthony Liguori
static Property pxa2xx_gpio_properties[] = {
323 999e12bb Anthony Liguori
    DEFINE_PROP_INT32("lines", PXA2xxGPIOInfo, lines, 0),
324 999e12bb Anthony Liguori
    DEFINE_PROP_INT32("ncpu", PXA2xxGPIOInfo, ncpu, 0),
325 999e12bb Anthony Liguori
    DEFINE_PROP_END_OF_LIST(),
326 999e12bb Anthony Liguori
};
327 999e12bb Anthony Liguori
328 999e12bb Anthony Liguori
static void pxa2xx_gpio_class_init(ObjectClass *klass, void *data)
329 999e12bb Anthony Liguori
{
330 39bffca2 Anthony Liguori
    DeviceClass *dc = DEVICE_CLASS(klass);
331 999e12bb Anthony Liguori
    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
332 999e12bb Anthony Liguori
333 999e12bb Anthony Liguori
    k->init = pxa2xx_gpio_initfn;
334 39bffca2 Anthony Liguori
    dc->desc = "PXA2xx GPIO controller";
335 39bffca2 Anthony Liguori
    dc->props = pxa2xx_gpio_properties;
336 999e12bb Anthony Liguori
}
337 999e12bb Anthony Liguori
338 8c43a6f0 Andreas Färber
static const TypeInfo pxa2xx_gpio_info = {
339 39bffca2 Anthony Liguori
    .name          = "pxa2xx-gpio",
340 39bffca2 Anthony Liguori
    .parent        = TYPE_SYS_BUS_DEVICE,
341 39bffca2 Anthony Liguori
    .instance_size = sizeof(PXA2xxGPIOInfo),
342 39bffca2 Anthony Liguori
    .class_init    = pxa2xx_gpio_class_init,
343 0bb53337 Dmitry Eremin-Solenikov
};
344 0bb53337 Dmitry Eremin-Solenikov
345 83f7d43a Andreas Färber
static void pxa2xx_gpio_register_types(void)
346 0bb53337 Dmitry Eremin-Solenikov
{
347 39bffca2 Anthony Liguori
    type_register_static(&pxa2xx_gpio_info);
348 0bb53337 Dmitry Eremin-Solenikov
}
349 83f7d43a Andreas Färber
350 83f7d43a Andreas Färber
type_init(pxa2xx_gpio_register_types)