mirror of https://gitee.com/openkylin/linux.git
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: Addy Ke <addy.ke@rock-chips.com> Reviewed-by: Doug Anderson <dianders@chromium.org> Acked-by: Jaehoon Chung <jh80.chung@samsung.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
3c583f70a8
commit
767562348b
|
@ -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 = {
|
||||
.prepare_command = dw_mci_rockchip_prepare_command,
|
||||
.init = dw_mci_rockchip_init,
|
||||
};
|
||||
|
||||
static const struct dw_mci_drv_data rk3288_drv_data = {
|
||||
.prepare_command = dw_mci_rockchip_prepare_command,
|
||||
.set_ios = dw_mci_rk3288_set_ios,
|
||||
.setup_clock = dw_mci_rk3288_setup_clock,
|
||||
.init = dw_mci_rockchip_init,
|
||||
};
|
||||
|
||||
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)
|
|||
|
||||
/* enable clock; only low power if no SDIO */
|
||||
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;
|
||||
mci_writel(host, CLKENA, clk_en_a);
|
||||
|
||||
|
@ -1280,10 +1280,10 @@ static void dw_mci_enable_sdio_irq(struct mmc_host *mmc, int enb)
|
|||
dw_mci_disable_low_power(slot);
|
||||
|
||||
mci_writel(host, INTMASK,
|
||||
(int_mask | SDMMC_INT_SDIO(slot->id)));
|
||||
(int_mask | SDMMC_INT_SDIO(slot->sdio_id)));
|
||||
} else {
|
||||
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)
|
|||
/* Handle SDIO Interrupts */
|
||||
for (i = 0; i < host->num_slots; i++) {
|
||||
struct dw_mci_slot *slot = host->slot[i];
|
||||
if (pending & SDMMC_INT_SDIO(i)) {
|
||||
mci_writel(host, RINTSTS, SDMMC_INT_SDIO(i));
|
||||
if (pending & SDMMC_INT_SDIO(slot->sdio_id)) {
|
||||
mci_writel(host, RINTSTS,
|
||||
SDMMC_INT_SDIO(slot->sdio_id));
|
||||
mmc_signal_sdio_irq(slot->mmc);
|
||||
}
|
||||
}
|
||||
|
@ -2252,6 +2253,7 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id)
|
|||
|
||||
slot = mmc_priv(mmc);
|
||||
slot->id = id;
|
||||
slot->sdio_id = host->sdio_id0 + id;
|
||||
slot->mmc = mmc;
|
||||
slot->host = host;
|
||||
host->slot[id] = slot;
|
||||
|
|
|
@ -225,6 +225,7 @@ extern int dw_mci_resume(struct dw_mci *host);
|
|||
* with CONFIG_MMC_CLKGATE.
|
||||
* @flags: Random state bits associated with the slot.
|
||||
* @id: Number of this slot.
|
||||
* @sdio_id: Number of this slot in the SDIO interrupt registers.
|
||||
*/
|
||||
struct dw_mci_slot {
|
||||
struct mmc_host *mmc;
|
||||
|
@ -244,6 +245,7 @@ struct dw_mci_slot {
|
|||
#define DW_MMC_CARD_PRESENT 0
|
||||
#define DW_MMC_CARD_NEED_INIT 1
|
||||
int id;
|
||||
int sdio_id;
|
||||
};
|
||||
|
||||
struct dw_mci_tuning_data {
|
||||
|
|
|
@ -97,6 +97,7 @@ struct mmc_data;
|
|||
* @quirks: Set of quirks that apply to specific versions of the IP.
|
||||
* @irq_flags: The flags 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
|
||||
* =======
|
||||
|
@ -193,6 +194,8 @@ struct dw_mci {
|
|||
bool vqmmc_enabled;
|
||||
unsigned long irq_flags; /* IRQ flags */
|
||||
int irq;
|
||||
|
||||
int sdio_id0;
|
||||
};
|
||||
|
||||
/* DMA ops for Internal/External DMAC interface */
|
||||
|
|
Loading…
Reference in New Issue