Lines Matching full:pwm
46 #define LM8323_CMD_PWM_WRITE 0x95 /* Write PWM script. */
47 #define LM8323_CMD_START_PWM 0x96 /* Start PWM engine. */
48 #define LM8323_CMD_STOP_PWM 0x97 /* Stop PWM engine. */
88 /* Commands for PWM engine; feed in with PWM_WRITE. */
127 /* pwm lock */
148 struct lm8323_pwm pwm[LM8323_NUM_PWMS]; member
352 static void pwm_done(struct lm8323_pwm *pwm) in pwm_done() argument
354 guard(mutex)(&pwm->lock); in pwm_done()
356 pwm->running = false; in pwm_done()
357 if (pwm->desired_brightness != pwm->brightness) in pwm_done()
358 schedule_work(&pwm->work); in pwm_done()
392 "pwm%d engine completed\n", i); in lm8323_irq()
393 pwm_done(&lm->pwm[i]); in lm8323_irq()
415 static void lm8323_write_pwm_one(struct lm8323_pwm *pwm, int pos, u16 cmd) in lm8323_write_pwm_one() argument
417 lm8323_write(pwm->chip, 4, LM8323_CMD_PWM_WRITE, (pos << 2) | pwm->id, in lm8323_write_pwm_one()
422 * Write a script into a given PWM engine, concluding with PWM_END.
425 * will be kept running at the final PWM level indefinitely.
427 static void lm8323_write_pwm(struct lm8323_pwm *pwm, int kill, in lm8323_write_pwm() argument
433 lm8323_write_pwm_one(pwm, i, cmds[i]); in lm8323_write_pwm()
435 lm8323_write_pwm_one(pwm, i++, PWM_END(kill)); in lm8323_write_pwm()
436 lm8323_write(pwm->chip, 2, LM8323_CMD_START_PWM, pwm->id); in lm8323_write_pwm()
437 pwm->running = true; in lm8323_write_pwm()
442 struct lm8323_pwm *pwm = work_to_pwm(work); in lm8323_pwm_work() local
447 guard(mutex)(&pwm->lock); in lm8323_pwm_work()
452 * case we will be called again when the previous PWM script in lm8323_pwm_work()
455 if (pwm->running || pwm->desired_brightness == pwm->brightness) in lm8323_pwm_work()
458 kill = (pwm->desired_brightness == 0); in lm8323_pwm_work()
459 up = (pwm->desired_brightness > pwm->brightness); in lm8323_pwm_work()
460 steps = abs(pwm->desired_brightness - pwm->brightness); in lm8323_pwm_work()
466 if ((pwm->fade_time / steps) > (32768 / 512)) { in lm8323_pwm_work()
474 perstep = (hz * pwm->fade_time) / (steps * 1000); in lm8323_pwm_work()
489 lm8323_write_pwm(pwm, kill, num_cmds, pwm_cmds); in lm8323_pwm_work()
490 pwm->brightness = pwm->desired_brightness; in lm8323_pwm_work()
496 struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev); in lm8323_pwm_set_brightness() local
497 struct lm8323_chip *lm = pwm->chip; in lm8323_pwm_set_brightness()
499 scoped_guard(mutex, &pwm->lock) { in lm8323_pwm_set_brightness()
500 pwm->desired_brightness = brightness; in lm8323_pwm_set_brightness()
504 schedule_work(&pwm->work); in lm8323_pwm_set_brightness()
507 * Schedule PWM work as usual unless we are going into suspend in lm8323_pwm_set_brightness()
511 schedule_work(&pwm->work); in lm8323_pwm_set_brightness()
513 lm8323_pwm_work(&pwm->work); in lm8323_pwm_set_brightness()
522 struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev); in lm8323_pwm_show_time() local
524 return sprintf(buf, "%d\n", pwm->fade_time); in lm8323_pwm_show_time()
531 struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev); in lm8323_pwm_store_time() local
539 pwm->fade_time = time; in lm8323_pwm_store_time()
554 struct lm8323_pwm *pwm; in init_pwm() local
559 pwm = &lm->pwm[id - 1]; in init_pwm()
561 pwm->id = id; in init_pwm()
562 pwm->fade_time = 0; in init_pwm()
563 pwm->brightness = 0; in init_pwm()
564 pwm->desired_brightness = 0; in init_pwm()
565 pwm->running = false; in init_pwm()
566 pwm->enabled = false; in init_pwm()
567 INIT_WORK(&pwm->work, lm8323_pwm_work); in init_pwm()
568 mutex_init(&pwm->lock); in init_pwm()
569 pwm->chip = lm; in init_pwm()
572 pwm->cdev.name = name; in init_pwm()
573 pwm->cdev.brightness_set = lm8323_pwm_set_brightness; in init_pwm()
574 pwm->cdev.groups = lm8323_pwm_groups; in init_pwm()
576 err = devm_led_classdev_register(dev, &pwm->cdev); in init_pwm()
578 dev_err(dev, "couldn't register PWM %d: %d\n", id, err); in init_pwm()
581 pwm->enabled = true; in init_pwm()
626 int pwm; in lm8323_probe() local
696 for (pwm = 0; pwm < LM8323_NUM_PWMS; pwm++) { in lm8323_probe()
697 err = init_pwm(lm, pwm + 1, &client->dev, in lm8323_probe()
698 pdata->pwm_names[pwm]); in lm8323_probe()
762 if (lm->pwm[i].enabled) in lm8323_suspend()
763 led_classdev_suspend(&lm->pwm[i].cdev); in lm8323_suspend()
779 if (lm->pwm[i].enabled) in lm8323_resume()
780 led_classdev_resume(&lm->pwm[i].cdev); in lm8323_resume()