All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/2] gpio: Add devm_fwnode_gpiod_get_optional() helpers
@ 2020-08-26 20:08 Krzysztof Kozlowski
  2020-08-26 20:08 ` [PATCH v2 2/2] Input: gpio_keys - Simplify with dev_err_probe() Krzysztof Kozlowski
       [not found] ` <CAHp75VfSE_9D4UBwJLt2b_JyBLiN_giOd8mWpodbMAVJ8wj=cA@mail.gmail.com>
  0 siblings, 2 replies; 8+ messages in thread
From: Krzysztof Kozlowski @ 2020-08-26 20:08 UTC (permalink / raw)
  To: Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov,
	Gustavo A. R. Silva, Krzysztof Kozlowski, Hans de Goede,
	linux-gpio, linux-kernel, linux-input
  Cc: Andy Shevchenko

Add devm_fwnode_gpiod_get_optional() and
devm_fwnode_gpiod_get_index_optional() helpers, similar to regular
devm_gpiod optional versions.  Drivers getting GPIOs from a firmware
node might use it to remove some boilerplate code.

Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>

---

Changes since v1:
1. New patch
---
 drivers/gpio/gpiolib-devres.c | 71 +++++++++++++++++++++++++++++++++++
 include/linux/gpio/consumer.h | 30 +++++++++++++++
 2 files changed, 101 insertions(+)

diff --git a/drivers/gpio/gpiolib-devres.c b/drivers/gpio/gpiolib-devres.c
index 7dbce4c4ebdf..f8476f6a65cc 100644
--- a/drivers/gpio/gpiolib-devres.c
+++ b/drivers/gpio/gpiolib-devres.c
@@ -184,6 +184,37 @@ struct gpio_desc *devm_gpiod_get_from_of_node(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(devm_gpiod_get_from_of_node);
 
+/**
+ * devm_fwnode_gpiod_get_optional - Resource-managed fwnode_gpiod_get_index()
+ *                                  for optional GPIO
+ * @dev:	GPIO consumer
+ * @fwnode:	firmware node containing GPIO reference
+ * @con_id:	function within the GPIO consumer
+ * @flags:	GPIO initialization flags
+ * @label:	label to attach to the requested GPIO
+ *
+ * GPIO descriptors returned from this function are automatically disposed on
+ * driver detach.
+ *
+ * This is equivalent to devm_fwnode_gpiod_get_index(), except that when no
+ * GPIO with the specified index was assigned to the requested function it will
+ * return NULL.  This is convenient for drivers that need to handle optional
+ * GPIOs.
+ *
+ * On successful request the GPIO pin is configured in accordance with
+ * provided @flags.
+ */
+struct gpio_desc *devm_fwnode_gpiod_get_optional(struct device *dev,
+						 struct fwnode_handle *fwnode,
+						 const char *con_id,
+						 enum gpiod_flags flags,
+						 const char *label)
+{
+	return devm_fwnode_gpiod_get_index_optional(dev, fwnode, con_id, 0,
+						    flags, label);
+}
+EXPORT_SYMBOL_GPL(devm_fwnode_gpiod_get_optional);
+
 /**
  * devm_fwnode_gpiod_get_index - get a GPIO descriptor from a given node
  * @dev:	GPIO consumer
@@ -226,6 +257,46 @@ struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(devm_fwnode_gpiod_get_index);
 
+/**
+ * devm_fwnode_gpiod_get_index_optional - Resource-managed fwnode_gpiod_get_index()
+ *                                        for optional GPIO
+ * @dev:	GPIO consumer
+ * @fwnode:	firmware node containing GPIO reference
+ * @con_id:	function within the GPIO consumer
+ * @index:	index of the GPIO to obtain in the consumer
+ * @flags:	GPIO initialization flags
+ * @label:	label to attach to the requested GPIO
+ *
+ * GPIO descriptors returned from this function are automatically disposed on
+ * driver detach.
+ *
+ * This is equivalent to devm_fwnode_gpiod_get_index(), except that when no
+ * GPIO with the specified index was assigned to the requested function it will
+ * return NULL.  This is convenient for drivers that need to handle optional
+ * GPIOs.
+ *
+ * On successful request the GPIO pin is configured in accordance with
+ * provided @flags.
+ */
+struct gpio_desc *devm_fwnode_gpiod_get_index_optional(struct device *dev,
+						       struct fwnode_handle *fwnode,
+						       const char *con_id, int index,
+						       enum gpiod_flags flags,
+						       const char *label)
+{
+	struct gpio_desc *desc;
+
+	desc = devm_fwnode_gpiod_get_index(dev, fwnode, con_id, index, flags,
+					   label);
+	if (IS_ERR(desc)) {
+		if (PTR_ERR(desc) == -ENOENT)
+			return NULL;
+	}
+
+	return desc;
+}
+EXPORT_SYMBOL_GPL(devm_fwnode_gpiod_get_index_optional);
+
 /**
  * devm_gpiod_get_index_optional - Resource-managed gpiod_get_index_optional()
  * @dev: GPIO consumer
diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h
index 901aab89d025..2364c5ca9384 100644
--- a/include/linux/gpio/consumer.h
+++ b/include/linux/gpio/consumer.h
@@ -183,11 +183,21 @@ struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode,
 					 const char *con_id, int index,
 					 enum gpiod_flags flags,
 					 const char *label);
+struct gpio_desc *devm_fwnode_gpiod_get_optional(struct device *dev,
+						 struct fwnode_handle *fwnode,
+						 const char *con_id,
+						 enum gpiod_flags flags,
+						 const char *label);
 struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
 					      struct fwnode_handle *child,
 					      const char *con_id, int index,
 					      enum gpiod_flags flags,
 					      const char *label);
+struct gpio_desc *devm_fwnode_gpiod_get_index_optional(struct device *dev,
+						       struct fwnode_handle *fwnode,
+						       const char *con_id, int index,
+						       enum gpiod_flags flags,
+						       const char *label);
 
 #else /* CONFIG_GPIOLIB */
 
@@ -562,6 +572,16 @@ struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode,
 	return ERR_PTR(-ENOSYS);
 }
 
