1 // SPDX-License-Identifier: GPL-2.0
2 // TI LM36274 LED chip family driver
3 // Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
5 #include <linux/bitops.h>
6 #include <linux/device.h>
8 #include <linux/leds.h>
9 #include <linux/leds-ti-lmu-common.h>
10 #include <linux/module.h>
11 #include <linux/of_device.h>
12 #include <linux/platform_device.h>
14 #include <linux/mfd/ti-lmu.h>
15 #include <linux/mfd/ti-lmu-register.h>
17 #include <uapi/linux/uleds.h>
19 #define LM36274_MAX_STRINGS 4
20 #define LM36274_BL_EN BIT(4)
24 * @pdev: platform device
25 * @led_dev: led class device
26 * @lmu_data: Register and setting values for common code
27 * @regmap: Devices register map
28 * @dev: Pointer to the devices device struct
29 * @led_sources - The LED strings supported in this array
30 * @num_leds - Number of LED strings are supported in this array
33 struct platform_device
*pdev
;
34 struct led_classdev led_dev
;
35 struct ti_lmu_bank lmu_data
;
36 struct regmap
*regmap
;
39 u32 led_sources
[LM36274_MAX_STRINGS
];
43 static int lm36274_brightness_set(struct led_classdev
*led_cdev
,
44 enum led_brightness brt_val
)
46 struct lm36274
*led
= container_of(led_cdev
, struct lm36274
, led_dev
);
48 return ti_lmu_common_set_brightness(&led
->lmu_data
, brt_val
);
51 static int lm36274_init(struct lm36274
*lm36274_data
)
56 for (i
= 0; i
< lm36274_data
->num_leds
; i
++)
57 enable_val
|= (1 << lm36274_data
->led_sources
[i
]);
60 dev_err(lm36274_data
->dev
, "No LEDs were enabled\n");
64 enable_val
|= LM36274_BL_EN
;
66 return regmap_write(lm36274_data
->regmap
, LM36274_REG_BL_EN
,
70 static int lm36274_parse_dt(struct lm36274
*lm36274_data
)
72 struct fwnode_handle
*child
= NULL
;
73 char label
[LED_MAX_NAME_SIZE
];
74 struct device
*dev
= &lm36274_data
->pdev
->dev
;
79 /* There should only be 1 node */
80 child_cnt
= device_get_child_node_count(dev
);
84 device_for_each_child_node(dev
, child
) {
85 ret
= fwnode_property_read_string(child
, "label", &name
);
87 snprintf(label
, sizeof(label
),
88 "%s::", lm36274_data
->pdev
->name
);
90 snprintf(label
, sizeof(label
),
91 "%s:%s", lm36274_data
->pdev
->name
, name
);
93 lm36274_data
->num_leds
= fwnode_property_count_u32(child
, "led-sources");
94 if (lm36274_data
->num_leds
<= 0)
97 ret
= fwnode_property_read_u32_array(child
, "led-sources",
98 lm36274_data
->led_sources
,
99 lm36274_data
->num_leds
);
101 dev_err(dev
, "led-sources property missing\n");
105 fwnode_property_read_string(child
, "linux,default-trigger",
106 &lm36274_data
->led_dev
.default_trigger
);
110 lm36274_data
->lmu_data
.regmap
= lm36274_data
->regmap
;
111 lm36274_data
->lmu_data
.max_brightness
= MAX_BRIGHTNESS_11BIT
;
112 lm36274_data
->lmu_data
.msb_brightness_reg
= LM36274_REG_BRT_MSB
;
113 lm36274_data
->lmu_data
.lsb_brightness_reg
= LM36274_REG_BRT_LSB
;
115 lm36274_data
->led_dev
.name
= label
;
116 lm36274_data
->led_dev
.max_brightness
= MAX_BRIGHTNESS_11BIT
;
117 lm36274_data
->led_dev
.brightness_set_blocking
= lm36274_brightness_set
;
122 static int lm36274_probe(struct platform_device
*pdev
)
124 struct ti_lmu
*lmu
= dev_get_drvdata(pdev
->dev
.parent
);
125 struct lm36274
*lm36274_data
;
128 lm36274_data
= devm_kzalloc(&pdev
->dev
, sizeof(*lm36274_data
),
133 lm36274_data
->pdev
= pdev
;
134 lm36274_data
->dev
= lmu
->dev
;
135 lm36274_data
->regmap
= lmu
->regmap
;
136 dev_set_drvdata(&pdev
->dev
, lm36274_data
);
138 ret
= lm36274_parse_dt(lm36274_data
);
140 dev_err(lm36274_data
->dev
, "Failed to parse DT node\n");
144 ret
= lm36274_init(lm36274_data
);
146 dev_err(lm36274_data
->dev
, "Failed to init the device\n");
150 return devm_led_classdev_register(lm36274_data
->dev
,
151 &lm36274_data
->led_dev
);
154 static const struct of_device_id of_lm36274_leds_match
[] = {
155 { .compatible
= "ti,lm36274-backlight", },
158 MODULE_DEVICE_TABLE(of
, of_lm36274_leds_match
);
160 static struct platform_driver lm36274_driver
= {
161 .probe
= lm36274_probe
,
163 .name
= "lm36274-leds",
166 module_platform_driver(lm36274_driver
)
168 MODULE_DESCRIPTION("Texas Instruments LM36274 LED driver");
169 MODULE_AUTHOR("Dan Murphy <dmurphy@ti.com>");
170 MODULE_LICENSE("GPL v2");