1 // SPDX-License-Identifier: GPL-2.0
3 * Device driver for leds in MAX5970 and MAX5978 IC
5 * Copyright (c) 2022 9elements GmbH
7 * Author: Patrick Rudolph <patrick.rudolph@9elements.com>
10 #include <linux/bits.h>
11 #include <linux/container_of.h>
12 #include <linux/device.h>
13 #include <linux/leds.h>
14 #include <linux/mfd/max5970.h>
15 #include <linux/mod_devicetable.h>
16 #include <linux/module.h>
17 #include <linux/platform_device.h>
18 #include <linux/property.h>
19 #include <linux/regmap.h>
21 #define ldev_to_maxled(c) container_of(c, struct max5970_led, cdev)
25 struct regmap
*regmap
;
26 struct led_classdev cdev
;
30 static int max5970_led_set_brightness(struct led_classdev
*cdev
,
31 enum led_brightness brightness
)
33 struct max5970_led
*ddata
= ldev_to_maxled(cdev
);
36 /* Set/clear corresponding bit for given led index */
37 val
= !brightness
? BIT(ddata
->index
) : 0;
39 ret
= regmap_update_bits(ddata
->regmap
, MAX5970_REG_LED_FLASH
, BIT(ddata
->index
), val
);
41 dev_err(cdev
->dev
, "failed to set brightness %d", ret
);
46 static int max5970_led_probe(struct platform_device
*pdev
)
48 struct fwnode_handle
*child
;
49 struct device
*dev
= &pdev
->dev
;
50 struct regmap
*regmap
;
51 struct max5970_led
*ddata
;
54 regmap
= dev_get_regmap(dev
->parent
, NULL
);
58 struct fwnode_handle
*led_node
__free(fwnode_handle
) =
59 device_get_named_child_node(dev
->parent
, "leds");
63 fwnode_for_each_available_child_node(led_node
, child
) {
66 if (fwnode_property_read_u32(child
, "reg", ®
))
69 if (reg
>= MAX5970_NUM_LEDS
) {
70 dev_err_probe(dev
, -EINVAL
, "invalid LED (%u >= %d)\n", reg
, MAX5970_NUM_LEDS
);
74 ddata
= devm_kzalloc(dev
, sizeof(*ddata
), GFP_KERNEL
);
76 fwnode_handle_put(child
);
81 ddata
->regmap
= regmap
;
84 if (fwnode_property_read_string(child
, "label", &ddata
->cdev
.name
))
85 ddata
->cdev
.name
= fwnode_get_name(child
);
87 ddata
->cdev
.max_brightness
= 1;
88 ddata
->cdev
.brightness_set_blocking
= max5970_led_set_brightness
;
89 ddata
->cdev
.default_trigger
= "none";
91 ret
= devm_led_classdev_register(dev
, &ddata
->cdev
);
93 fwnode_handle_put(child
);
94 return dev_err_probe(dev
, ret
, "Failed to initialize LED %u\n", reg
);
101 static struct platform_driver max5970_led_driver
= {
103 .name
= "max5970-led",
105 .probe
= max5970_led_probe
,
107 module_platform_driver(max5970_led_driver
);
109 MODULE_AUTHOR("Patrick Rudolph <patrick.rudolph@9elements.com>");
110 MODULE_AUTHOR("Naresh Solanki <Naresh.Solanki@9elements.com>");
111 MODULE_DESCRIPTION("MAX5970_hot-swap controller LED driver");
112 MODULE_LICENSE("GPL");