+static inline
+struct gpio_desc *devm_fwnode_gpiod_get_optional(struct device *dev,
+						 struct fwnode_handle *fwnode,
+						 const char *con_id,
+						 enum gpiod_flags flags,
+						 const char *label)
+{
+	return ERR_PTR(-ENOSYS);
+}
+
 static inline
 struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
 					      struct fwnode_handle *fwnode,
@@ -572,6 +592,16 @@ struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
 	return ERR_PTR(-ENOSYS);
 }
 
+static inline
+struct gpio_desc *devm_fwnode_gpiod_get_index_optional(struct device *dev,
+						       struct fwnode_handle *fwnode,
+						       const char *con_id, int index,
+						       enum gpiod_flags flags,
+						       const char *label)
+{
+	return ERR_PTR(-ENOSYS);
+}
+
 #endif /* CONFIG_GPIOLIB */
 
 static inline
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 2/2] Input: gpio_keys - Simplify with dev_err_probe()
  2020-08-26 20:08 [PATCH v2 1/2] gpio: Add devm_fwnode_gpiod_get_optional() helpers Krzysztof Kozlowski
@ 2020-08-26 20:08 ` Krzysztof Kozlowski
  2020-08-27  0:06   ` kernel test robot
                     ` (2 more replies)
       [not found] ` <CAHp75VfSE_9D4UBwJLt2b_JyBLiN_giOd8mWpodbMAVJ8wj=cA@mail.gmail.com>
  1 sibling, 3 replies; 8+ messages in thread
From: Krzysztof Kozlowski @ 2020-08-26 20:08 UTC (permalink / raw)
  To: Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov,
	Gustavo A. R. Silva, Krzysztof Kozlowski, Hans de Goede,
	linux-gpio, linux-kernel, linux-input
  Cc: Andy Shevchenko

Common pattern of handling deferred probe can be simplified with
dev_err_probe() and devm_fwnode_gpiod_get_optional().   Less code and
the error value gets printed.

Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>

---

Changes since v1:
1. Use devm_fwnode_gpiod_get_optional
---
 drivers/input/keyboard/gpio_keys.c | 21 ++++-----------------
 1 file changed, 4 insertions(+), 17 deletions(-)

diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
index f2d4e4daa818..a07ac6fa25ed 100644
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -494,23 +494,10 @@ static int gpio_keys_setup_key(struct platform_device *pdev,
 	spin_lock_init(&bdata->lock);
 
 	if (child) {
-		bdata->gpiod = devm_fwnode_gpiod_get(dev, child,
-						     NULL, GPIOD_IN, desc);
-		if (IS_ERR(bdata->gpiod)) {
-			error = PTR_ERR(bdata->gpiod);
-			if (error == -ENOENT) {
-				/*
-				 * GPIO is optional, we may be dealing with
-				 * purely interrupt-driven setup.
-				 */
-				bdata->gpiod = NULL;
-			} else {
-				if (error != -EPROBE_DEFER)
-					dev_err(dev, "failed to get gpio: %d\n",
-						error);
-				return error;
-			}
-		}
+		bdata->gpiod = devm_fwnode_gpiod_get_optional(dev, child, NULL,
+							      GPIOD_IN, desc);
+		if (IS_ERR(bdata->gpiod))
+			return dev_err_probe(dev, error, "failed to get gpio\n");
 	} else if (gpio_is_valid(button->gpio)) {
 		/*
 		 * Legacy GPIO number, so request the GPIO here and
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 2/2] Input: gpio_keys - Simplify with dev_err_probe()
  2020-08-26 20:08 ` [PATCH v2 2/2] Input: gpio_keys - Simplify with dev_err_probe() Krzysztof Kozlowski
@ 2020-08-27  0:06   ` kernel test robot
       [not found]   ` <CAHp75VcgE+HJOKkV6-crzH1w+qOtSKR8=i1Y3ufnhTiAcYV=7A@mail.gmail.com>
  2020-08-31  9:44     ` Dan Carpenter
  2 siblings, 0 replies; 8+ messages in thread
From: kernel test robot @ 2020-08-27  0:06 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 7907 bytes --]

Hi Krzysztof,

I love your patch! Perhaps something to improve:

[auto build test WARNING on gpio/for-next]
[also build test WARNING on input/next v5.9-rc2 next-20200826]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Krzysztof-Kozlowski/gpio-Add-devm_fwnode_gpiod_get_optional-helpers/20200827-041021
base:   https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git for-next
config: x86_64-randconfig-a006-20200826 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project 7cfcecece0e0430937cf529ce74d3a071a4dedc6)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install x86_64 cross compiling tool for clang build
        # apt-get install binutils-x86-64-linux-gnu
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   drivers/input/keyboard/gpio_keys.c:500:11: error: implicit declaration of function 'dev_err_probe' [-Werror,-Wimplicit-function-declaration]
                           return dev_err_probe(dev, error, "failed to get gpio\n");
                                  ^
   drivers/input/keyboard/gpio_keys.c:500:11: note: did you mean 'device_reprobe'?
   include/linux/device.h:880:25: note: 'device_reprobe' declared here
   extern int __must_check device_reprobe(struct device *dev);
                           ^
>> drivers/input/keyboard/gpio_keys.c:500:30: warning: variable 'error' is uninitialized when used here [-Wuninitialized]
                           return dev_err_probe(dev, error, "failed to get gpio\n");
                                                     ^~~~~
   drivers/input/keyboard/gpio_keys.c:490:11: note: initialize the variable 'error' to silence this warning
           int error;
                    ^
                     = 0
   1 warning and 1 error generated.

# https://github.com/0day-ci/linux/commit/e138d2340a72b4f117d0da36fe7cddb4bc073c58
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Krzysztof-Kozlowski/gpio-Add-devm_fwnode_gpiod_get_optional-helpers/20200827-041021
git checkout e138d2340a72b4f117d0da36fe7cddb4bc073c58
vim +/error +500 drivers/input/keyboard/gpio_keys.c

   476	
   477	static int gpio_keys_setup_key(struct platform_device *pdev,
   478					struct input_dev *input,
   479					struct gpio_keys_drvdata *ddata,
   480					const struct gpio_keys_button *button,
   481					int idx,
   482					struct fwnode_handle *child)
   483	{
   484		const char *desc = button->desc ? button->desc : "gpio_keys";
   485		struct device *dev = &pdev->dev;
   486		struct gpio_button_data *bdata = &ddata->data[idx];
   487		irq_handler_t isr;
   488		unsigned long irqflags;
   489		int irq;
   490		int error;
   491	
   492		bdata->input = input;
   493		bdata->button = button;
   494		spin_lock_init(&bdata->lock);
   495	
   496		if (child) {
   497			bdata->gpiod = devm_fwnode_gpiod_get_optional(dev, child, NULL,
   498								      GPIOD_IN, desc);
   499			if (IS_ERR(bdata->gpiod))
 > 500				return dev_err_probe(dev, error, "failed to get gpio\n");
   501		} else if (gpio_is_valid(button->gpio)) {
   502			/*
   503			 * Legacy GPIO number, so request the GPIO here and
   504			 * convert it to descriptor.
   505			 */
   506			unsigned flags = GPIOF_IN;
   507	
   508			if (button->active_low)
   509				flags |= GPIOF_ACTIVE_LOW;
   510	
   511			error = devm_gpio_request_one(dev, button->gpio, flags, desc);
   512			if (error < 0) {
   513				dev_err(dev, "Failed to request GPIO %d, error %d\n",
   514					button->gpio, error);
   515				return error;
   516			}
   517	
   518			bdata->gpiod = gpio_to_desc(button->gpio);
   519			if (!bdata->gpiod)
   520				return -EINVAL;
   521		}
   522	
   523		if (bdata->gpiod) {
   524			bool active_low = gpiod_is_active_low(bdata->gpiod);
   525	
   526			if (button->debounce_interval) {
   527				error = gpiod_set_debounce(bdata->gpiod,
   528						button->debounce_interval * 1000);
   529				/* use timer if gpiolib doesn't provide debounce */
   530				if (error < 0)
   531					bdata->software_debounce =
   532							button->debounce_interval;
   533			}
   534	
   535			if (button->irq) {
   536				bdata->irq = button->irq;
   537			} else {
   538				irq = gpiod_to_irq(bdata->gpiod);
   539				if (irq < 0) {
   540					error = irq;
   541					dev_err(dev,
   542						"Unable to get irq number for GPIO %d, error %d\n",
   543						button->gpio, error);
   544					return error;
   545				}
   546				bdata->irq = irq;
   547			}
   548	
   549			INIT_DELAYED_WORK(&bdata->work, gpio_keys_gpio_work_func);
   550	
   551			isr = gpio_keys_gpio_isr;
   552			irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
   553	
   554			switch (button->wakeup_event_action) {
   555			case EV_ACT_ASSERTED:
   556				bdata->wakeup_trigger_type = active_low ?
   557					IRQ_TYPE_EDGE_FALLING : IRQ_TYPE_EDGE_RISING;
   558				break;
   559			case EV_ACT_DEASSERTED:
   560				bdata->wakeup_trigger_type = active_low ?
   561					IRQ_TYPE_EDGE_RISING : IRQ_TYPE_EDGE_FALLING;
   562				break;
   563			case EV_ACT_ANY:
   564				/* fall through */
   565			default:
   566				/*
   567				 * For other cases, we are OK letting suspend/resume
   568				 * not reconfigure the trigger type.
   569				 */
   570				break;
   571			}
   572		} else {
   573			if (!button->irq) {
   574				dev_err(dev, "Found button without gpio or irq\n");
   575				return -EINVAL;
   576			}
   577	
   578			bdata->irq = button->irq;
   579	
   580			if (button->type && button->type != EV_KEY) {
   581				dev_err(dev, "Only EV_KEY allowed for IRQ buttons.\n");
   582				return -EINVAL;
   583			}
   584	
   585			bdata->release_delay = button->debounce_interval;
   586			timer_setup(&bdata->release_timer, gpio_keys_irq_timer, 0);
   587	
   588			isr = gpio_keys_irq_isr;
   589			irqflags = 0;
   590	
   591			/*
   592			 * For IRQ buttons, there is no interrupt for release.
   593			 * So we don't need to reconfigure the trigger type for wakeup.
   594			 */
   595		}
   596	
   597		bdata->code = &ddata->keymap[idx];
   598		*bdata->code = button->code;
   599		input_set_capability(input, button->type ?: EV_KEY, *bdata->code);
   600	
   601		/*
   602		 * Install custom action to cancel release timer and
   603		 * workqueue item.
   604		 */
   605		error = devm_add_action(dev, gpio_keys_quiesce_key, bdata);
   606		if (error) {
   607			dev_err(dev, "failed to register quiesce action, error: %d\n",
   608				error);
   609			return error;
   610		}
   611	
   612		/*
   613		 * If platform has specified that the button can be disabled,
   614		 * we don't want it to share the interrupt line.
   615		 */
   616		if (!button->can_disable)
   617			irqflags |= IRQF_SHARED;
   618	
   619		error = devm_request_any_context_irq(dev, bdata->irq, isr, irqflags,
   620						     desc, bdata);
   621		if (error < 0) {
   622			dev_err(dev, "Unable to claim irq %d; error %d\n",
   623				bdata->irq, error);
   624			return error;
   625		}
   626	
   627		return 0;
   628	}
   629	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 41133 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 1/2] gpio: Add devm_fwnode_gpiod_get_optional() helpers
       [not found] ` <CAHp75VfSE_9D4UBwJLt2b_JyBLiN_giOd8mWpodbMAVJ8wj=cA@mail.gmail.com>
@ 2020-08-27  6:16   ` Krzysztof Kozlowski
  0 siblings, 0 replies; 8+ messages in thread
