X-Git-Url: http://git.maemo.org/git/?p=qemu;a=blobdiff_plain;f=hw%2Fssi-sd.c;fp=hw%2Fssi-sd.c;h=3e78bd2ac3ba32a059fec0d10af9047b034ad42c;hp=ffb9c4cda75d57cd4f1a03e7b80df3a64ca76cd1;hb=759b334a9739814df2883aa4c41b1c0f5670e90a;hpb=7e2198fc87e878b8ce5df965477e21713ebf7834 diff --git a/hw/ssi-sd.c b/hw/ssi-sd.c index ffb9c4c..3e78bd2 100644 --- a/hw/ssi-sd.c +++ b/hw/ssi-sd.c @@ -1,26 +1,27 @@ /* * SSI to SD card adapter. * - * Copyright (c) 2007 CodeSourcery. + * Copyright (c) 2007-2009 CodeSourcery. * Written by Paul Brook * - * This code is licenced under the GPL. + * This code is licenced under the GNU GPL v2. */ -#include "hw.h" +#include "ssi.h" #include "sd.h" +#include "sysemu.h" //#define DEBUG_SSI_SD 1 #ifdef DEBUG_SSI_SD -#define DPRINTF(fmt, args...) \ -do { printf("ssi_sd: " fmt , ##args); } while (0) -#define BADF(fmt, args...) \ -do { fprintf(stderr, "ssi_sd: error: " fmt , ##args); exit(1);} while (0) +#define DPRINTF(fmt, ...) \ +do { printf("ssi_sd: " fmt , ## __VA_ARGS__); } while (0) +#define BADF(fmt, ...) \ +do { fprintf(stderr, "ssi_sd: error: " fmt , ## __VA_ARGS__); exit(1);} while (0) #else -#define DPRINTF(fmt, args...) do {} while(0) -#define BADF(fmt, args...) \ -do { fprintf(stderr, "ssi_sd: error: " fmt , ##args);} while (0) +#define DPRINTF(fmt, ...) do {} while(0) +#define BADF(fmt, ...) \ +do { fprintf(stderr, "ssi_sd: error: " fmt , ## __VA_ARGS__);} while (0) #endif typedef enum { @@ -32,6 +33,7 @@ typedef enum { } ssi_sd_mode; typedef struct { + SSISlave ssidev; ssi_sd_mode mode; int cmd; uint8_t cmdarg[4]; @@ -59,9 +61,9 @@ typedef struct { #define SSI_SDR_ADDRESS_ERROR 0x2000 #define SSI_SDR_PARAMETER_ERROR 0x4000 -int ssi_sd_xfer(void *opaque, int val) +static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val) { - ssi_sd_state *s = (ssi_sd_state *)opaque; + ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, dev); /* Special case: allow CMD12 (STOP TRANSMISSION) while reading data. */ if (s->mode == SSI_SD_DATA_READ && val == 0x4d) { @@ -82,7 +84,7 @@ int ssi_sd_xfer(void *opaque, int val) return 0xff; case SSI_SD_CMDARG: if (s->arglen == 4) { - struct sd_request_s request; + SDRequest request; uint8_t longresp[16]; /* FIXME: Check CRC. */ request.cmd = s->cmd; @@ -227,13 +229,25 @@ static int ssi_sd_load(QEMUFile *f, void *opaque, int version_id) return 0; } -void *ssi_sd_init(BlockDriverState *bs) +static void ssi_sd_init(SSISlave *dev) { - ssi_sd_state *s; + ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, dev); + BlockDriverState *bs; - s = (ssi_sd_state *)qemu_mallocz(sizeof(ssi_sd_state)); s->mode = SSI_SD_CMD; + bs = qdev_init_bdrv(&dev->qdev, IF_SD); s->sd = sd_init(bs, 1); register_savevm("ssi_sd", -1, 1, ssi_sd_save, ssi_sd_load, s); - return s; } + +static SSISlaveInfo ssi_sd_info = { + .init = ssi_sd_init, + .transfer = ssi_sd_transfer +}; + +static void ssi_sd_register_devices(void) +{ + ssi_register_slave("ssi-sd", sizeof(ssi_sd_state), &ssi_sd_info); +} + +device_init(ssi_sd_register_devices)