Lines Matching +full:pwm +full:- +full:offset
1 // SPDX-License-Identifier: GPL-2.0
3 * R-Car PWM Timer driver
8 * - The hardware cannot generate a 0% duty cycle.
21 #include <linux/pwm.h>
52 unsigned int offset) in rcar_pwm_write() argument
54 writel(data, rp->base + offset); in rcar_pwm_write()
57 static u32 rcar_pwm_read(struct rcar_pwm_chip *rp, unsigned int offset) in rcar_pwm_read() argument
59 return readl(rp->base + offset); in rcar_pwm_read()
63 unsigned int offset) in rcar_pwm_update() argument
67 value = rcar_pwm_read(rp, offset); in rcar_pwm_update()
70 rcar_pwm_write(rp, value, offset); in rcar_pwm_update()
75 unsigned long clk_rate = clk_get_rate(rp->clk); in rcar_pwm_get_clock_division()
79 return -EINVAL; in rcar_pwm_get_clock_division()
82 tmp = (u64)period_ns * clk_rate + div - 1; in rcar_pwm_get_clock_division()
84 div = ilog2(tmp - 1) + 1; in rcar_pwm_get_clock_division()
86 return (div <= RCAR_PWM_MAX_DIVISION) ? div : -ERANGE; in rcar_pwm_get_clock_division()
110 unsigned long clk_rate = clk_get_rate(rp->clk); in rcar_pwm_set_counter()
127 return -EINVAL; in rcar_pwm_set_counter()
134 static int rcar_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) in rcar_pwm_request() argument
139 static void rcar_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) in rcar_pwm_free() argument
148 /* Don't enable the PWM device if CYC0 or PH0 is 0 */ in rcar_pwm_enable()
152 return -EINVAL; in rcar_pwm_enable()
164 static int rcar_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, in rcar_pwm_apply() argument
171 if (state->polarity != PWM_POLARITY_NORMAL) in rcar_pwm_apply()
172 return -EINVAL; in rcar_pwm_apply()
174 if (!state->enabled) { in rcar_pwm_apply()
179 div = rcar_pwm_get_clock_division(rp, state->period); in rcar_pwm_apply()
185 ret = rcar_pwm_set_counter(rp, div, state->duty_cycle, state->period); in rcar_pwm_apply()
210 chip = devm_pwmchip_alloc(&pdev->dev, 1, sizeof(*rcar_pwm)); in rcar_pwm_probe()
215 rcar_pwm->base = devm_platform_ioremap_resource(pdev, 0); in rcar_pwm_probe()
216 if (IS_ERR(rcar_pwm->base)) in rcar_pwm_probe()
217 return PTR_ERR(rcar_pwm->base); in rcar_pwm_probe()
219 rcar_pwm->clk = devm_clk_get(&pdev->dev, NULL); in rcar_pwm_probe()
220 if (IS_ERR(rcar_pwm->clk)) { in rcar_pwm_probe()
221 dev_err(&pdev->dev, "cannot get clock\n"); in rcar_pwm_probe()
222 return PTR_ERR(rcar_pwm->clk); in rcar_pwm_probe()
225 chip->ops = &rcar_pwm_ops; in rcar_pwm_probe()
229 pm_runtime_enable(&pdev->dev); in rcar_pwm_probe()
233 dev_err(&pdev->dev, "failed to register PWM chip: %d\n", ret); in rcar_pwm_probe()
234 pm_runtime_disable(&pdev->dev); in rcar_pwm_probe()
247 pm_runtime_disable(&pdev->dev); in rcar_pwm_remove()
251 { .compatible = "renesas,pwm-rcar", },
260 .name = "pwm-rcar",
267 MODULE_DESCRIPTION("Renesas PWM Timer Driver");
269 MODULE_ALIAS("platform:pwm-rcar");