Lines Matching refs:chip
83 struct pwm_chip chip; member
109 struct samsung_pwm_chip *to_samsung_pwm_chip(struct pwm_chip *chip) in to_samsung_pwm_chip() argument
111 return container_of(chip, struct samsung_pwm_chip, chip); in to_samsung_pwm_chip()
140 static int pwm_samsung_is_tdiv(struct samsung_pwm_chip *chip, unsigned int chan) in pwm_samsung_is_tdiv() argument
142 struct samsung_pwm_variant *variant = &chip->variant; in pwm_samsung_is_tdiv()
145 reg = readl(chip->base + REG_TCFG1); in pwm_samsung_is_tdiv()
152 static unsigned long pwm_samsung_get_tin_rate(struct samsung_pwm_chip *chip, in pwm_samsung_get_tin_rate() argument
158 rate = clk_get_rate(chip->base_clk); in pwm_samsung_get_tin_rate()
160 reg = readl(chip->base + REG_TCFG0); in pwm_samsung_get_tin_rate()
168 static unsigned long pwm_samsung_calc_tin(struct samsung_pwm_chip *chip, in pwm_samsung_calc_tin() argument
171 struct samsung_pwm_variant *variant = &chip->variant; in pwm_samsung_calc_tin()
176 if (!pwm_samsung_is_tdiv(chip, chan)) { in pwm_samsung_calc_tin()
177 clk = (chan < 2) ? chip->tclk0 : chip->tclk1; in pwm_samsung_calc_tin()
184 dev_warn(chip->chip.dev, in pwm_samsung_calc_tin()
188 rate = pwm_samsung_get_tin_rate(chip, chan); in pwm_samsung_calc_tin()
189 dev_dbg(chip->chip.dev, "tin parent at %lu\n", rate); in pwm_samsung_calc_tin()
200 pwm_samsung_set_divisor(chip, chan, BIT(div)); in pwm_samsung_calc_tin()
205 static int pwm_samsung_request(struct pwm_chip *chip, struct pwm_device *pwm) in pwm_samsung_request() argument
207 struct samsung_pwm_chip *our_chip = to_samsung_pwm_chip(chip); in pwm_samsung_request()
211 dev_warn(chip->dev, in pwm_samsung_request()
217 our_chan = devm_kzalloc(chip->dev, sizeof(*our_chan), GFP_KERNEL); in pwm_samsung_request()
226 static void pwm_samsung_free(struct pwm_chip *chip, struct pwm_device *pwm) in pwm_samsung_free() argument
228 devm_kfree(chip->dev, pwm_get_chip_data(pwm)); in pwm_samsung_free()
232 static int pwm_samsung_enable(struct pwm_chip *chip, struct pwm_device *pwm) in pwm_samsung_enable() argument
234 struct samsung_pwm_chip *our_chip = to_samsung_pwm_chip(chip); in pwm_samsung_enable()
256 static void pwm_samsung_disable(struct pwm_chip *chip, struct pwm_device *pwm) in pwm_samsung_disable() argument
258 struct samsung_pwm_chip *our_chip = to_samsung_pwm_chip(chip); in pwm_samsung_disable()
272 static void pwm_samsung_manual_update(struct samsung_pwm_chip *chip, in pwm_samsung_manual_update() argument
281 tcon = readl(chip->base + REG_TCON); in pwm_samsung_manual_update()
283 writel(tcon, chip->base + REG_TCON); in pwm_samsung_manual_update()
286 writel(tcon, chip->base + REG_TCON); in pwm_samsung_manual_update()
291 static int pwm_samsung_config(struct pwm_chip *chip, struct pwm_device *pwm, in pwm_samsung_config() argument
294 struct samsung_pwm_chip *our_chip = to_samsung_pwm_chip(chip); in pwm_samsung_config()
322 dev_dbg(our_chip->chip.dev, "duty_ns=%d, period_ns=%d (%u)\n", in pwm_samsung_config()
327 dev_dbg(our_chip->chip.dev, "tin_rate=%lu\n", tin_rate); in pwm_samsung_config()
351 dev_dbg(our_chip->chip.dev, in pwm_samsung_config()
364 dev_dbg(our_chip->chip.dev, "Forcing manual update"); in pwm_samsung_config()
375 static void pwm_samsung_set_invert(struct samsung_pwm_chip *chip, in pwm_samsung_set_invert() argument
384 tcon = readl(chip->base + REG_TCON); in pwm_samsung_set_invert()
387 chip->inverter_mask |= BIT(channel); in pwm_samsung_set_invert()
390 chip->inverter_mask &= ~BIT(channel); in pwm_samsung_set_invert()
394 writel(tcon, chip->base + REG_TCON); in pwm_samsung_set_invert()
399 static int pwm_samsung_set_polarity(struct pwm_chip *chip, in pwm_samsung_set_polarity() argument
403 struct samsung_pwm_chip *our_chip = to_samsung_pwm_chip(chip); in pwm_samsung_set_polarity()
460 static int pwm_samsung_parse_dt(struct samsung_pwm_chip *chip) in pwm_samsung_parse_dt() argument
462 struct device_node *np = chip->chip.dev->of_node; in pwm_samsung_parse_dt()
472 memcpy(&chip->variant, match->data, sizeof(chip->variant)); in pwm_samsung_parse_dt()
476 dev_err(chip->chip.dev, in pwm_samsung_parse_dt()
481 chip->variant.output_mask |= BIT(val); in pwm_samsung_parse_dt()
487 static int pwm_samsung_parse_dt(struct samsung_pwm_chip *chip) in pwm_samsung_parse_dt() argument
496 struct samsung_pwm_chip *chip; in pwm_samsung_probe() local
501 chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL); in pwm_samsung_probe()
502 if (chip == NULL) in pwm_samsung_probe()
505 chip->chip.dev = &pdev->dev; in pwm_samsung_probe()
506 chip->chip.ops = &pwm_samsung_ops; in pwm_samsung_probe()
507 chip->chip.base = -1; in pwm_samsung_probe()
508 chip->chip.npwm = SAMSUNG_PWM_NUM; in pwm_samsung_probe()
509 chip->inverter_mask = BIT(SAMSUNG_PWM_NUM) - 1; in pwm_samsung_probe()
512 ret = pwm_samsung_parse_dt(chip); in pwm_samsung_probe()
516 chip->chip.of_xlate = of_pwm_xlate_with_flags; in pwm_samsung_probe()
517 chip->chip.of_pwm_n_cells = 3; in pwm_samsung_probe()
524 memcpy(&chip->variant, pdev->dev.platform_data, in pwm_samsung_probe()
525 sizeof(chip->variant)); in pwm_samsung_probe()
529 chip->base = devm_ioremap_resource(&pdev->dev, res); in pwm_samsung_probe()
530 if (IS_ERR(chip->base)) in pwm_samsung_probe()
531 return PTR_ERR(chip->base); in pwm_samsung_probe()
533 chip->base_clk = devm_clk_get(&pdev->dev, "timers"); in pwm_samsung_probe()
534 if (IS_ERR(chip->base_clk)) { in pwm_samsung_probe()
536 return PTR_ERR(chip->base_clk); in pwm_samsung_probe()
539 ret = clk_prepare_enable(chip->base_clk); in pwm_samsung_probe()
546 if (chip->variant.output_mask & BIT(chan)) in pwm_samsung_probe()
547 pwm_samsung_set_invert(chip, chan, true); in pwm_samsung_probe()
550 chip->tclk0 = devm_clk_get(&pdev->dev, "pwm-tclk0"); in pwm_samsung_probe()
551 chip->tclk1 = devm_clk_get(&pdev->dev, "pwm-tclk1"); in pwm_samsung_probe()
553 platform_set_drvdata(pdev, chip); in pwm_samsung_probe()
555 ret = pwmchip_add(&chip->chip); in pwm_samsung_probe()
558 clk_disable_unprepare(chip->base_clk); in pwm_samsung_probe()
563 clk_get_rate(chip->base_clk), in pwm_samsung_probe()
564 !IS_ERR(chip->tclk0) ? clk_get_rate(chip->tclk0) : 0, in pwm_samsung_probe()
565 !IS_ERR(chip->tclk1) ? clk_get_rate(chip->tclk1) : 0); in pwm_samsung_probe()
572 struct samsung_pwm_chip *chip = platform_get_drvdata(pdev); in pwm_samsung_remove() local
575 ret = pwmchip_remove(&chip->chip); in pwm_samsung_remove()
579 clk_disable_unprepare(chip->base_clk); in pwm_samsung_remove()
587 struct samsung_pwm_chip *chip = dev_get_drvdata(dev); in pwm_samsung_suspend() local
596 struct pwm_device *pwm = &chip->chip.pwms[i]; in pwm_samsung_suspend()
611 struct samsung_pwm_chip *chip = dev_get_drvdata(dev); in pwm_samsung_resume() local
619 if (chip->variant.output_mask & BIT(chan)) in pwm_samsung_resume()
620 pwm_samsung_set_invert(chip, chan, in pwm_samsung_resume()
621 chip->inverter_mask & BIT(chan)); in pwm_samsung_resume()