OSDN Git Service

leds: pca963x: use flexible array
authorMarek Behún <marek.behun@nic.cz>
Sun, 20 Sep 2020 00:24:58 +0000 (02:24 +0200)
committerPavel Machek <pavel@ucw.cz>
Wed, 30 Sep 2020 16:53:28 +0000 (18:53 +0200)
Instead of doing two allocations, allocate only once, by utilizing
flexible array members.

Signed-off-by: Marek 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: Pavel Machek <pavel@ucw.cz>
drivers/leds/leds-pca963x.c

index a409669..73dc007 100644 (file)
@@ -96,15 +96,7 @@ static const struct i2c_device_id pca963x_id[] = {
 };
 MODULE_DEVICE_TABLE(i2c, pca963x_id);
 
-struct pca963x_led;
-
-struct pca963x {
-       struct pca963x_chipdef *chipdef;
-       struct mutex mutex;
-       struct i2c_client *client;
-       struct pca963x_led *leds;
-       unsigned long leds_on;
-};
+struct pca963x;
 
 struct pca963x_led {
        struct pca963x *chip;
@@ -115,6 +107,14 @@ struct pca963x_led {
        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,
                              enum led_brightness brightness)
 {
@@ -367,7 +367,6 @@ static int pca963x_probe(struct i2c_client *client,
        struct device *dev = &client->dev;
        struct pca963x_chipdef *chipdef;
        struct pca963x_platform_data *pdata;
-       struct pca963x_led *leds;
        struct pca963x *chip;
        int i, err;
 
@@ -389,26 +388,23 @@ static int pca963x_probe(struct i2c_client *client,
                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)
                return -ENOMEM;
-       leds = devm_kcalloc(dev, chipdef->n_leds, sizeof(*leds), GFP_KERNEL);
-       if (!leds)
-               return -ENOMEM;
 
        i2c_set_clientdata(client, chip);
 
        mutex_init(&chip->mutex);
        chip->chipdef = chipdef;
        chip->client = client;
-       chip->leds = leds;
 
        /* Turn off LEDs by default*/
        for (i = 0; i < chipdef->n_leds / 4; i++)
                i2c_smbus_write_byte_data(client, chipdef->ledout_base + i, 0x00);
 
        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->chip = chip;