Lines Matching full:meson
165 static int meson_pwm_calc(struct meson_pwm *meson, in meson_pwm_calc() argument
173 if (~(meson->inverter_mask >> id) & 0x1) in meson_pwm_calc()
182 dev_err(meson->chip.dev, "invalid source clock frequency\n"); in meson_pwm_calc()
186 dev_dbg(meson->chip.dev, "fin_freq: %lu Hz\n", fin_freq); in meson_pwm_calc()
194 dev_dbg(meson->chip.dev, "fin_ps=%llu pre_div=%u cnt=%u\n", in meson_pwm_calc()
201 dev_err(meson->chip.dev, "unable to get period pre_div\n"); in meson_pwm_calc()
205 dev_dbg(meson->chip.dev, "period=%u pre_div=%u cnt=%u\n", period, in meson_pwm_calc()
221 dev_err(meson->chip.dev, "unable to get duty cycle\n"); in meson_pwm_calc()
225 dev_dbg(meson->chip.dev, "duty=%u pre_div=%u duty_cnt=%u\n", in meson_pwm_calc()
236 static void meson_pwm_enable(struct meson_pwm *meson, in meson_pwm_enable() argument
263 spin_lock_irqsave(&meson->lock, flags); in meson_pwm_enable()
265 value = readl(meson->base + REG_MISC_AB); in meson_pwm_enable()
269 writel(value, meson->base + REG_MISC_AB); in meson_pwm_enable()
272 writel(value, meson->base + offset); in meson_pwm_enable()
274 value = readl(meson->base + REG_MISC_AB); in meson_pwm_enable()
276 writel(value, meson->base + REG_MISC_AB); in meson_pwm_enable()
278 spin_unlock_irqrestore(&meson->lock, flags); in meson_pwm_enable()
281 static void meson_pwm_disable(struct meson_pwm *meson, unsigned int id) in meson_pwm_disable() argument
299 spin_lock_irqsave(&meson->lock, flags); in meson_pwm_disable()
301 value = readl(meson->base + REG_MISC_AB); in meson_pwm_disable()
303 writel(value, meson->base + REG_MISC_AB); in meson_pwm_disable()
305 spin_unlock_irqrestore(&meson->lock, flags); in meson_pwm_disable()
312 struct meson_pwm *meson = to_meson_pwm(chip); in meson_pwm_apply() local
319 meson_pwm_disable(meson, pwm->hwpwm); in meson_pwm_apply()
330 meson->inverter_mask |= BIT(pwm->hwpwm); in meson_pwm_apply()
332 meson->inverter_mask &= ~BIT(pwm->hwpwm); in meson_pwm_apply()
335 err = meson_pwm_calc(meson, channel, pwm->hwpwm, in meson_pwm_apply()
346 meson_pwm_enable(meson, channel, pwm->hwpwm); in meson_pwm_apply()
356 struct meson_pwm *meson = to_meson_pwm(chip); in meson_pwm_get_state() local
375 value = readl(meson->base + REG_MISC_AB); in meson_pwm_get_state()
442 .compatible = "amlogic,meson-gxbb-pwm",
446 .compatible = "amlogic,meson-gxbb-ao-pwm",
450 .compatible = "amlogic,meson-axg-ee-pwm",
454 .compatible = "amlogic,meson-axg-ao-pwm",
461 static int meson_pwm_init_channels(struct meson_pwm *meson, in meson_pwm_init_channels() argument
464 struct device *dev = meson->chip.dev; in meson_pwm_init_channels()
470 for (i = 0; i < meson->chip.npwm; i++) { in meson_pwm_init_channels()
478 init.parent_names = meson->data->parent_names; in meson_pwm_init_channels()
479 init.num_parents = meson->data->num_parents; in meson_pwm_init_channels()
481 channel->mux.reg = meson->base + REG_MISC_AB; in meson_pwm_init_channels()
485 channel->mux.lock = &meson->lock; in meson_pwm_init_channels()
511 static void meson_pwm_add_channels(struct meson_pwm *meson, in meson_pwm_add_channels() argument
516 for (i = 0; i < meson->chip.npwm; i++) in meson_pwm_add_channels()
517 pwm_set_chip_data(&meson->chip.pwms[i], &channels[i]); in meson_pwm_add_channels()
523 struct meson_pwm *meson; in meson_pwm_probe() local
527 meson = devm_kzalloc(&pdev->dev, sizeof(*meson), GFP_KERNEL); in meson_pwm_probe()
528 if (!meson) in meson_pwm_probe()
532 meson->base = devm_ioremap_resource(&pdev->dev, regs); in meson_pwm_probe()
533 if (IS_ERR(meson->base)) in meson_pwm_probe()
534 return PTR_ERR(meson->base); in meson_pwm_probe()
536 spin_lock_init(&meson->lock); in meson_pwm_probe()
537 meson->chip.dev = &pdev->dev; in meson_pwm_probe()
538 meson->chip.ops = &meson_pwm_ops; in meson_pwm_probe()
539 meson->chip.base = -1; in meson_pwm_probe()
540 meson->chip.npwm = 2; in meson_pwm_probe()
541 meson->chip.of_xlate = of_pwm_xlate_with_flags; in meson_pwm_probe()
542 meson->chip.of_pwm_n_cells = 3; in meson_pwm_probe()
544 meson->data = of_device_get_match_data(&pdev->dev); in meson_pwm_probe()
545 meson->inverter_mask = BIT(meson->chip.npwm) - 1; in meson_pwm_probe()
547 channels = devm_kcalloc(&pdev->dev, meson->chip.npwm, in meson_pwm_probe()
552 err = meson_pwm_init_channels(meson, channels); in meson_pwm_probe()
556 err = pwmchip_add(&meson->chip); in meson_pwm_probe()
562 meson_pwm_add_channels(meson, channels); in meson_pwm_probe()
564 platform_set_drvdata(pdev, meson); in meson_pwm_probe()
571 struct meson_pwm *meson = platform_get_drvdata(pdev); in meson_pwm_remove() local
573 return pwmchip_remove(&meson->chip); in meson_pwm_remove()
578 .name = "meson-pwm",
586 MODULE_DESCRIPTION("Amlogic Meson PWM Generator driver");