Lines Matching full:led
11 * LED driver for the PCA9633 I2C LED driver (7-bit slave address 0x62)
12 * LED driver for the PCA9634/5 I2C LED driver (7-bit slave address set by hw.)
18 * in identical fashion. The delay_on/delay_off values of the last LED
30 #include <linux/led-class-multicolor.h>
37 /* LED select registers determine the source that drives LED outputs */
38 #define PCA963X_LED_OFF 0x0 /* LED driver off */
39 #define PCA963X_LED_ON 0x1 /* LED driver on */
122 static int pca963x_brightness(struct pca963x_led *led, unsigned int led_num, in pca963x_brightness() argument
125 struct i2c_client *client = led->chip->client; in pca963x_brightness()
126 struct pca963x_chipdef *chipdef = led->chip->chipdef; in pca963x_brightness()
138 if (led->blinking) { in pca963x_brightness()
152 led->blinking = false; in pca963x_brightness()
162 if (led->blinking) in pca963x_brightness()
174 static void pca963x_blink(struct pca963x_led *led) in pca963x_blink() argument
176 struct i2c_client *client = led->chip->client; in pca963x_blink()
177 struct pca963x_chipdef *chipdef = led->chip->chipdef; in pca963x_blink()
181 ledout_addr = chipdef->ledout_base + (led->led_num / 4); in pca963x_blink()
182 shift = 2 * (led->led_num % 4); in pca963x_blink()
186 i2c_smbus_write_byte_data(client, chipdef->grppwm, led->gdc); in pca963x_blink()
188 i2c_smbus_write_byte_data(client, chipdef->grpfreq, led->gfrq); in pca963x_blink()
194 mutex_lock(&led->chip->mutex); in pca963x_blink()
202 mutex_unlock(&led->chip->mutex); in pca963x_blink()
203 led->blinking = true; in pca963x_blink()
206 static void pca963x_track_power_state(struct pca963x_led *led, unsigned int led_num, in pca963x_track_power_state() argument
209 unsigned long *leds_on = &led->chip->leds_on; in pca963x_track_power_state()
217 static int pca963x_sync_power_state(struct pca963x_led *led, unsigned long cached_leds) in pca963x_sync_power_state() argument
219 struct i2c_client *client = led->chip->client; in pca963x_sync_power_state()
221 if (!led->chip->leds_on != !cached_leds) in pca963x_sync_power_state()
223 led->chip->leds_on ? 0 : BIT(4)); in pca963x_sync_power_state()
231 struct pca963x_led *led; in pca963x_led_set() local
235 led = container_of(led_cdev, struct pca963x_led, led_cdev); in pca963x_led_set()
237 mutex_lock(&led->chip->mutex); in pca963x_led_set()
239 cached_leds = led->chip->leds_on; in pca963x_led_set()
240 ret = pca963x_brightness(led, led->led_num, value); in pca963x_led_set()
244 pca963x_track_power_state(led, led->led_num, value); in pca963x_led_set()
245 ret = pca963x_sync_power_state(led, cached_leds); in pca963x_led_set()
248 mutex_unlock(&led->chip->mutex); in pca963x_led_set()
256 struct pca963x_led *led = container_of(mc_cdev, struct pca963x_led, mc_cdev); in pca963x_led_mc_set() local
262 guard(mutex)(&led->chip->mutex); in pca963x_led_mc_set()
264 cached_leds = led->chip->leds_on; in pca963x_led_mc_set()
268 ret = pca963x_brightness(led, channel, in pca963x_led_mc_set()
273 pca963x_track_power_state(led, channel, in pca963x_led_mc_set()
281 sync_ret = pca963x_sync_power_state(led, cached_leds); in pca963x_led_mc_set()
286 static unsigned int pca963x_period_scale(struct pca963x_led *led, in pca963x_period_scale() argument
289 unsigned int scaling = led->chip->chipdef->scaling; in pca963x_period_scale()
298 struct pca963x_led *led; in pca963x_blink_set() local
301 led = container_of(led_cdev, struct pca963x_led, led_cdev); in pca963x_blink_set()
312 period = pca963x_period_scale(led, time_on + time_off); in pca963x_blink_set()
319 period = pca963x_period_scale(led, 1000); in pca963x_blink_set()
327 gdc = (pca963x_period_scale(led, time_on) * 256) / period; in pca963x_blink_set()
336 led->gdc = gdc; in pca963x_blink_set()
337 led->gfrq = gfrq; in pca963x_blink_set()
339 pca963x_blink(led); in pca963x_blink_set()
340 led->led_cdev.brightness = LED_FULL; in pca963x_blink_set()
349 static int pca963x_parse_mc_subleds(struct device *dev, struct pca963x_led *led, in pca963x_parse_mc_subleds() argument
359 if (num_colors >= ARRAY_SIZE(led->subleds)) in pca963x_parse_mc_subleds()
364 return dev_err_probe(dev, ret, "Missing 'reg' for sub-LED %pfw\n", sub); in pca963x_parse_mc_subleds()
366 return dev_err_probe(dev, -EINVAL, "Invalid 'reg' for sub-LED %pfw\n", sub); in pca963x_parse_mc_subleds()
370 return dev_err_probe(dev, ret, "Missing 'color' for sub-LED %pfw\n", sub); in pca963x_parse_mc_subleds()
372 led->subleds[num_colors].channel = subreg; in pca963x_parse_mc_subleds()
373 led->subleds[num_colors].color_index = color; in pca963x_parse_mc_subleds()
374 led->subleds[num_colors].intensity = LED_FULL; in pca963x_parse_mc_subleds()
378 led->mc_cdev.subled_info = led->subleds; in pca963x_parse_mc_subleds()
379 led->mc_cdev.num_colors = num_colors; in pca963x_parse_mc_subleds()
380 led->mc_cdev.led_cdev.max_brightness = LED_FULL; in pca963x_parse_mc_subleds()
381 led->mc_cdev.led_cdev.brightness_set_blocking = pca963x_led_mc_set; in pca963x_parse_mc_subleds()
386 static int pca963x_register_led(struct device *dev, struct pca963x_led *led, in pca963x_register_led() argument
391 struct i2c_client *client = led->chip->client; in pca963x_register_led()
396 led->led_num = reg; in pca963x_register_led()
398 /* A node with sub-children groups several channels into a multicolor LED. */ in pca963x_register_led()
399 led->is_mc = fwnode_get_child_node_count(fwnode) > 0; in pca963x_register_led()
401 if (led->is_mc) { in pca963x_register_led()
402 ret = pca963x_parse_mc_subleds(dev, led, fwnode, chipdef); in pca963x_register_led()
406 led->led_cdev.brightness_set_blocking = pca963x_led_set; in pca963x_register_led()
408 led->led_cdev.blink_set = pca963x_blink_set; in pca963x_register_led()
412 /* Keep the legacy device name to preserve existing sysfs LED names. */ in pca963x_register_led()
417 if (led->is_mc) in pca963x_register_led()
418 return devm_led_classdev_multicolor_register_ext(dev, &led->mc_cdev, in pca963x_register_led()
421 return devm_led_classdev_register_ext(dev, &led->led_cdev, &init_data); in pca963x_register_led()
428 struct pca963x_led *led = chip->leds; in pca963x_register_leds() local
470 led->chip = chip; in pca963x_register_leds()
471 led->blinking = false; in pca963x_register_leds()
473 ret = pca963x_register_led(dev, led, reg, child, chipdef, hw_blink); in pca963x_register_leds()
475 return dev_err_probe(dev, ret, "Failed to register LED for node %pfw\n", in pca963x_register_leds()
478 ++led; in pca963x_register_leds()
550 /* Disable LED all-call address, and power down initially */ in pca963x_probe()
569 MODULE_DESCRIPTION("PCA963X LED driver");