Lines Matching +full:clk +full:- +full:pwm
2 * Marvell Berlin PWM driver
6 * Author: Antoine Tenart <antoine.tenart@free-electrons.com>
13 #include <linux/clk.h>
19 #include <linux/pwm.h>
51 struct clk *clk; member
63 return readl_relaxed(bpc->base + channel * 0x10 + offset); in berlin_pwm_readl()
70 writel_relaxed(value, bpc->base + channel * 0x10 + offset); in berlin_pwm_writel()
73 static int berlin_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) in berlin_pwm_request() argument
79 return -ENOMEM; in berlin_pwm_request()
81 return pwm_set_chip_data(pwm, channel); in berlin_pwm_request()
84 static void berlin_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) in berlin_pwm_free() argument
86 struct berlin_pwm_channel *channel = pwm_get_chip_data(pwm); in berlin_pwm_free()
91 static int berlin_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, in berlin_pwm_config() argument
99 cycles = clk_get_rate(bpc->clk); in berlin_pwm_config()
108 return -ERANGE; in berlin_pwm_config()
116 value = berlin_pwm_readl(bpc, pwm->hwpwm, BERLIN_PWM_CONTROL); in berlin_pwm_config()
121 berlin_pwm_writel(bpc, pwm->hwpwm, value, BERLIN_PWM_CONTROL); in berlin_pwm_config()
123 berlin_pwm_writel(bpc, pwm->hwpwm, duty, BERLIN_PWM_DUTY); in berlin_pwm_config()
124 berlin_pwm_writel(bpc, pwm->hwpwm, period, BERLIN_PWM_TCNT); in berlin_pwm_config()
130 struct pwm_device *pwm, in berlin_pwm_set_polarity() argument
136 value = berlin_pwm_readl(bpc, pwm->hwpwm, BERLIN_PWM_CONTROL); in berlin_pwm_set_polarity()
143 berlin_pwm_writel(bpc, pwm->hwpwm, value, BERLIN_PWM_CONTROL); in berlin_pwm_set_polarity()
148 static int berlin_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) in berlin_pwm_enable() argument
153 value = berlin_pwm_readl(bpc, pwm->hwpwm, BERLIN_PWM_EN); in berlin_pwm_enable()
155 berlin_pwm_writel(bpc, pwm->hwpwm, value, BERLIN_PWM_EN); in berlin_pwm_enable()
161 struct pwm_device *pwm) in berlin_pwm_disable() argument
166 value = berlin_pwm_readl(bpc, pwm->hwpwm, BERLIN_PWM_EN); in berlin_pwm_disable()
168 berlin_pwm_writel(bpc, pwm->hwpwm, value, BERLIN_PWM_EN); in berlin_pwm_disable()
171 static int berlin_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, in berlin_pwm_apply() argument
175 bool enabled = pwm->state.enabled; in berlin_pwm_apply()
177 if (state->polarity != pwm->state.polarity) { in berlin_pwm_apply()
179 berlin_pwm_disable(chip, pwm); in berlin_pwm_apply()
183 err = berlin_pwm_set_polarity(chip, pwm, state->polarity); in berlin_pwm_apply()
188 if (!state->enabled) { in berlin_pwm_apply()
190 berlin_pwm_disable(chip, pwm); in berlin_pwm_apply()
194 err = berlin_pwm_config(chip, pwm, state->duty_cycle, state->period); in berlin_pwm_apply()
199 return berlin_pwm_enable(chip, pwm); in berlin_pwm_apply()
212 { .compatible = "marvell,berlin-pwm" },
222 bpc = devm_kzalloc(&pdev->dev, sizeof(*bpc), GFP_KERNEL); in berlin_pwm_probe()
224 return -ENOMEM; in berlin_pwm_probe()
226 bpc->base = devm_platform_ioremap_resource(pdev, 0); in berlin_pwm_probe()
227 if (IS_ERR(bpc->base)) in berlin_pwm_probe()
228 return PTR_ERR(bpc->base); in berlin_pwm_probe()
230 bpc->clk = devm_clk_get(&pdev->dev, NULL); in berlin_pwm_probe()
231 if (IS_ERR(bpc->clk)) in berlin_pwm_probe()
232 return PTR_ERR(bpc->clk); in berlin_pwm_probe()
234 ret = clk_prepare_enable(bpc->clk); in berlin_pwm_probe()
238 bpc->chip.dev = &pdev->dev; in berlin_pwm_probe()
239 bpc->chip.ops = &berlin_pwm_ops; in berlin_pwm_probe()
240 bpc->chip.npwm = 4; in berlin_pwm_probe()
242 ret = pwmchip_add(&bpc->chip); in berlin_pwm_probe()
244 dev_err(&pdev->dev, "failed to add PWM chip: %d\n", ret); in berlin_pwm_probe()
245 clk_disable_unprepare(bpc->clk); in berlin_pwm_probe()
258 pwmchip_remove(&bpc->chip); in berlin_pwm_remove()
260 clk_disable_unprepare(bpc->clk); in berlin_pwm_remove()
269 for (i = 0; i < bpc->chip.npwm; i++) { in berlin_pwm_suspend()
272 channel = pwm_get_chip_data(&bpc->chip.pwms[i]); in berlin_pwm_suspend()
276 channel->enable = berlin_pwm_readl(bpc, i, BERLIN_PWM_ENABLE); in berlin_pwm_suspend()
277 channel->ctrl = berlin_pwm_readl(bpc, i, BERLIN_PWM_CONTROL); in berlin_pwm_suspend()
278 channel->duty = berlin_pwm_readl(bpc, i, BERLIN_PWM_DUTY); in berlin_pwm_suspend()
279 channel->tcnt = berlin_pwm_readl(bpc, i, BERLIN_PWM_TCNT); in berlin_pwm_suspend()
282 clk_disable_unprepare(bpc->clk); in berlin_pwm_suspend()
293 ret = clk_prepare_enable(bpc->clk); in berlin_pwm_resume()
297 for (i = 0; i < bpc->chip.npwm; i++) { in berlin_pwm_resume()
300 channel = pwm_get_chip_data(&bpc->chip.pwms[i]); in berlin_pwm_resume()
304 berlin_pwm_writel(bpc, i, channel->ctrl, BERLIN_PWM_CONTROL); in berlin_pwm_resume()
305 berlin_pwm_writel(bpc, i, channel->duty, BERLIN_PWM_DUTY); in berlin_pwm_resume()
306 berlin_pwm_writel(bpc, i, channel->tcnt, BERLIN_PWM_TCNT); in berlin_pwm_resume()
307 berlin_pwm_writel(bpc, i, channel->enable, BERLIN_PWM_ENABLE); in berlin_pwm_resume()
321 .name = "berlin-pwm",
328 MODULE_AUTHOR("Antoine Tenart <antoine.tenart@free-electrons.com>");
329 MODULE_DESCRIPTION("Marvell Berlin PWM driver");