lkml.org 
[lkml]   [2014]   [Mar]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] sdhci: Forward EPROBE_DEFER on vmmc and vqmmc regulators
    On 26-3-2014 16:09, Georgi Djakov wrote:
    > On 03/07/2014 04:18 PM, Mike Looijmans wrote:
    >> If vmmc or vqmmc regulators are controlled by an I2C device, the
    >> request for the regulator is likely to fail because the I2C bus has
    >> not been probed yet. The sdhci then incorrectly assumes that the user
    >> never wanted to use a regulator anyway and continues without ever
    >> enabling or configuring the required regulator.
    >>
    >> To solve this, when a required voltage regulator returns
    >> EPROBE_DEFER, signalling that the regulator exists but is not
    >> available yet, forward this error to the probe method instead
    >> of simply assuming that the user never wanted to use a regulator
    >> anyway.
    >>
    >> Tested on a custom board that has an I2C regulator for one of the sdhcis
    >> and no regulators at all for the other. This patch enables such a system
    >> to work correctly.
    >> ---
    >> drivers/mmc/host/sdhci.c | 8 ++++++--
    >> 1 file changed, 6 insertions(+), 2 deletions(-)
    >>
    >> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
    >> index 34aef81..43b90c1 100644
    >> --- a/drivers/mmc/host/sdhci.c
    >> +++ b/drivers/mmc/host/sdhci.c
    >> @@ -2972,6 +2972,8 @@ int sdhci_add_host(struct sdhci_host *host)
    >> host->vqmmc = regulator_get_optional(mmc_dev(mmc), "vqmmc");
    >> if (IS_ERR_OR_NULL(host->vqmmc)) {
    >> if (PTR_ERR(host->vqmmc) < 0) {
    >> + if (PTR_ERR(host->vqmmc) == -EPROBE_DEFER)
    >> + return -EPROBE_DEFER;
    >> pr_info("%s: no vqmmc regulator found\n",
    >> mmc_hostname(mmc));
    >> host->vqmmc = NULL;
    >> @@ -3048,8 +3050,10 @@ int sdhci_add_host(struct sdhci_host *host)
    >> host->vmmc = regulator_get_optional(mmc_dev(mmc), "vmmc");
    >> if (IS_ERR_OR_NULL(host->vmmc)) {
    >> if (PTR_ERR(host->vmmc) < 0) {
    >> - pr_info("%s: no vmmc regulator found\n",
    >> - mmc_hostname(mmc));
    >> + if (PTR_ERR(host->vmmc) == -EPROBE_DEFER)
    >> + return -EPROBE_DEFER;
    >> + pr_info("%s: no vmmc regulator found (%d)\n",
    >
    > I suggest using %ld here. The rest looks fine to me! Thanks!

    Does this mean you're waiting for a patch v2 that I should submit?

    >
    >> + mmc_hostname(mmc), PTR_ERR(host->vmmc));
    >> host->vmmc = NULL;
    >> }
    >> }
    >>
    >
    > BR,
    > Georgi
    >


    --
    Mike Looijmans


    \
     
     \ /
      Last update: 2014-03-27 19:01    [W:4.580 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site