|
@@ -146,41 +146,37 @@ static int msdc_rsp[] = {
|
|
|
7, /* RESP_R1b */
|
|
|
};
|
|
|
|
|
|
-#define msdc_dma_on() sdr_clr_bits(MSDC_CFG, MSDC_CFG_PIO)
|
|
|
+#define msdc_dma_on() sdr_clr_bits(host->base + MSDC_CFG, MSDC_CFG_PIO)
|
|
|
|
|
|
static void msdc_reset_hw(struct msdc_host *host)
|
|
|
{
|
|
|
- void __iomem *base = host->base;
|
|
|
-
|
|
|
- sdr_set_bits(MSDC_CFG, MSDC_CFG_RST);
|
|
|
- while (readl(MSDC_CFG) & MSDC_CFG_RST)
|
|
|
+ sdr_set_bits(host->base + MSDC_CFG, MSDC_CFG_RST);
|
|
|
+ while (readl(host->base + MSDC_CFG) & MSDC_CFG_RST)
|
|
|
cpu_relax();
|
|
|
}
|
|
|
|
|
|
#define msdc_clr_int() \
|
|
|
do { \
|
|
|
- volatile u32 val = readl(MSDC_INT); \
|
|
|
- writel(val, MSDC_INT); \
|
|
|
+ volatile u32 val = readl(host->base + MSDC_INT); \
|
|
|
+ writel(val, host->base + MSDC_INT); \
|
|
|
} while (0)
|
|
|
|
|
|
static void msdc_clr_fifo(struct msdc_host *host)
|
|
|
{
|
|
|
- void __iomem *base = host->base;
|
|
|
-
|
|
|
- sdr_set_bits(MSDC_FIFOCS, MSDC_FIFOCS_CLR);
|
|
|
- while (readl(MSDC_FIFOCS) & MSDC_FIFOCS_CLR)
|
|
|
+ sdr_set_bits(host->base + MSDC_FIFOCS, MSDC_FIFOCS_CLR);
|
|
|
+ while (readl(host->base + MSDC_FIFOCS) & MSDC_FIFOCS_CLR)
|
|
|
cpu_relax();
|
|
|
}
|
|
|
|
|
|
#define msdc_irq_save(val) \
|
|
|
do { \
|
|
|
- val = readl(MSDC_INTEN); \
|
|
|
- sdr_clr_bits(MSDC_INTEN, val); \
|
|
|
+ val = readl(host->base + MSDC_INTEN); \
|
|
|
+ sdr_clr_bits(host->base + MSDC_INTEN, val); \
|
|
|
} while (0)
|
|
|
|
|
|
#define msdc_irq_restore(val) \
|
|
|
do { \
|
|
|
- sdr_set_bits(MSDC_INTEN, val); \
|
|
|
+ sdr_set_bits(host->base + MSDC_INTEN, val); \
|
|
|
} while (0)
|
|
|
|
|
|
/* clock source for host: global */
|
|
@@ -218,13 +214,13 @@ static u32 hclks[] = {50000000}; /* +/- by chhung */
|
|
|
(void)hwPowerDown(MT65XX_POWER_LDO_VMCH, "SD"); \
|
|
|
} while (0)
|
|
|
|
|
|
-#define sdc_is_busy() (readl(SDC_STS) & SDC_STS_SDCBUSY)
|
|
|
-#define sdc_is_cmd_busy() (readl(SDC_STS) & SDC_STS_CMDBUSY)
|
|
|
+#define sdc_is_busy() (readl(host->base + SDC_STS) & SDC_STS_SDCBUSY)
|
|
|
+#define sdc_is_cmd_busy() (readl(host->base + SDC_STS) & SDC_STS_CMDBUSY)
|
|
|
|
|
|
#define sdc_send_cmd(cmd, arg) \
|
|
|
do { \
|
|
|
- writel((arg), SDC_ARG); \
|
|
|
- writel((cmd), SDC_CMD); \
|
|
|
+ writel((arg), host->base + SDC_ARG); \
|
|
|
+ writel((cmd), host->base + SDC_CMD); \
|
|
|
} while (0)
|
|
|
|
|
|
// can modify to read h/w register.
|
|
@@ -385,7 +381,6 @@ static void msdc_dump_io_resp(struct msdc_host *host, u32 resp)
|
|
|
|
|
|
static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks)
|
|
|
{
|
|
|
- void __iomem *base = host->base;
|
|
|
u32 timeout, clk_ns;
|
|
|
|
|
|
host->timeout_ns = ns;
|
|
@@ -397,7 +392,7 @@ static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks)
|
|
|
timeout = timeout > 1 ? timeout - 1 : 0;
|
|
|
timeout = timeout > 255 ? 255 : timeout;
|
|
|
|
|
|
- sdr_set_field(SDC_CFG, SDC_CFG_DTOC, timeout);
|
|
|
+ sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, timeout);
|
|
|
|
|
|
N_MSG(OPS, "Set read data timeout: %dns %dclks -> %d x 65536 cycles",
|
|
|
ns, clks, timeout + 1);
|
|
@@ -407,14 +402,13 @@ static void msdc_tasklet_card(struct work_struct *work)
|
|
|
{
|
|
|
struct msdc_host *host = (struct msdc_host *)container_of(work,
|
|
|
struct msdc_host, card_delaywork.work);
|
|
|
- void __iomem *base = host->base;
|
|
|
u32 inserted;
|
|
|
u32 status = 0;
|
|
|
//u32 change = 0;
|
|
|
|
|
|
spin_lock(&host->lock);
|
|
|
|
|
|
- status = readl(MSDC_PS);
|
|
|
+ status = readl(host->base + MSDC_PS);
|
|
|
if (cd_active_low)
|
|
|
inserted = (status & MSDC_PS_CDSTS) ? 0 : 1;
|
|
|
else
|
|
@@ -452,19 +446,18 @@ static u8 clk_src_bit[4] = {
|
|
|
static void msdc_select_clksrc(struct msdc_host *host, unsigned char clksrc)
|
|
|
{
|
|
|
u32 val;
|
|
|
- void __iomem *base = host->base;
|
|
|
|
|
|
BUG_ON(clksrc > 3);
|
|
|
INIT_MSG("set clock source to <%d>", clksrc);
|
|
|
|
|
|
- val = readl(MSDC_CLKSRC_REG);
|
|
|
- if (readl(MSDC_ECO_VER) >= 4) {
|
|
|
+ val = readl(host->base + MSDC_CLKSRC_REG);
|
|
|
+ if (readl(host->base + MSDC_ECO_VER) >= 4) {
|
|
|
val &= ~(0x3 << clk_src_bit[host->id]);
|
|
|
val |= clksrc << clk_src_bit[host->id];
|
|
|
} else {
|
|
|
val &= ~0x3; val |= clksrc;
|
|
|
}
|
|
|
- writel(val, MSDC_CLKSRC_REG);
|
|
|
+ writel(val, host->base + MSDC_CLKSRC_REG);
|
|
|
|
|
|
host->hclk = hclks[clksrc];
|
|
|
host->hw->clk_src = clksrc;
|
|
@@ -474,7 +467,6 @@ static void msdc_select_clksrc(struct msdc_host *host, unsigned char clksrc)
|
|
|
static void msdc_set_mclk(struct msdc_host *host, int ddr, unsigned int hz)
|
|
|
{
|
|
|
//struct msdc_hw *hw = host->hw;
|
|
|
- void __iomem *base = host->base;
|
|
|
u32 mode;
|
|
|
u32 flags;
|
|
|
u32 div;
|
|
@@ -515,11 +507,11 @@ static void msdc_set_mclk(struct msdc_host *host, int ddr, unsigned int hz)
|
|
|
}
|
|
|
|
|
|
/* set clock mode and divisor */
|
|
|
- sdr_set_field(MSDC_CFG, MSDC_CFG_CKMOD, mode);
|
|
|
- sdr_set_field(MSDC_CFG, MSDC_CFG_CKDIV, div);
|
|
|
+ sdr_set_field(host->base + MSDC_CFG, MSDC_CFG_CKMOD, mode);
|
|
|
+ sdr_set_field(host->base + MSDC_CFG, MSDC_CFG_CKDIV, div);
|
|
|
|
|
|
/* wait clock stable */
|
|
|
- while (!(readl(MSDC_CFG) & MSDC_CFG_CKSTB))
|
|
|
+ while (!(readl(host->base + MSDC_CFG) & MSDC_CFG_CKSTB))
|
|
|
cpu_relax();
|
|
|
|
|
|
host->sclk = sclk;
|
|
@@ -536,7 +528,6 @@ static void msdc_set_mclk(struct msdc_host *host, int ddr, unsigned int hz)
|
|
|
/* Fix me. when need to abort */
|
|
|
static void msdc_abort_data(struct msdc_host *host)
|
|
|
{
|
|
|
- void __iomem *base = host->base;
|
|
|
struct mmc_command *stop = host->mrq->stop;
|
|
|
|
|
|
ERR_MSG("Need to Abort.");
|
|
@@ -561,7 +552,6 @@ static void msdc_abort_data(struct msdc_host *host)
|
|
|
static void msdc_pin_config(struct msdc_host *host, int mode)
|
|
|
{
|
|
|
struct msdc_hw *hw = host->hw;
|
|
|
- void __iomem *base = host->base;
|
|
|
int pull = (mode == MSDC_PIN_PULL_UP) ? GPIO_PULL_UP : GPIO_PULL_DOWN;
|
|
|
|
|
|
/* Config WP pin */
|
|
@@ -574,27 +564,27 @@ static void msdc_pin_config(struct msdc_host *host, int 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(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPU, 1);
|
|
|
- sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPD, 0);
|
|
|
- sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPU, 1);
|
|
|
- sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPD, 0);
|
|
|
+ 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(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPU, 0);
|
|
|
- sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPD, 1);
|
|
|
- sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPU, 0);
|
|
|
- sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPD, 1);
|
|
|
+ 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(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPU, 0);
|
|
|
- sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPD, 0);
|
|
|
- sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPU, 0);
|
|
|
- sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPD, 0);
|
|
|
+ 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;
|
|
|
}
|
|
|
|
|
@@ -605,7 +595,6 @@ static void msdc_pin_config(struct msdc_host *host, int mode)
|
|
|
void msdc_pin_reset(struct msdc_host *host, int mode)
|
|
|
{
|
|
|
struct msdc_hw *hw = (struct msdc_hw *)host->hw;
|
|
|
- void __iomem *base = host->base;
|
|
|
int pull = (mode == MSDC_PIN_PULL_UP) ? GPIO_PULL_UP : GPIO_PULL_DOWN;
|
|
|
|
|
|
/* Config reset pin */
|
|
@@ -614,9 +603,9 @@ void msdc_pin_reset(struct msdc_host *host, int mode)
|
|
|
hw->config_gpio_pin(MSDC_RST_PIN, pull);
|
|
|
|
|
|
if (mode == MSDC_PIN_PULL_UP)
|
|
|
- sdr_clr_bits(EMMC_IOCON, EMMC_IOCON_BOOTRST);
|
|
|
+ sdr_clr_bits(host->base + EMMC_IOCON, EMMC_IOCON_BOOTRST);
|
|
|
else
|
|
|
- sdr_set_bits(EMMC_IOCON, EMMC_IOCON_BOOTRST);
|
|
|
+ sdr_set_bits(host->base + EMMC_IOCON, EMMC_IOCON_BOOTRST);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -733,7 +722,6 @@ static unsigned int msdc_command_start(struct msdc_host *host,
|
|
|
int tune, /* not used */
|
|
|
unsigned long timeout)
|
|
|
{
|
|
|
- void __iomem *base = host->base;
|
|
|
u32 opcode = cmd->opcode;
|
|
|
u32 rawcmd;
|
|
|
u32 wints = MSDC_INT_CMDRDY | MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO |
|
|
@@ -851,7 +839,7 @@ static unsigned int msdc_command_start(struct msdc_host *host,
|
|
|
|
|
|
init_completion(&host->cmd_done);
|
|
|
|
|
|
- sdr_set_bits(MSDC_INTEN, wints);
|
|
|
+ sdr_set_bits(host->base + MSDC_INTEN, wints);
|
|
|
sdc_send_cmd(rawcmd, cmd->arg);
|
|
|
|
|
|
end:
|
|
@@ -864,7 +852,6 @@ static unsigned int msdc_command_resp(struct msdc_host *host,
|
|
|
unsigned long timeout)
|
|
|
__must_hold(&host->lock)
|
|
|
{
|
|
|
- void __iomem *base = host->base;
|
|
|
u32 opcode = cmd->opcode;
|
|
|
//u32 rawcmd;
|
|
|
u32 wints = MSDC_INT_CMDRDY | MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO |
|
|
@@ -873,7 +860,7 @@ static unsigned int msdc_command_resp(struct msdc_host *host,
|
|
|
|
|
|
BUG_ON(in_interrupt());
|
|
|
//init_completion(&host->cmd_done);
|
|
|
- //sdr_set_bits(MSDC_INTEN, wints);
|
|
|
+ //sdr_set_bits(host->base + MSDC_INTEN, wints);
|
|
|
|
|
|
spin_unlock(&host->lock);
|
|
|
if (!wait_for_completion_timeout(&host->cmd_done, 10 * timeout)) {
|
|
@@ -883,7 +870,7 @@ static unsigned int msdc_command_resp(struct msdc_host *host,
|
|
|
}
|
|
|
spin_lock(&host->lock);
|
|
|
|
|
|
- sdr_clr_bits(MSDC_INTEN, wints);
|
|
|
+ sdr_clr_bits(host->base + MSDC_INTEN, wints);
|
|
|
host->cmd = NULL;
|
|
|
|
|
|
//end:
|
|
@@ -928,7 +915,8 @@ static unsigned int msdc_command_resp(struct msdc_host *host,
|
|
|
|
|
|
/* memory card CRC */
|
|
|
if (host->hw->flags & MSDC_REMOVABLE && cmd->error == -EIO) {
|
|
|
- if (readl(SDC_CMD) & 0x1800) { /* check if has data phase */
|
|
|
+ /* check if has data phase */
|
|
|
+ if (readl(host->base + SDC_CMD) & 0x1800) {
|
|
|
msdc_abort_data(host);
|
|
|
} else {
|
|
|
/* do basic: reset*/
|
|
@@ -941,7 +929,7 @@ static unsigned int msdc_command_resp(struct msdc_host *host,
|
|
|
|
|
|
// check DAT0
|
|
|
/* if (resp == RESP_R1B) {
|
|
|
- while ((readl(MSDC_PS) & 0x10000) != 0x10000);
|
|
|
+ while ((readl(host->base + MSDC_PS) & 0x10000) != 0x10000);
|
|
|
} */
|
|
|
/* CMD12 Error Handle */
|
|
|
|
|
@@ -969,9 +957,7 @@ end:
|
|
|
// DMA resume / start / stop
|
|
|
static void msdc_dma_resume(struct msdc_host *host)
|
|
|
{
|
|
|
- void __iomem *base = host->base;
|
|
|
-
|
|
|
- sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_RESUME, 1);
|
|
|
+ sdr_set_field(host->base + MSDC_DMA_CTRL, MSDC_DMA_CTRL_RESUME, 1);
|
|
|
|
|
|
N_MSG(DMA, "DMA resume");
|
|
|
}
|
|
@@ -979,31 +965,29 @@ static void msdc_dma_resume(struct msdc_host *host)
|
|
|
|
|
|
static void msdc_dma_start(struct msdc_host *host)
|
|
|
{
|
|
|
- void __iomem *base = host->base;
|
|
|
u32 wints = MSDC_INTEN_XFER_COMPL | MSDC_INTEN_DATTMO | MSDC_INTEN_DATCRCERR;
|
|
|
|
|
|
- sdr_set_bits(MSDC_INTEN, wints);
|
|
|
+ sdr_set_bits(host->base + MSDC_INTEN, wints);
|
|
|
//dsb(); /* --- by chhung */
|
|
|
- sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_START, 1);
|
|
|
+ sdr_set_field(host->base + MSDC_DMA_CTRL, MSDC_DMA_CTRL_START, 1);
|
|
|
|
|
|
N_MSG(DMA, "DMA start");
|
|
|
}
|
|
|
|
|
|
static void msdc_dma_stop(struct msdc_host *host)
|
|
|
{
|
|
|
- void __iomem *base = host->base;
|
|
|
//u32 retries=500;
|
|
|
u32 wints = MSDC_INTEN_XFER_COMPL | MSDC_INTEN_DATTMO | MSDC_INTEN_DATCRCERR;
|
|
|
|
|
|
- N_MSG(DMA, "DMA status: 0x%.8x", readl(MSDC_DMA_CFG));
|
|
|
- //while (readl(MSDC_DMA_CFG) & MSDC_DMA_CFG_STS);
|
|
|
+ N_MSG(DMA, "DMA status: 0x%.8x", readl(host->base + MSDC_DMA_CFG));
|
|
|
+ //while (readl(host->base + MSDC_DMA_CFG) & MSDC_DMA_CFG_STS);
|
|
|
|
|
|
- sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_STOP, 1);
|
|
|
- while (readl(MSDC_DMA_CFG) & MSDC_DMA_CFG_STS)
|
|
|
+ sdr_set_field(host->base + MSDC_DMA_CTRL, MSDC_DMA_CTRL_STOP, 1);
|
|
|
+ while (readl(host->base + MSDC_DMA_CFG) & MSDC_DMA_CFG_STS)
|
|
|
;
|
|
|
|
|
|
//dsb(); /* --- by chhung */
|
|
|
- sdr_clr_bits(MSDC_INTEN, wints); /* Not just xfer_comp */
|
|
|
+ sdr_clr_bits(host->base + MSDC_INTEN, wints); /* Not just xfer_comp */
|
|
|
|
|
|
N_MSG(DMA, "DMA stop");
|
|
|
}
|
|
@@ -1021,7 +1005,6 @@ static u8 msdc_dma_calcs(u8 *buf, u32 len)
|
|
|
static void msdc_dma_setup(struct msdc_host *host, struct msdc_dma *dma,
|
|
|
struct scatterlist *sg_cmd, unsigned int sglen)
|
|
|
{
|
|
|
- void __iomem *base = host->base;
|
|
|
struct scatterlist *sg;
|
|
|
struct gpd *gpd;
|
|
|
struct bd *bd;
|
|
@@ -1057,16 +1040,16 @@ static void msdc_dma_setup(struct msdc_host *host, struct msdc_dma *dma,
|
|
|
bd[j].chksum = msdc_dma_calcs((u8 *)(&bd[j]), 16);
|
|
|
}
|
|
|
|
|
|
- sdr_set_field(MSDC_DMA_CFG, MSDC_DMA_CFG_DECSEN, 1);
|
|
|
- sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_BRUSTSZ,
|
|
|
+ sdr_set_field(host->base + MSDC_DMA_CFG, MSDC_DMA_CFG_DECSEN, 1);
|
|
|
+ sdr_set_field(host->base + MSDC_DMA_CTRL, MSDC_DMA_CTRL_BRUSTSZ,
|
|
|
MSDC_BRUST_64B);
|
|
|
- sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_MODE, 1);
|
|
|
+ sdr_set_field(host->base + MSDC_DMA_CTRL, MSDC_DMA_CTRL_MODE, 1);
|
|
|
|
|
|
- writel(PHYSADDR((u32)dma->gpd_addr), MSDC_DMA_SA);
|
|
|
+ writel(PHYSADDR((u32)dma->gpd_addr), host->base + MSDC_DMA_SA);
|
|
|
|
|
|
- N_MSG(DMA, "DMA_CTRL = 0x%x", readl(MSDC_DMA_CTRL));
|
|
|
- N_MSG(DMA, "DMA_CFG = 0x%x", readl(MSDC_DMA_CFG));
|
|
|
- N_MSG(DMA, "DMA_SA = 0x%x", readl(MSDC_DMA_SA));
|
|
|
+ N_MSG(DMA, "DMA_CTRL = 0x%x", readl(host->base + MSDC_DMA_CTRL));
|
|
|
+ N_MSG(DMA, "DMA_CFG = 0x%x", readl(host->base + MSDC_DMA_CFG));
|
|
|
+ N_MSG(DMA, "DMA_SA = 0x%x", readl(host->base + MSDC_DMA_SA));
|
|
|
}
|
|
|
|
|
|
static int msdc_do_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
@@ -1075,7 +1058,6 @@ static int msdc_do_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
struct msdc_host *host = mmc_priv(mmc);
|
|
|
struct mmc_command *cmd;
|
|
|
struct mmc_data *data;
|
|
|
- void __iomem *base = host->base;
|
|
|
//u32 intsts = 0;
|
|
|
int read = 1, send_type = 0;
|
|
|
|
|
@@ -1118,7 +1100,7 @@ static int msdc_do_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- writel(data->blocks, SDC_BLK_NUM);
|
|
|
+ writel(data->blocks, host->base + SDC_BLK_NUM);
|
|
|
//msdc_clr_fifo(host); /* no need */
|
|
|
|
|
|
msdc_dma_on(); /* enable DMA mode first!! */
|
|
@@ -1146,10 +1128,14 @@ static int msdc_do_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
spin_unlock(&host->lock);
|
|
|
if (!wait_for_completion_timeout(&host->xfer_done, DAT_TIMEOUT)) {
|
|
|
ERR_MSG("XXX CMD<%d> wait xfer_done<%d> timeout!!", cmd->opcode, data->blocks * data->blksz);
|
|
|
- ERR_MSG(" DMA_SA = 0x%x", readl(MSDC_DMA_SA));
|
|
|
- ERR_MSG(" DMA_CA = 0x%x", readl(MSDC_DMA_CA));
|
|
|
- ERR_MSG(" DMA_CTRL = 0x%x", readl(MSDC_DMA_CTRL));
|
|
|
- ERR_MSG(" DMA_CFG = 0x%x", readl(MSDC_DMA_CFG));
|
|
|
+ ERR_MSG(" DMA_SA = 0x%x",
|
|
|
+ readl(host->base + MSDC_DMA_SA));
|
|
|
+ ERR_MSG(" DMA_CA = 0x%x",
|
|
|
+ readl(host->base + MSDC_DMA_CA));
|
|
|
+ ERR_MSG(" DMA_CTRL = 0x%x",
|
|
|
+ readl(host->base + MSDC_DMA_CTRL));
|
|
|
+ ERR_MSG(" DMA_CFG = 0x%x",
|
|
|
+ readl(host->base + MSDC_DMA_CFG));
|
|
|
data->error = -ETIMEDOUT;
|
|
|
|
|
|
msdc_reset_hw(host);
|
|
@@ -1247,7 +1233,6 @@ static int msdc_app_cmd(struct mmc_host *mmc, struct msdc_host *host)
|
|
|
static int msdc_tune_cmdrsp(struct msdc_host *host, struct mmc_command *cmd)
|
|
|
{
|
|
|
int result = -1;
|
|
|
- void __iomem *base = host->base;
|
|
|
u32 rsmpl, cur_rsmpl, orig_rsmpl;
|
|
|
u32 rrdly, cur_rrdly = 0xffffffff, orig_rrdly;
|
|
|
u32 skip = 1;
|
|
@@ -1258,8 +1243,9 @@ static int msdc_tune_cmdrsp(struct msdc_host *host, struct mmc_command *cmd)
|
|
|
==========================*/
|
|
|
|
|
|
// save the previous tune result
|
|
|
- sdr_get_field(MSDC_IOCON, MSDC_IOCON_RSPL, &orig_rsmpl);
|
|
|
- sdr_get_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_CMDRRDLY, &orig_rrdly);
|
|
|
+ sdr_get_field(host->base + MSDC_IOCON, MSDC_IOCON_RSPL, &orig_rsmpl);
|
|
|
+ sdr_get_field(host->base + MSDC_PAD_TUNE, MSDC_PAD_TUNE_CMDRRDLY,
|
|
|
+ &orig_rrdly);
|
|
|
|
|
|
rrdly = 0;
|
|
|
do {
|
|
@@ -1270,7 +1256,8 @@ static int msdc_tune_cmdrsp(struct msdc_host *host, struct mmc_command *cmd)
|
|
|
skip = 0;
|
|
|
continue;
|
|
|
}
|
|
|
- sdr_set_field(MSDC_IOCON, MSDC_IOCON_RSPL, cur_rsmpl);
|
|
|
+ sdr_set_field(host->base + MSDC_IOCON, MSDC_IOCON_RSPL,
|
|
|
+ cur_rsmpl);
|
|
|
|
|
|
if (host->app_cmd) {
|
|
|
result = msdc_app_cmd(host->mmc, host);
|
|
@@ -1292,14 +1279,15 @@ static int msdc_tune_cmdrsp(struct msdc_host *host, struct mmc_command *cmd)
|
|
|
}
|
|
|
|
|
|
/* should be EIO */
|
|
|
- if (readl(SDC_CMD) & 0x1800) { /* check if has data phase */
|
|
|
+ /* check if has data phase */
|
|
|
+ if (readl(host->base + SDC_CMD) & 0x1800)
|
|
|
msdc_abort_data(host);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
/* Lv2: PAD_CMD_RESP_RXDLY[26:22] */
|
|
|
cur_rrdly = (orig_rrdly + rrdly + 1) % 32;
|
|
|
- sdr_set_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_CMDRRDLY, cur_rrdly);
|
|
|
+ sdr_set_field(host->base + MSDC_PAD_TUNE,
|
|
|
+ MSDC_PAD_TUNE_CMDRRDLY, cur_rrdly);
|
|
|
} while (++rrdly < 32);
|
|
|
|
|
|
return result;
|
|
@@ -1309,7 +1297,6 @@ static int msdc_tune_cmdrsp(struct msdc_host *host, struct mmc_command *cmd)
|
|
|
static int msdc_tune_bread(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
{
|
|
|
struct msdc_host *host = mmc_priv(mmc);
|
|
|
- void __iomem *base = host->base;
|
|
|
u32 ddr = 0;
|
|
|
u32 dcrc = 0;
|
|
|
u32 rxdly, cur_rxdly0, cur_rxdly1;
|
|
@@ -1321,10 +1308,10 @@ static int msdc_tune_bread(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
int result = -1;
|
|
|
u32 skip = 1;
|
|
|
|
|
|
- sdr_get_field(MSDC_IOCON, MSDC_IOCON_DSPL, &orig_dsmpl);
|
|
|
+ sdr_get_field(host->base + MSDC_IOCON, MSDC_IOCON_DSPL, &orig_dsmpl);
|
|
|
|
|
|
/* Tune Method 2. */
|
|
|
- sdr_set_field(MSDC_IOCON, MSDC_IOCON_DDLSEL, 1);
|
|
|
+ sdr_set_field(host->base + MSDC_IOCON, MSDC_IOCON_DDLSEL, 1);
|
|
|
|
|
|
rxdly = 0;
|
|
|
do {
|
|
@@ -1334,7 +1321,8 @@ static int msdc_tune_bread(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
skip = 0;
|
|
|
continue;
|
|
|
}
|
|
|
- sdr_set_field(MSDC_IOCON, MSDC_IOCON_DSPL, cur_dsmpl);
|
|
|
+ sdr_set_field(host->base + MSDC_IOCON, MSDC_IOCON_DSPL,
|
|
|
+ cur_dsmpl);
|
|
|
|
|
|
if (host->app_cmd) {
|
|
|
result = msdc_app_cmd(host->mmc, host);
|
|
@@ -1345,14 +1333,15 @@ static int msdc_tune_bread(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
}
|
|
|
result = msdc_do_request(mmc, mrq);
|
|
|
|
|
|
- sdr_get_field(SDC_DCRC_STS,
|
|
|
+ sdr_get_field(host->base + SDC_DCRC_STS,
|
|
|
SDC_DCRC_STS_POS | SDC_DCRC_STS_NEG,
|
|
|
&dcrc); /* RO */
|
|
|
if (!ddr)
|
|
|
dcrc &= ~SDC_DCRC_STS_NEG;
|
|
|
ERR_MSG("TUNE_BREAD<%s> dcrc<0x%x> DATRDDLY0/1<0x%x><0x%x> dsmpl<0x%x>",
|
|
|
(result == 0 && dcrc == 0) ? "PASS" : "FAIL", dcrc,
|
|
|
- readl(MSDC_DAT_RDDLY0), readl(MSDC_DAT_RDDLY1), cur_dsmpl);
|
|
|
+ readl(host->base + MSDC_DAT_RDDLY0),
|
|
|
+ readl(host->base + MSDC_DAT_RDDLY1), cur_dsmpl);
|
|
|
|
|
|
/* Fix me: result is 0, but dcrc is still exist */
|
|
|
if (result == 0 && dcrc == 0) {
|
|
@@ -1368,11 +1357,11 @@ static int msdc_tune_bread(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- cur_rxdly0 = readl(MSDC_DAT_RDDLY0);
|
|
|
- cur_rxdly1 = readl(MSDC_DAT_RDDLY1);
|
|
|
+ cur_rxdly0 = readl(host->base + MSDC_DAT_RDDLY0);
|
|
|
+ cur_rxdly1 = readl(host->base + MSDC_DAT_RDDLY1);
|
|
|
|
|
|
/* E1 ECO. YD: Reverse */
|
|
|
- if (readl(MSDC_ECO_VER) >= 4) {
|
|
|
+ if (readl(host->base + MSDC_ECO_VER) >= 4) {
|
|
|
orig_dat0 = (cur_rxdly0 >> 24) & 0x1F;
|
|
|
orig_dat1 = (cur_rxdly0 >> 16) & 0x1F;
|
|
|
orig_dat2 = (cur_rxdly0 >> 8) & 0x1F;
|
|
@@ -1411,8 +1400,8 @@ static int msdc_tune_bread(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
cur_rxdly0 = (cur_dat0 << 24) | (cur_dat1 << 16) | (cur_dat2 << 8) | (cur_dat3 << 0);
|
|
|
cur_rxdly1 = (cur_dat4 << 24) | (cur_dat5 << 16) | (cur_dat6 << 8) | (cur_dat7 << 0);
|
|
|
|
|
|
- writel(cur_rxdly0, MSDC_DAT_RDDLY0);
|
|
|
- writel(cur_rxdly1, MSDC_DAT_RDDLY1);
|
|
|
+ writel(cur_rxdly0, host->base + MSDC_DAT_RDDLY0);
|
|
|
+ writel(cur_rxdly1, host->base + MSDC_DAT_RDDLY1);
|
|
|
|
|
|
} while (++rxdly < 32);
|
|
|
|
|
@@ -1423,7 +1412,6 @@ done:
|
|
|
static int msdc_tune_bwrite(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
{
|
|
|
struct msdc_host *host = mmc_priv(mmc);
|
|
|
- void __iomem *base = host->base;
|
|
|
|
|
|
u32 wrrdly, cur_wrrdly = 0xffffffff, orig_wrrdly;
|
|
|
u32 dsmpl, cur_dsmpl, orig_dsmpl;
|
|
@@ -1435,15 +1423,16 @@ static int msdc_tune_bwrite(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
|
|
|
// MSDC_IOCON_DDR50CKD need to check. [Fix me]
|
|
|
|
|
|
- sdr_get_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_DATWRDLY, &orig_wrrdly);
|
|
|
- sdr_get_field(MSDC_IOCON, MSDC_IOCON_DSPL, &orig_dsmpl);
|
|
|
+ sdr_get_field(host->base + MSDC_PAD_TUNE, MSDC_PAD_TUNE_DATWRDLY,
|
|
|
+ &orig_wrrdly);
|
|
|
+ sdr_get_field(host->base + MSDC_IOCON, MSDC_IOCON_DSPL, &orig_dsmpl);
|
|
|
|
|
|
/* Tune Method 2. just DAT0 */
|
|
|
- sdr_set_field(MSDC_IOCON, MSDC_IOCON_DDLSEL, 1);
|
|
|
- cur_rxdly0 = readl(MSDC_DAT_RDDLY0);
|
|
|
+ sdr_set_field(host->base + MSDC_IOCON, MSDC_IOCON_DDLSEL, 1);
|
|
|
+ cur_rxdly0 = readl(host->base + MSDC_DAT_RDDLY0);
|
|
|
|
|
|
/* E1 ECO. YD: Reverse */
|
|
|
- if (readl(MSDC_ECO_VER) >= 4) {
|
|
|
+ if (readl(host->base + MSDC_ECO_VER) >= 4) {
|
|
|
orig_dat0 = (cur_rxdly0 >> 24) & 0x1F;
|
|
|
orig_dat1 = (cur_rxdly0 >> 16) & 0x1F;
|
|
|
orig_dat2 = (cur_rxdly0 >> 8) & 0x1F;
|
|
@@ -1465,7 +1454,8 @@ static int msdc_tune_bwrite(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
skip = 0;
|
|
|
continue;
|
|
|
}
|
|
|
- sdr_set_field(MSDC_IOCON, MSDC_IOCON_DSPL, cur_dsmpl);
|
|
|
+ sdr_set_field(host->base + MSDC_IOCON,
|
|
|
+ MSDC_IOCON_DSPL, cur_dsmpl);
|
|
|
|
|
|
if (host->app_cmd) {
|
|
|
result = msdc_app_cmd(host->mmc, host);
|
|
@@ -1492,7 +1482,8 @@ static int msdc_tune_bwrite(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
}
|
|
|
}
|
|
|
cur_wrrdly = (orig_wrrdly + wrrdly + 1) % 32;
|
|
|
- sdr_set_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_DATWRDLY, cur_wrrdly);
|
|
|
+ sdr_set_field(host->base + MSDC_PAD_TUNE,
|
|
|
+ MSDC_PAD_TUNE_DATWRDLY, cur_wrrdly);
|
|
|
} while (++wrrdly < 32);
|
|
|
|
|
|
cur_dat0 = (orig_dat0 + rxdly) % 32; /* only adjust bit-1 for crc */
|
|
@@ -1501,7 +1492,7 @@ static int msdc_tune_bwrite(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
cur_dat3 = orig_dat3;
|
|
|
|
|
|
cur_rxdly0 = (cur_dat0 << 24) | (cur_dat1 << 16) | (cur_dat2 << 8) | (cur_dat3 << 0);
|
|
|
- writel(cur_rxdly0, MSDC_DAT_RDDLY0);
|
|
|
+ writel(cur_rxdly0, host->base + MSDC_DAT_RDDLY0);
|
|
|
} while (++rxdly < 32);
|
|
|
|
|
|
done:
|
|
@@ -1651,8 +1642,7 @@ static void msdc_ops_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
/* called by ops.set_ios */
|
|
|
static void msdc_set_buswidth(struct msdc_host *host, u32 width)
|
|
|
{
|
|
|
- void __iomem *base = host->base;
|
|
|
- u32 val = readl(SDC_CFG);
|
|
|
+ u32 val = readl(host->base + SDC_CFG);
|
|
|
|
|
|
val &= ~SDC_CFG_BUSWIDTH;
|
|
|
|
|
@@ -1670,7 +1660,7 @@ static void msdc_set_buswidth(struct msdc_host *host, u32 width)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- writel(val, SDC_CFG);
|
|
|
+ writel(val, host->base + SDC_CFG);
|
|
|
|
|
|
N_MSG(CFG, "Bus Width = %d", width);
|
|
|
}
|
|
@@ -1679,7 +1669,6 @@ static void msdc_set_buswidth(struct msdc_host *host, u32 width)
|
|
|
static void msdc_ops_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|
|
{
|
|
|
struct msdc_host *host = mmc_priv(mmc);
|
|
|
- void __iomem *base = host->base;
|
|
|
u32 ddr = 0;
|
|
|
|
|
|
#ifdef MT6575_SD_DEBUG
|
|
@@ -1725,18 +1714,23 @@ static void msdc_ops_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|
|
if (ios->clock > 25000000) {
|
|
|
//if (!(host->hw->flags & MSDC_REMOVABLE)) {
|
|
|
INIT_MSG("SD data latch edge<%d>", MSDC_SMPL_FALLING);
|
|
|
- sdr_set_field(MSDC_IOCON, MSDC_IOCON_RSPL,
|
|
|
+ sdr_set_field(host->base + MSDC_IOCON, MSDC_IOCON_RSPL,
|
|
|
MSDC_SMPL_FALLING);
|
|
|
- sdr_set_field(MSDC_IOCON, MSDC_IOCON_DSPL,
|
|
|
+ sdr_set_field(host->base + MSDC_IOCON, MSDC_IOCON_DSPL,
|
|
|
MSDC_SMPL_FALLING);
|
|
|
//} /* for tuning debug */
|
|
|
} else { /* default value */
|
|
|
- writel(0x00000000, MSDC_IOCON);
|
|
|
- // writel(0x00000000, MSDC_DAT_RDDLY0);
|
|
|
- writel(0x10101010, MSDC_DAT_RDDLY0); // for MT7620 E2 and afterward
|
|
|
- writel(0x00000000, MSDC_DAT_RDDLY1);
|
|
|
- // writel(0x00000000, MSDC_PAD_TUNE);
|
|
|
- writel(0x84101010, MSDC_PAD_TUNE); // for MT7620 E2 and afterward
|
|
|
+ writel(0x00000000, host->base + MSDC_IOCON);
|
|
|
+ // writel(0x00000000, host->base + MSDC_DAT_RDDLY0);
|
|
|
+
|
|
|
+ // for MT7620 E2 and afterward
|
|
|
+ writel(0x10101010, host->base + MSDC_DAT_RDDLY0);
|
|
|
+
|
|
|
+ writel(0x00000000, host->base + MSDC_DAT_RDDLY1);
|
|
|
+ // writel(0x00000000, host->base + MSDC_PAD_TUNE);
|
|
|
+
|
|
|
+ // for MT7620 E2 and afterward
|
|
|
+ writel(0x84101010, host->base + MSDC_PAD_TUNE);
|
|
|
}
|
|
|
msdc_set_mclk(host, ddr, ios->clock);
|
|
|
}
|
|
@@ -1746,13 +1740,12 @@ static void msdc_ops_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|
|
static int msdc_ops_get_ro(struct mmc_host *mmc)
|
|
|
{
|
|
|
struct msdc_host *host = mmc_priv(mmc);
|
|
|
- void __iomem *base = host->base;
|
|
|
unsigned long flags;
|
|
|
int ro = 0;
|
|
|
|
|
|
if (host->hw->flags & MSDC_WP_PIN_EN) { /* set for card */
|
|
|
spin_lock_irqsave(&host->lock, flags);
|
|
|
- ro = (readl(MSDC_PS) >> 31);
|
|
|
+ ro = (readl(host->base + MSDC_PS) >> 31);
|
|
|
spin_unlock_irqrestore(&host->lock, flags);
|
|
|
}
|
|
|
return ro;
|
|
@@ -1762,7 +1755,6 @@ static int msdc_ops_get_ro(struct mmc_host *mmc)
|
|
|
static int msdc_ops_get_cd(struct mmc_host *mmc)
|
|
|
{
|
|
|
struct msdc_host *host = mmc_priv(mmc);
|
|
|
- void __iomem *base = host->base;
|
|
|
unsigned long flags;
|
|
|
int present = 1;
|
|
|
|
|
@@ -1786,10 +1778,11 @@ static int msdc_ops_get_cd(struct mmc_host *mmc)
|
|
|
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)
|
|
|
- present = (readl(MSDC_PS) & MSDC_PS_CDSTS) ? 0 : 1;
|
|
|
+ present = present ? 0 : 1;
|
|
|
else
|
|
|
- present = (readl(MSDC_PS) & MSDC_PS_CDSTS) ? 1 : 0;
|
|
|
+ present = present ? 1 : 0;
|
|
|
host->card_inserted = present;
|
|
|
#endif
|
|
|
spin_unlock_irqrestore(&host->lock, flags);
|
|
@@ -1816,17 +1809,16 @@ static irqreturn_t msdc_irq(int irq, void *dev_id)
|
|
|
struct msdc_host *host = (struct msdc_host *)dev_id;
|
|
|
struct mmc_data *data = host->data;
|
|
|
struct mmc_command *cmd = host->cmd;
|
|
|
- void __iomem *base = host->base;
|
|
|
|
|
|
u32 cmdsts = MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO | MSDC_INT_CMDRDY |
|
|
|
MSDC_INT_ACMDCRCERR | MSDC_INT_ACMDTMO | MSDC_INT_ACMDRDY |
|
|
|
MSDC_INT_ACMD19_DONE;
|
|
|
u32 datsts = MSDC_INT_DATCRCERR | MSDC_INT_DATTMO;
|
|
|
|
|
|
- u32 intsts = readl(MSDC_INT);
|
|
|
- u32 inten = readl(MSDC_INTEN); inten &= intsts;
|
|
|
+ u32 intsts = readl(host->base + MSDC_INT);
|
|
|
+ u32 inten = readl(host->base + MSDC_INTEN); inten &= intsts;
|
|
|
|
|
|
- writel(intsts, MSDC_INT); /* clear interrupts */
|
|
|
+ writel(intsts, host->base + MSDC_INT); /* clear interrupts */
|
|
|
/* MSG will cause fatal error */
|
|
|
|
|
|
/* card change interrupt */
|
|
@@ -1861,7 +1853,7 @@ static irqreturn_t msdc_irq(int irq, void *dev_id)
|
|
|
IRQ_MSG("XXX CMD<%d> MSDC_INT_DATTMO", host->mrq->cmd->opcode);
|
|
|
data->error = -ETIMEDOUT;
|
|
|
} else if (intsts & MSDC_INT_DATCRCERR) {
|
|
|
- IRQ_MSG("XXX CMD<%d> MSDC_INT_DATCRCERR, SDC_DCRC_STS<0x%x>", host->mrq->cmd->opcode, readl(SDC_DCRC_STS));
|
|
|
+ IRQ_MSG("XXX CMD<%d> MSDC_INT_DATCRCERR, SDC_DCRC_STS<0x%x>", host->mrq->cmd->opcode, readl(host->base + SDC_DCRC_STS));
|
|
|
data->error = -EIO;
|
|
|
}
|
|
|
|
|
@@ -1880,14 +1872,16 @@ static irqreturn_t msdc_irq(int irq, void *dev_id)
|
|
|
case RESP_NONE:
|
|
|
break;
|
|
|
case RESP_R2:
|
|
|
- *rsp++ = readl(SDC_RESP3); *rsp++ = readl(SDC_RESP2);
|
|
|
- *rsp++ = readl(SDC_RESP1); *rsp++ = readl(SDC_RESP0);
|
|
|
+ *rsp++ = readl(host->base + SDC_RESP3);
|
|
|
+ *rsp++ = readl(host->base + SDC_RESP2);
|
|
|
+ *rsp++ = readl(host->base + SDC_RESP1);
|
|
|
+ *rsp++ = readl(host->base + SDC_RESP0);
|
|
|
break;
|
|
|
default: /* Response types 1, 3, 4, 5, 6, 7(1b) */
|
|
|
if ((intsts & MSDC_INT_ACMDRDY) || (intsts & MSDC_INT_ACMD19_DONE))
|
|
|
- *rsp = readl(SDC_ACMD_RESP);
|
|
|
+ *rsp = readl(host->base + SDC_ACMD_RESP);
|
|
|
else
|
|
|
- *rsp = readl(SDC_RESP0);
|
|
|
+ *rsp = readl(host->base + SDC_RESP0);
|
|
|
break;
|
|
|
}
|
|
|
} else if ((intsts & MSDC_INT_RSPCRCERR) || (intsts & MSDC_INT_ACMDCRCERR)) {
|
|
@@ -1911,7 +1905,8 @@ static irqreturn_t msdc_irq(int irq, void *dev_id)
|
|
|
|
|
|
/* mmc irq interrupts */
|
|
|
if (intsts & MSDC_INT_MMCIRQ)
|
|
|
- printk(KERN_INFO "msdc[%d] MMCIRQ: SDC_CSTS=0x%.8x\r\n", host->id, readl(SDC_CSTS));
|
|
|
+ printk(KERN_INFO "msdc[%d] MMCIRQ: SDC_CSTS=0x%.8x\r\n",
|
|
|
+ host->id, readl(host->base + SDC_CSTS));
|
|
|
|
|
|
#ifdef MT6575_SD_DEBUG
|
|
|
{
|
|
@@ -1951,7 +1946,6 @@ static irqreturn_t msdc_irq(int irq, void *dev_id)
|
|
|
static void msdc_enable_cd_irq(struct msdc_host *host, int enable)
|
|
|
{
|
|
|
struct msdc_hw *hw = host->hw;
|
|
|
- void __iomem *base = host->base;
|
|
|
|
|
|
/* for sdio, not set */
|
|
|
if ((hw->flags & MSDC_CD_PIN_EN) == 0) {
|
|
@@ -1960,9 +1954,9 @@ static void msdc_enable_cd_irq(struct msdc_host *host, int enable)
|
|
|
if (hw->config_gpio_pin)
|
|
|
hw->config_gpio_pin(MSDC_CD_PIN, GPIO_PULL_DOWN);
|
|
|
*/
|
|
|
- sdr_clr_bits(MSDC_PS, MSDC_PS_CDEN);
|
|
|
- sdr_clr_bits(MSDC_INTEN, MSDC_INTEN_CDSC);
|
|
|
- sdr_clr_bits(SDC_CFG, SDC_CFG_INSWKUP);
|
|
|
+ sdr_clr_bits(host->base + MSDC_PS, MSDC_PS_CDEN);
|
|
|
+ sdr_clr_bits(host->base + MSDC_INTEN, MSDC_INTEN_CDSC);
|
|
|
+ sdr_clr_bits(host->base + SDC_CFG, SDC_CFG_INSWKUP);
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -1978,17 +1972,20 @@ static void msdc_enable_cd_irq(struct msdc_host *host, int enable)
|
|
|
if (hw->config_gpio_pin) /* NULL */
|
|
|
hw->config_gpio_pin(MSDC_CD_PIN, GPIO_PULL_UP);
|
|
|
|
|
|
- sdr_set_field(MSDC_PS, MSDC_PS_CDDEBOUNCE, DEFAULT_DEBOUNCE);
|
|
|
- sdr_set_bits(MSDC_PS, MSDC_PS_CDEN);
|
|
|
- sdr_set_bits(MSDC_INTEN, MSDC_INTEN_CDSC);
|
|
|
- sdr_set_bits(SDC_CFG, SDC_CFG_INSWKUP); /* not in document! Fix me */
|
|
|
+ sdr_set_field(host->base + MSDC_PS, MSDC_PS_CDDEBOUNCE,
|
|
|
+ DEFAULT_DEBOUNCE);
|
|
|
+ sdr_set_bits(host->base + MSDC_PS, MSDC_PS_CDEN);
|
|
|
+ sdr_set_bits(host->base + MSDC_INTEN, MSDC_INTEN_CDSC);
|
|
|
+
|
|
|
+ /* not in document! Fix me */
|
|
|
+ sdr_set_bits(host->base + SDC_CFG, SDC_CFG_INSWKUP);
|
|
|
} else {
|
|
|
if (hw->config_gpio_pin) /* NULL */
|
|
|
hw->config_gpio_pin(MSDC_CD_PIN, GPIO_PULL_DOWN);
|
|
|
|
|
|
- sdr_clr_bits(SDC_CFG, SDC_CFG_INSWKUP);
|
|
|
- sdr_clr_bits(MSDC_PS, MSDC_PS_CDEN);
|
|
|
- sdr_clr_bits(MSDC_INTEN, MSDC_INTEN_CDSC);
|
|
|
+ sdr_clr_bits(host->base + SDC_CFG, SDC_CFG_INSWKUP);
|
|
|
+ sdr_clr_bits(host->base + MSDC_PS, MSDC_PS_CDEN);
|
|
|
+ sdr_clr_bits(host->base + MSDC_INTEN, MSDC_INTEN_CDSC);
|
|
|
|
|
|
/* Here decreases a reference count to core power since card
|
|
|
* detection circuit is shutdown.
|
|
@@ -2000,7 +1997,6 @@ static void msdc_enable_cd_irq(struct msdc_host *host, int enable)
|
|
|
/* called by msdc_drv_probe */
|
|
|
static void msdc_init_hw(struct msdc_host *host)
|
|
|
{
|
|
|
- void __iomem *base = host->base;
|
|
|
|
|
|
/* Power on */
|
|
|
#if 0 /* --- by chhung */
|
|
@@ -2011,41 +2007,51 @@ static void msdc_init_hw(struct msdc_host *host)
|
|
|
msdc_vdd_on(host);
|
|
|
#endif /* end of --- */
|
|
|
/* Configure to MMC/SD mode */
|
|
|
- sdr_set_field(MSDC_CFG, MSDC_CFG_MODE, MSDC_SDMMC);
|
|
|
+ sdr_set_field(host->base + MSDC_CFG, MSDC_CFG_MODE, MSDC_SDMMC);
|
|
|
|
|
|
/* Reset */
|
|
|
msdc_reset_hw(host);
|
|
|
msdc_clr_fifo(host);
|
|
|
|
|
|
/* Disable card detection */
|
|
|
- sdr_clr_bits(MSDC_PS, MSDC_PS_CDEN);
|
|
|
+ sdr_clr_bits(host->base + MSDC_PS, MSDC_PS_CDEN);
|
|
|
|
|
|
/* Disable and clear all interrupts */
|
|
|
- sdr_clr_bits(MSDC_INTEN, readl(MSDC_INTEN));
|
|
|
- writel(readl(MSDC_INT), MSDC_INT);
|
|
|
+ sdr_clr_bits(host->base + MSDC_INTEN, readl(host->base + MSDC_INTEN));
|
|
|
+ writel(readl(host->base + MSDC_INT), host->base + MSDC_INT);
|
|
|
|
|
|
#if 1
|
|
|
/* reset tuning parameter */
|
|
|
- writel(0x00090000, MSDC_PAD_CTL0);
|
|
|
- writel(0x000A0000, MSDC_PAD_CTL1);
|
|
|
- writel(0x000A0000, MSDC_PAD_CTL2);
|
|
|
- // writel( 0x00000000, MSDC_PAD_TUNE);
|
|
|
- writel(0x84101010, MSDC_PAD_TUNE); // for MT7620 E2 and afterward
|
|
|
- // writel(0x00000000, MSDC_DAT_RDDLY0);
|
|
|
- writel(0x10101010, MSDC_DAT_RDDLY0); // for MT7620 E2 and afterward
|
|
|
- writel(0x00000000, MSDC_DAT_RDDLY1);
|
|
|
- writel(0x00000000, MSDC_IOCON);
|
|
|
+ writel(0x00090000, host->base + MSDC_PAD_CTL0);
|
|
|
+ writel(0x000A0000, host->base + MSDC_PAD_CTL1);
|
|
|
+ writel(0x000A0000, host->base + MSDC_PAD_CTL2);
|
|
|
+ // writel( 0x00000000, host->base + MSDC_PAD_TUNE);
|
|
|
+
|
|
|
+ // for MT7620 E2 and afterward
|
|
|
+ writel(0x84101010, host->base + MSDC_PAD_TUNE);
|
|
|
+
|
|
|
+ // writel(0x00000000, host->base + MSDC_DAT_RDDLY0);
|
|
|
+
|
|
|
+ // for MT7620 E2 and afterward
|
|
|
+ writel(0x10101010, host->base + MSDC_DAT_RDDLY0);
|
|
|
+
|
|
|
+ writel(0x00000000, host->base + MSDC_DAT_RDDLY1);
|
|
|
+ writel(0x00000000, host->base + MSDC_IOCON);
|
|
|
#if 0 // use MT7620 default value: 0x403c004f
|
|
|
- writel(0x003C000F, MSDC_PATCH_BIT0); /* bit0 modified: Rx Data Clock Source: 1 -> 2.0*/
|
|
|
+ /* bit0 modified: Rx Data Clock Source: 1 -> 2.0*/
|
|
|
+ writel(0x003C000F, host->base + MSDC_PATCH_BIT0);
|
|
|
#endif
|
|
|
|
|
|
- if (readl(MSDC_ECO_VER) >= 4) {
|
|
|
+ if (readl(host->base + MSDC_ECO_VER) >= 4) {
|
|
|
if (host->id == 1) {
|
|
|
- sdr_set_field(MSDC_PATCH_BIT1, MSDC_PATCH_BIT1_WRDAT_CRCS, 1);
|
|
|
- sdr_set_field(MSDC_PATCH_BIT1, MSDC_PATCH_BIT1_CMD_RSP, 1);
|
|
|
+ sdr_set_field(host->base + MSDC_PATCH_BIT1,
|
|
|
+ MSDC_PATCH_BIT1_WRDAT_CRCS, 1);
|
|
|
+ sdr_set_field(host->base + MSDC_PATCH_BIT1,
|
|
|
+ MSDC_PATCH_BIT1_CMD_RSP, 1);
|
|
|
|
|
|
/* internal clock: latch read data */
|
|
|
- sdr_set_bits(MSDC_PATCH_BIT0, MSDC_PATCH_BIT_CKGEN_CK);
|
|
|
+ sdr_set_bits(host->base + MSDC_PATCH_BIT0,
|
|
|
+ MSDC_PATCH_BIT_CKGEN_CK);
|
|
|
}
|
|
|
}
|
|
|
#endif
|
|
@@ -2054,40 +2060,40 @@ static void msdc_init_hw(struct msdc_host *host)
|
|
|
pre-loader,uboot,kernel drivers. and SDC_CFG.SDIO_INT_DET_EN will be only
|
|
|
set when kernel driver wants to use SDIO bus interrupt */
|
|
|
/* Configure to enable SDIO mode. it's must otherwise sdio cmd5 failed */
|
|
|
- sdr_set_bits(SDC_CFG, SDC_CFG_SDIO);
|
|
|
+ sdr_set_bits(host->base + SDC_CFG, SDC_CFG_SDIO);
|
|
|
|
|
|
/* disable detect SDIO device interupt function */
|
|
|
- sdr_clr_bits(SDC_CFG, SDC_CFG_SDIOIDE);
|
|
|
+ sdr_clr_bits(host->base + SDC_CFG, SDC_CFG_SDIOIDE);
|
|
|
|
|
|
/* eneable SMT for glitch filter */
|
|
|
- sdr_set_bits(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKSMT);
|
|
|
- sdr_set_bits(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDSMT);
|
|
|
- sdr_set_bits(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATSMT);
|
|
|
+ sdr_set_bits(host->base + MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKSMT);
|
|
|
+ sdr_set_bits(host->base + MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDSMT);
|
|
|
+ sdr_set_bits(host->base + MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATSMT);
|
|
|
|
|
|
#if 1
|
|
|
/* set clk, cmd, dat pad driving */
|
|
|
- sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVN, 4);
|
|
|
- sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVP, 4);
|
|
|
- sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVN, 4);
|
|
|
- sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVP, 4);
|
|
|
- sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVN, 4);
|
|
|
- sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVP, 4);
|
|
|
+ sdr_set_field(host->base + MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVN, 4);
|
|
|
+ sdr_set_field(host->base + MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVP, 4);
|
|
|
+ sdr_set_field(host->base + MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVN, 4);
|
|
|
+ sdr_set_field(host->base + MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVP, 4);
|
|
|
+ sdr_set_field(host->base + MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVN, 4);
|
|
|
+ sdr_set_field(host->base + MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVP, 4);
|
|
|
#else
|
|
|
- sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVN, 0);
|
|
|
- sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVP, 0);
|
|
|
- sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVN, 0);
|
|
|
- sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVP, 0);
|
|
|
- sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVN, 0);
|
|
|
- sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVP, 0);
|
|
|
+ sdr_set_field(host->base + MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVN, 0);
|
|
|
+ sdr_set_field(host->base + MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVP, 0);
|
|
|
+ sdr_set_field(host->base + MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVN, 0);
|
|
|
+ sdr_set_field(host->base + MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVP, 0);
|
|
|
+ sdr_set_field(host->base + MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVN, 0);
|
|
|
+ sdr_set_field(host->base + MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVP, 0);
|
|
|
#endif
|
|
|
|
|
|
/* set sampling edge */
|
|
|
|
|
|
/* write crc timeout detection */
|
|
|
- sdr_set_field(MSDC_PATCH_BIT0, 1 << 30, 1);
|
|
|
+ sdr_set_field(host->base + MSDC_PATCH_BIT0, 1 << 30, 1);
|
|
|
|
|
|
/* Configure to default data timeout */
|
|
|
- sdr_set_field(SDC_CFG, SDC_CFG_DTOC, DEFAULT_DTOC);
|
|
|
+ sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, DEFAULT_DTOC);
|
|
|
|
|
|
msdc_set_buswidth(host, MMC_BUS_WIDTH_1);
|
|
|
|
|
@@ -2097,11 +2103,9 @@ static void msdc_init_hw(struct msdc_host *host)
|
|
|
/* called by msdc_drv_remove */
|
|
|
static void msdc_deinit_hw(struct msdc_host *host)
|
|
|
{
|
|
|
- void __iomem *base = host->base;
|
|
|
-
|
|
|
/* Disable and clear all interrupts */
|
|
|
- sdr_clr_bits(MSDC_INTEN, readl(MSDC_INTEN));
|
|
|
- writel(readl(MSDC_INT), MSDC_INT);
|
|
|
+ sdr_clr_bits(host->base + MSDC_INTEN, readl(host->base + MSDC_INTEN));
|
|
|
+ writel(readl(host->base + MSDC_INT), host->base + MSDC_INT);
|
|
|
|
|
|
/* Disable card detection */
|
|
|
msdc_enable_cd_irq(host, 0);
|