leds-an30259a.c (4f2c0a4acffbec01079c28f839422e64ddeff004) leds-an30259a.c (5ff422a77d1a4e7ec7de063bfd3dabe3b1a70510)
1// SPDX-License-Identifier: GPL-2.0+
2//
3// Driver for Panasonic AN30259A 3-channel LED driver
4//
5// Copyright (c) 2018 Simon Shields <simon@lineageos.org>
6//
7// Datasheet:
8// https://www.alliedelec.com/m/d/a9d2b3ee87c2d1a535a41dd747b1c247.pdf

--- 41 unchanged lines hidden (view full) ---

50
51#define AN30259A_REG_MAX 0x14
52
53#define AN30259A_BLINK_MAX_TIME 7500 /* ms */
54#define AN30259A_SLOPE_RESOLUTION 500 /* ms */
55
56#define AN30259A_NAME "an30259a"
57
1// SPDX-License-Identifier: GPL-2.0+
2//
3// Driver for Panasonic AN30259A 3-channel LED driver
4//
5// Copyright (c) 2018 Simon Shields <simon@lineageos.org>
6//
7// Datasheet:
8// https://www.alliedelec.com/m/d/a9d2b3ee87c2d1a535a41dd747b1c247.pdf

--- 41 unchanged lines hidden (view full) ---

50
51#define AN30259A_REG_MAX 0x14
52
53#define AN30259A_BLINK_MAX_TIME 7500 /* ms */
54#define AN30259A_SLOPE_RESOLUTION 500 /* ms */
55
56#define AN30259A_NAME "an30259a"
57
58#define STATE_OFF 0
59#define STATE_KEEP 1
60#define STATE_ON 2
61
62struct an30259a;
63
64struct an30259a_led {
65 struct an30259a *chip;
66 struct fwnode_handle *fwnode;
67 struct led_classdev cdev;
68 u32 num;
58struct an30259a;
59
60struct an30259a_led {
61 struct an30259a *chip;
62 struct fwnode_handle *fwnode;
63 struct led_classdev cdev;
64 u32 num;
69 u32 default_state;
65 enum led_default_state default_state;
70 bool sloping;
71};
72
73struct an30259a {
74 struct mutex mutex; /* held when writing to registers */
75 struct i2c_client *client;
76 struct an30259a_led leds[AN30259A_MAX_LEDS];
77 struct regmap *regmap;

--- 122 unchanged lines hidden (view full) ---

200}
201
202static int an30259a_dt_init(struct i2c_client *client,
203 struct an30259a *chip)
204{
205 struct device_node *np = dev_of_node(&client->dev), *child;
206 int count, ret;
207 int i = 0;
66 bool sloping;
67};
68
69struct an30259a {
70 struct mutex mutex; /* held when writing to registers */
71 struct i2c_client *client;
72 struct an30259a_led leds[AN30259A_MAX_LEDS];
73 struct regmap *regmap;

--- 122 unchanged lines hidden (view full) ---

196}
197
198static int an30259a_dt_init(struct i2c_client *client,
199 struct an30259a *chip)
200{
201 struct device_node *np = dev_of_node(&client->dev), *child;
202 int count, ret;
203 int i = 0;
208 const char *str;
209 struct an30259a_led *led;
210
211 count = of_get_available_child_count(np);
212 if (!count || count > AN30259A_MAX_LEDS)
213 return -EINVAL;
214
215 for_each_available_child_of_node(np, child) {
216 u32 source;

--- 6 unchanged lines hidden (view full) ---

223 continue;
224 }
225
226 led = &chip->leds[i];
227
228 led->num = source;
229 led->chip = chip;
230 led->fwnode = of_fwnode_handle(child);
204 struct an30259a_led *led;
205
206 count = of_get_available_child_count(np);
207 if (!count || count > AN30259A_MAX_LEDS)
208 return -EINVAL;
209
210 for_each_available_child_of_node(np, child) {
211 u32 source;

--- 6 unchanged lines hidden (view full) ---

218 continue;
219 }
220
221 led = &chip->leds[i];
222
223 led->num = source;
224 led->chip = chip;
225 led->fwnode = of_fwnode_handle(child);
226 led->default_state = led_init_default_state_get(led->fwnode);
231
227
232 if (!of_property_read_string(child, "default-state", &str)) {
233 if (!strcmp(str, "on"))
234 led->default_state = STATE_ON;
235 else if (!strcmp(str, "keep"))
236 led->default_state = STATE_KEEP;
237 else
238 led->default_state = STATE_OFF;
239 }
240
241 i++;
242 }
243
244 if (!count)
245 return -EINVAL;
246
247 chip->num_leds = i;
248

--- 7 unchanged lines hidden (view full) ---

256};
257
258static void an30259a_init_default_state(struct an30259a_led *led)
259{
260 struct an30259a *chip = led->chip;
261 int led_on, err;
262
263 switch (led->default_state) {
228 i++;
229 }
230
231 if (!count)
232 return -EINVAL;
233
234 chip->num_leds = i;
235

--- 7 unchanged lines hidden (view full) ---

243};
244
245static void an30259a_init_default_state(struct an30259a_led *led)
246{
247 struct an30259a *chip = led->chip;
248 int led_on, err;
249
250 switch (led->default_state) {
264 case STATE_ON:
251 case LEDS_DEFSTATE_ON:
265 led->cdev.brightness = LED_FULL;
266 break;
252 led->cdev.brightness = LED_FULL;
253 break;
267 case STATE_KEEP:
254 case LEDS_DEFSTATE_KEEP:
268 err = regmap_read(chip->regmap, AN30259A_REG_LED_ON, &led_on);
269 if (err)
270 break;
271
272 if (!(led_on & AN30259A_LED_EN(led->num))) {
273 led->cdev.brightness = LED_OFF;
274 break;
275 }

--- 96 unchanged lines hidden ---
255 err = regmap_read(chip->regmap, AN30259A_REG_LED_ON, &led_on);
256 if (err)
257 break;
258
259 if (!(led_on & AN30259A_LED_EN(led->num))) {
260 led->cdev.brightness = LED_OFF;
261 break;
262 }

--- 96 unchanged lines hidden ---