Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f7f0f035 authored by Andreas Fenkart's avatar Andreas Fenkart Committed by Ulf Hansson
Browse files

mmc: omap_hsmmc: call omap_hsmmc_set_power directly



If no pdata.set_power was set by the platform code, the driver
was updating pdata with its own fallback function. This is a no-no
since pdata shall be read-only.
This patch pushes the check 'pdata->set_power != NULL' down into
the fallback functions. If pdata.set_power is really set, it calls them
and exits, otherwise the fallback code is used.

Signed-off-by: default avatarAndreas Fenkart <afenkart@gmail.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent c21e678b
Loading
Loading
Loading
Loading
+22 −15
Original line number Diff line number Diff line
@@ -213,7 +213,6 @@ struct omap_hsmmc_host {
	int			context_loss;
	int			protect_card;
	int			reqs_blocked;
	int			use_reg;
	int			req_in_progress;
	unsigned long		clk_rate;
	unsigned int		flags;
@@ -262,6 +261,9 @@ static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
		platform_get_drvdata(to_platform_device(dev));
	int ret = 0;

	if (mmc_pdata(host)->set_power)
		return mmc_pdata(host)->set_power(dev, power_on, vdd);

	/*
	 * If we don't see a Vcc regulator, assume it's a fixed
	 * voltage always-on regulator.
@@ -344,6 +346,9 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
	struct regulator *reg;
	int ocr_value = 0;

	if (mmc_pdata(host)->set_power)
		return 0;

	reg = devm_regulator_get(host->dev, "vmmc");
	if (IS_ERR(reg)) {
		dev_err(host->dev, "unable to get vmmc regulator %ld\n",
@@ -363,7 +368,6 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
			}
		}
	}
	mmc_pdata(host)->set_power = omap_hsmmc_set_power;

	/* Allow an aux regulator */
	reg = devm_regulator_get_optional(host->dev, "vmmc_aux");
@@ -383,8 +387,8 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
	    (host->vcc_aux && regulator_is_enabled(host->vcc_aux))) {
		int vdd = ffs(mmc_pdata(host)->ocr_mask) - 1;

		mmc_pdata(host)->set_power(host->dev, 1, vdd);
		mmc_pdata(host)->set_power(host->dev, 0, 0);
		omap_hsmmc_set_power(host->dev, 1, vdd);
		omap_hsmmc_set_power(host->dev, 0, 0);
	}

	return 0;
@@ -392,7 +396,8 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)

static void omap_hsmmc_reg_put(struct omap_hsmmc_host *host)
{
	mmc_pdata(host)->set_power = NULL;
	if (mmc_pdata(host)->set_power)
		return;
}

static inline int omap_hsmmc_have_reg(void)
@@ -402,6 +407,11 @@ static inline int omap_hsmmc_have_reg(void)

#else

static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
{
	return 0;
}

static inline int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
{
	return -EINVAL;
@@ -1149,11 +1159,11 @@ static int omap_hsmmc_switch_opcond(struct omap_hsmmc_host *host, int vdd)
		clk_disable_unprepare(host->dbclk);

	/* Turn the power off */
	ret = mmc_pdata(host)->set_power(host->dev, 0, 0);
	ret = omap_hsmmc_set_power(host->dev, 0, 0);

	/* Turn the power ON with given VDD 1.8 or 3.0v */
	if (!ret)
		ret = mmc_pdata(host)->set_power(host->dev, 1, vdd);
		ret = omap_hsmmc_set_power(host->dev, 1, vdd);
	pm_runtime_get_sync(host->dev);
	if (host->dbclk)
		clk_prepare_enable(host->dbclk);
@@ -1552,10 +1562,10 @@ static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
	if (ios->power_mode != host->power_mode) {
		switch (ios->power_mode) {
		case MMC_POWER_OFF:
			mmc_pdata(host)->set_power(host->dev, 0, 0);
			omap_hsmmc_set_power(host->dev, 0, 0);
			break;
		case MMC_POWER_UP:
			mmc_pdata(host)->set_power(host->dev, 1, ios->vdd);
			omap_hsmmc_set_power(host->dev, 1, ios->vdd);
			break;
		case MMC_POWER_ON:
			do_send_init_stream = 1;
@@ -2078,11 +2088,10 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
		goto err_irq;
	}

	if (omap_hsmmc_have_reg() && !mmc_pdata(host)->set_power) {
	if (omap_hsmmc_have_reg()) {
		ret = omap_hsmmc_reg_get(host);
		if (ret)
			goto err_irq;
		host->use_reg = 1;
	}

	mmc->ocr_avail = mmc_pdata(host)->ocr_mask;
@@ -2125,7 +2134,6 @@ static int omap_hsmmc_probe(struct platform_device *pdev)

err_slot_name:
	mmc_remove_host(mmc);
	if (host->use_reg)
	omap_hsmmc_reg_put(host);
err_irq:
	device_init_wakeup(&pdev->dev, false);
@@ -2150,7 +2158,6 @@ static int omap_hsmmc_remove(struct platform_device *pdev)

	pm_runtime_get_sync(host->dev);
	mmc_remove_host(host->mmc);
	if (host->use_reg)
	omap_hsmmc_reg_put(host);

	if (host->tx_chan)