Lines Matching refs:pwm

22 #include <linux/pwm.h>
113 struct pwm_device *pwm,
130 if ((val & BIT_CH(PWM_BYPASS, pwm->hwpwm)) &&
139 if ((PWM_REG_PRESCAL(val, pwm->hwpwm) == PWM_PRESCAL_MASK) &&
143 prescaler = prescaler_table[PWM_REG_PRESCAL(val, pwm->hwpwm)];
148 if (val & BIT_CH(PWM_ACT_STATE, pwm->hwpwm))
153 if ((val & BIT_CH(PWM_CLK_GATING | PWM_EN, pwm->hwpwm)) ==
154 BIT_CH(PWM_CLK_GATING | PWM_EN, pwm->hwpwm))
159 val = sun4i_pwm_readl(sun4i_pwm, PWM_CH_PRD(pwm->hwpwm));
231 static int sun4i_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
242 pwm_get_state(pwm, &cstate);
266 ctrl |= BIT_CH(PWM_BYPASS, pwm->hwpwm);
273 ctrl &= ~BIT_CH(PWM_BYPASS, pwm->hwpwm);
276 if (PWM_REG_PRESCAL(ctrl, pwm->hwpwm) != prescaler) {
278 ctrl &= ~BIT_CH(PWM_CLK_GATING, pwm->hwpwm);
281 ctrl &= ~BIT_CH(PWM_PRESCAL_MASK, pwm->hwpwm);
282 ctrl |= BIT_CH(prescaler, pwm->hwpwm);
286 sun4i_pwm_writel(sun4i_pwm, val, PWM_CH_PRD(pwm->hwpwm));
287 sun4i_pwm->next_period[pwm->hwpwm] = jiffies +
291 ctrl &= ~BIT_CH(PWM_ACT_STATE, pwm->hwpwm);
293 ctrl |= BIT_CH(PWM_ACT_STATE, pwm->hwpwm);
295 ctrl |= BIT_CH(PWM_CLK_GATING, pwm->hwpwm);
298 ctrl |= BIT_CH(PWM_EN, pwm->hwpwm);
309 if (time_before(now, sun4i_pwm->next_period[pwm->hwpwm])) {
310 delay_us = jiffies_to_usecs(sun4i_pwm->next_period[pwm->hwpwm] -
320 ctrl &= ~BIT_CH(PWM_CLK_GATING, pwm->hwpwm);
321 ctrl &= ~BIT_CH(PWM_EN, pwm->hwpwm);
365 .compatible = "allwinner,sun4i-a10-pwm",
368 .compatible = "allwinner,sun5i-a10s-pwm",
371 .compatible = "allwinner,sun5i-a13-pwm",
374 .compatible = "allwinner,sun7i-a20-pwm",
377 .compatible = "allwinner,sun8i-h3-pwm",
380 .compatible = "allwinner,sun50i-a64-pwm",
383 .compatible = "allwinner,sun50i-h6-pwm",
393 struct sun4i_pwm_chip *pwm;
397 pwm = devm_kzalloc(&pdev->dev, sizeof(*pwm), GFP_KERNEL);
398 if (!pwm)
401 pwm->data = of_device_get_match_data(&pdev->dev);
402 if (!pwm->data)
406 pwm->base = devm_ioremap_resource(&pdev->dev, res);
407 if (IS_ERR(pwm->base))
408 return PTR_ERR(pwm->base);
421 pwm->clk = devm_clk_get_optional(&pdev->dev, "mod");
422 if (IS_ERR(pwm->clk))
423 return dev_err_probe(&pdev->dev, PTR_ERR(pwm->clk),
426 if (!pwm->clk) {
427 pwm->clk = devm_clk_get(&pdev->dev, NULL);
428 if (IS_ERR(pwm->clk))
429 return dev_err_probe(&pdev->dev, PTR_ERR(pwm->clk),
433 pwm->bus_clk = devm_clk_get_optional(&pdev->dev, "bus");
434 if (IS_ERR(pwm->bus_clk))
435 return dev_err_probe(&pdev->dev, PTR_ERR(pwm->bus_clk),
438 pwm->rst = devm_reset_control_get_optional_shared(&pdev->dev, NULL);
439 if (IS_ERR(pwm->rst))
440 return dev_err_probe(&pdev->dev, PTR_ERR(pwm->rst),
444 ret = reset_control_deassert(pwm->rst);
455 ret = clk_prepare_enable(pwm->bus_clk);
462 pwm->chip.dev = &pdev->dev;
463 pwm->chip.ops = &sun4i_pwm_ops;
464 pwm->chip.base = -1;
465 pwm->chip.npwm = pwm->data->npwm;
466 pwm->chip.of_xlate = of_pwm_xlate_with_flags;
467 pwm->chip.of_pwm_n_cells = 3;
469 spin_lock_init(&pwm->ctrl_lock);
471 ret = pwmchip_add(&pwm->chip);
477 platform_set_drvdata(pdev, pwm);
482 clk_disable_unprepare(pwm->bus_clk);
484 reset_control_assert(pwm->rst);
491 struct sun4i_pwm_chip *pwm = platform_get_drvdata(pdev);
494 ret = pwmchip_remove(&pwm->chip);
498 clk_disable_unprepare(pwm->bus_clk);
499 reset_control_assert(pwm->rst);
506 .name = "sun4i-pwm",
514 MODULE_ALIAS("platform:sun4i-pwm");