Commit b5a3b44f authored by Marek Behún's avatar Marek Behún Committed by Pavel Machek

leds: pca963x: use flexible array

Instead of doing two allocations, allocate only once, by utilizing
flexible array members.
Signed-off-by: default avatarMarek Behún <marek.behun@nic.cz>
Cc: Peter Meerwald <p.meerwald@bct-electronic.com>
Cc: Ricardo Ribalda <ribalda@kernel.org>
Cc: Zahari Petkov <zahari@balena.io>
Signed-off-by: default avatarPavel Machek <pavel@ucw.cz>
parent 5db85093
...@@ -96,15 +96,7 @@ static const struct i2c_device_id pca963x_id[] = { ...@@ -96,15 +96,7 @@ static const struct i2c_device_id pca963x_id[] = {
}; };
MODULE_DEVICE_TABLE(i2c, pca963x_id); MODULE_DEVICE_TABLE(i2c, pca963x_id);
struct pca963x_led; struct pca963x;
struct pca963x {
struct pca963x_chipdef *chipdef;
struct mutex mutex;
struct i2c_client *client;
struct pca963x_led *leds;
unsigned long leds_on;
};
struct pca963x_led { struct pca963x_led {
struct pca963x *chip; struct pca963x *chip;
...@@ -115,6 +107,14 @@ struct pca963x_led { ...@@ -115,6 +107,14 @@ struct pca963x_led {
u8 gfrq; u8 gfrq;
}; };
struct pca963x {
struct pca963x_chipdef *chipdef;
struct mutex mutex;
struct i2c_client *client;
unsigned long leds_on;
struct pca963x_led leds[];
};
static int pca963x_brightness(struct pca963x_led *led, static int pca963x_brightness(struct pca963x_led *led,
enum led_brightness brightness) enum led_brightness brightness)
{ {
...@@ -367,7 +367,6 @@ static int pca963x_probe(struct i2c_client *client, ...@@ -367,7 +367,6 @@ static int pca963x_probe(struct i2c_client *client,
struct device *dev = &client->dev; struct device *dev = &client->dev;
struct pca963x_chipdef *chipdef; struct pca963x_chipdef *chipdef;
struct pca963x_platform_data *pdata; struct pca963x_platform_data *pdata;
struct pca963x_led *leds;
struct pca963x *chip; struct pca963x *chip;
int i, err; int i, err;
...@@ -389,26 +388,23 @@ static int pca963x_probe(struct i2c_client *client, ...@@ -389,26 +388,23 @@ static int pca963x_probe(struct i2c_client *client,
return -EINVAL; return -EINVAL;
} }
chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL); chip = devm_kzalloc(dev, struct_size(chip, leds, chipdef->n_leds),
GFP_KERNEL);
if (!chip) if (!chip)
return -ENOMEM; return -ENOMEM;
leds = devm_kcalloc(dev, chipdef->n_leds, sizeof(*leds), GFP_KERNEL);
if (!leds)
return -ENOMEM;
i2c_set_clientdata(client, chip); i2c_set_clientdata(client, chip);
mutex_init(&chip->mutex); mutex_init(&chip->mutex);
chip->chipdef = chipdef; chip->chipdef = chipdef;
chip->client = client; chip->client = client;
chip->leds = leds;
/* Turn off LEDs by default*/ /* Turn off LEDs by default*/
for (i = 0; i < chipdef->n_leds / 4; i++) for (i = 0; i < chipdef->n_leds / 4; i++)
i2c_smbus_write_byte_data(client, chipdef->ledout_base + i, 0x00); i2c_smbus_write_byte_data(client, chipdef->ledout_base + i, 0x00);
for (i = 0; i < chipdef->n_leds; i++) { for (i = 0; i < chipdef->n_leds; i++) {
struct pca963x_led *led = &leds[i]; struct pca963x_led *led = &chip->leds[i];
led->led_num = i; led->led_num = i;
led->chip = chip; led->chip = chip;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment