Send commitlog mailing list submissions to
        [email protected]

To subscribe or unsubscribe via the World Wide Web, visit
        http://lists.openmoko.org/mailman/listinfo/commitlog
or, via email, send a message with subject or body 'help' to
        [EMAIL PROTECTED]

You can reach the person managing the list at
        [EMAIL PROTECTED]

When replying, please edit your Subject line so it is more specific
than "Re: Contents of commitlog digest..."
Today's Topics:

   1. r3735 - trunk/src/target/kernel/patches
      ([EMAIL PROTECTED])
   2. r3736 - trunk/src/host/qemu-neo1973/hw ([EMAIL PROTECTED])
   3. r3737 - trunk/src/host/qemu-neo1973/openmoko
      ([EMAIL PROTECTED])
   4. r3738 - trunk/src/host/qemu-neo1973/hw ([EMAIL PROTECTED])
   5. r3739 - trunk/src/host/qemu-neo1973/hw ([EMAIL PROTECTED])
--- Begin Message ---
Author: laforge
Date: 2007-12-26 16:01:35 +0100 (Wed, 26 Dec 2007)
New Revision: 3735

Modified:
   trunk/src/target/kernel/patches/gta02-core.patch
Log:
fix GTA02 gsm power switching (Sean Chiang)


Modified: trunk/src/target/kernel/patches/gta02-core.patch
===================================================================
--- trunk/src/target/kernel/patches/gta02-core.patch    2007-12-25 22:33:12 UTC 
(rev 3734)
+++ trunk/src/target/kernel/patches/gta02-core.patch    2007-12-26 15:01:35 UTC 
(rev 3735)
@@ -929,7 +929,7 @@
  struct gta01pm_priv {
        int gpio_ngsm_en;
        struct console *con;
-@@ -70,27 +76,47 @@
+@@ -70,27 +76,51 @@
  
        if (!strcmp(attr->attr.name, "power_on")) {
                if (on) {
@@ -949,6 +949,8 @@
 +                      switch (system_rev) {
 +#ifdef CONFIG_MACH_NEO1973_GTA02
 +                      case GTA02v2_SYSTEM_REV:
++                      case GTA02v3_SYSTEM_REV:
++                      case GTA02v4_SYSTEM_REV:
 +                              pcf50633_gpio_set(pcf50633_global,
 +                                                PCF50633_GPIO2, 1);
 +                              break;
@@ -962,6 +964,8 @@
 +                      switch (system_rev) {
 +#ifdef CONFIG_MACH_NEO1973_GTA02
 +                      case GTA02v2_SYSTEM_REV:
++                      case GTA02v3_SYSTEM_REV:
++                      case GTA02v4_SYSTEM_REV:
 +                              pcf50633_gpio_set(pcf50633_global,
 +                                                PCF50633_GPIO2, 0);
 +                              break;
@@ -983,13 +987,15 @@
                }
        } else if (!strcmp(attr->attr.name, "reset")) {
                s3c2410_gpio_setpin(GTA01_GPIO_MODEM_RST, on);
-@@ -158,8 +184,14 @@
+@@ -158,8 +188,16 @@
                        gta01_gsm.gpio_ngsm_en = GTA01Bv2_GPIO_nGSM_EN;
                        s3c2410_gpio_setpin(GTA01v3_GPIO_nGSM_EN, 0);
                        break;
 +#ifdef CONFIG_MACH_NEO1973_GTA02
 +              case GTA02v1_SYSTEM_REV:
 +              case GTA02v2_SYSTEM_REV:
++              case GTA02v3_SYSTEM_REV:
++              case GTA02v4_SYSTEM_REV:
 +                      gta01_gsm.gpio_ngsm_en = 0;
 +                      break;
 +#endif
@@ -999,7 +1005,7 @@
                                 "some PM features not available!!!\n",
                                 system_rev);
                        break;
-@@ -175,9 +207,13 @@
+@@ -175,9 +213,13 @@
                break;
        }
  
@@ -1016,7 +1022,7 @@
  
        return sysfs_create_group(&pdev->dev.kobj, &gta01_gsm_attr_group);
  }
-@@ -214,4 +250,4 @@
+@@ -214,4 +256,4 @@
  
  MODULE_LICENSE("GPL");
  MODULE_AUTHOR("Harald Welte <[EMAIL PROTECTED]>");




--- End Message ---
--- Begin Message ---
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];
 




