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, >a01_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