Lines Matching +full:bit +full:- +full:banged

14  * This driver adds a high-resolution timer based PWM driver. Since this is a
15 * bit-banged driver, accuracy will always depend on a lot of factors, such as
50 enum pwm_polarity polarity = pwm_get_polarity(pc->chip.pwms); in gpio_pwm_off()
52 gpiod_set_value(pc->gpiod, polarity ? 1 : 0); in gpio_pwm_off()
57 enum pwm_polarity polarity = pwm_get_polarity(pc->chip.pwms); in gpio_pwm_on()
59 gpiod_set_value(pc->gpiod, polarity ? 0 : 1); in gpio_pwm_on()
67 if (!pwm_is_enabled(pc->chip.pwms)) { in gpio_pwm_timer()
69 pc->pin_on = false; in gpio_pwm_timer()
73 if (!pc->pin_on) { in gpio_pwm_timer()
74 hrtimer_forward_now(&pc->timer, ns_to_ktime(pc->on_time)); in gpio_pwm_timer()
76 if (pc->on_time) { in gpio_pwm_timer()
78 pc->pin_on = true; in gpio_pwm_timer()
82 hrtimer_forward_now(&pc->timer, ns_to_ktime(pc->off_time)); in gpio_pwm_timer()
84 if (pc->off_time) { in gpio_pwm_timer()
86 pc->pin_on = false; in gpio_pwm_timer()
98 pc->on_time = duty_ns; in gpio_pwm_config()
99 pc->off_time = period_ns - duty_ns; in gpio_pwm_config()
114 if (pwm_is_enabled(pc->chip.pwms)) in gpio_pwm_enable()
115 return -EBUSY; in gpio_pwm_enable()
117 if (pc->off_time) { in gpio_pwm_enable()
118 hrtimer_start(&pc->timer, ktime_set(0, 0), HRTIMER_MODE_REL); in gpio_pwm_enable()
120 if (pc->on_time) in gpio_pwm_enable()
133 if (!pc->off_time) in gpio_pwm_disable()
150 pc = devm_kzalloc(&pdev->dev, sizeof(*pc), GFP_KERNEL); in gpio_pwm_probe()
152 return -ENOMEM; in gpio_pwm_probe()
154 pc->chip.dev = &pdev->dev; in gpio_pwm_probe()
155 pc->chip.ops = &gpio_pwm_ops; in gpio_pwm_probe()
156 pc->chip.base = -1; in gpio_pwm_probe()
157 pc->chip.npwm = 1; in gpio_pwm_probe()
158 pc->chip.of_xlate = of_pwm_xlate_with_flags; in gpio_pwm_probe()
159 pc->chip.of_pwm_n_cells = 3; in gpio_pwm_probe()
161 pc->gpiod = devm_gpiod_get(&pdev->dev, "pwm", GPIOD_OUT_LOW); in gpio_pwm_probe()
163 if (IS_ERR(pc->gpiod)) in gpio_pwm_probe()
164 return PTR_ERR(pc->gpiod); in gpio_pwm_probe()
166 hrtimer_init(&pc->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); in gpio_pwm_probe()
167 pc->timer.function = &gpio_pwm_timer; in gpio_pwm_probe()
168 pc->pin_on = false; in gpio_pwm_probe()
170 if (!hrtimer_is_hres_active(&pc->timer)) in gpio_pwm_probe()
171 dev_warn(&pdev->dev, "HR timer unavailable, restricting to " in gpio_pwm_probe()
174 ret = pwmchip_add(&pc->chip); in gpio_pwm_probe()
176 dev_err(&pdev->dev, "failed to add PWM chip: %d\n", ret); in gpio_pwm_probe()
188 hrtimer_cancel(&pc->timer); in gpio_pwm_remove()
189 return pwmchip_remove(&pc->chip); in gpio_pwm_remove()
194 { .compatible = "pwm-gpio", },
204 .name = "pwm-gpio",
211 MODULE_DESCRIPTION("Generic GPIO bit-banged PWM driver");