--- End Message ---
--- Begin Message ---
Author: andrew
Date: 2007-12-26 22:39:15 +0100 (Wed, 26 Dec 2007)
New Revision: 3737

Modified:
   trunk/src/host/qemu-neo1973/openmoko/linux-gta02-pseudo.patch
Log:
Patch the kernel to see S3C2410 register map, rather than 2440.


Modified: trunk/src/host/qemu-neo1973/openmoko/linux-gta02-pseudo.patch
===================================================================
--- trunk/src/host/qemu-neo1973/openmoko/linux-gta02-pseudo.patch       
2007-12-26 21:33:38 UTC (rev 3736)
+++ trunk/src/host/qemu-neo1973/openmoko/linux-gta02-pseudo.patch       
2007-12-26 21:39:15 UTC (rev 3737)
@@ -1074,6 +1074,143 @@
              end_request(pRequest, 0);
                  /* reset */
              outstandingReq = 1;
+diff --git a/drivers/sdio/hcd/s3c24xx/s3c24xx_hcd.c 
b/drivers/sdio/hcd/s3c24xx/s3c24xx_hcd.c
+index a1b8953..8dc88d2 100644
+--- a/drivers/sdio/hcd/s3c24xx/s3c24xx_hcd.c
++++ b/drivers/sdio/hcd/s3c24xx/s3c24xx_hcd.c
+@@ -100,7 +100,7 @@ static void s3c24xx_dump_regs(struct s3c24xx_hcd_context * 
context)
+       datcnt  = readl(context->base + S3C2410_SDIDCNT);
+       datsta  = readl(context->base + S3C2410_SDIDSTA);
+       fsta    = readl(context->base + S3C2410_SDIFSTA);
+-      imask   = readl(context->base + S3C2440_SDIIMSK);
++      imask   = readl(context->base + S3C2410_SDIIMSK);
+ 
+       printk("SDICON:    0x%08x\n", con);
+       printk("SDIPRE:    0x%08x\n", pre);
+@@ -127,15 +127,15 @@ static inline void s3c24xx_hcd_clear_imask(struct 
s3c24xx_hcd_context * context)
+ 
+       if (context->int_sdio) {
+               writel(S3C2410_SDIIMSK_SDIOIRQ | S3C2410_SDIIMSK_READWAIT,
+-                     context->base + S3C2440_SDIIMSK);
++                     context->base + S3C2410_SDIIMSK);
+       }  else {
+-              writel(0, context->base + S3C2440_SDIIMSK);
++              writel(0, context->base + S3C2410_SDIIMSK);
+       }
+ }
+ 
+ static inline void s3c24xx_hcd_set_imask(struct s3c24xx_hcd_context * context)
+ {
+-      writel(context->int_mask, context->base + S3C2440_SDIIMSK);
++      writel(context->int_mask, context->base + S3C2410_SDIIMSK);
+ }
+ 
+ 
+@@ -456,11 +456,11 @@ static void s3c24xx_hcd_pio_complete(struct 
s3c24xx_hcd_context * context)
+                       req->DataRemaining -= fifo_count;
+                       while (fifo_count > 0) {
+                               if (context->data_size == 4)
+-                                      *(ptr) = readl(context->base + 
S3C2440_SDIDATA);
++                                      *(ptr) = readl(context->base + 
S3C2410_SDIDATA);
+                               else if (context->data_size == 2)
+-                                      *(ptr) = readw(context->base + 
S3C2440_SDIDATA);
++                                      *(ptr) = readw(context->base + 
S3C2410_SDIDATA);
+                               else
+-                                      *(ptr) = readb(context->base + 
S3C2440_SDIDATA);
++                                      *(ptr) = readb(context->base + 
S3C2410_SDIDATA);
+ 
+                               ptr += context->data_size;
+                               fifo_count -= context->data_size;
+@@ -524,11 +524,11 @@ static void s3c24xx_hcd_pio_complete(struct 
s3c24xx_hcd_context * context)
+ 
+                               while (fifo_count > 0) {
+                                       if (context->data_size == 4)
+-                                              writel(*(ptr), context->base + 
S3C2440_SDIDATA);
++                                              writel(*(ptr), context->base + 
S3C2410_SDIDATA);
+                                       else if (context->data_size == 2)
+-                                              writew(*(ptr), context->base + 
S3C2440_SDIDATA);
++                                              writew(*(ptr), context->base + 
S3C2410_SDIDATA);
+                                       else
+-                                              writeb(*(ptr), context->base + 
S3C2440_SDIDATA);
++                                              writeb(*(ptr), context->base + 
S3C2410_SDIDATA);
+ 
+                                       ptr += context->data_size;
+                                       fifo_count -= context->data_size;
+@@ -691,7 +691,7 @@ static int s3c24xx_hcd_prepare_dma(struct 
s3c24xx_hcd_context * context)
+       }
+ 
+       s3c2410_dma_devconfig(context->dma_channel, source, hwcfg,
+-                            (unsigned long)context->mem->start + 
S3C2440_SDIDATA);
++                            (unsigned long)context->mem->start + 
S3C2410_SDIDATA);
+ 
+       s3c2410_dma_config(context->dma_channel, context->data_size,
+                          S3C2410_DCON_CH0_SDI);
+@@ -741,9 +741,9 @@ static irqreturn_t s3c24xx_hcd_irq(int irq, void *dev_id)
+ 
+                       context->int_sdio = 0;
+ 
+-                      imask = readl(context->base + S3C2440_SDIIMSK);
++                      imask = readl(context->base + S3C2410_SDIIMSK);
+                       imask &= ~S3C2410_SDIIMSK_SDIOIRQ;
+-                      writel(imask, context->base + S3C2440_SDIIMSK);
++                      writel(imask, context->base + S3C2410_SDIIMSK);
+                       SDIO_HandleHcdEvent(&context->hcd, 
EVENT_HCD_SDIO_IRQ_PENDING);
+               }
+ 
+@@ -875,20 +875,20 @@ SDIO_STATUS s3c24xx_hcd_config(PSDHCD hcd, PSDCONFIG 
config)
+ 
+               if (int_data->SlotIRQEnable &
+                   (IRQ_DETECT_1_BIT | IRQ_DETECT_4_BIT | 
IRQ_DETECT_MULTI_BLK) ) {
+-                      imsk = readl(context->base + S3C2440_SDIIMSK);
++                      imsk = readl(context->base + S3C2410_SDIIMSK);
+ 
+                       if (int_data->SlotIRQEnable) {
+                               printk("SDIO_INT_CTRL enable IRQ\n");
+                               DBG_PRINT(SDDBG_TRACE, ("SDIO_INT_CTRL enable 
IRQ\n"));
+                               context->int_sdio = 1;
+                               imsk |= S3C2410_SDIIMSK_SDIOIRQ;
+-                              writel(imsk, context->base + S3C2440_SDIIMSK);
++                              writel(imsk, context->base + S3C2410_SDIIMSK);
+                       } else {
+                               printk("SDIO_INT_CTRL disable IRQ\n");
+                               DBG_PRINT(SDDBG_TRACE, ("SDIO_INT_CTRL disable 
IRQ\n"));
+                               context->int_sdio = 0;
+                               imsk &= ~S3C2410_SDIIMSK_SDIOIRQ;
+-                              writel(imsk, context->base + S3C2440_SDIIMSK);
++                              writel(imsk, context->base + S3C2410_SDIIMSK);
+                       }
+               }
+               status = SDIO_STATUS_SUCCESS;
+@@ -898,9 +898,9 @@ SDIO_STATUS s3c24xx_hcd_config(PSDHCD hcd, PSDCONFIG 
config)
+               spin_lock_irqsave(&context->lock,flags);
+ 
+               context->int_sdio = 1;
+-              imsk = readl(context->base + S3C2440_SDIIMSK);
++              imsk = readl(context->base + S3C2410_SDIIMSK);
+               imsk |= S3C2410_SDIIMSK_SDIOIRQ;
+-              writel(imsk, context->base + S3C2440_SDIIMSK);
++              writel(imsk, context->base + S3C2410_SDIIMSK);
+ 
+               spin_unlock_irqrestore(&context->lock,flags);
+ 
+@@ -1090,7 +1090,7 @@ SDIO_STATUS s3c24xx_hcd_request(PSDHCD hcd)
+       if (context->int_sdio)
+               imask |= S3C2410_SDIIMSK_SDIOIRQ;
+       context->int_mask = imask;
+-      writel(imask, context->base + S3C2440_SDIIMSK);
++      writel(imask, context->base + S3C2410_SDIIMSK);
+       writel(req->Argument, context->base + S3C2410_SDICMDARG);
+       writel(cmdcon, context->base + S3C2410_SDICMDCON);
+ 
+@@ -1376,7 +1376,7 @@ static int s3c24xx_hcd_debugfs_show(struct seq_file *s, 
void *data)
+       datcnt  = readl(context->base + S3C2410_SDIDCNT);
+       datsta  = readl(context->base + S3C2410_SDIDSTA);
+       fsta    = readl(context->base + S3C2410_SDIFSTA);
+-      imask   = readl(context->base + S3C2440_SDIIMSK);
++      imask   = readl(context->base + S3C2410_SDIIMSK);
+ 
+       seq_printf(s, "SDICON:    0x%08x\n", con);
+       seq_printf(s, "SDIPRE:    0x%08x\n", pre);
 diff --git a/include/asm-arm/plat-s3c24xx/pm.h 
b/include/asm-arm/plat-s3c24xx/pm.h
 index cc62366..20e03b3 100644
 --- a/include/asm-arm/plat-s3c24xx/pm.h




--- End Message ---
--- Begin Message ---
Author: andrew
Date: 2007-12-27 00:08:04 +0100 (Thu, 27 Dec 2007)
New Revision: 3738

Modified:
   trunk/src/host/qemu-neo1973/hw/ar6000.c
Log:
SDIO CMD5 doesn't change state in "initialization".
Don't reset the always-one flags in card status word.
Common CIS pointer is an offset from CIA, not CIS start.
Add some common CIS tuples similar to those on a real AR6001.


Modified: trunk/src/host/qemu-neo1973/hw/ar6000.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/ar6000.c     2007-12-26 21:39:15 UTC (rev 
3737)
+++ trunk/src/host/qemu-neo1973/hw/ar6000.c     2007-12-26 23:08:04 UTC (rev 
3738)
@@ -303,7 +303,7 @@
         case sd_initialization_state:
             /* We accept any voltage.  10000 V is nothing.  */
             if (req.arg) {
-                sd->state = sd_ready_state;
+                sd->state = sd_initialization_state;
                 sd->sdio_ok = 1;
             }
 
@@ -456,7 +456,7 @@
         return 0;
     }
 
-    sd->card_status &= ~CARD_STATUS_B;
+    sd->card_status &= ~(COM_CRC_ERROR | ILLEGAL_COMMAND);     /* B type */
 
     rtype = sdio_normal_command(sd, *req);
 
@@ -587,6 +587,8 @@
     return sd->state == sd_transfer_state;
 }
 
+#define SDIO_CIS_START 0x1000
+
 static void sdio_cccr_write(struct sdio_s *sd, uint32_t offset, uint8_t value)
 {
     switch (offset) {
@@ -660,7 +662,7 @@
 {
     switch (offset) {
     case 0x00: /* CCCR/SDIO Revison */
-        return 0x32;
+        return 0x32;   /* SDIO Specification Version 2.00, CCCR/FBR V 1.20 */
 
     case 0x01: /* SD Specification Revision */
         return 0x02;   /* SD Physical Specification Version 2.00 (May 2006) */
@@ -682,12 +684,15 @@
 
     case 0x08: /* Card Capability */
         /* XXX: set SDC (01) when CMD52 learns to preserve current_cmd */
+        /* XXX: need to addr ReadWait support too (RWC (04)) */
         return 0x12 | sd->cccr.e4mi;   /* SMB | S4MI | E4MI | Full-Speed */
 
     case 0x09: /* Common CIS Pointer */
+        return (SDIO_CIS_START >>  0) & 0xff;
     case 0x0a: /* Common CIS Pointer */
+        return (SDIO_CIS_START >>  8) & 0xff;
     case 0x0b: /* Common CIS Pointer */
-        return 0x00;   /* Starts at 0x1000 */
+        return (SDIO_CIS_START >> 16) & 0xff;
 
     case 0x1c: /* Bus Suspend */
         return 0x00;
@@ -768,16 +773,16 @@
         *data ++ = sdio_fbr_read(sd, addr >> 8, addr & 0xff);
 
     /* RFU */
-    if (len && unlikely(addr < 0x1000)) {
-        llen = sd->transfer.step ? MIN(len, 0x1000 - addr) : len;
+    if (len && unlikely(addr < SDIO_CIS_START)) {
+        llen = sd->transfer.step ? MIN(len, SDIO_CIS_START - addr) : len;
         memset(data, 0, llen);
         data += llen;
         len -= llen;
-        addr = 0x1000;
+        addr = SDIO_CIS_START;
     }
 
     /* CIS */
-    addr -= 0x1000;
+    addr -= SDIO_CIS_START;
     if (len && addr < sd->cislen) {
         llen = MIN(len, sd->cislen - addr);
         memcpy(data, sd->cis + addr, llen);
@@ -855,14 +860,22 @@
 
 /* TODO: dump real values from an Atheros AR6001 - need hw access! */
 const static uint8_t ar6k_cis[] = {
+    CISTPL_DEVICE, 3,          /* Not SDIO standard */
+    0x00, 0x00, 0x00,          /* TODO */
+
     CISTPL_MANFID, 4,
-    0x0a, 0x01,                        /* SDIO Card manufacturer code */
-    0x71, 0x02,                        /* Manufacturer information (Part No, 
Rev) */
+    0x71, 0x02,                        /* SDIO Card manufacturer code */
+    0x0a, 0x01,                        /* Manufacturer information (Part No, 
Rev) */
 
     CISTPL_FUNCID, 2,
     0x0c,                      /* Card funcion code: SDIO */
     0x00,                      /* System initialization mask */
 
+    CISTPL_FUNCE, 4,
+    0x00,                      /* Type of extended data: Function 0 */
+    0x00, 0x08,                        /* Max. block size/byte count for Fn0: 
2048 */
+    0x32,                      /* Max. transfer rate per line: 25 Mb/Sec */
+
     CISTPL_END, 0xff,
 };
 




--- End Message ---
--- Begin Message ---
Author: andrew
Date: 2007-12-27 03:56:21 +0100 (Thu, 27 Dec 2007)
New Revision: 3739

Modified:
   trunk/src/host/qemu-neo1973/hw/ar6000.c
   trunk/src/host/qemu-neo1973/hw/sd.h
Log:
FBR space registers.
Per-function CIS tuples of Atheros ar6k1, makes function PnP logic work.


Modified: trunk/src/host/qemu-neo1973/hw/ar6000.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/ar6000.c     2007-12-26 23:08:04 UTC (rev 
3738)
+++ trunk/src/host/qemu-neo1973/hw/ar6000.c     2007-12-27 02:56:21 UTC (rev 
3739)
@@ -58,6 +58,13 @@
         uint8_t speed;
     } cccr;
     struct {
+        uint8_t stdfn;
+        uint8_t ext_stdfn;
+        uint8_t power;
+        int cis_offset;
+        uint32_t csa_addr;
+        void (*csa_wr)(struct sdio_s *sd, uint8_t data);
+        uint8_t (*csa_rd)(struct sdio_s *sd);
     } fbr[7];
     const uint8_t *cis;
     int cislen;
@@ -250,6 +257,10 @@
     memset(&sd->fbr,  0, sizeof(sd->fbr));
     for (i = 0; i < 8; i ++)
         sd->blk_len[i] = 0;
+    for (i = 0; i < 7; i ++) {
+        sd->fbr[i].stdfn &= 0x4f;
+        sd->fbr[i].power = 0;
+    }
     if (sd->reset)
         sd->reset(sd);
 
@@ -639,7 +650,6 @@
         sd->blk_len[0] &= 0xff << 8;
         sd->blk_len[0] |= value;
         break;
-
     case 0x11: /* Fn0 Block Size MSB */
         sd->blk_len[0] &= 0xff;
         sd->blk_len[0] |= value << 8;
@@ -708,7 +718,6 @@
 
     case 0x10: /* Fn0 Block Size LSB */
         return (sd->blk_len[0] >> 0) & 0xff;
-
     case 0x11: /* Fn0 Block Size MSB */
         return (sd->blk_len[0] >> 8) & 0xff;
 
@@ -727,8 +736,53 @@
 static void sdio_fbr_write(struct sdio_s *sd,
                 int fn, uint32_t offset, uint8_t value)
 {
+    typeof(*sd->fbr) *func = &sd->fbr[fn - 1];
+
     switch (offset) {
+    case 0x00: /* Standard SDIO Function interface code */
+        if ((func->stdfn & (1 << 6)) && (value & (1 << 7)))    /* CSASupport */
+            func->stdfn |= 1 << 7;                             /* CSAEnable */
+        else
+            func->stdfn &= ~(1 << 7);                          /* CSAEnable */
+        break;
+
+    case 0x02: /* Power Selection */
+        sd->cccr.power |= value & 0x02;                                /* EPS 
*/
+        break;
+
+    case 0x0c: /* Function CSA Pointer */
+        func->csa_addr &= 0xffff00;
+        func->csa_addr |= value <<  0;
+        break;
+    case 0x0d: /* Function CSA Pointer */
+        func->csa_addr &= 0xff00ff;
+        func->csa_addr |= value <<  8;
+        break;
+    case 0x0e: /* Function CSA Pointer */
+        func->csa_addr &= 0x00ffff;
+        func->csa_addr |= value << 16;
+        break;
+
+    case 0x0f: /* Data access window to function's CSA */
+        if (func->stdfn & (1 << 7)) {                          /* CSAEnable */
+            if (func->csa_wr)
+                func->csa_wr(sd, value);
+            func->csa_addr ++;
+            break;
+        }
+        goto bad_reg;
+
+    case 0x10: /* I/O Block Size LSB */
+        sd->blk_len[fn] &= 0xff << 8;
+        sd->blk_len[fn] |= value;
+        break;
+    case 0x11: /* I/O Block Size MSB */
+        sd->blk_len[fn] &= 0xff;
+        sd->blk_len[fn] |= value << 8;
+        break;
+
     default:
+    bad_reg:
         printf("%s: unknown register %02x\n", __FUNCTION__, offset);
     }
 }
@@ -736,7 +790,44 @@
 static uint8_t sdio_fbr_read(struct sdio_s *sd,
                 int fn, uint32_t offset)
 {
+    typeof(*sd->fbr) *func = &sd->fbr[fn - 1];
+
     switch (offset) {
+    case 0x00: /* Standard SDIO Function interface code */
+        return func->stdfn;
+
+    case 0x01: /* Extended standard SDIO Function interface code */
+        return func->ext_stdfn;
+
+    case 0x02: /* Power Selection */
+        return func->power | 0x01;
+
+    case 0x09: /* Function CIS Pointer */
+        return ((SDIO_CIS_START + func->cis_offset) >>  0) & 0xff;
+    case 0x0a: /* Function CIS Pointer */
+        return ((SDIO_CIS_START + func->cis_offset) >>  8) & 0xff;
+    case 0x0b: /* Function CIS Pointer */
+        return ((SDIO_CIS_START + func->cis_offset) >> 16) & 0xff;
+
+    case 0x0c: /* Function CSA Pointer */
+        return (func->csa_addr >>  0) & 0xff;
+    case 0x0d: /* Function CSA Pointer */
+        return (func->csa_addr >>  8) & 0xff;
+    case 0x0e: /* Function CSA Pointer */
+        return (func->csa_addr >> 16) & 0xff;
+
+    case 0x0f: /* Data access window to function's CSA */
+        if ((func->stdfn & (1 << 7)) && func->csa_rd)          /* CSAEnable */
+            return func->csa_rd(sd);
+        if (func->stdfn & (1 << 7))
+            func->csa_addr ++;
+        return 0x00;
+
+    case 0x10: /* I/O Block Size LSB */
+        return (sd->blk_len[fn] >> 0) & 0xff;
+    case 0x11: /* I/O Block Size MSB */
+        return (sd->blk_len[fn] >> 8) & 0xff;
+
     default:
         printf("%s: unknown register %02x\n", __FUNCTION__, offset);
         return 0;
@@ -845,6 +936,7 @@
 struct ar6k_s {
     struct sdio_s sd;
     NICInfo *nd;
+    uint8_t cis[0];
 };
 
 static void ar6k_set_ioocr(struct sdio_s *sd)
@@ -879,16 +971,62 @@
     CISTPL_END, 0xff,
 };
 
+const static uint8_t ar6k_fn1_cis[] = {
+    CISTPL_MANFID, 4,
+    0x71, 0x02,                        /* SDIO Card manufacturer code */
+    0x0a, 0x01,                        /* Manufacturer information (Part No, 
Rev) */
+
+    CISTPL_FUNCID, 2,
+    0x0c,                      /* TODO Card funcion code: SDIO */
+    0x00,                      /* TODO System initialization mask */
+
+    CISTPL_FUNCE, 42,
+    0x01,                      /* Type of extended data: Function 1-7 */
+    0x01,                      /* Function information bitmask: has Wake-up */
+    0x11,                      /* Application Specification version level */
+    0x00, 0x00, 0x00, 0x00,    /* Product Serial Number: unsupported */
+    0x00, 0x00, 0x00, 0x00,    /* CSA space size: no CSA */
+    0x00,                      /* CSA space properties: no CSA */
+    0x00, 0x08,                        /* Maximum block size/byte count: 2048 
*/
+    0x00, 0x00, 0xff, 0x00,    /* OCR value: 2.8 - 3.6 V */
+    0x00,                      /* Minimum required current: above 200mA */
+    0x00,                      /* Average required current: above 200mA */
+    0x00,                      /* Maximum required current: above 200mA */
+    0x00,                      /* Minimum standby current: none */
+    0x01,                      /* Average standby current: 1mA */
+    0x0a,                      /* Maximum standby current: 10mA */
+    0x00, 0x00,                        /* Minimum transfer bandwidth: no 
minimum */
+    0x00, 0x00,                        /* Optimum transfer bandwidth: no 
optimum */
+    0x00, 0x00,                        /* Ready timeout: no timeout */
+    0x00, 0x00,                        /* Average required current: above 
200mA */
+    0x00, 0x00,                        /* Maximum required current: above 
200mA */
+    0x01, 0x01,                        /* Average HC-mode current: 256mA */
+    0x00, 0x01,                        /* Maximum HC-mode current: 256mA */
+    0x00, 0x01,                        /* Average LC-mode current: 256mA */
+    0x00, 0x01,                        /* Maximum LC-mode current: 256mA */
+
+    CISTPL_END, 0xff,
+};
+
 struct sd_card_s *ar6k_init(NICInfo *nd)
 {
-    struct ar6k_s *s = (struct ar6k_s *) qemu_mallocz(sizeof(struct ar6k_s));
+    struct ar6k_s *s = (struct ar6k_s *) qemu_mallocz(sizeof(struct ar6k_s) +
+                           sizeof(ar6k_cis) + sizeof(ar6k_fn1_cis));
     struct sd_card_s *ret = sdio_init(&s->sd);
 
     s->nd = nd;
     s->sd.reset = (void *) ar6k_reset;
-    s->sd.cis = ar6k_cis;
-    s->sd.cislen = sizeof(ar6k_cis);
+    s->sd.fbr[0].stdfn = 0 | sdio_fn_none;
+    s->sd.fbr[0].ext_stdfn = sdio_ext_fn_none;
 
+    s->sd.cis = s->cis;
+    s->sd.cislen = sizeof(ar6k_cis) + sizeof(ar6k_fn1_cis);
+    s->sd.fbr[0].cis_offset = sizeof(ar6k_cis);
+
+    memcpy(s->cis + 0, ar6k_cis, sizeof(ar6k_cis));
+    memcpy(s->cis + s->sd.fbr[0].cis_offset,
+                    ar6k_fn1_cis, sizeof(ar6k_fn1_cis));
+
     ar6k_reset(s);
 
     return ret;

Modified: trunk/src/host/qemu-neo1973/hw/sd.h
===================================================================
--- trunk/src/host/qemu-neo1973/hw/sd.h 2007-12-26 23:08:04 UTC (rev 3738)
+++ trunk/src/host/qemu-neo1973/hw/sd.h 2007-12-27 02:56:21 UTC (rev 3739)
@@ -87,6 +87,22 @@
     sd_initialization_state = sd_idle_state,
 };
 
+enum sdio_stdfn_e {
+    sdio_fn_none = 0,
+    sdio_fn_uart,      /* Standard UART */
+    sdio_fn_bt_a,      /* Type A for Bluetooth standard interface */
+    sdio_fn_bt_b,      /* Type B for Bluetooth standard interface */
+    sdio_fn_gps,
+    sdio_fn_camera,
+    sdio_fn_phs,
+    sdio_fn_wlan,
+    sdio_fn_ext = 0xf, /* Extended SDIO Standard Function (below) */
+};
+
+enum sdio_ext_stdfn_e {
+    sdio_ext_fn_none = 0,
+};
+
 typedef struct sd_card_s {
     void *opaque;
     int (*do_command)(void *opaque, struct sd_request_s *req,




--- End Message ---
_______________________________________________
commitlog mailing list
[email protected]
http://lists.openmoko.org/mailman/listinfo/commitlog

Reply via email to