diff mbox series

[2/2] pinctrl: pinmux: Use dev_err_probe() in pin_request()

Message ID 20230909063613.2867-3-jernej.skrabec@gmail.com
State New
Headers show
Series pinctrl: pinmux: Update error reporting in pin_request() | expand

Commit Message

Jernej Škrabec Sept. 9, 2023, 6:36 a.m. UTC
Use dev_err_probe() when printing error message in pin_request() since
it may fail with -EPROBE_DEFER.

Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
---
 drivers/pinctrl/pinmux.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

kernel test robot Sept. 9, 2023, 9:44 a.m. UTC | #1
Hi Jernej,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linusw-pinctrl/devel]
[also build test WARNING on linusw-pinctrl/for-next linus/master v6.5 next-20230908]
[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#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Jernej-Skrabec/pinctrl-pinmux-Remove-duplicate-error-message-in-pin_request/20230909-143817
base:   https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git devel
patch link:    https://lore.kernel.org/r/20230909063613.2867-3-jernej.skrabec%40gmail.com
patch subject: [PATCH 2/2] pinctrl: pinmux: Use dev_err_probe() in pin_request()
config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20230909/202309091753.JqeFteSy-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230909/202309091753.JqeFteSy-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202309091753.JqeFteSy-lkp@intel.com/

All warnings (new ones prefixed by >>):

   drivers/pinctrl/pinmux.c: In function 'pin_request':
>> drivers/pinctrl/pinmux.c:191:45: warning: passing argument 2 of 'dev_err_probe' makes integer from pointer without a cast [-Wint-conversion]
     191 |                 dev_err_probe(pctldev->dev, "pin-%d (%s) status %d\n",
         |                                             ^~~~~~~~~~~~~~~~~~~~~~~~~
         |                                             |
         |                                             char *
   In file included from drivers/pinctrl/pinmux.c:17:
   include/linux/device.h:1218:64: note: expected 'int' but argument is of type 'char *'
    1218 | __printf(3, 4) int dev_err_probe(const struct device *dev, int err, const char *fmt, ...);
         |                                                            ~~~~^~~
>> drivers/pinctrl/pinmux.c:192:31: warning: passing argument 3 of 'dev_err_probe' makes pointer from integer without a cast [-Wint-conversion]
     192 |                               pin, owner, status);
         |                               ^~~
         |                               |
         |                               int
   include/linux/device.h:1218:81: note: expected 'const char *' but argument is of type 'int'
    1218 | __printf(3, 4) int dev_err_probe(const struct device *dev, int err, const char *fmt, ...);
         |                                                                     ~~~~~~~~~~~~^~~


vim +/dev_err_probe +191 drivers/pinctrl/pinmux.c

   101	
   102	/**
   103	 * pin_request() - request a single pin to be muxed in, typically for GPIO
   104	 * @pctldev: the associated pin controller device
   105	 * @pin: the pin number in the global pin space
   106	 * @owner: a representation of the owner of this pin; typically the device
   107	 *	name that controls its mux function, or the requested GPIO name
   108	 * @gpio_range: the range matching the GPIO pin if this is a request for a
   109	 *	single GPIO pin
   110	 */
   111	static int pin_request(struct pinctrl_dev *pctldev,
   112			       int pin, const char *owner,
   113			       struct pinctrl_gpio_range *gpio_range)
   114	{
   115		struct pin_desc *desc;
   116		const struct pinmux_ops *ops = pctldev->desc->pmxops;
   117		int status = -EINVAL;
   118	
   119		desc = pin_desc_get(pctldev, pin);
   120		if (desc == NULL) {
   121			dev_err(pctldev->dev,
   122				"pin %d is not registered so it cannot be requested\n",
   123				pin);
   124			goto out;
   125		}
   126	
   127		dev_dbg(pctldev->dev, "request pin %d (%s) for %s\n",
   128			pin, desc->name, owner);
   129	
   130		if ((!gpio_range || ops->strict) &&
   131		    desc->mux_usecount && strcmp(desc->mux_owner, owner)) {
   132			dev_err(pctldev->dev,
   133				"pin %s already requested by %s; cannot claim for %s\n",
   134				desc->name, desc->mux_owner, owner);
   135			goto out;
   136		}
   137	
   138		if ((gpio_range || ops->strict) && desc->gpio_owner) {
   139			dev_err(pctldev->dev,
   140				"pin %s already requested by %s; cannot claim for %s\n",
   141				desc->name, desc->gpio_owner, owner);
   142			goto out;
   143		}
   144	
   145		if (gpio_range) {
   146			desc->gpio_owner = owner;
   147		} else {
   148			desc->mux_usecount++;
   149			if (desc->mux_usecount > 1)
   150				return 0;
   151	
   152			desc->mux_owner = owner;
   153		}
   154	
   155		/* Let each pin increase references to this module */
   156		if (!try_module_get(pctldev->owner)) {
   157			dev_err(pctldev->dev,
   158				"could not increase module refcount for pin %d\n",
   159				pin);
   160			status = -EINVAL;
   161			goto out_free_pin;
   162		}
   163	
   164		/*
   165		 * If there is no kind of request function for the pin we just assume
   166		 * we got it by default and proceed.
   167		 */
   168		if (gpio_range && ops->gpio_request_enable)
   169			/* This requests and enables a single GPIO pin */
   170			status = ops->gpio_request_enable(pctldev, gpio_range, pin);
   171		else if (ops->request)
   172			status = ops->request(pctldev, pin);
   173		else
   174			status = 0;
   175	
   176		if (status)
   177			module_put(pctldev->owner);
   178	
   179	out_free_pin:
   180		if (status) {
   181			if (gpio_range) {
   182				desc->gpio_owner = NULL;
   183			} else {
   184				desc->mux_usecount--;
   185				if (!desc->mux_usecount)
   186					desc->mux_owner = NULL;
   187			}
   188		}
   189	out:
   190		if (status)
 > 191			dev_err_probe(pctldev->dev, "pin-%d (%s) status %d\n",
 > 192				      pin, owner, status);
   193	
   194		return status;
   195	}
   196
kernel test robot Sept. 9, 2023, 10:06 a.m. UTC | #2
Hi Jernej,

kernel test robot noticed the following build errors:

[auto build test ERROR on linusw-pinctrl/devel]
[also build test ERROR on linusw-pinctrl/for-next linus/master v6.5 next-20230908]
[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#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Jernej-Skrabec/pinctrl-pinmux-Remove-duplicate-error-message-in-pin_request/20230909-143817
base:   https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git devel
patch link:    https://lore.kernel.org/r/20230909063613.2867-3-jernej.skrabec%40gmail.com
patch subject: [PATCH 2/2] pinctrl: pinmux: Use dev_err_probe() in pin_request()
config: hexagon-randconfig-002-20230909 (https://download.01.org/0day-ci/archive/20230909/202309091724.tJzAxzS5-lkp@intel.com/config)
compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230909/202309091724.tJzAxzS5-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202309091724.tJzAxzS5-lkp@intel.com/

All errors (new ones prefixed by >>):

>> drivers/pinctrl/pinmux.c:191:31: error: incompatible pointer to integer conversion passing 'char[23]' to parameter of type 'int' [-Wint-conversion]
     191 |                 dev_err_probe(pctldev->dev, "pin-%d (%s) status %d\n",
         |                                             ^~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/device.h:1218:64: note: passing argument to parameter 'err' here
    1218 | __printf(3, 4) int dev_err_probe(const struct device *dev, int err, const char *fmt, ...);
         |                                                                ^
>> drivers/pinctrl/pinmux.c:192:10: error: incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *' [-Wint-conversion]
     192 |                               pin, owner, status);
         |                               ^~~
   include/linux/device.h:1218:81: note: passing argument to parameter 'fmt' here
    1218 | __printf(3, 4) int dev_err_probe(const struct device *dev, int err, const char *fmt, ...);
         |                                                                                 ^
   2 errors generated.


vim +191 drivers/pinctrl/pinmux.c

   101	
   102	/**
   103	 * pin_request() - request a single pin to be muxed in, typically for GPIO
   104	 * @pctldev: the associated pin controller device
   105	 * @pin: the pin number in the global pin space
   106	 * @owner: a representation of the owner of this pin; typically the device
   107	 *	name that controls its mux function, or the requested GPIO name
   108	 * @gpio_range: the range matching the GPIO pin if this is a request for a
   109	 *	single GPIO pin
   110	 */
   111	static int pin_request(struct pinctrl_dev *pctldev,
   112			       int pin, const char *owner,
   113			       struct pinctrl_gpio_range *gpio_range)
   114	{
   115		struct pin_desc *desc;
   116		const struct pinmux_ops *ops = pctldev->desc->pmxops;
   117		int status = -EINVAL;
   118	
   119		desc = pin_desc_get(pctldev, pin);
   120		if (desc == NULL) {
   121			dev_err(pctldev->dev,
   122				"pin %d is not registered so it cannot be requested\n",
   123				pin);
   124			goto out;
   125		}
   126	
   127		dev_dbg(pctldev->dev, "request pin %d (%s) for %s\n",
   128			pin, desc->name, owner);
   129	
   130		if ((!gpio_range || ops->strict) &&
   131		    desc->mux_usecount && strcmp(desc->mux_owner, owner)) {
   132			dev_err(pctldev->dev,
   133				"pin %s already requested by %s; cannot claim for %s\n",
   134				desc->name, desc->mux_owner, owner);
   135			goto out;
   136		}
   137	
   138		if ((gpio_range || ops->strict) && desc->gpio_owner) {
   139			dev_err(pctldev->dev,
   140				"pin %s already requested by %s; cannot claim for %s\n",
   141				desc->name, desc->gpio_owner, owner);
   142			goto out;
   143		}
   144	
   145		if (gpio_range) {
   146			desc->gpio_owner = owner;
   147		} else {
   148			desc->mux_usecount++;
   149			if (desc->mux_usecount > 1)
   150				return 0;
   151	
   152			desc->mux_owner = owner;
   153		}
   154	
   155		/* Let each pin increase references to this module */
   156		if (!try_module_get(pctldev->owner)) {
   157			dev_err(pctldev->dev,
   158				"could not increase module refcount for pin %d\n",
   159				pin);
   160			status = -EINVAL;
   161			goto out_free_pin;
   162		}
   163	
   164		/*
   165		 * If there is no kind of request function for the pin we just assume
   166		 * we got it by default and proceed.
   167		 */
   168		if (gpio_range && ops->gpio_request_enable)
   169			/* This requests and enables a single GPIO pin */
   170			status = ops->gpio_request_enable(pctldev, gpio_range, pin);
   171		else if (ops->request)
   172			status = ops->request(pctldev, pin);
   173		else
   174			status = 0;
   175	
   176		if (status)
   177			module_put(pctldev->owner);
   178	
   179	out_free_pin:
   180		if (status) {
   181			if (gpio_range) {
   182				desc->gpio_owner = NULL;
   183			} else {
   184				desc->mux_usecount--;
   185				if (!desc->mux_usecount)
   186					desc->mux_owner = NULL;
   187			}
   188		}
   189	out:
   190		if (status)
 > 191			dev_err_probe(pctldev->dev, "pin-%d (%s) status %d\n",
 > 192				      pin, owner, status);
   193	
   194		return status;
   195	}
   196
kernel test robot Sept. 9, 2023, 1:12 p.m. UTC | #3
Hi Jernej,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linusw-pinctrl/devel]
[also build test WARNING on linusw-pinctrl/for-next linus/master v6.5 next-20230908]
[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#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Jernej-Skrabec/pinctrl-pinmux-Remove-duplicate-error-message-in-pin_request/20230909-143817
base:   https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git devel
patch link:    https://lore.kernel.org/r/20230909063613.2867-3-jernej.skrabec%40gmail.com
patch subject: [PATCH 2/2] pinctrl: pinmux: Use dev_err_probe() in pin_request()
config: arm-randconfig-001-20230909 (https://download.01.org/0day-ci/archive/20230909/202309092056.azXQNtDr-lkp@intel.com/config)
compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project.git f28c006a5895fc0e329fe15fead81e37457cb1d1)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230909/202309092056.azXQNtDr-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202309092056.azXQNtDr-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/pinctrl/pinmux.c:191:31: warning: incompatible pointer to integer conversion passing 'char[23]' to parameter of type 'int' [-Wint-conversion]
                   dev_err_probe(pctldev->dev, "pin-%d (%s) status %d\n",
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/device.h:1218:64: note: passing argument to parameter 'err' here
   __printf(3, 4) int dev_err_probe(const struct device *dev, int err, const char *fmt, ...);
                                                                  ^
>> drivers/pinctrl/pinmux.c:192:10: warning: incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *' [-Wint-conversion]
                                 pin, owner, status);
                                 ^~~
   include/linux/device.h:1218:81: note: passing argument to parameter 'fmt' here
   __printf(3, 4) int dev_err_probe(const struct device *dev, int err, const char *fmt, ...);
                                                                                   ^
   2 warnings generated.


vim +191 drivers/pinctrl/pinmux.c

   101	
   102	/**
   103	 * pin_request() - request a single pin to be muxed in, typically for GPIO
   104	 * @pctldev: the associated pin controller device
   105	 * @pin: the pin number in the global pin space
   106	 * @owner: a representation of the owner of this pin; typically the device
   107	 *	name that controls its mux function, or the requested GPIO name
   108	 * @gpio_range: the range matching the GPIO pin if this is a request for a
   109	 *	single GPIO pin
   110	 */
   111	static int pin_request(struct pinctrl_dev *pctldev,
   112			       int pin, const char *owner,
   113			       struct pinctrl_gpio_range *gpio_range)
   114	{
   115		struct pin_desc *desc;
   116		const struct pinmux_ops *ops = pctldev->desc->pmxops;
   117		int status = -EINVAL;
   118	
   119		desc = pin_desc_get(pctldev, pin);
   120		if (desc == NULL) {
   121			dev_err(pctldev->dev,
   122				"pin %d is not registered so it cannot be requested\n",
   123				pin);
   124			goto out;
   125		}
   126	
   127		dev_dbg(pctldev->dev, "request pin %d (%s) for %s\n",
   128			pin, desc->name, owner);
   129	
   130		if ((!gpio_range || ops->strict) &&
   131		    desc->mux_usecount && strcmp(desc->mux_owner, owner)) {
   132			dev_err(pctldev->dev,
   133				"pin %s already requested by %s; cannot claim for %s\n",
   134				desc->name, desc->mux_owner, owner);
   135			goto out;
   136		}
   137	
   138		if ((gpio_range || ops->strict) && desc->gpio_owner) {
   139			dev_err(pctldev->dev,
   140				"pin %s already requested by %s; cannot claim for %s\n",
   141				desc->name, desc->gpio_owner, owner);
   142			goto out;
   143		}
   144	
   145		if (gpio_range) {
   146			desc->gpio_owner = owner;
   147		} else {
   148			desc->mux_usecount++;
   149			if (desc->mux_usecount > 1)
   150				return 0;
   151	
   152			desc->mux_owner = owner;
   153		}
   154	
   155		/* Let each pin increase references to this module */
   156		if (!try_module_get(pctldev->owner)) {
   157			dev_err(pctldev->dev,
   158				"could not increase module refcount for pin %d\n",
   159				pin);
   160			status = -EINVAL;
   161			goto out_free_pin;
   162		}
   163	
   164		/*
   165		 * If there is no kind of request function for the pin we just assume
   166		 * we got it by default and proceed.
   167		 */
   168		if (gpio_range && ops->gpio_request_enable)
   169			/* This requests and enables a single GPIO pin */
   170			status = ops->gpio_request_enable(pctldev, gpio_range, pin);
   171		else if (ops->request)
   172			status = ops->request(pctldev, pin);
   173		else
   174			status = 0;
   175	
   176		if (status)
   177			module_put(pctldev->owner);
   178	
   179	out_free_pin:
   180		if (status) {
   181			if (gpio_range) {
   182				desc->gpio_owner = NULL;
   183			} else {
   184				desc->mux_usecount--;
   185				if (!desc->mux_usecount)
   186					desc->mux_owner = NULL;
   187			}
   188		}
   189	out:
   190		if (status)
 > 191			dev_err_probe(pctldev->dev, "pin-%d (%s) status %d\n",
 > 192				      pin, owner, status);
   193	
   194		return status;
   195	}
   196
Linus Walleij Sept. 12, 2023, 8:15 a.m. UTC | #4
Hi Jenej,

thanks for your patch!

On Sat, Sep 9, 2023 at 8:36 AM Jernej Skrabec <jernej.skrabec@gmail.com> wrote:

> Use dev_err_probe() when printing error message in pin_request() since
> it may fail with -EPROBE_DEFER.
>
> Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
(...)

>         if (status)
> -               dev_err(pctldev->dev, "pin-%d (%s) status %d\n",
> -                       pin, owner, status);
> +               dev_err_probe(pctldev->dev, "pin-%d (%s) status %d\n",
> +                             pin, owner, status);
>
>         return status;

That's not how you use dev_err_probe()

Just replace all of the lines above with return dev_err_probe(...)

Yours,
Linus Walleij
Jernej Škrabec Sept. 12, 2023, 3:52 p.m. UTC | #5
Dne torek, 12. september 2023 ob 10:15:31 CEST je Linus Walleij napisal(a):
> Hi Jenej,
> 
> thanks for your patch!
> 
> On Sat, Sep 9, 2023 at 8:36 AM Jernej Skrabec <jernej.skrabec@gmail.com> 
wrote:
> > Use dev_err_probe() when printing error message in pin_request() since
> > it may fail with -EPROBE_DEFER.
> > 
> > Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
> 
> (...)
> 
> >         if (status)
> > 
> > -               dev_err(pctldev->dev, "pin-%d (%s) status %d\n",
> > -                       pin, owner, status);
> > +               dev_err_probe(pctldev->dev, "pin-%d (%s) status %d\n",
> > +                             pin, owner, status);
> > 
> >         return status;
> 
> That's not how you use dev_err_probe()
> 
> Just replace all of the lines above with return dev_err_probe(...)

I already send v2 of this patch soon after I got report from kernel test 
robot.

Best regards,
Jernej

> 
> Yours,
> Linus Walleij
diff mbox series

Patch

diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c
index 301fe0157b02..4a9776a99d20 100644
--- a/drivers/pinctrl/pinmux.c
+++ b/drivers/pinctrl/pinmux.c
@@ -188,8 +188,8 @@  static int pin_request(struct pinctrl_dev *pctldev,
 	}
 out:
 	if (status)
-		dev_err(pctldev->dev, "pin-%d (%s) status %d\n",
-			pin, owner, status);
+		dev_err_probe(pctldev->dev, "pin-%d (%s) status %d\n",
+			      pin, owner, status);
 
 	return status;
 }