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) |