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>
53 unsigned int offset) in rcar_pwm_write() argument
55 writel(data, rp->base + offset); in rcar_pwm_write()
58 static u32 rcar_pwm_read(struct rcar_pwm_chip *rp, unsigned int offset) in rcar_pwm_read() argument
60 return readl(rp->base + offset); in rcar_pwm_read()
64 unsigned int offset) in rcar_pwm_update() argument
68 value = rcar_pwm_read(rp, offset); in rcar_pwm_update()
71 rcar_pwm_write(rp, value, offset); in rcar_pwm_update()
76 unsigned long clk_rate = clk_get_rate(rp->clk); in rcar_pwm_get_clock_division()
80 return -EINVAL; in rcar_pwm_get_clock_division()
83 tmp = (u64)period_ns * clk_rate + div - 1; in rcar_pwm_get_clock_division()
85 div = ilog2(tmp - 1) + 1; in rcar_pwm_get_clock_division()
87 return (div <= RCAR_PWM_MAX_DIVISION) ? div : -ERANGE; in rcar_pwm_get_clock_division()
111 unsigned long clk_rate = clk_get_rate(rp->clk); in rcar_pwm_set_counter()
128 return -EINVAL; in rcar_pwm_set_counter()
135 static int rcar_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) in rcar_pwm_request() argument
137 return pm_runtime_get_sync(chip->dev); in rcar_pwm_request()
140 static void rcar_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) in rcar_pwm_free() argument
142 pm_runtime_put(chip->dev); in rcar_pwm_free()
149 /* Don't enable the PWM device if CYC0 or PH0 is 0 */ in rcar_pwm_enable()
153 return -EINVAL; in rcar_pwm_enable()
165 static int rcar_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, in rcar_pwm_apply() argument
172 if (state->polarity != PWM_POLARITY_NORMAL) in rcar_pwm_apply()
173 return -EINVAL; in rcar_pwm_apply()
175 if (!state->enabled) { in rcar_pwm_apply()
180 div = rcar_pwm_get_clock_division(rp, state->period); in rcar_pwm_apply()
186 ret = rcar_pwm_set_counter(rp, div, state->duty_cycle, state->period); in rcar_pwm_apply()
211 rcar_pwm = devm_kzalloc(&pdev->dev, sizeof(*rcar_pwm), GFP_KERNEL); in rcar_pwm_probe()
213 return -ENOMEM; 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()
227 rcar_pwm->chip.dev = &pdev->dev; in rcar_pwm_probe()
228 rcar_pwm->chip.ops = &rcar_pwm_ops; in rcar_pwm_probe()
229 rcar_pwm->chip.npwm = 1; in rcar_pwm_probe()
231 pm_runtime_enable(&pdev->dev); in rcar_pwm_probe()
233 ret = pwmchip_add(&rcar_pwm->chip); in rcar_pwm_probe()
235 dev_err(&pdev->dev, "failed to register PWM chip: %d\n", ret); in rcar_pwm_probe()
236 pm_runtime_disable(&pdev->dev); in rcar_pwm_probe()
247 pwmchip_remove(&rcar_pwm->chip); in rcar_pwm_remove()
249 pm_runtime_disable(&pdev->dev); in rcar_pwm_remove()
253 { .compatible = "renesas,pwm-rcar", },
262 .name = "pwm-rcar",
269 MODULE_DESCRIPTION("Renesas PWM Timer Driver");
271 MODULE_ALIAS("platform:pwm-rcar");