Lines Matching +full:cycle +full:- +full:0
1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * e-book readers designed by the original design manufacturer Netronix, Inc.
13 * - The get_state callback is not implemented, because the current state of
15 * - The hardware can only generate normal polarity output.
16 * - The period and duty cycle can't be changed together in one atomic action.
35 #define NTXEC_REG_AUTO_OFF_HI 0xa1
36 #define NTXEC_REG_AUTO_OFF_LO 0xa2
37 #define NTXEC_REG_ENABLE 0xa3
38 #define NTXEC_REG_PERIOD_LOW 0xa4
39 #define NTXEC_REG_PERIOD_HIGH 0xa5
40 #define NTXEC_REG_DUTY_LOW 0xa6
41 #define NTXEC_REG_DUTY_HIGH 0xa7
44 * The time base used in the EC is 8MHz, or 125ns. Period and duty cycle are
54 #define MAX_PERIOD_NS (TIME_BASE_NS * 0xffff)
62 * Changes to the period and duty cycle take effect as soon as the in ntxec_pwm_set_raw_period_and_duty_cycle()
65 * duty cycle is fully written. If, in such a case, the old duty cycle in ntxec_pwm_set_raw_period_and_duty_cycle()
68 * To minimize the time between the changes to period and duty cycle in ntxec_pwm_set_raw_period_and_duty_cycle()
79 return regmap_multi_reg_write(priv->ec->regmap, regs, ARRAY_SIZE(regs)); in ntxec_pwm_set_raw_period_and_duty_cycle()
89 if (state->polarity != PWM_POLARITY_NORMAL) in ntxec_pwm_apply()
90 return -EINVAL; in ntxec_pwm_apply()
92 period = min_t(u64, state->period, MAX_PERIOD_NS); in ntxec_pwm_apply()
93 duty = min_t(u64, state->duty_cycle, period); in ntxec_pwm_apply()
99 * Writing a duty cycle of zero puts the device into a state where in ntxec_pwm_apply()
100 * writing a higher duty cycle doesn't result in the brightness that it in ntxec_pwm_apply()
103 * As a workaround, write ENABLE=0 when the duty cycle is zero. in ntxec_pwm_apply()
104 * The case that something has previously set the duty cycle to zero in ntxec_pwm_apply()
107 if (state->enabled && duty != 0) { in ntxec_pwm_apply()
112 res = regmap_write(priv->ec->regmap, NTXEC_REG_ENABLE, ntxec_reg8(1)); in ntxec_pwm_apply()
116 /* Disable the auto-off timer */ in ntxec_pwm_apply()
117 res = regmap_write(priv->ec->regmap, NTXEC_REG_AUTO_OFF_HI, ntxec_reg8(0xff)); in ntxec_pwm_apply()
121 return regmap_write(priv->ec->regmap, NTXEC_REG_AUTO_OFF_LO, ntxec_reg8(0xff)); in ntxec_pwm_apply()
123 return regmap_write(priv->ec->regmap, NTXEC_REG_ENABLE, ntxec_reg8(0)); in ntxec_pwm_apply()
137 struct ntxec *ec = dev_get_drvdata(pdev->dev.parent); in ntxec_pwm_probe()
141 device_set_of_node_from_dev(&pdev->dev, pdev->dev.parent); in ntxec_pwm_probe()
143 chip = devm_pwmchip_alloc(&pdev->dev, 1, sizeof(*priv)); in ntxec_pwm_probe()
148 priv->ec = ec; in ntxec_pwm_probe()
149 chip->ops = &ntxec_pwm_ops; in ntxec_pwm_probe()
151 return devm_pwmchip_add(&pdev->dev, chip); in ntxec_pwm_probe()
156 .name = "ntxec-pwm",
165 MODULE_ALIAS("platform:ntxec-pwm");