Commit 9334129e authored by NeilBrown's avatar NeilBrown Committed by Bryan Wu

LEDS: tca6507 - fix bugs in parsing of device-tree configuration.

1/ The led_info array must be allocated to allow the full number
  of LEDs even if not all are present.  The array maybe be sparsely
  filled but it is indexed by device address so we must at least
  allocate as many slots as the highest address used.  It is easiest
  just to allocate all 7.

2/ range check the 'reg' value properly.

3/ led.flags must be initialised to zero, else all leds could
   be treated as GPIOs (depending on what happens to be on the stack).
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
Signed-off-by: default avatarBryan Wu <cooloney@gmail.com>
parent 802eee95
...@@ -682,7 +682,7 @@ tca6507_led_dt_init(struct i2c_client *client) ...@@ -682,7 +682,7 @@ tca6507_led_dt_init(struct i2c_client *client)
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
tca_leds = devm_kzalloc(&client->dev, tca_leds = devm_kzalloc(&client->dev,
sizeof(struct led_info) * count, GFP_KERNEL); sizeof(struct led_info) * NUM_LEDS, GFP_KERNEL);
if (!tca_leds) if (!tca_leds)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -695,9 +695,9 @@ tca6507_led_dt_init(struct i2c_client *client) ...@@ -695,9 +695,9 @@ tca6507_led_dt_init(struct i2c_client *client)
of_get_property(child, "label", NULL) ? : child->name; of_get_property(child, "label", NULL) ? : child->name;
led.default_trigger = led.default_trigger =
of_get_property(child, "linux,default-trigger", NULL); of_get_property(child, "linux,default-trigger", NULL);
led.flags = 0;
ret = of_property_read_u32(child, "reg", &reg); ret = of_property_read_u32(child, "reg", &reg);
if (ret != 0) if (ret != 0 || reg < 0 || reg >= NUM_LEDS)
continue; continue;
tca_leds[reg] = led; tca_leds[reg] = led;
...@@ -708,7 +708,7 @@ tca6507_led_dt_init(struct i2c_client *client) ...@@ -708,7 +708,7 @@ tca6507_led_dt_init(struct i2c_client *client)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
pdata->leds.leds = tca_leds; pdata->leds.leds = tca_leds;
pdata->leds.num_leds = count; pdata->leds.num_leds = NUM_LEDS;
return pdata; return pdata;
} }
......
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