Commit f9bb304c authored by Patrice Chotard's avatar Patrice Chotard Committed by Ulf Hansson

mmc: mmci: Add support for setting pad type via pinctrl

If variant hasn't the control bit to switch pads in opendrain mode,
we can achieve the same result by asking to the pinmux driver to
configure pins for us.

This patch make the mmci driver able to do this whenever needed.
Signed-off-by: default avatarAndrea Merello <andrea.merello@gmail.com>
Signed-off-by: default avatarPatrice Chotard <patrice.chotard@st.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 11dfb970
...@@ -1465,8 +1465,19 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) ...@@ -1465,8 +1465,19 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
~MCI_ST_DATA2DIREN); ~MCI_ST_DATA2DIREN);
} }
if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN && variant->opendrain) if (variant->opendrain) {
if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN)
pwr |= variant->opendrain; pwr |= variant->opendrain;
} else {
/*
* If the variant cannot configure the pads by its own, then we
* expect the pinctrl to be able to do that for us
*/
if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN)
pinctrl_select_state(host->pinctrl, host->pins_opendrain);
else
pinctrl_select_state(host->pinctrl, host->pins_default);
}
/* /*
* If clock = 0 and the variant requires the MMCIPOWER to be used for * If clock = 0 and the variant requires the MMCIPOWER to be used for
...@@ -1610,6 +1621,32 @@ static int mmci_probe(struct amba_device *dev, ...@@ -1610,6 +1621,32 @@ static int mmci_probe(struct amba_device *dev,
host = mmc_priv(mmc); host = mmc_priv(mmc);
host->mmc = mmc; host->mmc = mmc;
/*
* Some variant (STM32) doesn't have opendrain bit, nevertheless
* pins can be set accordingly using pinctrl
*/
if (!variant->opendrain) {
host->pinctrl = devm_pinctrl_get(&dev->dev);
if (IS_ERR(host->pinctrl)) {
dev_err(&dev->dev, "failed to get pinctrl");
goto host_free;
}
host->pins_default = pinctrl_lookup_state(host->pinctrl,
PINCTRL_STATE_DEFAULT);
if (IS_ERR(host->pins_default)) {
dev_err(mmc_dev(mmc), "Can't select default pins\n");
goto host_free;
}
host->pins_opendrain = pinctrl_lookup_state(host->pinctrl,
MMCI_PINCTRL_STATE_OPENDRAIN);
if (IS_ERR(host->pins_opendrain)) {
dev_err(mmc_dev(mmc), "Can't select opendrain pins\n");
goto host_free;
}
}
host->hw_designer = amba_manf(dev); host->hw_designer = amba_manf(dev);
host->hw_revision = amba_rev(dev); host->hw_revision = amba_rev(dev);
dev_dbg(mmc_dev(mmc), "designer ID = 0x%02x\n", host->hw_designer); dev_dbg(mmc_dev(mmc), "designer ID = 0x%02x\n", host->hw_designer);
......
...@@ -192,6 +192,8 @@ ...@@ -192,6 +192,8 @@
#define NR_SG 128 #define NR_SG 128
#define MMCI_PINCTRL_STATE_OPENDRAIN "opendrain"
struct clk; struct clk;
struct variant_data; struct variant_data;
struct dma_chan; struct dma_chan;
...@@ -227,6 +229,9 @@ struct mmci_host { ...@@ -227,6 +229,9 @@ struct mmci_host {
bool vqmmc_enabled; bool vqmmc_enabled;
struct mmci_platform_data *plat; struct mmci_platform_data *plat;
struct variant_data *variant; struct variant_data *variant;
struct pinctrl *pinctrl;
struct pinctrl_state *pins_default;
struct pinctrl_state *pins_opendrain;
u8 hw_designer; u8 hw_designer;
u8 hw_revision:4; u8 hw_revision:4;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment