summaryrefslogtreecommitdiffstats
path: root/drivers/leds/led-class.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/leds/led-class.c')
-rw-r--r--drivers/leds/led-class.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
index 242122f49333..508d6477d0b8 100644
--- a/drivers/leds/led-class.c
+++ b/drivers/leds/led-class.c
@@ -254,17 +254,31 @@ int led_classdev_register_ext(struct device *parent,
254 struct led_classdev *led_cdev, 254 struct led_classdev *led_cdev,
255 struct led_init_data *init_data) 255 struct led_init_data *init_data)
256{ 256{
257 char name[LED_MAX_NAME_SIZE]; 257 char composed_name[LED_MAX_NAME_SIZE];
258 char final_name[LED_MAX_NAME_SIZE];
259 const char *proposed_name = composed_name;
258 int ret; 260 int ret;
259 261
260 ret = led_classdev_next_name(led_cdev->name, name, sizeof(name)); 262 if (init_data) {
263 if (init_data->devname_mandatory && !init_data->devicename) {
264 dev_err(parent, "Mandatory device name is missing");
265 return -EINVAL;
266 }
267 ret = led_compose_name(parent, init_data, composed_name);
268 if (ret < 0)
269 return ret;
270 } else {
271 proposed_name = led_cdev->name;
272 }
273
274 ret = led_classdev_next_name(proposed_name, final_name, sizeof(final_name));
261 if (ret < 0) 275 if (ret < 0)
262 return ret; 276 return ret;
263 277
264 mutex_init(&led_cdev->led_access); 278 mutex_init(&led_cdev->led_access);
265 mutex_lock(&led_cdev->led_access); 279 mutex_lock(&led_cdev->led_access);
266 led_cdev->dev = device_create_with_groups(leds_class, parent, 0, 280 led_cdev->dev = device_create_with_groups(leds_class, parent, 0,
267 led_cdev, led_cdev->groups, "%s", name); 281 led_cdev, led_cdev->groups, "%s", final_name);
268 if (IS_ERR(led_cdev->dev)) { 282 if (IS_ERR(led_cdev->dev)) {
269 mutex_unlock(&led_cdev->led_access); 283 mutex_unlock(&led_cdev->led_access);
270 return PTR_ERR(led_cdev->dev); 284 return PTR_ERR(led_cdev->dev);