mirror of
https://github.com/armbian/linux.git
synced 2026-01-06 10:13:00 -08:00
SDMMC: gather each reset code into functions
This commit is contained in:
@@ -121,6 +121,10 @@ static const u8 tuning_blk_pattern_8bit[] = {
|
||||
0xff, 0x77, 0x77, 0xff, 0x77, 0xbb, 0xdd, 0xee,
|
||||
};
|
||||
|
||||
static inline bool dw_mci_fifo_reset(struct dw_mci *host);
|
||||
static inline bool dw_mci_ctrl_all_reset(struct dw_mci *host);
|
||||
static bool dw_mci_ctrl_reset(struct dw_mci *host, u32 reset);
|
||||
|
||||
/*printk the all register of current host*/
|
||||
static int dw_mci_regs_printk(struct dw_mci *host)
|
||||
{
|
||||
@@ -728,10 +732,8 @@ static int dw_mci_submit_data_dma(struct dw_mci *host, struct mmc_data *data)
|
||||
if (host->prev_blksz != data->blksz)
|
||||
dw_mci_adjust_fifoth(host, data);
|
||||
|
||||
/* Reset DMA FIFO*/
|
||||
temp = mci_readl(host, CTRL);
|
||||
temp |= (SDMMC_CTRL_DMA_RESET | SDMMC_CTRL_FIFO_RESET);
|
||||
mci_writel(host, CTRL, temp);
|
||||
/* Reset DMA FIFO*/
|
||||
dw_mci_ctrl_reset(host, SDMMC_CTRL_DMA_RESET);// | SDMMC_CTRL_FIFO_RESET); //dange to fifo-reset; noted by xbw,at 2014-03-28
|
||||
|
||||
/* Enable the DMA interface */
|
||||
temp = mci_readl(host, CTRL);
|
||||
@@ -759,9 +761,7 @@ static void dw_mci_submit_data(struct dw_mci *host, struct mmc_data *data)
|
||||
host->data = data;
|
||||
|
||||
/* Reset FIFO*/
|
||||
temp = mci_readl(host, CTRL);
|
||||
temp |= (SDMMC_CTRL_DMA_RESET | SDMMC_CTRL_FIFO_RESET);
|
||||
mci_writel(host, CTRL, temp);
|
||||
dw_mci_ctrl_reset(host, SDMMC_CTRL_DMA_RESET);// | SDMMC_CTRL_FIFO_RESET);//dange to fifo-reset; noted by xbw,at 2014-03-28
|
||||
|
||||
if (data->flags & MMC_DATA_READ) {
|
||||
host->dir_status = DW_MCI_RECV_STATUS;
|
||||
@@ -923,7 +923,8 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot, bool force_clkinit)
|
||||
}
|
||||
|
||||
static void dw_mci_wait_unbusy(struct dw_mci *host)
|
||||
{
|
||||
{
|
||||
|
||||
unsigned int timeout= SDMMC_DATA_TIMEOUT_SDIO;
|
||||
unsigned long time_loop;
|
||||
unsigned int status;
|
||||
@@ -1622,11 +1623,7 @@ static void dw_mci_tasklet_func(unsigned long priv)
|
||||
* generates a block interrupt, hence setting
|
||||
* the scatter-gather pointer to NULL.
|
||||
*/
|
||||
*/
|
||||
sg_miter_stop(&host->sg_miter);
|
||||
host->sg = NULL;
|
||||
ctrl = mci_readl(host, CTRL);
|
||||
ctrl |= SDMMC_CTRL_FIFO_RESET;
|
||||
dw_mci_fifo_reset(host);
|
||||
} else {
|
||||
data->bytes_xfered = data->blocks * data->blksz;
|
||||
data->error = 0;
|
||||
@@ -1674,11 +1671,7 @@ static void dw_mci_tasklet_func(unsigned long priv)
|
||||
|
||||
/* CMD error in data command */
|
||||
if (host->mrq->cmd->error && host->mrq->data) {
|
||||
if (host->mrq->cmd->error && host->mrq->data) {
|
||||
sg_miter_stop(&host->sg_miter);
|
||||
host->sg = NULL;
|
||||
ctrl = mci_readl(host, CTRL);
|
||||
ctrl |= SDMMC_CTRL_FIFO_RESET;
|
||||
dw_mci_fifo_reset(host);
|
||||
}
|
||||
|
||||
host->cmd = NULL;
|
||||
@@ -2314,13 +2307,7 @@ static void dw_mci_work_routine_card(struct work_struct *work)
|
||||
* block interrupt, hence setting the
|
||||
* scatter-gather pointer to NULL.
|
||||
*/
|
||||
*/
|
||||
sg_miter_stop(&host->sg_miter);
|
||||
host->sg = NULL;
|
||||
|
||||
ctrl = mci_readl(host, CTRL);
|
||||
ctrl |= SDMMC_CTRL_FIFO_RESET;
|
||||
mci_writel(host, CTRL, ctrl);
|
||||
dw_mci_fifo_reset(host);
|
||||
#ifdef CONFIG_MMC_DW_IDMAC
|
||||
dw_mci_idmac_reset(host);
|
||||
#endif
|
||||
@@ -2755,27 +2742,51 @@ no_dma:
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static bool dw_mci_ctrl_reset(struct dw_mci *host, u32 reset)
|
||||
{
|
||||
unsigned long timeout = jiffies + msecs_to_jiffies(500);
|
||||
unsigned long timeout = jiffies + msecs_to_jiffies(500);
|
||||
u32 ctrl;
|
||||
|
||||
|
||||
mci_writel(host, CTRL, (SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET |
|
||||
ctrl = mci_readl(host, CTRL);
|
||||
ctrl |= reset;
|
||||
mci_writel(host, CTRL, ctrl);
|
||||
|
||||
/* wait till resets clear */
|
||||
do {
|
||||
ctrl = mci_readl(host, CTRL);
|
||||
ctrl = mci_readl(host, CTRL);
|
||||
if (!(ctrl & (SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET |
|
||||
if (!(ctrl & reset))
|
||||
return true;
|
||||
} while (time_before(jiffies, timeout));
|
||||
|
||||
|
||||
dev_err(host->dev,
|
||||
"Timeout resetting block (ctrl reset %#x)\n",
|
||||
ctrl & reset);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool dw_mci_fifo_reset(struct dw_mci *host)
|
||||
{
|
||||
/*
|
||||
* Reseting generates a block interrupt, hence setting
|
||||
* the scatter-gather pointer to NULL.
|
||||
*/
|
||||
if (host->sg) {
|
||||
sg_miter_stop(&host->sg_miter);
|
||||
host->sg = NULL;
|
||||
}
|
||||
|
||||
return dw_mci_ctrl_reset(host, SDMMC_CTRL_FIFO_RESET);
|
||||
}
|
||||
|
||||
static inline bool dw_mci_ctrl_all_reset(struct dw_mci *host)
|
||||
{
|
||||
return dw_mci_ctrl_reset(host,
|
||||
SDMMC_CTRL_FIFO_RESET |
|
||||
SDMMC_CTRL_RESET |
|
||||
SDMMC_CTRL_DMA_RESET);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static struct dw_mci_of_quirks {
|
||||
char *quirk;
|
||||
@@ -2960,7 +2971,7 @@ int dw_mci_probe(struct dw_mci *host)
|
||||
}
|
||||
|
||||
/* Reset all blocks */
|
||||
/* Reset all blocks */
|
||||
if (!dw_mci_ctrl_all_reset(host))
|
||||
return -ENODEV;
|
||||
|
||||
host->dma_ops = host->pdata->dma_ops;
|
||||
@@ -3155,7 +3166,7 @@ int dw_mci_resume(struct dw_mci *host)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!dw_mci_ctrl_all_reset(host)) {
|
||||
ret = -ENODEV;
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user