* [PATCH v1 1/2] leds: trigger: gpio: GPIO 0 is valid
@ 2019-08-21 17:17 Andy Shevchenko
2019-08-21 17:17 ` [PATCH v1 2/2] leds: trigger: gpio: Convert to use kstrtox() Andy Shevchenko
2019-08-24 16:47 ` [PATCH v1 1/2] leds: trigger: gpio: GPIO 0 is valid Jacek Anaszewski
0 siblings, 2 replies; 7+ messages in thread
From: Andy Shevchenko @ 2019-08-21 17:17 UTC (permalink / raw)
To: Jacek Anaszewski, Pavel Machek, Dan Murphy, linux-leds; +Cc: Andy Shevchenko
Allow all valid GPIOs to be used in the driver.
Fixes: 17354bfe8527 ("leds: Add gpio-led trigger")
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/leds/trigger/ledtrig-gpio.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/leds/trigger/ledtrig-gpio.c b/drivers/leds/trigger/ledtrig-gpio.c
index 33cc99a1a16a..31f456dd4417 100644
--- a/drivers/leds/trigger/ledtrig-gpio.c
+++ b/drivers/leds/trigger/ledtrig-gpio.c
@@ -131,10 +131,10 @@ static ssize_t gpio_trig_gpio_store(struct device *dev,
if (gpio_data->gpio == gpio)
return n;
- if (!gpio) {
- if (gpio_data->gpio != 0)
+ if (!gpio_is_valid(gpio)) {
+ if (gpio_is_valid(gpio_data->gpio))
free_irq(gpio_to_irq(gpio_data->gpio), led);
- gpio_data->gpio = 0;
+ gpio_data->gpio = gpio;
return n;
}
@@ -144,7 +144,7 @@ static ssize_t gpio_trig_gpio_store(struct device *dev,
if (ret) {
dev_err(dev, "request_irq failed with error %d\n", ret);
} else {
- if (gpio_data->gpio != 0)
+ if (gpio_is_valid(gpio_data->gpio))
free_irq(gpio_to_irq(gpio_data->gpio), led);
gpio_data->gpio = gpio;
/* After changing the GPIO, we need to update the LED. */
@@ -181,7 +181,7 @@ static void gpio_trig_deactivate(struct led_classdev *led)
{
struct gpio_trig_data *gpio_data = led_get_trigger_data(led);
- if (gpio_data->gpio != 0)
+ if (gpio_is_valid(gpio_data->gpio))
free_irq(gpio_to_irq(gpio_data->gpio), led);
kfree(gpio_data);
}
--
2.23.0.rc1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v1 2/2] leds: trigger: gpio: Convert to use kstrtox()
2019-08-21 17:17 [PATCH v1 1/2] leds: trigger: gpio: GPIO 0 is valid Andy Shevchenko
@ 2019-08-21 17:17 ` Andy Shevchenko
2019-08-24 16:51 ` Jacek Anaszewski
2019-08-24 16:47 ` [PATCH v1 1/2] leds: trigger: gpio: GPIO 0 is valid Jacek Anaszewski
1 sibling, 1 reply; 7+ messages in thread
From: Andy Shevchenko @ 2019-08-21 17:17 UTC (permalink / raw)
To: Jacek Anaszewski, Pavel Machek, Dan Murphy, linux-leds; +Cc: Andy Shevchenko
sscanf() is a heavy one and moreover requires additional boundary checks.
Convert driver to use kstrtox() and replace kstrtoul() by kstrtobool() in
gpio_trig_inverted_store()
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/leds/trigger/ledtrig-gpio.c | 23 ++++++++++-------------
1 file changed, 10 insertions(+), 13 deletions(-)
diff --git a/drivers/leds/trigger/ledtrig-gpio.c b/drivers/leds/trigger/ledtrig-gpio.c
index 31f456dd4417..b01862b94c99 100644
--- a/drivers/leds/trigger/ledtrig-gpio.c
+++ b/drivers/leds/trigger/ledtrig-gpio.c
@@ -57,13 +57,13 @@ static ssize_t gpio_trig_brightness_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t n)
{
struct gpio_trig_data *gpio_data = led_trigger_get_drvdata(dev);
- unsigned desired_brightness;
+ u8 desired_brightness;
int ret;
- ret = sscanf(buf, "%u", &desired_brightness);
- if (ret < 1 || desired_brightness > 255) {
+ ret = kstrtou8(buf, 10, &desired_brightness);
+ if (ret) {
dev_err(dev, "invalid value\n");
- return -EINVAL;
+ return ret;
}
gpio_data->desired_brightness = desired_brightness;
@@ -86,16 +86,13 @@ static ssize_t gpio_trig_inverted_store(struct device *dev,
{
struct led_classdev *led = led_trigger_get_led(dev);
struct gpio_trig_data *gpio_data = led_trigger_get_drvdata(dev);
- unsigned long inverted;
+ bool inverted;
int ret;
- ret = kstrtoul(buf, 10, &inverted);
- if (ret < 0)
+ ret = kstrtobool(buf, &inverted);
+ if (ret)
return ret;
- if (inverted > 1)
- return -EINVAL;
-
gpio_data->inverted = inverted;
/* After inverting, we need to update the LED. */
@@ -122,10 +119,10 @@ static ssize_t gpio_trig_gpio_store(struct device *dev,
unsigned gpio;
int ret;
- ret = sscanf(buf, "%u", &gpio);
- if (ret < 1) {
+ ret = kstrtouint(buf, 10, &gpio);
+ if (ret) {
dev_err(dev, "couldn't read gpio number\n");
- return -EINVAL;
+ return ret;
}
if (gpio_data->gpio == gpio)
--
2.23.0.rc1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v1 1/2] leds: trigger: gpio: GPIO 0 is valid
2019-08-21 17:17 [PATCH v1 1/2] leds: trigger: gpio: GPIO 0 is valid Andy Shevchenko
2019-08-21 17:17 ` [PATCH v1 2/2] leds: trigger: gpio: Convert to use kstrtox() Andy Shevchenko
@ 2019-08-24 16:47 ` Jacek Anaszewski
2019-08-26 9:57 ` Andy Shevchenko
1 sibling, 1 reply; 7+ messages in thread
From: Jacek Anaszewski @ 2019-08-24 16:47 UTC (permalink / raw)
To: Andy Shevchenko, Pavel Machek, Dan Murphy, linux-leds
Hi Andy,
Thank you for the patch.
On 8/21/19 7:17 PM, Andy Shevchenko wrote:
> Allow all valid GPIOs to be used in the driver.
>
> Fixes: 17354bfe8527 ("leds: Add gpio-led trigger")
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
> drivers/leds/trigger/ledtrig-gpio.c | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/leds/trigger/ledtrig-gpio.c b/drivers/leds/trigger/ledtrig-gpio.c
> index 33cc99a1a16a..31f456dd4417 100644
> --- a/drivers/leds/trigger/ledtrig-gpio.c
> +++ b/drivers/leds/trigger/ledtrig-gpio.c
> @@ -131,10 +131,10 @@ static ssize_t gpio_trig_gpio_store(struct device *dev,
> if (gpio_data->gpio == gpio)
> return n;
>
> - if (!gpio) {
> - if (gpio_data->gpio != 0)
> + if (!gpio_is_valid(gpio)) {
> + if (gpio_is_valid(gpio_data->gpio))
> free_irq(gpio_to_irq(gpio_data->gpio), led);
> - gpio_data->gpio = 0;
> + gpio_data->gpio = gpio;
It looks odd to me. I'd just assign invalid constant gpio number
e.g. -1.
Note that we should also do that in gpio_trig_activate(), where
gpio_data->gpio is initialized to 0 by kzalloc(). That later can
have nasty side effect in gpio_trig_gpio_store() when gpio to set
is 0. Then the condition "if (gpio_data->gpio == gpio)" will evaluate
to true and gpio_trig_irq() handler will not be registered.
> return n;
> }
>
> @@ -144,7 +144,7 @@ static ssize_t gpio_trig_gpio_store(struct device *dev,
> if (ret) {
> dev_err(dev, "request_irq failed with error %d\n", ret);
> } else {
> - if (gpio_data->gpio != 0)
> + if (gpio_is_valid(gpio_data->gpio))
> free_irq(gpio_to_irq(gpio_data->gpio), led);
> gpio_data->gpio = gpio;
> /* After changing the GPIO, we need to update the LED. */
> @@ -181,7 +181,7 @@ static void gpio_trig_deactivate(struct led_classdev *led)
> {
> struct gpio_trig_data *gpio_data = led_get_trigger_data(led);
>
> - if (gpio_data->gpio != 0)
> + if (gpio_is_valid(gpio_data->gpio))
> free_irq(gpio_to_irq(gpio_data->gpio), led);
> kfree(gpio_data);
> }
>
--
Best regards,
Jacek Anaszewski
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v1 2/2] leds: trigger: gpio: Convert to use kstrtox()
2019-08-21 17:17 ` [PATCH v1 2/2] leds: trigger: gpio: Convert to use kstrtox() Andy Shevchenko
@ 2019-08-24 16:51 ` Jacek Anaszewski
0 siblings, 0 replies; 7+ messages in thread
From: Jacek Anaszewski @ 2019-08-24 16:51 UTC (permalink / raw)
To: Andy Shevchenko, Pavel Machek, Dan Murphy, linux-leds
Hi Andy,
Thank you for the patch.
On 8/21/19 7:17 PM, Andy Shevchenko wrote:
> sscanf() is a heavy one and moreover requires additional boundary checks.
> Convert driver to use kstrtox() and replace kstrtoul() by kstrtobool() in
> gpio_trig_inverted_store()
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
> drivers/leds/trigger/ledtrig-gpio.c | 23 ++++++++++-------------
> 1 file changed, 10 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/leds/trigger/ledtrig-gpio.c b/drivers/leds/trigger/ledtrig-gpio.c
> index 31f456dd4417..b01862b94c99 100644
> --- a/drivers/leds/trigger/ledtrig-gpio.c
> +++ b/drivers/leds/trigger/ledtrig-gpio.c
> @@ -57,13 +57,13 @@ static ssize_t gpio_trig_brightness_store(struct device *dev,
> struct device_attribute *attr, const char *buf, size_t n)
> {
> struct gpio_trig_data *gpio_data = led_trigger_get_drvdata(dev);
> - unsigned desired_brightness;
> + u8 desired_brightness;
> int ret;
>
> - ret = sscanf(buf, "%u", &desired_brightness);
> - if (ret < 1 || desired_brightness > 255) {
LED_FULL (255) is already not a hard limit for quite a long time.
While we are at it we could change that to led->max_brightness.
> + ret = kstrtou8(buf, 10, &desired_brightness);
> + if (ret) {
> dev_err(dev, "invalid value\n");
> - return -EINVAL;
> + return ret;
> }
>
> gpio_data->desired_brightness = desired_brightness;
> @@ -86,16 +86,13 @@ static ssize_t gpio_trig_inverted_store(struct device *dev,
> {
> struct led_classdev *led = led_trigger_get_led(dev);
> struct gpio_trig_data *gpio_data = led_trigger_get_drvdata(dev);
> - unsigned long inverted;
> + bool inverted;
> int ret;
>
> - ret = kstrtoul(buf, 10, &inverted);
> - if (ret < 0)
> + ret = kstrtobool(buf, &inverted);
> + if (ret)
> return ret;
>
> - if (inverted > 1)
> - return -EINVAL;
> -
> gpio_data->inverted = inverted;
>
> /* After inverting, we need to update the LED. */
> @@ -122,10 +119,10 @@ static ssize_t gpio_trig_gpio_store(struct device *dev,
> unsigned gpio;
> int ret;
>
> - ret = sscanf(buf, "%u", &gpio);
> - if (ret < 1) {
> + ret = kstrtouint(buf, 10, &gpio);
> + if (ret) {
> dev_err(dev, "couldn't read gpio number\n");
> - return -EINVAL;
> + return ret;
> }
>
> if (gpio_data->gpio == gpio)
>
--
Best regards,
Jacek Anaszewski
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v1 1/2] leds: trigger: gpio: GPIO 0 is valid
2019-08-24 16:47 ` [PATCH v1 1/2] leds: trigger: gpio: GPIO 0 is valid Jacek Anaszewski
@ 2019-08-26 9:57 ` Andy Shevchenko
2019-08-26 18:36 ` Jacek Anaszewski
0 siblings, 1 reply; 7+ messages in thread
From: Andy Shevchenko @ 2019-08-26 9:57 UTC (permalink / raw)
To: Jacek Anaszewski; +Cc: Pavel Machek, Dan Murphy, linux-leds
On Sat, Aug 24, 2019 at 06:47:54PM +0200, Jacek Anaszewski wrote:
> On 8/21/19 7:17 PM, Andy Shevchenko wrote:
> > Allow all valid GPIOs to be used in the driver.
> >
> > Fixes: 17354bfe8527 ("leds: Add gpio-led trigger")
> > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > - if (!gpio) {
> > - if (gpio_data->gpio != 0)
> > + if (!gpio_is_valid(gpio)) {
> > + if (gpio_is_valid(gpio_data->gpio))
> > free_irq(gpio_to_irq(gpio_data->gpio), led);
> > - gpio_data->gpio = 0;
> > + gpio_data->gpio = gpio;
>
> It looks odd to me. I'd just assign invalid constant gpio number
> e.g. -1.
Current ABI (unsigned) doesn't allow us to do this. Internally we can redefine
invalid GPIO line number to -1 or so, but does it worth it? And actually I
would prefer -EINVAL or -ENOENT in such cases.
> Note that we should also do that in gpio_trig_activate(), where
> gpio_data->gpio is initialized to 0 by kzalloc(). That later can
> have nasty side effect in gpio_trig_gpio_store() when gpio to set
> is 0. Then the condition "if (gpio_data->gpio == gpio)" will evaluate
> to true and gpio_trig_irq() handler will not be registered.
Thanks for spotting this!
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v1 1/2] leds: trigger: gpio: GPIO 0 is valid
2019-08-26 9:57 ` Andy Shevchenko
@ 2019-08-26 18:36 ` Jacek Anaszewski
2019-08-30 15:01 ` Andy Shevchenko
0 siblings, 1 reply; 7+ messages in thread
From: Jacek Anaszewski @ 2019-08-26 18:36 UTC (permalink / raw)
To: Andy Shevchenko; +Cc: Pavel Machek, Dan Murphy, linux-leds
On 8/26/19 11:57 AM, Andy Shevchenko wrote:
> On Sat, Aug 24, 2019 at 06:47:54PM +0200, Jacek Anaszewski wrote:
>> On 8/21/19 7:17 PM, Andy Shevchenko wrote:
>>> Allow all valid GPIOs to be used in the driver.
>>>
>>> Fixes: 17354bfe8527 ("leds: Add gpio-led trigger")
>>> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
>
>>> - if (!gpio) {
>>> - if (gpio_data->gpio != 0)
>>> + if (!gpio_is_valid(gpio)) {
>>> + if (gpio_is_valid(gpio_data->gpio))
>>> free_irq(gpio_to_irq(gpio_data->gpio), led);
>>> - gpio_data->gpio = 0;
>>> + gpio_data->gpio = gpio;
>>
>> It looks odd to me. I'd just assign invalid constant gpio number
>> e.g. -1.
>
> Current ABI (unsigned) doesn't allow us to do this. Internally we can redefine
Ah, right, missed that.
> invalid GPIO line number to -1 or so, but does it worth it? And actually I
> would prefer -EINVAL or -ENOENT in such cases.
OK, we can keep your "= gpio" assignment in view of the above, but need
to return error instead of "n".
>> Note that we should also do that in gpio_trig_activate(), where
>> gpio_data->gpio is initialized to 0 by kzalloc(). That later can
>> have nasty side effect in gpio_trig_gpio_store() when gpio to set
>> is 0. Then the condition "if (gpio_data->gpio == gpio)" will evaluate
>> to true and gpio_trig_irq() handler will not be registered.
>
> Thanks for spotting this!
>
--
Best regards,
Jacek Anaszewski
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v1 1/2] leds: trigger: gpio: GPIO 0 is valid
2019-08-26 18:36 ` Jacek Anaszewski
@ 2019-08-30 15:01 ` Andy Shevchenko
0 siblings, 0 replies; 7+ messages in thread
From: Andy Shevchenko @ 2019-08-30 15:01 UTC (permalink / raw)
To: Jacek Anaszewski; +Cc: Pavel Machek, Dan Murphy, linux-leds
On Mon, Aug 26, 2019 at 08:36:04PM +0200, Jacek Anaszewski wrote:
> On 8/26/19 11:57 AM, Andy Shevchenko wrote:
> > On Sat, Aug 24, 2019 at 06:47:54PM +0200, Jacek Anaszewski wrote:
> >> On 8/21/19 7:17 PM, Andy Shevchenko wrote:
> >>> Allow all valid GPIOs to be used in the driver.
> >>>
> >>> Fixes: 17354bfe8527 ("leds: Add gpio-led trigger")
> >>> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> >
> >>> - if (!gpio) {
> >>> - if (gpio_data->gpio != 0)
> >>> + if (!gpio_is_valid(gpio)) {
> >>> + if (gpio_is_valid(gpio_data->gpio))
> >>> free_irq(gpio_to_irq(gpio_data->gpio), led);
> >>> - gpio_data->gpio = 0;
> >>> + gpio_data->gpio = gpio;
> >>
> >> It looks odd to me. I'd just assign invalid constant gpio number
> >> e.g. -1.
> >
> > Current ABI (unsigned) doesn't allow us to do this. Internally we can redefine
>
> Ah, right, missed that.
>
> > invalid GPIO line number to -1 or so, but does it worth it? And actually I
> > would prefer -EINVAL or -ENOENT in such cases.
>
> OK, we can keep your "= gpio" assignment in view of the above, but need
> to return error instead of "n".
Then we will break an ABI, where user expects no error it suddenly will be one.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2019-08-30 15:01 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-21 17:17 [PATCH v1 1/2] leds: trigger: gpio: GPIO 0 is valid Andy Shevchenko
2019-08-21 17:17 ` [PATCH v1 2/2] leds: trigger: gpio: Convert to use kstrtox() Andy Shevchenko
2019-08-24 16:51 ` Jacek Anaszewski
2019-08-24 16:47 ` [PATCH v1 1/2] leds: trigger: gpio: GPIO 0 is valid Jacek Anaszewski
2019-08-26 9:57 ` Andy Shevchenko
2019-08-26 18:36 ` Jacek Anaszewski
2019-08-30 15:01 ` Andy Shevchenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).