Lines Matching refs:tca
272 static void set_select(struct tca6507_chip *tca, int led, int val) in set_select() argument
278 int n = tca->reg_file[bit] & ~mask; in set_select()
281 if (tca->reg_file[bit] != n) { in set_select()
282 tca->reg_file[bit] = n; in set_select()
283 tca->reg_set |= (1 << bit); in set_select()
292 static void set_code(struct tca6507_chip *tca, int reg, int bank, int new) in set_code() argument
300 n = tca->reg_file[reg] & ~mask; in set_code()
302 if (tca->reg_file[reg] != n) { in set_code()
303 tca->reg_file[reg] = n; in set_code()
304 tca->reg_set |= 1 << reg; in set_code()
309 static void set_level(struct tca6507_chip *tca, int bank, int level) in set_level() argument
314 set_code(tca, TCA6507_MAX_INTENSITY, bank, level); in set_level()
317 set_code(tca, TCA6507_MASTER_INTENSITY, 0, level); in set_level()
320 tca->bank[bank].level = level; in set_level()
324 static void set_times(struct tca6507_chip *tca, int bank) in set_times() argument
329 result = choose_times(tca->bank[bank].ontime, &c1, &c2); in set_times()
330 dev_dbg(&tca->client->dev, in set_times()
333 c2, time_codes[c2], tca->bank[bank].ontime); in set_times()
334 set_code(tca, TCA6507_FADE_ON, bank, c2); in set_times()
335 set_code(tca, TCA6507_FULL_ON, bank, c1); in set_times()
336 tca->bank[bank].ontime = result; in set_times()
338 result = choose_times(tca->bank[bank].offtime, &c1, &c2); in set_times()
339 dev_dbg(&tca->client->dev, in set_times()
342 c2, time_codes[c2], tca->bank[bank].offtime); in set_times()
343 set_code(tca, TCA6507_FADE_OFF, bank, c2); in set_times()
344 set_code(tca, TCA6507_FIRST_OFF, bank, c1); in set_times()
345 set_code(tca, TCA6507_SECOND_OFF, bank, c1); in set_times()
346 tca->bank[bank].offtime = result; in set_times()
348 set_code(tca, TCA6507_INITIALIZE, bank, INIT_CODE); in set_times()
355 struct tca6507_chip *tca = container_of(work, struct tca6507_chip, in tca6507_work() local
357 struct i2c_client *cl = tca->client; in tca6507_work()
362 spin_lock_irq(&tca->lock); in tca6507_work()
363 set = tca->reg_set; in tca6507_work()
364 memcpy(file, tca->reg_file, TCA6507_REG_CNT); in tca6507_work()
365 tca->reg_set = 0; in tca6507_work()
366 spin_unlock_irq(&tca->lock); in tca6507_work()
376 struct tca6507_chip *tca = led->chip; in led_release() local
378 struct bank *b = tca->bank + led->bank; in led_release()
392 struct tca6507_chip *tca = led->chip; in led_prepare() local
400 set_select(tca, led->num, TCA6507_LS_LED_OFF); in led_prepare()
415 set_select(tca, led->num, TCA6507_LS_LED_ON); in led_prepare()
421 if (tca->bank[i].level == level || in led_prepare()
422 tca->bank[i].level_use == 0) { in led_prepare()
426 d = abs(level - tca->bank[i].level); in led_prepare()
434 set_select(tca, led->num, TCA6507_LS_LED_ON); in led_prepare()
439 if (!tca->bank[best].level_use) in led_prepare()
440 set_level(tca, best, level); in led_prepare()
442 tca->bank[best].level_use++; in led_prepare()
444 set_select(tca, led->num, bank_source[best]); in led_prepare()
445 led->led_cdev.brightness = TO_BRIGHT(tca->bank[best].level); in led_prepare()
460 if (tca->bank[i].level_use == 0) in led_prepare()
463 if (tca->bank[i].level != level) in led_prepare()
470 if (tca->bank[i].time_use == 0) in led_prepare()
474 if (!(tca->bank[i].on_dflt || in led_prepare()
476 tca->bank[i].ontime == led->ontime)) in led_prepare()
480 if (!(tca->bank[i].off_dflt || in led_prepare()
482 tca->bank[i].offtime == led->offtime)) in led_prepare()
494 b = &tca->bank[i]; in led_prepare()
496 set_level(tca, i, level); in led_prepare()
517 set_times(tca, i); in led_prepare()
525 set_select(tca, led->num, blink_source[i]); in led_prepare()
531 struct tca6507_chip *tca = led->chip; in led_assign() local
535 spin_lock_irqsave(&tca->lock, flags); in led_assign()
547 spin_unlock_irqrestore(&tca->lock, flags); in led_assign()
549 if (tca->reg_set) in led_assign()
550 schedule_work(&tca->work); in led_assign()
606 struct tca6507_chip *tca = container_of(gc, struct tca6507_chip, gpio); in tca6507_gpio_set_value() local
609 spin_lock_irqsave(&tca->lock, flags); in tca6507_gpio_set_value()
614 set_select(tca, tca->gpio_map[offset], in tca6507_gpio_set_value()
616 spin_unlock_irqrestore(&tca->lock, flags); in tca6507_gpio_set_value()
617 if (tca->reg_set) in tca6507_gpio_set_value()
618 schedule_work(&tca->work); in tca6507_gpio_set_value()
629 struct tca6507_chip *tca, in tca6507_probe_gpios() argument
639 tca->gpio_name[gpios] = pdata->leds.leds[i].name; in tca6507_probe_gpios()
640 tca->gpio_map[gpios] = i; in tca6507_probe_gpios()
647 tca->gpio.label = "gpio-tca6507"; in tca6507_probe_gpios()
648 tca->gpio.names = tca->gpio_name; in tca6507_probe_gpios()
649 tca->gpio.ngpio = gpios; in tca6507_probe_gpios()
650 tca->gpio.base = pdata->gpio_base; in tca6507_probe_gpios()
651 tca->gpio.owner = THIS_MODULE; in tca6507_probe_gpios()
652 tca->gpio.direction_output = tca6507_gpio_direction_output; in tca6507_probe_gpios()
653 tca->gpio.set = tca6507_gpio_set_value; in tca6507_probe_gpios()
654 tca->gpio.dev = &client->dev; in tca6507_probe_gpios()
656 tca->gpio.of_node = of_node_get(client->dev.of_node); in tca6507_probe_gpios()
658 err = gpiochip_add(&tca->gpio); in tca6507_probe_gpios()
660 tca->gpio.ngpio = 0; in tca6507_probe_gpios()
664 pdata->setup(tca->gpio.base, tca->gpio.ngpio); in tca6507_probe_gpios()
668 static void tca6507_remove_gpio(struct tca6507_chip *tca) in tca6507_remove_gpio() argument
670 if (tca->gpio.ngpio) in tca6507_remove_gpio()
671 gpiochip_remove(&tca->gpio); in tca6507_remove_gpio()
675 struct tca6507_chip *tca, in tca6507_probe_gpios() argument
680 static void tca6507_remove_gpio(struct tca6507_chip *tca) in tca6507_remove_gpio() argument
752 struct tca6507_chip *tca; in tca6507_probe() local
772 tca = devm_kzalloc(&client->dev, sizeof(*tca), GFP_KERNEL); in tca6507_probe()
773 if (!tca) in tca6507_probe()
776 tca->client = client; in tca6507_probe()
777 INIT_WORK(&tca->work, tca6507_work); in tca6507_probe()
778 spin_lock_init(&tca->lock); in tca6507_probe()
779 i2c_set_clientdata(client, tca); in tca6507_probe()
782 struct tca6507_led *l = tca->leds + i; in tca6507_probe()
784 l->chip = tca; in tca6507_probe()
799 err = tca6507_probe_gpios(client, tca, pdata); in tca6507_probe()
803 tca->reg_set = 0x7f; in tca6507_probe()
804 schedule_work(&tca->work); in tca6507_probe()
809 if (tca->leds[i].led_cdev.name) in tca6507_probe()
810 led_classdev_unregister(&tca->leds[i].led_cdev); in tca6507_probe()
818 struct tca6507_chip *tca = i2c_get_clientdata(client); in tca6507_remove() local
819 struct tca6507_led *tca_leds = tca->leds; in tca6507_remove()
825 tca6507_remove_gpio(tca); in tca6507_remove()
826 cancel_work_sync(&tca->work); in tca6507_remove()