hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/leds/led-class-flash.c
....@@ -1,12 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * LED Flash class interface
34 *
45 * Copyright (C) 2015 Samsung Electronics Co., Ltd.
56 * Author: Jacek Anaszewski <j.anaszewski@samsung.com>
6
- *
7
- * This program is free software; you can redistribute it and/or modify
8
- * it under the terms of the GNU General Public License version 2 as
9
- * published by the Free Software Foundation.
107 */
118
129 #include <linux/device.h>
....@@ -285,8 +282,9 @@
285282 led_cdev->groups = flash_groups;
286283 }
287284
288
-int led_classdev_flash_register(struct device *parent,
289
- struct led_classdev_flash *fled_cdev)
285
+int led_classdev_flash_register_ext(struct device *parent,
286
+ struct led_classdev_flash *fled_cdev,
287
+ struct led_init_data *init_data)
290288 {
291289 struct led_classdev *led_cdev;
292290 const struct led_flash_ops *ops;
....@@ -312,13 +310,13 @@
312310 }
313311
314312 /* Register led class device */
315
- ret = led_classdev_register(parent, led_cdev);
313
+ ret = led_classdev_register_ext(parent, led_cdev, init_data);
316314 if (ret < 0)
317315 return ret;
318316
319317 return 0;
320318 }
321
-EXPORT_SYMBOL_GPL(led_classdev_flash_register);
319
+EXPORT_SYMBOL_GPL(led_classdev_flash_register_ext);
322320
323321 void led_classdev_flash_unregister(struct led_classdev_flash *fled_cdev)
324322 {
....@@ -329,6 +327,56 @@
329327 }
330328 EXPORT_SYMBOL_GPL(led_classdev_flash_unregister);
331329
330
+static void devm_led_classdev_flash_release(struct device *dev, void *res)
331
+{
332
+ led_classdev_flash_unregister(*(struct led_classdev_flash **)res);
333
+}
334
+
335
+int devm_led_classdev_flash_register_ext(struct device *parent,
336
+ struct led_classdev_flash *fled_cdev,
337
+ struct led_init_data *init_data)
338
+{
339
+ struct led_classdev_flash **dr;
340
+ int ret;
341
+
342
+ dr = devres_alloc(devm_led_classdev_flash_release, sizeof(*dr),
343
+ GFP_KERNEL);
344
+ if (!dr)
345
+ return -ENOMEM;
346
+
347
+ ret = led_classdev_flash_register_ext(parent, fled_cdev, init_data);
348
+ if (ret) {
349
+ devres_free(dr);
350
+ return ret;
351
+ }
352
+
353
+ *dr = fled_cdev;
354
+ devres_add(parent, dr);
355
+
356
+ return 0;
357
+}
358
+EXPORT_SYMBOL_GPL(devm_led_classdev_flash_register_ext);
359
+
360
+static int devm_led_classdev_flash_match(struct device *dev,
361
+ void *res, void *data)
362
+{
363
+ struct led_classdev_flash **p = res;
364
+
365
+ if (WARN_ON(!p || !*p))
366
+ return 0;
367
+
368
+ return *p == data;
369
+}
370
+
371
+void devm_led_classdev_flash_unregister(struct device *dev,
372
+ struct led_classdev_flash *fled_cdev)
373
+{
374
+ WARN_ON(devres_release(dev,
375
+ devm_led_classdev_flash_release,
376
+ devm_led_classdev_flash_match, fled_cdev));
377
+}
378
+EXPORT_SYMBOL_GPL(devm_led_classdev_flash_unregister);
379
+
332380 static void led_clamp_align(struct led_flash_setting *s)
333381 {
334382 u32 v, offset;