• Home
  • Raw
  • Download

Lines Matching +full:jz4770 +full:- +full:pwm

2  *  Copyright (C) 2010, Lars-Peter Clausen <lars@metafoo.de>
3 * JZ4740 platform PWM support
23 #include <linux/pwm.h>
25 #include <asm/mach-jz4740/timer.h>
39 static int jz4740_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) in jz4740_pwm_request() argument
45 if (pwm->hwpwm < 2) in jz4740_pwm_request()
46 return -EBUSY; in jz4740_pwm_request()
48 jz4740_timer_start(pwm->hwpwm); in jz4740_pwm_request()
53 static void jz4740_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) in jz4740_pwm_free() argument
55 jz4740_timer_set_ctrl(pwm->hwpwm, 0); in jz4740_pwm_free()
57 jz4740_timer_stop(pwm->hwpwm); in jz4740_pwm_free()
60 static int jz4740_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) in jz4740_pwm_enable() argument
62 uint32_t ctrl = jz4740_timer_get_ctrl(pwm->pwm); in jz4740_pwm_enable()
65 jz4740_timer_set_ctrl(pwm->hwpwm, ctrl); in jz4740_pwm_enable()
66 jz4740_timer_enable(pwm->hwpwm); in jz4740_pwm_enable()
71 static void jz4740_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) in jz4740_pwm_disable() argument
73 uint32_t ctrl = jz4740_timer_get_ctrl(pwm->hwpwm); in jz4740_pwm_disable()
75 /* Disable PWM output. in jz4740_pwm_disable()
80 jz4740_timer_set_ctrl(pwm->hwpwm, ctrl); in jz4740_pwm_disable()
83 jz4740_timer_disable(pwm->hwpwm); in jz4740_pwm_disable()
86 static int jz4740_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, in jz4740_pwm_config() argument
89 struct jz4740_pwm_chip *jz4740 = to_jz4740(pwm->chip); in jz4740_pwm_config()
96 tmp = (unsigned long long)clk_get_rate(jz4740->clk) * period_ns; in jz4740_pwm_config()
106 return -EINVAL; in jz4740_pwm_config()
110 duty = period - tmp; in jz4740_pwm_config()
113 duty = period - 1; in jz4740_pwm_config()
115 is_enabled = jz4740_timer_is_enabled(pwm->hwpwm); in jz4740_pwm_config()
117 jz4740_pwm_disable(chip, pwm); in jz4740_pwm_config()
119 jz4740_timer_set_count(pwm->hwpwm, 0); in jz4740_pwm_config()
120 jz4740_timer_set_duty(pwm->hwpwm, duty); in jz4740_pwm_config()
121 jz4740_timer_set_period(pwm->hwpwm, period); in jz4740_pwm_config()
126 jz4740_timer_set_ctrl(pwm->hwpwm, ctrl); in jz4740_pwm_config()
129 jz4740_pwm_enable(chip, pwm); in jz4740_pwm_config()
135 struct pwm_device *pwm, enum pwm_polarity polarity) in jz4740_pwm_set_polarity() argument
137 uint32_t ctrl = jz4740_timer_get_ctrl(pwm->pwm); in jz4740_pwm_set_polarity()
148 jz4740_timer_set_ctrl(pwm->hwpwm, ctrl); in jz4740_pwm_set_polarity()
166 jz4740 = devm_kzalloc(&pdev->dev, sizeof(*jz4740), GFP_KERNEL); in jz4740_pwm_probe()
168 return -ENOMEM; in jz4740_pwm_probe()
170 jz4740->clk = devm_clk_get(&pdev->dev, "ext"); in jz4740_pwm_probe()
171 if (IS_ERR(jz4740->clk)) in jz4740_pwm_probe()
172 return PTR_ERR(jz4740->clk); in jz4740_pwm_probe()
174 jz4740->chip.dev = &pdev->dev; in jz4740_pwm_probe()
175 jz4740->chip.ops = &jz4740_pwm_ops; in jz4740_pwm_probe()
176 jz4740->chip.npwm = NUM_PWM; in jz4740_pwm_probe()
177 jz4740->chip.base = -1; in jz4740_pwm_probe()
178 jz4740->chip.of_xlate = of_pwm_xlate_with_flags; in jz4740_pwm_probe()
179 jz4740->chip.of_pwm_n_cells = 3; in jz4740_pwm_probe()
183 return pwmchip_add(&jz4740->chip); in jz4740_pwm_probe()
190 return pwmchip_remove(&jz4740->chip); in jz4740_pwm_remove()
195 { .compatible = "ingenic,jz4740-pwm", },
196 { .compatible = "ingenic,jz4770-pwm", },
197 { .compatible = "ingenic,jz4780-pwm", },
205 .name = "jz4740-pwm",
213 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
214 MODULE_DESCRIPTION("Ingenic JZ4740 PWM driver");
215 MODULE_ALIAS("platform:jz4740-pwm");