diff mbox

mmc: omap_hsmmc: support deferred probing for GPIOs

Message ID 1359536837-14874-1-git-send-email-jlu@pengutronix.de (mailing list archive)
State New, archived
Headers show

Commit Message

Jan Lübbe Jan. 30, 2013, 9:07 a.m. UTC
If the CD/WP-GPIOs are not provided by the SoC's GPIO controller,
we need to handle the case where omap_hsmmc is probed earlier than
the GPIO controller chosen in the device tree.

Fix this by checking the return value of of_get_named_gpio against
-EPROBE_DEFER and passing it through to the probe function.

Signed-off-by: Jan Luebbe <jlu@pengutronix.de>
---

I've tested this on an AM335x based board which uses an external
GPIO expander.

 drivers/mmc/host/omap_hsmmc.c |   14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

Comments

Jan Lübbe Feb. 14, 2013, 10:43 a.m. UTC | #1
On Wed, 2013-01-30 at 10:07 +0100, Jan Luebbe wrote:
> If the CD/WP-GPIOs are not provided by the SoC's GPIO controller,
> we need to handle the case where omap_hsmmc is probed earlier than
> the GPIO controller chosen in the device tree.
> 
> Fix this by checking the return value of of_get_named_gpio against
> -EPROBE_DEFER and passing it through to the probe function.
> 
> Signed-off-by: Jan Luebbe <jlu@pengutronix.de>

Balaji, since you seem to be the new OMAP HSMMC maintainer, do you have
any comments on this patch?

Thanks,
Jan
Balaji T K Feb. 14, 2013, 1:53 p.m. UTC | #2
On Thursday 14 February 2013 04:13 PM, Jan Lübbe wrote:
> On Wed, 2013-01-30 at 10:07 +0100, Jan Luebbe wrote:
>> If the CD/WP-GPIOs are not provided by the SoC's GPIO controller,
>> we need to handle the case where omap_hsmmc is probed earlier than
>> the GPIO controller chosen in the device tree.
>>
>> Fix this by checking the return value of of_get_named_gpio against
>> -EPROBE_DEFER and passing it through to the probe function.
>>
>> Signed-off-by: Jan Luebbe <jlu@pengutronix.de>
>
> Balaji, since you seem to be the new OMAP HSMMC maintainer, do you have
> any comments on this patch?

Looks good to me,
Acked-by: Balaji T K <balajitk@ti.com>


--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jan Lübbe March 21, 2013, 11:39 a.m. UTC | #3
On Thu, 2013-02-14 at 19:23 +0530, Balaji T K wrote:
> On Thursday 14 February 2013 04:13 PM, Jan Lübbe wrote:
> > On Wed, 2013-01-30 at 10:07 +0100, Jan Luebbe wrote:
> >> If the CD/WP-GPIOs are not provided by the SoC's GPIO controller,
> >> we need to handle the case where omap_hsmmc is probed earlier than
> >> the GPIO controller chosen in the device tree.
> >>
> >> Fix this by checking the return value of of_get_named_gpio against
> >> -EPROBE_DEFER and passing it through to the probe function.
> >>
> >> Signed-off-by: Jan Luebbe <jlu@pengutronix.de>
> >
> > Balaji, since you seem to be the new OMAP HSMMC maintainer, do you have
> > any comments on this patch?
> 
> Looks good to me,
> Acked-by: Balaji T K <balajitk@ti.com>

Chris, would you take this?

Thanks,
Jan
Chris Ball March 22, 2013, 3:52 p.m. UTC | #4
Hi,

On Thu, Feb 14 2013, Balaji T K wrote:
> On Thursday 14 February 2013 04:13 PM, Jan Lübbe wrote:
>> On Wed, 2013-01-30 at 10:07 +0100, Jan Luebbe wrote:
>>> If the CD/WP-GPIOs are not provided by the SoC's GPIO controller,
>>> we need to handle the case where omap_hsmmc is probed earlier than
>>> the GPIO controller chosen in the device tree.
>>>
>>> Fix this by checking the return value of of_get_named_gpio against
>>> -EPROBE_DEFER and passing it through to the probe function.
>>>
>>> Signed-off-by: Jan Luebbe <jlu@pengutronix.de>
>>
>> Balaji, since you seem to be the new OMAP HSMMC maintainer, do you have
>> any comments on this patch?
>
> Looks good to me,
> Acked-by: Balaji T K <balajitk@ti.com>

Thanks, pushed to mmc-next for 3.10.

- Chris.
diff mbox

Patch

diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index e30c1ee..fd1b342 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -1717,6 +1717,12 @@  static struct omap_mmc_platform_data *of_get_hsmmc_pdata(struct device *dev)
 	struct omap_mmc_platform_data *pdata;
 	struct device_node *np = dev->of_node;
 	u32 bus_width, max_freq;
+	int cd_gpio, wp_gpio;
+
+	cd_gpio = of_get_named_gpio(np, "cd-gpios", 0);
+	wp_gpio = of_get_named_gpio(np, "wp-gpios", 0);
+	if (cd_gpio == -EPROBE_DEFER || wp_gpio == -EPROBE_DEFER)
+		return ERR_PTR(-EPROBE_DEFER);
 
 	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
 	if (!pdata)
@@ -1727,8 +1733,8 @@  static struct omap_mmc_platform_data *of_get_hsmmc_pdata(struct device *dev)
 
 	/* This driver only supports 1 slot */
 	pdata->nr_slots = 1;
-	pdata->slots[0].switch_pin = of_get_named_gpio(np, "cd-gpios", 0);
-	pdata->slots[0].gpio_wp = of_get_named_gpio(np, "wp-gpios", 0);
+	pdata->slots[0].switch_pin = cd_gpio;
+	pdata->slots[0].gpio_wp = wp_gpio;
 
 	if (of_find_property(np, "ti,non-removable", NULL)) {
 		pdata->slots[0].nonremovable = true;
@@ -1775,6 +1781,10 @@  static int omap_hsmmc_probe(struct platform_device *pdev)
 	match = of_match_device(of_match_ptr(omap_mmc_of_match), &pdev->dev);
 	if (match) {
 		pdata = of_get_hsmmc_pdata(&pdev->dev);
+
+		if (IS_ERR(pdata))
+			return PTR_ERR(pdata);
+
 		if (match->data) {
 			const u16 *offsetp = match->data;
 			pdata->reg_offset = *offsetp;