]> git.proxmox.com Git - mirror_qemu.git/commitdiff
Better STOPINTR bit semantics in the PXA2xx DMA.
authorbalrog <balrog@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 17 Nov 2007 18:43:47 +0000 (18:43 +0000)
committerbalrog <balrog@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 17 Nov 2007 18:43:47 +0000 (18:43 +0000)
Don't error out on reading GPCR register, just warn (Thorsten Zitterell).
Don't zero a memory that's already zeroed.

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3676 c046a42c-6fe2-441c-8c8c-71466251a162

hw/pxa2xx_dma.c
hw/pxa2xx_gpio.c
hw/pxa2xx_mmci.c
hw/sd.c

index 23bdae909bb6a5e1274574d7cc0f167fc7b2f5ca..4e33c53173e3a28830f4960a409e32d5e9202cfa 100644 (file)
@@ -348,8 +348,10 @@ static void pxa2xx_dma_write(void *opaque,
 
         if (value & DCSR_NODESCFETCH) {
             /* No-descriptor-fetch mode */
-            if (value & DCSR_RUN)
+            if (value & DCSR_RUN) {
+                s->chan[channel].state &= ~DCSR_STOPINTR;
                 pxa2xx_dma_run(s);
+            }
         } else {
             /* Descriptor-fetch mode */
             if (value & DCSR_RUN) {
index 9f5184438cfe06b52c6631430d1cd970b7d45a48..e3a30bc45e336e814079a51e16cb84a9e47b13d8 100644 (file)
@@ -154,6 +154,11 @@ static uint32_t pxa2xx_gpio_read(void *opaque, target_phys_addr_t offset)
                         __FUNCTION__, offset);
         return s->gpsr[bank];  /* Return last written value.  */
 
+    case GPCR:         /* GPIO Pin-Output Clear registers */
+        printf("%s: Read from a write-only register " REG_FMT "\n",
+                        __FUNCTION__, offset);
+        return 31337;          /* Specified as unpredictable in the docs.  */
+
     case GRER:         /* GPIO Rising-Edge Detect Enable registers */
         return s->rising[bank];
 
index 6e244a96cccaf2e09d5daac8e34ae1234dcfd350..9d26b7959e845f6543a2c72b17d0d3b21c0b8a74 100644 (file)
@@ -549,5 +549,5 @@ struct pxa2xx_mmci_s *pxa2xx_mmci_init(target_phys_addr_t base,
 void pxa2xx_mmci_handlers(struct pxa2xx_mmci_s *s, qemu_irq readonly,
                 qemu_irq coverswitch)
 {
-    sd_set_cb(s->card, read, coverswitch);
+    sd_set_cb(s->card, readonly, coverswitch);
 }
diff --git a/hw/sd.c b/hw/sd.c
index 08e8805e54cf82f626d66840092f020cb604c260..9dd86e3573c643b8c141c119b4a7ef82049a3640 100644 (file)
--- a/hw/sd.c
+++ b/hw/sd.c
@@ -377,7 +377,6 @@ static void sd_reset(SDState *sd, BlockDriverState *bdrv)
         qemu_free(sd->wp_groups);
     sd->wp_switch = bdrv_is_read_only(bdrv);
     sd->wp_groups = (int *) qemu_mallocz(sizeof(int) * sect);
-    memset(sd->wp_groups, 0, sizeof(int) * sect);
     memset(sd->function_group, 0, sizeof(int) * 6);
     sd->erase_start = 0;
     sd->erase_end = 0;