mmc: tmio: add TMIO_MMC_SDIO_STATUS_QUIRK
Renesas R-Car SDHI should set reserved bits on CTL_SDIO_STATUS register when writing. This patch adds new TMIO_MMC_SDIO_STATUS_QUIRK flags for this purpose [Kuninori Morimoto: tidyuped for upstreaming enabled this flags for all SH-Mobile/R-Car] Tested-by: Nguyen Xuan Nui <nx-nui@jinso.co.jp> Tested-by: Hiep Cao Minh <cm-hiep@jinso.co.jp> Signed-off-by: Shinobu Uehara <shinobu.uehara.xc@renesas.com> Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
Родитель
b8d11962c2
Коммит
6b98757e53
|
@ -230,6 +230,11 @@ static int sh_mobile_sdhi_probe(struct platform_device *pdev)
|
||||||
*/
|
*/
|
||||||
mmc_data->flags |= TMIO_MMC_HAVE_CMD12_CTRL;
|
mmc_data->flags |= TMIO_MMC_HAVE_CMD12_CTRL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* All SDHI need SDIO_INFO1 reserved bit
|
||||||
|
*/
|
||||||
|
mmc_data->flags |= TMIO_MMC_SDIO_STATUS_QUIRK;
|
||||||
|
|
||||||
if (of_id && of_id->data) {
|
if (of_id && of_id->data) {
|
||||||
const struct sh_mobile_sdhi_of_data *of_data = of_id->data;
|
const struct sh_mobile_sdhi_of_data *of_data = of_id->data;
|
||||||
mmc_data->flags |= of_data->tmio_flags;
|
mmc_data->flags |= of_data->tmio_flags;
|
||||||
|
|
|
@ -665,6 +665,7 @@ irqreturn_t tmio_mmc_sdio_irq(int irq, void *devid)
|
||||||
struct mmc_host *mmc = host->mmc;
|
struct mmc_host *mmc = host->mmc;
|
||||||
struct tmio_mmc_data *pdata = host->pdata;
|
struct tmio_mmc_data *pdata = host->pdata;
|
||||||
unsigned int ireg, status;
|
unsigned int ireg, status;
|
||||||
|
unsigned int sdio_status;
|
||||||
|
|
||||||
if (!(pdata->flags & TMIO_MMC_SDIO_IRQ))
|
if (!(pdata->flags & TMIO_MMC_SDIO_IRQ))
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
|
@ -672,7 +673,11 @@ irqreturn_t tmio_mmc_sdio_irq(int irq, void *devid)
|
||||||
status = sd_ctrl_read16(host, CTL_SDIO_STATUS);
|
status = sd_ctrl_read16(host, CTL_SDIO_STATUS);
|
||||||
ireg = status & TMIO_SDIO_MASK_ALL & ~host->sdcard_irq_mask;
|
ireg = status & TMIO_SDIO_MASK_ALL & ~host->sdcard_irq_mask;
|
||||||
|
|
||||||
sd_ctrl_write16(host, CTL_SDIO_STATUS, status & ~TMIO_SDIO_MASK_ALL);
|
sdio_status = status & ~TMIO_SDIO_MASK_ALL;
|
||||||
|
if (pdata->flags & TMIO_MMC_SDIO_STATUS_QUIRK)
|
||||||
|
sdio_status |= 6;
|
||||||
|
|
||||||
|
sd_ctrl_write16(host, CTL_SDIO_STATUS, sdio_status);
|
||||||
|
|
||||||
if (mmc->caps & MMC_CAP_SDIO_IRQ && ireg & TMIO_SDIO_STAT_IOIRQ)
|
if (mmc->caps & MMC_CAP_SDIO_IRQ && ireg & TMIO_SDIO_STAT_IOIRQ)
|
||||||
mmc_signal_sdio_irq(mmc);
|
mmc_signal_sdio_irq(mmc);
|
||||||
|
|
|
@ -89,6 +89,11 @@
|
||||||
*/
|
*/
|
||||||
#define TMIO_MMC_HAVE_CMD12_CTRL (1 << 7)
|
#define TMIO_MMC_HAVE_CMD12_CTRL (1 << 7)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some controllers needs to set 1 on SDIO status reserved bits
|
||||||
|
*/
|
||||||
|
#define TMIO_MMC_SDIO_STATUS_QUIRK (1 << 8)
|
||||||
|
|
||||||
int tmio_core_mmc_enable(void __iomem *cnf, int shift, unsigned long base);
|
int tmio_core_mmc_enable(void __iomem *cnf, int shift, unsigned long base);
|
||||||
int tmio_core_mmc_resume(void __iomem *cnf, int shift, unsigned long base);
|
int tmio_core_mmc_resume(void __iomem *cnf, int shift, unsigned long base);
|
||||||
void tmio_core_mmc_pwr(void __iomem *cnf, int shift, int state);
|
void tmio_core_mmc_pwr(void __iomem *cnf, int shift, int state);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче