提交 76756234 编写于 作者: A Addy Ke 提交者: Ulf Hansson

mmc: dw_mmc: add support for the other bit of sdio interrupt

The bit of sdio interrupt is 16 in designware implementation,
but it is 24 on Rockchip SoCs.This patch add sdio_id0 for the
number of slot0 in the SDIO interrupt registers.
Signed-off-by: NAddy Ke <addy.ke@rock-chips.com>
Reviewed-by: NDoug Anderson <dianders@chromium.org>
Acked-by: NJaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
上级 3c583f70
...@@ -68,14 +68,24 @@ static void dw_mci_rk3288_set_ios(struct dw_mci *host, struct mmc_ios *ios) ...@@ -68,14 +68,24 @@ static void dw_mci_rk3288_set_ios(struct dw_mci *host, struct mmc_ios *ios)
} }
} }
static int dw_mci_rockchip_init(struct dw_mci *host)
{
/* It is slot 8 on Rockchip SoCs */
host->sdio_id0 = 8;
return 0;
}
static const struct dw_mci_drv_data rk2928_drv_data = { static const struct dw_mci_drv_data rk2928_drv_data = {
.prepare_command = dw_mci_rockchip_prepare_command, .prepare_command = dw_mci_rockchip_prepare_command,
.init = dw_mci_rockchip_init,
}; };
static const struct dw_mci_drv_data rk3288_drv_data = { static const struct dw_mci_drv_data rk3288_drv_data = {
.prepare_command = dw_mci_rockchip_prepare_command, .prepare_command = dw_mci_rockchip_prepare_command,
.set_ios = dw_mci_rk3288_set_ios, .set_ios = dw_mci_rk3288_set_ios,
.setup_clock = dw_mci_rk3288_setup_clock, .setup_clock = dw_mci_rk3288_setup_clock,
.init = dw_mci_rockchip_init,
}; };
static const struct of_device_id dw_mci_rockchip_match[] = { static const struct of_device_id dw_mci_rockchip_match[] = {
......
...@@ -919,7 +919,7 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot, bool force_clkinit) ...@@ -919,7 +919,7 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot, bool force_clkinit)
/* enable clock; only low power if no SDIO */ /* enable clock; only low power if no SDIO */
clk_en_a = SDMMC_CLKEN_ENABLE << slot->id; clk_en_a = SDMMC_CLKEN_ENABLE << slot->id;
if (!(mci_readl(host, INTMASK) & SDMMC_INT_SDIO(slot->id))) if (!(mci_readl(host, INTMASK) & SDMMC_INT_SDIO(slot->sdio_id)))
clk_en_a |= SDMMC_CLKEN_LOW_PWR << slot->id; clk_en_a |= SDMMC_CLKEN_LOW_PWR << slot->id;
mci_writel(host, CLKENA, clk_en_a); mci_writel(host, CLKENA, clk_en_a);
...@@ -1280,10 +1280,10 @@ static void dw_mci_enable_sdio_irq(struct mmc_host *mmc, int enb) ...@@ -1280,10 +1280,10 @@ static void dw_mci_enable_sdio_irq(struct mmc_host *mmc, int enb)
dw_mci_disable_low_power(slot); dw_mci_disable_low_power(slot);
mci_writel(host, INTMASK, mci_writel(host, INTMASK,
(int_mask | SDMMC_INT_SDIO(slot->id))); (int_mask | SDMMC_INT_SDIO(slot->sdio_id)));
} else { } else {
mci_writel(host, INTMASK, mci_writel(host, INTMASK,
(int_mask & ~SDMMC_INT_SDIO(slot->id))); (int_mask & ~SDMMC_INT_SDIO(slot->sdio_id)));
} }
} }
...@@ -2152,8 +2152,9 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id) ...@@ -2152,8 +2152,9 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id)
/* Handle SDIO Interrupts */ /* Handle SDIO Interrupts */
for (i = 0; i < host->num_slots; i++) { for (i = 0; i < host->num_slots; i++) {
struct dw_mci_slot *slot = host->slot[i]; struct dw_mci_slot *slot = host->slot[i];
if (pending & SDMMC_INT_SDIO(i)) { if (pending & SDMMC_INT_SDIO(slot->sdio_id)) {
mci_writel(host, RINTSTS, SDMMC_INT_SDIO(i)); mci_writel(host, RINTSTS,
SDMMC_INT_SDIO(slot->sdio_id));
mmc_signal_sdio_irq(slot->mmc); mmc_signal_sdio_irq(slot->mmc);
} }
} }
...@@ -2252,6 +2253,7 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id) ...@@ -2252,6 +2253,7 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id)
slot = mmc_priv(mmc); slot = mmc_priv(mmc);
slot->id = id; slot->id = id;
slot->sdio_id = host->sdio_id0 + id;
slot->mmc = mmc; slot->mmc = mmc;
slot->host = host; slot->host = host;
host->slot[id] = slot; host->slot[id] = slot;
......
...@@ -225,6 +225,7 @@ extern int dw_mci_resume(struct dw_mci *host); ...@@ -225,6 +225,7 @@ extern int dw_mci_resume(struct dw_mci *host);
* with CONFIG_MMC_CLKGATE. * with CONFIG_MMC_CLKGATE.
* @flags: Random state bits associated with the slot. * @flags: Random state bits associated with the slot.
* @id: Number of this slot. * @id: Number of this slot.
* @sdio_id: Number of this slot in the SDIO interrupt registers.
*/ */
struct dw_mci_slot { struct dw_mci_slot {
struct mmc_host *mmc; struct mmc_host *mmc;
...@@ -244,6 +245,7 @@ struct dw_mci_slot { ...@@ -244,6 +245,7 @@ struct dw_mci_slot {
#define DW_MMC_CARD_PRESENT 0 #define DW_MMC_CARD_PRESENT 0
#define DW_MMC_CARD_NEED_INIT 1 #define DW_MMC_CARD_NEED_INIT 1
int id; int id;
int sdio_id;
}; };
struct dw_mci_tuning_data { struct dw_mci_tuning_data {
......
...@@ -97,6 +97,7 @@ struct mmc_data; ...@@ -97,6 +97,7 @@ struct mmc_data;
* @quirks: Set of quirks that apply to specific versions of the IP. * @quirks: Set of quirks that apply to specific versions of the IP.
* @irq_flags: The flags to be passed to request_irq. * @irq_flags: The flags to be passed to request_irq.
* @irq: The irq value to be passed to request_irq. * @irq: The irq value to be passed to request_irq.
* @sdio_id0: Number of slot0 in the SDIO interrupt registers.
* *
* Locking * Locking
* ======= * =======
...@@ -193,6 +194,8 @@ struct dw_mci { ...@@ -193,6 +194,8 @@ struct dw_mci {
bool vqmmc_enabled; bool vqmmc_enabled;
unsigned long irq_flags; /* IRQ flags */ unsigned long irq_flags; /* IRQ flags */
int irq; int irq;
int sdio_id0;
}; };
/* DMA ops for Internal/External DMAC interface */ /* DMA ops for Internal/External DMAC interface */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册