diff mbox

reset: Put back *_optional variants

Message ID 12e450f0-70ea-29f8-0bf7-8a0697263f2d@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Hans de Goede May 26, 2016, 8:25 p.m. UTC
Hi,

On 26-05-16 03:15, John Youn wrote:
> Prior to commit 6c96f05c8bb8 ("reset: Make [of_]reset_control_get[_foo]
> functions wrappers"), the optional variants returned -ENOTSUPP when
> CONFIG_RESET_CONTROLLER was not set. This patch reverts to this
> behavior. Otherwise those calls will return -EINVAL causing users to
> think that an error occurred when CONFIG_RESET_CONTROLLER is not set.
>
> Fixes: 6c96f05c8bb8 ("reset: Make [of_]reset_control_get[_foo] functions wrappers")
> Signed-off-by: John Youn <johnyoun@synopsys.com>
> ---
>
> Hi Philipp, Hans,
>
> The commit referenced above breaks an upcoming patch for the dwc2
> driver that adds an optional reset control.
>
> https://marc.info/?l=linux-usb&m=146161328211584&w=2
>
> I've attempted to add the optional variants back the way they were
> working before. Let me know if I need to do anything else to fix it or
> if it should be done another way.
>
> Regards,
> John

Hmm, I don't like all the extra code your patch adds just to fix
a return value...

Looking at the code before my "reset: Make [of_]reset_control_get[_foo]
functions wrappers" patch, all the dev*_get* functions were
returning ENOTSUPP except for [devm_]reset_control_get, so following
your logic we should also change the of_reset_control_get_by_index
variant to return -ENOTSUP.

Or better, simply make them all return -ENOTSUP, that seems both
consistent and more KISS to me, this would mean an error code
change for [devm_]reset_control_get, but will fix all the other
getters from having a changed error-code, and I would callers
of [devm_]reset_control_get to not care which error code they
get, except for -EPROBE_DEFER.

So IMHO the following change would be a better way to fix this:




Regards,

Hans



>
>  include/linux/reset.h | 33 +++++++++++++++++++++++++++++++--
>  1 file changed, 31 insertions(+), 2 deletions(-)
>
> diff --git a/include/linux/reset.h b/include/linux/reset.h
> index ec0306ce..739d33d 100644
> --- a/include/linux/reset.h
> +++ b/include/linux/reset.h
> @@ -14,10 +14,24 @@ int reset_control_status(struct reset_control *rstc);
>
>  struct reset_control *__of_reset_control_get(struct device_node *node,
>  				     const char *id, int index, int shared);
> +
> +struct reset_control *__of_reset_control_get_optional(struct device_node *node,
> +				     const char *id, int index, int shared)
> +{
> +	return __of_reset_control_get(node, id, index, shared);
> +}
> +
>  void reset_control_put(struct reset_control *rstc);
>  struct reset_control *__devm_reset_control_get(struct device *dev,
>  				     const char *id, int index, int shared);
>
> +static inline struct reset_control *__devm_reset_control_get_optional(
> +					struct device *dev,
> +					const char *id, int index, int shared)
> +{
> +	return __devm_reset_control_get(dev, id, index, shared);
> +}
> +
>  int __must_check device_reset(struct device *dev);
>
>  static inline int device_reset_optional(struct device *dev)
> @@ -74,6 +88,13 @@ static inline struct reset_control *__of_reset_control_get(
>  	return ERR_PTR(-EINVAL);
>  }
>
> +static inline struct reset_control *__of_reset_control_get_optional(
> +					struct device_node *node,
> +					const char *id, int index, int shared)
> +{
> +	return ERR_PTR(-ENOTSUPP);
> +}
> +
>  static inline struct reset_control *__devm_reset_control_get(
>  					struct device *dev,
>  					const char *id, int index, int shared)
> @@ -81,6 +102,13 @@ static inline struct reset_control *__devm_reset_control_get(
>  	return ERR_PTR(-EINVAL);
>  }
>
> +static inline struct reset_control *__devm_reset_control_get_optional(
> +					struct device *dev,
> +					const char *id, int index, int shared)
> +{
> +	return ERR_PTR(-ENOTSUPP);
> +}
> +
>  #endif /* CONFIG_RESET_CONTROLLER */
>
>  /**
> @@ -110,7 +138,8 @@ static inline struct reset_control *__must_check reset_control_get(
>  static inline struct reset_control *reset_control_get_optional(
>  					struct device *dev, const char *id)
>  {
> -	return __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, 0);
> +	return __of_reset_control_get_optional(dev ? dev->of_node : NULL,
> +					       id, 0, 0);
>  }
>
>  /**
> @@ -194,7 +223,7 @@ static inline struct reset_control *__must_check devm_reset_control_get(
>  static inline struct reset_control *devm_reset_control_get_optional(
>  					struct device *dev, const char *id)
>  {
> -	return __devm_reset_control_get(dev, id, 0, 0);
> +	return __devm_reset_control_get_optional(dev, id, 0, 0);
>  }
>
>  /**
>

Comments

John Youn May 26, 2016, 9:44 p.m. UTC | #1
On 5/26/2016 1:25 PM, Hans de Goede wrote:
> Hi,
> 
> On 26-05-16 03:15, John Youn wrote:
>> Prior to commit 6c96f05c8bb8 ("reset: Make [of_]reset_control_get[_foo]
>> functions wrappers"), the optional variants returned -ENOTSUPP when
>> CONFIG_RESET_CONTROLLER was not set. This patch reverts to this
>> behavior. Otherwise those calls will return -EINVAL causing users to
>> think that an error occurred when CONFIG_RESET_CONTROLLER is not set.
>>
>> Fixes: 6c96f05c8bb8 ("reset: Make [of_]reset_control_get[_foo] functions wrappers")
>> Signed-off-by: John Youn <johnyoun@synopsys.com>
>> ---
>>
>> Hi Philipp, Hans,
>>
>> The commit referenced above breaks an upcoming patch for the dwc2
>> driver that adds an optional reset control.
>>
>> https://marc.info/?l=linux-usb&m=146161328211584&w=2
>>
>> I've attempted to add the optional variants back the way they were
>> working before. Let me know if I need to do anything else to fix it or
>> if it should be done another way.
>>
>> Regards,
>> John
> 
> Hmm, I don't like all the extra code your patch adds just to fix
> a return value...
> 
> Looking at the code before my "reset: Make [of_]reset_control_get[_foo]
> functions wrappers" patch, all the dev*_get* functions were
> returning ENOTSUPP except for [devm_]reset_control_get, so following
> your logic we should also change the of_reset_control_get_by_index
> variant to return -ENOTSUP.
> 
> Or better, simply make them all return -ENOTSUP, that seems both
> consistent and more KISS to me, this would mean an error code
> change for [devm_]reset_control_get, but will fix all the other
> getters from having a changed error-code, and I would callers
> of [devm_]reset_control_get to not care which error code they
> get, except for -EPROBE_DEFER.
> 
> So IMHO the following change would be a better way to fix this:
> 
> --- a/include/linux/reset.h
> +++ b/include/linux/reset.h
> @@ -65,14 +65,14 @@ static inline struct reset_control *__of_reset_control_get(
>                                          struct device_node *node,
>                                          const char *id, int index, int shared)
>   {
> -   return ERR_PTR(-EINVAL);
> + return ERR_PTR(-ENOTSUPP);
>   }
> 
>   static inline struct reset_control *__devm_reset_control_get(
>                                          struct device *dev,
>                                          const char *id, int index, int shared)
>   {
> -   return ERR_PTR(-EINVAL);
> + return ERR_PTR(-ENOTSUPP);
>   }
> 
>   #endif /* CONFIG_RESET_CONTROLLER */


I'm good with this. However, per Philipp on a previous thread, the
intended behavior is to return -EINVAL for the non-optional functions.

http://marc.info/?l=linux-usb&m=146156945528848&w=2

Philipp,

Any suggestions?

Regards,
John
Hans de Goede May 27, 2016, 7:06 a.m. UTC | #2
Hi,

On 26-05-16 23:44, John Youn wrote:
> On 5/26/2016 1:25 PM, Hans de Goede wrote:
>> Hi,
>>
>> On 26-05-16 03:15, John Youn wrote:
>>> Prior to commit 6c96f05c8bb8 ("reset: Make [of_]reset_control_get[_foo]
>>> functions wrappers"), the optional variants returned -ENOTSUPP when
>>> CONFIG_RESET_CONTROLLER was not set. This patch reverts to this
>>> behavior. Otherwise those calls will return -EINVAL causing users to
>>> think that an error occurred when CONFIG_RESET_CONTROLLER is not set.
>>>
>>> Fixes: 6c96f05c8bb8 ("reset: Make [of_]reset_control_get[_foo] functions wrappers")
>>> Signed-off-by: John Youn <johnyoun@synopsys.com>
>>> ---
>>>
>>> Hi Philipp, Hans,
>>>
>>> The commit referenced above breaks an upcoming patch for the dwc2
>>> driver that adds an optional reset control.
>>>
>>> https://marc.info/?l=linux-usb&m=146161328211584&w=2
>>>
>>> I've attempted to add the optional variants back the way they were
>>> working before. Let me know if I need to do anything else to fix it or
>>> if it should be done another way.
>>>
>>> Regards,
>>> John
>>
>> Hmm, I don't like all the extra code your patch adds just to fix
>> a return value...
>>
>> Looking at the code before my "reset: Make [of_]reset_control_get[_foo]
>> functions wrappers" patch, all the dev*_get* functions were
>> returning ENOTSUPP except for [devm_]reset_control_get, so following
>> your logic we should also change the of_reset_control_get_by_index
>> variant to return -ENOTSUP.
>>
>> Or better, simply make them all return -ENOTSUP, that seems both
>> consistent and more KISS to me, this would mean an error code
>> change for [devm_]reset_control_get, but will fix all the other
>> getters from having a changed error-code, and I would callers
>> of [devm_]reset_control_get to not care which error code they
>> get, except for -EPROBE_DEFER.
>>
>> So IMHO the following change would be a better way to fix this:
>>
>> --- a/include/linux/reset.h
>> +++ b/include/linux/reset.h
>> @@ -65,14 +65,14 @@ static inline struct reset_control *__of_reset_control_get(
>>                                          struct device_node *node,
>>                                          const char *id, int index, int shared)
>>   {
>> -   return ERR_PTR(-EINVAL);
>> + return ERR_PTR(-ENOTSUPP);
>>   }
>>
>>   static inline struct reset_control *__devm_reset_control_get(
>>                                          struct device *dev,
>>                                          const char *id, int index, int shared)
>>   {
>> -   return ERR_PTR(-EINVAL);
>> + return ERR_PTR(-ENOTSUPP);
>>   }
>>
>>   #endif /* CONFIG_RESET_CONTROLLER */
>
>
> I'm good with this. However, per Philipp on a previous thread, the
> intended behavior is to return -EINVAL for the non-optional functions.
>
> http://marc.info/?l=linux-usb&m=146156945528848&w=2

As Philipp rightfully points out, calling the non-optional functions
without CONFIG_RESET_CONTROLLER is a no-no, so IMHO we should not have to
care too much about the error code in that case, as long as we return
an error.

Also note that even before my patch things were already inconsistent
with the of_...get... functions already always returning
-ENOTSUPP when CONFIG_RESET_CONTROLLER was not set, to me it seems
best and also KISS to just return -ENOTSUPP from all get functions
when CONFIG_RESET_CONTROLLER is not set.

Anyways this is Philipp's call, this is all just my 2 cents.

Regards,

Hans
Philipp Zabel May 30, 2016, 10:18 a.m. UTC | #3
Hi,

Am Freitag, den 27.05.2016, 09:06 +0200 schrieb Hans de Goede:
[...]
> >> So IMHO the following change would be a better way to fix this:
> >>
> >> --- a/include/linux/reset.h
> >> +++ b/include/linux/reset.h
> >> @@ -65,14 +65,14 @@ static inline struct reset_control *__of_reset_control_get(
> >>                                          struct device_node *node,
> >>                                          const char *id, int index, int shared)
> >>   {
> >> -   return ERR_PTR(-EINVAL);
> >> + return ERR_PTR(-ENOTSUPP);
> >>   }
> >>
> >>   static inline struct reset_control *__devm_reset_control_get(
> >>                                          struct device *dev,
> >>                                          const char *id, int index, int shared)
> >>   {
> >> -   return ERR_PTR(-EINVAL);
> >> + return ERR_PTR(-ENOTSUPP);
> >>   }
> >>
> >>   #endif /* CONFIG_RESET_CONTROLLER */
> >
> >
> > I'm good with this. However, per Philipp on a previous thread, the
> > intended behavior is to return -EINVAL for the non-optional functions.
> >
> > http://marc.info/?l=linux-usb&m=146156945528848&w=2

Adding Dinh to Cc: because he wanted this changed from -EINVAL.
My point then was that WARN_ON + -EINVAL is indented in this case.

Given that the warning backtrace already helps to identify the issue
(CONFIG_RESET_CONTROLLER disabled), and that changing the return value
to -ENOTSUPP improves consistency with the rest of the API and reduces
the amount of inline wrappers, I concur.

> As Philipp rightfully points out, calling the non-optional functions
> without CONFIG_RESET_CONTROLLER is a no-no, so IMHO we should not have to
> care too much about the error code in that case, as long as we return
> an error.
> 
> Also note that even before my patch things were already inconsistent
> with the of_...get... functions already always returning
> -ENOTSUPP when CONFIG_RESET_CONTROLLER was not set, to me it seems
> best and also KISS to just return -ENOTSUPP from all get functions
> when CONFIG_RESET_CONTROLLER is not set.
> 
> Anyways this is Philipp's call, this is all just my 2 cents.

Let the stubs return -ENOTSUPP consistently. A quick grep doesn't show
any driver handling -EINVAL explicitly either.

regards
Philipp
Hans de Goede May 30, 2016, 11:32 a.m. UTC | #4
Hi,

On 30-05-16 12:18, Philipp Zabel wrote:
> Hi,
>
> Am Freitag, den 27.05.2016, 09:06 +0200 schrieb Hans de Goede:
> [...]
>>>> So IMHO the following change would be a better way to fix this:
>>>>
>>>> --- a/include/linux/reset.h
>>>> +++ b/include/linux/reset.h
>>>> @@ -65,14 +65,14 @@ static inline struct reset_control *__of_reset_control_get(
>>>>                                          struct device_node *node,
>>>>                                          const char *id, int index, int shared)
>>>>   {
>>>> -   return ERR_PTR(-EINVAL);
>>>> + return ERR_PTR(-ENOTSUPP);
>>>>   }
>>>>
>>>>   static inline struct reset_control *__devm_reset_control_get(
>>>>                                          struct device *dev,
>>>>                                          const char *id, int index, int shared)
>>>>   {
>>>> -   return ERR_PTR(-EINVAL);
>>>> + return ERR_PTR(-ENOTSUPP);
>>>>   }
>>>>
>>>>   #endif /* CONFIG_RESET_CONTROLLER */
>>>
>>>
>>> I'm good with this. However, per Philipp on a previous thread, the
>>> intended behavior is to return -EINVAL for the non-optional functions.
>>>
>>> http://marc.info/?l=linux-usb&m=146156945528848&w=2
>
> Adding Dinh to Cc: because he wanted this changed from -EINVAL.
> My point then was that WARN_ON + -EINVAL is indented in this case.
>
> Given that the warning backtrace already helps to identify the issue
> (CONFIG_RESET_CONTROLLER disabled), and that changing the return value
> to -ENOTSUPP improves consistency with the rest of the API and reduces
> the amount of inline wrappers, I concur.
>
>> As Philipp rightfully points out, calling the non-optional functions
>> without CONFIG_RESET_CONTROLLER is a no-no, so IMHO we should not have to
>> care too much about the error code in that case, as long as we return
>> an error.
>>
>> Also note that even before my patch things were already inconsistent
>> with the of_...get... functions already always returning
>> -ENOTSUPP when CONFIG_RESET_CONTROLLER was not set, to me it seems
>> best and also KISS to just return -ENOTSUPP from all get functions
>> when CONFIG_RESET_CONTROLLER is not set.
>>
>> Anyways this is Philipp's call, this is all just my 2 cents.
>
> Let the stubs return -ENOTSUPP consistently. A quick grep doesn't show
> any driver handling -EINVAL explicitly either.

Great.

John Youn, can you submit a patch changing the return of the stubs
from -EINVAL to -ENOTSUPP please ?

Thanks & Regards,

Hans
Philipp Zabel May 30, 2016, 12:11 p.m. UTC | #5
Am Montag, den 30.05.2016, 13:32 +0200 schrieb Hans de Goede:
> Hi,
> 
> On 30-05-16 12:18, Philipp Zabel wrote:
> > Hi,
> >
> > Am Freitag, den 27.05.2016, 09:06 +0200 schrieb Hans de Goede:
> > [...]
> >>>> So IMHO the following change would be a better way to fix this:
> >>>>
> >>>> --- a/include/linux/reset.h
> >>>> +++ b/include/linux/reset.h
> >>>> @@ -65,14 +65,14 @@ static inline struct reset_control *__of_reset_control_get(
> >>>>                                          struct device_node *node,
> >>>>                                          const char *id, int index, int shared)
> >>>>   {
> >>>> -   return ERR_PTR(-EINVAL);
> >>>> + return ERR_PTR(-ENOTSUPP);
> >>>>   }
> >>>>
> >>>>   static inline struct reset_control *__devm_reset_control_get(
> >>>>                                          struct device *dev,
> >>>>                                          const char *id, int index, int shared)
> >>>>   {
> >>>> -   return ERR_PTR(-EINVAL);
> >>>> + return ERR_PTR(-ENOTSUPP);
> >>>>   }
> >>>>
> >>>>   #endif /* CONFIG_RESET_CONTROLLER */
> >>>
> >>>
> >>> I'm good with this. However, per Philipp on a previous thread, the
> >>> intended behavior is to return -EINVAL for the non-optional functions.
> >>>
> >>> http://marc.info/?l=linux-usb&m=146156945528848&w=2
> >
> > Adding Dinh to Cc: because he wanted this changed from -EINVAL.
> > My point then was that WARN_ON + -EINVAL is indented in this case.

No idea how this happened, but I meant "intended", obviously :)

regards
Philipp
John Youn May 31, 2016, 5:53 a.m. UTC | #6
On 5/30/2016 4:32 AM, Hans de Goede wrote:
> Hi,
> 
> On 30-05-16 12:18, Philipp Zabel wrote:
>> Hi,
>>
>> Am Freitag, den 27.05.2016, 09:06 +0200 schrieb Hans de Goede:
>> [...]
>>>>> So IMHO the following change would be a better way to fix this:
>>>>>
>>>>> --- a/include/linux/reset.h
>>>>> +++ b/include/linux/reset.h
>>>>> @@ -65,14 +65,14 @@ static inline struct reset_control *__of_reset_control_get(
>>>>>                                          struct device_node *node,
>>>>>                                          const char *id, int index, int shared)
>>>>>   {
>>>>> -   return ERR_PTR(-EINVAL);
>>>>> + return ERR_PTR(-ENOTSUPP);
>>>>>   }
>>>>>
>>>>>   static inline struct reset_control *__devm_reset_control_get(
>>>>>                                          struct device *dev,
>>>>>                                          const char *id, int index, int shared)
>>>>>   {
>>>>> -   return ERR_PTR(-EINVAL);
>>>>> + return ERR_PTR(-ENOTSUPP);
>>>>>   }
>>>>>
>>>>>   #endif /* CONFIG_RESET_CONTROLLER */
>>>>
>>>>
>>>> I'm good with this. However, per Philipp on a previous thread, the
>>>> intended behavior is to return -EINVAL for the non-optional functions.
>>>>
>>>> http://marc.info/?l=linux-usb&m=146156945528848&w=2
>>
>> Adding Dinh to Cc: because he wanted this changed from -EINVAL.
>> My point then was that WARN_ON + -EINVAL is indented in this case.
>>
>> Given that the warning backtrace already helps to identify the issue
>> (CONFIG_RESET_CONTROLLER disabled), and that changing the return value
>> to -ENOTSUPP improves consistency with the rest of the API and reduces
>> the amount of inline wrappers, I concur.
>>
>>> As Philipp rightfully points out, calling the non-optional functions
>>> without CONFIG_RESET_CONTROLLER is a no-no, so IMHO we should not have to
>>> care too much about the error code in that case, as long as we return
>>> an error.
>>>
>>> Also note that even before my patch things were already inconsistent
>>> with the of_...get... functions already always returning
>>> -ENOTSUPP when CONFIG_RESET_CONTROLLER was not set, to me it seems
>>> best and also KISS to just return -ENOTSUPP from all get functions
>>> when CONFIG_RESET_CONTROLLER is not set.
>>>
>>> Anyways this is Philipp's call, this is all just my 2 cents.
>>
>> Let the stubs return -ENOTSUPP consistently. A quick grep doesn't show
>> any driver handling -EINVAL explicitly either.
> 
> Great.
> 
> John Youn, can you submit a patch changing the return of the stubs
> from -EINVAL to -ENOTSUPP please ?
> 

Sure. I'll send a patch tomorrow.

Regards,
John
diff mbox

Patch

--- a/include/linux/reset.h
+++ b/include/linux/reset.h
@@ -65,14 +65,14 @@  static inline struct reset_control *__of_reset_control_get(
                                         struct device_node *node,
                                         const char *id, int index, int shared)
  {
-   return ERR_PTR(-EINVAL);
+ return ERR_PTR(-ENOTSUPP);
  }

  static inline struct reset_control *__devm_reset_control_get(
                                         struct device *dev,
                                         const char *id, int index, int shared)
  {
-   return ERR_PTR(-EINVAL);
+ return ERR_PTR(-ENOTSUPP);
  }

  #endif /* CONFIG_RESET_CONTROLLER */