Lines Matching refs:pc

123 static int sti_pwm_get_prescale(struct sti_pwm_chip *pc, unsigned long period,
126 struct sti_pwm_compat_data *cdata = pc->cdata;
131 clk_rate = clk_get_rate(pc->pwm_clk);
133 dev_err(pc->dev, "failed to get clock rate\n");
167 struct sti_pwm_chip *pc = to_sti_pwmchip(chip);
168 struct sti_pwm_compat_data *cdata = pc->cdata;
170 struct pwm_device *cur = pc->cur;
171 struct device *dev = pc->dev;
175 ncfg = hweight_long(pc->configured);
196 ret = clk_enable(pc->pwm_clk);
200 ret = clk_enable(pc->cpt_clk);
205 ret = sti_pwm_get_prescale(pc, period_ns, &prescale);
211 ret = regmap_field_write(pc->prescale_low, value);
217 ret = regmap_field_write(pc->prescale_high, value);
230 ret = regmap_write(pc->regmap, PWM_OUT_VAL(pwm->hwpwm), value);
234 ret = regmap_field_write(pc->pwm_cpt_int_en, 0);
236 set_bit(pwm->hwpwm, &pc->configured);
237 pc->cur = pwm;
246 clk_disable(pc->pwm_clk);
247 clk_disable(pc->cpt_clk);
253 struct sti_pwm_chip *pc = to_sti_pwmchip(chip);
254 struct device *dev = pc->dev;
261 mutex_lock(&pc->sti_pwm_lock);
263 if (!pc->en_count) {
264 ret = clk_enable(pc->pwm_clk);
268 ret = clk_enable(pc->cpt_clk);
272 ret = regmap_field_write(pc->pwm_out_en, 1);
280 pc->en_count++;
283 mutex_unlock(&pc->sti_pwm_lock);
289 struct sti_pwm_chip *pc = to_sti_pwmchip(chip);
291 mutex_lock(&pc->sti_pwm_lock);
293 if (--pc->en_count) {
294 mutex_unlock(&pc->sti_pwm_lock);
298 regmap_field_write(pc->pwm_out_en, 0);
300 clk_disable(pc->pwm_clk);
301 clk_disable(pc->cpt_clk);
303 mutex_unlock(&pc->sti_pwm_lock);
308 struct sti_pwm_chip *pc = to_sti_pwmchip(chip);
310 clear_bit(pwm->hwpwm, &pc->configured);
316 struct sti_pwm_chip *pc = to_sti_pwmchip(chip);
317 struct sti_pwm_compat_data *cdata = pc->cdata;
319 struct device *dev = pc->dev;
333 regmap_write(pc->regmap, PWM_CPT_EDGE(pwm->hwpwm), CPT_EDGE_RISING);
334 regmap_field_write(pc->pwm_cpt_int_en, BIT(pwm->hwpwm));
337 ret = regmap_field_write(pc->pwm_cpt_en, 1);
347 regmap_write(pc->regmap, PWM_CPT_EDGE(pwm->hwpwm), CPT_EDGE_DISABLED);
372 effective_ticks = clk_get_rate(pc->cpt_clk);
389 regmap_field_write(pc->pwm_cpt_en, 0);
398 struct sti_pwm_chip *pc = to_sti_pwmchip(chip);
399 struct sti_pwm_compat_data *cdata = pc->cdata;
400 struct device *dev = pc->dev;
438 struct sti_pwm_chip *pc = data;
439 struct device *dev = pc->dev;
446 ret = regmap_field_read(pc->pwm_cpt_int_stat, &cpt_int_stat);
453 ddata = &pc->cdata->ddata[devicenum];
471 regmap_read(pc->regmap,
478 regmap_read(pc->regmap, PWM_CPT_EDGE(devicenum), &reg);
480 regmap_write(pc->regmap, PWM_CPT_EDGE(devicenum), reg);
486 regmap_write(pc->regmap,
502 regmap_write(pc->regmap, PWM_INT_ACK, PWM_INT_ACK_MASK);
507 static int sti_pwm_probe_dt(struct sti_pwm_chip *pc)
509 struct device *dev = pc->dev;
512 struct sti_pwm_compat_data *cdata = pc->cdata;
531 pc->prescale_low = devm_regmap_field_alloc(dev, pc->regmap,
533 if (IS_ERR(pc->prescale_low))
534 return PTR_ERR(pc->prescale_low);
536 pc->prescale_high = devm_regmap_field_alloc(dev, pc->regmap,
538 if (IS_ERR(pc->prescale_high))
539 return PTR_ERR(pc->prescale_high);
541 pc->pwm_out_en = devm_regmap_field_alloc(dev, pc->regmap,
543 if (IS_ERR(pc->pwm_out_en))
544 return PTR_ERR(pc->pwm_out_en);
546 pc->pwm_cpt_en = devm_regmap_field_alloc(dev, pc->regmap,
548 if (IS_ERR(pc->pwm_cpt_en))
549 return PTR_ERR(pc->pwm_cpt_en);
551 pc->pwm_cpt_int_en = devm_regmap_field_alloc(dev, pc->regmap,
553 if (IS_ERR(pc->pwm_cpt_int_en))
554 return PTR_ERR(pc->pwm_cpt_int_en);
556 pc->pwm_cpt_int_stat = devm_regmap_field_alloc(dev, pc->regmap,
558 if (PTR_ERR_OR_ZERO(pc->pwm_cpt_int_stat))
559 return PTR_ERR(pc->pwm_cpt_int_stat);
574 struct sti_pwm_chip *pc;
578 pc = devm_kzalloc(dev, sizeof(*pc), GFP_KERNEL);
579 if (!pc)
586 pc->mmio = devm_platform_ioremap_resource(pdev, 0);
587 if (IS_ERR(pc->mmio))
588 return PTR_ERR(pc->mmio);
590 pc->regmap = devm_regmap_init_mmio(dev, pc->mmio,
592 if (IS_ERR(pc->regmap))
593 return PTR_ERR(pc->regmap);
600 pdev->name, pc);
616 pc->cdata = cdata;
617 pc->dev = dev;
618 pc->en_count = 0;
619 mutex_init(&pc->sti_pwm_lock);
621 ret = sti_pwm_probe_dt(pc);
626 pc->pwm_clk = of_clk_get_by_name(dev->of_node, "pwm");
627 if (IS_ERR(pc->pwm_clk)) {
629 return PTR_ERR(pc->pwm_clk);
632 ret = clk_prepare(pc->pwm_clk);
640 pc->cpt_clk = of_clk_get_by_name(dev->of_node, "capture");
641 if (IS_ERR(pc->cpt_clk)) {
643 return PTR_ERR(pc->cpt_clk);
646 ret = clk_prepare(pc->cpt_clk);
657 pc->chip.dev = dev;
658 pc->chip.ops = &sti_pwm_ops;
659 pc->chip.npwm = max(cdata->pwm_num_devs, cdata->cpt_num_devs);
668 ret = pwmchip_add(&pc->chip);
670 clk_unprepare(pc->pwm_clk);
671 clk_unprepare(pc->cpt_clk);
675 platform_set_drvdata(pdev, pc);
682 struct sti_pwm_chip *pc = platform_get_drvdata(pdev);
684 pwmchip_remove(&pc->chip);
686 clk_unprepare(pc->pwm_clk);
687 clk_unprepare(pc->cpt_clk);