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
*led_node
, *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 led_node
= device_get_named_child_node(dev
->parent
, "leds");
62 fwnode_for_each_available_child_node(led_node
, child
) {
65 if (fwnode_property_read_u32(child
, "reg", ®
))
68 if (reg
>= MAX5970_NUM_LEDS
) {
69 dev_err_probe(dev
, -EINVAL
, "invalid LED (%u >= %d)\n", reg
, MAX5970_NUM_LEDS
);
73 ddata
= devm_kzalloc(dev
, sizeof(*ddata
), GFP_KERNEL
);
75 fwnode_handle_put(child
);
80 ddata
->regmap
= regmap
;
83 if (fwnode_property_read_string(child
, "label", &ddata
->cdev
.name
))
84 ddata
->cdev
.name
= fwnode_get_name(child
);
86 ddata
->cdev
.max_brightness
= 1;
87 ddata
->cdev
.brightness_set_blocking
= max5970_led_set_brightness
;
88 ddata
->cdev
.default_trigger
= "none";
90 ret
= devm_led_classdev_register(dev
, &ddata
->cdev
);
92 fwnode_handle_put(child
);
93 return dev_err_probe(dev
, ret
, "Failed to initialize LED %u\n", reg
);
100 static struct platform_driver max5970_led_driver
= {
102 .name
= "max5970-led",
104 .probe
= max5970_led_probe
,
106 module_platform_driver(max5970_led_driver
);
108 MODULE_AUTHOR("Patrick Rudolph <patrick.rudolph@9elements.com>");
109 MODULE_AUTHOR("Naresh Solanki <Naresh.Solanki@9elements.com>");
110 MODULE_DESCRIPTION("MAX5970_hot-swap controller LED driver");
111 MODULE_LICENSE("GPL");