leds: leds-pca9532 add support pca9530, pca9531 and pca9533
Subsystems (2)
PATCH 1/1 leds: leds-pca9532 add support pca9530, pca9531 and pca9533
Adding chipinfo to use driver with pca953x family
Rename driver to pca953x, but left files and platformflags named pca9532
Tested with pca9530 and pca9533
--- drivers/leds/leds-pca9532.c | 80 ++++++++++++++++++++++++++++++++----------- 1 files changed, 60 insertions(+), 20 deletions(-)
drivers/leds/leds-pca9532.c +60 -20
@@ -1,13 +1,14 @@/* * pca9532.c - 16-bit Led dimmer * +* Copyright (C) 2011 Jan Weitzel * Copyright (C) 2008 Riku Voipio * * 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 * the Free Software Foundation; version 2 of the License. * -* Datasheet: http://www.nxp.com/acrobat/datasheets/PCA9532_3.pdf +* Datasheet: http://www.nxp.com/documents/data_sheet/PCA9532.pdf * */
@@ -20,20 +21,26 @@#include <linux/workqueue.h> #include <linux/leds-pca9532.h> -#define PCA9532_REG_PSC (i) (0x2+(i)*2) -#define PCA9532_REG_PWM (i) (0x3+(i)*2) -#define PCA9532_REG_LS0 0x6 -#define LED_REG (led) ((led>>2)+PCA9532_REG_LS0) -#define LED_NUM (led) (led & 0x3) +/* m = num_leds*/ +#define PCA9532_REG_OFFSET (m) ((m) >> 4) +#define PCA9532_REG_PSC (m, i) (PCA9532_REG_OFFSET(m) + 0x1 + (i) * 2) +#define PCA9532_REG_PWM (m, i) (PCA9532_REG_OFFSET(m) + 0x2 + (i) * 2) +#define LED_REG (m, led) (PCA9532_REG_OFFSET(m) + 0x5 + (led >> 2)) +#define LED_NUM (led) (led & 0x3)#define ldev_to_led (c) container_of(c, struct pca9532_led, ldev) +struct pca9532_chip_info { +u8 num_leds; +}; +struct pca9532_data {struct i2c_client *client;struct pca9532_led leds[16 ];struct mutex update_lock;struct input_dev *idev;struct work_struct work; +const struct pca9532_chip_info *chip_info;u8 pwm[2 ];u8 psc[2 ]; };
@@ -42,16 +49,41 @@ static int pca9532_probe(struct i2c_client *client, const struct i2c_device_id *id);static int pca9532_remove (struct i2c_client *client); +enum { + pca9530, + pca9531, + pca9532, + pca9533, +}; +static const struct i2c_device_id pca9532_id[] = { - {"pca9532" ,0 }, + {"pca9530" , pca9530 }, + {"pca9531" , pca9531 }, + {"pca9532" , pca9532 }, + {"pca9533" , pca9533 }, { } };MODULE_DEVICE_TABLE (i2c, pca9532_id); +static const struct pca9532_chip_info pca9532_chip_info_tbl[] = { + [pca9530] = { + .num_leds =2 , + }, + [pca9531] = { + .num_leds =8 , + }, + [pca9532] = { + .num_leds =16 , + }, + [pca9533] = { + .num_leds =4 , + }, +}; +static struct i2c_driver pca9532_driver = { .driver = { - .name ="pca9532" , + .name ="pca953x" , }, .probe = pca9532_probe, .remove = pca9532_remove,
@@ -68,7 +100,7 @@ static int pca9532_calcpwm(struct i2c_client *client, int pwm, int blink, {int a =0 , b =0 , i =0 ;struct pca9532_data *data =i2c_get_clientdata (client); -for (i =0 ; i <16 ; i++) { +for (i =0 ; i < data->chip_info->num_leds; i++) {if (data->leds[i].type ==PCA9532_TYPE_LED && data->leds[i].state ==PCA9532_PWM0 +pwm) { a++;
@@ -92,10 +124,12 @@ static int pca9532_calcpwm(struct i2c_client *client, int pwm, int blink,static int pca9532_setpwm (struct i2c_client *client,int pwm) {struct pca9532_data *data =i2c_get_clientdata (client); +u8 maxleds = data->chip_info->num_leds; +mutex_lock (&data->update_lock); -i2c_smbus_write_byte_data (client,PCA9532_REG_PWM (pwm), +i2c_smbus_write_byte_data (client,PCA9532_REG_PWM (maxleds, pwm), data->pwm[pwm]); -i2c_smbus_write_byte_data (client,PCA9532_REG_PSC (pwm), +i2c_smbus_write_byte_data (client,PCA9532_REG_PSC (maxleds, pwm), data->psc[pwm]);mutex_unlock (&data->update_lock);return 0 ;
@@ -106,15 +140,16 @@ static void pca9532_setled(struct pca9532_led *led) {struct i2c_client *client = led->client;struct pca9532_data *data =i2c_get_clientdata (client); +u8 maxleds = data->chip_info->num_leds;char reg;mutex_lock (&data->update_lock); - reg =i2c_smbus_read_byte_data (client,LED_REG (led->id)); + reg =i2c_smbus_read_byte_data (client,LED_REG (maxleds, led->id));/* zero led bits */ reg = reg & ~(0x3 <<LED_NUM (led->id)*2 );/* set the new value */ reg = reg | (led->state <<LED_NUM (led->id)*2 ); -i2c_smbus_write_byte_data (client,LED_REG (led->id), reg); +i2c_smbus_write_byte_data (client,LED_REG (maxleds, led->id), reg);mutex_unlock (&data->update_lock); }
@@ -183,10 +218,12 @@ static int pca9532_event(struct input_dev *dev, unsigned int type,static void pca9532_input_work (struct work_struct *work) { -struct pca9532_data *data; - data = container_of(work, struct pca9532_data, work); +struct pca9532_data *data = + container_of(work, struct pca9532_data, work); +u8 maxleds = data->chip_info->num_leds; +mutex_lock (&data->update_lock); -i2c_smbus_write_byte_data (data->client,PCA9532_REG_PWM (1 ), +i2c_smbus_write_byte_data (data->client,PCA9532_REG_PWM (maxleds,1 ), data->pwm[1 ]);mutex_unlock (&data->update_lock); }
@@ -230,17 +267,18 @@ static int pca9532_configure(struct i2c_client *client, struct pca9532_data *data, struct pca9532_platform_data *pdata) { int i, err = 0; +u8 maxleds = data->chip_info->num_leds;for (i =0 ; i <2 ; i++) { data->pwm[i] = pdata->pwm[i]; data->psc[i] = pdata->psc[i]; -i2c_smbus_write_byte_data (client,PCA9532_REG_PWM (i), +i2c_smbus_write_byte_data (client,PCA9532_REG_PWM (maxleds, i), data->pwm[i]); -i2c_smbus_write_byte_data (client,PCA9532_REG_PSC (i), +i2c_smbus_write_byte_data (client,PCA9532_REG_PSC (maxleds, i), data->psc[i]); } -for (i =0 ; i <16 ; i++) { +for (i =0 ; i < data->chip_info->num_leds; i++) {struct pca9532_led *led = &data->leds[i];struct pca9532_led *pled = &pdata->leds[i]; led->client = client;
@@ -322,6 +360,8 @@ static int pca9532_probe(struct i2c_client *client,if (!data)return -ENOMEM ; + data->chip_info = &pca9532_chip_info_tbl[id->driver_data]; +dev_info (&client->dev,"setting platform data\n" );i2c_set_clientdata (client, data); data->client = client;
@@ -337,7 +377,7 @@ static int pca9532_probe(struct i2c_client *client,static int pca9532_remove (struct i2c_client *client) {struct pca9532_data *data =i2c_get_clientdata (client); -pca9532_destroy_devices (data,16 ); +pca9532_destroy_devices (data, data->chip_info->num_leds);kfree (data);return 0 ; }
Signature · 1 line
1.7.0.4
Am Dienstag, den 05.04.2011, 10:27 +0200 schrieb Jan Weitzel:
Quoted 9 lines
Adding chipinfo to use driver with pca953x family
Rename driver to pca953x, but left files and platformflags named pca9532Tested with pca9530 and pca9533
Tested-by Juergen Kilb <[email protected]>Signed-off-by Jan Weitzel <[email protected]>--- drivers/leds/leds-pca9532.c | 80 ++++++++++++++++++++++++++++++++-----------
Is there any rework needed?
Regards, Jan
Quoted 4 lines · On Tue, 5 Apr 2011 10:27:23 +0200 Jan Weitzel <[email protected]> wrote:
Adding chipinfo to use driver with pca953x family
Rename driver to pca953x, but left files and platformflags named pca9532Tested with pca9530 and pca9533
The patch generates rather a mess when merged on top of drivers-leds-leds-pca9532c-add-gpio-capability.patch, below.
I suspect the changes in your patch also need to be made to the code which drivers-leds-leds-pca9532c-add-gpio-capability.patch added. So could you please review the below change and redo and retest your patch on top of it?
Thanks.
From: Joachim Eastwood <[email protected]>
Allow unused leds on pca9532 to be used as gpio. The board I am working on now has no less than 6 pca9532 chips. One chips is used for only leds, one has 14 leds and 2 gpio and the rest of the chips are gpio only.
There is also one board in mainline which could use this capabilty; arch/arm/mach-iop32x/n2100.c
232 { .type = PCA9532_TYPE_NONE }, /* power OFF gpio */
233 { .type = PCA9532_TYPE_NONE }, /* reset gpio */This patch defines a new pin type, PCA9532_TYPE_GPIO, and registers a gpiochip if any pin has this type set. The gpio will registers all chip pins but will filter on gpio_request.
---
drivers/leds/Kconfig | 10 ++ drivers/leds/leds-pca9532.c | 113 ++++++++++++++++++++++++++++++++- include/linux/leds-pca9532.h | 3 3 files changed, 122 insertions(+), 4 deletions(-)
drivers/leds/Kconfig renamed from drivers/leds/Kconfig~drivers-leds-leds-pca9532c-add-gpio-capability +10 -0
@@ -154,6 +154,16 @@ config LEDS_PCA9532 LED controller. It is generally only useful as a platform driver +config LEDS_PCA9532_GPIO + bool "Enable GPIO support for PCA9532" + depends on LEDS_PCA9532 + depends on GPIOLIB + help + Allow unused pins on PCA9532 to be used as gpio. + + To use a pin as gpio pca9532_type in pca9532_platform data needs to + set to PCA9532_TYPE_GPIO. + config LEDS_GPIO tristate "LED Support for GPIO connected LEDs" depends on LEDS_CLASS
drivers/leds/leds-pca9532.c renamed from drivers/leds/leds-pca9532.c~drivers-leds-leds-pca9532c-add-gpio-capability +110 -3
170 lines not on this page · raw message
include/linux/leds-pca9532.h renamed from include/linux/leds-pca9532.h~drivers-leds-leds-pca9532c-add-gpio-capability +2 -1
@@ -25,7 +25,7 @@ enum pca9532_state { };enum pca9532_type {PCA9532_TYPE_NONE ,PCA9532_TYPE_LED , -PCA9532_TYPE_N2100_BEEP }; +PCA9532_TYPE_N2100_BEEP ,PCA9532_TYPE_GPIO };struct pca9532_led {u8 id;
@@ -41,6 +41,7 @@ struct pca9532_platform_data {struct pca9532_led leds[16 ];u8 pwm[2 ];u8 psc[2 ]; + int gpio_base; };#endif /* __LINUX_PCA9532_H */
_
PATCH v2 1/1 leds: leds-pca9532 add support pca9530, pca9531 and pca9533
pca953x family are only different in number of leds and register layout Adding chipinfo to use driver with whole pca953x family Rename driver to pca953x, but left files and platformflags named pca9532
Tested with pca9530 and pca9533
---
v2: works on top off "pca9532c add gpio capability" patch
drivers/leds/leds-pca9532.c | 84 +++++++++++++++++++++++++++++++----------- 1 files changed, 62 insertions(+), 22 deletions(-)
drivers/leds/leds-pca9532.c +62 -22
@@ -1,13 +1,14 @@/* * pca9532.c - 16-bit Led dimmer * +* Copyright (C) 2011 Jan Weitzel * Copyright (C) 2008 Riku Voipio * * 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 * the Free Software Foundation; version 2 of the License. * -* Datasheet: http://www.nxp.com/acrobat/datasheets/PCA9532_3.pdf +* Datasheet: http://www.nxp.com/documents/data_sheet/PCA9532.pdf * */
@@ -21,15 +22,20 @@#include <linux/leds-pca9532.h> #include <linux/gpio.h> -#define PCA9532_REG_INPUT (i) ((i)/8) -#define PCA9532_REG_PSC (i) (0x2+(i)*2) -#define PCA9532_REG_PWM (i) (0x3+(i)*2) -#define PCA9532_REG_LS0 0x6 -#define LED_REG (led) ((led>>2)+PCA9532_REG_LS0) -#define LED_NUM (led) (led & 0x3) +/* m = num_leds*/ +#define PCA9532_REG_INPUT (i) ((i) >> 3) +#define PCA9532_REG_OFFSET (m) ((m) >> 4) +#define PCA9532_REG_PSC (m, i) (PCA9532_REG_OFFSET(m) + 0x1 + (i) * 2) +#define PCA9532_REG_PWM (m, i) (PCA9532_REG_OFFSET(m) + 0x2 + (i) * 2) +#define LED_REG (m, led) (PCA9532_REG_OFFSET(m) + 0x5 + (led >> 2)) +#define LED_NUM (led) (led & 0x3)#define ldev_to_led (c) container_of(c, struct pca9532_led, ldev) +struct pca9532_chip_info { +u8 num_leds; +}; +struct pca9532_data {struct i2c_client *client;struct pca9532_led leds[16 ];
@@ -39,6 +45,7 @@ struct pca9532_data {#ifdef CONFIG_LEDS_PCA9532_GPIO struct gpio_chip gpio;#endif +const struct pca9532_chip_info *chip_info;u8 pwm[2 ];u8 psc[2 ]; };
@@ -47,16 +54,41 @@ static int pca9532_probe(struct i2c_client *client, const struct i2c_device_id *id);static int pca9532_remove (struct i2c_client *client); +enum { + pca9530, + pca9531, + pca9532, + pca9533, +}; +static const struct i2c_device_id pca9532_id[] = { - {"pca9532" ,0 }, + {"pca9530" , pca9530 }, + {"pca9531" , pca9531 }, + {"pca9532" , pca9532 }, + {"pca9533" , pca9533 }, { } };MODULE_DEVICE_TABLE (i2c, pca9532_id); +static const struct pca9532_chip_info pca9532_chip_info_tbl[] = { + [pca9530] = { + .num_leds =2 , + }, + [pca9531] = { + .num_leds =8 , + }, + [pca9532] = { + .num_leds =16 , + }, + [pca9533] = { + .num_leds =4 , + }, +}; +static struct i2c_driver pca9532_driver = { .driver = { - .name ="pca9532" , + .name ="pca953x" , }, .probe = pca9532_probe, .remove = pca9532_remove,
@@ -73,7 +105,7 @@ static int pca9532_calcpwm(struct i2c_client *client, int pwm, int blink, {int a =0 , b =0 , i =0 ;struct pca9532_data *data =i2c_get_clientdata (client); -for (i =0 ; i <16 ; i++) { +for (i =0 ; i < data->chip_info->num_leds; i++) {if (data->leds[i].type ==PCA9532_TYPE_LED && data->leds[i].state ==PCA9532_PWM0 +pwm) { a++;
@@ -97,10 +129,12 @@ static int pca9532_calcpwm(struct i2c_client *client, int pwm, int blink,static int pca9532_setpwm (struct i2c_client *client,int pwm) {struct pca9532_data *data =i2c_get_clientdata (client); +u8 maxleds = data->chip_info->num_leds; +mutex_lock (&data->update_lock); -i2c_smbus_write_byte_data (client,PCA9532_REG_PWM (pwm), +i2c_smbus_write_byte_data (client,PCA9532_REG_PWM (maxleds, pwm), data->pwm[pwm]); -i2c_smbus_write_byte_data (client,PCA9532_REG_PSC (pwm), +i2c_smbus_write_byte_data (client,PCA9532_REG_PSC (maxleds, pwm), data->psc[pwm]);mutex_unlock (&data->update_lock);return 0 ;
@@ -111,15 +145,16 @@ static void pca9532_setled(struct pca9532_led *led) {struct i2c_client *client = led->client;struct pca9532_data *data =i2c_get_clientdata (client); +u8 maxleds = data->chip_info->num_leds;char reg;mutex_lock (&data->update_lock); - reg =i2c_smbus_read_byte_data (client,LED_REG (led->id)); + reg =i2c_smbus_read_byte_data (client,LED_REG (maxleds, led->id));/* zero led bits */ reg = reg & ~(0x3 <<LED_NUM (led->id)*2 );/* set the new value */ reg = reg | (led->state <<LED_NUM (led->id)*2 ); -i2c_smbus_write_byte_data (client,LED_REG (led->id), reg); +i2c_smbus_write_byte_data (client,LED_REG (maxleds, led->id), reg);mutex_unlock (&data->update_lock); }
@@ -188,10 +223,12 @@ static int pca9532_event(struct input_dev *dev, unsigned int type,static void pca9532_input_work (struct work_struct *work) { -struct pca9532_data *data; - data = container_of(work, struct pca9532_data, work); +struct pca9532_data *data = + container_of(work, struct pca9532_data, work); +u8 maxleds = data->chip_info->num_leds; +mutex_lock (&data->update_lock); -i2c_smbus_write_byte_data (data->client,PCA9532_REG_PWM (1 ), +i2c_smbus_write_byte_data (data->client,PCA9532_REG_PWM (maxleds,1 ), data->pwm[1 ]);mutex_unlock (&data->update_lock); }
@@ -301,17 +338,18 @@ static int pca9532_configure(struct i2c_client *client, {int i, err =0 ;int gpios =0 ; +u8 maxleds = data->chip_info->num_leds;for (i =0 ; i <2 ; i++) { data->pwm[i] = pdata->pwm[i]; data->psc[i] = pdata->psc[i]; -i2c_smbus_write_byte_data (client,PCA9532_REG_PWM (i), +i2c_smbus_write_byte_data (client,PCA9532_REG_PWM (maxleds, i), data->pwm[i]); -i2c_smbus_write_byte_data (client,PCA9532_REG_PSC (i), +i2c_smbus_write_byte_data (client,PCA9532_REG_PSC (maxleds, i), data->psc[i]); } -for (i =0 ; i <16 ; i++) { +for (i =0 ; i < data->chip_info->num_leds; i++) {struct pca9532_led *led = &data->leds[i];struct pca9532_led *pled = &pdata->leds[i]; led->client = client;
@@ -382,7 +420,7 @@ static int pca9532_configure(struct i2c_client *client, data->gpio.request = pca9532_gpio_request_pin; data->gpio.can_sleep =1 ; data->gpio.base = pdata->gpio_base; - data->gpio.ngpio =16 ; + data->gpio.ngpio = data->chip_info->num_leds; data->gpio.dev = &client->dev; data->gpio.owner =THIS_MODULE ;
@@ -424,6 +462,8 @@ static int pca9532_probe(struct i2c_client *client,if (!data)return -ENOMEM ; + data->chip_info = &pca9532_chip_info_tbl[id->driver_data]; +dev_info (&client->dev,"setting platform data\n" );i2c_set_clientdata (client, data); data->client = client;
@@ -441,7 +481,7 @@ static int pca9532_remove(struct i2c_client *client)struct pca9532_data *data =i2c_get_clientdata (client);int err; - err =pca9532_destroy_devices (data,16 ); + err =pca9532_destroy_devices (data, data->chip_info->num_leds);if (err)return err;
Signature · 1 line
1.7.0.4
Hello Jan,
Quoted 10 lines · Jan Weitzel
pca953x family are only different in number of leds and register layout Adding chipinfo to use driver with whole pca953x family Rename driver to pca953x, but left files and platformflags named pca9532
Tested with pca9530 and pca9533
Tested-by Juergen Kilb <[email protected]>Signed-off-by Jan Weitzel <[email protected]>---
v2: works on top off "pca9532c add gpio capability" patch
I did a short test run with 39-rc5 plus all the pca9532 patches, including this one, and it works with PCA9532 on my custom board. Tested both LED and GPIO functionality.
regards
Joachim Eastwood
PATCH v3 1/1 leds: leds-pca9532 add support pca9530, pca9531 and pca9533
pca953x family are only different in number of leds and register layout Adding chipinfo to use driver with whole pca953x family Rename driver to pca953x, but left files and platformflags named pca9532
Tested with pca9530 and pca9533
---
v3: Acked-and-tested-by
v2: works on top off "pca9532c add gpio capability" patch
drivers/leds/leds-pca9532.c | 84 +++++++++++++++++++++++++++++++----------- 1 files changed, 62 insertions(+), 22 deletions(-)
drivers/leds/leds-pca9532.c +62 -22
@@ -1,13 +1,14 @@/* * pca9532.c - 16-bit Led dimmer * +* Copyright (C) 2011 Jan Weitzel * Copyright (C) 2008 Riku Voipio * * 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 * the Free Software Foundation; version 2 of the License. * -* Datasheet: http://www.nxp.com/acrobat/datasheets/PCA9532_3.pdf +* Datasheet: http://www.nxp.com/documents/data_sheet/PCA9532.pdf * */
@@ -21,15 +22,20 @@#include <linux/leds-pca9532.h> #include <linux/gpio.h> -#define PCA9532_REG_INPUT (i) ((i)/8) -#define PCA9532_REG_PSC (i) (0x2+(i)*2) -#define PCA9532_REG_PWM (i) (0x3+(i)*2) -#define PCA9532_REG_LS0 0x6 -#define LED_REG (led) ((led>>2)+PCA9532_REG_LS0) -#define LED_NUM (led) (led & 0x3) +/* m = num_leds*/ +#define PCA9532_REG_INPUT (i) ((i) >> 3) +#define PCA9532_REG_OFFSET (m) ((m) >> 4) +#define PCA9532_REG_PSC (m, i) (PCA9532_REG_OFFSET(m) + 0x1 + (i) * 2) +#define PCA9532_REG_PWM (m, i) (PCA9532_REG_OFFSET(m) + 0x2 + (i) * 2) +#define LED_REG (m, led) (PCA9532_REG_OFFSET(m) + 0x5 + (led >> 2)) +#define LED_NUM (led) (led & 0x3)#define ldev_to_led (c) container_of(c, struct pca9532_led, ldev) +struct pca9532_chip_info { +u8 num_leds; +}; +struct pca9532_data {struct i2c_client *client;struct pca9532_led leds[16 ];
@@ -39,6 +45,7 @@ struct pca9532_data {#ifdef CONFIG_LEDS_PCA9532_GPIO struct gpio_chip gpio;#endif +const struct pca9532_chip_info *chip_info;u8 pwm[2 ];u8 psc[2 ]; };
@@ -47,16 +54,41 @@ static int pca9532_probe(struct i2c_client *client, const struct i2c_device_id *id);static int pca9532_remove (struct i2c_client *client); +enum { + pca9530, + pca9531, + pca9532, + pca9533, +}; +static const struct i2c_device_id pca9532_id[] = { - {"pca9532" ,0 }, + {"pca9530" , pca9530 }, + {"pca9531" , pca9531 }, + {"pca9532" , pca9532 }, + {"pca9533" , pca9533 }, { } };MODULE_DEVICE_TABLE (i2c, pca9532_id); +static const struct pca9532_chip_info pca9532_chip_info_tbl[] = { + [pca9530] = { + .num_leds =2 , + }, + [pca9531] = { + .num_leds =8 , + }, + [pca9532] = { + .num_leds =16 , + }, + [pca9533] = { + .num_leds =4 , + }, +}; +static struct i2c_driver pca9532_driver = { .driver = { - .name ="pca9532" , + .name ="pca953x" , }, .probe = pca9532_probe, .remove = pca9532_remove,
@@ -73,7 +105,7 @@ static int pca9532_calcpwm(struct i2c_client *client, int pwm, int blink, {int a =0 , b =0 , i =0 ;struct pca9532_data *data =i2c_get_clientdata (client); -for (i =0 ; i <16 ; i++) { +for (i =0 ; i < data->chip_info->num_leds; i++) {if (data->leds[i].type ==PCA9532_TYPE_LED && data->leds[i].state ==PCA9532_PWM0 +pwm) { a++;
@@ -97,10 +129,12 @@ static int pca9532_calcpwm(struct i2c_client *client, int pwm, int blink,static int pca9532_setpwm (struct i2c_client *client,int pwm) {struct pca9532_data *data =i2c_get_clientdata (client); +u8 maxleds = data->chip_info->num_leds; +mutex_lock (&data->update_lock); -i2c_smbus_write_byte_data (client,PCA9532_REG_PWM (pwm), +i2c_smbus_write_byte_data (client,PCA9532_REG_PWM (maxleds, pwm), data->pwm[pwm]); -i2c_smbus_write_byte_data (client,PCA9532_REG_PSC (pwm), +i2c_smbus_write_byte_data (client,PCA9532_REG_PSC (maxleds, pwm), data->psc[pwm]);mutex_unlock (&data->update_lock);return 0 ;
@@ -111,15 +145,16 @@ static void pca9532_setled(struct pca9532_led *led) {struct i2c_client *client = led->client;struct pca9532_data *data =i2c_get_clientdata (client); +u8 maxleds = data->chip_info->num_leds;char reg;mutex_lock (&data->update_lock); - reg =i2c_smbus_read_byte_data (client,LED_REG (led->id)); + reg =i2c_smbus_read_byte_data (client,LED_REG (maxleds, led->id));/* zero led bits */ reg = reg & ~(0x3 <<LED_NUM (led->id)*2 );/* set the new value */ reg = reg | (led->state <<LED_NUM (led->id)*2 ); -i2c_smbus_write_byte_data (client,LED_REG (led->id), reg); +i2c_smbus_write_byte_data (client,LED_REG (maxleds, led->id), reg);mutex_unlock (&data->update_lock); }
@@ -188,10 +223,12 @@ static int pca9532_event(struct input_dev *dev, unsigned int type,static void pca9532_input_work (struct work_struct *work) { -struct pca9532_data *data; - data = container_of(work, struct pca9532_data, work); +struct pca9532_data *data = + container_of(work, struct pca9532_data, work); +u8 maxleds = data->chip_info->num_leds; +mutex_lock (&data->update_lock); -i2c_smbus_write_byte_data (data->client,PCA9532_REG_PWM (1 ), +i2c_smbus_write_byte_data (data->client,PCA9532_REG_PWM (maxleds,1 ), data->pwm[1 ]);mutex_unlock (&data->update_lock); }
@@ -301,17 +338,18 @@ static int pca9532_configure(struct i2c_client *client, {int i, err =0 ;int gpios =0 ; +u8 maxleds = data->chip_info->num_leds;for (i =0 ; i <2 ; i++) { data->pwm[i] = pdata->pwm[i]; data->psc[i] = pdata->psc[i]; -i2c_smbus_write_byte_data (client,PCA9532_REG_PWM (i), +i2c_smbus_write_byte_data (client,PCA9532_REG_PWM (maxleds, i), data->pwm[i]); -i2c_smbus_write_byte_data (client,PCA9532_REG_PSC (i), +i2c_smbus_write_byte_data (client,PCA9532_REG_PSC (maxleds, i), data->psc[i]); } -for (i =0 ; i <16 ; i++) { +for (i =0 ; i < data->chip_info->num_leds; i++) {struct pca9532_led *led = &data->leds[i];struct pca9532_led *pled = &pdata->leds[i]; led->client = client;
@@ -382,7 +420,7 @@ static int pca9532_configure(struct i2c_client *client, data->gpio.request = pca9532_gpio_request_pin; data->gpio.can_sleep =1 ; data->gpio.base = pdata->gpio_base; - data->gpio.ngpio =16 ; + data->gpio.ngpio = data->chip_info->num_leds; data->gpio.dev = &client->dev; data->gpio.owner =THIS_MODULE ;
@@ -424,6 +462,8 @@ static int pca9532_probe(struct i2c_client *client,if (!data)return -ENOMEM ; + data->chip_info = &pca9532_chip_info_tbl[id->driver_data]; +dev_info (&client->dev,"setting platform data\n" );i2c_set_clientdata (client, data); data->client = client;
@@ -441,7 +481,7 @@ static int pca9532_remove(struct i2c_client *client)struct pca9532_data *data =i2c_get_clientdata (client);int err; - err =pca9532_destroy_devices (data,16 ); + err =pca9532_destroy_devices (data, data->chip_info->num_leds);if (err)return err;
Signature · 1 line
1.7.0.4