Lines Matching refs:pwm
108 struct pwm_device *pwm, in sun4i_pwm_get_state() argument
123 prescaler = prescaler_table[PWM_REG_PRESCAL(val, pwm->hwpwm)]; in sun4i_pwm_get_state()
128 if (val & BIT_CH(PWM_ACT_STATE, pwm->hwpwm)) in sun4i_pwm_get_state()
133 if (val & BIT_CH(PWM_CLK_GATING | PWM_EN, pwm->hwpwm)) in sun4i_pwm_get_state()
138 val = sun4i_pwm_readl(sun4i_pwm, PWM_CH_PRD(pwm->hwpwm)); in sun4i_pwm_get_state()
204 static int sun4i_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, in sun4i_pwm_apply() argument
214 pwm_get_state(pwm, &cstate); in sun4i_pwm_apply()
242 if (PWM_REG_PRESCAL(ctrl, pwm->hwpwm) != prescaler) { in sun4i_pwm_apply()
244 ctrl &= ~BIT_CH(PWM_CLK_GATING, pwm->hwpwm); in sun4i_pwm_apply()
247 ctrl &= ~BIT_CH(PWM_PRESCAL_MASK, pwm->hwpwm); in sun4i_pwm_apply()
248 ctrl |= BIT_CH(prescaler, pwm->hwpwm); in sun4i_pwm_apply()
252 sun4i_pwm_writel(sun4i_pwm, val, PWM_CH_PRD(pwm->hwpwm)); in sun4i_pwm_apply()
253 sun4i_pwm->next_period[pwm->hwpwm] = jiffies + in sun4i_pwm_apply()
255 sun4i_pwm->needs_delay[pwm->hwpwm] = true; in sun4i_pwm_apply()
259 ctrl &= ~BIT_CH(PWM_ACT_STATE, pwm->hwpwm); in sun4i_pwm_apply()
261 ctrl |= BIT_CH(PWM_ACT_STATE, pwm->hwpwm); in sun4i_pwm_apply()
263 ctrl |= BIT_CH(PWM_CLK_GATING, pwm->hwpwm); in sun4i_pwm_apply()
265 ctrl |= BIT_CH(PWM_EN, pwm->hwpwm); in sun4i_pwm_apply()
266 } else if (!sun4i_pwm->needs_delay[pwm->hwpwm]) { in sun4i_pwm_apply()
267 ctrl &= ~BIT_CH(PWM_EN, pwm->hwpwm); in sun4i_pwm_apply()
268 ctrl &= ~BIT_CH(PWM_CLK_GATING, pwm->hwpwm); in sun4i_pwm_apply()
278 if (!sun4i_pwm->needs_delay[pwm->hwpwm]) { in sun4i_pwm_apply()
285 if (sun4i_pwm->needs_delay[pwm->hwpwm] && in sun4i_pwm_apply()
286 time_before(now, sun4i_pwm->next_period[pwm->hwpwm])) { in sun4i_pwm_apply()
287 delay_us = jiffies_to_usecs(sun4i_pwm->next_period[pwm->hwpwm] - in sun4i_pwm_apply()
294 sun4i_pwm->needs_delay[pwm->hwpwm] = false; in sun4i_pwm_apply()
298 ctrl &= ~BIT_CH(PWM_CLK_GATING, pwm->hwpwm); in sun4i_pwm_apply()
299 ctrl &= ~BIT_CH(PWM_EN, pwm->hwpwm); in sun4i_pwm_apply()
368 struct sun4i_pwm_chip *pwm; in sun4i_pwm_probe() local
375 pwm = devm_kzalloc(&pdev->dev, sizeof(*pwm), GFP_KERNEL); in sun4i_pwm_probe()
376 if (!pwm) in sun4i_pwm_probe()
380 pwm->base = devm_ioremap_resource(&pdev->dev, res); in sun4i_pwm_probe()
381 if (IS_ERR(pwm->base)) in sun4i_pwm_probe()
382 return PTR_ERR(pwm->base); in sun4i_pwm_probe()
384 pwm->clk = devm_clk_get(&pdev->dev, NULL); in sun4i_pwm_probe()
385 if (IS_ERR(pwm->clk)) in sun4i_pwm_probe()
386 return PTR_ERR(pwm->clk); in sun4i_pwm_probe()
388 pwm->data = match->data; in sun4i_pwm_probe()
389 pwm->chip.dev = &pdev->dev; in sun4i_pwm_probe()
390 pwm->chip.ops = &sun4i_pwm_ops; in sun4i_pwm_probe()
391 pwm->chip.base = -1; in sun4i_pwm_probe()
392 pwm->chip.npwm = pwm->data->npwm; in sun4i_pwm_probe()
393 pwm->chip.of_xlate = of_pwm_xlate_with_flags; in sun4i_pwm_probe()
394 pwm->chip.of_pwm_n_cells = 3; in sun4i_pwm_probe()
396 spin_lock_init(&pwm->ctrl_lock); in sun4i_pwm_probe()
398 ret = pwmchip_add(&pwm->chip); in sun4i_pwm_probe()
404 platform_set_drvdata(pdev, pwm); in sun4i_pwm_probe()
411 struct sun4i_pwm_chip *pwm = platform_get_drvdata(pdev); in sun4i_pwm_remove() local
413 return pwmchip_remove(&pwm->chip); in sun4i_pwm_remove()