Lines Matching +full:led +full:- +full:mode

1 // SPDX-License-Identifier: GPL-2.0-only
3 * LP5521 LED chip driver.
18 #include <linux/platform_data/leds-lp55xx.h>
22 #include "leds-lp55xx-common.h"
44 /* Base register to set LED current */
60 #define LP5521_PWRSAVE_EN 0x20 /* 1 = Power save mode */
61 #define LP5521_CP_MODE_MASK 0x18 /* Charge pump mode */
77 #define LP5521_MODE_R_M 0x30 /* Operation Mode Register */
84 #define LP5521_R_IS_LOADING(mode) \ argument
85 ((mode & LP5521_MODE_R_M) == LP5521_LOAD_R)
86 #define LP5521_G_IS_LOADING(mode) \ argument
87 ((mode & LP5521_MODE_G_M) == LP5521_LOAD_G)
88 #define LP5521_B_IS_LOADING(mode) \ argument
89 ((mode & LP5521_MODE_B_M) == LP5521_LOAD_B)
101 /* operation mode change needs to be longer than 153 us */ in lp5521_wait_opmode_done()
111 static void lp5521_set_led_current(struct lp55xx_led *led, u8 led_current) in lp5521_set_led_current() argument
113 led->led_current = led_current; in lp5521_set_led_current()
114 lp55xx_write(led->chip, LP5521_REG_LED_CURRENT_BASE + led->chan_nr, in lp5521_set_led_current()
120 enum lp55xx_engine_index idx = chip->engine_idx; in lp5521_load_engine()
146 enum lp55xx_engine_index idx = chip->engine_idx; in lp5521_stop_engine()
161 u8 mode; in lp5521_run_engine() local
174 * operation mode and enable register should updated at the same time in lp5521_run_engine()
177 ret = lp55xx_read(chip, LP5521_REG_OP_MODE, &mode); in lp5521_run_engine()
185 /* change operation mode to RUN only when each engine is loading */ in lp5521_run_engine()
186 if (LP5521_R_IS_LOADING(mode)) { in lp5521_run_engine()
187 mode = (mode & ~LP5521_MODE_R_M) | LP5521_RUN_R; in lp5521_run_engine()
191 if (LP5521_G_IS_LOADING(mode)) { in lp5521_run_engine()
192 mode = (mode & ~LP5521_MODE_G_M) | LP5521_RUN_G; in lp5521_run_engine()
196 if (LP5521_B_IS_LOADING(mode)) { in lp5521_run_engine()
197 mode = (mode & ~LP5521_MODE_B_M) | LP5521_RUN_B; in lp5521_run_engine()
201 lp55xx_write(chip, LP5521_REG_OP_MODE, mode); in lp5521_run_engine()
211 enum lp55xx_engine_index idx = chip->engine_idx; in lp5521_update_program_memory()
225 while ((offset < size - 1) && (i < LP5521_PROGRAM_LENGTH)) { in lp5521_update_program_memory()
247 return -EINVAL; in lp5521_update_program_memory()
253 dev_err(&chip->cl->dev, "wrong pattern format\n"); in lp5521_update_program_memory()
254 return -EINVAL; in lp5521_update_program_memory()
259 const struct firmware *fw = chip->fw; in lp5521_firmware_loaded()
261 if (fw->size > LP5521_PROGRAM_LENGTH) { in lp5521_firmware_loaded()
262 dev_err(&chip->cl->dev, "firmware data size overflow: %zu\n", in lp5521_firmware_loaded()
263 fw->size); in lp5521_firmware_loaded()
269 * 1) set engine mode to "LOAD" in lp5521_firmware_loaded()
274 lp5521_update_program_memory(chip, fw->data, fw->size); in lp5521_firmware_loaded()
284 * current reg. This is dummy read is required on some platforms - in lp5521_post_init_device()
286 * LP5521_REG_ENABLE register will not have any effect - strange! in lp5521_post_init_device()
290 dev_err(&chip->cl->dev, "error in resetting chip\n"); in lp5521_post_init_device()
294 dev_err(&chip->cl->dev, in lp5521_post_init_device()
297 ret = -EINVAL; in lp5521_post_init_device()
302 /* Set all PWMs to direct control mode */ in lp5521_post_init_device()
310 val |= (chip->pdata->charge_pump_mode << LP5521_CP_MODE_SHIFT) & LP5521_CP_MODE_MASK; in lp5521_post_init_device()
316 /* Initialize all channels PWM to zero -> leds off */ in lp5521_post_init_device()
333 struct lp55xx_platform_data *pdata = chip->pdata; in lp5521_run_selftest()
341 if (pdata->clock_mode != LP55XX_CLOCK_EXT) in lp5521_run_selftest()
346 return -EIO; in lp5521_run_selftest()
351 static int lp5521_multicolor_brightness(struct lp55xx_led *led) in lp5521_multicolor_brightness() argument
353 struct lp55xx_chip *chip = led->chip; in lp5521_multicolor_brightness()
357 mutex_lock(&chip->lock); in lp5521_multicolor_brightness()
358 for (i = 0; i < led->mc_cdev.num_colors; i++) { in lp5521_multicolor_brightness()
361 led->mc_cdev.subled_info[i].channel, in lp5521_multicolor_brightness()
362 led->mc_cdev.subled_info[i].brightness); in lp5521_multicolor_brightness()
366 mutex_unlock(&chip->lock); in lp5521_multicolor_brightness()
370 static int lp5521_led_brightness(struct lp55xx_led *led) in lp5521_led_brightness() argument
372 struct lp55xx_chip *chip = led->chip; in lp5521_led_brightness()
375 mutex_lock(&chip->lock); in lp5521_led_brightness()
376 ret = lp55xx_write(chip, LP5521_REG_LED_PWM_BASE + led->chan_nr, in lp5521_led_brightness()
377 led->brightness); in lp5521_led_brightness()
378 mutex_unlock(&chip->lock); in lp5521_led_brightness()
387 struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev)); in show_engine_mode() local
388 struct lp55xx_chip *chip = led->chip; in show_engine_mode()
389 enum lp55xx_engine_mode mode = chip->engines[nr - 1].mode; in show_engine_mode() local
391 switch (mode) { in show_engine_mode()
409 struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev)); in store_engine_mode() local
410 struct lp55xx_chip *chip = led->chip; in store_engine_mode()
411 struct lp55xx_engine *engine = &chip->engines[nr - 1]; in store_engine_mode()
413 mutex_lock(&chip->lock); in store_engine_mode()
415 chip->engine_idx = nr; in store_engine_mode()
419 engine->mode = LP55XX_ENGINE_RUN; in store_engine_mode()
423 engine->mode = LP55XX_ENGINE_LOAD; in store_engine_mode()
426 engine->mode = LP55XX_ENGINE_DISABLED; in store_engine_mode()
429 mutex_unlock(&chip->lock); in store_engine_mode()
441 struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev)); in store_engine_load() local
442 struct lp55xx_chip *chip = led->chip; in store_engine_load()
445 mutex_lock(&chip->lock); in store_engine_load()
447 chip->engine_idx = nr; in store_engine_load()
451 mutex_unlock(&chip->lock); in store_engine_load()
463 struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev)); in lp5521_selftest() local
464 struct lp55xx_chip *chip = led->chip; in lp5521_selftest()
467 mutex_lock(&chip->lock); in lp5521_selftest()
469 mutex_unlock(&chip->lock); in lp5521_selftest()
523 struct lp55xx_led *led; in lp5521_probe() local
524 struct lp55xx_platform_data *pdata = dev_get_platdata(&client->dev); in lp5521_probe()
525 struct device_node *np = dev_of_node(&client->dev); in lp5521_probe()
527 chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); in lp5521_probe()
529 return -ENOMEM; in lp5521_probe()
531 chip->cfg = &lp5521_cfg; in lp5521_probe()
535 pdata = lp55xx_of_populate_pdata(&client->dev, np, in lp5521_probe()
540 dev_err(&client->dev, "no platform data\n"); in lp5521_probe()
541 return -EINVAL; in lp5521_probe()
545 led = devm_kcalloc(&client->dev, in lp5521_probe()
546 pdata->num_channels, sizeof(*led), GFP_KERNEL); in lp5521_probe()
547 if (!led) in lp5521_probe()
548 return -ENOMEM; in lp5521_probe()
550 chip->cl = client; in lp5521_probe()
551 chip->pdata = pdata; in lp5521_probe()
553 mutex_init(&chip->lock); in lp5521_probe()
555 i2c_set_clientdata(client, led); in lp5521_probe()
561 dev_info(&client->dev, "%s programmable led chip found\n", id->name); in lp5521_probe()
563 ret = lp55xx_register_leds(led, chip); in lp5521_probe()
569 dev_err(&client->dev, "registering sysfs failed\n"); in lp5521_probe()
583 struct lp55xx_led *led = i2c_get_clientdata(client); in lp5521_remove() local
584 struct lp55xx_chip *chip = led->chip; in lp5521_remove()
618 MODULE_DESCRIPTION("LP5521 LED engine");