Lines Matching +full:pwm +full:- +full:enable
2 * Marvell Berlin PWM driver
6 * Author: Antoine Tenart <antoine.tenart@free-electrons.com>
18 #include <linux/pwm.h>
42 u32 enable; member
62 return readl_relaxed(bpc->base + channel * 0x10 + offset); in berlin_pwm_readl()
69 writel_relaxed(value, bpc->base + channel * 0x10 + offset); in berlin_pwm_writel()
72 static int berlin_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) in berlin_pwm_request() argument
78 return -ENOMEM; in berlin_pwm_request()
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()
90 static int berlin_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, in berlin_pwm_config() argument
98 cycles = clk_get_rate(bpc->clk); in berlin_pwm_config()
107 return -ERANGE; in berlin_pwm_config()
115 value = berlin_pwm_readl(bpc, pwm->hwpwm, BERLIN_PWM_CONTROL); in berlin_pwm_config()
120 berlin_pwm_writel(bpc, pwm->hwpwm, value, BERLIN_PWM_CONTROL); in berlin_pwm_config()
122 berlin_pwm_writel(bpc, pwm->hwpwm, duty, BERLIN_PWM_DUTY); in berlin_pwm_config()
123 berlin_pwm_writel(bpc, pwm->hwpwm, period, BERLIN_PWM_TCNT); in berlin_pwm_config()
129 struct pwm_device *pwm, in berlin_pwm_set_polarity() argument
135 value = berlin_pwm_readl(bpc, pwm->hwpwm, BERLIN_PWM_CONTROL); in berlin_pwm_set_polarity()
142 berlin_pwm_writel(bpc, pwm->hwpwm, value, BERLIN_PWM_CONTROL); in berlin_pwm_set_polarity()
147 static int berlin_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) in berlin_pwm_enable() argument
152 value = berlin_pwm_readl(bpc, pwm->hwpwm, BERLIN_PWM_EN); in berlin_pwm_enable()
154 berlin_pwm_writel(bpc, pwm->hwpwm, value, BERLIN_PWM_EN); in berlin_pwm_enable()
160 struct pwm_device *pwm) in berlin_pwm_disable() argument
165 value = berlin_pwm_readl(bpc, pwm->hwpwm, BERLIN_PWM_EN); in berlin_pwm_disable()
167 berlin_pwm_writel(bpc, pwm->hwpwm, value, BERLIN_PWM_EN); in berlin_pwm_disable()
170 static int berlin_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, in berlin_pwm_apply() argument
174 bool enabled = pwm->state.enabled; in berlin_pwm_apply()
176 if (state->polarity != pwm->state.polarity) { in berlin_pwm_apply()
178 berlin_pwm_disable(chip, pwm); in berlin_pwm_apply()
182 err = berlin_pwm_set_polarity(chip, pwm, state->polarity); in berlin_pwm_apply()
187 if (!state->enabled) { in berlin_pwm_apply()
189 berlin_pwm_disable(chip, pwm); in berlin_pwm_apply()
193 err = berlin_pwm_config(chip, pwm, state->duty_cycle, state->period); in berlin_pwm_apply()
198 return berlin_pwm_enable(chip, pwm); in berlin_pwm_apply()
211 { .compatible = "marvell,berlin-pwm" },
221 bpc = devm_kzalloc(&pdev->dev, sizeof(*bpc), GFP_KERNEL); in berlin_pwm_probe()
223 return -ENOMEM; in berlin_pwm_probe()
225 bpc->base = devm_platform_ioremap_resource(pdev, 0); in berlin_pwm_probe()
226 if (IS_ERR(bpc->base)) in berlin_pwm_probe()
227 return PTR_ERR(bpc->base); in berlin_pwm_probe()
229 bpc->clk = devm_clk_get(&pdev->dev, NULL); in berlin_pwm_probe()
230 if (IS_ERR(bpc->clk)) in berlin_pwm_probe()
231 return PTR_ERR(bpc->clk); in berlin_pwm_probe()
233 ret = clk_prepare_enable(bpc->clk); in berlin_pwm_probe()
237 bpc->chip.dev = &pdev->dev; in berlin_pwm_probe()
238 bpc->chip.ops = &berlin_pwm_ops; in berlin_pwm_probe()
239 bpc->chip.npwm = 4; in berlin_pwm_probe()
241 ret = pwmchip_add(&bpc->chip); in berlin_pwm_probe()
243 dev_err(&pdev->dev, "failed to add PWM chip: %d\n", ret); in berlin_pwm_probe()
244 clk_disable_unprepare(bpc->clk); in berlin_pwm_probe()
257 pwmchip_remove(&bpc->chip); in berlin_pwm_remove()
259 clk_disable_unprepare(bpc->clk); in berlin_pwm_remove()
270 for (i = 0; i < bpc->chip.npwm; i++) { in berlin_pwm_suspend()
273 channel = pwm_get_chip_data(&bpc->chip.pwms[i]); in berlin_pwm_suspend()
277 channel->enable = berlin_pwm_readl(bpc, i, BERLIN_PWM_ENABLE); in berlin_pwm_suspend()
278 channel->ctrl = berlin_pwm_readl(bpc, i, BERLIN_PWM_CONTROL); in berlin_pwm_suspend()
279 channel->duty = berlin_pwm_readl(bpc, i, BERLIN_PWM_DUTY); in berlin_pwm_suspend()
280 channel->tcnt = berlin_pwm_readl(bpc, i, BERLIN_PWM_TCNT); in berlin_pwm_suspend()
283 clk_disable_unprepare(bpc->clk); in berlin_pwm_suspend()
294 ret = clk_prepare_enable(bpc->clk); in berlin_pwm_resume()
298 for (i = 0; i < bpc->chip.npwm; i++) { in berlin_pwm_resume()
301 channel = pwm_get_chip_data(&bpc->chip.pwms[i]); in berlin_pwm_resume()
305 berlin_pwm_writel(bpc, i, channel->ctrl, BERLIN_PWM_CONTROL); in berlin_pwm_resume()
306 berlin_pwm_writel(bpc, i, channel->duty, BERLIN_PWM_DUTY); in berlin_pwm_resume()
307 berlin_pwm_writel(bpc, i, channel->tcnt, BERLIN_PWM_TCNT); in berlin_pwm_resume()
308 berlin_pwm_writel(bpc, i, channel->enable, BERLIN_PWM_ENABLE); in berlin_pwm_resume()
322 .name = "berlin-pwm",
329 MODULE_AUTHOR("Antoine Tenart <antoine.tenart@free-electrons.com>");
330 MODULE_DESCRIPTION("Marvell Berlin PWM driver");