Lines Matching full:pwm
2 * Marvell Berlin PWM driver
18 #include <linux/pwm.h>
72 static int berlin_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) in berlin_pwm_request() argument
80 return pwm_set_chip_data(pwm, channel); in berlin_pwm_request()
83 static void berlin_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) in berlin_pwm_free() argument
85 struct berlin_pwm_channel *channel = pwm_get_chip_data(pwm); in berlin_pwm_free()
93 struct berlin_pwm_chip *pwm = to_berlin_pwm_chip(chip); in berlin_pwm_config() local
98 cycles = clk_get_rate(pwm->clk); in berlin_pwm_config()
115 value = berlin_pwm_readl(pwm, pwm_dev->hwpwm, BERLIN_PWM_CONTROL); in berlin_pwm_config()
120 berlin_pwm_writel(pwm, pwm_dev->hwpwm, value, BERLIN_PWM_CONTROL); in berlin_pwm_config()
122 berlin_pwm_writel(pwm, pwm_dev->hwpwm, duty, BERLIN_PWM_DUTY); in berlin_pwm_config()
123 berlin_pwm_writel(pwm, pwm_dev->hwpwm, period, BERLIN_PWM_TCNT); in berlin_pwm_config()
132 struct berlin_pwm_chip *pwm = to_berlin_pwm_chip(chip); in berlin_pwm_set_polarity() local
135 value = berlin_pwm_readl(pwm, pwm_dev->hwpwm, BERLIN_PWM_CONTROL); in berlin_pwm_set_polarity()
142 berlin_pwm_writel(pwm, pwm_dev->hwpwm, value, BERLIN_PWM_CONTROL); in berlin_pwm_set_polarity()
149 struct berlin_pwm_chip *pwm = to_berlin_pwm_chip(chip); in berlin_pwm_enable() local
152 value = berlin_pwm_readl(pwm, pwm_dev->hwpwm, BERLIN_PWM_EN); in berlin_pwm_enable()
154 berlin_pwm_writel(pwm, pwm_dev->hwpwm, value, BERLIN_PWM_EN); in berlin_pwm_enable()
162 struct berlin_pwm_chip *pwm = to_berlin_pwm_chip(chip); in berlin_pwm_disable() local
165 value = berlin_pwm_readl(pwm, pwm_dev->hwpwm, BERLIN_PWM_EN); in berlin_pwm_disable()
167 berlin_pwm_writel(pwm, pwm_dev->hwpwm, value, BERLIN_PWM_EN); in berlin_pwm_disable()
181 { .compatible = "marvell,berlin-pwm" },
188 struct berlin_pwm_chip *pwm; in berlin_pwm_probe() local
192 pwm = devm_kzalloc(&pdev->dev, sizeof(*pwm), GFP_KERNEL); in berlin_pwm_probe()
193 if (!pwm) in berlin_pwm_probe()
197 pwm->base = devm_ioremap_resource(&pdev->dev, res); in berlin_pwm_probe()
198 if (IS_ERR(pwm->base)) in berlin_pwm_probe()
199 return PTR_ERR(pwm->base); in berlin_pwm_probe()
201 pwm->clk = devm_clk_get(&pdev->dev, NULL); in berlin_pwm_probe()
202 if (IS_ERR(pwm->clk)) in berlin_pwm_probe()
203 return PTR_ERR(pwm->clk); in berlin_pwm_probe()
205 ret = clk_prepare_enable(pwm->clk); in berlin_pwm_probe()
209 pwm->chip.dev = &pdev->dev; in berlin_pwm_probe()
210 pwm->chip.ops = &berlin_pwm_ops; in berlin_pwm_probe()
211 pwm->chip.base = -1; in berlin_pwm_probe()
212 pwm->chip.npwm = 4; in berlin_pwm_probe()
213 pwm->chip.of_xlate = of_pwm_xlate_with_flags; in berlin_pwm_probe()
214 pwm->chip.of_pwm_n_cells = 3; in berlin_pwm_probe()
216 ret = pwmchip_add(&pwm->chip); in berlin_pwm_probe()
218 dev_err(&pdev->dev, "failed to add PWM chip: %d\n", ret); in berlin_pwm_probe()
219 clk_disable_unprepare(pwm->clk); in berlin_pwm_probe()
223 platform_set_drvdata(pdev, pwm); in berlin_pwm_probe()
230 struct berlin_pwm_chip *pwm = platform_get_drvdata(pdev); in berlin_pwm_remove() local
233 ret = pwmchip_remove(&pwm->chip); in berlin_pwm_remove()
234 clk_disable_unprepare(pwm->clk); in berlin_pwm_remove()
242 struct berlin_pwm_chip *pwm = dev_get_drvdata(dev); in berlin_pwm_suspend() local
245 for (i = 0; i < pwm->chip.npwm; i++) { in berlin_pwm_suspend()
248 channel = pwm_get_chip_data(&pwm->chip.pwms[i]); in berlin_pwm_suspend()
252 channel->enable = berlin_pwm_readl(pwm, i, BERLIN_PWM_ENABLE); in berlin_pwm_suspend()
253 channel->ctrl = berlin_pwm_readl(pwm, i, BERLIN_PWM_CONTROL); in berlin_pwm_suspend()
254 channel->duty = berlin_pwm_readl(pwm, i, BERLIN_PWM_DUTY); in berlin_pwm_suspend()
255 channel->tcnt = berlin_pwm_readl(pwm, i, BERLIN_PWM_TCNT); in berlin_pwm_suspend()
258 clk_disable_unprepare(pwm->clk); in berlin_pwm_suspend()
265 struct berlin_pwm_chip *pwm = dev_get_drvdata(dev); in berlin_pwm_resume() local
269 ret = clk_prepare_enable(pwm->clk); in berlin_pwm_resume()
273 for (i = 0; i < pwm->chip.npwm; i++) { in berlin_pwm_resume()
276 channel = pwm_get_chip_data(&pwm->chip.pwms[i]); in berlin_pwm_resume()
280 berlin_pwm_writel(pwm, i, channel->ctrl, BERLIN_PWM_CONTROL); in berlin_pwm_resume()
281 berlin_pwm_writel(pwm, i, channel->duty, BERLIN_PWM_DUTY); in berlin_pwm_resume()
282 berlin_pwm_writel(pwm, i, channel->tcnt, BERLIN_PWM_TCNT); in berlin_pwm_resume()
283 berlin_pwm_writel(pwm, i, channel->enable, BERLIN_PWM_ENABLE); in berlin_pwm_resume()
297 .name = "berlin-pwm",
305 MODULE_DESCRIPTION("Marvell Berlin PWM driver");