Skip to content

Commit

Permalink
backlight: corgi_lcd: Use gpio_set_value_cansleep() to avoid WARN_ON
Browse files Browse the repository at this point in the history
Changing backlight intensity on an Akita (Sharp Zaurus C-1000) triggers
WARN_ON message:

  WARNING: at drivers/gpio/gpiolib.c:1672 __gpio_set_value+0x38/0xa4()
  Modules linked in:
  Backtrace:
    corgi_bl_set_intensity+0x0/0x74
    corgi_bl_update_status+0x0/0x64
    corgi_lcd_probe+0x0/0x258
    spi_drv_probe+0x0/0x24
    driver_probe_device+0x0/0x208
    __driver_attach+0x0/0x94
    bus_for_each_dev+0x0/0x90
    driver_attach+0x0/0x28
    bus_add_driver+0x0/0x22c
    driver_register+0x0/0x134
    spi_register_driver+0x0/0x60
    corgi_lcd_driver_init+0x0/0x1c
    do_one_initcall+0x0/0x174
    kernel_init+0x0/0x2a8

Akita machines have backlight controls hooked to a gpio expander chip,
max7310 using i2c transfers which can sleep.  In this case,
pca953x_gpio_set_value() can be called to control gpio, and
pca953x_setup_gpio() sets can_sleep flag.  Therefore,
gpio_set_value_cansleep() should be used in order to avoid WARN_ON on
akita machines.

Akita is the only exception in this case since other users of corgi_lcd
access backlight gpio controls through a different gpio expander which
does not set the can_sleep flag.

Signed-off-by: Marko Katic <dromede@gmail.com>
Signed-off-by: Jingoo Han <jg1.han@samsung.com>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Grant Likely <grant.likely@secretlab.ca>
Cc: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
Cc: Richard Purdie <rpurdie@rpsys.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Marko Katic authored and Linus Torvalds committed Dec 18, 2012
1 parent 1eddd97 commit 1581b08
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions drivers/video/backlight/corgi_lcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -409,10 +409,10 @@ static int corgi_bl_set_intensity(struct corgi_lcd *lcd, int intensity)
cont = !!(intensity & 0x20) ^ lcd->gpio_backlight_cont_inverted;

if (gpio_is_valid(lcd->gpio_backlight_cont))
gpio_set_value(lcd->gpio_backlight_cont, cont);
gpio_set_value_cansleep(lcd->gpio_backlight_cont, cont);

if (gpio_is_valid(lcd->gpio_backlight_on))
gpio_set_value(lcd->gpio_backlight_on, intensity);
gpio_set_value_cansleep(lcd->gpio_backlight_on, intensity);

if (lcd->kick_battery)
lcd->kick_battery();
Expand Down

0 comments on commit 1581b08

Please sign in to comment.