Skip to content

Commit

Permalink
mmc: mmci: Add support for setting pad type via pinctrl
Browse files Browse the repository at this point in the history
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: Andrea Merello <[email protected]>
Signed-off-by: Patrice Chotard <[email protected]>
Signed-off-by: Ulf Hansson <[email protected]>
  • Loading branch information
pchotard authored and storulf committed Jan 18, 2018
1 parent 11dfb97 commit f9bb304
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 2 deletions.
41 changes: 39 additions & 2 deletions drivers/mmc/host/mmci.c
Original file line number Diff line number Diff line change
Expand Up @@ -1465,8 +1465,19 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
~MCI_ST_DATA2DIREN);
}

if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN && variant->opendrain)
pwr |= variant->opendrain;
if (variant->opendrain) {
if (ios->bus_mode == MMC_BUSMODE_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
Expand Down Expand Up @@ -1610,6 +1621,32 @@ static int mmci_probe(struct amba_device *dev,
host = mmc_priv(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_revision = amba_rev(dev);
dev_dbg(mmc_dev(mmc), "designer ID = 0x%02x\n", host->hw_designer);
Expand Down
5 changes: 5 additions & 0 deletions drivers/mmc/host/mmci.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,8 @@

#define NR_SG 128

#define MMCI_PINCTRL_STATE_OPENDRAIN "opendrain"

struct clk;
struct variant_data;
struct dma_chan;
Expand Down Expand Up @@ -227,6 +229,9 @@ struct mmci_host {
bool vqmmc_enabled;
struct mmci_platform_data *plat;
struct variant_data *variant;
struct pinctrl *pinctrl;
struct pinctrl_state *pins_default;
struct pinctrl_state *pins_opendrain;

u8 hw_designer;
u8 hw_revision:4;
Expand Down

0 comments on commit f9bb304

Please sign in to comment.