From: Krzysztof Kozlowski @ 2020-08-27  6:16 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov,
	Gustavo A. R. Silva, Hans de Goede, linux-gpio, linux-kernel,
	linux-input

On Thu, Aug 27, 2020 at 12:04:13AM +0300, Andy Shevchenko wrote:
> On Wednesday, August 26, 2020, Krzysztof Kozlowski <krzk@kernel.org> wrote:
> 
> > Add devm_fwnode_gpiod_get_optional() and
> > devm_fwnode_gpiod_get_index_optional() helpers, similar to regular
> > devm_gpiod optional versions.  Drivers getting GPIOs from a firmware
> > node might use it to remove some boilerplate code.
> >
> 
> 
> Shouldn't it return NULL for !GPIO case?

Indeed, good point.

Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 2/2] Input: gpio_keys - Simplify with dev_err_probe()
       [not found]   ` <CAHp75VcgE+HJOKkV6-crzH1w+qOtSKR8=i1Y3ufnhTiAcYV=7A@mail.gmail.com>
@ 2020-08-27  6:17     ` Krzysztof Kozlowski
  0 siblings, 0 replies; 8+ messages in thread
From: Krzysztof Kozlowski @ 2020-08-27  6:17 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov,
	Gustavo A. R. Silva, Hans de Goede, linux-gpio, linux-kernel,
	linux-input

