r3736 - trunk/src/host/qemu-neo1973/hw
andrew at sita.openmoko.org
andrew at sita.openmoko.org
Wed Dec 26 22:33:40 CET 2007
Author: andrew
Date: 2007-12-26 22:33:38 +0100 (Wed, 26 Dec 2007)
New Revision: 3736
Modified:
trunk/src/host/qemu-neo1973/hw/ar6000.c
trunk/src/host/qemu-neo1973/hw/s3c.h
trunk/src/host/qemu-neo1973/hw/s3c2410.c
trunk/src/host/qemu-neo1973/hw/s3c24xx_mmci.c
Log:
Add the S3C2440 register map for MMC/SD/SDIO host.
Set SDIO R4 Card-ready bit when card is ready.
Modified: trunk/src/host/qemu-neo1973/hw/ar6000.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/ar6000.c 2007-12-26 15:01:35 UTC (rev 3735)
+++ trunk/src/host/qemu-neo1973/hw/ar6000.c 2007-12-26 21:33:38 UTC (rev 3736)
@@ -156,6 +156,8 @@
response[1] = (sd->ioocr >> 16) & 0xff;
response[2] = (sd->ioocr >> 8) & 0xff;
response[3] = (sd->ioocr >> 0) & 0xff;
+ if (sd->sdio_ok)
+ response[0] |= 1 << 7;
}
static void sd_response_r5_make(struct sdio_s *sd, uint8_t *response)
Modified: trunk/src/host/qemu-neo1973/hw/s3c.h
===================================================================
--- trunk/src/host/qemu-neo1973/hw/s3c.h 2007-12-26 15:01:35 UTC (rev 3735)
+++ trunk/src/host/qemu-neo1973/hw/s3c.h 2007-12-26 21:33:38 UTC (rev 3736)
@@ -157,7 +157,7 @@
/* s3c24xx_mmci.c */
struct s3c_mmci_state_s;
-struct s3c_mmci_state_s *s3c_mmci_init(target_phys_addr_t base,
+struct s3c_mmci_state_s *s3c_mmci_init(target_phys_addr_t base, uint16_t model,
struct sd_card_s *mmc, qemu_irq irq, qemu_irq *dma);
void s3c_mmci_reset(struct s3c_mmci_state_s *s);
Modified: trunk/src/host/qemu-neo1973/hw/s3c2410.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/s3c2410.c 2007-12-26 15:01:35 UTC (rev 3735)
+++ trunk/src/host/qemu-neo1973/hw/s3c2410.c 2007-12-26 21:33:38 UTC (rev 3736)
@@ -2909,7 +2909,8 @@
s->irq[S3C_PIC_SPI0], s->drq[S3C_RQ_SPI0],
s->irq[S3C_PIC_SPI1], s->drq[S3C_RQ_SPI1], s->io);
- s->mmci = s3c_mmci_init(0x5a000000, mmc, s->irq[S3C_PIC_SDI], s->drq);
+ s->mmci = s3c_mmci_init(0x5a000000, 0x2410, mmc,
+ s->irq[S3C_PIC_SDI], s->drq);
if (usb_enabled) {
usb_ohci_init_memio(0x49000000, 3, -1, s->irq[S3C_PIC_USBH]);
Modified: trunk/src/host/qemu-neo1973/hw/s3c24xx_mmci.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/s3c24xx_mmci.c 2007-12-26 15:01:35 UTC (rev 3735)
+++ trunk/src/host/qemu-neo1973/hw/s3c24xx_mmci.c 2007-12-26 21:33:38 UTC (rev 3736)
@@ -37,6 +37,9 @@
uint16_t dtimer;
uint32_t mask;
uint8_t prescaler;
+
+ uint16_t model;
+ const target_phys_addr_t *map;
};
void s3c_mmci_reset(struct s3c_mmci_state_s *s)
@@ -202,11 +205,16 @@
#define S3C_SDIDAT 0x3c /* SDI Data register */
#define S3C_SDIMSK 0x40 /* SDI Interrupt Mask register */
+#define S3C_SDIMAX 0x40
+
static uint32_t s3c_mmci_read(void *opaque, target_phys_addr_t addr)
{
struct s3c_mmci_state_s *s = (struct s3c_mmci_state_s *) opaque;
uint32_t ret;
addr -= s->base;
+ if (addr > S3C_SDIMAX)
+ goto bad_reg;
+ addr = s->map[addr];
switch (addr) {
case S3C_SDICON:
@@ -274,6 +282,7 @@
case S3C_SDIMSK:
return s->mask;
default:
+ bad_reg:
printf("%s: Bad register 0x%lx\n", __FUNCTION__, addr);
break;
}
@@ -285,6 +294,9 @@
{
struct s3c_mmci_state_s *s = (struct s3c_mmci_state_s *) opaque;
addr -= s->base;
+ if (addr > S3C_SDIMAX)
+ goto bad_reg;
+ addr = s->map[addr];
switch (addr) {
case S3C_SDICON:
@@ -344,6 +356,7 @@
s->mask = value & 0x3ffff;
break;
default:
+ bad_reg:
printf("%s: Bad register 0x%lx\n", __FUNCTION__, addr);
}
}
@@ -401,6 +414,48 @@
qemu_put_8s(f, &s->prescaler);
}
+static const target_phys_addr_t s3c2410_regmap[S3C_SDIMAX + 1] = {
+ [0 ... S3C_SDIMAX] = -1,
+ [0x00] = S3C_SDICON,
+ [0x04] = S3C_SDIPRE,
+ [0x08] = S3C_SDICARG,
+ [0x0c] = S3C_SDICCON,
+ [0x10] = S3C_SDICSTA,
+ [0x14] = S3C_SDIRSP0,
+ [0x18] = S3C_SDIRSP1,
+ [0x1c] = S3C_SDIRSP2,
+ [0x20] = S3C_SDIRSP3,
+ [0x24] = S3C_SDIDTIMER,
+ [0x28] = S3C_SDIBSIZE,
+ [0x2c] = S3C_SDIDCON,
+ [0x30] = S3C_SDICNT,
+ [0x34] = S3C_SDIDSTA,
+ [0x38] = S3C_SDIFSTA,
+ [0x3c] = S3C_SDIDAT,
+ [0x40] = S3C_SDIMSK,
+};
+
+static const target_phys_addr_t s3c2440_regmap[S3C_SDIMAX + 1] = {
+ [0 ... S3C_SDIMAX] = -1,
+ [0x00] = S3C_SDICON,
+ [0x04] = S3C_SDIPRE,
+ [0x08] = S3C_SDICARG,
+ [0x0c] = S3C_SDICCON,
+ [0x10] = S3C_SDICSTA,
+ [0x14] = S3C_SDIRSP0,
+ [0x18] = S3C_SDIRSP1,
+ [0x1c] = S3C_SDIRSP2,
+ [0x20] = S3C_SDIRSP3,
+ [0x24] = S3C_SDIDTIMER,
+ [0x28] = S3C_SDIBSIZE,
+ [0x2c] = S3C_SDIDCON,
+ [0x30] = S3C_SDICNT,
+ [0x34] = S3C_SDIDSTA,
+ [0x38] = S3C_SDIFSTA,
+ [0x3c] = S3C_SDIMSK,
+ [0x40] = S3C_SDIDAT,
+};
+
static int s3c_mmci_load(QEMUFile *f, void *opaque, int version_id)
{
struct s3c_mmci_state_s *s = (struct s3c_mmci_state_s *) opaque;
@@ -430,7 +485,7 @@
return 0;
}
-struct s3c_mmci_state_s *s3c_mmci_init(target_phys_addr_t base,
+struct s3c_mmci_state_s *s3c_mmci_init(target_phys_addr_t base, uint16_t model,
struct sd_card_s *mmc, qemu_irq irq, qemu_irq *dma)
{
int iomemtype;
@@ -445,6 +500,19 @@
s->irq = irq;
s->dma = dma;
s->card = mmc;
+ s->model = model;
+ switch (model) {
+ case 0x2410:
+ s->map = s3c2410_regmap;
+ break;
+ case 0x2440:
+ s->map = s3c2440_regmap;
+ break;
+ default:
+ fprintf(stderr, "%s: unknown MMC/SD/SDIO HC model %04x\n",
+ __FUNCTION__, model);
+ exit(-1);
+ }
mmc->irq = qemu_allocate_irqs(s3c_mmci_cardirq, s, 1)[0];
More information about the commitlog
mailing list