r3565 - trunk/src/host/qemu-neo1973/hw
andrew at sita.openmoko.org
andrew at sita.openmoko.org
Wed Dec 5 02:42:06 CET 2007
Author: andrew
Date: 2007-12-05 02:42:04 +0100 (Wed, 05 Dec 2007)
New Revision: 3565
Modified:
trunk/src/host/qemu-neo1973/hw/neo1973.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
trunk/src/host/qemu-neo1973/hw/sd.c
Log:
Implement SDIO interrupts in S3C24xx MMCI.
Move MMC/SD/SDIO slot setup to board code.
Modified: trunk/src/host/qemu-neo1973/hw/neo1973.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/neo1973.c 2007-12-04 17:57:54 UTC (rev 3564)
+++ trunk/src/host/qemu-neo1973/hw/neo1973.c 2007-12-05 01:42:04 UTC (rev 3565)
@@ -84,6 +84,7 @@
QEMUTimer *modem_timer;
qemu_irq *kbd_pic;
const char *kernel;
+ struct sd_card_s *mmc;
};
/* Handlers for output ports */
@@ -252,9 +253,7 @@
s3c_timers_cmp_handler_set(s->cpu->timers, 0, neo_bl_intensity, s);
- /* MMC/SD host */
- s3c_mmci_handlers(s->cpu->mmci, 0,
- qemu_irq_invert(s3c_gpio_in_get(
+ sd_set_cb(s->mmc, 0, qemu_irq_invert(s3c_gpio_in_get(
s->cpu->io)[GTA01_IRQ_nSD_DETECT]));
}
@@ -423,8 +422,12 @@
{
struct neo_board_s *s = (struct neo_board_s *)
qemu_mallocz(sizeof(struct neo_board_s));
+ int sd_idx = drive_get_index(IF_SD, 0, 0);
+
s->ram = 0x08000000;
s->kernel = kernel_filename;
+ if (sd_idx >= 0)
+ s->mmc = sd_init(drives_table[sd_idx].bdrv, 0);
/* Setup CPU & memory */
if (ram_size < s->ram + S3C_SRAM_SIZE) {
@@ -436,7 +439,7 @@
fprintf(stderr, "This platform requires an ARM920T core\n");
exit(2);
}
- s->cpu = s3c2410_init(s->ram, ds);
+ s->cpu = s3c2410_init(s->ram, ds, s->mmc);
s3c_nand_register(s->cpu, nand_init(NAND_MFR_SAMSUNG, 0x76));
Modified: trunk/src/host/qemu-neo1973/hw/s3c.h
===================================================================
--- trunk/src/host/qemu-neo1973/hw/s3c.h 2007-12-04 17:57:54 UTC (rev 3564)
+++ trunk/src/host/qemu-neo1973/hw/s3c.h 2007-12-05 01:42:04 UTC (rev 3565)
@@ -11,6 +11,7 @@
# include "qemu-common.h"
# include "flash.h"
+# include "sd.h"
/* Interrupt numbers */
# define S3C_PIC_EINT0 0
@@ -157,9 +158,7 @@
/* s3c24xx_mmci.c */
struct s3c_mmci_state_s;
struct s3c_mmci_state_s *s3c_mmci_init(target_phys_addr_t base,
- BlockDriverState *bd, qemu_irq irq, qemu_irq *dma);
-void s3c_mmci_handlers(struct s3c_mmci_state_s *s, qemu_irq readonly_cb,
- qemu_irq coverswitch_cb);
+ struct sd_card_s *mmc, qemu_irq irq, qemu_irq *dma);
void s3c_mmci_reset(struct s3c_mmci_state_s *s);
/* s3c24xx_rtc.c */
@@ -220,7 +219,8 @@
};
/* s3c2410.c */
-struct s3c_state_s *s3c2410_init(unsigned int sdram_size, DisplayState *ds);
+struct s3c_state_s *s3c2410_init(unsigned int sdram_size, DisplayState *ds,
+ struct sd_card_s *mmc);
void s3c_nand_register(struct s3c_state_s *s, struct nand_flash_s *chip);
void s3c_nand_setwp(struct s3c_state_s *s, int wp);
Modified: trunk/src/host/qemu-neo1973/hw/s3c2410.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/s3c2410.c 2007-12-04 17:57:54 UTC (rev 3564)
+++ trunk/src/host/qemu-neo1973/hw/s3c2410.c 2007-12-05 01:42:04 UTC (rev 3565)
@@ -2833,10 +2833,11 @@
}
/* Initialise an S3C2410A microprocessor. */
-struct s3c_state_s *s3c2410_init(unsigned int sdram_size, DisplayState *ds)
+struct s3c_state_s *s3c2410_init(unsigned int sdram_size, DisplayState *ds,
+ struct sd_card_s *mmc)
{
struct s3c_state_s *s;
- int iomemtype, i, sd_idx;
+ int iomemtype, i;
s = (struct s3c_state_s *) qemu_mallocz(sizeof(struct s3c_state_s));
s->env = cpu_init("arm920t");
@@ -2908,11 +2909,7 @@
s->irq[S3C_PIC_SPI0], s->drq[S3C_RQ_SPI0],
s->irq[S3C_PIC_SPI1], s->drq[S3C_RQ_SPI1], s->io);
- sd_idx = drive_get_index(IF_SD, 0, 0);
- if (sd_idx != -1) {
- s->mmci = s3c_mmci_init(0x5a000000, drives_table[sd_idx].bdrv,
- s->irq[S3C_PIC_SDI], s->drq);
- }
+ s->mmci = s3c_mmci_init(0x5a000000, 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-04 17:57:54 UTC (rev 3564)
+++ trunk/src/host/qemu-neo1973/hw/s3c24xx_mmci.c 2007-12-05 01:42:04 UTC (rev 3565)
@@ -41,6 +41,9 @@
void s3c_mmci_reset(struct s3c_mmci_state_s *s)
{
+ if (!s)
+ return;
+
s->blklen = 0;
s->blknum = 0;
s->blklen_cnt = 0;
@@ -357,6 +360,20 @@
s3c_mmci_write,
};
+static void s3c_mmci_cardirq(void *opaque, int line, int level)
+{
+ struct s3c_mmci_state_s *s = (struct s3c_mmci_state_s *) opaque;
+
+ if (~s->control & (1 << 3)) /* RcvIOInt */
+ return;
+ if (!level)
+ return;
+
+ s->dstatus |= 1 << 9; /* IOIntDet */
+ if (s->mask & (1 << 12)) /* IOIntDet */
+ qemu_irq_raise(s->irq);
+}
+
static void s3c_mmci_save(QEMUFile *f, void *opaque)
{
struct s3c_mmci_state_s *s = (struct s3c_mmci_state_s *) opaque;
@@ -414,16 +431,23 @@
}
struct s3c_mmci_state_s *s3c_mmci_init(target_phys_addr_t base,
- BlockDriverState *bd, qemu_irq irq, qemu_irq *dma)
+ struct sd_card_s *mmc, qemu_irq irq, qemu_irq *dma)
{
int iomemtype;
- struct s3c_mmci_state_s *s = (struct s3c_mmci_state_s *)
+ struct s3c_mmci_state_s *s;
+
+ if (!mmc)
+ return 0;
+
+ s = (struct s3c_mmci_state_s *)
qemu_mallocz(sizeof(struct s3c_mmci_state_s));
-
s->base = base;
s->irq = irq;
s->dma = dma;
+ s->card = mmc;
+ mmc->irq = qemu_allocate_irqs(s3c_mmci_cardirq, s, 1)[0];
+
s3c_mmci_reset(s);
iomemtype = cpu_register_io_memory(0, s3c_mmci_readfn,
@@ -432,14 +456,5 @@
register_savevm("s3c24xx_mmci", 0, 0, s3c_mmci_save, s3c_mmci_load, s);
- /* Instantiate the actual storage */
- s->card = sd_init(bd, 0);
-
return s;
}
-
-void s3c_mmci_handlers(struct s3c_mmci_state_s *s, qemu_irq readonly_cb,
- qemu_irq coverswitch_cb)
-{
- sd_set_cb(s->card, readonly_cb, coverswitch_cb);
-}
Modified: trunk/src/host/qemu-neo1973/hw/sd.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/sd.c 2007-12-04 17:57:54 UTC (rev 3564)
+++ trunk/src/host/qemu-neo1973/hw/sd.c 2007-12-05 01:42:04 UTC (rev 3565)
@@ -1587,8 +1587,13 @@
void sd_set_cb(struct sd_card_s *card, qemu_irq readonly, qemu_irq insert)
{
- SDState *sd = (SDState *) card->opaque;
+ SDState *sd;
+ if (!card)
+ return;
+
+ sd = (SDState *) card->opaque;
+
sd->readonly_cb = readonly;
sd->inserted_cb = insert;
qemu_set_irq(readonly, bdrv_is_read_only(sd->bdrv));
More information about the commitlog
mailing list