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()
142 ret = of_property_read_u32(np, "fsl,pwm-number", &mxs->chip.npwm); in mxs_pwm_probe()
144 dev_err(&pdev->dev, "failed to get pwm number: %d\n", ret); in mxs_pwm_probe()
148 /* FIXME: Only do this if the PWM isn't already running */ in mxs_pwm_probe()
149 ret = stmp_reset_block(mxs->base); in mxs_pwm_probe()
151 return dev_err_probe(&pdev->dev, ret, "failed to reset PWM\n"); in mxs_pwm_probe()
153 ret = devm_pwmchip_add(&pdev->dev, &mxs->chip); in mxs_pwm_probe()
155 dev_err(&pdev->dev, "failed to add pwm chip %d\n", ret); in mxs_pwm_probe()
163 { .compatible = "fsl,imx23-pwm", },
170 .name = "mxs-pwm",
177 MODULE_ALIAS("platform:mxs-pwm");
179 MODULE_DESCRIPTION("Freescale MXS PWM Driver");