qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

omap_gpio.c (20851B)


      1 /*
      2  * TI OMAP processors GPIO emulation.
      3  *
      4  * Copyright (C) 2006-2008 Andrzej Zaborowski  <balrog@zabor.org>
      5  * Copyright (C) 2007-2009 Nokia Corporation
      6  *
      7  * This program is free software; you can redistribute it and/or
      8  * modify it under the terms of the GNU General Public License as
      9  * published by the Free Software Foundation; either version 2 or
     10  * (at your option) version 3 of the License.
     11  *
     12  * This program is distributed in the hope that it will be useful,
     13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15  * GNU General Public License for more details.
     16  *
     17  * You should have received a copy of the GNU General Public License along
     18  * with this program; if not, see <http://www.gnu.org/licenses/>.
     19  */
     20 
     21 #include "qemu/osdep.h"
     22 #include "qemu/log.h"
     23 #include "hw/irq.h"
     24 #include "hw/qdev-properties.h"
     25 #include "hw/arm/omap.h"
     26 #include "hw/sysbus.h"
     27 #include "qemu/error-report.h"
     28 #include "qemu/module.h"
     29 #include "qapi/error.h"
     30 
     31 struct omap_gpio_s {
     32     qemu_irq irq;
     33     qemu_irq handler[16];
     34 
     35     uint16_t inputs;
     36     uint16_t outputs;
     37     uint16_t dir;
     38     uint16_t edge;
     39     uint16_t mask;
     40     uint16_t ints;
     41     uint16_t pins;
     42 };
     43 
     44 struct omap_gpif_s {
     45     SysBusDevice parent_obj;
     46 
     47     MemoryRegion iomem;
     48     int mpu_model;
     49     void *clk;
     50     struct omap_gpio_s omap1;
     51 };
     52 
     53 /* General-Purpose I/O of OMAP1 */
     54 static void omap_gpio_set(void *opaque, int line, int level)
     55 {
     56     struct omap_gpio_s *s = &((struct omap_gpif_s *) opaque)->omap1;
     57     uint16_t prev = s->inputs;
     58 
     59     if (level)
     60         s->inputs |= 1 << line;
     61     else
     62         s->inputs &= ~(1 << line);
     63 
     64     if (((s->edge & s->inputs & ~prev) | (~s->edge & ~s->inputs & prev)) &
     65                     (1 << line) & s->dir & ~s->mask) {
     66         s->ints |= 1 << line;
     67         qemu_irq_raise(s->irq);
     68     }
     69 }
     70 
     71 static uint64_t omap_gpio_read(void *opaque, hwaddr addr,
     72                                unsigned size)
     73 {
     74     struct omap_gpio_s *s = (struct omap_gpio_s *) opaque;
     75     int offset = addr & OMAP_MPUI_REG_MASK;
     76 
     77     if (size != 2) {
     78         return omap_badwidth_read16(opaque, addr);
     79     }
     80 
     81     switch (offset) {
     82     case 0x00:	/* DATA_INPUT */
     83         return s->inputs & s->pins;
     84 
     85     case 0x04:	/* DATA_OUTPUT */
     86         return s->outputs;
     87 
     88     case 0x08:	/* DIRECTION_CONTROL */
     89         return s->dir;
     90 
     91     case 0x0c:	/* INTERRUPT_CONTROL */
     92         return s->edge;
     93 
     94     case 0x10:	/* INTERRUPT_MASK */
     95         return s->mask;
     96 
     97     case 0x14:	/* INTERRUPT_STATUS */
     98         return s->ints;
     99 
    100     case 0x18:	/* PIN_CONTROL (not in OMAP310) */
    101         OMAP_BAD_REG(addr);
    102         return s->pins;
    103     }
    104 
    105     OMAP_BAD_REG(addr);
    106     return 0;
    107 }
    108 
    109 static void omap_gpio_write(void *opaque, hwaddr addr,
    110                             uint64_t value, unsigned size)
    111 {
    112     struct omap_gpio_s *s = (struct omap_gpio_s *) opaque;
    113     int offset = addr & OMAP_MPUI_REG_MASK;
    114     uint16_t diff;
    115     int ln;
    116 
    117     if (size != 2) {
    118         omap_badwidth_write16(opaque, addr, value);
    119         return;
    120     }
    121 
    122     switch (offset) {
    123     case 0x00:	/* DATA_INPUT */
    124         OMAP_RO_REG(addr);
    125         return;
    126 
    127     case 0x04:	/* DATA_OUTPUT */
    128         diff = (s->outputs ^ value) & ~s->dir;
    129         s->outputs = value;
    130         while ((ln = ctz32(diff)) != 32) {
    131             if (s->handler[ln])
    132                 qemu_set_irq(s->handler[ln], (value >> ln) & 1);
    133             diff &= ~(1 << ln);
    134         }
    135         break;
    136 
    137     case 0x08:	/* DIRECTION_CONTROL */
    138         diff = s->outputs & (s->dir ^ value);
    139         s->dir = value;
    140 
    141         value = s->outputs & ~s->dir;
    142         while ((ln = ctz32(diff)) != 32) {
    143             if (s->handler[ln])
    144                 qemu_set_irq(s->handler[ln], (value >> ln) & 1);
    145             diff &= ~(1 << ln);
    146         }
    147         break;
    148 
    149     case 0x0c:	/* INTERRUPT_CONTROL */
    150         s->edge = value;
    151         break;
    152 
    153     case 0x10:	/* INTERRUPT_MASK */
    154         s->mask = value;
    155         break;
    156 
    157     case 0x14:	/* INTERRUPT_STATUS */
    158         s->ints &= ~value;
    159         if (!s->ints)
    160             qemu_irq_lower(s->irq);
    161         break;
    162 
    163     case 0x18:	/* PIN_CONTROL (not in OMAP310 TRM) */
    164         OMAP_BAD_REG(addr);
    165         s->pins = value;
    166         break;
    167 
    168     default:
    169         OMAP_BAD_REG(addr);
    170         return;
    171     }
    172 }
    173 
    174 /* *Some* sources say the memory region is 32-bit.  */
    175 static const MemoryRegionOps omap_gpio_ops = {
    176     .read = omap_gpio_read,
    177     .write = omap_gpio_write,
    178     .endianness = DEVICE_NATIVE_ENDIAN,
    179 };
    180 
    181 static void omap_gpio_reset(struct omap_gpio_s *s)
    182 {
    183     s->inputs = 0;
    184     s->outputs = ~0;
    185     s->dir = ~0;
    186     s->edge = ~0;
    187     s->mask = ~0;
    188     s->ints = 0;
    189     s->pins = ~0;
    190 }
    191 
    192 struct omap2_gpio_s {
    193     qemu_irq irq[2];
    194     qemu_irq wkup;
    195     qemu_irq *handler;
    196     MemoryRegion iomem;
    197 
    198     uint8_t revision;
    199     uint8_t config[2];
    200     uint32_t inputs;
    201     uint32_t outputs;
    202     uint32_t dir;
    203     uint32_t level[2];
    204     uint32_t edge[2];
    205     uint32_t mask[2];
    206     uint32_t wumask;
    207     uint32_t ints[2];
    208     uint32_t debounce;
    209     uint8_t delay;
    210 };
    211 
    212 struct omap2_gpif_s {
    213     SysBusDevice parent_obj;
    214 
    215     MemoryRegion iomem;
    216     int mpu_model;
    217     void *iclk;
    218     void *fclk[6];
    219     int modulecount;
    220     struct omap2_gpio_s *modules;
    221     qemu_irq *handler;
    222     int autoidle;
    223     int gpo;
    224 };
    225 
    226 /* General-Purpose Interface of OMAP2/3 */
    227 static inline void omap2_gpio_module_int_update(struct omap2_gpio_s *s,
    228                                                 int line)
    229 {
    230     qemu_set_irq(s->irq[line], s->ints[line] & s->mask[line]);
    231 }
    232 
    233 static void omap2_gpio_module_wake(struct omap2_gpio_s *s, int line)
    234 {
    235     if (!(s->config[0] & (1 << 2)))			/* ENAWAKEUP */
    236         return;
    237     if (!(s->config[0] & (3 << 3)))			/* Force Idle */
    238         return;
    239     if (!(s->wumask & (1 << line)))
    240         return;
    241 
    242     qemu_irq_raise(s->wkup);
    243 }
    244 
    245 static inline void omap2_gpio_module_out_update(struct omap2_gpio_s *s,
    246                 uint32_t diff)
    247 {
    248     int ln;
    249 
    250     s->outputs ^= diff;
    251     diff &= ~s->dir;
    252     while ((ln = ctz32(diff)) != 32) {
    253         qemu_set_irq(s->handler[ln], (s->outputs >> ln) & 1);
    254         diff &= ~(1 << ln);
    255     }
    256 }
    257 
    258 static void omap2_gpio_module_level_update(struct omap2_gpio_s *s, int line)
    259 {
    260     s->ints[line] |= s->dir &
    261             ((s->inputs & s->level[1]) | (~s->inputs & s->level[0]));
    262     omap2_gpio_module_int_update(s, line);
    263 }
    264 
    265 static inline void omap2_gpio_module_int(struct omap2_gpio_s *s, int line)
    266 {
    267     s->ints[0] |= 1 << line;
    268     omap2_gpio_module_int_update(s, 0);
    269     s->ints[1] |= 1 << line;
    270     omap2_gpio_module_int_update(s, 1);
    271     omap2_gpio_module_wake(s, line);
    272 }
    273 
    274 static void omap2_gpio_set(void *opaque, int line, int level)
    275 {
    276     struct omap2_gpif_s *p = opaque;
    277     struct omap2_gpio_s *s = &p->modules[line >> 5];
    278 
    279     line &= 31;
    280     if (level) {
    281         if (s->dir & (1 << line) & ((~s->inputs & s->edge[0]) | s->level[1]))
    282             omap2_gpio_module_int(s, line);
    283         s->inputs |= 1 << line;
    284     } else {
    285         if (s->dir & (1 << line) & ((s->inputs & s->edge[1]) | s->level[0]))
    286             omap2_gpio_module_int(s, line);
    287         s->inputs &= ~(1 << line);
    288     }
    289 }
    290 
    291 static void omap2_gpio_module_reset(struct omap2_gpio_s *s)
    292 {
    293     s->config[0] = 0;
    294     s->config[1] = 2;
    295     s->ints[0] = 0;
    296     s->ints[1] = 0;
    297     s->mask[0] = 0;
    298     s->mask[1] = 0;
    299     s->wumask = 0;
    300     s->dir = ~0;
    301     s->level[0] = 0;
    302     s->level[1] = 0;
    303     s->edge[0] = 0;
    304     s->edge[1] = 0;
    305     s->debounce = 0;
    306     s->delay = 0;
    307 }
    308 
    309 static uint32_t omap2_gpio_module_read(void *opaque, hwaddr addr)
    310 {
    311     struct omap2_gpio_s *s = (struct omap2_gpio_s *) opaque;
    312 
    313     switch (addr) {
    314     case 0x00:	/* GPIO_REVISION */
    315         return s->revision;
    316 
    317     case 0x10:	/* GPIO_SYSCONFIG */
    318         return s->config[0];
    319 
    320     case 0x14:	/* GPIO_SYSSTATUS */
    321         return 0x01;
    322 
    323     case 0x18:	/* GPIO_IRQSTATUS1 */
    324         return s->ints[0];
    325 
    326     case 0x1c:	/* GPIO_IRQENABLE1 */
    327     case 0x60:	/* GPIO_CLEARIRQENABLE1 */
    328     case 0x64:	/* GPIO_SETIRQENABLE1 */
    329         return s->mask[0];
    330 
    331     case 0x20:	/* GPIO_WAKEUPENABLE */
    332     case 0x80:	/* GPIO_CLEARWKUENA */
    333     case 0x84:	/* GPIO_SETWKUENA */
    334         return s->wumask;
    335 
    336     case 0x28:	/* GPIO_IRQSTATUS2 */
    337         return s->ints[1];
    338 
    339     case 0x2c:	/* GPIO_IRQENABLE2 */
    340     case 0x70:	/* GPIO_CLEARIRQENABLE2 */
    341     case 0x74:	/* GPIO_SETIREQNEABLE2 */
    342         return s->mask[1];
    343 
    344     case 0x30:	/* GPIO_CTRL */
    345         return s->config[1];
    346 
    347     case 0x34:	/* GPIO_OE */
    348         return s->dir;
    349 
    350     case 0x38:	/* GPIO_DATAIN */
    351         return s->inputs;
    352 
    353     case 0x3c:	/* GPIO_DATAOUT */
    354     case 0x90:	/* GPIO_CLEARDATAOUT */
    355     case 0x94:	/* GPIO_SETDATAOUT */
    356         return s->outputs;
    357 
    358     case 0x40:	/* GPIO_LEVELDETECT0 */
    359         return s->level[0];
    360 
    361     case 0x44:	/* GPIO_LEVELDETECT1 */
    362         return s->level[1];
    363 
    364     case 0x48:	/* GPIO_RISINGDETECT */
    365         return s->edge[0];
    366 
    367     case 0x4c:	/* GPIO_FALLINGDETECT */
    368         return s->edge[1];
    369 
    370     case 0x50:	/* GPIO_DEBOUNCENABLE */
    371         return s->debounce;
    372 
    373     case 0x54:	/* GPIO_DEBOUNCINGTIME */
    374         return s->delay;
    375     }
    376 
    377     OMAP_BAD_REG(addr);
    378     return 0;
    379 }
    380 
    381 static void omap2_gpio_module_write(void *opaque, hwaddr addr,
    382                 uint32_t value)
    383 {
    384     struct omap2_gpio_s *s = (struct omap2_gpio_s *) opaque;
    385     uint32_t diff;
    386     int ln;
    387 
    388     switch (addr) {
    389     case 0x00:	/* GPIO_REVISION */
    390     case 0x14:	/* GPIO_SYSSTATUS */
    391     case 0x38:	/* GPIO_DATAIN */
    392         OMAP_RO_REG(addr);
    393         break;
    394 
    395     case 0x10:	/* GPIO_SYSCONFIG */
    396         if (((value >> 3) & 3) == 3) {
    397             qemu_log_mask(LOG_GUEST_ERROR,
    398                           "%s: Illegal IDLEMODE value: 3\n", __func__);
    399         }
    400         if (value & 2)
    401             omap2_gpio_module_reset(s);
    402         s->config[0] = value & 0x1d;
    403         break;
    404 
    405     case 0x18:	/* GPIO_IRQSTATUS1 */
    406         if (s->ints[0] & value) {
    407             s->ints[0] &= ~value;
    408             omap2_gpio_module_level_update(s, 0);
    409         }
    410         break;
    411 
    412     case 0x1c:	/* GPIO_IRQENABLE1 */
    413         s->mask[0] = value;
    414         omap2_gpio_module_int_update(s, 0);
    415         break;
    416 
    417     case 0x20:	/* GPIO_WAKEUPENABLE */
    418         s->wumask = value;
    419         break;
    420 
    421     case 0x28:	/* GPIO_IRQSTATUS2 */
    422         if (s->ints[1] & value) {
    423             s->ints[1] &= ~value;
    424             omap2_gpio_module_level_update(s, 1);
    425         }
    426         break;
    427 
    428     case 0x2c:	/* GPIO_IRQENABLE2 */
    429         s->mask[1] = value;
    430         omap2_gpio_module_int_update(s, 1);
    431         break;
    432 
    433     case 0x30:	/* GPIO_CTRL */
    434         s->config[1] = value & 7;
    435         break;
    436 
    437     case 0x34:	/* GPIO_OE */
    438         diff = s->outputs & (s->dir ^ value);
    439         s->dir = value;
    440 
    441         value = s->outputs & ~s->dir;
    442         while ((ln = ctz32(diff)) != 32) {
    443             diff &= ~(1 << ln);
    444             qemu_set_irq(s->handler[ln], (value >> ln) & 1);
    445         }
    446 
    447         omap2_gpio_module_level_update(s, 0);
    448         omap2_gpio_module_level_update(s, 1);
    449         break;
    450 
    451     case 0x3c:	/* GPIO_DATAOUT */
    452         omap2_gpio_module_out_update(s, s->outputs ^ value);
    453         break;
    454 
    455     case 0x40:	/* GPIO_LEVELDETECT0 */
    456         s->level[0] = value;
    457         omap2_gpio_module_level_update(s, 0);
    458         omap2_gpio_module_level_update(s, 1);
    459         break;
    460 
    461     case 0x44:	/* GPIO_LEVELDETECT1 */
    462         s->level[1] = value;
    463         omap2_gpio_module_level_update(s, 0);
    464         omap2_gpio_module_level_update(s, 1);
    465         break;
    466 
    467     case 0x48:	/* GPIO_RISINGDETECT */
    468         s->edge[0] = value;
    469         break;
    470 
    471     case 0x4c:	/* GPIO_FALLINGDETECT */
    472         s->edge[1] = value;
    473         break;
    474 
    475     case 0x50:	/* GPIO_DEBOUNCENABLE */
    476         s->debounce = value;
    477         break;
    478 
    479     case 0x54:	/* GPIO_DEBOUNCINGTIME */
    480         s->delay = value;
    481         break;
    482 
    483     case 0x60:	/* GPIO_CLEARIRQENABLE1 */
    484         s->mask[0] &= ~value;
    485         omap2_gpio_module_int_update(s, 0);
    486         break;
    487 
    488     case 0x64:	/* GPIO_SETIRQENABLE1 */
    489         s->mask[0] |= value;
    490         omap2_gpio_module_int_update(s, 0);
    491         break;
    492 
    493     case 0x70:	/* GPIO_CLEARIRQENABLE2 */
    494         s->mask[1] &= ~value;
    495         omap2_gpio_module_int_update(s, 1);
    496         break;
    497 
    498     case 0x74:	/* GPIO_SETIREQNEABLE2 */
    499         s->mask[1] |= value;
    500         omap2_gpio_module_int_update(s, 1);
    501         break;
    502 
    503     case 0x80:	/* GPIO_CLEARWKUENA */
    504         s->wumask &= ~value;
    505         break;
    506 
    507     case 0x84:	/* GPIO_SETWKUENA */
    508         s->wumask |= value;
    509         break;
    510 
    511     case 0x90:	/* GPIO_CLEARDATAOUT */
    512         omap2_gpio_module_out_update(s, s->outputs & value);
    513         break;
    514 
    515     case 0x94:	/* GPIO_SETDATAOUT */
    516         omap2_gpio_module_out_update(s, ~s->outputs & value);
    517         break;
    518 
    519     default:
    520         OMAP_BAD_REG(addr);
    521         return;
    522     }
    523 }
    524 
    525 static uint64_t omap2_gpio_module_readp(void *opaque, hwaddr addr,
    526                                         unsigned size)
    527 {
    528     return omap2_gpio_module_read(opaque, addr & ~3) >> ((addr & 3) << 3);
    529 }
    530 
    531 static void omap2_gpio_module_writep(void *opaque, hwaddr addr,
    532                                      uint64_t value, unsigned size)
    533 {
    534     uint32_t cur = 0;
    535     uint32_t mask = 0xffff;
    536 
    537     if (size == 4) {
    538         omap2_gpio_module_write(opaque, addr, value);
    539         return;
    540     }
    541 
    542     switch (addr & ~3) {
    543     case 0x00:	/* GPIO_REVISION */
    544     case 0x14:	/* GPIO_SYSSTATUS */
    545     case 0x38:	/* GPIO_DATAIN */
    546         OMAP_RO_REG(addr);
    547         break;
    548 
    549     case 0x10:	/* GPIO_SYSCONFIG */
    550     case 0x1c:	/* GPIO_IRQENABLE1 */
    551     case 0x20:	/* GPIO_WAKEUPENABLE */
    552     case 0x2c:	/* GPIO_IRQENABLE2 */
    553     case 0x30:	/* GPIO_CTRL */
    554     case 0x34:	/* GPIO_OE */
    555     case 0x3c:	/* GPIO_DATAOUT */
    556     case 0x40:	/* GPIO_LEVELDETECT0 */
    557     case 0x44:	/* GPIO_LEVELDETECT1 */
    558     case 0x48:	/* GPIO_RISINGDETECT */
    559     case 0x4c:	/* GPIO_FALLINGDETECT */
    560     case 0x50:	/* GPIO_DEBOUNCENABLE */
    561     case 0x54:	/* GPIO_DEBOUNCINGTIME */
    562         cur = omap2_gpio_module_read(opaque, addr & ~3) &
    563                 ~(mask << ((addr & 3) << 3));
    564 
    565         /* Fall through.  */
    566     case 0x18:	/* GPIO_IRQSTATUS1 */
    567     case 0x28:	/* GPIO_IRQSTATUS2 */
    568     case 0x60:	/* GPIO_CLEARIRQENABLE1 */
    569     case 0x64:	/* GPIO_SETIRQENABLE1 */
    570     case 0x70:	/* GPIO_CLEARIRQENABLE2 */
    571     case 0x74:	/* GPIO_SETIREQNEABLE2 */
    572     case 0x80:	/* GPIO_CLEARWKUENA */
    573     case 0x84:	/* GPIO_SETWKUENA */
    574     case 0x90:	/* GPIO_CLEARDATAOUT */
    575     case 0x94:	/* GPIO_SETDATAOUT */
    576         value <<= (addr & 3) << 3;
    577         omap2_gpio_module_write(opaque, addr, cur | value);
    578         break;
    579 
    580     default:
    581         OMAP_BAD_REG(addr);
    582         return;
    583     }
    584 }
    585 
    586 static const MemoryRegionOps omap2_gpio_module_ops = {
    587     .read = omap2_gpio_module_readp,
    588     .write = omap2_gpio_module_writep,
    589     .valid.min_access_size = 1,
    590     .valid.max_access_size = 4,
    591     .endianness = DEVICE_NATIVE_ENDIAN,
    592 };
    593 
    594 static void omap_gpif_reset(DeviceState *dev)
    595 {
    596     struct omap_gpif_s *s = OMAP1_GPIO(dev);
    597 
    598     omap_gpio_reset(&s->omap1);
    599 }
    600 
    601 static void omap2_gpif_reset(DeviceState *dev)
    602 {
    603     struct omap2_gpif_s *s = OMAP2_GPIO(dev);
    604     int i;
    605 
    606     for (i = 0; i < s->modulecount; i++) {
    607         omap2_gpio_module_reset(&s->modules[i]);
    608     }
    609     s->autoidle = 0;
    610     s->gpo = 0;
    611 }
    612 
    613 static uint64_t omap2_gpif_top_read(void *opaque, hwaddr addr,
    614                                     unsigned size)
    615 {
    616     struct omap2_gpif_s *s = (struct omap2_gpif_s *) opaque;
    617 
    618     switch (addr) {
    619     case 0x00:	/* IPGENERICOCPSPL_REVISION */
    620         return 0x18;
    621 
    622     case 0x10:	/* IPGENERICOCPSPL_SYSCONFIG */
    623         return s->autoidle;
    624 
    625     case 0x14:	/* IPGENERICOCPSPL_SYSSTATUS */
    626         return 0x01;
    627 
    628     case 0x18:	/* IPGENERICOCPSPL_IRQSTATUS */
    629         return 0x00;
    630 
    631     case 0x40:	/* IPGENERICOCPSPL_GPO */
    632         return s->gpo;
    633 
    634     case 0x50:	/* IPGENERICOCPSPL_GPI */
    635         return 0x00;
    636     }
    637 
    638     OMAP_BAD_REG(addr);
    639     return 0;
    640 }
    641 
    642 static void omap2_gpif_top_write(void *opaque, hwaddr addr,
    643                                  uint64_t value, unsigned size)
    644 {
    645     struct omap2_gpif_s *s = (struct omap2_gpif_s *) opaque;
    646 
    647     switch (addr) {
    648     case 0x00:	/* IPGENERICOCPSPL_REVISION */
    649     case 0x14:	/* IPGENERICOCPSPL_SYSSTATUS */
    650     case 0x18:	/* IPGENERICOCPSPL_IRQSTATUS */
    651     case 0x50:	/* IPGENERICOCPSPL_GPI */
    652         OMAP_RO_REG(addr);
    653         break;
    654 
    655     case 0x10:	/* IPGENERICOCPSPL_SYSCONFIG */
    656         if (value & (1 << 1))					/* SOFTRESET */
    657             omap2_gpif_reset(DEVICE(s));
    658         s->autoidle = value & 1;
    659         break;
    660 
    661     case 0x40:	/* IPGENERICOCPSPL_GPO */
    662         s->gpo = value & 1;
    663         break;
    664 
    665     default:
    666         OMAP_BAD_REG(addr);
    667         return;
    668     }
    669 }
    670 
    671 static const MemoryRegionOps omap2_gpif_top_ops = {
    672     .read = omap2_gpif_top_read,
    673     .write = omap2_gpif_top_write,
    674     .endianness = DEVICE_NATIVE_ENDIAN,
    675 };
    676 
    677 static void omap_gpio_init(Object *obj)
    678 {
    679     DeviceState *dev = DEVICE(obj);
    680     struct omap_gpif_s *s = OMAP1_GPIO(obj);
    681     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
    682 
    683     qdev_init_gpio_in(dev, omap_gpio_set, 16);
    684     qdev_init_gpio_out(dev, s->omap1.handler, 16);
    685     sysbus_init_irq(sbd, &s->omap1.irq);
    686     memory_region_init_io(&s->iomem, obj, &omap_gpio_ops, &s->omap1,
    687                           "omap.gpio", 0x1000);
    688     sysbus_init_mmio(sbd, &s->iomem);
    689 }
    690 
    691 static void omap_gpio_realize(DeviceState *dev, Error **errp)
    692 {
    693     struct omap_gpif_s *s = OMAP1_GPIO(dev);
    694 
    695     if (!s->clk) {
    696         error_setg(errp, "omap-gpio: clk not connected");
    697     }
    698 }
    699 
    700 static void omap2_gpio_realize(DeviceState *dev, Error **errp)
    701 {
    702     struct omap2_gpif_s *s = OMAP2_GPIO(dev);
    703     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
    704     int i;
    705 
    706     if (!s->iclk) {
    707         error_setg(errp, "omap2-gpio: iclk not connected");
    708         return;
    709     }
    710 
    711     s->modulecount = s->mpu_model < omap2430 ? 4
    712         : s->mpu_model < omap3430 ? 5
    713         : 6;
    714 
    715     if (s->mpu_model < omap3430) {
    716         memory_region_init_io(&s->iomem, OBJECT(dev), &omap2_gpif_top_ops, s,
    717                               "omap2.gpio", 0x1000);
    718         sysbus_init_mmio(sbd, &s->iomem);
    719     }
    720 
    721     s->modules = g_new0(struct omap2_gpio_s, s->modulecount);
    722     s->handler = g_new0(qemu_irq, s->modulecount * 32);
    723     qdev_init_gpio_in(dev, omap2_gpio_set, s->modulecount * 32);
    724     qdev_init_gpio_out(dev, s->handler, s->modulecount * 32);
    725 
    726     for (i = 0; i < s->modulecount; i++) {
    727         struct omap2_gpio_s *m = &s->modules[i];
    728 
    729         if (!s->fclk[i]) {
    730             error_setg(errp, "omap2-gpio: fclk%d not connected", i);
    731             return;
    732         }
    733 
    734         m->revision = (s->mpu_model < omap3430) ? 0x18 : 0x25;
    735         m->handler = &s->handler[i * 32];
    736         sysbus_init_irq(sbd, &m->irq[0]); /* mpu irq */
    737         sysbus_init_irq(sbd, &m->irq[1]); /* dsp irq */
    738         sysbus_init_irq(sbd, &m->wkup);
    739         memory_region_init_io(&m->iomem, OBJECT(dev), &omap2_gpio_module_ops, m,
    740                               "omap.gpio-module", 0x1000);
    741         sysbus_init_mmio(sbd, &m->iomem);
    742     }
    743 }
    744 
    745 void omap_gpio_set_clk(omap_gpif *gpio, omap_clk clk)
    746 {
    747     gpio->clk = clk;
    748 }
    749 
    750 static Property omap_gpio_properties[] = {
    751     DEFINE_PROP_INT32("mpu_model", struct omap_gpif_s, mpu_model, 0),
    752     DEFINE_PROP_END_OF_LIST(),
    753 };
    754 
    755 static void omap_gpio_class_init(ObjectClass *klass, void *data)
    756 {
    757     DeviceClass *dc = DEVICE_CLASS(klass);
    758 
    759     dc->realize = omap_gpio_realize;
    760     dc->reset = omap_gpif_reset;
    761     device_class_set_props(dc, omap_gpio_properties);
    762     /* Reason: pointer property "clk" */
    763     dc->user_creatable = false;
    764 }
    765 
    766 static const TypeInfo omap_gpio_info = {
    767     .name          = TYPE_OMAP1_GPIO,
    768     .parent        = TYPE_SYS_BUS_DEVICE,
    769     .instance_size = sizeof(struct omap_gpif_s),
    770     .instance_init = omap_gpio_init,
    771     .class_init    = omap_gpio_class_init,
    772 };
    773 
    774 void omap2_gpio_set_iclk(omap2_gpif *gpio, omap_clk clk)
    775 {
    776     gpio->iclk = clk;
    777 }
    778 
    779 void omap2_gpio_set_fclk(omap2_gpif *gpio, uint8_t i, omap_clk clk)
    780 {
    781     assert(i <= 5);
    782     gpio->fclk[i] = clk;
    783 }
    784 
    785 static Property omap2_gpio_properties[] = {
    786     DEFINE_PROP_INT32("mpu_model", struct omap2_gpif_s, mpu_model, 0),
    787     DEFINE_PROP_END_OF_LIST(),
    788 };
    789 
    790 static void omap2_gpio_class_init(ObjectClass *klass, void *data)
    791 {
    792     DeviceClass *dc = DEVICE_CLASS(klass);
    793 
    794     dc->realize = omap2_gpio_realize;
    795     dc->reset = omap2_gpif_reset;
    796     device_class_set_props(dc, omap2_gpio_properties);
    797     /* Reason: pointer properties "iclk", "fclk0", ..., "fclk5" */
    798     dc->user_creatable = false;
    799 }
    800 
    801 static const TypeInfo omap2_gpio_info = {
    802     .name          = TYPE_OMAP2_GPIO,
    803     .parent        = TYPE_SYS_BUS_DEVICE,
    804     .instance_size = sizeof(struct omap2_gpif_s),
    805     .class_init    = omap2_gpio_class_init,
    806 };
    807 
    808 static void omap_gpio_register_types(void)
    809 {
    810     type_register_static(&omap_gpio_info);
    811     type_register_static(&omap2_gpio_info);
    812 }
    813 
    814 type_init(omap_gpio_register_types)