Lines Matching +full:led +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-only
3 * TI LP8501 9 channel LED Driver
18 #include <linux/platform_data/leds-lp55xx.h>
21 #include "leds-lp55xx-common.h"
71 #define LP8501_ENG1_IS_LOADING(mode) \ argument
72 ((mode & LP8501_MODE_ENG1_M) == LP8501_LOAD_ENG1)
73 #define LP8501_ENG2_IS_LOADING(mode) \ argument
74 ((mode & LP8501_MODE_ENG2_M) == LP8501_LOAD_ENG2)
75 #define LP8501_ENG3_IS_LOADING(mode) \ argument
76 ((mode & LP8501_MODE_ENG3_M) == LP8501_LOAD_ENG3)
83 static void lp8501_set_led_current(struct lp55xx_led *led, u8 led_current) in lp8501_set_led_current() argument
85 led->led_current = led_current; in lp8501_set_led_current()
86 lp55xx_write(led->chip, LP8501_REG_LED_CURRENT_BASE + led->chan_nr, in lp8501_set_led_current()
99 /* Chip startup time is 500 us, 1 - 2 ms gives some margin */ in lp8501_post_init_device()
102 if (chip->pdata->clock_mode != LP55XX_CLOCK_EXT) in lp8501_post_init_device()
105 val |= (chip->pdata->charge_pump_mode << LP8501_CP_MODE_SHIFT) & LP8501_CP_MODE_MASK; in lp8501_post_init_device()
113 LP8501_PWR_CONFIG_M, chip->pdata->pwr_sel); in lp8501_post_init_device()
118 enum lp55xx_engine_index idx = chip->engine_idx; in lp8501_load_engine()
161 u8 mode; in lp8501_run_engine() local
173 * operation mode and enable register should updated at the same time in lp8501_run_engine()
176 ret = lp55xx_read(chip, LP8501_REG_OP_MODE, &mode); in lp8501_run_engine()
184 /* change operation mode to RUN only when each engine is loading */ in lp8501_run_engine()
185 if (LP8501_ENG1_IS_LOADING(mode)) { in lp8501_run_engine()
186 mode = (mode & ~LP8501_MODE_ENG1_M) | LP8501_RUN_ENG1; in lp8501_run_engine()
190 if (LP8501_ENG2_IS_LOADING(mode)) { in lp8501_run_engine()
191 mode = (mode & ~LP8501_MODE_ENG2_M) | LP8501_RUN_ENG2; in lp8501_run_engine()
195 if (LP8501_ENG3_IS_LOADING(mode)) { in lp8501_run_engine()
196 mode = (mode & ~LP8501_MODE_ENG3_M) | LP8501_RUN_ENG3; in lp8501_run_engine()
200 lp55xx_write(chip, LP8501_REG_OP_MODE, mode); in lp8501_run_engine()
223 while ((offset < size - 1) && (i < LP8501_PROGRAM_LENGTH)) { in lp8501_update_program_memory()
249 dev_err(&chip->cl->dev, "wrong pattern format\n"); in lp8501_update_program_memory()
250 return -EINVAL; in lp8501_update_program_memory()
255 const struct firmware *fw = chip->fw; in lp8501_firmware_loaded()
257 if (fw->size > LP8501_PROGRAM_LENGTH) { in lp8501_firmware_loaded()
258 dev_err(&chip->cl->dev, "firmware data size overflow: %zu\n", in lp8501_firmware_loaded()
259 fw->size); in lp8501_firmware_loaded()
265 * 1) set engine mode to "LOAD" in lp8501_firmware_loaded()
270 lp8501_update_program_memory(chip, fw->data, fw->size); in lp8501_firmware_loaded()
273 static int lp8501_led_brightness(struct lp55xx_led *led) in lp8501_led_brightness() argument
275 struct lp55xx_chip *chip = led->chip; in lp8501_led_brightness()
278 mutex_lock(&chip->lock); in lp8501_led_brightness()
279 ret = lp55xx_write(chip, LP8501_REG_LED_PWM_BASE + led->chan_nr, in lp8501_led_brightness()
280 led->brightness); in lp8501_led_brightness()
281 mutex_unlock(&chip->lock); in lp8501_led_brightness()
309 struct lp55xx_led *led; in lp8501_probe() local
310 struct lp55xx_platform_data *pdata = dev_get_platdata(&client->dev); in lp8501_probe()
311 struct device_node *np = dev_of_node(&client->dev); in lp8501_probe()
313 chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); in lp8501_probe()
315 return -ENOMEM; in lp8501_probe()
317 chip->cfg = &lp8501_cfg; in lp8501_probe()
321 pdata = lp55xx_of_populate_pdata(&client->dev, np, in lp8501_probe()
326 dev_err(&client->dev, "no platform data\n"); in lp8501_probe()
327 return -EINVAL; in lp8501_probe()
331 led = devm_kcalloc(&client->dev, in lp8501_probe()
332 pdata->num_channels, sizeof(*led), GFP_KERNEL); in lp8501_probe()
333 if (!led) in lp8501_probe()
334 return -ENOMEM; in lp8501_probe()
336 chip->cl = client; in lp8501_probe()
337 chip->pdata = pdata; in lp8501_probe()
339 mutex_init(&chip->lock); in lp8501_probe()
341 i2c_set_clientdata(client, led); in lp8501_probe()
347 dev_info(&client->dev, "%s Programmable led chip found\n", id->name); in lp8501_probe()
349 ret = lp55xx_register_leds(led, chip); in lp8501_probe()
355 dev_err(&client->dev, "registering sysfs failed\n"); in lp8501_probe()
369 struct lp55xx_led *led = i2c_get_clientdata(client); in lp8501_remove() local
370 struct lp55xx_chip *chip = led->chip; in lp8501_remove()
402 MODULE_DESCRIPTION("Texas Instruments LP8501 LED driver");