| From 6d486e15c159342dfd97f9b198c856b61e51ff4a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 21 Sep 2021 14:00:25 +0300 |
| Subject: mmc: sdhci-omap: Fix NULL pointer exception if regulator is not |
| configured |
| |
| From: Tony Lindgren <tony@atomide.com> |
| |
| [ Upstream commit 8e0e7bd38b1ec7f9e5d18725ad41828be4e09859 ] |
| |
| If sdhci-omap is configured for an unused device instance and the device |
| is not set as disabled, we can get a NULL pointer dereference: |
| |
| Unable to handle kernel NULL pointer dereference at virtual address |
| 00000045 |
| ... |
| (regulator_set_voltage) from [<c07d7008>] (mmc_regulator_set_ocr+0x44/0xd0) |
| (mmc_regulator_set_ocr) from [<c07e2d80>] (sdhci_set_ios+0xa4/0x490) |
| (sdhci_set_ios) from [<c07ea690>] (sdhci_omap_set_ios+0x124/0x160) |
| (sdhci_omap_set_ios) from [<c07c8e94>] (mmc_power_up.part.0+0x3c/0x154) |
| (mmc_power_up.part.0) from [<c07c9d20>] (mmc_start_host+0x88/0x9c) |
| (mmc_start_host) from [<c07cad34>] (mmc_add_host+0x58/0x7c) |
| (mmc_add_host) from [<c07e2574>] (__sdhci_add_host+0xf0/0x22c) |
| (__sdhci_add_host) from [<c07eaf68>] (sdhci_omap_probe+0x318/0x72c) |
| (sdhci_omap_probe) from [<c06a39d8>] (platform_probe+0x58/0xb8) |
| |
| AFAIK we are not seeing this with the devices configured in the mainline |
| kernel but this can cause issues for folks bringing up their boards. |
| |
| Fixes: 7d326930d352 ("mmc: sdhci-omap: Add OMAP SDHCI driver") |
| Signed-off-by: Tony Lindgren <tony@atomide.com> |
| Link: https://lore.kernel.org/r/20210921110029.21944-2-tony@atomide.com |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/mmc/host/sdhci-omap.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/mmc/host/sdhci-omap.c b/drivers/mmc/host/sdhci-omap.c |
| index d3135249b2e40..346ca41b28f8b 100644 |
| --- a/drivers/mmc/host/sdhci-omap.c |
| +++ b/drivers/mmc/host/sdhci-omap.c |
| @@ -675,7 +675,8 @@ static void sdhci_omap_set_power(struct sdhci_host *host, unsigned char mode, |
| { |
| struct mmc_host *mmc = host->mmc; |
| |
| - mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); |
| + if (!IS_ERR(mmc->supply.vmmc)) |
| + mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); |
| } |
| |
| static int sdhci_omap_enable_dma(struct sdhci_host *host) |
| -- |
| 2.33.0 |
| |