X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=hw%2Fads7846.c;fp=hw%2Fads7846.c;h=1c65ffe15ebac994f6ad4dff754d5ea3b2e93f8f;hb=a03c3bde4e288e790eccfb8cd45abd8ecbf467dc;hp=b39c00f51502c3e4428334e292e819666db9899a;hpb=e2ffa1bf065fa199f27d661d495573e9d6059bf1;p=qemu diff --git a/hw/ads7846.c b/hw/ads7846.c index b39c00f..1c65ffe 100644 --- a/hw/ads7846.c +++ b/hw/ads7846.c @@ -7,11 +7,11 @@ * This code is licensed under the GNU GPL v2. */ -#include "hw.h" -#include "devices.h" +#include "ssi.h" #include "console.h" -struct ads7846_state_s { +typedef struct { + SSISlave ssidev; qemu_irq interrupt; int input[8]; @@ -20,7 +20,7 @@ struct ads7846_state_s { int cycle; int output; -}; +} ADS7846State; /* Control-byte bitfields */ #define CB_PD0 (1 << 0) @@ -46,22 +46,15 @@ struct ads7846_state_s { #define ADS_Z1POS(x, y) 600 #define ADS_Z2POS(x, y) (600 + 6000 / ADS_XPOS(x, y)) -static void ads7846_int_update(struct ads7846_state_s *s) +static void ads7846_int_update(ADS7846State *s) { if (s->interrupt) qemu_set_irq(s->interrupt, s->pressure == 0); } -uint32_t ads7846_read(void *opaque) -{ - struct ads7846_state_s *s = (struct ads7846_state_s *) opaque; - - return s->output; -} - -void ads7846_write(void *opaque, uint32_t value) +static uint32_t ads7846_transfer(SSISlave *dev, uint32_t value) { - struct ads7846_state_s *s = (struct ads7846_state_s *) opaque; + ADS7846State *s = FROM_SSI_SLAVE(ADS7846State, dev); switch (s->cycle ++) { case 0: @@ -89,12 +82,13 @@ void ads7846_write(void *opaque, uint32_t value) s->cycle = 0; break; } + return s->output; } static void ads7846_ts_event(void *opaque, int x, int y, int z, int buttons_state) { - struct ads7846_state_s *s = opaque; + ADS7846State *s = opaque; if (buttons_state) { x = 0x7fff - x; @@ -113,7 +107,7 @@ static void ads7846_ts_event(void *opaque, static void ads7846_save(QEMUFile *f, void *opaque) { - struct ads7846_state_s *s = (struct ads7846_state_s *) opaque; + ADS7846State *s = (ADS7846State *) opaque; int i; for (i = 0; i < 8; i ++) @@ -125,7 +119,7 @@ static void ads7846_save(QEMUFile *f, void *opaque) static int ads7846_load(QEMUFile *f, void *opaque, int version_id) { - struct ads7846_state_s *s = (struct ads7846_state_s *) opaque; + ADS7846State *s = (ADS7846State *) opaque; int i; for (i = 0; i < 8; i ++) @@ -140,14 +134,11 @@ static int ads7846_load(QEMUFile *f, void *opaque, int version_id) return 0; } -struct ads7846_state_s *ads7846_init(qemu_irq penirq) +static void ads7846_init(SSISlave *dev) { - struct ads7846_state_s *s; - s = (struct ads7846_state_s *) - qemu_mallocz(sizeof(struct ads7846_state_s)); - memset(s, 0, sizeof(struct ads7846_state_s)); + ADS7846State *s = FROM_SSI_SLAVE(ADS7846State, dev); - s->interrupt = penirq; + qdev_init_gpio_out(&dev->qdev, &s->interrupt, 1); s->input[0] = ADS_TEMP0; /* TEMP0 */ s->input[2] = ADS_VBAT; /* VBAT */ @@ -161,6 +152,16 @@ struct ads7846_state_s *ads7846_init(qemu_irq penirq) ads7846_int_update(s); register_savevm("ads7846", -1, 0, ads7846_save, ads7846_load, s); +} + +static SSISlaveInfo ads7846_info = { + .init = ads7846_init, + .transfer = ads7846_transfer +}; - return s; +static void ads7846_register_devices(void) +{ + ssi_register_slave("ads7846", sizeof(ADS7846State), &ads7846_info); } + +device_init(ads7846_register_devices)