gpio_pendown in ads7846_probe is not getting initalized (defaulted to 0)
resulting in gpio_free being called without a gpio_request. This
results in the following backtrace in bootup (at least on an OMAP3430 SDP).
------------[ cut here ]------------
WARNING: at drivers/gpio/gpiolib.c:1258 gpio_free+0x100/0x12c()
Modules linked in:
[<c0061208>] (unwind_backtrace+0x0/0xe4) from [<c0091f58>](warn_slowpath_common+0x4c/0x64)
[<c0091f58>] (warn_slowpath_common+0x4c/0x64) from [<c0091f88>](warn_slowpath_null+0x18/0x1c)
[<c0091f88>] (warn_slowpath_null+0x18/0x1c) from [<c024e610>](gpio_free+0x100/0x12c)
[<c024e610>] (gpio_free+0x100/0x12c) from [<c03e9fbc>](ads7846_probe+0xa38/0xc5c)
[<c03e9fbc>] (ads7846_probe+0xa38/0xc5c) from [<c02cff14>](spi_drv_probe+0x18/0x1c)
[<c02cff14>] (spi_drv_probe+0x18/0x1c) from [<c028bca4>](driver_probe_device+0xc8/0x184)
[<c028bca4>] (driver_probe_device+0xc8/0x184) from [<c028bdc8>](__driver_attach+0x68/0x8c)
[<c028bdc8>] (__driver_attach+0x68/0x8c) from [<c028b4c8>](bus_for_each_dev+0x48/0x74)
[<c028b4c8>] (bus_for_each_dev+0x48/0x74) from [<c028ae08>](bus_add_driver+0xa0/0x220)
[<c028ae08>] (bus_add_driver+0xa0/0x220) from [<c028c0c0>](driver_register+0xa8/0x134)
[<c028c0c0>] (driver_register+0xa8/0x134) from [<c0050550>](do_one_initcall+0xcc/0x1a4)
[<c0050550>] (do_one_initcall+0xcc/0x1a4) from [<c00084e4>](kernel_init+0x14c/0x214)
[<c00084e4>] (kernel_init+0x14c/0x214) from [<c005b494>](kernel_thread_exit+0x0/0x8)
---[ end trace 4053287f8a5ec18f ]---
Initialize gpio_pendown in ads7846_probe to -EINVAL before
ads7846_setup_pendown function and using gpio_is_valid function
in conditional check removes the above backtrace
warning.
Signed-off-by: Sourav Poddar <redacted>
Signed-off-by: Kishon Vijay Abraham I <redacted>
Cc: Dmitry Torokhov <redacted>
---
Links related to the previous discussions:
http://www.spinics.net/lists/linux-omap/msg45093.htmlhttp://www.mail-archive.com/linux-omap@vger.kernel.org/msg43506.html
drivers/input/touchscreen/ads7846.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
From: Wolfram Sang <hidden> Date: 2011-02-03 15:47:05
On Thu, Feb 03, 2011 at 08:51:26PM +0530, Sourav Poddar wrote:
gpio_pendown in ads7846_probe is not getting initalized (defaulted to 0)
resulting in gpio_free being called without a gpio_request. This
results in the following backtrace in bootup (at least on an OMAP3430 SDP).
I wonder if it makes sense to merge both patches under the name of "fix
gpio-handling" or similar. Not sure, though...
Will probably work, but maybe it is better to reorganize the code to
just have one success-exit-point. That would be mean adding an else
branch to this if-block.
quoted hunk
@@ -1353,7 +1354,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) err_put_regulator: regulator_put(ts->reg); err_free_gpio:- if (ts->gpio_pendown != -1)+ if (gpio_is_valid(ts->gpio_pendown))
You could do the same in the remove-path.
Regards,
Wolfram
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
From: Igor Grinberg <hidden> Date: 2011-02-03 16:29:03
Hi,
On 02/03/11 17:47, Wolfram Sang wrote:
On Thu, Feb 03, 2011 at 08:51:26PM +0530, Sourav Poddar wrote:
quoted
gpio_pendown in ads7846_probe is not getting initalized (defaulted to 0)
resulting in gpio_free being called without a gpio_request. This
results in the following backtrace in bootup (at least on an OMAP3430 SDP).
I wonder if it makes sense to merge both patches under the name of "fix
gpio-handling" or similar. Not sure, though...
I'd rather not do that, because this patch fixes the request/free problem
and the second is changing the functionality (e.g. configures the gpio as input)
Will probably work, but maybe it is better to reorganize the code to
just have one success-exit-point. That would be mean adding an else
branch to this if-block.
This is something that can be done, though I fear the code readability
will suffer. Is it worth?
quoted
@@ -1353,7 +1354,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) err_put_regulator: regulator_put(ts->reg); err_free_gpio:- if (ts->gpio_pendown != -1)+ if (gpio_is_valid(ts->gpio_pendown))
You could do the same in the remove-path.
You mean, _should_... ;)
Otherwise, the patch is not complete.
--
Regards,
Igor.
From: Wolfram Sang <hidden> Date: 2011-02-03 16:48:23
quoted
I wonder if it makes sense to merge both patches under the name of "fix
gpio-handling" or similar. Not sure, though...
I'd rather not do that, because this patch fixes the request/free problem
and the second is changing the functionality (e.g. configures the gpio as input)
Will probably work, but maybe it is better to reorganize the code to
just have one success-exit-point. That would be mean adding an else
branch to this if-block.
This is something that can be done, though I fear the code readability
will suffer. Is it worth?
I thought it to be more readable to have one-entry-one-OK-exit. But
actually I don't mind that much.
quoted
quoted
@@ -1353,7 +1354,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) err_put_regulator: regulator_put(ts->reg); err_free_gpio:- if (ts->gpio_pendown != -1)+ if (gpio_is_valid(ts->gpio_pendown))
You could do the same in the remove-path.
You mean, _should_... ;)
Yes, I meant that :)
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |