* [PATCH v4] mmc: add a function to get regulators, supplying card's power @ 2012-06-12 15:57 Guennadi Liakhovetski 2012-06-12 16:40 ` Philip Rakity 2012-06-13 8:22 ` Ulf Hansson 0 siblings, 2 replies; 9+ messages in thread From: Guennadi Liakhovetski @ 2012-06-12 15:57 UTC (permalink / raw) To: linux-mmc Cc: linux-sh, Adrian Hunter, Philip Rakity, Ulf Hansson, Chris Ball, Magnus Damm, Mark Brown Add a function to get regulators, supplying card's Vdd and Vccq on a specific host. If a Vdd supplying regulator is found, the function checks, whether a valid OCR mask can be obtained from it. The Vccq regulator is optional. A failure to get it is not fatal. Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> --- v4: 1. add _GPL to EXPORT_SYMBOL (note: a recently posted patch changes another occurrence of EXPORT_SYMBOL too, so, this patch will apply with a fuzz, if merged after) 2. add an optional vqmmc regulator, which also changes the function prototype 3. print a warning, if failed to get an OCR mask Thanks to all, who commented drivers/mmc/core/core.c | 27 +++++++++++++++++++++++++++ include/linux/mmc/host.h | 12 ++++++++++++ 2 files changed, 39 insertions(+), 0 deletions(-) diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 0b6141d..d77a238 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -1013,6 +1013,33 @@ int mmc_regulator_set_ocr(struct mmc_host *mmc, } EXPORT_SYMBOL(mmc_regulator_set_ocr); +int mmc_regulator_get_supply(struct mmc_host *mmc, struct mmc_supply *s) +{ + struct device *dev = mmc_dev(mmc); + struct regulator *supply; + int ret; + + if (!mmc || !s) + return -EINVAL; + + supply = devm_regulator_get(dev, "vmmc"); + + if (IS_ERR(supply)) + return PTR_ERR(supply); + + s->vmmc = supply; + s->vqmmc = devm_regulator_get(dev, "vqmmc"); + + ret = mmc_regulator_get_ocrmask(supply); + if (ret > 0) + mmc->ocr_avail = ret; + else + dev_warn(mmc_dev(mmc), "Failed getting OCR mask: %d\n", ret); + + return 0; +} +EXPORT_SYMBOL_GPL(mmc_regulator_get_supply); + #endif /* CONFIG_REGULATOR */ /* diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 0707d22..3192335 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -359,11 +359,17 @@ static inline void mmc_signal_sdio_irq(struct mmc_host *host) struct regulator; +struct mmc_supply { + struct regulator *vmmc; /* Card power supply */ + struct regulator *vqmmc; /* Optional Vccq supply */ +}; + #ifdef CONFIG_REGULATOR int mmc_regulator_get_ocrmask(struct regulator *supply); int mmc_regulator_set_ocr(struct mmc_host *mmc, struct regulator *supply, unsigned short vdd_bit); +int mmc_regulator_get_supply(struct mmc_host *mmc, struct mmc_supply *s); #else static inline int mmc_regulator_get_ocrmask(struct regulator *supply) { @@ -376,6 +382,12 @@ static inline int mmc_regulator_set_ocr(struct mmc_host *mmc, { return 0; } + +static inline int mmc_regulator_get_supply(struct mmc_host *mmc, + struct mmc_supply *s) +{ + return 0; +} #endif int mmc_card_awake(struct mmc_host *host); -- 1.7.2.5 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v4] mmc: add a function to get regulators, supplying card's power 2012-06-12 15:57 [PATCH v4] mmc: add a function to get regulators, supplying card's power Guennadi Liakhovetski @ 2012-06-12 16:40 ` Philip Rakity 2012-06-12 16:52 ` Guennadi Liakhovetski 2012-06-13 8:22 ` Ulf Hansson 1 sibling, 1 reply; 9+ messages in thread From: Philip Rakity @ 2012-06-12 16:40 UTC (permalink / raw) To: Guennadi Liakhovetski Cc: linux-mmc@vger.kernel.org, linux-sh@vger.kernel.org, Adrian Hunter, Ulf Hansson, Chris Ball, Magnus Damm, Mark Brown On Jun 12, 2012, at 8:57 AM, Guennadi Liakhovetski wrote: > Add a function to get regulators, supplying card's Vdd and Vccq on a > specific host. If a Vdd supplying regulator is found, the function checks, > whether a valid OCR mask can be obtained from it. The Vccq regulator is > optional. A failure to get it is not fatal. > > Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> > --- > > v4: > > 1. add _GPL to EXPORT_SYMBOL (note: a recently posted patch changes > another occurrence of EXPORT_SYMBOL too, so, this patch will apply with a > fuzz, if merged after) > > 2. add an optional vqmmc regulator, which also changes the function > prototype > > 3. print a warning, if failed to get an OCR mask > > Thanks to all, who commented > > drivers/mmc/core/core.c | 27 +++++++++++++++++++++++++++ > include/linux/mmc/host.h | 12 ++++++++++++ > 2 files changed, 39 insertions(+), 0 deletions(-) > > diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c > index 0b6141d..d77a238 100644 > --- a/drivers/mmc/core/core.c > +++ b/drivers/mmc/core/core.c > @@ -1013,6 +1013,33 @@ int mmc_regulator_set_ocr(struct mmc_host *mmc, > } > EXPORT_SYMBOL(mmc_regulator_set_ocr); > > +int mmc_regulator_get_supply(struct mmc_host *mmc, struct mmc_supply *s) > +{ > + struct device *dev = mmc_dev(mmc); > + struct regulator *supply; > + int ret; > + > + if (!mmc || !s) > + return -EINVAL; > + > + supply = devm_regulator_get(dev, "vmmc"); > + > + if (IS_ERR(supply)) > + return PTR_ERR(supply); > + > + s->vmmc = supply; > + s->vqmmc = devm_regulator_get(dev, "vqmmc"); Should we set vqmmc to NULL if an error was returned ? > + > + ret = mmc_regulator_get_ocrmask(supply); > + if (ret > 0) > + mmc->ocr_avail = ret; > + else > + dev_warn(mmc_dev(mmc), "Failed getting OCR mask: %d\n", ret); I was wondering if sdhci (or the other SD Host drivers can work if no ocr_avail mask is set ? > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(mmc_regulator_get_supply); > + > #endif /* CONFIG_REGULATOR */ > > /* > diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h > index 0707d22..3192335 100644 > --- a/include/linux/mmc/host.h > +++ b/include/linux/mmc/host.h > @@ -359,11 +359,17 @@ static inline void mmc_signal_sdio_irq(struct mmc_host *host) > > struct regulator; > > +struct mmc_supply { > + struct regulator *vmmc; /* Card power supply */ > + struct regulator *vqmmc; /* Optional Vccq supply */ > +}; > + > #ifdef CONFIG_REGULATOR > int mmc_regulator_get_ocrmask(struct regulator *supply); > int mmc_regulator_set_ocr(struct mmc_host *mmc, > struct regulator *supply, > unsigned short vdd_bit); > +int mmc_regulator_get_supply(struct mmc_host *mmc, struct mmc_supply *s); > #else > static inline int mmc_regulator_get_ocrmask(struct regulator *supply) > { > @@ -376,6 +382,12 @@ static inline int mmc_regulator_set_ocr(struct mmc_host *mmc, > { > return 0; > } > + > +static inline int mmc_regulator_get_supply(struct mmc_host *mmc, > + struct mmc_supply *s) > +{ > + return 0; > +} > #endif > > int mmc_card_awake(struct mmc_host *host); > -- > 1.7.2.5 > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4] mmc: add a function to get regulators, supplying card's power 2012-06-12 16:40 ` Philip Rakity @ 2012-06-12 16:52 ` Guennadi Liakhovetski 2012-06-12 23:00 ` Philip Rakity 0 siblings, 1 reply; 9+ messages in thread From: Guennadi Liakhovetski @ 2012-06-12 16:52 UTC (permalink / raw) To: Philip Rakity Cc: linux-mmc@vger.kernel.org, linux-sh@vger.kernel.org, Adrian Hunter, Ulf Hansson, Chris Ball, Magnus Damm, Mark Brown On Tue, 12 Jun 2012, Philip Rakity wrote: > > On Jun 12, 2012, at 8:57 AM, Guennadi Liakhovetski wrote: > > > Add a function to get regulators, supplying card's Vdd and Vccq on a > > specific host. If a Vdd supplying regulator is found, the function checks, > > whether a valid OCR mask can be obtained from it. The Vccq regulator is > > optional. A failure to get it is not fatal. > > > > Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> > > --- > > > > v4: > > > > 1. add _GPL to EXPORT_SYMBOL (note: a recently posted patch changes > > another occurrence of EXPORT_SYMBOL too, so, this patch will apply with a > > fuzz, if merged after) > > > > 2. add an optional vqmmc regulator, which also changes the function > > prototype > > > > 3. print a warning, if failed to get an OCR mask > > > > Thanks to all, who commented > > > > drivers/mmc/core/core.c | 27 +++++++++++++++++++++++++++ > > include/linux/mmc/host.h | 12 ++++++++++++ > > 2 files changed, 39 insertions(+), 0 deletions(-) > > > > diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c > > index 0b6141d..d77a238 100644 > > --- a/drivers/mmc/core/core.c > > +++ b/drivers/mmc/core/core.c > > @@ -1013,6 +1013,33 @@ int mmc_regulator_set_ocr(struct mmc_host *mmc, > > } > > EXPORT_SYMBOL(mmc_regulator_set_ocr); > > > > +int mmc_regulator_get_supply(struct mmc_host *mmc, struct mmc_supply *s) > > +{ > > + struct device *dev = mmc_dev(mmc); > > + struct regulator *supply; > > + int ret; > > + > > + if (!mmc || !s) > > + return -EINVAL; > > + > > + supply = devm_regulator_get(dev, "vmmc"); > > + > > + if (IS_ERR(supply)) > > + return PTR_ERR(supply); > > + > > + s->vmmc = supply; > > + s->vqmmc = devm_regulator_get(dev, "vqmmc"); > > Should we set vqmmc to NULL if an error was returned ? Don't think so, drivers can perfectly check for IS_ERR() themselves. > > + > > + ret = mmc_regulator_get_ocrmask(supply); > > + if (ret > 0) > > + mmc->ocr_avail = ret; > > + else > > + dev_warn(mmc_dev(mmc), "Failed getting OCR mask: %d\n", ret); > > I was wondering if sdhci (or the other SD Host drivers can work if no ocr_avail mask is set ? Yes, e.g., if it's a dummy regulator and the board actually doesn't need one. > > + > > + return 0; > > +} > > +EXPORT_SYMBOL_GPL(mmc_regulator_get_supply); > > + > > #endif /* CONFIG_REGULATOR */ > > > > /* > > diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h > > index 0707d22..3192335 100644 > > --- a/include/linux/mmc/host.h > > +++ b/include/linux/mmc/host.h > > @@ -359,11 +359,17 @@ static inline void mmc_signal_sdio_irq(struct mmc_host *host) > > > > struct regulator; > > > > +struct mmc_supply { > > + struct regulator *vmmc; /* Card power supply */ > > + struct regulator *vqmmc; /* Optional Vccq supply */ > > +}; > > + > > #ifdef CONFIG_REGULATOR > > int mmc_regulator_get_ocrmask(struct regulator *supply); > > int mmc_regulator_set_ocr(struct mmc_host *mmc, > > struct regulator *supply, > > unsigned short vdd_bit); > > +int mmc_regulator_get_supply(struct mmc_host *mmc, struct mmc_supply *s); > > #else > > static inline int mmc_regulator_get_ocrmask(struct regulator *supply) > > { > > @@ -376,6 +382,12 @@ static inline int mmc_regulator_set_ocr(struct mmc_host *mmc, > > { > > return 0; > > } > > + > > +static inline int mmc_regulator_get_supply(struct mmc_host *mmc, > > + struct mmc_supply *s) > > +{ > > + return 0; > > +} > > #endif > > > > int mmc_card_awake(struct mmc_host *host); > > -- > > 1.7.2.5 Thanks Guennadi --- Guennadi Liakhovetski, Ph.D. Freelance Open-Source Software Developer http://www.open-technology.de/ ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4] mmc: add a function to get regulators, supplying card's power 2012-06-12 16:52 ` Guennadi Liakhovetski @ 2012-06-12 23:00 ` Philip Rakity 2012-06-13 7:58 ` Guennadi Liakhovetski 0 siblings, 1 reply; 9+ messages in thread From: Philip Rakity @ 2012-06-12 23:00 UTC (permalink / raw) To: Guennadi Liakhovetski Cc: linux-mmc@vger.kernel.org, linux-sh@vger.kernel.org, Adrian Hunter, Ulf Hansson, Chris Ball, Magnus Damm, Mark Brown On Jun 12, 2012, at 9:52 AM, Guennadi Liakhovetski wrote: > On Tue, 12 Jun 2012, Philip Rakity wrote: > >> >> On Jun 12, 2012, at 8:57 AM, Guennadi Liakhovetski wrote: >> >>> Add a function to get regulators, supplying card's Vdd and Vccq on a >>> specific host. If a Vdd supplying regulator is found, the function checks, >>> whether a valid OCR mask can be obtained from it. The Vccq regulator is >>> optional. A failure to get it is not fatal. >>> >>> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> >>> --- >>> >>> v4: >>> >>> 1. add _GPL to EXPORT_SYMBOL (note: a recently posted patch changes >>> another occurrence of EXPORT_SYMBOL too, so, this patch will apply with a >>> fuzz, if merged after) >>> >>> 2. add an optional vqmmc regulator, which also changes the function >>> prototype >>> >>> 3. print a warning, if failed to get an OCR mask >>> >>> Thanks to all, who commented >>> >>> drivers/mmc/core/core.c | 27 +++++++++++++++++++++++++++ >>> include/linux/mmc/host.h | 12 ++++++++++++ >>> 2 files changed, 39 insertions(+), 0 deletions(-) >>> >>> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c >>> index 0b6141d..d77a238 100644 >>> --- a/drivers/mmc/core/core.c >>> +++ b/drivers/mmc/core/core.c >>> @@ -1013,6 +1013,33 @@ int mmc_regulator_set_ocr(struct mmc_host *mmc, >>> } >>> EXPORT_SYMBOL(mmc_regulator_set_ocr); >>> >>> +int mmc_regulator_get_supply(struct mmc_host *mmc, struct mmc_supply *s) >>> +{ >>> + struct device *dev = mmc_dev(mmc); >>> + struct regulator *supply; >>> + int ret; >>> + >>> + if (!mmc || !s) >>> + return -EINVAL; >>> + >>> + supply = devm_regulator_get(dev, "vmmc"); >>> + >>> + if (IS_ERR(supply)) >>> + return PTR_ERR(supply); >>> + >>> + s->vmmc = supply; >>> + s->vqmmc = devm_regulator_get(dev, "vqmmc"); >> >> Should we set vqmmc to NULL if an error was returned ? > > Don't think so, drivers can perfectly check for IS_ERR() themselves. sdhci.c checks for if (host->vmmc) { regulator_disable(host->vmmc); regulator_put(host->vmmc); } so better to set regulator to NULL if not used. > >>> + >>> + ret = mmc_regulator_get_ocrmask(supply); >>> + if (ret > 0) >>> + mmc->ocr_avail = ret; >>> + else >>> + dev_warn(mmc_dev(mmc), "Failed getting OCR mask: %d\n", ret); >> >> I was wondering if sdhci (or the other SD Host drivers can work if no ocr_avail mask is set ? > > Yes, e.g., if it's a dummy regulator and the board actually doesn't need > one. > >>> + >>> + return 0; >>> +} >>> +EXPORT_SYMBOL_GPL(mmc_regulator_get_supply); >>> + >>> #endif /* CONFIG_REGULATOR */ >>> >>> /* >>> diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h >>> index 0707d22..3192335 100644 >>> --- a/include/linux/mmc/host.h >>> +++ b/include/linux/mmc/host.h >>> @@ -359,11 +359,17 @@ static inline void mmc_signal_sdio_irq(struct mmc_host *host) >>> >>> struct regulator; >>> >>> +struct mmc_supply { >>> + struct regulator *vmmc; /* Card power supply */ >>> + struct regulator *vqmmc; /* Optional Vccq supply */ >>> +}; >>> + >>> #ifdef CONFIG_REGULATOR >>> int mmc_regulator_get_ocrmask(struct regulator *supply); >>> int mmc_regulator_set_ocr(struct mmc_host *mmc, >>> struct regulator *supply, >>> unsigned short vdd_bit); >>> +int mmc_regulator_get_supply(struct mmc_host *mmc, struct mmc_supply *s); >>> #else >>> static inline int mmc_regulator_get_ocrmask(struct regulator *supply) >>> { >>> @@ -376,6 +382,12 @@ static inline int mmc_regulator_set_ocr(struct mmc_host *mmc, >>> { >>> return 0; >>> } >>> + >>> +static inline int mmc_regulator_get_supply(struct mmc_host *mmc, >>> + struct mmc_supply *s) >>> +{ >>> + return 0; >>> +} >>> #endif >>> >>> int mmc_card_awake(struct mmc_host *host); >>> -- >>> 1.7.2.5 > > Thanks > Guennadi > --- > Guennadi Liakhovetski, Ph.D. > Freelance Open-Source Software Developer > http://www.open-technology.de/ ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4] mmc: add a function to get regulators, supplying card's power 2012-06-12 23:00 ` Philip Rakity @ 2012-06-13 7:58 ` Guennadi Liakhovetski 0 siblings, 0 replies; 9+ messages in thread From: Guennadi Liakhovetski @ 2012-06-13 7:58 UTC (permalink / raw) To: Philip Rakity Cc: linux-mmc@vger.kernel.org, linux-sh@vger.kernel.org, Adrian Hunter, Ulf Hansson, Chris Ball, Magnus Damm, Mark Brown On Tue, 12 Jun 2012, Philip Rakity wrote: > > On Jun 12, 2012, at 9:52 AM, Guennadi Liakhovetski wrote: > > > On Tue, 12 Jun 2012, Philip Rakity wrote: > > > >> > >> On Jun 12, 2012, at 8:57 AM, Guennadi Liakhovetski wrote: > >> > >>> Add a function to get regulators, supplying card's Vdd and Vccq on a > >>> specific host. If a Vdd supplying regulator is found, the function checks, > >>> whether a valid OCR mask can be obtained from it. The Vccq regulator is > >>> optional. A failure to get it is not fatal. > >>> > >>> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> > >>> --- > >>> > >>> v4: > >>> > >>> 1. add _GPL to EXPORT_SYMBOL (note: a recently posted patch changes > >>> another occurrence of EXPORT_SYMBOL too, so, this patch will apply with a > >>> fuzz, if merged after) > >>> > >>> 2. add an optional vqmmc regulator, which also changes the function > >>> prototype > >>> > >>> 3. print a warning, if failed to get an OCR mask > >>> > >>> Thanks to all, who commented > >>> > >>> drivers/mmc/core/core.c | 27 +++++++++++++++++++++++++++ > >>> include/linux/mmc/host.h | 12 ++++++++++++ > >>> 2 files changed, 39 insertions(+), 0 deletions(-) > >>> > >>> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c > >>> index 0b6141d..d77a238 100644 > >>> --- a/drivers/mmc/core/core.c > >>> +++ b/drivers/mmc/core/core.c > >>> @@ -1013,6 +1013,33 @@ int mmc_regulator_set_ocr(struct mmc_host *mmc, > >>> } > >>> EXPORT_SYMBOL(mmc_regulator_set_ocr); > >>> > >>> +int mmc_regulator_get_supply(struct mmc_host *mmc, struct mmc_supply *s) > >>> +{ > >>> + struct device *dev = mmc_dev(mmc); > >>> + struct regulator *supply; > >>> + int ret; > >>> + > >>> + if (!mmc || !s) > >>> + return -EINVAL; > >>> + > >>> + supply = devm_regulator_get(dev, "vmmc"); > >>> + > >>> + if (IS_ERR(supply)) > >>> + return PTR_ERR(supply); > >>> + > >>> + s->vmmc = supply; > >>> + s->vqmmc = devm_regulator_get(dev, "vqmmc"); > >> > >> Should we set vqmmc to NULL if an error was returned ? > > > > Don't think so, drivers can perfectly check for IS_ERR() themselves. > > sdhci.c checks for > > if (host->vmmc) { > regulator_disable(host->vmmc); > regulator_put(host->vmmc); > } > > so better to set regulator to NULL if not used. I'm not convinced. In fact, I think, it is always better in these cases to propagate regulator_get() return codes from any wrappers to the callers. So, it might be better for consistency to assign s->vmmc and s->vqmmc even in case of an error. Although, on a second thought, no, I'd keep it as is. In case of a returned error you shouldn't make any assumptions about the contents of the struct from the function parameters. Only in the case of success all its usuaal fields should be filled in. Thanks Guennadi > >>> + > >>> + ret = mmc_regulator_get_ocrmask(supply); > >>> + if (ret > 0) > >>> + mmc->ocr_avail = ret; > >>> + else > >>> + dev_warn(mmc_dev(mmc), "Failed getting OCR mask: %d\n", ret); > >> > >> I was wondering if sdhci (or the other SD Host drivers can work if no ocr_avail mask is set ? > > > > Yes, e.g., if it's a dummy regulator and the board actually doesn't need > > one. > > > >>> + > >>> + return 0; > >>> +} > >>> +EXPORT_SYMBOL_GPL(mmc_regulator_get_supply); > >>> + > >>> #endif /* CONFIG_REGULATOR */ > >>> > >>> /* > >>> diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h > >>> index 0707d22..3192335 100644 > >>> --- a/include/linux/mmc/host.h > >>> +++ b/include/linux/mmc/host.h > >>> @@ -359,11 +359,17 @@ static inline void mmc_signal_sdio_irq(struct mmc_host *host) > >>> > >>> struct regulator; > >>> > >>> +struct mmc_supply { > >>> + struct regulator *vmmc; /* Card power supply */ > >>> + struct regulator *vqmmc; /* Optional Vccq supply */ > >>> +}; > >>> + > >>> #ifdef CONFIG_REGULATOR > >>> int mmc_regulator_get_ocrmask(struct regulator *supply); > >>> int mmc_regulator_set_ocr(struct mmc_host *mmc, > >>> struct regulator *supply, > >>> unsigned short vdd_bit); > >>> +int mmc_regulator_get_supply(struct mmc_host *mmc, struct mmc_supply *s); > >>> #else > >>> static inline int mmc_regulator_get_ocrmask(struct regulator *supply) > >>> { > >>> @@ -376,6 +382,12 @@ static inline int mmc_regulator_set_ocr(struct mmc_host *mmc, > >>> { > >>> return 0; > >>> } > >>> + > >>> +static inline int mmc_regulator_get_supply(struct mmc_host *mmc, > >>> + struct mmc_supply *s) > >>> +{ > >>> + return 0; > >>> +} > >>> #endif > >>> > >>> int mmc_card_awake(struct mmc_host *host); > >>> -- > >>> 1.7.2.5 --- Guennadi Liakhovetski, Ph.D. Freelance Open-Source Software Developer http://www.open-technology.de/ ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4] mmc: add a function to get regulators, supplying card's power 2012-06-12 15:57 [PATCH v4] mmc: add a function to get regulators, supplying card's power Guennadi Liakhovetski 2012-06-12 16:40 ` Philip Rakity @ 2012-06-13 8:22 ` Ulf Hansson 2012-06-13 8:28 ` Guennadi Liakhovetski 1 sibling, 1 reply; 9+ messages in thread From: Ulf Hansson @ 2012-06-13 8:22 UTC (permalink / raw) To: Guennadi Liakhovetski Cc: linux-mmc@vger.kernel.org, linux-sh@vger.kernel.org, Adrian Hunter, Philip Rakity, Ulf Hansson, Chris Ball, Magnus Damm, Mark Brown Hi Guennadi, On 06/12/2012 05:57 PM, Guennadi Liakhovetski wrote: > Add a function to get regulators, supplying card's Vdd and Vccq on a > specific host. If a Vdd supplying regulator is found, the function checks, > whether a valid OCR mask can be obtained from it. The Vccq regulator is > optional. A failure to get it is not fatal. > > Signed-off-by: Guennadi Liakhovetski<g.liakhovetski@gmx.de> > --- > > v4: > > 1. add _GPL to EXPORT_SYMBOL (note: a recently posted patch changes > another occurrence of EXPORT_SYMBOL too, so, this patch will apply with a > fuzz, if merged after) > > 2. add an optional vqmmc regulator, which also changes the function > prototype > > 3. print a warning, if failed to get an OCR mask > > Thanks to all, who commented > > drivers/mmc/core/core.c | 27 +++++++++++++++++++++++++++ > include/linux/mmc/host.h | 12 ++++++++++++ > 2 files changed, 39 insertions(+), 0 deletions(-) > > diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c > index 0b6141d..d77a238 100644 > --- a/drivers/mmc/core/core.c > +++ b/drivers/mmc/core/core.c > @@ -1013,6 +1013,33 @@ int mmc_regulator_set_ocr(struct mmc_host *mmc, > } > EXPORT_SYMBOL(mmc_regulator_set_ocr); > > +int mmc_regulator_get_supply(struct mmc_host *mmc, struct mmc_supply *s) > +{ > + struct device *dev = mmc_dev(mmc); > + struct regulator *supply; > + int ret; > + > + if (!mmc || !s) > + return -EINVAL; > + > + supply = devm_regulator_get(dev, "vmmc"); > + > + if (IS_ERR(supply)) > + return PTR_ERR(supply); > + > + s->vmmc = supply; > + s->vqmmc = devm_regulator_get(dev, "vqmmc"); > + > + ret = mmc_regulator_get_ocrmask(supply); > + if (ret> 0) > + mmc->ocr_avail = ret; > + else > + dev_warn(mmc_dev(mmc), "Failed getting OCR mask: %d\n", ret); > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(mmc_regulator_get_supply); > + > #endif /* CONFIG_REGULATOR */ > > /* > diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h > index 0707d22..3192335 100644 > --- a/include/linux/mmc/host.h > +++ b/include/linux/mmc/host.h > @@ -359,11 +359,17 @@ static inline void mmc_signal_sdio_irq(struct mmc_host *host) > > struct regulator; > > +struct mmc_supply { > + struct regulator *vmmc; /* Card power supply */ > + struct regulator *vqmmc; /* Optional Vccq supply */ > +}; I believe your intention is to provide this functionality for the host drivers as the common way of handling card regulators. Then, I would suggest to include these two new regulators in the mmc_host struct, instead of having this in a separate struct, which then also needs to be handled by every host driver. > + > #ifdef CONFIG_REGULATOR > int mmc_regulator_get_ocrmask(struct regulator *supply); > int mmc_regulator_set_ocr(struct mmc_host *mmc, > struct regulator *supply, > unsigned short vdd_bit); > +int mmc_regulator_get_supply(struct mmc_host *mmc, struct mmc_supply *s); > #else > static inline int mmc_regulator_get_ocrmask(struct regulator *supply) > { > @@ -376,6 +382,12 @@ static inline int mmc_regulator_set_ocr(struct mmc_host *mmc, > { > return 0; > } > + > +static inline int mmc_regulator_get_supply(struct mmc_host *mmc, > + struct mmc_supply *s) > +{ > + return 0; > +} > #endif > > int mmc_card_awake(struct mmc_host *host); Kind regards Ulf Hansson ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4] mmc: add a function to get regulators, supplying card's power 2012-06-13 8:22 ` Ulf Hansson @ 2012-06-13 8:28 ` Guennadi Liakhovetski 2012-06-13 9:26 ` Mark Brown 2012-06-13 9:40 ` Chris Ball 0 siblings, 2 replies; 9+ messages in thread From: Guennadi Liakhovetski @ 2012-06-13 8:28 UTC (permalink / raw) To: Ulf Hansson Cc: linux-mmc@vger.kernel.org, linux-sh@vger.kernel.org, Adrian Hunter, Philip Rakity, Ulf Hansson, Chris Ball, Magnus Damm, Mark Brown Hi Ulf On Wed, 13 Jun 2012, Ulf Hansson wrote: > Hi Guennadi, > > On 06/12/2012 05:57 PM, Guennadi Liakhovetski wrote: > > Add a function to get regulators, supplying card's Vdd and Vccq on a > > specific host. If a Vdd supplying regulator is found, the function checks, > > whether a valid OCR mask can be obtained from it. The Vccq regulator is > > optional. A failure to get it is not fatal. > > > > Signed-off-by: Guennadi Liakhovetski<g.liakhovetski@gmx.de> > > --- > > > > v4: > > > > 1. add _GPL to EXPORT_SYMBOL (note: a recently posted patch changes > > another occurrence of EXPORT_SYMBOL too, so, this patch will apply with a > > fuzz, if merged after) > > > > 2. add an optional vqmmc regulator, which also changes the function > > prototype > > > > 3. print a warning, if failed to get an OCR mask > > > > Thanks to all, who commented > > > > drivers/mmc/core/core.c | 27 +++++++++++++++++++++++++++ > > include/linux/mmc/host.h | 12 ++++++++++++ > > 2 files changed, 39 insertions(+), 0 deletions(-) > > > > diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c > > index 0b6141d..d77a238 100644 > > --- a/drivers/mmc/core/core.c > > +++ b/drivers/mmc/core/core.c > > @@ -1013,6 +1013,33 @@ int mmc_regulator_set_ocr(struct mmc_host *mmc, > > } > > EXPORT_SYMBOL(mmc_regulator_set_ocr); > > > > +int mmc_regulator_get_supply(struct mmc_host *mmc, struct mmc_supply *s) > > +{ > > + struct device *dev = mmc_dev(mmc); > > + struct regulator *supply; > > + int ret; > > + > > + if (!mmc || !s) > > + return -EINVAL; > > + > > + supply = devm_regulator_get(dev, "vmmc"); > > + > > + if (IS_ERR(supply)) > > + return PTR_ERR(supply); > > + > > + s->vmmc = supply; > > + s->vqmmc = devm_regulator_get(dev, "vqmmc"); > > + > > + ret = mmc_regulator_get_ocrmask(supply); > > + if (ret> 0) > > + mmc->ocr_avail = ret; > > + else > > + dev_warn(mmc_dev(mmc), "Failed getting OCR mask: %d\n", ret); > > + > > + return 0; > > +} > > +EXPORT_SYMBOL_GPL(mmc_regulator_get_supply); > > + > > #endif /* CONFIG_REGULATOR */ > > > > /* > > diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h > > index 0707d22..3192335 100644 > > --- a/include/linux/mmc/host.h > > +++ b/include/linux/mmc/host.h > > @@ -359,11 +359,17 @@ static inline void mmc_signal_sdio_irq(struct mmc_host > > *host) > > > > struct regulator; > > > > +struct mmc_supply { > > + struct regulator *vmmc; /* Card power supply */ > > + struct regulator *vqmmc; /* Optional Vccq supply */ > > +}; > > I believe your intention is to provide this functionality for the host drivers > as the common way of handling card regulators. Then, I would suggest to > include these two new regulators in the mmc_host struct, instead of having > this in a separate struct, which then also needs to be handled by every host > driver. I have no strong preference about this. Having an additional struct is how I interpreted Mark's proposal: http://thread.gmane.org/gmane.linux.kernel.mmc/14624/focus=14876 but I'm also fine with putting it in mmc_host. Chris, what's your preference? > > > + > > #ifdef CONFIG_REGULATOR > > int mmc_regulator_get_ocrmask(struct regulator *supply); > > int mmc_regulator_set_ocr(struct mmc_host *mmc, > > struct regulator *supply, > > unsigned short vdd_bit); > > +int mmc_regulator_get_supply(struct mmc_host *mmc, struct mmc_supply *s); > > #else > > static inline int mmc_regulator_get_ocrmask(struct regulator *supply) > > { > > @@ -376,6 +382,12 @@ static inline int mmc_regulator_set_ocr(struct mmc_host > > *mmc, > > { > > return 0; > > } > > + > > +static inline int mmc_regulator_get_supply(struct mmc_host *mmc, > > + struct mmc_supply *s) > > +{ > > + return 0; > > +} > > #endif > > > > int mmc_card_awake(struct mmc_host *host); Thanks Guennadi --- Guennadi Liakhovetski, Ph.D. Freelance Open-Source Software Developer http://www.open-technology.de/ ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4] mmc: add a function to get regulators, supplying card's power 2012-06-13 8:28 ` Guennadi Liakhovetski @ 2012-06-13 9:26 ` Mark Brown 2012-06-13 9:40 ` Chris Ball 1 sibling, 0 replies; 9+ messages in thread From: Mark Brown @ 2012-06-13 9:26 UTC (permalink / raw) To: Guennadi Liakhovetski Cc: Ulf Hansson, linux-mmc@vger.kernel.org, linux-sh@vger.kernel.org, Adrian Hunter, Philip Rakity, Ulf Hansson, Chris Ball, Magnus Damm [-- Attachment #1: Type: text/plain, Size: 430 bytes --] On Wed, Jun 13, 2012 at 10:28:22AM +0200, Guennadi Liakhovetski wrote: > I have no strong preference about this. Having an additional struct is how > I interpreted Mark's proposal: > http://thread.gmane.org/gmane.linux.kernel.mmc/14624/focus=14876 > but I'm also fine with putting it in mmc_host. Chris, what's your > preference? I'm just suggesting that because it seems like this is idiomatic for the MMC API. [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4] mmc: add a function to get regulators, supplying card's power 2012-06-13 8:28 ` Guennadi Liakhovetski 2012-06-13 9:26 ` Mark Brown @ 2012-06-13 9:40 ` Chris Ball 1 sibling, 0 replies; 9+ messages in thread From: Chris Ball @ 2012-06-13 9:40 UTC (permalink / raw) To: Guennadi Liakhovetski Cc: Ulf Hansson, linux-mmc@vger.kernel.org, linux-sh@vger.kernel.org, Adrian Hunter, Philip Rakity, Ulf Hansson, Magnus Damm, Mark Brown Hi, On Wed, Jun 13 2012, Guennadi Liakhovetski wrote: >> > +struct mmc_supply { >> > + struct regulator *vmmc; /* Card power supply */ >> > + struct regulator *vqmmc; /* Optional Vccq supply */ >> > +}; >> >> I believe your intention is to provide this functionality for the host drivers >> as the common way of handling card regulators. Then, I would suggest to >> include these two new regulators in the mmc_host struct, instead of having >> this in a separate struct, which then also needs to be handled by every host >> driver. > > I have no strong preference about this. Having an additional struct is how > I interpreted Mark's proposal: > > http://thread.gmane.org/gmane.linux.kernel.mmc/14624/focus=14876 > > but I'm also fine with putting it in mmc_host. Chris, what's your > preference? I think Mark was just trying to help with your observation that the changes are messy. I don't see any compelling reasons to avoid adding these to mmc_host -- does anyone else feel strongly? So, I'd say go ahead and post an updated patch that uses mmc_host, and we can see if Mark has any thoughts. Thanks, - Chris. -- Chris Ball <cjb@laptop.org> <http://printf.net/> One Laptop Per Child ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2012-06-13 9:40 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-06-12 15:57 [PATCH v4] mmc: add a function to get regulators, supplying card's power Guennadi Liakhovetski 2012-06-12 16:40 ` Philip Rakity 2012-06-12 16:52 ` Guennadi Liakhovetski 2012-06-12 23:00 ` Philip Rakity 2012-06-13 7:58 ` Guennadi Liakhovetski 2012-06-13 8:22 ` Ulf Hansson 2012-06-13 8:28 ` Guennadi Liakhovetski 2012-06-13 9:26 ` Mark Brown 2012-06-13 9:40 ` Chris Ball
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox