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

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
Loading
Loading
Loading
Loading
+12 −16
Original line number Original line Diff line number Diff line
@@ -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 {
	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,
	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,
		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;