summaryrefslogtreecommitdiff
path: root/wl1271/external_drivers/sdio/linux/SdioDrv.c
diff options
context:
space:
mode:
Diffstat (limited to 'wl1271/external_drivers/sdio/linux/SdioDrv.c')
-rw-r--r--wl1271/external_drivers/sdio/linux/SdioDrv.c131
1 files changed, 77 insertions, 54 deletions
diff --git a/wl1271/external_drivers/sdio/linux/SdioDrv.c b/wl1271/external_drivers/sdio/linux/SdioDrv.c
index e3c9b55..171c0a6 100644
--- a/wl1271/external_drivers/sdio/linux/SdioDrv.c
+++ b/wl1271/external_drivers/sdio/linux/SdioDrv.c
@@ -594,8 +594,71 @@ static void sdiodrv_free_resources(void)
int sdioDrv_InitHw(void)
{
+ int rc;
+ u32 status;
+#ifdef SDIO_1_BIT /* see also in SdioAdapter.c */
+ unsigned long clock_rate = 6000000;
+#else
+ unsigned long clock_rate = 24000000;
+#endif
+
+ printk(KERN_INFO "TIWLAN SDIO sdioDrv_InitHw()!!");
+
+ rc = sdioDrv_clk_enable();
+ if (rc) {
+ PERR("sdioDrv_InitHw : sdioDrv_clk_enable FAILED !!!\n");
+ goto err;
+ }
+
+ OMAP3430_mmc_reset();
+
+ //obc - init sequence p. 3600,3617
+ /* 1.8V */
+ OMAP_HSMMC_WRITE(CAPA, OMAP_HSMMC_READ(CAPA) | VS18);
+ OMAP_HSMMC_WRITE(HCTL, OMAP_HSMMC_READ(HCTL) | SDVS18);//SDVS fits p. 3650
+ /* clock gating */
+ OMAP_HSMMC_WRITE(SYSCONFIG, OMAP_HSMMC_READ(SYSCONFIG) | AUTOIDLE);
+
+ /* bus power */
+ OMAP_HSMMC_WRITE(HCTL, OMAP_HSMMC_READ(HCTL) | SDBP);//SDBP fits p. 3650
+ /* interrupts */
+ OMAP_HSMMC_WRITE(ISE, 0);
+ OMAP_HSMMC_WRITE(IE, IE_EN_MASK);
+
+ //p. 3601 suggests moving to the end
+ OMAP3430_mmc_set_clock(clock_rate, &g_drv);
+ printk("SDIO clock Configuration is now set to %dMhz\n",(int)clock_rate/1000000);
+
+ /* Bus width */
+#ifdef SDIO_1_BIT /* see also in SdioAdapter.c */
+ PDEBUG("%s() setting %d data lines\n",__FUNCTION__, 1);
+ OMAP_HSMMC_WRITE(HCTL, OMAP_HSMMC_READ(HCTL) & (ONE_BIT));
+#else
+ PDEBUG("%s() setting %d data lines\n",__FUNCTION__, 4);
+ OMAP_HSMMC_WRITE(HCTL, OMAP_HSMMC_READ(HCTL) | (1 << 1));//DTW 4 bits - p. 3650
+#endif
+
+ /* send the init sequence. 80 clocks of synchronization in the SDIO */
+ //doesn't match p. 3601,3617 - obc
+ OMAP_HSMMC_WRITE( CON, OMAP_HSMMC_READ(CON) | INIT_STREAM);
+ OMAP_HSMMC_SEND_COMMAND( 0, 0);
+ status = sdiodrv_poll_status(OMAP_HSMMC_STAT, CC, MMC_TIMEOUT_MS);
+ if (!(status & CC)) {
+ PERR("sdioDrv_InitHw() SDIO Command error status = 0x%x\n", status);
+ rc = status;
+ goto err;
+ }
+ OMAP_HSMMC_WRITE(CON, OMAP_HSMMC_READ(CON) & ~INIT_STREAM);
+
return 0;
-} /* sdioDrv_InitHw */
+
+err:
+ /* Disabling clocks for now */
+ sdioDrv_clk_disable();
+
+ return rc;
+
+} /* sdiodrv_InitHw */
void sdiodrv_shutdown(void)
{
@@ -1070,12 +1133,6 @@ int sdioDrv_WriteSyncBytes (unsigned int uFunc,
static int sdioDrv_probe(struct platform_device *pdev)
{
int rc;
- u32 status;
-#ifdef SDIO_1_BIT /* see also in SdioAdapter.c */
- unsigned long clock_rate = 6000000;
-#else
- unsigned long clock_rate = 24000000;
-#endif
printk(KERN_INFO "TIWLAN SDIO probe: initializing mmc%d device\n", pdev->id + 1);
@@ -1087,7 +1144,7 @@ static int sdioDrv_probe(struct platform_device *pdev)
rc= request_irq(OMAP_MMC_IRQ, sdiodrv_irq, 0, SDIO_DRIVER_NAME, &g_drv);
if (rc != 0) {
- PERR("sdioDrv_InitHw() - request_irq FAILED!!\n");
+ PERR("sdioDrv_probe() - request_irq FAILED!!\n");
return rc;
}
sdiodrv_irq_requested = 1;
@@ -1120,54 +1177,20 @@ static int sdioDrv_probe(struct platform_device *pdev)
}
sdiodrv_iclk_got = 1;
- rc = sdioDrv_clk_enable();
- if (rc) {
- PERR("sdioDrv_probe : clk_enable FAILED !!!\n");
- goto err;
+ printk("Configuring SDIO DMA registers!!!\n");
+ printk("pdev->id is %d!!!\n", pdev->id);
+ if ( pdev->id == 1 ) {
+ /* MMC2 */
+ TIWLAN_MMC_CONTROLLER_BASE_ADDR = OMAP_HSMMC2_BASE;
+ TIWLAN_MMC_DMA_TX = OMAP24XX_DMA_MMC2_TX;
+ TIWLAN_MMC_DMA_RX = OMAP24XX_DMA_MMC2_RX;
}
-
- OMAP3430_mmc_reset();
-
- //obc - init sequence p. 3600,3617
- /* 1.8V */
- OMAP_HSMMC_WRITE(CAPA, OMAP_HSMMC_READ(CAPA) | VS18);
- OMAP_HSMMC_WRITE(HCTL, OMAP_HSMMC_READ(HCTL) | SDVS18);//SDVS fits p. 3650
- /* clock gating */
- OMAP_HSMMC_WRITE(SYSCONFIG, OMAP_HSMMC_READ(SYSCONFIG) | AUTOIDLE);
-
- /* bus power */
- OMAP_HSMMC_WRITE(HCTL, OMAP_HSMMC_READ(HCTL) | SDBP);//SDBP fits p. 3650
- /* interrupts */
- OMAP_HSMMC_WRITE(ISE, 0);
- OMAP_HSMMC_WRITE(IE, IE_EN_MASK);
-
- //p. 3601 suggests moving to the end
- OMAP3430_mmc_set_clock(clock_rate, &g_drv);
- printk(KERN_INFO "SDIO clock Configuration is now set to %dMhz\n",(int)clock_rate/1000000);
-
- /* Bus width */
-#ifdef SDIO_1_BIT /* see also in SdioAdapter.c */
- PDEBUG("%s() setting %d data lines\n",__FUNCTION__, 1);
- OMAP_HSMMC_WRITE(HCTL, OMAP_HSMMC_READ(HCTL) & (ONE_BIT));
-#else
- PDEBUG("%s() setting %d data lines\n",__FUNCTION__, 4);
- OMAP_HSMMC_WRITE(HCTL, OMAP_HSMMC_READ(HCTL) | (1 << 1));//DTW 4 bits - p. 3650
-#endif
-
- /* send the init sequence. 80 clocks of synchronization in the SDIO */
- //doesn't match p. 3601,3617 - obc
- OMAP_HSMMC_WRITE( CON, OMAP_HSMMC_READ(CON) | INIT_STREAM);
- OMAP_HSMMC_SEND_COMMAND( 0, 0);
- status = sdiodrv_poll_status(OMAP_HSMMC_STAT, CC, MMC_TIMEOUT_MS);
- if (!(status & CC)) {
- PERR("sdioDrv_InitHw() SDIO Command error status = 0x%x\n", status);
- rc = -1;
- goto err;
+ else if ( pdev->id == 2 ) {
+ /* MMC3 */
+ TIWLAN_MMC_CONTROLLER_BASE_ADDR = OMAP_HSMMC3_BASE;
+ TIWLAN_MMC_DMA_TX = OMAP34XX_DMA_MMC3_TX;
+ TIWLAN_MMC_DMA_RX = OMAP34XX_DMA_MMC3_RX;
}
- OMAP_HSMMC_WRITE(CON, OMAP_HSMMC_READ(CON) & ~INIT_STREAM);
-
- /* Disabling clocks for now */
- sdioDrv_clk_disable();
/* inactivity timer initialization*/
init_timer(&g_drv.inact_timer);