Lines Matching +full:pwm +full:- +full:number
1 // SPDX-License-Identifier: GPL-2.0+
13 #include <linux/pwm.h>
47 static int mxs_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, in mxs_pwm_apply() argument
58 * If the PWM channel is disabled, make sure to turn on the in mxs_pwm_apply()
62 if (!pwm_is_enabled(pwm)) { in mxs_pwm_apply()
63 ret = clk_prepare_enable(mxs->clk); in mxs_pwm_apply()
68 if (!state->enabled && pwm_is_enabled(pwm)) in mxs_pwm_apply()
69 writel(1 << pwm->hwpwm, mxs->base + PWM_CTRL + CLR); in mxs_pwm_apply()
71 rate = clk_get_rate(mxs->clk); in mxs_pwm_apply()
74 c = c * state->period; in mxs_pwm_apply()
80 return -EINVAL; in mxs_pwm_apply()
84 c *= state->duty_cycle; in mxs_pwm_apply()
85 do_div(c, state->period); in mxs_pwm_apply()
95 pol_bits = state->polarity == PWM_POLARITY_NORMAL ? in mxs_pwm_apply()
98 mxs->base + PWM_ACTIVE0 + pwm->hwpwm * 0x20); in mxs_pwm_apply()
100 mxs->base + PWM_PERIOD0 + pwm->hwpwm * 0x20); in mxs_pwm_apply()
102 if (state->enabled) { in mxs_pwm_apply()
103 if (!pwm_is_enabled(pwm)) { in mxs_pwm_apply()
108 writel(1 << pwm->hwpwm, mxs->base + PWM_CTRL + SET); in mxs_pwm_apply()
111 clk_disable_unprepare(mxs->clk); in mxs_pwm_apply()
123 struct device_node *np = pdev->dev.of_node; in mxs_pwm_probe()
127 mxs = devm_kzalloc(&pdev->dev, sizeof(*mxs), GFP_KERNEL); in mxs_pwm_probe()
129 return -ENOMEM; in mxs_pwm_probe()
131 mxs->base = devm_platform_ioremap_resource(pdev, 0); in mxs_pwm_probe()
132 if (IS_ERR(mxs->base)) in mxs_pwm_probe()
133 return PTR_ERR(mxs->base); in mxs_pwm_probe()
135 mxs->clk = devm_clk_get(&pdev->dev, NULL); in mxs_pwm_probe()
136 if (IS_ERR(mxs->clk)) in mxs_pwm_probe()
137 return PTR_ERR(mxs->clk); in mxs_pwm_probe()
139 mxs->chip.dev = &pdev->dev; in mxs_pwm_probe()
140 mxs->chip.ops = &mxs_pwm_ops; in mxs_pwm_probe()
141 mxs->chip.of_xlate = of_pwm_xlate_with_flags; in mxs_pwm_probe()
142 mxs->chip.of_pwm_n_cells = 3; in mxs_pwm_probe()
143 mxs->chip.base = -1; in mxs_pwm_probe()
145 ret = of_property_read_u32(np, "fsl,pwm-number", &mxs->chip.npwm); in mxs_pwm_probe()
147 dev_err(&pdev->dev, "failed to get pwm number: %d\n", ret); in mxs_pwm_probe()
151 ret = pwmchip_add(&mxs->chip); in mxs_pwm_probe()
153 dev_err(&pdev->dev, "failed to add pwm chip %d\n", ret); in mxs_pwm_probe()
159 ret = stmp_reset_block(mxs->base); in mxs_pwm_probe()
166 pwmchip_remove(&mxs->chip); in mxs_pwm_probe()
174 return pwmchip_remove(&mxs->chip); in mxs_pwm_remove()
178 { .compatible = "fsl,imx23-pwm", },
185 .name = "mxs-pwm",
193 MODULE_ALIAS("platform:mxs-pwm");
195 MODULE_DESCRIPTION("Freescale MXS PWM Driver");