Commit e5971bbc1caf0ccbab3fea74fe37abb649d1c7cf

Authored by Simon Guinot
Committed by Nicolas Pitre
1 parent b51d92da4e

leds: leds-ns2: fix private driver data storage

dev_set_drvdata() can't be used to set the driver private data pointer.
This would overwrite the led classdev object previously registered by
led_classdev_register().

Note that despite this mistake, the driver work fine because led_dat and
led_dat->cdev are at the same memory address.

Signed-off-by: Simon Guinot <sguinot@lacie.com>
Signed-off-by: Nicolas Pitre <nico@fluxnic.net>

Showing 1 changed file with 6 additions and 3 deletions Side-by-side Diff

drivers/leds/leds-ns2.c
... ... @@ -141,10 +141,12 @@
141 141 struct device_attribute *attr,
142 142 const char *buff, size_t count)
143 143 {
  144 + struct led_classdev *led_cdev = dev_get_drvdata(dev);
  145 + struct ns2_led_data *led_dat =
  146 + container_of(led_cdev, struct ns2_led_data, cdev);
144 147 int ret;
145 148 unsigned long enable;
146 149 enum ns2_led_modes mode;
147   - struct ns2_led_data *led_dat = dev_get_drvdata(dev);
148 150  
149 151 ret = strict_strtoul(buff, 10, &enable);
150 152 if (ret < 0)
... ... @@ -172,7 +174,9 @@
172 174 static ssize_t ns2_led_sata_show(struct device *dev,
173 175 struct device_attribute *attr, char *buf)
174 176 {
175   - struct ns2_led_data *led_dat = dev_get_drvdata(dev);
  177 + struct led_classdev *led_cdev = dev_get_drvdata(dev);
  178 + struct ns2_led_data *led_dat =
  179 + container_of(led_cdev, struct ns2_led_data, cdev);
176 180  
177 181 return sprintf(buf, "%d\n", led_dat->sata);
178 182 }
... ... @@ -234,7 +238,6 @@
234 238 if (ret < 0)
235 239 goto err_free_slow;
236 240  
237   - dev_set_drvdata(led_dat->cdev.dev, led_dat);
238 241 ret = device_create_file(led_dat->cdev.dev, &dev_attr_sata);
239 242 if (ret < 0)
240 243 goto err_free_cdev;