Statistics
| Branch: | Revision:

root / hw / pxa2xx_gpio.c @ 57c83dac

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 c1713132 balrog
    CPUState *cpu_env;
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 c1713132 balrog
    if (s->cpu_env->halted && (mask & ~s->dir[bank] & pxa2xx_gpio_wake[bank]))
122 c1713132 balrog
        cpu_interrupt(s->cpu_env, CPU_INTERRUPT_EXITTB);
123 c1713132 balrog
}
124 c1713132 balrog
125 bc24a225 Paul Brook
static void pxa2xx_gpio_handler_update(PXA2xxGPIOInfo *s) {
126 c1713132 balrog
    uint32_t level, diff;
127 c1713132 balrog
    int i, bit, line;
128 c1713132 balrog
    for (i = 0; i < PXA2XX_GPIO_BANKS; i ++) {
129 c1713132 balrog
        level = s->olevel[i] & s->dir[i];
130 c1713132 balrog
131 c1713132 balrog
        for (diff = s->prev_level[i] ^ level; diff; diff ^= 1 << bit) {
132 c1713132 balrog
            bit = ffs(diff) - 1;
133 c1713132 balrog
            line = bit + 32 * i;
134 38641a52 balrog
            qemu_set_irq(s->handler[line], (level >> bit) & 1);
135 c1713132 balrog
        }
136 c1713132 balrog
137 c1713132 balrog
        s->prev_level[i] = level;
138 c1713132 balrog
    }
139 c1713132 balrog
}
140 c1713132 balrog
141 55a8b801 Benoît Canet
static uint64_t pxa2xx_gpio_read(void *opaque, target_phys_addr_t offset,
142 55a8b801 Benoît Canet
                                 unsigned size)
143 c1713132 balrog
{
144 bc24a225 Paul Brook
    PXA2xxGPIOInfo *s = (PXA2xxGPIOInfo *) opaque;
145 c1713132 balrog
    uint32_t ret;
146 c1713132 balrog
    int bank;
147 c1713132 balrog
    if (offset >= 0x200)
148 c1713132 balrog
        return 0;
149 c1713132 balrog
150 c1713132 balrog
    bank = pxa2xx_gpio_regs[offset].bank;
151 c1713132 balrog
    switch (pxa2xx_gpio_regs[offset].reg) {
152 c1713132 balrog
    case GPDR:                /* GPIO Pin-Direction registers */
153 c1713132 balrog
        return s->dir[bank];
154 c1713132 balrog
155 2b76bdc9 balrog
    case GPSR:                /* GPIO Pin-Output Set registers */
156 2b76bdc9 balrog
        printf("%s: Read from a write-only register " REG_FMT "\n",
157 2b76bdc9 balrog
                        __FUNCTION__, offset);
158 2b76bdc9 balrog
        return s->gpsr[bank];        /* Return last written value.  */
159 2b76bdc9 balrog
160 e1dad5a6 balrog
    case GPCR:                /* GPIO Pin-Output Clear registers */
161 e1dad5a6 balrog
        printf("%s: Read from a write-only register " REG_FMT "\n",
162 e1dad5a6 balrog
                        __FUNCTION__, offset);
163 e1dad5a6 balrog
        return 31337;                /* Specified as unpredictable in the docs.  */
164 e1dad5a6 balrog
165 c1713132 balrog
    case GRER:                /* GPIO Rising-Edge Detect Enable registers */
166 c1713132 balrog
        return s->rising[bank];
167 c1713132 balrog
168 c1713132 balrog
    case GFER:                /* GPIO Falling-Edge Detect Enable registers */
169 c1713132 balrog
        return s->falling[bank];
170 c1713132 balrog
171 c1713132 balrog
    case GAFR_L:        /* GPIO Alternate Function registers */
172 c1713132 balrog
        return s->gafr[bank * 2];
173 c1713132 balrog
174 c1713132 balrog
    case GAFR_U:        /* GPIO Alternate Function registers */
175 c1713132 balrog
        return s->gafr[bank * 2 + 1];
176 c1713132 balrog
177 c1713132 balrog
    case GPLR:                /* GPIO Pin-Level registers */
178 c1713132 balrog
        ret = (s->olevel[bank] & s->dir[bank]) |
179 c1713132 balrog
                (s->ilevel[bank] & ~s->dir[bank]);
180 38641a52 balrog
        qemu_irq_raise(s->read_notify);
181 c1713132 balrog
        return ret;
182 c1713132 balrog
183 c1713132 balrog
    case GEDR:                /* GPIO Edge Detect Status registers */
184 c1713132 balrog
        return s->status[bank];
185 c1713132 balrog
186 c1713132 balrog
    default:
187 2ac71179 Paul Brook
        hw_error("%s: Bad offset " REG_FMT "\n", __FUNCTION__, offset);
188 c1713132 balrog
    }
189 c1713132 balrog
190 c1713132 balrog
    return 0;
191 c1713132 balrog
}
192 c1713132 balrog
193 55a8b801 Benoît Canet
static void pxa2xx_gpio_write(void *opaque, target_phys_addr_t offset,
194 55a8b801 Benoît Canet
                              uint64_t value, unsigned size)
195 c1713132 balrog
{
196 bc24a225 Paul Brook
    PXA2xxGPIOInfo *s = (PXA2xxGPIOInfo *) opaque;
197 c1713132 balrog
    int bank;
198 c1713132 balrog
    if (offset >= 0x200)
199 c1713132 balrog
        return;
200 c1713132 balrog
201 c1713132 balrog
    bank = pxa2xx_gpio_regs[offset].bank;
202 c1713132 balrog
    switch (pxa2xx_gpio_regs[offset].reg) {
203 c1713132 balrog
    case GPDR:                /* GPIO Pin-Direction registers */
204 c1713132 balrog
        s->dir[bank] = value;
205 c1713132 balrog
        pxa2xx_gpio_handler_update(s);
206 c1713132 balrog
        break;
207 c1713132 balrog
208 c1713132 balrog
    case GPSR:                /* GPIO Pin-Output Set registers */
209 c1713132 balrog
        s->olevel[bank] |= value;
210 c1713132 balrog
        pxa2xx_gpio_handler_update(s);
211 2b76bdc9 balrog
        s->gpsr[bank] = value;
212 c1713132 balrog
        break;
213 c1713132 balrog
214 c1713132 balrog
    case GPCR:                /* GPIO Pin-Output Clear registers */
215 c1713132 balrog
        s->olevel[bank] &= ~value;
216 c1713132 balrog
        pxa2xx_gpio_handler_update(s);
217 c1713132 balrog
        break;
218 c1713132 balrog
219 c1713132 balrog
    case GRER:                /* GPIO Rising-Edge Detect Enable registers */
220 c1713132 balrog
        s->rising[bank] = value;
221 c1713132 balrog
        break;
222 c1713132 balrog
223 c1713132 balrog
    case GFER:                /* GPIO Falling-Edge Detect Enable registers */
224 c1713132 balrog
        s->falling[bank] = value;
225 c1713132 balrog
        break;
226 c1713132 balrog
227 c1713132 balrog
    case GAFR_L:        /* GPIO Alternate Function registers */
228 c1713132 balrog
        s->gafr[bank * 2] = value;
229 c1713132 balrog
        break;
230 c1713132 balrog
231 c1713132 balrog
    case GAFR_U:        /* GPIO Alternate Function registers */
232 c1713132 balrog
        s->gafr[bank * 2 + 1] = value;
233 c1713132 balrog
        break;
234 c1713132 balrog
235 c1713132 balrog
    case GEDR:                /* GPIO Edge Detect Status registers */
236 c1713132 balrog
        s->status[bank] &= ~value;
237 c1713132 balrog
        pxa2xx_gpio_irq_update(s);
238 c1713132 balrog
        break;
239 c1713132 balrog
240 c1713132 balrog
    default:
241 2ac71179 Paul Brook
        hw_error("%s: Bad offset " REG_FMT "\n", __FUNCTION__, offset);
242 c1713132 balrog
    }
243 c1713132 balrog
}
244 c1713132 balrog
245 55a8b801 Benoît Canet
static const MemoryRegionOps pxa_gpio_ops = {
246 55a8b801 Benoît Canet
    .read = pxa2xx_gpio_read,
247 55a8b801 Benoît Canet
    .write = pxa2xx_gpio_write,
248 55a8b801 Benoît Canet
    .endianness = DEVICE_NATIVE_ENDIAN,
249 c1713132 balrog
};
250 c1713132 balrog
251 0bb53337 Dmitry Eremin-Solenikov
DeviceState *pxa2xx_gpio_init(target_phys_addr_t base,
252 e1f8c729 Dmitry Eremin-Solenikov
                CPUState *env, DeviceState *pic, int lines)
253 aa941b94 balrog
{
254 0bb53337 Dmitry Eremin-Solenikov
    DeviceState *dev;
255 aa941b94 balrog
256 0bb53337 Dmitry Eremin-Solenikov
    dev = qdev_create(NULL, "pxa2xx-gpio");
257 0bb53337 Dmitry Eremin-Solenikov
    qdev_prop_set_int32(dev, "lines", lines);
258 0bb53337 Dmitry Eremin-Solenikov
    qdev_prop_set_int32(dev, "ncpu", env->cpu_index);
259 0bb53337 Dmitry Eremin-Solenikov
    qdev_init_nofail(dev);
260 aa941b94 balrog
261 0bb53337 Dmitry Eremin-Solenikov
    sysbus_mmio_map(sysbus_from_qdev(dev), 0, base);
262 e1f8c729 Dmitry Eremin-Solenikov
    sysbus_connect_irq(sysbus_from_qdev(dev), 0,
263 e1f8c729 Dmitry Eremin-Solenikov
                    qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_0));
264 e1f8c729 Dmitry Eremin-Solenikov
    sysbus_connect_irq(sysbus_from_qdev(dev), 1,
265 e1f8c729 Dmitry Eremin-Solenikov
                    qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_1));
266 e1f8c729 Dmitry Eremin-Solenikov
    sysbus_connect_irq(sysbus_from_qdev(dev), 2,
267 e1f8c729 Dmitry Eremin-Solenikov
                    qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_X));
268 aa941b94 balrog
269 0bb53337 Dmitry Eremin-Solenikov
    return dev;
270 aa941b94 balrog
}
271 aa941b94 balrog
272 0bb53337 Dmitry Eremin-Solenikov
static int pxa2xx_gpio_initfn(SysBusDevice *dev)
273 c1713132 balrog
{
274 bc24a225 Paul Brook
    PXA2xxGPIOInfo *s;
275 c1713132 balrog
276 0bb53337 Dmitry Eremin-Solenikov
    s = FROM_SYSBUS(PXA2xxGPIOInfo, dev);
277 c1713132 balrog
278 0bb53337 Dmitry Eremin-Solenikov
    s->cpu_env = qemu_get_cpu(s->ncpu);
279 c1713132 balrog
280 0bb53337 Dmitry Eremin-Solenikov
    qdev_init_gpio_in(&dev->qdev, pxa2xx_gpio_set, s->lines);
281 0bb53337 Dmitry Eremin-Solenikov
    qdev_init_gpio_out(&dev->qdev, s->handler, s->lines);
282 c1713132 balrog
283 55a8b801 Benoît Canet
    memory_region_init_io(&s->iomem, &pxa_gpio_ops, s, "pxa2xx-gpio", 0x1000);
284 750ecd44 Avi Kivity
    sysbus_init_mmio(dev, &s->iomem);
285 0bb53337 Dmitry Eremin-Solenikov
    sysbus_init_irq(dev, &s->irq0);
286 0bb53337 Dmitry Eremin-Solenikov
    sysbus_init_irq(dev, &s->irq1);
287 0bb53337 Dmitry Eremin-Solenikov
    sysbus_init_irq(dev, &s->irqX);
288 c1713132 balrog
289 0bb53337 Dmitry Eremin-Solenikov
    return 0;
290 c1713132 balrog
}
291 c1713132 balrog
292 c1713132 balrog
/*
293 c1713132 balrog
 * Registers a callback to notify on GPLR reads.  This normally
294 c1713132 balrog
 * shouldn't be needed but it is used for the hack on Spitz machines.
295 c1713132 balrog
 */
