Lines Matching full:meson
3 * PWM controller driver for Amlogic Meson SoCs.
122 struct meson_pwm *meson = to_meson_pwm(chip); in meson_pwm_request() local
131 channel = &meson->channels[pwm->hwpwm]; in meson_pwm_request()
155 struct meson_pwm *meson = to_meson_pwm(chip); in meson_pwm_free() local
156 struct meson_pwm_channel *channel = &meson->channels[pwm->hwpwm]; in meson_pwm_free()
162 static int meson_pwm_calc(struct meson_pwm *meson, struct pwm_device *pwm, in meson_pwm_calc() argument
165 struct meson_pwm_channel *channel = &meson->channels[pwm->hwpwm]; in meson_pwm_calc()
184 dev_err(meson->chip.dev, "invalid source clock frequency\n"); in meson_pwm_calc()
188 dev_dbg(meson->chip.dev, "fin_freq: %lu Hz\n", fin_freq); in meson_pwm_calc()
192 dev_err(meson->chip.dev, "unable to get period pre_div\n"); in meson_pwm_calc()
198 dev_err(meson->chip.dev, "unable to get period cnt\n"); in meson_pwm_calc()
202 dev_dbg(meson->chip.dev, "period=%llu pre_div=%u cnt=%u\n", period, in meson_pwm_calc()
217 dev_err(meson->chip.dev, "unable to get duty cycle\n"); in meson_pwm_calc()
221 dev_dbg(meson->chip.dev, "duty=%llu pre_div=%u duty_cnt=%u\n", in meson_pwm_calc()
232 static void meson_pwm_enable(struct meson_pwm *meson, struct pwm_device *pwm) in meson_pwm_enable() argument
234 struct meson_pwm_channel *channel = &meson->channels[pwm->hwpwm]; in meson_pwm_enable()
241 spin_lock_irqsave(&meson->lock, flags); in meson_pwm_enable()
243 value = readl(meson->base + REG_MISC_AB); in meson_pwm_enable()
247 writel(value, meson->base + REG_MISC_AB); in meson_pwm_enable()
251 writel(value, meson->base + channel_data->reg_offset); in meson_pwm_enable()
253 value = readl(meson->base + REG_MISC_AB); in meson_pwm_enable()
255 writel(value, meson->base + REG_MISC_AB); in meson_pwm_enable()
257 spin_unlock_irqrestore(&meson->lock, flags); in meson_pwm_enable()
260 static void meson_pwm_disable(struct meson_pwm *meson, struct pwm_device *pwm) in meson_pwm_disable() argument
265 spin_lock_irqsave(&meson->lock, flags); in meson_pwm_disable()
267 value = readl(meson->base + REG_MISC_AB); in meson_pwm_disable()
269 writel(value, meson->base + REG_MISC_AB); in meson_pwm_disable()
271 spin_unlock_irqrestore(&meson->lock, flags); in meson_pwm_disable()
277 struct meson_pwm *meson = to_meson_pwm(chip); in meson_pwm_apply() local
278 struct meson_pwm_channel *channel = &meson->channels[pwm->hwpwm]; in meson_pwm_apply()
302 meson_pwm_enable(meson, pwm); in meson_pwm_apply()
304 meson_pwm_disable(meson, pwm); in meson_pwm_apply()
307 err = meson_pwm_calc(meson, pwm, state); in meson_pwm_apply()
311 meson_pwm_enable(meson, pwm); in meson_pwm_apply()
320 struct meson_pwm *meson = to_meson_pwm(chip); in meson_pwm_cnt_to_ns() local
326 channel = &meson->channels[pwm->hwpwm]; in meson_pwm_cnt_to_ns()
340 struct meson_pwm *meson = to_meson_pwm(chip); in meson_pwm_get_state() local
348 channel = &meson->channels[pwm->hwpwm]; in meson_pwm_get_state()
351 value = readl(meson->base + REG_MISC_AB); in meson_pwm_get_state()
359 value = readl(meson->base + channel_data->reg_offset); in meson_pwm_get_state()
469 .compatible = "amlogic,meson-gxbb-pwm",
473 .compatible = "amlogic,meson-gxbb-ao-pwm",
477 .compatible = "amlogic,meson-axg-ee-pwm",
481 .compatible = "amlogic,meson-axg-ao-pwm",
485 .compatible = "amlogic,meson-g12a-ee-pwm",
489 .compatible = "amlogic,meson-g12a-ao-pwm-ab",
493 .compatible = "amlogic,meson-g12a-ao-pwm-cd",
500 static int meson_pwm_init_channels(struct meson_pwm *meson) in meson_pwm_init_channels() argument
502 struct device *dev = meson->chip.dev; in meson_pwm_init_channels()
508 for (i = 0; i < meson->chip.npwm; i++) { in meson_pwm_init_channels()
509 struct meson_pwm_channel *channel = &meson->channels[i]; in meson_pwm_init_channels()
516 init.parent_names = meson->data->parent_names; in meson_pwm_init_channels()
517 init.num_parents = meson->data->num_parents; in meson_pwm_init_channels()
519 channel->mux.reg = meson->base + REG_MISC_AB; in meson_pwm_init_channels()
524 channel->mux.lock = &meson->lock; in meson_pwm_init_channels()
547 struct meson_pwm *meson; in meson_pwm_probe() local
551 meson = devm_kzalloc(&pdev->dev, sizeof(*meson), GFP_KERNEL); in meson_pwm_probe()
552 if (!meson) in meson_pwm_probe()
556 meson->base = devm_ioremap_resource(&pdev->dev, regs); in meson_pwm_probe()
557 if (IS_ERR(meson->base)) in meson_pwm_probe()
558 return PTR_ERR(meson->base); in meson_pwm_probe()
560 spin_lock_init(&meson->lock); in meson_pwm_probe()
561 meson->chip.dev = &pdev->dev; in meson_pwm_probe()
562 meson->chip.ops = &meson_pwm_ops; in meson_pwm_probe()
563 meson->chip.base = -1; in meson_pwm_probe()
564 meson->chip.npwm = MESON_NUM_PWMS; in meson_pwm_probe()
565 meson->chip.of_xlate = of_pwm_xlate_with_flags; in meson_pwm_probe()
566 meson->chip.of_pwm_n_cells = 3; in meson_pwm_probe()
568 meson->data = of_device_get_match_data(&pdev->dev); in meson_pwm_probe()
570 err = meson_pwm_init_channels(meson); in meson_pwm_probe()
574 err = pwmchip_add(&meson->chip); in meson_pwm_probe()
580 platform_set_drvdata(pdev, meson); in meson_pwm_probe()
587 struct meson_pwm *meson = platform_get_drvdata(pdev); in meson_pwm_remove() local
589 return pwmchip_remove(&meson->chip); in meson_pwm_remove()
594 .name = "meson-pwm",
602 MODULE_DESCRIPTION("Amlogic Meson PWM Generator driver");