/*
* 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 {
} ssi_sd_mode;
typedef struct {
+ SSISlave ssidev;
ssi_sd_mode mode;
int cmd;
uint8_t cmdarg[4];
#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) {
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;
return 0;
}
-void *ssi_sd_init(BlockDriverState *bs)
+static int 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;
+ return 0;
+}
+
+static SSISlaveInfo ssi_sd_info = {
+ .qdev.name = "ssi-sd",
+ .qdev.size = sizeof(ssi_sd_state),
+ .init = ssi_sd_init,
+ .transfer = ssi_sd_transfer
+};
+
+static void ssi_sd_register_devices(void)
+{
+ ssi_register_slave(&ssi_sd_info);
}
+device_init(ssi_sd_register_devices)