Re: [PATCH v2 04/15] mmc: mmci: Add support for setting pad type via pinctrl

From: Ulf Hansson
Date: Wed Jan 17 2018 - 04:34:56 EST


[...]

> /*
> @@ -1616,6 +1625,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_warn(mmc_dev(mmc), "Can't select default pins\n");
> + host->pins_default = NULL;

This is wrong, I think you should bail out and return the error code instead.

Moreover, calling pinctrl_select_state() from ->set_ios by using a
NULL state, will likely trigger a NULL pointer deference bug in the
pinctrl layer.

> + }
> +
> + host->pins_opendrain = pinctrl_lookup_state(host->pinctrl,
> + MMCI_PINCTRL_STATE_OPENDRAIN);
> + if (IS_ERR(host->pins_opendrain)) {
> + dev_warn(mmc_dev(mmc), "Can't select opendrain pins\n");
> + host->pins_opendrain = NULL;

Ditto.

> + }
> + }
> +

[...]

Kind regards
Uffe