leds-pca9633: Rename to leds-pca963x

The driver now supports the chips pca9633 and pca9634, therefore we
rename the files to more generic and meaningul names

Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
Signed-off-by: Bryan Wu <cooloney@gmail.com>
This commit is contained in:
Ricardo Ribalda Delgado 2013-08-14 14:23:50 -07:00 committed by Bryan Wu
parent a7d0e9884f
commit 56a1740c21
5 changed files with 160 additions and 159 deletions

View file

@ -291,7 +291,7 @@ config LEDS_PCA955X
LED driver chips accessed via the I2C bus. Supported LED driver chips accessed via the I2C bus. Supported
devices include PCA9550, PCA9551, PCA9552, and PCA9553. devices include PCA9550, PCA9551, PCA9552, and PCA9553.
config LEDS_PCA9633 config LEDS_PCA963X
tristate "LED support for PCA963x I2C chip" tristate "LED support for PCA963x I2C chip"
depends on LEDS_CLASS depends on LEDS_CLASS
depends on I2C depends on I2C

View file

@ -35,7 +35,7 @@ obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o
obj-$(CONFIG_LEDS_OT200) += leds-ot200.o obj-$(CONFIG_LEDS_OT200) += leds-ot200.o
obj-$(CONFIG_LEDS_FSG) += leds-fsg.o obj-$(CONFIG_LEDS_FSG) += leds-fsg.o
obj-$(CONFIG_LEDS_PCA955X) += leds-pca955x.o obj-$(CONFIG_LEDS_PCA955X) += leds-pca955x.o
obj-$(CONFIG_LEDS_PCA9633) += leds-pca9633.o obj-$(CONFIG_LEDS_PCA963X) += leds-pca963x.o
obj-$(CONFIG_LEDS_DA903X) += leds-da903x.o obj-$(CONFIG_LEDS_DA903X) += leds-da903x.o
obj-$(CONFIG_LEDS_DA9052) += leds-da9052.o obj-$(CONFIG_LEDS_DA9052) += leds-da9052.o
obj-$(CONFIG_LEDS_WM831X_STATUS) += leds-wm831x-status.o obj-$(CONFIG_LEDS_WM831X_STATUS) += leds-wm831x-status.o

View file

@ -21,7 +21,7 @@
* in identical fashion. The delay_on/delay_off values of the last LED * in identical fashion. The delay_on/delay_off values of the last LED
* that is set to blink will be used for all of the blinking LEDs. * that is set to blink will be used for all of the blinking LEDs.
* Hardware blinking is disabled by default but can be enabled by setting * Hardware blinking is disabled by default but can be enabled by setting
* the 'blink_type' member in the platform_data struct to 'PCA9633_HW_BLINK' * the 'blink_type' member in the platform_data struct to 'PCA963X_HW_BLINK'
* or by adding the 'nxp,hw-blink' property to the DTS. * or by adding the 'nxp,hw-blink' property to the DTS.
*/ */
@ -35,33 +35,33 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/platform_data/leds-pca9633.h> #include <linux/platform_data/leds-pca963x.h>
/* LED select registers determine the source that drives LED outputs */ /* LED select registers determine the source that drives LED outputs */
#define PCA9633_LED_OFF 0x0 /* LED driver off */ #define PCA963X_LED_OFF 0x0 /* LED driver off */
#define PCA9633_LED_ON 0x1 /* LED driver on */ #define PCA963X_LED_ON 0x1 /* LED driver on */
#define PCA9633_LED_PWM 0x2 /* Controlled through PWM */ #define PCA963X_LED_PWM 0x2 /* Controlled through PWM */
#define PCA9633_LED_GRP_PWM 0x3 /* Controlled through PWM/GRPPWM */ #define PCA963X_LED_GRP_PWM 0x3 /* Controlled through PWM/GRPPWM */
#define PCA9633_MODE2_DMBLNK 0x20 /* Enable blinking */ #define PCA963X_MODE2_DMBLNK 0x20 /* Enable blinking */
#define PCA9633_MODE1 0x00 #define PCA963X_MODE1 0x00
#define PCA9633_MODE2 0x01 #define PCA963X_MODE2 0x01
#define PCA9633_PWM_BASE 0x02 #define PCA963X_PWM_BASE 0x02
enum pca9633_type { enum pca963x_type {
pca9633, pca9633,
pca9634, pca9634,
}; };
struct pca9633_chipdef { struct pca963x_chipdef {
u8 grppwm; u8 grppwm;
u8 grpfreq; u8 grpfreq;
u8 ledout_base; u8 ledout_base;
int n_leds; int n_leds;
}; };
static struct pca9633_chipdef pca9633_chipdefs[] = { static struct pca963x_chipdef pca963x_chipdefs[] = {
[pca9633] = { [pca9633] = {
.grppwm = 0x6, .grppwm = 0x6,
.grpfreq = 0x7, .grpfreq = 0x7,
@ -77,141 +77,141 @@ static struct pca9633_chipdef pca9633_chipdefs[] = {
}; };
/* Total blink period in milliseconds */ /* Total blink period in milliseconds */
#define PCA9632_BLINK_PERIOD_MIN 42 #define PCA963X_BLINK_PERIOD_MIN 42
#define PCA9632_BLINK_PERIOD_MAX 10667 #define PCA963X_BLINK_PERIOD_MAX 10667
static const struct i2c_device_id pca9633_id[] = { static const struct i2c_device_id pca963x_id[] = {
{ "pca9632", pca9633 }, { "pca9632", pca9633 },
{ "pca9633", pca9633 }, { "pca9633", pca9633 },
{ "pca9634", pca9634 }, { "pca9634", pca9634 },
{ } { }
}; };
MODULE_DEVICE_TABLE(i2c, pca9633_id); MODULE_DEVICE_TABLE(i2c, pca963x_id);
enum pca9633_cmd { enum pca963x_cmd {
BRIGHTNESS_SET, BRIGHTNESS_SET,
BLINK_SET, BLINK_SET,
}; };
struct pca9633_led; struct pca963x_led;
struct pca9633 { struct pca963x {
struct pca9633_chipdef *chipdef; struct pca963x_chipdef *chipdef;
struct mutex mutex; struct mutex mutex;
struct i2c_client *client; struct i2c_client *client;
struct pca9633_led *leds; struct pca963x_led *leds;
}; };
struct pca9633_led { struct pca963x_led {
struct pca9633 *chip; struct pca963x *chip;
struct work_struct work; struct work_struct work;
enum led_brightness brightness; enum led_brightness brightness;
struct led_classdev led_cdev; struct led_classdev led_cdev;
int led_num; /* 0 .. 7 potentially */ int led_num; /* 0 .. 7 potentially */
enum pca9633_cmd cmd; enum pca963x_cmd cmd;
char name[32]; char name[32];
u8 gdc; u8 gdc;
u8 gfrq; u8 gfrq;
}; };
static void pca9633_brightness_work(struct pca9633_led *pca9633) static void pca963x_brightness_work(struct pca963x_led *pca963x)
{ {
u8 ledout_addr = pca9633->chip->chipdef->ledout_base u8 ledout_addr = pca963x->chip->chipdef->ledout_base
+ (pca9633->led_num / 4); + (pca963x->led_num / 4);
u8 ledout; u8 ledout;
int shift = 2 * (pca9633->led_num % 4); int shift = 2 * (pca963x->led_num % 4);
u8 mask = 0x3 << shift; u8 mask = 0x3 << shift;
mutex_lock(&pca9633->chip->mutex); mutex_lock(&pca963x->chip->mutex);
ledout = i2c_smbus_read_byte_data(pca9633->chip->client, ledout_addr); ledout = i2c_smbus_read_byte_data(pca963x->chip->client, ledout_addr);
switch (pca9633->brightness) { switch (pca963x->brightness) {
case LED_FULL: case LED_FULL:
i2c_smbus_write_byte_data(pca9633->chip->client, ledout_addr, i2c_smbus_write_byte_data(pca963x->chip->client, ledout_addr,
(ledout & ~mask) | (PCA9633_LED_ON << shift)); (ledout & ~mask) | (PCA963X_LED_ON << shift));
break; break;
case LED_OFF: case LED_OFF:
i2c_smbus_write_byte_data(pca9633->chip->client, ledout_addr, i2c_smbus_write_byte_data(pca963x->chip->client, ledout_addr,
ledout & ~mask); ledout & ~mask);
break; break;
default: default:
i2c_smbus_write_byte_data(pca9633->chip->client, i2c_smbus_write_byte_data(pca963x->chip->client,
PCA9633_PWM_BASE + pca9633->led_num, PCA963X_PWM_BASE + pca963x->led_num,
pca9633->brightness); pca963x->brightness);
i2c_smbus_write_byte_data(pca9633->chip->client, ledout_addr, i2c_smbus_write_byte_data(pca963x->chip->client, ledout_addr,
(ledout & ~mask) | (PCA9633_LED_PWM << shift)); (ledout & ~mask) | (PCA963X_LED_PWM << shift));
break; break;
} }
mutex_unlock(&pca9633->chip->mutex); mutex_unlock(&pca963x->chip->mutex);
} }
static void pca9633_blink_work(struct pca9633_led *pca9633) static void pca963x_blink_work(struct pca963x_led *pca963x)
{ {
u8 ledout_addr = pca9633->chip->chipdef->ledout_base + u8 ledout_addr = pca963x->chip->chipdef->ledout_base +
(pca9633->led_num / 4); (pca963x->led_num / 4);
u8 ledout; u8 ledout;
u8 mode2 = i2c_smbus_read_byte_data(pca9633->chip->client, u8 mode2 = i2c_smbus_read_byte_data(pca963x->chip->client,
PCA9633_MODE2); PCA963X_MODE2);
int shift = 2 * (pca9633->led_num % 4); int shift = 2 * (pca963x->led_num % 4);
u8 mask = 0x3 << shift; u8 mask = 0x3 << shift;
i2c_smbus_write_byte_data(pca9633->chip->client, i2c_smbus_write_byte_data(pca963x->chip->client,
pca9633->chip->chipdef->grppwm, pca9633->gdc); pca963x->chip->chipdef->grppwm, pca963x->gdc);
i2c_smbus_write_byte_data(pca9633->chip->client, i2c_smbus_write_byte_data(pca963x->chip->client,
pca9633->chip->chipdef->grpfreq, pca9633->gfrq); pca963x->chip->chipdef->grpfreq, pca963x->gfrq);
if (!(mode2 & PCA9633_MODE2_DMBLNK)) if (!(mode2 & PCA963X_MODE2_DMBLNK))
i2c_smbus_write_byte_data(pca9633->chip->client, PCA9633_MODE2, i2c_smbus_write_byte_data(pca963x->chip->client, PCA963X_MODE2,
mode2 | PCA9633_MODE2_DMBLNK); mode2 | PCA963X_MODE2_DMBLNK);
mutex_lock(&pca9633->chip->mutex); mutex_lock(&pca963x->chip->mutex);
ledout = i2c_smbus_read_byte_data(pca9633->chip->client, ledout_addr); ledout = i2c_smbus_read_byte_data(pca963x->chip->client, ledout_addr);
if ((ledout & mask) != (PCA9633_LED_GRP_PWM << shift)) if ((ledout & mask) != (PCA963X_LED_GRP_PWM << shift))
i2c_smbus_write_byte_data(pca9633->chip->client, ledout_addr, i2c_smbus_write_byte_data(pca963x->chip->client, ledout_addr,
(ledout & ~mask) | (PCA9633_LED_GRP_PWM << shift)); (ledout & ~mask) | (PCA963X_LED_GRP_PWM << shift));
mutex_unlock(&pca9633->chip->mutex); mutex_unlock(&pca963x->chip->mutex);
} }
static void pca9633_work(struct work_struct *work) static void pca963x_work(struct work_struct *work)
{ {
struct pca9633_led *pca9633 = container_of(work, struct pca963x_led *pca963x = container_of(work,
struct pca9633_led, work); struct pca963x_led, work);
switch (pca9633->cmd) { switch (pca963x->cmd) {
case BRIGHTNESS_SET: case BRIGHTNESS_SET:
pca9633_brightness_work(pca9633); pca963x_brightness_work(pca963x);
break; break;
case BLINK_SET: case BLINK_SET:
pca9633_blink_work(pca9633); pca963x_blink_work(pca963x);
break; break;
} }
} }
static void pca9633_led_set(struct led_classdev *led_cdev, static void pca963x_led_set(struct led_classdev *led_cdev,
enum led_brightness value) enum led_brightness value)
{ {
struct pca9633_led *pca9633; struct pca963x_led *pca963x;
pca9633 = container_of(led_cdev, struct pca9633_led, led_cdev); pca963x = container_of(led_cdev, struct pca963x_led, led_cdev);
pca9633->cmd = BRIGHTNESS_SET; pca963x->cmd = BRIGHTNESS_SET;
pca9633->brightness = value; pca963x->brightness = value;
/* /*
* Must use workqueue for the actual I/O since I2C operations * Must use workqueue for the actual I/O since I2C operations
* can sleep. * can sleep.
*/ */
schedule_work(&pca9633->work); schedule_work(&pca963x->work);
} }
static int pca9633_blink_set(struct led_classdev *led_cdev, static int pca963x_blink_set(struct led_classdev *led_cdev,
unsigned long *delay_on, unsigned long *delay_off) unsigned long *delay_on, unsigned long *delay_off)
{ {
struct pca9633_led *pca9633; struct pca963x_led *pca963x;
unsigned long time_on, time_off, period; unsigned long time_on, time_off, period;
u8 gdc, gfrq; u8 gdc, gfrq;
pca9633 = container_of(led_cdev, struct pca9633_led, led_cdev); pca963x = container_of(led_cdev, struct pca963x_led, led_cdev);
time_on = *delay_on; time_on = *delay_on;
time_off = *delay_off; time_off = *delay_off;
@ -225,8 +225,8 @@ static int pca9633_blink_set(struct led_classdev *led_cdev,
period = time_on + time_off; period = time_on + time_off;
/* If period not supported by hardware, default to someting sane. */ /* If period not supported by hardware, default to someting sane. */
if ((period < PCA9632_BLINK_PERIOD_MIN) || if ((period < PCA963X_BLINK_PERIOD_MIN) ||
(period > PCA9632_BLINK_PERIOD_MAX)) { (period > PCA963X_BLINK_PERIOD_MAX)) {
time_on = 500; time_on = 500;
time_off = 500; time_off = 500;
period = time_on + time_off; period = time_on + time_off;
@ -246,15 +246,15 @@ static int pca9633_blink_set(struct led_classdev *led_cdev,
*/ */
gfrq = (period * 24 / 1000) - 1; gfrq = (period * 24 / 1000) - 1;
pca9633->cmd = BLINK_SET; pca963x->cmd = BLINK_SET;
pca9633->gdc = gdc; pca963x->gdc = gdc;
pca9633->gfrq = gfrq; pca963x->gfrq = gfrq;
/* /*
* Must use workqueue for the actual I/O since I2C operations * Must use workqueue for the actual I/O since I2C operations
* can sleep. * can sleep.
*/ */
schedule_work(&pca9633->work); schedule_work(&pca963x->work);
*delay_on = time_on; *delay_on = time_on;
*delay_off = time_off; *delay_off = time_off;
@ -263,21 +263,21 @@ static int pca9633_blink_set(struct led_classdev *led_cdev,
} }
#if IS_ENABLED(CONFIG_OF) #if IS_ENABLED(CONFIG_OF)
static struct pca9633_platform_data * static struct pca963x_platform_data *
pca9633_dt_init(struct i2c_client *client, struct pca9633_chipdef *chip) pca963x_dt_init(struct i2c_client *client, struct pca963x_chipdef *chip)
{ {
struct device_node *np = client->dev.of_node, *child; struct device_node *np = client->dev.of_node, *child;
struct pca9633_platform_data *pdata; struct pca963x_platform_data *pdata;
struct led_info *pca9633_leds; struct led_info *pca963x_leds;
int count; int count;
count = of_get_child_count(np); count = of_get_child_count(np);
if (!count || count > chip->n_leds) if (!count || count > chip->n_leds)
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
pca9633_leds = devm_kzalloc(&client->dev, pca963x_leds = devm_kzalloc(&client->dev,
sizeof(struct led_info) * chip->n_leds, GFP_KERNEL); sizeof(struct led_info) * chip->n_leds, GFP_KERNEL);
if (!pca9633_leds) if (!pca963x_leds)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
for_each_child_of_node(np, child) { for_each_child_of_node(np, child) {
@ -292,59 +292,59 @@ pca9633_dt_init(struct i2c_client *client, struct pca9633_chipdef *chip)
res = of_property_read_u32(child, "reg", &reg); res = of_property_read_u32(child, "reg", &reg);
if (res != 0) if (res != 0)
continue; continue;
pca9633_leds[reg] = led; pca963x_leds[reg] = led;
} }
pdata = devm_kzalloc(&client->dev, pdata = devm_kzalloc(&client->dev,
sizeof(struct pca9633_platform_data), GFP_KERNEL); sizeof(struct pca963x_platform_data), GFP_KERNEL);
if (!pdata) if (!pdata)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
pdata->leds.leds = pca9633_leds; pdata->leds.leds = pca963x_leds;
pdata->leds.num_leds = count; pdata->leds.num_leds = count;
/* default to open-drain unless totem pole (push-pull) is specified */ /* default to open-drain unless totem pole (push-pull) is specified */
if (of_property_read_bool(np, "nxp,totem-pole")) if (of_property_read_bool(np, "nxp,totem-pole"))
pdata->outdrv = PCA9633_TOTEM_POLE; pdata->outdrv = PCA963X_TOTEM_POLE;
else else
pdata->outdrv = PCA9633_OPEN_DRAIN; pdata->outdrv = PCA963X_OPEN_DRAIN;
/* default to software blinking unless hardware blinking is specified */ /* default to software blinking unless hardware blinking is specified */
if (of_property_read_bool(np, "nxp,hw-blink")) if (of_property_read_bool(np, "nxp,hw-blink"))
pdata->blink_type = PCA9633_HW_BLINK; pdata->blink_type = PCA963X_HW_BLINK;
else else
pdata->blink_type = PCA9633_SW_BLINK; pdata->blink_type = PCA963X_SW_BLINK;
return pdata; return pdata;
} }
static const struct of_device_id of_pca9633_match[] = { static const struct of_device_id of_pca963x_match[] = {
{ .compatible = "nxp,pca9632", }, { .compatible = "nxp,pca9632", },
{ .compatible = "nxp,pca9633", }, { .compatible = "nxp,pca9633", },
{ .compatible = "nxp,pca9634", }, { .compatible = "nxp,pca9634", },
{}, {},
}; };
#else #else
static struct pca9633_platform_data * static struct pca963x_platform_data *
pca9633_dt_init(struct i2c_client *client, struct pca9633_chipdef *chip) pca963x_dt_init(struct i2c_client *client, struct pca963x_chipdef *chip)
{ {
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
} }
#endif #endif
static int pca9633_probe(struct i2c_client *client, static int pca963x_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct pca9633 *pca9633_chip; struct pca963x *pca963x_chip;
struct pca9633_led *pca9633; struct pca963x_led *pca963x;
struct pca9633_platform_data *pdata; struct pca963x_platform_data *pdata;
struct pca9633_chipdef *chip; struct pca963x_chipdef *chip;
int i, err; int i, err;
chip = &pca9633_chipdefs[id->driver_data]; chip = &pca963x_chipdefs[id->driver_data];
pdata = dev_get_platdata(&client->dev); pdata = dev_get_platdata(&client->dev);
if (!pdata) { if (!pdata) {
pdata = pca9633_dt_init(client, chip); pdata = pca963x_dt_init(client, chip);
if (IS_ERR(pdata)) { if (IS_ERR(pdata)) {
dev_warn(&client->dev, "could not parse configuration\n"); dev_warn(&client->dev, "could not parse configuration\n");
pdata = NULL; pdata = NULL;
@ -358,21 +358,21 @@ static int pca9633_probe(struct i2c_client *client,
return -EINVAL; return -EINVAL;
} }
pca9633_chip = devm_kzalloc(&client->dev, sizeof(*pca9633_chip), pca963x_chip = devm_kzalloc(&client->dev, sizeof(*pca963x_chip),
GFP_KERNEL); GFP_KERNEL);
if (!pca9633_chip) if (!pca963x_chip)
return -ENOMEM; return -ENOMEM;
pca9633 = devm_kzalloc(&client->dev, chip->n_leds * sizeof(*pca9633), pca963x = devm_kzalloc(&client->dev, chip->n_leds * sizeof(*pca963x),
GFP_KERNEL); GFP_KERNEL);
if (!pca9633) if (!pca963x)
return -ENOMEM; return -ENOMEM;
i2c_set_clientdata(client, pca9633_chip); i2c_set_clientdata(client, pca963x_chip);
mutex_init(&pca9633_chip->mutex); mutex_init(&pca963x_chip->mutex);
pca9633_chip->chipdef = chip; pca963x_chip->chipdef = chip;
pca9633_chip->client = client; pca963x_chip->client = client;
pca9633_chip->leds = pca9633; pca963x_chip->leds = pca963x;
/* Turn off LEDs by default*/ /* Turn off LEDs by default*/
i2c_smbus_write_byte_data(client, chip->ledout_base, 0x00); i2c_smbus_write_byte_data(client, chip->ledout_base, 0x00);
@ -380,82 +380,82 @@ static int pca9633_probe(struct i2c_client *client,
i2c_smbus_write_byte_data(client, chip->ledout_base + 1, 0x00); i2c_smbus_write_byte_data(client, chip->ledout_base + 1, 0x00);
for (i = 0; i < chip->n_leds; i++) { for (i = 0; i < chip->n_leds; i++) {
pca9633[i].led_num = i; pca963x[i].led_num = i;
pca9633[i].chip = pca9633_chip; pca963x[i].chip = pca963x_chip;
/* Platform data can specify LED names and default triggers */ /* Platform data can specify LED names and default triggers */
if (pdata && i < pdata->leds.num_leds) { if (pdata && i < pdata->leds.num_leds) {
if (pdata->leds.leds[i].name) if (pdata->leds.leds[i].name)
snprintf(pca9633[i].name, snprintf(pca963x[i].name,
sizeof(pca9633[i].name), "pca9633:%s", sizeof(pca963x[i].name), "pca963x:%s",
pdata->leds.leds[i].name); pdata->leds.leds[i].name);
if (pdata->leds.leds[i].default_trigger) if (pdata->leds.leds[i].default_trigger)
pca9633[i].led_cdev.default_trigger = pca963x[i].led_cdev.default_trigger =
pdata->leds.leds[i].default_trigger; pdata->leds.leds[i].default_trigger;
} }
if (!pdata || i >= pdata->leds.num_leds || if (!pdata || i >= pdata->leds.num_leds ||
!pdata->leds.leds[i].name) !pdata->leds.leds[i].name)
snprintf(pca9633[i].name, sizeof(pca9633[i].name), snprintf(pca963x[i].name, sizeof(pca963x[i].name),
"pca9633:%d:%.2x:%d", client->adapter->nr, "pca963x:%d:%.2x:%d", client->adapter->nr,
client->addr, i); client->addr, i);
pca9633[i].led_cdev.name = pca9633[i].name; pca963x[i].led_cdev.name = pca963x[i].name;
pca9633[i].led_cdev.brightness_set = pca9633_led_set; pca963x[i].led_cdev.brightness_set = pca963x_led_set;
if (pdata && pdata->blink_type == PCA9633_HW_BLINK) if (pdata && pdata->blink_type == PCA963X_HW_BLINK)
pca9633[i].led_cdev.blink_set = pca9633_blink_set; pca963x[i].led_cdev.blink_set = pca963x_blink_set;
INIT_WORK(&pca9633[i].work, pca9633_work); INIT_WORK(&pca963x[i].work, pca963x_work);
err = led_classdev_register(&client->dev, &pca9633[i].led_cdev); err = led_classdev_register(&client->dev, &pca963x[i].led_cdev);
if (err < 0) if (err < 0)
goto exit; goto exit;
} }
/* Disable LED all-call address and set normal mode */ /* Disable LED all-call address and set normal mode */
i2c_smbus_write_byte_data(client, PCA9633_MODE1, 0x00); i2c_smbus_write_byte_data(client, PCA963X_MODE1, 0x00);
/* Configure output: open-drain or totem pole (push-pull) */ /* Configure output: open-drain or totem pole (push-pull) */
if (pdata && pdata->outdrv == PCA9633_OPEN_DRAIN) if (pdata && pdata->outdrv == PCA963X_OPEN_DRAIN)
i2c_smbus_write_byte_data(client, PCA9633_MODE2, 0x01); i2c_smbus_write_byte_data(client, PCA963X_MODE2, 0x01);
return 0; return 0;
exit: exit:
while (i--) { while (i--) {
led_classdev_unregister(&pca9633[i].led_cdev); led_classdev_unregister(&pca963x[i].led_cdev);
cancel_work_sync(&pca9633[i].work); cancel_work_sync(&pca963x[i].work);
} }
return err; return err;
} }
static int pca9633_remove(struct i2c_client *client) static int pca963x_remove(struct i2c_client *client)
{ {
struct pca9633 *pca9633 = i2c_get_clientdata(client); struct pca963x *pca963x = i2c_get_clientdata(client);
int i; int i;
for (i = 0; i < pca9633->chipdef->n_leds; i++) { for (i = 0; i < pca963x->chipdef->n_leds; i++) {
led_classdev_unregister(&pca9633->leds[i].led_cdev); led_classdev_unregister(&pca963x->leds[i].led_cdev);
cancel_work_sync(&pca9633->leds[i].work); cancel_work_sync(&pca963x->leds[i].work);
} }
return 0; return 0;
} }
static struct i2c_driver pca9633_driver = { static struct i2c_driver pca963x_driver = {
.driver = { .driver = {
.name = "leds-pca9633", .name = "leds-pca963x",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.of_match_table = of_match_ptr(of_pca9633_match), .of_match_table = of_match_ptr(of_pca963x_match),
}, },
.probe = pca9633_probe, .probe = pca963x_probe,
.remove = pca9633_remove, .remove = pca963x_remove,
.id_table = pca9633_id, .id_table = pca963x_id,
}; };
module_i2c_driver(pca9633_driver); module_i2c_driver(pca963x_driver);
MODULE_AUTHOR("Peter Meerwald <p.meerwald@bct-electronic.com>"); MODULE_AUTHOR("Peter Meerwald <p.meerwald@bct-electronic.com>");
MODULE_DESCRIPTION("PCA9633 LED driver"); MODULE_DESCRIPTION("PCA963X LED driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View file

@ -1,7 +1,8 @@
/* /*
* PCA9633 LED chip driver. * PCA963X LED chip driver.
* *
* Copyright 2012 bct electronic GmbH * Copyright 2012 bct electronic GmbH
* Copyright 2013 Qtechnology A/S
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -18,24 +19,24 @@
* 02110-1301 USA * 02110-1301 USA
*/ */
#ifndef __LINUX_PCA9633_H #ifndef __LINUX_PCA963X_H
#define __LINUX_PCA9633_H #define __LINUX_PCA963X_H
#include <linux/leds.h> #include <linux/leds.h>
enum pca9633_outdrv { enum pca963x_outdrv {
PCA9633_OPEN_DRAIN, PCA963X_OPEN_DRAIN,
PCA9633_TOTEM_POLE, /* aka push-pull */ PCA963X_TOTEM_POLE, /* aka push-pull */
}; };
enum pca9633_blink_type { enum pca963x_blink_type {
PCA9633_SW_BLINK, PCA963X_SW_BLINK,
PCA9633_HW_BLINK, PCA963X_HW_BLINK,
}; };
struct pca9633_platform_data { struct pca963x_platform_data {
struct led_platform_data leds; struct led_platform_data leds;
enum pca9633_outdrv outdrv; enum pca963x_outdrv outdrv;
enum pca9633_blink_type blink_type; enum pca963x_blink_type blink_type;
}; };
#endif /* __LINUX_PCA9633_H*/ #endif /* __LINUX_PCA963X_H*/