296 0bb53337 Dmitry Eremin-Solenikov
void pxa2xx_gpio_read_notifier(DeviceState *dev, qemu_irq handler)
297 38641a52 balrog
{
298 0bb53337 Dmitry Eremin-Solenikov
    PXA2xxGPIOInfo *s = FROM_SYSBUS(PXA2xxGPIOInfo, sysbus_from_qdev(dev));
299 c1713132 balrog
    s->read_notify = handler;
300 c1713132 balrog
}
301 0bb53337 Dmitry Eremin-Solenikov
302 0bb53337 Dmitry Eremin-Solenikov
static const VMStateDescription vmstate_pxa2xx_gpio_regs = {
303 0bb53337 Dmitry Eremin-Solenikov
    .name = "pxa2xx-gpio",
304 0bb53337 Dmitry Eremin-Solenikov
    .version_id = 1,
305 0bb53337 Dmitry Eremin-Solenikov
    .minimum_version_id = 1,
306 0bb53337 Dmitry Eremin-Solenikov
    .minimum_version_id_old = 1,
307 0bb53337 Dmitry Eremin-Solenikov
    .fields = (VMStateField []) {
308 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_INT32(lines, PXA2xxGPIOInfo),
309 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(ilevel, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
310 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(olevel, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
311 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(dir, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
312 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(rising, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
313 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(falling, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
314 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(status, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
315 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_UINT32_ARRAY(gafr, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS * 2),
316 0bb53337 Dmitry Eremin-Solenikov
        VMSTATE_END_OF_LIST(),
317 0bb53337 Dmitry Eremin-Solenikov
    },
318 0bb53337 Dmitry Eremin-Solenikov
};
319 0bb53337 Dmitry Eremin-Solenikov
320 999e12bb Anthony Liguori
static Property pxa2xx_gpio_properties[] = {
321 999e12bb Anthony Liguori
    DEFINE_PROP_INT32("lines", PXA2xxGPIOInfo, lines, 0),
322 999e12bb Anthony Liguori
    DEFINE_PROP_INT32("ncpu", PXA2xxGPIOInfo, ncpu, 0),
323 999e12bb Anthony Liguori
    DEFINE_PROP_END_OF_LIST(),
324 999e12bb Anthony Liguori
};
325 999e12bb Anthony Liguori
326 999e12bb Anthony Liguori
static void pxa2xx_gpio_class_init(ObjectClass *klass, void *data)
327 999e12bb Anthony Liguori
{
328 39bffca2 Anthony Liguori
    DeviceClass *dc = DEVICE_CLASS(klass);
329 999e12bb Anthony Liguori
    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
330 999e12bb Anthony Liguori
331 999e12bb Anthony Liguori
    k->init = pxa2xx_gpio_initfn;
332 39bffca2 Anthony Liguori
    dc->desc = "PXA2xx GPIO controller";
333 39bffca2 Anthony Liguori
    dc->props = pxa2xx_gpio_properties;
334 999e12bb Anthony Liguori
}
335 999e12bb Anthony Liguori
336 39bffca2 Anthony Liguori
static TypeInfo pxa2xx_gpio_info = {
337 39bffca2 Anthony Liguori
    .name          = "pxa2xx-gpio",
338 39bffca2 Anthony Liguori
    .parent        = TYPE_SYS_BUS_DEVICE,
339 39bffca2 Anthony Liguori
    .instance_size = sizeof(PXA2xxGPIOInfo),
340 39bffca2 Anthony Liguori
    .class_init    = pxa2xx_gpio_class_init,
341 0bb53337 Dmitry Eremin-Solenikov
};
342 0bb53337 Dmitry Eremin-Solenikov
343 0bb53337 Dmitry Eremin-Solenikov
static void pxa2xx_gpio_register(void)
344 0bb53337 Dmitry Eremin-Solenikov
{
345 39bffca2 Anthony Liguori
    type_register_static(&pxa2xx_gpio_info);
346 0bb53337 Dmitry Eremin-Solenikov
}
347 0bb53337 Dmitry Eremin-Solenikov
device_init(pxa2xx_gpio_register);