|
@@ -72,11 +72,6 @@
|
|
|
#define GPIO_PULL_DOWN (0)
|
|
|
#define GPIO_PULL_UP (1)
|
|
|
|
|
|
-#if 0 /* --- by chhung */
|
|
|
-#define MSDC_CLKSRC_REG (0xf100000C)
|
|
|
-#define PDN_REG (0xF1000010)
|
|
|
-#endif /* end of --- */
|
|
|
-
|
|
|
#define DEFAULT_DEBOUNCE (8) /* 8 cycles */
|
|
|
#define DEFAULT_DTOC (40) /* data timeout counter. 65536x40 sclk. */
|
|
|
|
|
@@ -100,26 +95,6 @@ static int cd_active_low = 1;
|
|
|
//#define PERI_MSDC2_PDN (17)
|
|
|
//#define PERI_MSDC3_PDN (18)
|
|
|
|
|
|
-#if 0 /* --- by chhung */
|
|
|
-/* gate means clock power down */
|
|
|
-static int g_clk_gate = 0;
|
|
|
-#define msdc_gate_clock(id) \
|
|
|
- do { \
|
|
|
- g_clk_gate &= ~(1 << ((id) + PERI_MSDC0_PDN)); \
|
|
|
- } while (0)
|
|
|
-/* not like power down register. 1 means clock on. */
|
|
|
-#define msdc_ungate_clock(id) \
|
|
|
- do { \
|
|
|
- g_clk_gate |= 1 << ((id) + PERI_MSDC0_PDN); \
|
|
|
- } while (0)
|
|
|
-
|
|
|
-// do we need sync object or not
|
|
|
-void msdc_clk_status(int *status)
|
|
|
-{
|
|
|
- *status = g_clk_gate;
|
|
|
-}
|
|
|
-#endif /* end of --- */
|
|
|
-
|
|
|
/* +++ by chhung */
|
|
|
struct msdc_hw msdc0_hw = {
|
|
|
.clk_src = 0,
|
|
@@ -221,7 +196,6 @@ static void msdc_tasklet_card(struct work_struct *work)
|
|
|
struct msdc_host, card_delaywork.work);
|
|
|
u32 inserted;
|
|
|
u32 status = 0;
|
|
|
- //u32 change = 0;
|
|
|
|
|
|
spin_lock(&host->lock);
|
|
|
|
|
@@ -231,33 +205,17 @@ static void msdc_tasklet_card(struct work_struct *work)
|
|
|
else
|
|
|
inserted = (status & MSDC_PS_CDSTS) ? 1 : 0;
|
|
|
|
|
|
-#if 0
|
|
|
- change = host->card_inserted ^ inserted;
|
|
|
- host->card_inserted = inserted;
|
|
|
-
|
|
|
- if (change && !host->suspend) {
|
|
|
- if (inserted)
|
|
|
- host->mmc->f_max = HOST_MAX_MCLK; // work around
|
|
|
- mmc_detect_change(host->mmc, msecs_to_jiffies(20));
|
|
|
- }
|
|
|
-#else /* Make sure: handle the last interrupt */
|
|
|
+ /* Make sure: handle the last interrupt */
|
|
|
host->card_inserted = inserted;
|
|
|
|
|
|
if (!host->suspend) {
|
|
|
host->mmc->f_max = HOST_MAX_MCLK;
|
|
|
mmc_detect_change(host->mmc, msecs_to_jiffies(20));
|
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
spin_unlock(&host->lock);
|
|
|
}
|
|
|
|
|
|
-#if 0 /* --- by chhung */
|
|
|
-/* For E2 only */
|
|
|
-static u8 clk_src_bit[4] = {
|
|
|
- 0, 3, 5, 7
|
|
|
-};
|
|
|
-
|
|
|
static void msdc_select_clksrc(struct msdc_host *host, unsigned char clksrc)
|
|
|
{
|
|
|
u32 val;
|
|
@@ -358,115 +316,6 @@ static void msdc_abort_data(struct msdc_host *host)
|
|
|
//}
|
|
|
}
|
|
|
|
|
|
-#if 0 /* --- by chhung */
|
|
|
-static void msdc_pin_config(struct msdc_host *host, int mode)
|
|
|
-{
|
|
|
- struct msdc_hw *hw = host->hw;
|
|
|
- int pull = (mode == MSDC_PIN_PULL_UP) ? GPIO_PULL_UP : GPIO_PULL_DOWN;
|
|
|
-
|
|
|
- /* Config WP pin */
|
|
|
- if (hw->flags & MSDC_WP_PIN_EN) {
|
|
|
- if (hw->config_gpio_pin) /* NULL */
|
|
|
- hw->config_gpio_pin(MSDC_WP_PIN, pull);
|
|
|
- }
|
|
|
-
|
|
|
- switch (mode) {
|
|
|
- case MSDC_PIN_PULL_UP:
|
|
|
- //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPU, 1); /* Check & FIXME */
|
|
|
- //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPD, 0); /* Check & FIXME */
|
|
|
- sdr_set_field(host->base + MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPU, 1);
|
|
|
- sdr_set_field(host->base + MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPD, 0);
|
|
|
- sdr_set_field(host->base + MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPU, 1);
|
|
|
- sdr_set_field(host->base + MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPD, 0);
|
|
|
- break;
|
|
|
- case MSDC_PIN_PULL_DOWN:
|
|
|
- //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPU, 0); /* Check & FIXME */
|
|
|
- //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPD, 1); /* Check & FIXME */
|
|
|
- sdr_set_field(host->base + MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPU, 0);
|
|
|
- sdr_set_field(host->base + MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPD, 1);
|
|
|
- sdr_set_field(host->base + MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPU, 0);
|
|
|
- sdr_set_field(host->base + MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPD, 1);
|
|
|
- break;
|
|
|
- case MSDC_PIN_PULL_NONE:
|
|
|
- default:
|
|
|
- //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPU, 0); /* Check & FIXME */
|
|
|
- //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPD, 0); /* Check & FIXME */
|
|
|
- sdr_set_field(host->base + MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPU, 0);
|
|
|
- sdr_set_field(host->base + MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPD, 0);
|
|
|
- sdr_set_field(host->base + MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPU, 0);
|
|
|
- sdr_set_field(host->base + MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPD, 0);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-void msdc_pin_reset(struct msdc_host *host, int mode)
|
|
|
-{
|
|
|
- struct msdc_hw *hw = (struct msdc_hw *)host->hw;
|
|
|
- int pull = (mode == MSDC_PIN_PULL_UP) ? GPIO_PULL_UP : GPIO_PULL_DOWN;
|
|
|
-
|
|
|
- /* Config reset pin */
|
|
|
- if (hw->flags & MSDC_RST_PIN_EN) {
|
|
|
- if (hw->config_gpio_pin) /* NULL */
|
|
|
- hw->config_gpio_pin(MSDC_RST_PIN, pull);
|
|
|
-
|
|
|
- if (mode == MSDC_PIN_PULL_UP)
|
|
|
- sdr_clr_bits(host->base + EMMC_IOCON, EMMC_IOCON_BOOTRST);
|
|
|
- else
|
|
|
- sdr_set_bits(host->base + EMMC_IOCON, EMMC_IOCON_BOOTRST);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-static void msdc_core_power(struct msdc_host *host, int on)
|
|
|
-{
|
|
|
- if (on && host->core_power == 0) {
|
|
|
- msdc_vcore_on(host);
|
|
|
- host->core_power = 1;
|
|
|
- msleep(1);
|
|
|
- } else if (!on && host->core_power == 1) {
|
|
|
- msdc_vcore_off(host);
|
|
|
- host->core_power = 0;
|
|
|
- msleep(1);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-static void msdc_host_power(struct msdc_host *host, int on)
|
|
|
-{
|
|
|
- if (on) {
|
|
|
- //msdc_core_power(host, 1); // need do card detection.
|
|
|
- msdc_pin_reset(host, MSDC_PIN_PULL_UP);
|
|
|
- } else {
|
|
|
- msdc_pin_reset(host, MSDC_PIN_PULL_DOWN);
|
|
|
- //msdc_core_power(host, 0);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-static void msdc_card_power(struct msdc_host *host, int on)
|
|
|
-{
|
|
|
- if (on) {
|
|
|
- msdc_pin_config(host, MSDC_PIN_PULL_UP);
|
|
|
- //msdc_vdd_on(host); // need todo card detection.
|
|
|
- msleep(1);
|
|
|
- } else {
|
|
|
- //msdc_vdd_off(host);
|
|
|
- msdc_pin_config(host, MSDC_PIN_PULL_DOWN);
|
|
|
- msleep(1);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-static void msdc_set_power_mode(struct msdc_host *host, u8 mode)
|
|
|
-{
|
|
|
- if (host->power_mode == MMC_POWER_OFF && mode != MMC_POWER_OFF) {
|
|
|
- msdc_host_power(host, 1);
|
|
|
- msdc_card_power(host, 1);
|
|
|
- } else if (host->power_mode != MMC_POWER_OFF && mode == MMC_POWER_OFF) {
|
|
|
- msdc_card_power(host, 0);
|
|
|
- msdc_host_power(host, 0);
|
|
|
- }
|
|
|
- host->power_mode = mode;
|
|
|
-}
|
|
|
-#endif /* end of --- */
|
|
|
-
|
|
|
#ifdef CONFIG_PM
|
|
|
/*
|
|
|
register as callback function of WIFI(combo_sdio_register_pm) .
|
|
@@ -722,14 +571,6 @@ end:
|
|
|
return cmd->error;
|
|
|
}
|
|
|
|
|
|
-#if 0 /* --- by chhung */
|
|
|
-// DMA resume / start / stop
|
|
|
-static void msdc_dma_resume(struct msdc_host *host)
|
|
|
-{
|
|
|
- sdr_set_field(host->base + MSDC_DMA_CTRL, MSDC_DMA_CTRL_RESUME, 1);
|
|
|
-}
|
|
|
-#endif /* end of --- */
|
|
|
-
|
|
|
static void msdc_dma_start(struct msdc_host *host)
|
|
|
{
|
|
|
u32 wints = MSDC_INTEN_XFER_COMPL | MSDC_INTEN_DATTMO | MSDC_INTEN_DATCRCERR;
|
|
@@ -828,12 +669,6 @@ static int msdc_do_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
cmd = mrq->cmd;
|
|
|
data = mrq->cmd->data;
|
|
|
|
|
|
-#if 0 /* --- by chhung */
|
|
|
- //if(host->id ==1){
|
|
|
- msdc_ungate_clock(host->id);
|
|
|
- //}
|
|
|
-#endif /* end of --- */
|
|
|
-
|
|
|
if (!data) {
|
|
|
send_type = SND_CMD;
|
|
|
if (msdc_do_command(host, cmd, 1, CMD_TIMEOUT) != 0)
|
|
@@ -920,36 +755,8 @@ done:
|
|
|
dma_unmap_sg(mmc_dev(mmc), data->sg, data->sg_len,
|
|
|
mmc_get_dma_dir(data));
|
|
|
host->blksz = 0;
|
|
|
-
|
|
|
-#if 0 // don't stop twice!
|
|
|
- if (host->hw->flags & MSDC_REMOVABLE && data->error) {
|
|
|
- msdc_abort_data(host);
|
|
|
- /* reset in IRQ, stop command has issued. -> No need */
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
}
|
|
|
|
|
|
-#if 0 /* --- by chhung */
|
|
|
-#if 1
|
|
|
- //if(host->id==1) {
|
|
|
- if (send_type == SND_CMD) {
|
|
|
- if (cmd->opcode == MMC_SEND_STATUS) {
|
|
|
- if ((cmd->resp[0] & CARD_READY_FOR_DATA) || (CARD_CURRENT_STATE(cmd->resp[0]) != 7))
|
|
|
- msdc_gate_clock(host->id);
|
|
|
- } else {
|
|
|
- msdc_gate_clock(host->id);
|
|
|
- }
|
|
|
- } else {
|
|
|
- if (read)
|
|
|
- msdc_gate_clock(host->id);
|
|
|
- }
|
|
|
- //}
|
|
|
-#else
|
|
|
- msdc_gate_clock(host->id);
|
|
|
-#endif
|
|
|
-#endif /* end of --- */
|
|
|
-
|
|
|
if (mrq->cmd->error)
|
|
|
host->error = 0x001;
|
|
|
if (mrq->data && mrq->data->error)
|
|
@@ -968,11 +775,7 @@ static int msdc_app_cmd(struct mmc_host *mmc, struct msdc_host *host)
|
|
|
|
|
|
memset(&cmd, 0, sizeof(struct mmc_command));
|
|
|
cmd.opcode = MMC_APP_CMD;
|
|
|
-#if 0 /* bug: we meet mmc->card is null when ACMD6 */
|
|
|
- cmd.arg = mmc->card->rca << 16;
|
|
|
-#else
|
|
|
cmd.arg = host->app_cmd_arg;
|
|
|
-#endif
|
|
|
cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC;
|
|
|
|
|
|
memset(&mrq, 0, sizeof(struct mmc_request));
|
|
@@ -1359,22 +1162,10 @@ static void msdc_ops_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
{
|
|
|
struct msdc_host *host = mmc_priv(mmc);
|
|
|
|
|
|
- //=== for sdio profile ===
|
|
|
-#if 0 /* --- by chhung */
|
|
|
- u32 old_H32, old_L32, new_H32, new_L32;
|
|
|
- u32 ticks = 0, opcode = 0, sizes = 0, bRx = 0;
|
|
|
-#endif /* end of --- */
|
|
|
-
|
|
|
WARN_ON(host->mrq);
|
|
|
|
|
|
/* start to process */
|
|
|
spin_lock(&host->lock);
|
|
|
-#if 0 /* --- by chhung */
|
|
|
- if (sdio_pro_enable) { //=== for sdio profile ===
|
|
|
- if (mrq->cmd->opcode == 52 || mrq->cmd->opcode == 53)
|
|
|
- GPT_GetCounter64(&old_L32, &old_H32);
|
|
|
- }
|
|
|
-#endif /* end of --- */
|
|
|
|
|
|
host->mrq = mrq;
|
|
|
|
|
@@ -1394,26 +1185,6 @@ static void msdc_ops_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
|
|
|
host->mrq = NULL;
|
|
|
|
|
|
-#if 0 /* --- by chhung */
|
|
|
- //=== for sdio profile ===
|
|
|
- if (sdio_pro_enable) {
|
|
|
- if (mrq->cmd->opcode == 52 || mrq->cmd->opcode == 53) {
|
|
|
- GPT_GetCounter64(&new_L32, &new_H32);
|
|
|
- ticks = msdc_time_calc(old_L32, old_H32, new_L32, new_H32);
|
|
|
-
|
|
|
- opcode = mrq->cmd->opcode;
|
|
|
- if (mrq->cmd->data) {
|
|
|
- sizes = mrq->cmd->data->blocks * mrq->cmd->data->blksz;
|
|
|
- bRx = mrq->cmd->data->flags & MMC_DATA_READ ? 1 : 0;
|
|
|
- } else {
|
|
|
- bRx = mrq->cmd->arg & 0x80000000 ? 1 : 0;
|
|
|
- }
|
|
|
-
|
|
|
- if (!mrq->cmd->error)
|
|
|
- msdc_performance(opcode, sizes, bRx, ticks);
|
|
|
- }
|
|
|
- }
|
|
|
-#endif /* end of --- */
|
|
|
spin_unlock(&host->lock);
|
|
|
|
|
|
mmc_request_done(mmc, mrq);
|
|
@@ -1480,7 +1251,6 @@ static void msdc_ops_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|
|
switch (ios->power_mode) {
|
|
|
case MMC_POWER_OFF:
|
|
|
case MMC_POWER_UP:
|
|
|
- // msdc_set_power_mode(host, ios->power_mode); /* --- by chhung */
|
|
|
break;
|
|
|
case MMC_POWER_ON:
|
|
|
host->power_mode = MMC_POWER_ON;
|
|
@@ -1552,9 +1322,6 @@ static int msdc_ops_get_cd(struct mmc_host *mmc)
|
|
|
/* MSDC_CD_PIN_EN set for card */
|
|
|
if (host->hw->flags & MSDC_CD_PIN_EN) {
|
|
|
spin_lock_irqsave(&host->lock, flags);
|
|
|
-#if 0
|
|
|
- present = host->card_inserted; /* why not read from H/W: Fix me*/
|
|
|
-#else
|
|
|
// CD
|
|
|
present = readl(host->base + MSDC_PS) & MSDC_PS_CDSTS;
|
|
|
if (cd_active_low)
|
|
@@ -1562,7 +1329,6 @@ static int msdc_ops_get_cd(struct mmc_host *mmc)
|
|
|
else
|
|
|
present = present ? 1 : 0;
|
|
|
host->card_inserted = present;
|
|
|
-#endif
|
|
|
spin_unlock_irqrestore(&host->lock, flags);
|
|
|
} else {
|
|
|
present = 0; /* TODO? Check DAT3 pins for card detection */
|
|
@@ -1725,14 +1491,6 @@ static void msdc_enable_cd_irq(struct msdc_host *host, int enable)
|
|
|
static void msdc_init_hw(struct msdc_host *host)
|
|
|
{
|
|
|
|
|
|
- /* Power on */
|
|
|
-#if 0 /* --- by chhung */
|
|
|
- msdc_vcore_on(host);
|
|
|
- msdc_pin_reset(host, MSDC_PIN_PULL_UP);
|
|
|
- msdc_select_clksrc(host, hw->clk_src);
|
|
|
- enable_clock(PERI_MSDC0_PDN + host->id, "SD");
|
|
|
- msdc_vdd_on(host);
|
|
|
-#endif /* end of --- */
|
|
|
/* Configure to MMC/SD mode */
|
|
|
sdr_set_field(host->base + MSDC_CFG, MSDC_CFG_MODE, MSDC_SDMMC);
|
|
|
|
|
@@ -1764,10 +1522,6 @@ static void msdc_init_hw(struct msdc_host *host)
|
|
|
|
|
|
writel(0x00000000, host->base + MSDC_DAT_RDDLY1);
|
|
|
writel(0x00000000, host->base + MSDC_IOCON);
|
|
|
-#if 0 // use MT7620 default value: 0x403c004f
|
|
|
- /* bit0 modified: Rx Data Clock Source: 1 -> 2.0*/
|
|
|
- writel(0x003C000F, host->base + MSDC_PATCH_BIT0);
|
|
|
-#endif
|
|
|
|
|
|
if (readl(host->base + MSDC_ECO_VER) >= 4) {
|
|
|
if (host->id == 1) {
|
|
@@ -1834,7 +1588,6 @@ static void msdc_deinit_hw(struct msdc_host *host)
|
|
|
|
|
|
/* Disable card detection */
|
|
|
msdc_enable_cd_irq(host, 0);
|
|
|
- // msdc_set_power_mode(host, MMC_POWER_OFF); /* make sure power down */ /* --- by chhung */
|
|
|
}
|
|
|
|
|
|
/* init gpd and bd list in msdc_drv_probe */
|