summaryrefslogtreecommitdiff
path: root/wl1271/external_drivers
diff options
context:
space:
mode:
Diffstat (limited to 'wl1271/external_drivers')
-rw-r--r--wl1271/external_drivers/sdio/linux/SdioDrv.c (renamed from wl1271/external_drivers/zoom2/Linux/sdio/SdioDrv.c)667
-rw-r--r--wl1271/external_drivers/sdio/linux/SdioDrv.h (renamed from wl1271/external_drivers/zoom2/Linux/sdio/SdioDrv.h)2
-rw-r--r--wl1271/external_drivers/sdio/linux/SdioDrvDbg.h (renamed from wl1271/external_drivers/zoom2/Linux/sdio/SdioDrvDbg.h)0
-rw-r--r--wl1271/external_drivers/zoom2/Linux/sdio/Makefile55
4 files changed, 358 insertions, 366 deletions
diff --git a/wl1271/external_drivers/zoom2/Linux/sdio/SdioDrv.c b/wl1271/external_drivers/sdio/linux/SdioDrv.c
index a8cb514e..8797d4e4 100644
--- a/wl1271/external_drivers/zoom2/Linux/sdio/SdioDrv.c
+++ b/wl1271/external_drivers/sdio/linux/SdioDrv.c
@@ -33,32 +33,54 @@
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/version.h>
#include <linux/moduleparam.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/slab.h>
-#include <mach/io.h>
#include <linux/types.h>
#include <linux/dma-mapping.h>
-#include <mach/hardware.h>
#include <linux/platform_device.h>
-#include <mach/hardware.h>
#include <linux/i2c/twl4030.h>
-#include <mach/board.h>
#include <linux/errno.h>
#include <linux/clk.h>
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 31))
+#include <plat/hardware.h>
+#include <plat/board.h>
+#include <plat/clock.h>
+#include <plat/dma.h>
+#include <plat/io.h>
+#include <plat/resource.h>
+#define IO_ADDRESS(pa) OMAP2_L4_IO_ADDRESS(pa)
+#else
+#include <mach/hardware.h>
+#include <mach/board.h>
#include <mach/clock.h>
#include <mach/dma.h>
#include <mach/io.h>
#include <mach/resource.h>
-typedef void* TI_HANDLE;
+#endif
+typedef void *TI_HANDLE;
#include "host_platform.h"
#include "SdioDrvDbg.h"
#include "SdioDrv.h"
-#define TIWLAN_MMC_CONTROLLER 3
-#define TIWLAN_MMC_CONTROLLER_BASE_ADDR OMAP_HSMMC3_BASE
-#define TIWLAN_MMC_CONTROLLER_BASE_SIZE 512
+/* #define TI_SDIO_DEBUG */
+
+#ifndef CONFIG_MMC_EMBEDDED_SDIO
+
+#define SDIOWQ_NAME "sdio_wq"
+
+/*
+ * HSMMC Address and DMA Settings
+ */
+static unsigned long TIWLAN_MMC_CONTROLLER = 2; /* MMC3 */
+static unsigned long TIWLAN_MMC_CONTROLLER_BASE_ADDR = OMAP_HSMMC3_BASE;
+#define TIWLAN_MMC_CONTROLLER_BASE_SIZE 512
+#define TIWLAN_MMC_MAX_DMA 8192
+static unsigned long TIWLAN_MMC_DMA_TX = OMAP34XX_DMA_MMC3_TX;
+static unsigned long TIWLAN_MMC_DMA_RX = OMAP34XX_DMA_MMC3_RX;
+static unsigned long OMAP_MMC_IRQ = INT_MMC3_IRQ;
#define OMAP_MMC_MASTER_CLOCK 96000000
/*
@@ -97,72 +119,70 @@ typedef void* TI_HANDLE;
#define SDVSDET 0x00000400
#define SIDLE_MODE (0x2 << 3)
#define AUTOIDLE 0x1
-#define SDBP (1 << 8)
-#define DTO 0xE
-#define ICE 0x1
-#define ICS 0x2
-#define CEN (1 << 2)
-#define CLKD_MASK 0x0000FFC0
-#define IE_EN_MASK 0x317F0137
-#define INIT_STREAM (1 << 1)
-#define DP_SELECT (1 << 21)
-#define DDIR (1 << 4)
-#define DMA_EN 0x1
+#define SDBP (1 << 8)
+#define DTO 0xE
+#define ICE 0x1
+#define ICS 0x2
+#define CEN (1 << 2)
+#define CLKD_MASK 0x0000FFC0
+#define IE_EN_MASK 0x317F0137
+#define INIT_STREAM (1 << 1)
+#define DP_SELECT (1 << 21)
+#define DDIR (1 << 4)
+#define DMA_EN 0x1
#define MSBS (1 << 5)
-#define BCE (1 << 1)
+#define BCE (1 << 1)
#define ONE_BIT (~(0x2))
-#define EIGHT_BIT (~(0x20))
-#define CC 0x1
-#define TC 0x02
-#define OD 0x1
-#define BRW 0x400
-#define BRR 0x800
-#define BRE (1 << 11)
-#define BWE (1 << 10)
-#define SBGR (1 << 16)
-#define CT (1 << 17)
-#define SDIO_READ (1 << 31)
-#define SDIO_BLKMODE (1 << 27)
+#define EIGHT_BIT (~(0x20))
+#define CC 0x1
+#define TC 0x02
+#define OD 0x1
+#define BRW 0x400
+#define BRR 0x800
+#define BRE (1 << 11)
+#define BWE (1 << 10)
+#define SBGR (1 << 16)
+#define CT (1 << 17)
+#define SDIO_READ (1 << 31)
+#define SDIO_BLKMODE (1 << 27)
#define OMAP_HSMMC_ERR (1 << 15) /* Any error */
#define OMAP_HSMMC_CMD_TIMEOUT (1 << 16) /* Com mand response time-out */
#define OMAP_HSMMC_DATA_TIMEOUT (1 << 20) /* Data response time-out */
#define OMAP_HSMMC_CMD_CRC (1 << 17) /* Command CRC error */
#define OMAP_HSMMC_DATA_CRC (1 << 21) /* Date CRC error */
#define OMAP_HSMMC_CARD_ERR (1 << 28) /* Card ERR */
-#define OMAP_HSMMC_STAT_CLEAR 0xFFFFFFFF
-#define INIT_STREAM_CMD 0x00000000
-#define INT_CLEAR 0x00000000
-#define BLK_CLEAR 0x00000000
+#define OMAP_HSMMC_STAT_CLEAR 0xFFFFFFFF
+#define INIT_STREAM_CMD 0x00000000
+#define INT_CLEAR 0x00000000
+#define BLK_CLEAR 0x00000000
/* SCM CONTROL_DEVCONF1 MMC1 overwrite but */
-#define MMC1_ACTIVE_OVERWRITE (1 << 31)
-
-#define sdio_blkmode_regaddr 0x2000
-#define sdio_blkmode_mask 0xFF00
-
-#define IO_RW_DIRECT_MASK 0xF000FF00
-#define IO_RW_DIRECT_ARG_MASK 0x80001A00
-
-#define RMASK (MMC_RSP_MASK | MMC_RSP_CRC)
+#define MMC1_ACTIVE_OVERWRITE (1 << 31)
+
+#define sdio_blkmode_regaddr 0x2000
+#define sdio_blkmode_mask 0xFF00
+
+#define IO_RW_DIRECT_MASK 0xF000FF00
+#define IO_RW_DIRECT_ARG_MASK 0x80001A00
+
+#define RMASK (MMC_RSP_MASK | MMC_RSP_CRC)
#define MMC_TIMEOUT_MS 100 /*on the new 2430 it was 20, i changed back to 100*//* obc */
-#define MMCA_VSN_4 4
-
-#define VMMC1_DEV_GRP 0x27
-#define P1_DEV_GRP 0x20
-#define VMMC1_DEDICATED 0x2A
-#define VSEL_3V 0x02
-#define VSEL_18V 0x00
-#define PBIAS_3V 0x03
-#define PBIAS_18V 0x02
-#define PBIAS_LITE 0x04A0
-#define PBIAS_CLR 0x00
+#define MMCA_VSN_4 4
+
+#define VMMC1_DEV_GRP 0x27
+#define P1_DEV_GRP 0x20
+#define VMMC1_DEDICATED 0x2A
+#define VSEL_3V 0x02
+#define VSEL_18V 0x00
+#define PBIAS_3V 0x03
+#define PBIAS_18V 0x02
+#define PBIAS_LITE 0x04A0
+#define PBIAS_CLR 0x00
#define OMAP_MMC_REGS_BASE IO_ADDRESS(TIWLAN_MMC_CONTROLLER_BASE_ADDR)
-#define INT_MMC3_IRQ 94
-#define OMAP_MMC_IRQ INT_MMC3_IRQ
-/*
+/*
* MMC Host controller read/write API's.
*/
#define OMAP_HSMMC_READ_OFFSET(offset) (__raw_readl((OMAP_MMC_REGS_BASE) + (offset)))
@@ -188,7 +208,7 @@ typedef void* TI_HANDLE;
#define SDIO_CMD53_READ(v1,v2,v3,v4,v5,v6) (SDIO_RWFLAG(v1)|SDIO_FUNCN(v2)|SDIO_BLKM(v3)| SDIO_OPCODE(v4)|SDIO_ADDRREG(v5)|(v6&0x1ff))
#define SDIO_CMD53_WRITE(v1,v2,v3,v4,v5,v6) (SDIO_RWFLAG(v1)|SDIO_FUNCN(v2)|SDIO_BLKM(v3)| SDIO_OPCODE(v4)|SDIO_ADDRREG(v5)|(v6&0x1ff))
-#define SDIODRV_MAX_LOOPS 50000
+#define SDIODRV_MAX_LOOPS 50000
#define VMMC2_DEV_GRP 0x2B
#define VMMC2_DEDICATED 0x2E
@@ -201,15 +221,14 @@ typedef void* TI_HANDLE;
#define VSIM_DEDICATED 0x3A
#define TWL4030_MODULE_PM_RECIEVER 0x13
-
typedef struct OMAP3430_sdiodrv
{
struct clk *fclk, *iclk, *dbclk;
int ifclks_enabled;
- spinlock_t clk_lock;
+ spinlock_t clk_lock;
int dma_tx_channel;
int dma_rx_channel;
- int irq;
+ int irq;
void (*BusTxnCB)(void* BusTxnHandle, int status);
void* BusTxnHandle;
unsigned int uBlkSize;
@@ -222,7 +241,8 @@ typedef struct OMAP3430_sdiodrv
size_t dma_read_size;
dma_addr_t dma_write_addr;
size_t dma_write_size;
- struct workqueue_struct *pWorkQueue;
+ struct workqueue_struct *sdio_wq; /* Work Queue */
+ struct work_struct sdiodrv_work;
} OMAP3430_sdiodrv_t;
struct omap_hsmmc_regs {
@@ -236,18 +256,23 @@ struct omap_hsmmc_regs {
};
static struct omap_hsmmc_regs hsmmc_ctx;
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 31))
+static struct platform_device dummy_pdev = {
+ .dev = {
+ .bus = &platform_bus_type,
+ },
+};
+#endif
+
#define SDIO_DRIVER_NAME "TIWLAN_SDIO"
-#define SDIO_DRV_WK_NAME "ti_sdio_drv"
module_param(g_sdio_debug_level, int, 0644);
MODULE_PARM_DESC(g_sdio_debug_level, "debug level");
int g_sdio_debug_level = SDIO_DEBUGLEVEL_ERR;
-EXPORT_SYMBOL( g_sdio_debug_level);
+EXPORT_SYMBOL(g_sdio_debug_level);
OMAP3430_sdiodrv_t g_drv;
-struct work_struct sdiodrv_work;
-
static int sdiodrv_irq_requested = 0;
static int sdiodrv_iclk_got = 0;
static int sdiodrv_fclk_got = 0;
@@ -256,18 +281,39 @@ static void sdioDrv_hsmmc_save_ctx(void);
static void sdioDrv_hsmmc_restore_ctx(void);
static void sdiodrv_dma_shutdown(void);
+#ifndef TI_SDIO_STANDALONE
+void sdio_init( int sdcnum )
+{
+ if( sdcnum <= 0 )
+ return;
+ TIWLAN_MMC_CONTROLLER = sdcnum - 1;
+ if( sdcnum == 2 ) {
+ TIWLAN_MMC_CONTROLLER_BASE_ADDR = OMAP_HSMMC2_BASE;
+ TIWLAN_MMC_DMA_TX = OMAP24XX_DMA_MMC2_TX;
+ TIWLAN_MMC_DMA_RX = OMAP24XX_DMA_MMC2_RX;
+ OMAP_MMC_IRQ = INT_MMC2_IRQ;
+ }
+ else if( sdcnum == 3 ) {
+ 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_MMC_IRQ = INT_MMC3_IRQ;
+ }
+}
+#endif
+
static void sdioDrv_hsmmc_save_ctx(void)
{
- /* MMC : context save */
- hsmmc_ctx.hctl = OMAP_HSMMC_READ(HCTL);
- hsmmc_ctx.capa = OMAP_HSMMC_READ(CAPA);
- hsmmc_ctx.sysconfig = OMAP_HSMMC_READ(SYSCONFIG);
- hsmmc_ctx.ise = OMAP_HSMMC_READ(ISE);
- hsmmc_ctx.ie = OMAP_HSMMC_READ(IE);
- hsmmc_ctx.con = OMAP_HSMMC_READ(CON);
- hsmmc_ctx.sysctl = OMAP_HSMMC_READ(SYSCTL);
- OMAP_HSMMC_WRITE(ISE, 0);
- OMAP_HSMMC_WRITE(IE, 0);
+ /* MMC : context save */
+ hsmmc_ctx.hctl = OMAP_HSMMC_READ(HCTL);
+ hsmmc_ctx.capa = OMAP_HSMMC_READ(CAPA);
+ hsmmc_ctx.sysconfig = OMAP_HSMMC_READ(SYSCONFIG);
+ hsmmc_ctx.ise = OMAP_HSMMC_READ(ISE);
+ hsmmc_ctx.ie = OMAP_HSMMC_READ(IE);
+ hsmmc_ctx.con = OMAP_HSMMC_READ(CON);
+ hsmmc_ctx.sysctl = OMAP_HSMMC_READ(SYSCTL);
+ OMAP_HSMMC_WRITE(ISE, 0);
+ OMAP_HSMMC_WRITE(IE, 0);
}
static void sdioDrv_hsmmc_restore_ctx(void)
@@ -316,31 +362,17 @@ irqreturn_t sdiodrv_irq(int irq, void *drv)
if (g_drv.async_status) {
PERR("sdiodrv_irq: ERROR in STAT = 0x%x\n", status);
}
-
- status = queue_work (g_drv.pWorkQueue, &sdiodrv_work);
- if (!status)
- {
- printk("\n***Error sdiodrv_irq: failed to enqueue work,status = %d\n", status);
- }
-
+ queue_work(g_drv.sdio_wq, &g_drv.sdiodrv_work);
return IRQ_HANDLED;
}
void sdiodrv_dma_read_cb(int lch, u16 ch_status, void *data)
{
- int status;
-
PDEBUG("sdiodrv_dma_read_cb() channel=%d status=0x%x\n", lch, (int)ch_status);
g_drv.async_status = ch_status & (1 << 7);
- status = queue_work (g_drv.pWorkQueue, &sdiodrv_work);
-
- if (! status )
- {
- printk("\n***Error sdiodrv_dma_read_cb: failed to enqueue work ,status = %d\n", status);
- }
-
+ queue_work(g_drv.sdio_wq, &g_drv.sdiodrv_work);
sdiodrv_dma_shutdown();
}
@@ -353,27 +385,27 @@ int sdiodrv_dma_init(void)
{
int rc;
- rc = omap_request_dma(OMAP34XX_DMA_MMC3_TX, "SDIO WRITE", sdiodrv_dma_write_cb, &g_drv, &g_drv.dma_tx_channel);
+ rc = omap_request_dma(TIWLAN_MMC_DMA_TX, "SDIO WRITE", sdiodrv_dma_write_cb, &g_drv, &g_drv.dma_tx_channel);
if (rc != 0) {
- PERR("sdiodrv_dma_init() omap_request_dma(OMAP34XX_DMA_MMC2_TX) FAILED\n");
+ PERR("sdiodrv_dma_init() omap_request_dma(TIWLAN_MMC_DMA_TX) FAILED\n");
goto out;
}
- rc = omap_request_dma(OMAP34XX_DMA_MMC3_RX, "SDIO READ", sdiodrv_dma_read_cb, &g_drv, &g_drv.dma_rx_channel);
+ rc = omap_request_dma(TIWLAN_MMC_DMA_RX, "SDIO READ", sdiodrv_dma_read_cb, &g_drv, &g_drv.dma_rx_channel);
if (rc != 0) {
- PERR("sdiodrv_dma_init() omap_request_dma(OMAP24XX_DMA_MMC2_RX) FAILED\n");
+ PERR("sdiodrv_dma_init() omap_request_dma(TIWLAN_MMC_DMA_RX) FAILED\n");
goto freetx;
}
omap_set_dma_src_params(g_drv.dma_rx_channel,
0, // src_port is only for OMAP1
OMAP_DMA_AMODE_CONSTANT,
- (OMAP_HSMMC3_BASE) + OMAP_HSMMC_DATA, 0, 0);
+ (TIWLAN_MMC_CONTROLLER_BASE_ADDR) + OMAP_HSMMC_DATA, 0, 0);
omap_set_dma_dest_params(g_drv.dma_tx_channel,
0, // dest_port is only for OMAP1
OMAP_DMA_AMODE_CONSTANT,
- (OMAP_HSMMC3_BASE) + OMAP_HSMMC_DATA, 0, 0);
+ (TIWLAN_MMC_CONTROLLER_BASE_ADDR) + OMAP_HSMMC_DATA, 0, 0);
return 0;
@@ -385,20 +417,20 @@ out:
static void sdiodrv_dma_shutdown(void)
{
- omap_free_dma(g_drv.dma_tx_channel);
- omap_free_dma(g_drv.dma_rx_channel);
+ omap_free_dma(g_drv.dma_tx_channel);
+ omap_free_dma(g_drv.dma_rx_channel);
} /* sdiodrv_dma_shutdown() */
static u32 sdiodrv_poll_status(u32 reg_offset, u32 stat, unsigned int msecs)
{
- u32 status=0, loops=0;
+ u32 status=0, loops=0;
do
{
- status=OMAP_HSMMC_READ_OFFSET(reg_offset);
- if(( status & stat))
+ status = OMAP_HSMMC_READ_OFFSET(reg_offset);
+ if(( status & stat))
{
- break;
+ break;
}
} while (loops++ < SDIODRV_MAX_LOOPS);
@@ -439,7 +471,6 @@ static int sdiodrv_send_command(u32 cmdreg, u32 cmdarg)
OMAP_HSMMC_SEND_COMMAND(cmdreg, cmdarg);
return sdiodrv_poll_status(OMAP_HSMMC_STAT, CC, MMC_TIMEOUT_MS);
-
} /* sdiodrv_send_command() */
/*
@@ -449,9 +480,9 @@ static void OMAP3430_mmc_stop_clock(void)
{
OMAP_HSMMC_WRITE(SYSCTL, OMAP_HSMMC_READ(SYSCTL) & ~CEN);
if ((OMAP_HSMMC_READ(SYSCTL) & CEN) != 0x0)
- {
+ {
PERR("MMC clock not stoped, clock freq can not be altered\n");
- }
+ }
} /* OMAP3430_mmc_stop_clock */
/*
@@ -501,7 +532,7 @@ static void OMAP3430_mmc_set_clock(unsigned int clock, OMAP3430_sdiodrv_t *host)
OMAP_HSMMC_WRITE(SYSCTL, regVal);
OMAP_HSMMC_WRITE(SYSCTL, OMAP_HSMMC_READ(SYSCTL) | ICE);//internal clock enable. obc not mentioned in the spec
/*
- * wait till the the clock is stable (ICS) bit is set
+ * wait till the the clock is stable (ICS) bit is set
*/
status = sdiodrv_poll_status(OMAP_HSMMC_SYSCTL, ICS, MMC_TIMEOUT_MS);
if(!(status & ICS)) {
@@ -531,7 +562,7 @@ static void sdiodrv_free_resources(void)
}
if (sdiodrv_irq_requested) {
- free_irq(g_drv.irq, &g_drv);
+ free_irq(OMAP_MMC_IRQ, &g_drv);
sdiodrv_irq_requested = 0;
}
}
@@ -539,7 +570,7 @@ static void sdiodrv_free_resources(void)
int sdioDrv_InitHw(void)
{
return 0;
-} /* sdiodrv_init */
+} /* sdioDrv_InitHw */
void sdiodrv_shutdown(void)
{
@@ -552,11 +583,11 @@ void sdiodrv_shutdown(void)
static int sdiodrv_send_data_xfer_commad(u32 cmd, u32 cmdarg, int length, u32 buffer_enable_status, unsigned int bBlkMode)
{
- int status;
+ int status;
PDEBUG("%s() writing CMD 0x%x ARG 0x%x\n",__FUNCTION__, cmd, cmdarg);
- /* block mode */
+ /* block mode */
if(bBlkMode) {
/*
* Bits 31:16 of BLK reg: NBLK Blocks count for current transfer.
@@ -573,32 +604,32 @@ static int sdiodrv_send_data_xfer_commad(u32 cmd, u32 cmdarg, int length, u32 bu
*/
cmd |= MSBS | BCE ;
} else {
- OMAP_HSMMC_WRITE(BLK, length);
- }
+ OMAP_HSMMC_WRITE(BLK, length);
+ }
- status = sdiodrv_send_command(cmd, cmdarg);
+ status = sdiodrv_send_command(cmd, cmdarg);
if(!(status & CC)) {
- PERR("sdiodrv_send_data_xfer_commad() SDIO Command error! STAT = 0x%x\n", status);
- return 0;
+ PERR("sdiodrv_send_data_xfer_commad() SDIO Command error! STAT = 0x%x\n", status);
+ return 0;
}
PDEBUG("%s() length = %d(%dw) BLK = 0x%x\n",
__FUNCTION__, length,((length + 3) >> 2), OMAP_HSMMC_READ(BLK));
- return sdiodrv_poll_status(OMAP_HSMMC_PSTATE, buffer_enable_status, MMC_TIMEOUT_MS);
+ return sdiodrv_poll_status(OMAP_HSMMC_PSTATE, buffer_enable_status, MMC_TIMEOUT_MS);
} /* sdiodrv_send_data_xfer_commad() */
int sdiodrv_data_xfer_sync(u32 cmd, u32 cmdarg, void *data, int length, u32 buffer_enable_status)
{
- u32 buf_start, buf_end, data32;
+ u32 buf_start, buf_end, data32;
int status;
- status = sdiodrv_send_data_xfer_commad(cmd, cmdarg, length, buffer_enable_status, 0);
+ status = sdiodrv_send_data_xfer_commad(cmd, cmdarg, length, buffer_enable_status, 0);
if(!(status & buffer_enable_status))
- {
- PERR("sdiodrv_data_xfer_sync() buffer disabled! length = %d BLK = 0x%x PSTATE = 0x%x\n",
+ {
+ PERR("sdiodrv_data_xfer_sync() buffer disabled! length = %d BLK = 0x%x PSTATE = 0x%x\n",
length, OMAP_HSMMC_READ(BLK), status);
- return -1;
+ return -1;
}
buf_end = (u32)data+(u32)length;
@@ -615,7 +646,7 @@ int sdiodrv_data_xfer_sync(u32 cmd, u32 cmdarg, void *data, int length, u32 buff
*((unsigned long*)(data)) = OMAP_HSMMC_READ(DATA);
}
}
- else /* 2 bytes aligned */
+ else /* 2 bytes aligned */
{
for (buf_start = (u32)data; (u32)data < buf_end; data += sizeof(unsigned long))
{
@@ -649,22 +680,14 @@ int sdiodrv_data_xfer_sync(u32 cmd, u32 cmdarg, void *data, int length, u32 buff
status = sdiodrv_poll_status(OMAP_HSMMC_STAT, TC, MMC_TIMEOUT_MS);
if(!(status & TC))
{
- PERR("sdiodrv_data_xfer_sync() transfer error! STAT = 0x%x\n", status);
- return -1;
+ PERR("sdiodrv_data_xfer_sync() transfer error! STAT = 0x%x\n", status);
+ return -1;
}
return 0;
} /* sdiodrv_data_xfer_sync() */
-/*--------------------------------------------------------------------------------------*/
-
-/********************************************************************/
-/* SDIO driver interface functions */
-/********************************************************************/
-
-/*--------------------------------------------------------------------------------------*/
-
int sdioDrv_ConnectBus (void * fCbFunc,
void * hCbArg,
unsigned int uBlkSizeShift,
@@ -675,12 +698,11 @@ int sdioDrv_ConnectBus (void * fCbFunc,
g_drv.uBlkSizeShift = uBlkSizeShift;
g_drv.uBlkSize = 1 << uBlkSizeShift;
- INIT_WORK(&sdiodrv_work, sdiodrv_task);
+ INIT_WORK(&g_drv.sdiodrv_work, sdiodrv_task);
return sdioDrv_InitHw ();
}
-
/*--------------------------------------------------------------------------------------*/
int sdioDrv_DisconnectBus (void)
@@ -703,6 +725,8 @@ int sdioDrv_ExecuteCmd (unsigned int uCmd,
PDEBUG("sdioDrv_ExecuteCmd() starting cmd %02x arg %08x\n", (int)uCmd, (int)uArg);
+ sdioDrv_clk_enable(); /* To make sure we have clocks enable */
+
uCmdReg = (uCmd << 24) | (uRespType << 16) ;
uStatus = sdiodrv_send_command(uCmdReg, uArg);
@@ -714,11 +738,10 @@ int sdioDrv_ExecuteCmd (unsigned int uCmd,
}
if ((uLen > 0) && (uLen <= 4))/*obc - Len > 4 ? shouldn't read anything ? */
{
- uResponse = OMAP_HSMMC_READ(RSP10);
+ uResponse = OMAP_HSMMC_READ(RSP10);
memcpy (pResponse, (char *)&uResponse, uLen);
PDEBUG("sdioDrv_ExecuteCmd() response = 0x%x\n", uResponse);
}
-
return 0;
}
@@ -735,15 +758,22 @@ int sdioDrv_ReadSync (unsigned int uFunc,
int iStatus;
// printk(KERN_INFO "in sdioDrv_ReadSync\n");
-
uCmdArg = SDIO_CMD53_READ(0, uFunc, 0, bIncAddr, uHwAddr, uLen);
iStatus = sdiodrv_data_xfer_sync(OMAP_HSMMC_CMD53_READ, uCmdArg, pData, uLen, BRE);
- if (iStatus != 0)
- {
+ if (iStatus != 0) {
PERR("sdioDrv_ReadSync() FAILED!!\n");
}
-
+#ifdef TI_SDIO_DEBUG
+ if (uLen == 1)
+ printk(KERN_INFO "R53: [0x%x](%u) = 0x%x\n", uHwAddr, uLen, (unsigned)(*(char *)pData));
+ else if (uLen == 2)
+ printk(KERN_INFO "R53: [0x%x](%u) = 0x%x\n", uHwAddr, uLen, (unsigned)(*(short *)pData));
+ else if (uLen == 4)
+ printk(KERN_INFO "R53: [0x%x](%u) = 0x%x\n", uHwAddr, uLen, (unsigned)(*(long *)pData));
+ else
+ printk(KERN_INFO "R53: [0x%x](%u)\n", uHwAddr, uLen);
+#endif
return iStatus;
}
@@ -763,33 +793,37 @@ int sdioDrv_ReadAsync (unsigned int uFunc,
unsigned int uNumOfElem;
dma_addr_t dma_bus_address;
- //printk(KERN_INFO "in sdioDrv_ReadAsync\n");
-
- if (bBlkMode)
- {
- /* For block mode use number of blocks instead of length in bytes */
- uNumBlks = uLen >> g_drv.uBlkSizeShift;
- uDmaBlockCount = uNumBlks;
- /* due to the DMA config to 32Bit per element (OMAP_DMA_DATA_TYPE_S32) the division is by 4 */
- uNumOfElem = g_drv.uBlkSize >> 2;
- }
- else
- {
- uNumBlks = uLen;
- uDmaBlockCount = 1;
- uNumOfElem = (uLen + 3) >> 2;
- }
+#ifdef TI_SDIO_DEBUG
+ printk(KERN_INFO "R53: [0x%x](%u) F[%d]\n", uHwAddr, uLen, uFunc);
+#endif
- uCmdArg = SDIO_CMD53_READ(0, uFunc, bBlkMode, bIncAddr, uHwAddr, uNumBlks);
+ //printk(KERN_INFO "in sdioDrv_ReadAsync\n");
- iStatus = sdiodrv_send_data_xfer_commad(OMAP_HSMMC_CMD53_READ_DMA, uCmdArg, uNumBlks, BRE, bBlkMode);
-
- if (!(iStatus & BRE))
- {
- PERR("sdioDrv_ReadAsync() buffer disabled! length = %d BLK = 0x%x PSTATE = 0x%x, BlkMode = %d\n",
- uLen, OMAP_HSMMC_READ(BLK), iStatus, bBlkMode);
- return -1;
- }
+ if (bBlkMode)
+ {
+ /* For block mode use number of blocks instead of length in bytes */
+ uNumBlks = uLen >> g_drv.uBlkSizeShift;
+ uDmaBlockCount = uNumBlks;
+ /* due to the DMA config to 32Bit per element (OMAP_DMA_DATA_TYPE_S32) the division is by 4 */
+ uNumOfElem = g_drv.uBlkSize >> 2;
+ }
+ else
+ {
+ uNumBlks = uLen;
+ uDmaBlockCount = 1;
+ uNumOfElem = (uLen + 3) >> 2;
+ }
+
+ uCmdArg = SDIO_CMD53_READ(0, uFunc, bBlkMode, bIncAddr, uHwAddr, uNumBlks);
+
+ iStatus = sdiodrv_send_data_xfer_commad(OMAP_HSMMC_CMD53_READ_DMA, uCmdArg, uNumBlks, BRE, bBlkMode);
+
+ if (!(iStatus & BRE))
+ {
+ PERR("sdioDrv_ReadAsync() buffer disabled! length = %d BLK = 0x%x PSTATE = 0x%x, BlkMode = %d\n",
+ uLen, OMAP_HSMMC_READ(BLK), iStatus, bBlkMode);
+ goto err;
+ }
sdiodrv_dma_init();
@@ -798,7 +832,7 @@ int sdioDrv_ReadAsync (unsigned int uFunc,
dma_bus_address = dma_map_single(g_drv.dev, pData, uLen, DMA_FROM_DEVICE);
if (!dma_bus_address) {
PERR("sdioDrv_ReadAsync: dma_map_single failed\n");
- return -1;
+ goto err;
}
if (g_drv.dma_read_addr != 0) {
@@ -809,18 +843,24 @@ int sdioDrv_ReadAsync (unsigned int uFunc,
g_drv.dma_read_addr = dma_bus_address;
g_drv.dma_read_size = uLen;
- omap_set_dma_dest_params(g_drv.dma_rx_channel,
- 0, // dest_port is only for OMAP1
- OMAP_DMA_AMODE_POST_INC,
- dma_bus_address,
- 0, 0);
+ omap_set_dma_dest_params (g_drv.dma_rx_channel,
+ 0, // dest_port is only for OMAP1
+ OMAP_DMA_AMODE_POST_INC,
+ dma_bus_address,
+ 0, 0);
- omap_set_dma_transfer_params(g_drv.dma_rx_channel, OMAP_DMA_DATA_TYPE_S32, uNumOfElem , uDmaBlockCount , OMAP_DMA_SYNC_FRAME, OMAP34XX_DMA_MMC3_RX, OMAP_DMA_SRC_SYNC);
+ omap_set_dma_transfer_params(g_drv.dma_rx_channel, OMAP_DMA_DATA_TYPE_S32, uNumOfElem , uDmaBlockCount , OMAP_DMA_SYNC_FRAME, TIWLAN_MMC_DMA_RX, OMAP_DMA_SRC_SYNC);
omap_start_dma(g_drv.dma_rx_channel);
/* Continued at sdiodrv_irq() after DMA transfer is finished */
+#ifdef TI_SDIO_DEBUG
+ printk(KERN_INFO "R53: [0x%x](%u) (A)\n", uHwAddr, uLen);
+#endif
return 0;
+err:
+ return -1;
+
}
@@ -835,6 +875,7 @@ int sdioDrv_WriteSync (unsigned int uFunc,
{
unsigned int uCmdArg;
int iStatus;
+
// printk(KERN_INFO "in sdioDrv_WriteSync\n");
uCmdArg = SDIO_CMD53_WRITE(1, uFunc, 0, bIncAddr, uHwAddr, uLen);
@@ -844,7 +885,16 @@ int sdioDrv_WriteSync (unsigned int uFunc,
{
PERR("sdioDrv_WriteSync() FAILED!!\n");
}
-
+#ifdef TI_SDIO_DEBUG
+ if (uLen == 1)
+ printk(KERN_INFO "W53: [0x%x](%u) < 0x%x\n", uHwAddr, uLen, (unsigned)(*(char *)pData));
+ else if (uLen == 2)
+ printk(KERN_INFO "W53: [0x%x](%u) < 0x%x\n", uHwAddr, uLen, (unsigned)(*(short *)pData));
+ else if (uLen == 4)
+ printk(KERN_INFO "W53: [0x%x](%u) < 0x%x\n", uHwAddr, uLen, (unsigned)(*(long *)pData));
+ else
+ printk(KERN_INFO "W53: [0x%x](%u)\n", uHwAddr, uLen);
+#endif
return iStatus;
}
@@ -864,32 +914,35 @@ int sdioDrv_WriteAsync (unsigned int uFunc,
unsigned int uNumOfElem;
dma_addr_t dma_bus_address;
-// printk(KERN_INFO "in sdioDrv_WriteAsync\n");
-
- if (bBlkMode)
- {
- /* For block mode use number of blocks instead of length in bytes */
- uNumBlks = uLen >> g_drv.uBlkSizeShift;
- uDmaBlockCount = uNumBlks;
- /* due to the DMA config to 32Bit per element (OMAP_DMA_DATA_TYPE_S32) the division is by 4 */
- uNumOfElem = g_drv.uBlkSize >> 2;
- }
- else
- {
- uNumBlks = uLen;
- uDmaBlockCount = 1;
- uNumOfElem = (uLen + 3) >> 2;
- }
-
- uCmdArg = SDIO_CMD53_WRITE(1, uFunc, bBlkMode, bIncAddr, uHwAddr, uNumBlks);
+#ifdef TI_SDIO_DEBUG
+ printk(KERN_INFO "W53: [0x%x](%u) F[%d] B[%d] I[%d]\n", uHwAddr, uLen, uFunc, bBlkMode, bIncAddr);
+#endif
- iStatus = sdiodrv_send_data_xfer_commad(OMAP_HSMMC_CMD53_WRITE_DMA, uCmdArg, uNumBlks, BWE, bBlkMode);
- if (!(iStatus & BWE))
- {
- PERR("sdioDrv_WriteAsync() buffer disabled! length = %d, BLK = 0x%x, Status = 0x%x\n",
- uLen, OMAP_HSMMC_READ(BLK), iStatus);
- return -1;
- }
+// printk(KERN_INFO "in sdioDrv_WriteAsync\n");
+ if (bBlkMode)
+ {
+ /* For block mode use number of blocks instead of length in bytes */
+ uNumBlks = uLen >> g_drv.uBlkSizeShift;
+ uDmaBlockCount = uNumBlks;
+ /* due to the DMA config to 32Bit per element (OMAP_DMA_DATA_TYPE_S32) the division is by 4 */
+ uNumOfElem = g_drv.uBlkSize >> 2;
+ }
+ else
+ {
+ uNumBlks = uLen;
+ uDmaBlockCount = 1;
+ uNumOfElem = (uLen + 3) >> 2;
+ }
+
+ uCmdArg = SDIO_CMD53_WRITE(1, uFunc, bBlkMode, bIncAddr, uHwAddr, uNumBlks);
+
+ iStatus = sdiodrv_send_data_xfer_commad(OMAP_HSMMC_CMD53_WRITE_DMA, uCmdArg, uNumBlks, BWE, bBlkMode);
+ if (!(iStatus & BWE))
+ {
+ PERR("sdioDrv_WriteAsync() buffer disabled! length = %d, BLK = 0x%x, Status = 0x%x\n",
+ uLen, OMAP_HSMMC_READ(BLK), iStatus);
+ goto err;
+ }
OMAP_HSMMC_WRITE(ISE, TC);
@@ -898,7 +951,7 @@ int sdioDrv_WriteAsync (unsigned int uFunc,
dma_bus_address = dma_map_single(g_drv.dev, pData, uLen, DMA_TO_DEVICE);
if (!dma_bus_address) {
PERR("sdioDrv_WriteAsync: dma_map_single failed\n");
- return -1;
+ goto err;
}
if (g_drv.dma_write_addr != 0) {
@@ -909,18 +962,20 @@ int sdioDrv_WriteAsync (unsigned int uFunc,
g_drv.dma_write_addr = dma_bus_address;
g_drv.dma_write_size = uLen;
- omap_set_dma_src_params(g_drv.dma_tx_channel,
- 0, // src_port is only for OMAP1
- OMAP_DMA_AMODE_POST_INC,
- dma_bus_address,
- 0, 0);
+ omap_set_dma_src_params (g_drv.dma_tx_channel,
+ 0, // src_port is only for OMAP1
+ OMAP_DMA_AMODE_POST_INC,
+ dma_bus_address,
+ 0, 0);
- omap_set_dma_transfer_params(g_drv.dma_tx_channel, OMAP_DMA_DATA_TYPE_S32, uNumOfElem, uDmaBlockCount, OMAP_DMA_SYNC_FRAME, OMAP34XX_DMA_MMC3_TX, OMAP_DMA_DST_SYNC);
+ omap_set_dma_transfer_params(g_drv.dma_tx_channel, OMAP_DMA_DATA_TYPE_S32, uNumOfElem, uDmaBlockCount, OMAP_DMA_SYNC_FRAME, TIWLAN_MMC_DMA_TX, OMAP_DMA_DST_SYNC);
omap_start_dma(g_drv.dma_tx_channel);
/* Continued at sdiodrv_irq() after DMA transfer is finished */
return 0;
+err:
+ return -1;
}
/*--------------------------------------------------------------------------------------*/
@@ -935,22 +990,21 @@ int sdioDrv_ReadSyncBytes (unsigned int uFunc,
unsigned int i;
int iStatus;
- for (i = 0; i < uLen; i++)
- {
+ for (i = 0; i < uLen; i++) {
uCmdArg = SDIO_CMD52_READ(0, uFunc, 0, uHwAddr);
iStatus = sdiodrv_send_command(OMAP_HSMMC_CMD52_READ, uCmdArg);
- if (!(iStatus & CC))
- {
+ if (!(iStatus & CC)) {
PERR("sdioDrv_ReadSyncBytes() SDIO Command error status = 0x%x\n", iStatus);
return -1;
}
- else
- {
+ else {
*pData = (unsigned char)(OMAP_HSMMC_READ(RSP10));
}
-
+#ifdef TI_SDIO_DEBUG
+ printk(KERN_INFO "R52: [0x%x](%u) = 0x%x\n", uHwAddr, uLen, (unsigned)*pData);
+#endif
uHwAddr++;
pData++;
}
@@ -970,18 +1024,17 @@ int sdioDrv_WriteSyncBytes (unsigned int uFunc,
unsigned int i;
int iStatus;
- for (i = 0; i < uLen; i++)
- {
+ for (i = 0; i < uLen; i++) {
+#ifdef TI_SDIO_DEBUG
+ printk(KERN_INFO "W52: [0x%x](%u) < 0x%x\n", uHwAddr, uLen, (unsigned)*pData);
+#endif
uCmdArg = SDIO_CMD52_WRITE(1, uFunc, 0, uHwAddr, *pData);
iStatus = sdiodrv_send_command(OMAP_HSMMC_CMD52_WRITE, uCmdArg);
-
- if (!(iStatus & CC))
- {
+ if (!(iStatus & CC)) {
PERR("sdioDrv_WriteSyncBytes() SDIO Command error status = 0x%x\n", iStatus);
return -1;
}
-
uHwAddr++;
pData++;
}
@@ -1007,7 +1060,7 @@ static int sdioDrv_probe(struct platform_device *pdev)
if (g_drv.irq < 0)
return -ENXIO;
- rc= request_irq(g_drv.irq, sdiodrv_irq, 0, SDIO_DRIVER_NAME, &g_drv);
+ rc= request_irq(OMAP_MMC_IRQ, sdiodrv_irq, 0, SDIO_DRIVER_NAME, &g_drv);
if (rc != 0) {
PERR("sdioDrv_InitHw() - request_irq FAILED!!\n");
return rc;
@@ -1015,8 +1068,14 @@ static int sdioDrv_probe(struct platform_device *pdev)
sdiodrv_irq_requested = 1;
spin_lock_init(&g_drv.clk_lock);
-
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 31))
+ dummy_pdev.id = TIWLAN_MMC_CONTROLLER;
+ dev_set_name(&dummy_pdev.dev, "mmci-omap-hs.%lu", TIWLAN_MMC_CONTROLLER);
+ g_drv.fclk = clk_get(&dummy_pdev.dev, "fck");
+#else
g_drv.fclk = clk_get(&pdev->dev, "mmchs_fck");
+#endif
if (IS_ERR(g_drv.fclk)) {
rc = PTR_ERR(g_drv.fclk);
PERR("clk_get(fclk) FAILED !!!\n");
@@ -1024,45 +1083,42 @@ static int sdioDrv_probe(struct platform_device *pdev)
}
sdiodrv_fclk_got = 1;
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 31))
+ g_drv.iclk = clk_get(&dummy_pdev.dev, "ick");
+#else
g_drv.iclk = clk_get(&pdev->dev, "mmchs_ick");
+#endif
if (IS_ERR(g_drv.iclk)) {
rc = PTR_ERR(g_drv.iclk);
PERR("clk_get(iclk) FAILED !!!\n");
goto err;
}
sdiodrv_iclk_got = 1;
-
- rc = clk_enable(g_drv.iclk);
- if(rc) {
- PERR("clk_enable(iclk) FAILED !!!\n");
- goto err;
- }
-
- rc = clk_enable(g_drv.fclk);
- if (rc) {
- PERR("clk_enable(fclk) FAILED !!!\n");
- goto err;
- }
- g_drv.ifclks_enabled = 1;
+
+ rc = sdioDrv_clk_enable();
+ if (rc) {
+ PERR("sdioDrv_probe : 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
+ 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
+ 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);
+ 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);
+ 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 */
@@ -1097,16 +1153,15 @@ err:
static int sdioDrv_remove(struct platform_device *pdev)
{
printk(KERN_INFO "sdioDrv_remove: calling sdiodrv_shutdown\n");
-
+
sdiodrv_shutdown();
-
+
return 0;
}
#ifdef CONFIG_PM
static int sdioDrv_suspend(struct platform_device *pdev, pm_message_t state)
{
-
printk(KERN_INFO "TISDIO: sdioDrv is suspending\n");
return 0;
}
@@ -1118,8 +1173,8 @@ static int sdioDrv_resume(struct platform_device *pdev)
return 0;
}
#else
-#define sdioDrv_suspend NULL
-#define sdioDrv_resume NULL
+#define sdioDrv_suspend NULL
+#define sdioDrv_resume NULL
#endif
static struct platform_driver sdioDrv_struct = {
@@ -1139,97 +1194,91 @@ void sdioDrv_register_pm(int (*wlanDrvIf_Start)(void),
g_drv.wlanDrvIf_pm_suspend = wlanDrvIf_Stop;
}
-#ifdef CONFIG_PM
int sdioDrv_clk_enable(void)
{
- unsigned long flags;
- int ret = 0;
-
- spin_lock_irqsave(&g_drv.clk_lock, flags);
- if (g_drv.ifclks_enabled)
- goto done;
- ret = clk_enable(g_drv.iclk);
- if (ret)
- goto clk_en_err1;
- ret = clk_enable(g_drv.fclk);
- if (ret)
- goto clk_en_err2;
- g_drv.ifclks_enabled = 1;
-
- sdioDrv_hsmmc_restore_ctx();
+ unsigned long flags;
+ int ret = 0;
+
+ spin_lock_irqsave(&g_drv.clk_lock, flags);
+ if (g_drv.ifclks_enabled)
+ goto done;
+
+ ret = clk_enable(g_drv.iclk);
+ if (ret)
+ goto clk_en_err1;
+
+ ret = clk_enable(g_drv.fclk);
+ if (ret)
+ goto clk_en_err2;
+ g_drv.ifclks_enabled = 1;
+
+ sdioDrv_hsmmc_restore_ctx();
done:
- spin_unlock_irqrestore(&g_drv.clk_lock, flags);
- return ret;
+ spin_unlock_irqrestore(&g_drv.clk_lock, flags);
+ return ret;
clk_en_err2:
- clk_disable(g_drv.iclk);
-clk_en_err1:
- spin_unlock_irqrestore(&g_drv.clk_lock, flags);
- return ret;
+ clk_disable(g_drv.iclk);
+clk_en_err1 :
+ spin_unlock_irqrestore(&g_drv.clk_lock, flags);
+ return ret;
}
void sdioDrv_clk_disable(void)
{
- unsigned long flags;
-
- spin_lock_irqsave(&g_drv.clk_lock, flags);
- if (!g_drv.ifclks_enabled)
- goto done;
+ unsigned long flags;
- sdioDrv_hsmmc_save_ctx();
+ spin_lock_irqsave(&g_drv.clk_lock, flags);
+ if (!g_drv.ifclks_enabled)
+ goto done;
- clk_disable(g_drv.fclk);
- clk_disable(g_drv.iclk);
- g_drv.ifclks_enabled = 0;
+ sdioDrv_hsmmc_save_ctx();
+ clk_disable(g_drv.fclk);
+ clk_disable(g_drv.iclk);
+ g_drv.ifclks_enabled = 0;
done:
- spin_unlock_irqrestore(&g_drv.clk_lock, flags);
-}
-#else
-int sdioDrv_clk_enable(void)
-{
- return 0;
+ spin_unlock_irqrestore(&g_drv.clk_lock, flags);
}
-void sdioDrv_clk_disable(void)
-{
- return 0;
-}
+#ifdef TI_SDIO_STANDALONE
+static int __init sdioDrv_init(void)
+#else
+int __init sdioDrv_init(int sdcnum)
#endif
-
-int sdioDrv_init(void)
{
memset(&g_drv, 0, sizeof(g_drv));
memset(&hsmmc_ctx, 0, sizeof(hsmmc_ctx));
- g_drv.pWorkQueue = create_singlethread_workqueue (SDIO_DRV_WK_NAME);
-
printk(KERN_INFO "TIWLAN SDIO init\n");
-
+#ifndef TI_SDIO_STANDALONE
+ sdio_init( sdcnum );
+#endif
+ g_drv.sdio_wq = create_freezeable_workqueue(SDIOWQ_NAME);
+ if (!g_drv.sdio_wq) {
+ printk("TISDIO: Fail to create SDIO WQ\n");
+ return -EINVAL;
+ }
/* Register the sdio driver */
return platform_driver_register(&sdioDrv_struct);
}
-void sdioDrv_exit(void)
+#ifdef TI_SDIO_STANDALONE
+static
+#endif
+void __exit sdioDrv_exit(void)
{
/* Unregister sdio driver */
platform_driver_unregister(&sdioDrv_struct);
- if(g_drv.pWorkQueue)
- {
- flush_workqueue(g_drv.pWorkQueue);
- destroy_workqueue(g_drv.pWorkQueue);
- }
+ if (g_drv.sdio_wq)
+ destroy_workqueue(g_drv.sdio_wq);
}
-//module_init(sdioDrv_init);
-//module_exit(sdioDrv_exit);
-
-EXPORT_SYMBOL(sdioDrv_clk_enable);
-EXPORT_SYMBOL(sdioDrv_clk_disable);
-
-EXPORT_SYMBOL(sdioDrv_init);
-EXPORT_SYMBOL(sdioDrv_exit);
+#ifdef TI_SDIO_STANDALONE
+module_init(sdioDrv_init);
+module_exit(sdioDrv_exit);
+#endif
EXPORT_SYMBOL(sdioDrv_ConnectBus);
EXPORT_SYMBOL(sdioDrv_DisconnectBus);
@@ -1245,4 +1294,4 @@ MODULE_DESCRIPTION("TI WLAN SDIO driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS(SDIO_DRIVER_NAME);
MODULE_AUTHOR("Texas Instruments Inc");
-
+#endif
diff --git a/wl1271/external_drivers/zoom2/Linux/sdio/SdioDrv.h b/wl1271/external_drivers/sdio/linux/SdioDrv.h
index dc2ccaa9..33837608 100644
--- a/wl1271/external_drivers/zoom2/Linux/sdio/SdioDrv.h
+++ b/wl1271/external_drivers/sdio/linux/SdioDrv.h
@@ -169,8 +169,6 @@ int sdioDrv_WriteSyncBytes (unsigned int uFunc,
void sdioDrv_register_pm(int (*wlanDrvIf_Start)(void),
int (*wlanDrvIf_Stop)(void));
-int sdioDrv_init(void);
-void sdioDrv_exit(void);
int sdioDrv_clk_enable(void);
void sdioDrv_clk_disable(void);
diff --git a/wl1271/external_drivers/zoom2/Linux/sdio/SdioDrvDbg.h b/wl1271/external_drivers/sdio/linux/SdioDrvDbg.h
index 8d2bec55..8d2bec55 100644
--- a/wl1271/external_drivers/zoom2/Linux/sdio/SdioDrvDbg.h
+++ b/wl1271/external_drivers/sdio/linux/SdioDrvDbg.h
diff --git a/wl1271/external_drivers/zoom2/Linux/sdio/Makefile b/wl1271/external_drivers/zoom2/Linux/sdio/Makefile
deleted file mode 100644
index 1b08a961..00000000
--- a/wl1271/external_drivers/zoom2/Linux/sdio/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-
-PWD := $(shell pwd)
-DK_ROOT = ../../../..
-
-EXTRA_CFLAGS += -I$(KERNEL_DIR) -I$(PWD)/$(DK_ROOT)/Txn -I$(PWD)/$(DK_ROOT)/external_drivers/zoom2/Linux/sdio -I$(PWD)/$(DK_ROOT)/platforms/hw/host_platform_zoom2/linux
-
-SDIO_IN_BAND ?= n
-TRACE ?= n
-STRIP = n
-
-ifeq ($(SDIO_IN_BAND),y)
-EXTRA_CFLAGS += -DSDIO_IN_BAND_INTERRUPT
-endif
-
-ifeq ($(KERNEL_DEBUGGER),y)
- EXTRA_CFLAGS += -g -Os
-endif
-ifeq ($(DEBUG),y)
- EXTRA_CFLAGS += -DSDIO_DEBUG -Os
-else
- EXTRA_CFLAGS += -Os
- STRIP = y
-endif
-
-ifneq ($(KERNELRELEASE),)
-
-obj-m := sdio.o
-ifeq ($(TEST),y)
-obj-m += testsdio.o
-endif
-
-sdio-objs := SdioDrv.o
-ifeq ($(TEST),y)
-testsdio-objs += testdrv.o
-endif
-else
-
-PWD := $(shell pwd)
-all:
- pwd
- @echo EXTRA_CFLAGS = $(EXTRA_CFLAGS)
- $(MAKE) CROSS_COMPILE=$(CROSS_COMPILE) EXTRA_CFLAGS="$(EXTRA_CFLAGS)" ARCH=$(ARCH) -C $(KERNEL_DIR) M=$(PWD) modules
-ifeq ($(STRIP),y)
- @echo $(CROSS_COMPILE)strip -g sdio.ko
- $(CROSS_COMPILE)strip -g sdio.ko
-ifeq ($(TEST),y)
- $(CROSS_COMPILE)strip -g testsdio.ko
-endif
-endif
-endif
-
-clean:
- rm -f *.o *~ *.~* core .depend dep
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
-