Subject: [PATCH] gpio: of_get_named_gpio_flags() return -EPROBE_DEFER if GPIO not yet available

From: [email-masked] (Roland Stigge)
Date: Mon, 18 Jun 2012 18:40:48 +0200

On 06/18/2012 05:45 PM, Stephen Warren wrote:
>>>> Should be easy to fix (replacing the if (... == -ENODEV) to -EPROBE_DEFER.
>>>>
>>>> Will you provide patches as signalled, of should I? Which branch would
>>>> be the correct one to build on top?
>>>
>>> I'm happy either way. It'd probably be best to roll the change into your
>>> patch/series so you can manage all the dependencies in one series, but
>>> if you can't for some reason, I'm happy to provide a patch for this.
>>
>> I should be able ;-) - is broonie's sound.git, branch for-next the
>> correct one to patch against?
> 
> Yes, that's the one. Thanks.

I'm posting this as a series of 2 for the sound changes only. Would be 
easiest to merge separately via sound/for-next, and the gpiolib-of 
change via gpio. However, this could break bisecting.

Since the respective precondition commits are only in the sound tree, 
this would be the only one practical for merging a single combined 
patch (combining those 3). Would this be OK for the GPIO maintainers? 
It's practically only a one-line change in gpiolib-of.c that would come 
in via sound.

Thanks in advance,

Roland

PS: Just for illustration purposes for the sound maintainers:
---
 drivers/gpio/gpiolib-of.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

--- linux-2.6.orig/drivers/gpio/gpiolib-of.c
+++ linux-2.6/drivers/gpio/gpiolib-of.c
@@ -62,7 +62,10 @@ static int of_gpiochip_find_and_xlate(st
 int of_get_named_gpio_flags(struct device_node *np, const char *propname,
                            int index, enum of_gpio_flags *flags)
 {
-       struct gg_data gg_data = { .flags = flags, .out_gpio = -ENODEV };
+       /* Return -EPROBE_DEFER to support probe() functions to be called
+        * later when the GPIO actually becomes available
+        */
+       struct gg_data gg_data = { .flags = flags, .out_gpio = -EPROBE_DEFER };
        int ret;

        /* .of_xlate might decide to not fill in the flags, so clear it. */