Lines Matching +full:clk +full:- +full:pwm
12 #include <linux/clk.h>
21 #include <linux/pwm.h>
27 /* PWM registers and bits definitions */
47 * struct spear_pwm_chip - struct representing pwm chip
49 * @mmio_base: base address of pwm chip
50 * @clk: pointer to clk structure of pwm chip
51 * @chip: linux pwm chip representation
55 struct clk *clk; member
67 return readl_relaxed(chip->mmio_base + (num << 4) + offset); in spear_pwm_readl()
74 writel_relaxed(val, chip->mmio_base + (num << 4) + offset); in spear_pwm_writel()
77 static int spear_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, in spear_pwm_config() argument
95 clk_rate = clk_get_rate(pc->clk); in spear_pwm_config()
106 return -EINVAL; in spear_pwm_config()
114 return -EINVAL; in spear_pwm_config()
121 * NOTE: the clock to PWM has to be enabled first before writing to the in spear_pwm_config()
124 ret = clk_enable(pc->clk); in spear_pwm_config()
128 spear_pwm_writel(pc, pwm->hwpwm, PWMCR, in spear_pwm_config()
130 spear_pwm_writel(pc, pwm->hwpwm, PWMDCR, dc); in spear_pwm_config()
131 spear_pwm_writel(pc, pwm->hwpwm, PWMPCR, pv); in spear_pwm_config()
132 clk_disable(pc->clk); in spear_pwm_config()
137 static int spear_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) in spear_pwm_enable() argument
143 rc = clk_enable(pc->clk); in spear_pwm_enable()
147 val = spear_pwm_readl(pc, pwm->hwpwm, PWMCR); in spear_pwm_enable()
149 spear_pwm_writel(pc, pwm->hwpwm, PWMCR, val); in spear_pwm_enable()
154 static void spear_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) in spear_pwm_disable() argument
159 val = spear_pwm_readl(pc, pwm->hwpwm, PWMCR); in spear_pwm_disable()
161 spear_pwm_writel(pc, pwm->hwpwm, PWMCR, val); in spear_pwm_disable()
163 clk_disable(pc->clk); in spear_pwm_disable()
175 struct device_node *np = pdev->dev.of_node; in spear_pwm_probe()
181 pc = devm_kzalloc(&pdev->dev, sizeof(*pc), GFP_KERNEL); in spear_pwm_probe()
183 return -ENOMEM; in spear_pwm_probe()
186 pc->mmio_base = devm_ioremap_resource(&pdev->dev, r); in spear_pwm_probe()
187 if (IS_ERR(pc->mmio_base)) in spear_pwm_probe()
188 return PTR_ERR(pc->mmio_base); in spear_pwm_probe()
190 pc->clk = devm_clk_get(&pdev->dev, NULL); in spear_pwm_probe()
191 if (IS_ERR(pc->clk)) in spear_pwm_probe()
192 return PTR_ERR(pc->clk); in spear_pwm_probe()
196 pc->chip.dev = &pdev->dev; in spear_pwm_probe()
197 pc->chip.ops = &spear_pwm_ops; in spear_pwm_probe()
198 pc->chip.base = -1; in spear_pwm_probe()
199 pc->chip.npwm = NUM_PWM; in spear_pwm_probe()
201 ret = clk_prepare(pc->clk); in spear_pwm_probe()
205 if (of_device_is_compatible(np, "st,spear1340-pwm")) { in spear_pwm_probe()
206 ret = clk_enable(pc->clk); in spear_pwm_probe()
208 clk_unprepare(pc->clk); in spear_pwm_probe()
212 * Following enables PWM chip, channels would still be in spear_pwm_probe()
215 val = readl_relaxed(pc->mmio_base + PWMMCR); in spear_pwm_probe()
217 writel_relaxed(val, pc->mmio_base + PWMMCR); in spear_pwm_probe()
219 clk_disable(pc->clk); in spear_pwm_probe()
222 ret = pwmchip_add(&pc->chip); in spear_pwm_probe()
224 clk_unprepare(pc->clk); in spear_pwm_probe()
225 dev_err(&pdev->dev, "pwmchip_add() failed: %d\n", ret); in spear_pwm_probe()
235 /* clk was prepared in probe, hence unprepare it here */ in spear_pwm_remove()
236 clk_unprepare(pc->clk); in spear_pwm_remove()
237 return pwmchip_remove(&pc->chip); in spear_pwm_remove()
241 { .compatible = "st,spear320-pwm" },
242 { .compatible = "st,spear1340-pwm" },
250 .name = "spear-pwm",
262 MODULE_ALIAS("platform:spear-pwm");