Lines Matching refs:pc

81 static int sti_pwm_get_prescale(struct sti_pwm_chip *pc, unsigned long period,  in sti_pwm_get_prescale()  argument
84 struct sti_pwm_compat_data *cdata = pc->cdata; in sti_pwm_get_prescale()
91 val = NSEC_PER_SEC / pc->clk_rate; in sti_pwm_get_prescale()
118 struct sti_pwm_chip *pc = to_sti_pwmchip(chip); in sti_pwm_config() local
119 struct sti_pwm_compat_data *cdata = pc->cdata; in sti_pwm_config()
120 struct pwm_device *cur = pc->cur; in sti_pwm_config()
121 struct device *dev = pc->dev; in sti_pwm_config()
127 ncfg = hweight_long(pc->configured); in sti_pwm_config()
147 ret = clk_enable(pc->clk); in sti_pwm_config()
152 ret = sti_pwm_get_prescale(pc, period_ns, &prescale); in sti_pwm_config()
157 regmap_field_write(pc->prescale_low, in sti_pwm_config()
163 regmap_field_write(pc->prescale_high, in sti_pwm_config()
177 ret = regmap_write(pc->regmap, STI_DS_REG(pwm->hwpwm), pwmvalx); in sti_pwm_config()
181 ret = regmap_field_write(pc->pwm_int_en, 0); in sti_pwm_config()
183 set_bit(pwm->hwpwm, &pc->configured); in sti_pwm_config()
184 pc->cur = pwm; in sti_pwm_config()
193 clk_disable(pc->clk); in sti_pwm_config()
199 struct sti_pwm_chip *pc = to_sti_pwmchip(chip); in sti_pwm_enable() local
200 struct device *dev = pc->dev; in sti_pwm_enable()
207 mutex_lock(&pc->sti_pwm_lock); in sti_pwm_enable()
208 if (!pc->en_count) { in sti_pwm_enable()
209 ret = clk_enable(pc->clk); in sti_pwm_enable()
213 ret = regmap_field_write(pc->pwm_en, 1); in sti_pwm_enable()
220 pc->en_count++; in sti_pwm_enable()
222 mutex_unlock(&pc->sti_pwm_lock); in sti_pwm_enable()
228 struct sti_pwm_chip *pc = to_sti_pwmchip(chip); in sti_pwm_disable() local
230 mutex_lock(&pc->sti_pwm_lock); in sti_pwm_disable()
231 if (--pc->en_count) { in sti_pwm_disable()
232 mutex_unlock(&pc->sti_pwm_lock); in sti_pwm_disable()
235 regmap_field_write(pc->pwm_en, 0); in sti_pwm_disable()
237 clk_disable(pc->clk); in sti_pwm_disable()
238 mutex_unlock(&pc->sti_pwm_lock); in sti_pwm_disable()
243 struct sti_pwm_chip *pc = to_sti_pwmchip(chip); in sti_pwm_free() local
245 clear_bit(pwm->hwpwm, &pc->configured); in sti_pwm_free()
256 static int sti_pwm_probe_dt(struct sti_pwm_chip *pc) in sti_pwm_probe_dt() argument
258 struct device *dev = pc->dev; in sti_pwm_probe_dt()
261 struct sti_pwm_compat_data *cdata = pc->cdata; in sti_pwm_probe_dt()
270 pc->prescale_low = devm_regmap_field_alloc(dev, pc->regmap, in sti_pwm_probe_dt()
272 if (IS_ERR(pc->prescale_low)) in sti_pwm_probe_dt()
273 return PTR_ERR(pc->prescale_low); in sti_pwm_probe_dt()
275 pc->prescale_high = devm_regmap_field_alloc(dev, pc->regmap, in sti_pwm_probe_dt()
277 if (IS_ERR(pc->prescale_high)) in sti_pwm_probe_dt()
278 return PTR_ERR(pc->prescale_high); in sti_pwm_probe_dt()
280 pc->pwm_en = devm_regmap_field_alloc(dev, pc->regmap, in sti_pwm_probe_dt()
282 if (IS_ERR(pc->pwm_en)) in sti_pwm_probe_dt()
283 return PTR_ERR(pc->pwm_en); in sti_pwm_probe_dt()
285 pc->pwm_int_en = devm_regmap_field_alloc(dev, pc->regmap, in sti_pwm_probe_dt()
287 if (IS_ERR(pc->pwm_int_en)) in sti_pwm_probe_dt()
288 return PTR_ERR(pc->pwm_int_en); in sti_pwm_probe_dt()
303 struct sti_pwm_chip *pc; in sti_pwm_probe() local
307 pc = devm_kzalloc(dev, sizeof(*pc), GFP_KERNEL); in sti_pwm_probe()
308 if (!pc) in sti_pwm_probe()
317 pc->mmio = devm_ioremap_resource(dev, res); in sti_pwm_probe()
318 if (IS_ERR(pc->mmio)) in sti_pwm_probe()
319 return PTR_ERR(pc->mmio); in sti_pwm_probe()
321 pc->regmap = devm_regmap_init_mmio(dev, pc->mmio, in sti_pwm_probe()
323 if (IS_ERR(pc->regmap)) in sti_pwm_probe()
324 return PTR_ERR(pc->regmap); in sti_pwm_probe()
335 pc->cdata = cdata; in sti_pwm_probe()
336 pc->dev = dev; in sti_pwm_probe()
337 pc->en_count = 0; in sti_pwm_probe()
338 mutex_init(&pc->sti_pwm_lock); in sti_pwm_probe()
340 ret = sti_pwm_probe_dt(pc); in sti_pwm_probe()
344 pc->clk = of_clk_get_by_name(dev->of_node, "pwm"); in sti_pwm_probe()
345 if (IS_ERR(pc->clk)) { in sti_pwm_probe()
347 return PTR_ERR(pc->clk); in sti_pwm_probe()
350 pc->clk_rate = clk_get_rate(pc->clk); in sti_pwm_probe()
351 if (!pc->clk_rate) { in sti_pwm_probe()
356 ret = clk_prepare(pc->clk); in sti_pwm_probe()
362 pc->chip.dev = dev; in sti_pwm_probe()
363 pc->chip.ops = &sti_pwm_ops; in sti_pwm_probe()
364 pc->chip.base = -1; in sti_pwm_probe()
365 pc->chip.npwm = pc->cdata->num_chan; in sti_pwm_probe()
366 pc->chip.can_sleep = true; in sti_pwm_probe()
368 ret = pwmchip_add(&pc->chip); in sti_pwm_probe()
370 clk_unprepare(pc->clk); in sti_pwm_probe()
374 platform_set_drvdata(pdev, pc); in sti_pwm_probe()
381 struct sti_pwm_chip *pc = platform_get_drvdata(pdev); in sti_pwm_remove() local
384 for (i = 0; i < pc->cdata->num_chan; i++) in sti_pwm_remove()
385 pwm_disable(&pc->chip.pwms[i]); in sti_pwm_remove()
387 clk_unprepare(pc->clk); in sti_pwm_remove()
389 return pwmchip_remove(&pc->chip); in sti_pwm_remove()