Commit d335681177137c4bf455aabc95a0bd9277085e58

Authored by Paul Brook
1 parent cdbe40ca

TWL92230 qdev conversion

Signed-off-by: Paul Brook <paul@codesourcery.com>
hw/i2c.h
... ... @@ -88,11 +88,6 @@ void *wm8750_dac_buffer(void *opaque, int samples);
88 88 void wm8750_dac_commit(void *opaque);
89 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 91 /* tmp105.c */
97 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 186 s->i2c = omap_i2c_bus(s->cpu->i2c[0]);
187 187  
188 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 192 /* Attach a TMP105 PM chip (A0 wired to ground) */
195 193 dev = i2c_create_slave(s->i2c, "tmp105", N8X0_TMP105_ADDR);
... ...
hw/twl92230.c
... ... @@ -30,7 +30,6 @@
30 30  
31 31 typedef struct {
32 32 i2c_slave i2c;
33   - qemu_irq irq;
34 33  
35 34 int firstbyte;
36 35 uint8_t reg;
... ... @@ -62,7 +61,7 @@ typedef struct {
62 61 int alm_sec;
63 62 int next_comp;
64 63 } rtc;
65   - qemu_irq handler[3];
  64 + qemu_irq out[4];
66 65 qemu_irq *in;
67 66 int pwrbtn_state;
68 67 qemu_irq pwrbtn;
... ... @@ -70,7 +69,7 @@ typedef struct {
70 69  
71 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 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 539 break;
541 540  
542 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 548 s->dir = value & 0x67;
549 549 break;
550 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 556 s->outputs = value & 0x07;
556 557 break;
557 558  
... ... @@ -875,41 +876,31 @@ static int menelaus_load(QEMUFile *f, void *opaque, int version_id)
875 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 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 887 s->pwrbtn = qemu_allocate_irqs(menelaus_pwrbtn_set, s, 1)[0];
891 888  
892 889 menelaus_reset(&s->i2c);
893 890  
894 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)
... ...