On Thu, Aug 27, 2020 at 12:05:51AM +0300, Andy Shevchenko wrote:
> On Wednesday, August 26, 2020, Krzysztof Kozlowski <krzk@kernel.org> wrote:
> 
> > Common pattern of handling deferred probe can be simplified with
> > dev_err_probe() and devm_fwnode_gpiod_get_optional().   Less code and
> > the error value gets printed.
> >
> > Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
> > Reviewed-by: Hans de Goede <hdegoede@redhat.com>
> >
> > ---
> >
> > Changes since v1:
> > 1. Use devm_fwnode_gpiod_get_optional
> > ---
> >  drivers/input/keyboard/gpio_keys.c | 21 ++++-----------------
> >  1 file changed, 4 insertions(+), 17 deletions(-)
> >
> > diff --git a/drivers/input/keyboard/gpio_keys.c
> > b/drivers/input/keyboard/gpio_keys.c
> > index f2d4e4daa818..a07ac6fa25ed 100644
> > --- a/drivers/input/keyboard/gpio_keys.c
> > +++ b/drivers/input/keyboard/gpio_keys.c
> > @@ -494,23 +494,10 @@ static int gpio_keys_setup_key(struct
> > platform_device *pdev,
> >         spin_lock_init(&bdata->lock);
> >
> >         if (child) {
> > -               bdata->gpiod = devm_fwnode_gpiod_get(dev, child,
> > -                                                    NULL, GPIOD_IN, desc);
> > -               if (IS_ERR(bdata->gpiod)) {
> > -                       error = PTR_ERR(bdata->gpiod);
> > -                       if (error == -ENOENT) {
> > -                               /*
> > -                                * GPIO is optional, we may be dealing with
> > -                                * purely interrupt-driven setup.
> > -                                */
> 
> 
> Can we preserve this comment?

Sure.

Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 2/2] Input: gpio_keys - Simplify with dev_err_probe()
  2020-08-26 20:08 ` [PATCH v2 2/2] Input: gpio_keys - Simplify with dev_err_probe() Krzysztof Kozlowski
@ 2020-08-31  9:44     ` Dan Carpenter
       [not found]   ` <CAHp75VcgE+HJOKkV6-crzH1w+qOtSKR8=i1Y3ufnhTiAcYV=7A@mail.gmail.com>
  2020-08-31  9:44     ` Dan Carpenter
  2 siblings, 0 replies; 8+ messages in thread
From: Dan Carpenter @ 2020-08-31  9:44 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 4924 bytes --]

Hi Krzysztof,

url:    https://github.com/0day-ci/linux/commits/Krzysztof-Kozlowski/gpio-Add-devm_fwnode_gpiod_get_optional-helpers/20200827-041021
base:   https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git for-next
config: x86_64-randconfig-m001-20200826 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

New smatch warnings:
drivers/input/keyboard/gpio_keys.c:500 gpio_keys_setup_key() error: uninitialized symbol 'error'.

# https://github.com/0day-ci/linux/commit/e138d2340a72b4f117d0da36fe7cddb4bc073c58
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Krzysztof-Kozlowski/gpio-Add-devm_fwnode_gpiod_get_optional-helpers/20200827-041021
git checkout e138d2340a72b4f117d0da36fe7cddb4bc073c58
vim +/error +500 drivers/input/keyboard/gpio_keys.c

5298cc4cc753bb Bill Pemberton      2012-11-23  477  static int gpio_keys_setup_key(struct platform_device *pdev,
d9080921aa32c7 Dmitry Torokhov     2012-03-18  478  				struct input_dev *input,
83e4947a569f4d Hans de Goede       2017-01-21  479  				struct gpio_keys_drvdata *ddata,
700a38b27eefc5 Dmitry Torokhov     2016-10-19  480  				const struct gpio_keys_button *button,
83e4947a569f4d Hans de Goede       2017-01-21  481  				int idx,
700a38b27eefc5 Dmitry Torokhov     2016-10-19  482  				struct fwnode_handle *child)
bc8f1eaf68a8aa Ben Dooks           2009-11-10  483  {
92a47674f57b4a Alexander Stein     2011-04-11  484  	const char *desc = button->desc ? button->desc : "gpio_keys";
9e3af04f878731 Mika Westerberg     2010-02-04  485  	struct device *dev = &pdev->dev;
83e4947a569f4d Hans de Goede       2017-01-21  486  	struct gpio_button_data *bdata = &ddata->data[idx];
d8ee4a1c90529e Laxman Dewangan     2012-03-19  487  	irq_handler_t isr;
9e3af04f878731 Mika Westerberg     2010-02-04  488  	unsigned long irqflags;
27245519f0de50 Alexander Shiyan    2014-04-28  489  	int irq;
27245519f0de50 Alexander Shiyan    2014-04-28  490  	int error;
                                                        ^^^^^^^^^

bc8f1eaf68a8aa Ben Dooks           2009-11-10  491  
d9080921aa32c7 Dmitry Torokhov     2012-03-18  492  	bdata->input = input;
d9080921aa32c7 Dmitry Torokhov     2012-03-18  493  	bdata->button = button;
d8ee4a1c90529e Laxman Dewangan     2012-03-19  494  	spin_lock_init(&bdata->lock);
d8ee4a1c90529e Laxman Dewangan     2012-03-19  495  
700a38b27eefc5 Dmitry Torokhov     2016-10-19  496  	if (child) {
e138d2340a72b4 Krzysztof Kozlowski 2020-08-26  497  		bdata->gpiod = devm_fwnode_gpiod_get_optional(dev, child, NULL,
e138d2340a72b4 Krzysztof Kozlowski 2020-08-26  498  							      GPIOD_IN, desc);
e138d2340a72b4 Krzysztof Kozlowski 2020-08-26  499  		if (IS_ERR(bdata->gpiod))
e138d2340a72b4 Krzysztof Kozlowski 2020-08-26 @500  			return dev_err_probe(dev, error, "failed to get gpio\n");
                                                                                                  ^^^^^
Uninitialized

700a38b27eefc5 Dmitry Torokhov     2016-10-19  501  	} else if (gpio_is_valid(button->gpio)) {
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  502  		/*
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  503  		 * Legacy GPIO number, so request the GPIO here and
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  504  		 * convert it to descriptor.
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  505  		 */
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  506  		unsigned flags = GPIOF_IN;
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  507  
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  508  		if (button->active_low)
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  509  			flags |= GPIOF_ACTIVE_LOW;
bc8f1eaf68a8aa Ben Dooks           2009-11-10  510  
b4e66e7d1948e0 Guenter Roeck       2017-01-21  511  		error = devm_gpio_request_one(dev, button->gpio, flags, desc);
bc8f1eaf68a8aa Ben Dooks           2009-11-10  512  		if (error < 0) {
d8ee4a1c90529e Laxman Dewangan     2012-03-19  513  			dev_err(dev, "Failed to request GPIO %d, error %d\n",
bc8f1eaf68a8aa Ben Dooks           2009-11-10  514  				button->gpio, error);
d8ee4a1c90529e Laxman Dewangan     2012-03-19  515  			return error;
bc8f1eaf68a8aa Ben Dooks           2009-11-10  516  		}
bc8f1eaf68a8aa Ben Dooks           2009-11-10  517  
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  518  		bdata->gpiod = gpio_to_desc(button->gpio);
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  519  		if (!bdata->gpiod)
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  520  			return -EINVAL;
700a38b27eefc5 Dmitry Torokhov     2016-10-19  521  	}

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 40642 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 2/2] Input: gpio_keys - Simplify with dev_err_probe()
@ 2020-08-31  9:44     ` Dan Carpenter
  0 siblings, 0 replies; 8+ messages in thread
From: Dan Carpenter @ 2020-08-31  9:44 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 4924 bytes --]

Hi Krzysztof,

url:    https://github.com/0day-ci/linux/commits/Krzysztof-Kozlowski/gpio-Add-devm_fwnode_gpiod_get_optional-helpers/20200827-041021
base:   https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git for-next
config: x86_64-randconfig-m001-20200826 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

New smatch warnings:
drivers/input/keyboard/gpio_keys.c:500 gpio_keys_setup_key() error: uninitialized symbol 'error'.

# https://github.com/0day-ci/linux/commit/e138d2340a72b4f117d0da36fe7cddb4bc073c58
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Krzysztof-Kozlowski/gpio-Add-devm_fwnode_gpiod_get_optional-helpers/20200827-041021
git checkout e138d2340a72b4f117d0da36fe7cddb4bc073c58
vim +/error +500 drivers/input/keyboard/gpio_keys.c

5298cc4cc753bb Bill Pemberton      2012-11-23  477  static int gpio_keys_setup_key(struct platform_device *pdev,
d9080921aa32c7 Dmitry Torokhov     2012-03-18  478  				struct input_dev *input,
83e4947a569f4d Hans de Goede       2017-01-21  479  				struct gpio_keys_drvdata *ddata,
700a38b27eefc5 Dmitry Torokhov     2016-10-19  480  				const struct gpio_keys_button *button,
83e4947a569f4d Hans de Goede       2017-01-21  481  				int idx,
700a38b27eefc5 Dmitry Torokhov     2016-10-19  482  				struct fwnode_handle *child)
bc8f1eaf68a8aa Ben Dooks           2009-11-10  483  {
92a47674f57b4a Alexander Stein     2011-04-11  484  	const char *desc = button->desc ? button->desc : "gpio_keys";
9e3af04f878731 Mika Westerberg     2010-02-04  485  	struct device *dev = &pdev->dev;
83e4947a569f4d Hans de Goede       2017-01-21  486  	struct gpio_button_data *bdata = &ddata->data[idx];
d8ee4a1c90529e Laxman Dewangan     2012-03-19  487  	irq_handler_t isr;
9e3af04f878731 Mika Westerberg     2010-02-04  488  	unsigned long irqflags;
27245519f0de50 Alexander Shiyan    2014-04-28  489  	int irq;
27245519f0de50 Alexander Shiyan    2014-04-28  490  	int error;
                                                        ^^^^^^^^^

bc8f1eaf68a8aa Ben Dooks           2009-11-10  491  
d9080921aa32c7 Dmitry Torokhov     2012-03-18  492  	bdata->input = input;
d9080921aa32c7 Dmitry Torokhov     2012-03-18  493  	bdata->button = button;
d8ee4a1c90529e Laxman Dewangan     2012-03-19  494  	spin_lock_init(&bdata->lock);
d8ee4a1c90529e Laxman Dewangan     2012-03-19  495  
700a38b27eefc5 Dmitry Torokhov     2016-10-19  496  	if (child) {
e138d2340a72b4 Krzysztof Kozlowski 2020-08-26  497  		bdata->gpiod = devm_fwnode_gpiod_get_optional(dev, child, NULL,
e138d2340a72b4 Krzysztof Kozlowski 2020-08-26  498  							      GPIOD_IN, desc);
e138d2340a72b4 Krzysztof Kozlowski 2020-08-26  499  		if (IS_ERR(bdata->gpiod))
e138d2340a72b4 Krzysztof Kozlowski 2020-08-26 @500  			return dev_err_probe(dev, error, "failed to get gpio\n");
                                                                                                  ^^^^^
Uninitialized

700a38b27eefc5 Dmitry Torokhov     2016-10-19  501  	} else if (gpio_is_valid(button->gpio)) {
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  502  		/*
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  503  		 * Legacy GPIO number, so request the GPIO here and
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  504  		 * convert it to descriptor.
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  505  		 */
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  506  		unsigned flags = GPIOF_IN;
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  507  
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  508  		if (button->active_low)
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  509  			flags |= GPIOF_ACTIVE_LOW;
bc8f1eaf68a8aa Ben Dooks           2009-11-10  510  
b4e66e7d1948e0 Guenter Roeck       2017-01-21  511  		error = devm_gpio_request_one(dev, button->gpio, flags, desc);
bc8f1eaf68a8aa Ben Dooks           2009-11-10  512  		if (error < 0) {
d8ee4a1c90529e Laxman Dewangan     2012-03-19  513  			dev_err(dev, "Failed to request GPIO %d, error %d\n",
bc8f1eaf68a8aa Ben Dooks           2009-11-10  514  				button->gpio, error);
d8ee4a1c90529e Laxman Dewangan     2012-03-19  515  			return error;
bc8f1eaf68a8aa Ben Dooks           2009-11-10  516  		}
bc8f1eaf68a8aa Ben Dooks           2009-11-10  517  
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  518  		bdata->gpiod = gpio_to_desc(button->gpio);
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  519  		if (!bdata->gpiod)
5feeca3c1e39c0 Geert Uytterhoeven  2016-10-19  520  			return -EINVAL;
700a38b27eefc5 Dmitry Torokhov     2016-10-19  521  	}

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 40642 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 2/2] Input: gpio_keys - Simplify with dev_err_probe()
  2020-08-31  9:44     ` Dan Carpenter
  (?)
@ 2020-08-31 13:57     ` Krzysztof Kozlowski
  -1 siblings, 0 replies; 8+ messages in thread
From: Krzysztof Kozlowski @ 2020-08-31 13:57 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 698 bytes --]

On Mon, 31 Aug 2020 at 11:45, Dan Carpenter <dan.carpenter@oracle.com> wrote:
>
> Hi Krzysztof,
>
> url:    https://github.com/0day-ci/linux/commits/Krzysztof-Kozlowski/gpio-Add-devm_fwnode_gpiod_get_optional-helpers/20200827-041021
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git for-next
> config: x86_64-randconfig-m001-20200826 (attached as .config)
> compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
>
> If you fix the issue, kindly add following tag as appropriate
> Reported-by: kernel test robot <lkp@intel.com>
> Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

Hi,

I already fixed this in v3.

Thanks for testing.

Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-08-31 13:57 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-26 20:08 [PATCH v2 1/2] gpio: Add devm_fwnode_gpiod_get_optional() helpers Krzysztof Kozlowski
2020-08-26 20:08 ` [PATCH v2 2/2] Input: gpio_keys - Simplify with dev_err_probe() Krzysztof Kozlowski
2020-08-27  0:06   ` kernel test robot
     [not found]   ` <CAHp75VcgE+HJOKkV6-crzH1w+qOtSKR8=i1Y3ufnhTiAcYV=7A@mail.gmail.com>
2020-08-27  6:17     ` Krzysztof Kozlowski
2020-08-31  9:44   ` Dan Carpenter
2020-08-31  9:44     ` Dan Carpenter
2020-08-31 13:57     ` Krzysztof Kozlowski
     [not found] ` <CAHp75VfSE_9D4UBwJLt2b_JyBLiN_giOd8mWpodbMAVJ8wj=cA@mail.gmail.com>
2020-08-27  6:16   ` [PATCH v2 1/2] gpio: Add devm_fwnode_gpiod_get_optional() helpers Krzysztof Kozlowski

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.