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