Lines Matching +full:led +full:- +full:pattern

1 // SPDX-License-Identifier: GPL-2.0-only
3 * LED driver for STMicroelectronics LED1202 chip
5 * Copyright (C) 2024 Remote-Tech Ltd. UK
23 /* PATS: Pattern sequence feature enable */
25 /* PATSR: Pattern sequence runs (self-clear when sequence is finished) */
62 struct device *dev = &chip->client->dev; in st1202_read_reg()
65 ret = i2c_smbus_read_byte_data(chip->client, reg); in st1202_read_reg()
77 struct device *dev = &chip->client->dev; in st1202_write_reg()
80 ret = i2c_smbus_write_byte_data(chip->client, reg, val); in st1202_write_reg()
89 return value / ST1202_MILLIS_PATTERN_DUR_MIN - 1; in st1202_prescalar_to_miliseconds()
93 int pattern, unsigned int value) in st1202_pwm_pattern_write() argument
103 * where x is the channel number (led number) in hexadecimal (x = 00h .. 0Bh) in st1202_pwm_pattern_write()
104 * and y is the pattern number in hexadecimal (y = 00h .. 07h) in st1202_pwm_pattern_write()
106 ret = st1202_write_reg(chip, (ST1202_PATTERN_PWM + (led_num * 2) + 0x18 * pattern), in st1202_pwm_pattern_write()
114 * and y is the pattern number in hexadecimal (y = 00h .. 07h) in st1202_pwm_pattern_write()
116 ret = st1202_write_reg(chip, (ST1202_PATTERN_PWM + 0x1 + (led_num * 2) + 0x18 * pattern), in st1202_pwm_pattern_write()
124 static int st1202_duration_pattern_write(struct st1202_chip *chip, int pattern, in st1202_duration_pattern_write() argument
127 return st1202_write_reg(chip, (ST1202_PATTERN_DUR + pattern), in st1202_duration_pattern_write()
134 struct st1202_led *led = cdev_to_st1202_led(led_cdev); in st1202_brightness_set() local
135 struct st1202_chip *chip = led->chip; in st1202_brightness_set()
137 guard(mutex)(&chip->lock); in st1202_brightness_set()
139 st1202_write_reg(chip, ST1202_ILED_REG0 + led->led_num, value); in st1202_brightness_set()
144 struct st1202_led *led = cdev_to_st1202_led(led_cdev); in st1202_brightness_get() local
145 struct st1202_chip *chip = led->chip; in st1202_brightness_get()
148 guard(mutex)(&chip->lock); in st1202_brightness_get()
150 st1202_read_reg(chip, ST1202_ILED_REG0 + led->led_num, &value); in st1202_brightness_get()
160 guard(mutex)(&chip->lock); in st1202_channel_set()
191 struct st1202_led *led = cdev_to_st1202_led(ldev); in st1202_led_set() local
192 struct st1202_chip *chip = led->chip; in st1202_led_set()
194 return st1202_channel_set(chip, led->led_num, value == LED_OFF ? false : true); in st1202_led_set()
199 struct st1202_led *led = cdev_to_st1202_led(ldev); in st1202_led_pattern_clear() local
200 struct st1202_chip *chip = led->chip; in st1202_led_pattern_clear()
203 guard(mutex)(&chip->lock); in st1202_led_pattern_clear()
206 ret = st1202_pwm_pattern_write(chip, led->led_num, patt, LED_OFF); in st1202_led_pattern_clear()
219 struct led_pattern *pattern, in st1202_led_pattern_set() argument
222 struct st1202_led *led = cdev_to_st1202_led(ldev); in st1202_led_pattern_set() local
223 struct st1202_chip *chip = led->chip; in st1202_led_pattern_set()
227 return -EINVAL; in st1202_led_pattern_set()
229 guard(mutex)(&chip->lock); in st1202_led_pattern_set()
232 if (pattern[patt].delta_t < ST1202_MILLIS_PATTERN_DUR_MIN || in st1202_led_pattern_set()
233 pattern[patt].delta_t > ST1202_MILLIS_PATTERN_DUR_MAX) in st1202_led_pattern_set()
234 return -EINVAL; in st1202_led_pattern_set()
236 ret = st1202_pwm_pattern_write(chip, led->led_num, patt, pattern[patt].brightness); in st1202_led_pattern_set()
240 ret = st1202_duration_pattern_write(chip, patt, pattern[patt].delta_t); in st1202_led_pattern_set()
259 struct device *dev = &chip->client->dev; in st1202_dt_init()
260 struct st1202_led *led; in st1202_dt_init() local
268 led = &chip->leds[reg]; in st1202_dt_init()
269 led->is_active = true; in st1202_dt_init()
270 led->fwnode = of_fwnode_handle(child); in st1202_dt_init()
272 led->led_cdev.max_brightness = U8_MAX; in st1202_dt_init()
273 led->led_cdev.brightness_set_blocking = st1202_led_set; in st1202_dt_init()
274 led->led_cdev.pattern_set = st1202_led_pattern_set; in st1202_dt_init()
275 led->led_cdev.pattern_clear = st1202_led_pattern_clear; in st1202_dt_init()
276 led->led_cdev.default_trigger = "pattern"; in st1202_dt_init()
277 led->led_cdev.brightness_set = st1202_brightness_set; in st1202_dt_init()
278 led->led_cdev.brightness_get = st1202_brightness_get; in st1202_dt_init()
288 guard(mutex)(&chip->lock); in st1202_setup()
295 * from the internal non-volatile memory and performs an auto-calibration procedure in st1202_setup()
305 /* Enable phase-shift delay feature */ in st1202_setup()
338 struct st1202_led *led; in st1202_probe() local
341 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) in st1202_probe()
342 return dev_err_probe(&client->dev, -EIO, "SMBUS Byte Data not Supported\n"); in st1202_probe()
344 chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); in st1202_probe()
346 return -ENOMEM; in st1202_probe()
348 ret = devm_mutex_init(&client->dev, &chip->lock); in st1202_probe()
351 chip->client = client; in st1202_probe()
363 led = &chip->leds[i]; in st1202_probe()
364 led->chip = chip; in st1202_probe()
365 led->led_num = i; in st1202_probe()
367 if (!led->is_active) in st1202_probe()
370 ret = st1202_channel_set(led->chip, led->led_num, true); in st1202_probe()
372 return dev_err_probe(&client->dev, ret, in st1202_probe()
373 "Failed to activate LED channel\n"); in st1202_probe()
375 ret = st1202_led_pattern_clear(&led->led_cdev); in st1202_probe()
377 return dev_err_probe(&client->dev, ret, in st1202_probe()
378 "Failed to clear LED pattern\n"); in st1202_probe()
380 init_data.fwnode = led->fwnode; in st1202_probe()
384 ret = devm_led_classdev_register_ext(&client->dev, &led->led_cdev, &init_data); in st1202_probe()
386 return dev_err_probe(&client->dev, ret, in st1202_probe()
387 "Failed to register LED class device\n"); in st1202_probe()
394 { "st1202-i2c" },
407 .name = "leds-st1202",
416 MODULE_DESCRIPTION("STMicroelectronics LED1202 : 12-channel constant current LED driver");