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 --- |