diff options
Diffstat (limited to 'drivers/mmc/host/mxs-mmc.c')
| -rw-r--r-- | drivers/mmc/host/mxs-mmc.c | 26 | 
1 files changed, 24 insertions, 2 deletions
diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c index 277161d279b..a51f9309ffb 100644 --- a/drivers/mmc/host/mxs-mmc.c +++ b/drivers/mmc/host/mxs-mmc.c @@ -164,16 +164,23 @@ struct mxs_mmc_host {  	spinlock_t			lock;  	int				sdio_irq_en;  	int				wp_gpio; +	bool				wp_inverted;  };  static int mxs_mmc_get_ro(struct mmc_host *mmc)  {  	struct mxs_mmc_host *host = mmc_priv(mmc); +	int ret;  	if (!gpio_is_valid(host->wp_gpio))  		return -EINVAL; -	return gpio_get_value(host->wp_gpio); +	ret = gpio_get_value(host->wp_gpio); + +	if (host->wp_inverted) +		ret = !ret; + +	return ret;  }  static int mxs_mmc_get_cd(struct mmc_host *mmc) @@ -707,6 +714,8 @@ static int mxs_mmc_probe(struct platform_device *pdev)  	struct pinctrl *pinctrl;  	int ret = 0, irq_err, irq_dma;  	dma_cap_mask_t mask; +	struct regulator *reg_vmmc; +	enum of_gpio_flags flags;  	iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);  	dmares = platform_get_resource(pdev, IORESOURCE_DMA, 0); @@ -747,6 +756,16 @@ static int mxs_mmc_probe(struct platform_device *pdev)  	host->mmc = mmc;  	host->sdio_irq_en = 0; +	reg_vmmc = devm_regulator_get(&pdev->dev, "vmmc"); +	if (!IS_ERR(reg_vmmc)) { +		ret = regulator_enable(reg_vmmc); +		if (ret) { +			dev_err(&pdev->dev, +				"Failed to enable vmmc regulator: %d\n", ret); +			goto out_mmc_free; +		} +	} +  	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);  	if (IS_ERR(pinctrl)) {  		ret = PTR_ERR(pinctrl); @@ -785,7 +804,10 @@ static int mxs_mmc_probe(struct platform_device *pdev)  			mmc->caps |= MMC_CAP_4_BIT_DATA;  		else if (bus_width == 8)  			mmc->caps |= MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA; -		host->wp_gpio = of_get_named_gpio(np, "wp-gpios", 0); +		host->wp_gpio = of_get_named_gpio_flags(np, "wp-gpios", 0, +							&flags); +		if (flags & OF_GPIO_ACTIVE_LOW) +			host->wp_inverted = 1;  	} else {  		if (pdata->flags & SLOTF_8_BIT_CAPABLE)  			mmc->caps |= MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA;  |