* [PATCH 0/7] updates to few nokia drivers
@ 2008-10-14 21:39 Felipe Balbi
2008-10-14 21:39 ` [PATCH 1/7] input: lm8323: get rid of global pdata pointer Felipe Balbi
0 siblings, 1 reply; 13+ messages in thread
From: Felipe Balbi @ 2008-10-14 21:39 UTC (permalink / raw)
To: linux-omap; +Cc: Felipe Balbi
From: Felipe Balbi <felipe.balbi@nokia.com>
Preparing few drivers for integration upstream.
At least lp5521 should be in good shape for going
upstream. lm8323 and tsc2005 might need some more
work.
Felipe Balbi (7):
input: lm8323: get rid of global pdata pointer
input: tsc2005: move to gpiolib
i2c: lp5521: remove dead code
i2c: lp5521: cosmetic fixes
i2c: lp5521: simplify mode setting
i2c: lp5521: move to LED framework
leds: lp5521: move to drivers/leds
drivers/i2c/chips/Kconfig | 7 -
drivers/i2c/chips/Makefile | 1 -
drivers/input/keyboard/lm8323.c | 4 +-
drivers/input/touchscreen/tsc2005.c | 15 +-
drivers/leds/Kconfig | 10 +
drivers/leds/Makefile | 1 +
drivers/{i2c/chips/lp5521.c => leds/leds-lp5521.c} | 379 +++++++++++++-------
7 files changed, 271 insertions(+), 146 deletions(-)
rename drivers/{i2c/chips/lp5521.c => leds/leds-lp5521.c} (62%)
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH 1/7] input: lm8323: get rid of global pdata pointer 2008-10-14 21:39 [PATCH 0/7] updates to few nokia drivers Felipe Balbi @ 2008-10-14 21:39 ` Felipe Balbi 2008-10-14 21:39 ` [PATCH 2/7] input: tsc2005: move to gpiolib Felipe Balbi 2008-10-16 4:10 ` [PATCH 1/7] input: lm8323: get rid of global pdata pointer Dmitry Torokhov 0 siblings, 2 replies; 13+ messages in thread From: Felipe Balbi @ 2008-10-14 21:39 UTC (permalink / raw) To: linux-omap; +Cc: Felipe Balbi, Dmitry Torokhov From: Felipe Balbi <felipe.balbi@nokia.com> pdata is only used during probe to initialize a few fields from lm8323 device structure. Moving pdata pointer to probe won't harm anybody. Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com> Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com> --- drivers/input/keyboard/lm8323.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/drivers/input/keyboard/lm8323.c b/drivers/input/keyboard/lm8323.c index 72bb587..b6f464c 100644 --- a/drivers/input/keyboard/lm8323.c +++ b/drivers/input/keyboard/lm8323.c @@ -184,9 +184,6 @@ static struct lm8323_chip *pwm_to_lm8323(struct lm8323_pwm *pwm) } } -static struct lm8323_platform_data *lm8323_pdata; - - #define LM8323_MAX_DATA 8 /* @@ -673,6 +670,7 @@ static DEVICE_ATTR(disable_kp, 0644, lm8323_show_disable, lm8323_set_disable); static int lm8323_probe(struct i2c_client *client, const struct i2c_device_id *id) { + struct lm8323_platform_data *lm8323_pdata; struct input_dev *idev; struct lm8323_chip *lm; int i, err = 0; -- 1.6.0.2.307.gc427 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/7] input: tsc2005: move to gpiolib 2008-10-14 21:39 ` [PATCH 1/7] input: lm8323: get rid of global pdata pointer Felipe Balbi @ 2008-10-14 21:39 ` Felipe Balbi 2008-10-14 21:39 ` [PATCH 3/7] i2c: lp5521: remove dead code Felipe Balbi 2008-10-14 23:20 ` [PATCH 2/7] input: tsc2005: move to gpiolib David Brownell 2008-10-16 4:10 ` [PATCH 1/7] input: lm8323: get rid of global pdata pointer Dmitry Torokhov 1 sibling, 2 replies; 13+ messages in thread From: Felipe Balbi @ 2008-10-14 21:39 UTC (permalink / raw) To: linux-omap; +Cc: Felipe Balbi, David Brownell, Dmitry Torokhov From: Felipe Balbi <felipe.balbi@nokia.com> Get rid of omap-specific gpio calls and switch over to gpiolib. Cc: David Brownell <david-b@pacbell.net> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com> Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com> --- drivers/input/touchscreen/tsc2005.c | 15 ++++----------- 1 files changed, 4 insertions(+), 11 deletions(-) diff --git a/drivers/input/touchscreen/tsc2005.c b/drivers/input/touchscreen/tsc2005.c index 7fb107e..c9f8f5c 100644 --- a/drivers/input/touchscreen/tsc2005.c +++ b/drivers/input/touchscreen/tsc2005.c @@ -534,16 +534,14 @@ static int __devinit tsc2005_ts_init(struct tsc2005 *ts, ts->dav_gpio = dav_gpio; dev_dbg(&ts->spi->dev, "TSC2005: DAV GPIO = %d\n", dav_gpio); -#ifdef CONFIG_ARCH_OMAP - r = omap_request_gpio(dav_gpio); + r = gpio_request(dav_gpio, "dav_gpio"); if (r < 0) { dev_err(&ts->spi->dev, "unable to get DAV GPIO"); goto err1; } - omap_set_gpio_direction(dav_gpio, 1); + gpio_direction_input(dav_gpio); ts->irq = OMAP_GPIO_IRQ(dav_gpio); dev_dbg(&ts->spi->dev, "TSC2005: DAV IRQ = %d\n", ts->irq); -#endif init_timer(&ts->penup_timer); setup_timer(&ts->penup_timer, tsc2005_ts_penup_timer_handler, (unsigned long)ts); @@ -612,9 +610,7 @@ err3: tsc2005_stop_scan(ts); input_free_device(idev); err2: -#ifdef CONFIG_ARCH_OMAP - omap_free_gpio(dav_gpio); -#endif + gpio_free(dav_gpio); err1: return r; } @@ -671,10 +667,7 @@ static int __devexit tsc2005_remove(struct spi_device *spi) free_irq(ts->irq, ts); input_unregister_device(ts->idev); - -#ifdef CONFIG_ARCH_OMAP - omap_free_gpio(ts->dav_gpio); -#endif + gpio_free(ts->dav_gpio); kfree(ts); return 0; -- 1.6.0.2.307.gc427 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 3/7] i2c: lp5521: remove dead code 2008-10-14 21:39 ` [PATCH 2/7] input: tsc2005: move to gpiolib Felipe Balbi @ 2008-10-14 21:39 ` Felipe Balbi 2008-10-14 21:39 ` [PATCH 4/7] i2c: lp5521: cosmetic fixes Felipe Balbi 2008-10-14 23:20 ` [PATCH 2/7] input: tsc2005: move to gpiolib David Brownell 1 sibling, 1 reply; 13+ messages in thread From: Felipe Balbi @ 2008-10-14 21:39 UTC (permalink / raw) To: linux-omap; +Cc: Felipe Balbi, Richard Purdie From: Felipe Balbi <felipe.balbi@nokia.com> That LED_CONNECTED_WRONG was never defined so removing. If someone needs those hooks, add back via proper platform_data instead of nasty ifdefery. Cc: Richard Purdie <rpurdie@rpsys.net> Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com> --- drivers/i2c/chips/lp5521.c | 22 ---------------------- 1 files changed, 0 insertions(+), 22 deletions(-) diff --git a/drivers/i2c/chips/lp5521.c b/drivers/i2c/chips/lp5521.c index c0862d9..7fb8091 100644 --- a/drivers/i2c/chips/lp5521.c +++ b/drivers/i2c/chips/lp5521.c @@ -28,13 +28,8 @@ #define LP5521_DRIVER_NAME "lp5521" -#ifdef LED_CONNECTED_WRONG -#define LP5521_REG_R_PWM 0x04 -#define LP5521_REG_B_PWM 0x02 -#else #define LP5521_REG_R_PWM 0x02 #define LP5521_REG_B_PWM 0x04 -#endif #define LP5521_REG_ENABLE 0x00 #define LP5521_REG_OP_MODE 0x01 #define LP5521_REG_G_PWM 0x03 @@ -200,22 +195,12 @@ static ssize_t show_active_channels(struct device *dev, char channels[4]; int pos = 0; -#ifdef LED_CONNECTED_WRONG - if (chip->blue) - pos += sprintf(channels + pos, "r"); - if (chip->green) - pos += sprintf(channels + pos, "g"); - if (chip->red) - pos += sprintf(channels + pos, "b"); - -#else if (chip->red) pos += sprintf(channels + pos, "r"); if (chip->green) pos += sprintf(channels + pos, "g"); if (chip->blue) pos += sprintf(channels + pos, "b"); -#endif channels[pos] = '\0'; @@ -232,17 +217,10 @@ static ssize_t store_active_channels(struct device *dev, chip->green = 0; chip->blue = 0; -#ifdef LED_CONNECTED_WRONG - if (strchr(buf, 'r') != NULL) - chip->blue = 1; - if (strchr(buf, 'b') != NULL) - chip->red = 1; -#else if (strchr(buf, 'r') != NULL) chip->red = 1; if (strchr(buf, 'b') != NULL) chip->blue = 1; -#endif if (strchr(buf, 'g') != NULL) chip->green = 1; -- 1.6.0.2.307.gc427 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 4/7] i2c: lp5521: cosmetic fixes 2008-10-14 21:39 ` [PATCH 3/7] i2c: lp5521: remove dead code Felipe Balbi @ 2008-10-14 21:39 ` Felipe Balbi 2008-10-14 21:39 ` [PATCH 5/7] i2c: lp5521: simplify mode setting Felipe Balbi 0 siblings, 1 reply; 13+ messages in thread From: Felipe Balbi @ 2008-10-14 21:39 UTC (permalink / raw) To: linux-omap; +Cc: Felipe Balbi, Richard Purdie From: Felipe Balbi <felipe.balbi@nokia.com> General cleanup to the code. Preparing to send it to mainline. Cc: Richard Purdie <rpurdie@rpsys.net> Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com> --- drivers/i2c/chips/lp5521.c | 159 ++++++++++++++++++++------------------------ 1 files changed, 73 insertions(+), 86 deletions(-) diff --git a/drivers/i2c/chips/lp5521.c b/drivers/i2c/chips/lp5521.c index 7fb8091..e040c4d 100644 --- a/drivers/i2c/chips/lp5521.c +++ b/drivers/i2c/chips/lp5521.c @@ -1,5 +1,5 @@ /* - * drivers/i2c/chips/lp5521.c + * lp5521.c - LP5521 LED Driver * * Copyright (C) 2007 Nokia Corporation * @@ -24,7 +24,6 @@ #include <linux/init.h> #include <linux/i2c.h> #include <linux/mutex.h> -#include <mach/gpio.h> #define LP5521_DRIVER_NAME "lp5521" @@ -71,6 +70,7 @@ #define LP5521_PROGRAM_LENGTH 32 /* in bytes */ struct lp5521_chip { + /* device lock */ struct mutex lock; struct i2c_client *client; char *mode; @@ -81,20 +81,14 @@ struct lp5521_chip { static int lp5521_set_mode(struct lp5521_chip *chip, char *mode); -static int lp5521_write(struct i2c_client *client, u8 reg, u8 value) +static inline int lp5521_write(struct i2c_client *client, u8 reg, u8 value) { return i2c_smbus_write_byte_data(client, reg, value); } -static int lp5521_read(struct i2c_client *client, u8 reg, u8 *buf) +static inline int lp5521_read(struct i2c_client *client, u8 reg) { - s32 ret = i2c_smbus_read_byte_data(client, reg); - - if (ret < 0) - return -EIO; - - *buf = ret; - return 0; + return i2c_smbus_read_byte_data(client, reg); } static int lp5521_configure(struct i2c_client *client) @@ -136,19 +130,19 @@ static int lp5521_load_program(struct lp5521_chip *chip, u8 *pattern) if (chip->red) ret |= i2c_smbus_write_i2c_block_data(client, - LP5521_REG_R_PROG_MEM, - LP5521_PROGRAM_LENGTH, - pattern); + LP5521_REG_R_PROG_MEM, + LP5521_PROGRAM_LENGTH, + pattern); if (chip->green) ret |= i2c_smbus_write_i2c_block_data(client, - LP5521_REG_G_PROG_MEM, - LP5521_PROGRAM_LENGTH, - pattern); + LP5521_REG_G_PROG_MEM, + LP5521_PROGRAM_LENGTH, + pattern); if (chip->blue) ret |= i2c_smbus_write_i2c_block_data(client, - LP5521_REG_B_PROG_MEM, - LP5521_PROGRAM_LENGTH, - pattern); + LP5521_REG_B_PROG_MEM, + LP5521_PROGRAM_LENGTH, + pattern); return ret; } @@ -156,31 +150,33 @@ static int lp5521_load_program(struct lp5521_chip *chip, u8 *pattern) static int lp5521_run_program(struct lp5521_chip *chip) { struct i2c_client *client = chip->client; - int ret; + int reg; u8 mask = 0xc0; u8 exec_state = 0; - u8 enable_reg; - ret = lp5521_read(client, LP5521_REG_ENABLE, &enable_reg); - if (ret) - goto fail; + reg = lp5521_read(client, LP5521_REG_ENABLE); + if (reg < 0) + return reg; - enable_reg &= mask; + reg &= mask; /* set all active channels exec state to countinous run*/ - exec_state |= (chip->red << 5); + exec_state |= (chip->red << 5); exec_state |= (chip->green << 3); - exec_state |= (chip->blue << 1); + exec_state |= (chip->blue << 1); - enable_reg |= exec_state; + reg |= exec_state; - ret |= lp5521_write(client, LP5521_REG_ENABLE, enable_reg); + if (lp5521_write(client, LP5521_REG_ENABLE, reg)) + dev_dbg(&client->dev, "failed writing to register %02x\n", + LP5521_REG_ENABLE); /* set op-mode to run for active channels, disabled for others */ - ret |= lp5521_write(client, LP5521_REG_OP_MODE, exec_state); + if (lp5521_write(client, LP5521_REG_OP_MODE, exec_state)) + dev_dbg(&client->dev, "failed writing to register %02x\n", + LP5521_REG_OP_MODE); -fail: - return ret; + return 0; } /*--------------------------------------------------------------*/ @@ -188,8 +184,8 @@ fail: /*--------------------------------------------------------------*/ static ssize_t show_active_channels(struct device *dev, - struct device_attribute *attr, - char *buf) + struct device_attribute *attr, + char *buf) { struct lp5521_chip *chip = dev_get_drvdata(dev); char channels[4]; @@ -208,8 +204,8 @@ static ssize_t show_active_channels(struct device *dev, } static ssize_t store_active_channels(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) + struct device_attribute *attr, + const char *buf, size_t len) { struct lp5521_chip *chip = dev_get_drvdata(dev); @@ -228,26 +224,25 @@ static ssize_t store_active_channels(struct device *dev, } static ssize_t show_color(struct device *dev, - struct device_attribute *attr, - char *buf) + struct device_attribute *attr, + char *buf) { struct i2c_client *client = to_i2c_client(dev); - int ret = 0; - u8 r, g, b; + int r, g, b; - ret |= lp5521_read(client, LP5521_REG_R_PWM, &r); - ret |= lp5521_read(client, LP5521_REG_G_PWM, &g); - ret |= lp5521_read(client, LP5521_REG_B_PWM, &b); + r = lp5521_read(client, LP5521_REG_R_PWM); + g = lp5521_read(client, LP5521_REG_G_PWM); + b = lp5521_read(client, LP5521_REG_B_PWM); - if (ret) - return ret; + if (r < 0 || g < 0 || b < 0) + return -EINVAL; return sprintf(buf, "%.2x:%.2x:%.2x\n", r, g, b); } static ssize_t store_color(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) + struct device_attribute *attr, + const char *buf, size_t len) { struct i2c_client *client = to_i2c_client(dev); struct lp5521_chip *chip = i2c_get_clientdata(client); @@ -271,8 +266,8 @@ static ssize_t store_color(struct device *dev, } static ssize_t store_load(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) + struct device_attribute *attr, + const char *buf, size_t len) { struct lp5521_chip *chip = dev_get_drvdata(dev); int ret, nrchars, offset = 0, i = 0; @@ -314,8 +309,8 @@ fail: } static ssize_t show_mode(struct device *dev, - struct device_attribute *attr, - char *buf) + struct device_attribute *attr, + char *buf) { struct lp5521_chip *chip = dev_get_drvdata(dev); @@ -323,8 +318,8 @@ static ssize_t show_mode(struct device *dev, } static ssize_t store_mode(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) + struct device_attribute *attr, + const char *buf, size_t len) { struct lp5521_chip *chip = dev_get_drvdata(dev); @@ -343,33 +338,29 @@ static ssize_t store_mode(struct device *dev, } static ssize_t show_current(struct device *dev, - struct device_attribute *attr, - char *buf) + struct device_attribute *attr, + char *buf) { struct i2c_client *client = to_i2c_client(dev); - int ret = 0; - u8 r_curr, g_curr, b_curr; + int r, g, b; - ret |= lp5521_read(client, LP5521_REG_R_CNTRL, &r_curr); - ret |= lp5521_read(client, LP5521_REG_G_CNTRL, &g_curr); - ret |= lp5521_read(client, LP5521_REG_B_CNTRL, &b_curr); + r = lp5521_read(client, LP5521_REG_R_CNTRL); + g = lp5521_read(client, LP5521_REG_G_CNTRL); + b = lp5521_read(client, LP5521_REG_B_CNTRL); - if (ret) - return ret; + if (r < 0 || g < 0 || b < 0) + return -EINVAL; - r_curr = r_curr >> 4; - g_curr = g_curr >> 4; - b_curr = b_curr >> 4; + r >>= 4; + g >>= 4; + b >>= 4; - if (r_curr == g_curr && g_curr == b_curr) - return sprintf(buf, "%x\n", r_curr); - else - return sprintf(buf, "%x %x %x\n", r_curr, g_curr, b_curr); + return sprintf(buf, "%x %x %x\n", r, g, b); } static ssize_t store_current(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) + struct device_attribute *attr, + const char *buf, size_t len) { struct lp5521_chip *chip = dev_get_drvdata(dev); struct i2c_client *client = chip->client; @@ -398,7 +389,7 @@ static DEVICE_ATTR(color, S_IRUGO | S_IWUGO, show_color, store_color); static DEVICE_ATTR(load, S_IWUGO, NULL, store_load); static DEVICE_ATTR(mode, S_IRUGO | S_IWUGO, show_mode, store_mode); static DEVICE_ATTR(active_channels, S_IRUGO | S_IWUGO, - show_active_channels, store_active_channels); + show_active_channels, store_active_channels); static DEVICE_ATTR(led_current, S_IRUGO | S_IWUGO, show_current, store_current); static int lp5521_register_sysfs(struct i2c_client *client) @@ -421,6 +412,7 @@ static int lp5521_register_sysfs(struct i2c_client *client) ret = device_create_file(dev, &dev_attr_led_current); if (ret) goto fail5; + return 0; fail5: @@ -437,16 +429,13 @@ fail1: static void lp5521_unregister_sysfs(struct i2c_client *client) { - struct lp5521_chip *chip = i2c_get_clientdata(client); struct device *dev = &client->dev; device_remove_file(dev, &dev_attr_led_current); device_remove_file(dev, &dev_attr_mode); device_remove_file(dev, &dev_attr_active_channels); device_remove_file(dev, &dev_attr_color); - - if (!strcmp(chip->mode, LP5521_MODE_LOAD)) - device_remove_file(dev, &dev_attr_load); + device_remove_file(dev, &dev_attr_load); } /*--------------------------------------------------------------*/ @@ -479,9 +468,8 @@ static int lp5521_set_mode(struct lp5521_chip *chip, char *mode) /*--------------------------------------------------------------*/ /* Probe, Attach, Remove */ /*--------------------------------------------------------------*/ -static struct i2c_driver lp5521_driver; -static int lp5521_probe(struct i2c_client *client, +static int __init lp5521_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct lp5521_chip *chip; @@ -491,7 +479,7 @@ static int lp5521_probe(struct i2c_client *client, if (!chip) return -ENOMEM; - chip->client = client; + chip->client = client; strncpy(client->name, LP5521_DRIVER_NAME, I2C_NAME_SIZE); i2c_set_clientdata(client, chip); @@ -520,7 +508,7 @@ fail1: return ret; } -static int lp5521_remove(struct i2c_client *client) +static int __exit lp5521_remove(struct i2c_client *client) { struct lp5521_chip *chip = i2c_get_clientdata(client); @@ -537,11 +525,11 @@ static const struct i2c_device_id lp5521_id[] = { MODULE_DEVICE_TABLE(i2c, lp5521_id); static struct i2c_driver lp5521_driver = { - .driver = { + .driver = { .name = LP5521_DRIVER_NAME, }, .probe = lp5521_probe, - .remove = __devexit_p(lp5521_remove), + .remove = __exit_p(lp5521_remove), .id_table = lp5521_id, }; @@ -549,15 +537,14 @@ static int __init lp5521_init(void) { return i2c_add_driver(&lp5521_driver); } +module_init(lp5521_init); static void __exit lp5521_exit(void) { i2c_del_driver(&lp5521_driver); } +module_exit(lp5521_exit); MODULE_AUTHOR("Mathias Nyman <mathias.nyman@nokia.com>"); MODULE_DESCRIPTION("lp5521 LED driver"); MODULE_LICENSE("GPL"); - -module_init(lp5521_init); -module_exit(lp5521_exit); -- 1.6.0.2.307.gc427 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 5/7] i2c: lp5521: simplify mode setting 2008-10-14 21:39 ` [PATCH 4/7] i2c: lp5521: cosmetic fixes Felipe Balbi @ 2008-10-14 21:39 ` Felipe Balbi 2008-10-14 21:39 ` [PATCH 6/7] i2c: lp5521: move to LED framework Felipe Balbi 0 siblings, 1 reply; 13+ messages in thread From: Felipe Balbi @ 2008-10-14 21:39 UTC (permalink / raw) To: linux-omap; +Cc: Felipe Balbi, Richard Purdie From: Felipe Balbi <felipe.balbi@nokia.com> Avoid using string magic and use integer for comparisson Cc: Richard Purdie <rpurdie@rpsys.net> Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com> --- drivers/i2c/chips/lp5521.c | 52 ++++++++++++++++++++++++++++++++----------- 1 files changed, 38 insertions(+), 14 deletions(-) diff --git a/drivers/i2c/chips/lp5521.c b/drivers/i2c/chips/lp5521.c index e040c4d..9e94ff8 100644 --- a/drivers/i2c/chips/lp5521.c +++ b/drivers/i2c/chips/lp5521.c @@ -46,10 +46,6 @@ #define LP5521_REG_G_PROG_MEM 0x30 #define LP5521_REG_B_PROG_MEM 0x50 -#define LP5521_MODE_LOAD "load" -#define LP5521_MODE_RUN "run" -#define LP5521_MODE_DIRECT_CONTROL "direct" - #define LP5521_CURRENT_1m5 0x0f #define LP5521_CURRENT_3m1 0x1f #define LP5521_CURRENT_4m7 0x2f @@ -69,17 +65,23 @@ #define LP5521_PROGRAM_LENGTH 32 /* in bytes */ +enum lp5521_mode { + LP5521_MODE_LOAD, + LP5521_MODE_RUN, + LP5521_MODE_DIRECT_CONTROL, +}; + struct lp5521_chip { /* device lock */ struct mutex lock; struct i2c_client *client; - char *mode; + enum lp5521_mode mode; int red; int green; int blue; }; -static int lp5521_set_mode(struct lp5521_chip *chip, char *mode); +static int lp5521_set_mode(struct lp5521_chip *chip, enum lp5521_mode mode); static inline int lp5521_write(struct i2c_client *client, u8 reg, u8 value) { @@ -313,8 +315,25 @@ static ssize_t show_mode(struct device *dev, char *buf) { struct lp5521_chip *chip = dev_get_drvdata(dev); + char *mode; + + mutex_lock(&chip->lock); + switch (chip->mode) { + case LP5521_MODE_RUN: + mode = "run"; + break; + case LP5521_MODE_LOAD: + mode = "load"; + break; + case LP5521_MODE_DIRECT_CONTROL: + mode = "direct"; + break; + default: + mode = "undefined"; + } + mutex_unlock(&chip->lock); - return sprintf(buf, "%s\n", chip->mode); + return sprintf(buf, "%s\n", mode); } static ssize_t store_mode(struct device *dev, @@ -442,23 +461,28 @@ static void lp5521_unregister_sysfs(struct i2c_client *client) /* Set chip operating mode */ /*--------------------------------------------------------------*/ -static int lp5521_set_mode(struct lp5521_chip *chip, char *mode) +static int lp5521_set_mode(struct lp5521_chip *chip, enum lp5521_mode mode) { struct i2c_client *client = chip->client ; int ret = 0; /* if in that mode already do nothing, except for run */ - if (!strcmp(mode, chip->mode) && strcmp(mode, LP5521_MODE_RUN)) + if (chip->mode == mode && mode != LP5521_MODE_RUN) return 0; - if (!strcmp(mode, LP5521_MODE_RUN)) + switch (mode) { + case LP5521_MODE_RUN: ret = lp5521_run_program(chip); - - if (!strcmp(mode, LP5521_MODE_LOAD)) + break; + case LP5521_MODE_LOAD: ret |= lp5521_write(client, LP5521_REG_OP_MODE, 0x15); - - if (!strcmp(mode, LP5521_MODE_DIRECT_CONTROL)) + break; + case LP5521_MODE_DIRECT_CONTROL: ret |= lp5521_write(client, LP5521_REG_OP_MODE, 0x3F); + break; + default: + dev_dbg(&client->dev, "unsupported mode %d\n", mode); + } chip->mode = mode; -- 1.6.0.2.307.gc427 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 6/7] i2c: lp5521: move to LED framework 2008-10-14 21:39 ` [PATCH 5/7] i2c: lp5521: simplify mode setting Felipe Balbi @ 2008-10-14 21:39 ` Felipe Balbi 2008-10-14 21:39 ` [PATCH 7/7] leds: lp5521: move to drivers/leds Felipe Balbi 0 siblings, 1 reply; 13+ messages in thread From: Felipe Balbi @ 2008-10-14 21:39 UTC (permalink / raw) To: linux-omap; +Cc: Felipe Balbi, Richard Purdie From: Felipe Balbi <felipe.balbi@nokia.com> Register three separate leds for lp5521 and allow them to be controlled separately while keeping backwards compatibility with userspace programs based on old implementation. Cc: Richard Purdie <rpurdie@rpsys.net> Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com> --- drivers/i2c/chips/lp5521.c | 146 +++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 144 insertions(+), 2 deletions(-) diff --git a/drivers/i2c/chips/lp5521.c b/drivers/i2c/chips/lp5521.c index 9e94ff8..a5c3425 100644 --- a/drivers/i2c/chips/lp5521.c +++ b/drivers/i2c/chips/lp5521.c @@ -4,6 +4,7 @@ * Copyright (C) 2007 Nokia Corporation * * Written by Mathias Nyman <mathias.nyman@nokia.com> + * Updated by Felipe Balbi <felipe.balbi@nokia.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,7 +24,9 @@ #include <linux/module.h> #include <linux/init.h> #include <linux/i2c.h> +#include <linux/leds.h> #include <linux/mutex.h> +#include <linux/workqueue.h> #define LP5521_DRIVER_NAME "lp5521" @@ -75,7 +78,17 @@ struct lp5521_chip { /* device lock */ struct mutex lock; struct i2c_client *client; + + struct work_struct red_work; + struct work_struct green_work; + struct work_struct blue_work; + + struct led_classdev ledr; + struct led_classdev ledg; + struct led_classdev ledb; + enum lp5521_mode mode; + int red; int green; int blue; @@ -489,6 +502,87 @@ static int lp5521_set_mode(struct lp5521_chip *chip, enum lp5521_mode mode) return ret; } +static void lp5521_red_work(struct work_struct *work) +{ + struct lp5521_chip *chip = container_of(work, struct lp5521_chip, red_work); + int ret; + + ret = lp5521_configure(chip->client); + if (ret) { + dev_dbg(&chip->client->dev, "could not configure lp5521, %d\n", + ret); + return; + } + + ret = lp5521_write(chip->client, LP5521_REG_R_PWM, chip->red); + if (ret) + dev_dbg(&chip->client->dev, "could not set brightness, %d\n", + ret); +} + +static void lp5521_red_set(struct led_classdev *led, + enum led_brightness value) +{ + struct lp5521_chip *chip = container_of(led, struct lp5521_chip, ledr); + + chip->red = value; + schedule_work(&chip->red_work); +} + +static void lp5521_green_work(struct work_struct *work) +{ + struct lp5521_chip *chip = container_of(work, struct lp5521_chip, green_work); + int ret; + + ret = lp5521_configure(chip->client); + if (ret) { + dev_dbg(&chip->client->dev, "could not configure lp5521, %d\n", + ret); + return; + } + + ret = lp5521_write(chip->client, LP5521_REG_G_PWM, chip->green); + if (ret) + dev_dbg(&chip->client->dev, "could not set brightness, %d\n", + ret); +} + +static void lp5521_green_set(struct led_classdev *led, + enum led_brightness value) +{ + struct lp5521_chip *chip = container_of(led, struct lp5521_chip, ledg); + + chip->green = value; + schedule_work(&chip->green_work); +} + +static void lp5521_blue_work(struct work_struct *work) +{ + struct lp5521_chip *chip = container_of(work, struct lp5521_chip, blue_work); + int ret; + + ret = lp5521_configure(chip->client); + if (ret) { + dev_dbg(&chip->client->dev, "could not configure lp5521, %d\n", + ret); + return; + } + + ret = lp5521_write(chip->client, LP5521_REG_B_PWM, chip->blue); + if (ret) + dev_dbg(&chip->client->dev, "could not set brightness, %d\n", + ret); +} + +static void lp5521_blue_set(struct led_classdev *led, + enum led_brightness value) +{ + struct lp5521_chip *chip = container_of(led, struct lp5521_chip, ledb); + + chip->blue = value; + schedule_work(&chip->blue_work); +} + /*--------------------------------------------------------------*/ /* Probe, Attach, Remove */ /*--------------------------------------------------------------*/ @@ -509,6 +603,10 @@ static int __init lp5521_probe(struct i2c_client *client, mutex_init(&chip->lock); + INIT_WORK(&chip->red_work, lp5521_red_work); + INIT_WORK(&chip->green_work, lp5521_green_work); + INIT_WORK(&chip->blue_work, lp5521_blue_work); + ret = lp5521_configure(client); if (ret < 0) { dev_err(&client->dev, "lp5521 error configuring chip \n"); @@ -521,14 +619,52 @@ static int __init lp5521_probe(struct i2c_client *client, chip->green = 1; chip->blue = 1; + chip->ledr.brightness_set = lp5521_red_set; + chip->ledr.default_trigger = NULL; + chip->ledr.name = "lp5521:red"; + ret = led_classdev_register(&client->dev, &chip->ledr); + if (ret < 0) { + dev_dbg(&client->dev, "failed to register red led, %d\n", ret); + goto fail1; + } + + chip->ledg.brightness_set = lp5521_green_set; + chip->ledg.default_trigger = NULL; + chip->ledg.name = "lp5521:green"; + ret = led_classdev_register(&client->dev, &chip->ledg); + if (ret < 0) { + dev_dbg(&client->dev, "failed to register green led, %d\n", + ret); + goto fail2; + } + + chip->ledb.brightness_set = lp5521_blue_set; + chip->ledb.default_trigger = NULL; + chip->ledb.name = "lp5521:blue"; + ret = led_classdev_register(&client->dev, &chip->ledb); + if (ret < 0) { + dev_dbg(&client->dev, "failed to register blue led, %d\n", ret); + goto fail3; + } + ret = lp5521_register_sysfs(client); - if (ret) + if (ret) { dev_err(&client->dev, "lp5521 registering sysfs failed \n"); + goto fail4; + } - return ret; + return 0; +fail4: + led_classdev_unregister(&chip->ledb); +fail3: + led_classdev_unregister(&chip->ledg); +fail2: + led_classdev_unregister(&chip->ledr); fail1: + i2c_set_clientdata(client, NULL); kfree(chip); + return ret; } @@ -537,6 +673,12 @@ static int __exit lp5521_remove(struct i2c_client *client) struct lp5521_chip *chip = i2c_get_clientdata(client); lp5521_unregister_sysfs(client); + i2c_set_clientdata(client, NULL); + + led_classdev_unregister(&chip->ledb); + led_classdev_unregister(&chip->ledg); + led_classdev_unregister(&chip->ledr); + kfree(chip); return 0; -- 1.6.0.2.307.gc427 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 7/7] leds: lp5521: move to drivers/leds 2008-10-14 21:39 ` [PATCH 6/7] i2c: lp5521: move to LED framework Felipe Balbi @ 2008-10-14 21:39 ` Felipe Balbi 0 siblings, 0 replies; 13+ messages in thread From: Felipe Balbi @ 2008-10-14 21:39 UTC (permalink / raw) To: linux-omap; +Cc: Felipe Balbi, Richard Purdie From: Felipe Balbi <felipe.balbi@nokia.com> This driver should be sitting together with the other led drivers. Cc: Richard Purdie <rpurdie@rpsys.net> Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com> --- drivers/i2c/chips/Kconfig | 7 ------- drivers/i2c/chips/Makefile | 1 - drivers/leds/Kconfig | 10 ++++++++++ drivers/leds/Makefile | 1 + drivers/{i2c/chips/lp5521.c => leds/leds-lp5521.c} | 0 5 files changed, 11 insertions(+), 8 deletions(-) rename drivers/{i2c/chips/lp5521.c => leds/leds-lp5521.c} (100%) diff --git a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig index d803c41..0aed293 100644 --- a/drivers/i2c/chips/Kconfig +++ b/drivers/i2c/chips/Kconfig @@ -219,13 +219,6 @@ config SENSORS_TSL2563 This driver can also be built as a module. If so, the module will be called tsl2563. -config LP5521 - tristate "LP5521 LED driver chip" - depends on I2C - help - If you say yes here you get support for the National Semiconductor - LP5521 LED driver. - config MENELAUS bool "TWL92330/Menelaus PM chip" depends on I2C=y && ARCH_OMAP24XX diff --git a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile index ba41a57..5e17df3 100644 --- a/drivers/i2c/chips/Makefile +++ b/drivers/i2c/chips/Makefile @@ -30,7 +30,6 @@ obj-$(CONFIG_TWL4030_POWEROFF) += twl4030-poweroff.o obj-$(CONFIG_TWL4030_PWRBUTTON) += twl4030-pwrbutton.o obj-$(CONFIG_TWL4030_MADC) += twl4030-madc.o obj-$(CONFIG_RTC_X1205_I2C) += x1205.o -obj-$(CONFIG_LP5521) += lp5521.o ifeq ($(CONFIG_I2C_DEBUG_CHIP),y) EXTRA_CFLAGS += -DDEBUG diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 6a2f441..943e3d9 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -146,6 +146,16 @@ config LEDS_CM_X270 help This option enables support for the CM-X270 LEDs. +config LEDS_LP5521 + tristate "LED Support for the LP5521 LEDs" + depends on LEDS_CLASS && I2C + help + If you say 'Y' here you get support for the National Semiconductor + LP5521 LED driver used in n8x0 boards. + + This driver can be built as a module by choosing 'M'. The module + will be called leds-lp5521. + config LEDS_CLEVO_MAIL tristate "Mail LED on Clevo notebook (EXPERIMENTAL)" depends on LEDS_CLASS && X86 && SERIO_I8042 && DMI && EXPERIMENTAL diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index fd6316e..ce5c8cd 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -21,6 +21,7 @@ obj-$(CONFIG_LEDS_COBALT_RAQ) += leds-cobalt-raq.o obj-$(CONFIG_LEDS_PCA9532) += leds-pca9532.o obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o obj-$(CONFIG_LEDS_CM_X270) += leds-cm-x270.o +obj-$(CONFIG_LEDS_LP5521) += leds-lp5521.o obj-$(CONFIG_LEDS_CLEVO_MAIL) += leds-clevo-mail.o obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o obj-$(CONFIG_LEDS_FSG) += leds-fsg.o diff --git a/drivers/i2c/chips/lp5521.c b/drivers/leds/leds-lp5521.c similarity index 100% rename from drivers/i2c/chips/lp5521.c rename to drivers/leds/leds-lp5521.c -- 1.6.0.2.307.gc427 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 2/7] input: tsc2005: move to gpiolib 2008-10-14 21:39 ` [PATCH 2/7] input: tsc2005: move to gpiolib Felipe Balbi 2008-10-14 21:39 ` [PATCH 3/7] i2c: lp5521: remove dead code Felipe Balbi @ 2008-10-14 23:20 ` David Brownell 2008-10-15 7:43 ` Felipe Balbi 2008-10-15 10:21 ` Felipe Balbi 1 sibling, 2 replies; 13+ messages in thread From: David Brownell @ 2008-10-14 23:20 UTC (permalink / raw) To: Felipe Balbi; +Cc: linux-omap, Felipe Balbi, Dmitry Torokhov On Tuesday 14 October 2008, Felipe Balbi wrote: > - omap_set_gpio_direction(dav_gpio, 1); > + gpio_direction_input(dav_gpio); > ts->irq = OMAP_GPIO_IRQ(dav_gpio); That should be ts->irq = gpio_to_irq(dav_gpio) ... -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/7] input: tsc2005: move to gpiolib 2008-10-14 23:20 ` [PATCH 2/7] input: tsc2005: move to gpiolib David Brownell @ 2008-10-15 7:43 ` Felipe Balbi 2008-10-15 10:21 ` Felipe Balbi 1 sibling, 0 replies; 13+ messages in thread From: Felipe Balbi @ 2008-10-15 7:43 UTC (permalink / raw) To: David Brownell; +Cc: Felipe Balbi, linux-omap, Felipe Balbi, Dmitry Torokhov On Tue, Oct 14, 2008 at 04:20:04PM -0700, David Brownell wrote: > On Tuesday 14 October 2008, Felipe Balbi wrote: > > - omap_set_gpio_direction(dav_gpio, 1); > > + gpio_direction_input(dav_gpio); > > ts->irq = OMAP_GPIO_IRQ(dav_gpio); > > That should be ts->irq = gpio_to_irq(dav_gpio) ... good catch :-) will resend soon. -- balbi -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/7] input: tsc2005: move to gpiolib 2008-10-14 23:20 ` [PATCH 2/7] input: tsc2005: move to gpiolib David Brownell 2008-10-15 7:43 ` Felipe Balbi @ 2008-10-15 10:21 ` Felipe Balbi 1 sibling, 0 replies; 13+ messages in thread From: Felipe Balbi @ 2008-10-15 10:21 UTC (permalink / raw) To: ext David Brownell Cc: Felipe Balbi, linux-omap, Felipe Balbi, Dmitry Torokhov On Tue, Oct 14, 2008 at 04:20:04PM -0700, David Brownell wrote: > That should be ts->irq = gpio_to_irq(dav_gpio) ... New version below ========== cut here ========= >From 28368394029be3c8bbfa44c0d433bf06a64c2761 Mon Sep 17 00:00:00 2001 From: Felipe Balbi <felipe.balbi@nokia.com> Date: Wed, 15 Oct 2008 00:39:52 +0300 Subject: [PATCH 2/7] input: tsc2005: move to gpiolib Get rid of omap-specific gpio calls and switch over to gpiolib. Cc: David Brownell <david-b@pacbell.net> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com> Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com> --- drivers/input/touchscreen/tsc2005.c | 17 +++++------------ 1 files changed, 5 insertions(+), 12 deletions(-) diff --git a/drivers/input/touchscreen/tsc2005.c b/drivers/input/touchscreen/tsc2005.c index 7fb107e..0c631d4 100644 --- a/drivers/input/touchscreen/tsc2005.c +++ b/drivers/input/touchscreen/tsc2005.c @@ -534,16 +534,14 @@ static int __devinit tsc2005_ts_init(struct tsc2005 *ts, ts->dav_gpio = dav_gpio; dev_dbg(&ts->spi->dev, "TSC2005: DAV GPIO = %d\n", dav_gpio); -#ifdef CONFIG_ARCH_OMAP - r = omap_request_gpio(dav_gpio); + r = gpio_request(dav_gpio, "dav_gpio"); if (r < 0) { dev_err(&ts->spi->dev, "unable to get DAV GPIO"); goto err1; } - omap_set_gpio_direction(dav_gpio, 1); - ts->irq = OMAP_GPIO_IRQ(dav_gpio); + gpio_direction_input(dav_gpio); + ts->irq = gpio_to_irq(dav_gpio); dev_dbg(&ts->spi->dev, "TSC2005: DAV IRQ = %d\n", ts->irq); -#endif init_timer(&ts->penup_timer); setup_timer(&ts->penup_timer, tsc2005_ts_penup_timer_handler, (unsigned long)ts); @@ -612,9 +610,7 @@ err3: tsc2005_stop_scan(ts); input_free_device(idev); err2: -#ifdef CONFIG_ARCH_OMAP - omap_free_gpio(dav_gpio); -#endif + gpio_free(dav_gpio); err1: return r; } @@ -671,10 +667,7 @@ static int __devexit tsc2005_remove(struct spi_device *spi) free_irq(ts->irq, ts); input_unregister_device(ts->idev); - -#ifdef CONFIG_ARCH_OMAP - omap_free_gpio(ts->dav_gpio); -#endif + gpio_free(ts->dav_gpio); kfree(ts); return 0; -- 1.6.0.2.307.gc427 -- balbi ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 1/7] input: lm8323: get rid of global pdata pointer 2008-10-14 21:39 ` [PATCH 1/7] input: lm8323: get rid of global pdata pointer Felipe Balbi 2008-10-14 21:39 ` [PATCH 2/7] input: tsc2005: move to gpiolib Felipe Balbi @ 2008-10-16 4:10 ` Dmitry Torokhov 2008-10-16 8:39 ` Felipe Balbi 1 sibling, 1 reply; 13+ messages in thread From: Dmitry Torokhov @ 2008-10-16 4:10 UTC (permalink / raw) To: Felipe Balbi; +Cc: linux-omap, Felipe Balbi Hi Felipe, On Wed, Oct 15, 2008 at 12:39:51AM +0300, Felipe Balbi wrote: > From: Felipe Balbi <felipe.balbi@nokia.com> > > pdata is only used during probe to initialize a few fields > from lm8323 device structure. Moving pdata pointer to probe > won't harm anybody. > I don't think I have these drivers. I also think that they should depend on GPIOLIB (I noticed that OMAP selects GPIOLIB but I think ecplicit dependency should still be present). -- Dmitry ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/7] input: lm8323: get rid of global pdata pointer 2008-10-16 4:10 ` [PATCH 1/7] input: lm8323: get rid of global pdata pointer Dmitry Torokhov @ 2008-10-16 8:39 ` Felipe Balbi 0 siblings, 0 replies; 13+ messages in thread From: Felipe Balbi @ 2008-10-16 8:39 UTC (permalink / raw) To: ext Dmitry Torokhov; +Cc: Felipe Balbi, linux-omap, Felipe Balbi On Thu, Oct 16, 2008 at 12:10:57AM -0400, ext Dmitry Torokhov wrote: > Hi Felipe, > > On Wed, Oct 15, 2008 at 12:39:51AM +0300, Felipe Balbi wrote: > > From: Felipe Balbi <felipe.balbi@nokia.com> > > > > pdata is only used during probe to initialize a few fields > > from lm8323 device structure. Moving pdata pointer to probe > > won't harm anybody. > > > > I don't think I have these drivers. I also think that they should > depend on GPIOLIB (I noticed that OMAP selects GPIOLIB but I think > ecplicit dependency should still be present). I'll update and resend to l-o, when they patch get applied to l-o, I'll send a patch via your tree to be merged into mainline. -- balbi ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2008-10-16 8:40 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-10-14 21:39 [PATCH 0/7] updates to few nokia drivers Felipe Balbi 2008-10-14 21:39 ` [PATCH 1/7] input: lm8323: get rid of global pdata pointer Felipe Balbi 2008-10-14 21:39 ` [PATCH 2/7] input: tsc2005: move to gpiolib Felipe Balbi 2008-10-14 21:39 ` [PATCH 3/7] i2c: lp5521: remove dead code Felipe Balbi 2008-10-14 21:39 ` [PATCH 4/7] i2c: lp5521: cosmetic fixes Felipe Balbi 2008-10-14 21:39 ` [PATCH 5/7] i2c: lp5521: simplify mode setting Felipe Balbi 2008-10-14 21:39 ` [PATCH 6/7] i2c: lp5521: move to LED framework Felipe Balbi 2008-10-14 21:39 ` [PATCH 7/7] leds: lp5521: move to drivers/leds Felipe Balbi 2008-10-14 23:20 ` [PATCH 2/7] input: tsc2005: move to gpiolib David Brownell 2008-10-15 7:43 ` Felipe Balbi 2008-10-15 10:21 ` Felipe Balbi 2008-10-16 4:10 ` [PATCH 1/7] input: lm8323: get rid of global pdata pointer Dmitry Torokhov 2008-10-16 8:39 ` Felipe Balbi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox