Lines Matching full:pc

103 	struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip);  in rockchip_pwm_get_state()  local
104 u32 enable_conf = pc->data->enable_conf; in rockchip_pwm_get_state()
110 if (!pc->oneshot_en) { in rockchip_pwm_get_state()
111 ret = clk_enable(pc->pclk); in rockchip_pwm_get_state()
116 dclk_div = pc->oneshot_en ? 2 : 1; in rockchip_pwm_get_state()
118 tmp = readl_relaxed(pc->base + pc->data->regs.period); in rockchip_pwm_get_state()
119 tmp *= dclk_div * pc->data->prescaler * NSEC_PER_SEC; in rockchip_pwm_get_state()
120 state->period = DIV_ROUND_CLOSEST_ULL(tmp, pc->clk_rate); in rockchip_pwm_get_state()
122 tmp = readl_relaxed(pc->base + pc->data->regs.duty); in rockchip_pwm_get_state()
123 tmp *= dclk_div * pc->data->prescaler * NSEC_PER_SEC; in rockchip_pwm_get_state()
124 state->duty_cycle = DIV_ROUND_CLOSEST_ULL(tmp, pc->clk_rate); in rockchip_pwm_get_state()
126 val = readl_relaxed(pc->base + pc->data->regs.ctrl); in rockchip_pwm_get_state()
127 if (pc->oneshot_en) in rockchip_pwm_get_state()
131 if (pc->data->supports_polarity && !(val & PWM_DUTY_POSITIVE)) in rockchip_pwm_get_state()
136 if (!pc->oneshot_en) in rockchip_pwm_get_state()
137 clk_disable(pc->pclk); in rockchip_pwm_get_state()
142 struct rockchip_pwm_chip *pc = data; in rockchip_pwm_oneshot_irq() local
144 unsigned int id = pc->channel_id; in rockchip_pwm_oneshot_irq()
149 val = readl_relaxed(pc->base + PWM_REG_INTSTS(id)); in rockchip_pwm_oneshot_irq()
154 writel_relaxed(PWM_CH_INT(id), pc->base + PWM_REG_INTSTS(id)); in rockchip_pwm_oneshot_irq()
159 pwm_get_state(&pc->chip.pwms[0], &state); in rockchip_pwm_oneshot_irq()
161 pwm_apply_state(&pc->chip.pwms[0], &state); in rockchip_pwm_oneshot_irq()
163 rockchip_pwm_oneshot_callback(&pc->chip.pwms[0], &state); in rockchip_pwm_oneshot_irq()
171 struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip); in rockchip_pwm_config() local
188 div = (u64)pc->clk_rate * state->period; in rockchip_pwm_config()
189 period = DIV_ROUND_CLOSEST_ULL(div, dclk_div * pc->data->prescaler * NSEC_PER_SEC); in rockchip_pwm_config()
191 div = (u64)pc->clk_rate * state->duty_cycle; in rockchip_pwm_config()
192 duty = DIV_ROUND_CLOSEST_ULL(div, dclk_div * pc->data->prescaler * NSEC_PER_SEC); in rockchip_pwm_config()
199 ctrl = readl_relaxed(pc->base + pc->data->regs.ctrl); in rockchip_pwm_config()
200 if (pc->data->vop_pwm) { in rockchip_pwm_config()
201 if (pc->vop_pwm_en) in rockchip_pwm_config()
224 pc->oneshot_en = true; in rockchip_pwm_config()
231 int_ctrl = readl_relaxed(pc->base + PWM_REG_INT_EN(pc->channel_id)); in rockchip_pwm_config()
232 int_ctrl |= PWM_CH_INT(pc->channel_id); in rockchip_pwm_config()
233 writel_relaxed(int_ctrl, pc->base + PWM_REG_INT_EN(pc->channel_id)); in rockchip_pwm_config()
244 pc->oneshot_en = false; in rockchip_pwm_config()
250 int_ctrl = readl_relaxed(pc->base + PWM_REG_INT_EN(pc->channel_id)); in rockchip_pwm_config()
251 int_ctrl &= ~PWM_CH_INT(pc->channel_id); in rockchip_pwm_config()
252 writel_relaxed(int_ctrl, pc->base + PWM_REG_INT_EN(pc->channel_id)); in rockchip_pwm_config()
256 if (pc->data->supports_lock) { in rockchip_pwm_config()
258 writel_relaxed(ctrl, pc->base + pc->data->regs.ctrl); in rockchip_pwm_config()
261 writel(period, pc->base + pc->data->regs.period); in rockchip_pwm_config()
262 writel(duty, pc->base + pc->data->regs.duty); in rockchip_pwm_config()
264 if (pc->data->supports_polarity) { in rockchip_pwm_config()
277 if (pc->data->supports_lock) in rockchip_pwm_config()
280 writel(ctrl, pc->base + pc->data->regs.ctrl); in rockchip_pwm_config()
288 struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip); in rockchip_pwm_enable() local
289 u32 enable_conf = pc->data->enable_conf; in rockchip_pwm_enable()
294 ret = clk_enable(pc->clk); in rockchip_pwm_enable()
299 val = readl_relaxed(pc->base + pc->data->regs.ctrl); in rockchip_pwm_enable()
300 val &= ~pc->data->enable_conf_mask; in rockchip_pwm_enable()
302 if (PWM_OUTPUT_CENTER & pc->data->enable_conf_mask) { in rockchip_pwm_enable()
303 if (pc->center_aligned) in rockchip_pwm_enable()
309 if (pc->oneshot_en) in rockchip_pwm_enable()
315 writel_relaxed(val, pc->base + pc->data->regs.ctrl); in rockchip_pwm_enable()
316 if (pc->data->vop_pwm) in rockchip_pwm_enable()
317 pc->vop_pwm_en = enable; in rockchip_pwm_enable()
320 clk_disable(pc->clk); in rockchip_pwm_enable()
328 struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip); in rockchip_pwm_apply() local
333 if (!pc->oneshot_en) { in rockchip_pwm_apply()
334 ret = clk_enable(pc->pclk); in rockchip_pwm_apply()
343 !pc->data->supports_lock) { in rockchip_pwm_apply()
358 ret = pinctrl_select_state(pc->pinctrl, pc->active_state); in rockchip_pwm_apply()
360 if (!pc->oneshot_en) in rockchip_pwm_apply()
361 clk_disable(pc->pclk); in rockchip_pwm_apply()
454 struct rockchip_pwm_chip *pc; in rockchip_pwm_probe() local
464 pc = devm_kzalloc(&pdev->dev, sizeof(*pc), GFP_KERNEL); in rockchip_pwm_probe()
465 if (!pc) in rockchip_pwm_probe()
469 pc->base = devm_ioremap(&pdev->dev, r->start, in rockchip_pwm_probe()
471 if (IS_ERR(pc->base)) in rockchip_pwm_probe()
472 return PTR_ERR(pc->base); in rockchip_pwm_probe()
474 pc->clk = devm_clk_get(&pdev->dev, "pwm"); in rockchip_pwm_probe()
475 if (IS_ERR(pc->clk)) { in rockchip_pwm_probe()
476 pc->clk = devm_clk_get(&pdev->dev, NULL); in rockchip_pwm_probe()
477 if (IS_ERR(pc->clk)) in rockchip_pwm_probe()
478 return dev_err_probe(&pdev->dev, PTR_ERR(pc->clk), in rockchip_pwm_probe()
485 pc->pclk = devm_clk_get(&pdev->dev, "pclk"); in rockchip_pwm_probe()
487 pc->pclk = pc->clk; in rockchip_pwm_probe()
489 if (IS_ERR(pc->pclk)) { in rockchip_pwm_probe()
490 ret = PTR_ERR(pc->pclk); in rockchip_pwm_probe()
496 ret = clk_prepare_enable(pc->clk); in rockchip_pwm_probe()
502 ret = clk_prepare_enable(pc->pclk); in rockchip_pwm_probe()
508 pc->channel_id = rockchip_pwm_get_channel_id(pdev->dev.of_node->full_name); in rockchip_pwm_probe()
509 if (pc->channel_id < 0 || pc->channel_id >= PWM_MAX_CHANNEL_NUM) { in rockchip_pwm_probe()
510 dev_err(&pdev->dev, "Channel id is out of range: %d\n", pc->channel_id); in rockchip_pwm_probe()
516 pc->irq = platform_get_irq(pdev, 0); in rockchip_pwm_probe()
517 if (pc->irq < 0) { in rockchip_pwm_probe()
519 ret = pc->irq; in rockchip_pwm_probe()
523 ret = devm_request_irq(&pdev->dev, pc->irq, rockchip_pwm_oneshot_irq, in rockchip_pwm_probe()
525 "rk_pwm_oneshot_irq", pc); in rockchip_pwm_probe()
532 pc->pinctrl = devm_pinctrl_get(&pdev->dev); in rockchip_pwm_probe()
533 if (IS_ERR(pc->pinctrl)) { in rockchip_pwm_probe()
535 ret = PTR_ERR(pc->pinctrl); in rockchip_pwm_probe()
539 pc->active_state = pinctrl_lookup_state(pc->pinctrl, "active"); in rockchip_pwm_probe()
540 if (IS_ERR(pc->active_state)) { in rockchip_pwm_probe()
542 ret = PTR_ERR(pc->active_state); in rockchip_pwm_probe()
546 platform_set_drvdata(pdev, pc); in rockchip_pwm_probe()
548 pc->data = id->data; in rockchip_pwm_probe()
549 pc->chip.dev = &pdev->dev; in rockchip_pwm_probe()
550 pc->chip.ops = &rockchip_pwm_ops; in rockchip_pwm_probe()
551 pc->chip.base = of_alias_get_id(pdev->dev.of_node, "pwm"); in rockchip_pwm_probe()
552 pc->chip.npwm = 1; in rockchip_pwm_probe()
553 pc->clk_rate = clk_get_rate(pc->clk); in rockchip_pwm_probe()
555 if (pc->data->supports_polarity) { in rockchip_pwm_probe()
556 pc->chip.of_xlate = of_pwm_xlate_with_flags; in rockchip_pwm_probe()
557 pc->chip.of_pwm_n_cells = 3; in rockchip_pwm_probe()
560 enable_conf = pc->data->enable_conf; in rockchip_pwm_probe()
561 ctrl = readl_relaxed(pc->base + pc->data->regs.ctrl); in rockchip_pwm_probe()
564 pc->center_aligned = in rockchip_pwm_probe()
567 ret = pwmchip_add(&pc->chip); in rockchip_pwm_probe()
575 clk_disable(pc->clk); in rockchip_pwm_probe()
577 clk_disable(pc->pclk); in rockchip_pwm_probe()
582 clk_disable_unprepare(pc->pclk); in rockchip_pwm_probe()
584 clk_disable_unprepare(pc->clk); in rockchip_pwm_probe()
591 struct rockchip_pwm_chip *pc = platform_get_drvdata(pdev); in rockchip_pwm_remove() local
599 pwm_get_state(&pc->chip.pwms[0], &state); in rockchip_pwm_remove()
601 if (pc->oneshot_en) { in rockchip_pwm_remove()
602 if (readl_poll_timeout(pc->base + pc->data->regs.ctrl, in rockchip_pwm_remove()
607 pwm_apply_state(&pc->chip.pwms[0], &state); in rockchip_pwm_remove()
611 if (pc->oneshot_en) in rockchip_pwm_remove()
612 clk_disable(pc->pclk); in rockchip_pwm_remove()
613 clk_unprepare(pc->pclk); in rockchip_pwm_remove()
614 clk_unprepare(pc->clk); in rockchip_pwm_remove()
616 return pwmchip_remove(&pc->chip); in rockchip_pwm_remove()