Lines Matching +full:bcm7038 +full:- +full:pwm
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Broadcom BCM7038 PWM driver
19 #include <linux/pwm.h>
41 * Maximum control word value allowed when variable-frequency PWM is used as a
42 * clock for the constant-frequency PMW.
65 return __raw_readl(p->base + offset); in brcmstb_pwm_readl()
67 return readl_relaxed(p->base + offset); in brcmstb_pwm_readl()
74 __raw_writel(value, p->base + offset); in brcmstb_pwm_writel()
76 writel_relaxed(value, p->base + offset); in brcmstb_pwm_writel()
88 * W = cword, if cword < 2 ^ 15 else 16-bit 2's complement of cword
90 * Fv = W x 2 ^ -16 x 27Mhz (reference clock)
94 * The PWM core framework specifies that the "duty_ns" parameter is in fact the
97 static int brcmstb_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, in brcmstb_pwm_config() argument
102 unsigned int channel = pwm->hwpwm; in brcmstb_pwm_config()
112 pc = PWM_ON_PERIOD_MAX - 1; in brcmstb_pwm_config()
123 rate = (u64)clk_get_rate(p->clk) * (u64)cword; in brcmstb_pwm_config()
139 return -EINVAL; in brcmstb_pwm_config()
158 return -EINVAL; in brcmstb_pwm_config()
167 spin_lock(&p->lock); in brcmstb_pwm_config()
179 spin_unlock(&p->lock); in brcmstb_pwm_config()
190 spin_lock(&p->lock); in brcmstb_pwm_enable_set()
202 spin_unlock(&p->lock); in brcmstb_pwm_enable_set()
205 static int brcmstb_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) in brcmstb_pwm_enable() argument
209 brcmstb_pwm_enable_set(p, pwm->hwpwm, true); in brcmstb_pwm_enable()
214 static void brcmstb_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) in brcmstb_pwm_disable() argument
218 brcmstb_pwm_enable_set(p, pwm->hwpwm, false); in brcmstb_pwm_disable()
229 { .compatible = "brcm,bcm7038-pwm", },
240 p = devm_kzalloc(&pdev->dev, sizeof(*p), GFP_KERNEL); in brcmstb_pwm_probe()
242 return -ENOMEM; in brcmstb_pwm_probe()
244 spin_lock_init(&p->lock); in brcmstb_pwm_probe()
246 p->clk = devm_clk_get(&pdev->dev, NULL); in brcmstb_pwm_probe()
247 if (IS_ERR(p->clk)) { in brcmstb_pwm_probe()
248 dev_err(&pdev->dev, "failed to obtain clock\n"); in brcmstb_pwm_probe()
249 return PTR_ERR(p->clk); in brcmstb_pwm_probe()
252 ret = clk_prepare_enable(p->clk); in brcmstb_pwm_probe()
254 dev_err(&pdev->dev, "failed to enable clock: %d\n", ret); in brcmstb_pwm_probe()
260 p->chip.dev = &pdev->dev; in brcmstb_pwm_probe()
261 p->chip.ops = &brcmstb_pwm_ops; in brcmstb_pwm_probe()
262 p->chip.base = -1; in brcmstb_pwm_probe()
263 p->chip.npwm = 2; in brcmstb_pwm_probe()
266 p->base = devm_ioremap_resource(&pdev->dev, res); in brcmstb_pwm_probe()
267 if (IS_ERR(p->base)) { in brcmstb_pwm_probe()
268 ret = PTR_ERR(p->base); in brcmstb_pwm_probe()
272 ret = pwmchip_add(&p->chip); in brcmstb_pwm_probe()
274 dev_err(&pdev->dev, "failed to add PWM chip: %d\n", ret); in brcmstb_pwm_probe()
281 clk_disable_unprepare(p->clk); in brcmstb_pwm_probe()
290 ret = pwmchip_remove(&p->chip); in brcmstb_pwm_remove()
291 clk_disable_unprepare(p->clk); in brcmstb_pwm_remove()
301 clk_disable_unprepare(p->clk); in brcmstb_pwm_suspend()
310 clk_prepare_enable(p->clk); in brcmstb_pwm_resume()
323 .name = "pwm-brcmstb",
331 MODULE_DESCRIPTION("Broadcom STB PWM driver");
332 MODULE_ALIAS("platform:pwm-brcmstb");