Lines Matching refs:tca

263 static void set_select(struct tca6507_chip *tca, int led, int val)
269 int n = tca->reg_file[bit] & ~mask;
272 if (tca->reg_file[bit] != n) {
273 tca->reg_file[bit] = n;
274 tca->reg_set |= (1 << bit);
283 static void set_code(struct tca6507_chip *tca, int reg, int bank, int new)
291 n = tca->reg_file[reg] & ~mask;
293 if (tca->reg_file[reg] != n) {
294 tca->reg_file[reg] = n;
295 tca->reg_set |= 1 << reg;
300 static void set_level(struct tca6507_chip *tca, int bank, int level)
305 set_code(tca, TCA6507_MAX_INTENSITY, bank, level);
308 set_code(tca, TCA6507_MASTER_INTENSITY, 0, level);
311 tca->bank[bank].level = level;
315 static void set_times(struct tca6507_chip *tca, int bank)
320 result = choose_times(tca->bank[bank].ontime, &c1, &c2);
323 dev_dbg(&tca->client->dev,
326 c2, time_codes[c2], tca->bank[bank].ontime);
327 set_code(tca, TCA6507_FADE_ON, bank, c2);
328 set_code(tca, TCA6507_FULL_ON, bank, c1);
329 tca->bank[bank].ontime = result;
331 result = choose_times(tca->bank[bank].offtime, &c1, &c2);
332 dev_dbg(&tca->client->dev,
335 c2, time_codes[c2], tca->bank[bank].offtime);
336 set_code(tca, TCA6507_FADE_OFF, bank, c2);
337 set_code(tca, TCA6507_FIRST_OFF, bank, c1);
338 set_code(tca, TCA6507_SECOND_OFF, bank, c1);
339 tca->bank[bank].offtime = result;
341 set_code(tca, TCA6507_INITIALIZE, bank, INIT_CODE);
348 struct tca6507_chip *tca = container_of(work, struct tca6507_chip,
350 struct i2c_client *cl = tca->client;
355 spin_lock_irq(&tca->lock);
356 set = tca->reg_set;
357 memcpy(file, tca->reg_file, TCA6507_REG_CNT);
358 tca->reg_set = 0;
359 spin_unlock_irq(&tca->lock);
369 struct tca6507_chip *tca = led->chip;
371 struct bank *b = tca->bank + led->bank;
385 struct tca6507_chip *tca = led->chip;
393 set_select(tca, led->num, TCA6507_LS_LED_OFF);
408 set_select(tca, led->num, TCA6507_LS_LED_ON);
414 if (tca->bank[i].level == level ||
415 tca->bank[i].level_use == 0) {
419 d = abs(level - tca->bank[i].level);
427 set_select(tca, led->num, TCA6507_LS_LED_ON);
432 if (!tca->bank[best].level_use)
433 set_level(tca, best, level);
435 tca->bank[best].level_use++;
437 set_select(tca, led->num, bank_source[best]);
438 led->led_cdev.brightness = TO_BRIGHT(tca->bank[best].level);
453 if (tca->bank[i].level_use == 0)
456 if (tca->bank[i].level != level)
463 if (tca->bank[i].time_use == 0)
467 if (!(tca->bank[i].on_dflt ||
469 tca->bank[i].ontime == led->ontime))
473 if (!(tca->bank[i].off_dflt ||
475 tca->bank[i].offtime == led->offtime))
487 b = &tca->bank[i];
489 set_level(tca, i, level);
510 set_times(tca, i);
518 set_select(tca, led->num, blink_source[i]);
524 struct tca6507_chip *tca = led->chip;
528 spin_lock_irqsave(&tca->lock, flags);
540 spin_unlock_irqrestore(&tca->lock, flags);
542 if (tca->reg_set)
543 schedule_work(&tca->work);
599 struct tca6507_chip *tca = gpiochip_get_data(gc);
602 spin_lock_irqsave(&tca->lock, flags);
607 set_select(tca, tca->gpio_map[offset],
609 spin_unlock_irqrestore(&tca->lock, flags);
610 if (tca->reg_set)
611 schedule_work(&tca->work);
622 struct tca6507_chip *tca,
632 tca->gpio_map[gpios] = i;
639 tca->gpio.label = "gpio-tca6507";
640 tca->gpio.ngpio = gpios;
641 tca->gpio.base = pdata->gpio_base;
642 tca->gpio.owner = THIS_MODULE;
643 tca->gpio.direction_output = tca6507_gpio_direction_output;
644 tca->gpio.set = tca6507_gpio_set_value;
645 tca->gpio.parent = dev;
647 tca->gpio.of_node = of_node_get(dev_of_node(dev));
649 err = gpiochip_add_data(&tca->gpio, tca);
651 tca->gpio.ngpio = 0;
657 static void tca6507_remove_gpio(struct tca6507_chip *tca)
659 if (tca->gpio.ngpio)
660 gpiochip_remove(&tca->gpio);
664 struct tca6507_chip *tca,
669 static void tca6507_remove_gpio(struct tca6507_chip *tca)
742 struct tca6507_chip *tca;
757 tca = devm_kzalloc(dev, sizeof(*tca), GFP_KERNEL);
758 if (!tca)
761 tca->client = client;
762 INIT_WORK(&tca->work, tca6507_work);
763 spin_lock_init(&tca->lock);
764 i2c_set_clientdata(client, tca);
767 struct tca6507_led *l = tca->leds + i;
769 l->chip = tca;
783 err = tca6507_probe_gpios(dev, tca, pdata);
787 tca->reg_set = 0x7f;
788 schedule_work(&tca->work);
793 if (tca->leds[i].led_cdev.name)
794 led_classdev_unregister(&tca->leds[i].led_cdev);
802 struct tca6507_chip *tca = i2c_get_clientdata(client);
803 struct tca6507_led *tca_leds = tca->leds;
809 tca6507_remove_gpio(tca);
810 cancel_work_sync(&tca->work);