Commit d335681177137c4bf455aabc95a0bd9277085e58
1 parent
cdbe40ca
TWL92230 qdev conversion
Signed-off-by: Paul Brook <paul@codesourcery.com>
Showing
3 changed files
with
30 additions
and
46 deletions
hw/i2c.h
| @@ -88,11 +88,6 @@ void *wm8750_dac_buffer(void *opaque, int samples); | @@ -88,11 +88,6 @@ void *wm8750_dac_buffer(void *opaque, int samples); | ||
| 88 | void wm8750_dac_commit(void *opaque); | 88 | void wm8750_dac_commit(void *opaque); |
| 89 | void wm8750_set_bclk_in(void *opaque, int new_hz); | 89 | void wm8750_set_bclk_in(void *opaque, int new_hz); |
| 90 | 90 | ||
| 91 | -/* twl92230.c */ | ||
| 92 | -i2c_slave *twl92230_init(i2c_bus *bus, qemu_irq irq); | ||
| 93 | -qemu_irq *twl92230_gpio_in_get(i2c_slave *i2c); | ||
| 94 | -void twl92230_gpio_out_set(i2c_slave *i2c, int line, qemu_irq handler); | ||
| 95 | - | ||
| 96 | /* tmp105.c */ | 91 | /* tmp105.c */ |
| 97 | void tmp105_set(i2c_slave *i2c, int temp); | 92 | void tmp105_set(i2c_slave *i2c, int temp); |
| 98 | 93 |
hw/nseries.c
| @@ -186,10 +186,8 @@ static void n8x0_i2c_setup(struct n800_s *s) | @@ -186,10 +186,8 @@ static void n8x0_i2c_setup(struct n800_s *s) | ||
| 186 | s->i2c = omap_i2c_bus(s->cpu->i2c[0]); | 186 | s->i2c = omap_i2c_bus(s->cpu->i2c[0]); |
| 187 | 187 | ||
| 188 | /* Attach a menelaus PM chip */ | 188 | /* Attach a menelaus PM chip */ |
| 189 | - i2c_set_slave_address( | ||
| 190 | - twl92230_init(s->i2c, | ||
| 191 | - s->cpu->irq[0][OMAP_INT_24XX_SYS_NIRQ]), | ||
| 192 | - N8X0_MENELAUS_ADDR); | 189 | + dev = i2c_create_slave(s->i2c, "twl92230", N8X0_MENELAUS_ADDR); |
| 190 | + qdev_connect_gpio_out(dev, 3, s->cpu->irq[0][OMAP_INT_24XX_SYS_NIRQ]); | ||
| 193 | 191 | ||
| 194 | /* Attach a TMP105 PM chip (A0 wired to ground) */ | 192 | /* Attach a TMP105 PM chip (A0 wired to ground) */ |
| 195 | dev = i2c_create_slave(s->i2c, "tmp105", N8X0_TMP105_ADDR); | 193 | dev = i2c_create_slave(s->i2c, "tmp105", N8X0_TMP105_ADDR); |
hw/twl92230.c
| @@ -30,7 +30,6 @@ | @@ -30,7 +30,6 @@ | ||
| 30 | 30 | ||
| 31 | typedef struct { | 31 | typedef struct { |
| 32 | i2c_slave i2c; | 32 | i2c_slave i2c; |
| 33 | - qemu_irq irq; | ||
| 34 | 33 | ||
| 35 | int firstbyte; | 34 | int firstbyte; |
| 36 | uint8_t reg; | 35 | uint8_t reg; |
| @@ -62,7 +61,7 @@ typedef struct { | @@ -62,7 +61,7 @@ typedef struct { | ||
| 62 | int alm_sec; | 61 | int alm_sec; |
| 63 | int next_comp; | 62 | int next_comp; |
| 64 | } rtc; | 63 | } rtc; |
| 65 | - qemu_irq handler[3]; | 64 | + qemu_irq out[4]; |
| 66 | qemu_irq *in; | 65 | qemu_irq *in; |
| 67 | int pwrbtn_state; | 66 | int pwrbtn_state; |
| 68 | qemu_irq pwrbtn; | 67 | qemu_irq pwrbtn; |
| @@ -70,7 +69,7 @@ typedef struct { | @@ -70,7 +69,7 @@ typedef struct { | ||
| 70 | 69 | ||
| 71 | static inline void menelaus_update(MenelausState *s) | 70 | static inline void menelaus_update(MenelausState *s) |
| 72 | { | 71 | { |
| 73 | - qemu_set_irq(s->irq, s->status & ~s->mask); | 72 | + qemu_set_irq(s->out[3], s->status & ~s->mask); |
| 74 | } | 73 | } |
| 75 | 74 | ||
| 76 | static inline void menelaus_rtc_start(MenelausState *s) | 75 | static inline void menelaus_rtc_start(MenelausState *s) |
| @@ -540,18 +539,20 @@ static void menelaus_write(void *opaque, uint8_t addr, uint8_t value) | @@ -540,18 +539,20 @@ static void menelaus_write(void *opaque, uint8_t addr, uint8_t value) | ||
| 540 | break; | 539 | break; |
| 541 | 540 | ||
| 542 | case MENELAUS_GPIO_CTRL: | 541 | case MENELAUS_GPIO_CTRL: |
| 543 | - for (line = 0; line < 3; line ++) | ||
| 544 | - if (((s->dir ^ value) >> line) & 1) | ||
| 545 | - if (s->handler[line]) | ||
| 546 | - qemu_set_irq(s->handler[line], | ||
| 547 | - ((s->outputs & ~s->dir) >> line) & 1); | 542 | + for (line = 0; line < 3; line ++) { |
| 543 | + if (((s->dir ^ value) >> line) & 1) { | ||
| 544 | + qemu_set_irq(s->out[line], | ||
| 545 | + ((s->outputs & ~s->dir) >> line) & 1); | ||
| 546 | + } | ||
| 547 | + } | ||
| 548 | s->dir = value & 0x67; | 548 | s->dir = value & 0x67; |
| 549 | break; | 549 | break; |
| 550 | case MENELAUS_GPIO_OUT: | 550 | case MENELAUS_GPIO_OUT: |
| 551 | - for (line = 0; line < 3; line ++) | ||
| 552 | - if ((((s->outputs ^ value) & ~s->dir) >> line) & 1) | ||
| 553 | - if (s->handler[line]) | ||
| 554 | - qemu_set_irq(s->handler[line], (s->outputs >> line) & 1); | 551 | + for (line = 0; line < 3; line ++) { |
| 552 | + if ((((s->outputs ^ value) & ~s->dir) >> line) & 1) { | ||
| 553 | + qemu_set_irq(s->out[line], (s->outputs >> line) & 1); | ||
| 554 | + } | ||
| 555 | + } | ||
| 555 | s->outputs = value & 0x07; | 556 | s->outputs = value & 0x07; |
| 556 | break; | 557 | break; |
| 557 | 558 | ||
| @@ -875,41 +876,31 @@ static int menelaus_load(QEMUFile *f, void *opaque, int version_id) | @@ -875,41 +876,31 @@ static int menelaus_load(QEMUFile *f, void *opaque, int version_id) | ||
| 875 | return 0; | 876 | return 0; |
| 876 | } | 877 | } |
| 877 | 878 | ||
| 878 | -i2c_slave *twl92230_init(i2c_bus *bus, qemu_irq irq) | 879 | +static void twl92230_init(i2c_slave *i2c) |
| 879 | { | 880 | { |
| 880 | - MenelausState *s = (MenelausState *) | ||
| 881 | - i2c_slave_init(bus, 0, sizeof(MenelausState)); | ||
| 882 | - | ||
| 883 | - s->i2c.event = menelaus_event; | ||
| 884 | - s->i2c.recv = menelaus_rx; | ||
| 885 | - s->i2c.send = menelaus_tx; | 881 | + MenelausState *s = FROM_I2C_SLAVE(MenelausState, i2c); |
| 886 | 882 | ||
| 887 | - s->irq = irq; | ||
| 888 | s->rtc.hz_tm = qemu_new_timer(rt_clock, menelaus_rtc_hz, s); | 883 | s->rtc.hz_tm = qemu_new_timer(rt_clock, menelaus_rtc_hz, s); |
| 889 | - s->in = qemu_allocate_irqs(menelaus_gpio_set, s, 3); | 884 | + /* Three output pins plus one interrupt pin. */ |
| 885 | + qdev_init_gpio_out(&i2c->qdev, s->out, 4); | ||
| 886 | + qdev_init_gpio_in(&i2c->qdev, menelaus_gpio_set, 3); | ||
| 890 | s->pwrbtn = qemu_allocate_irqs(menelaus_pwrbtn_set, s, 1)[0]; | 887 | s->pwrbtn = qemu_allocate_irqs(menelaus_pwrbtn_set, s, 1)[0]; |
| 891 | 888 | ||
| 892 | menelaus_reset(&s->i2c); | 889 | menelaus_reset(&s->i2c); |
| 893 | 890 | ||
| 894 | register_savevm("menelaus", -1, 0, menelaus_save, menelaus_load, s); | 891 | register_savevm("menelaus", -1, 0, menelaus_save, menelaus_load, s); |
| 895 | - | ||
| 896 | - return &s->i2c; | ||
| 897 | } | 892 | } |
| 898 | 893 | ||
| 899 | -qemu_irq *twl92230_gpio_in_get(i2c_slave *i2c) | ||
| 900 | -{ | ||
| 901 | - MenelausState *s = (MenelausState *) i2c; | ||
| 902 | - | ||
| 903 | - return s->in; | ||
| 904 | -} | 894 | +static I2CSlaveInfo twl92230_info = { |
| 895 | + .init = twl92230_init, | ||
| 896 | + .event = menelaus_event, | ||
| 897 | + .recv = menelaus_rx, | ||
| 898 | + .send = menelaus_tx | ||
| 899 | +}; | ||
| 905 | 900 | ||
| 906 | -void twl92230_gpio_out_set(i2c_slave *i2c, int line, qemu_irq handler) | 901 | +static void twl92230_register_devices(void) |
| 907 | { | 902 | { |
| 908 | - MenelausState *s = (MenelausState *) i2c; | ||
| 909 | - | ||
| 910 | - if (line >= 3 || line < 0) { | ||
| 911 | - fprintf(stderr, "%s: No GPO line %i\n", __FUNCTION__, line); | ||
| 912 | - exit(-1); | ||
| 913 | - } | ||
| 914 | - s->handler[line] = handler; | 903 | + i2c_register_slave("twl92230", sizeof(MenelausState), &twl92230_info); |
| 915 | } | 904 | } |
| 905 | + | ||
| 906 | +device_init(twl92230_register_devices) |