Lines Matching +full:timer +full:- +full:pwm
1 // SPDX-License-Identifier: GPL-2.0-or-later
11 #include <linux/pwm.h>
15 #include <media/rc-core.h>
21 struct pwm_device *pwm; member
22 struct hrtimer timer; member
35 pwm_enable(ir_rx51->pwm); in ir_rx51_on()
40 pwm_disable(ir_rx51->pwm); in ir_rx51_off()
45 struct pwm_device *pwm = ir_rx51->pwm; in init_timing_params() local
46 int duty, period = DIV_ROUND_CLOSEST(NSEC_PER_SEC, ir_rx51->freq); in init_timing_params()
48 duty = DIV_ROUND_CLOSEST(ir_rx51->duty_cycle * period, 100); in init_timing_params()
50 pwm_config(pwm, duty, period); in init_timing_params()
55 static enum hrtimer_restart ir_rx51_timer_cb(struct hrtimer *timer) in ir_rx51_timer_cb() argument
57 struct ir_rx51 *ir_rx51 = container_of(timer, struct ir_rx51, timer); in ir_rx51_timer_cb()
60 if (ir_rx51->wbuf_index < 0) { in ir_rx51_timer_cb()
61 dev_err_ratelimited(ir_rx51->dev, in ir_rx51_timer_cb()
63 ir_rx51->wbuf_index); in ir_rx51_timer_cb()
74 if (ir_rx51->wbuf_index >= WBUF_LEN) in ir_rx51_timer_cb()
76 if (ir_rx51->wbuf[ir_rx51->wbuf_index] == -1) in ir_rx51_timer_cb()
79 if (ir_rx51->wbuf_index % 2) in ir_rx51_timer_cb()
84 ns = US_TO_NS(ir_rx51->wbuf[ir_rx51->wbuf_index]); in ir_rx51_timer_cb()
85 hrtimer_add_expires_ns(timer, ns); in ir_rx51_timer_cb()
87 ir_rx51->wbuf_index++; in ir_rx51_timer_cb()
89 now = timer->base->get_time(); in ir_rx51_timer_cb()
91 } while (hrtimer_get_expires_tv64(timer) < now); in ir_rx51_timer_cb()
97 ir_rx51->wbuf_index = -1; in ir_rx51_timer_cb()
99 wake_up_interruptible(&ir_rx51->wqueue); in ir_rx51_timer_cb()
107 struct ir_rx51 *ir_rx51 = dev->priv; in ir_rx51_tx()
110 return -EINVAL; in ir_rx51_tx()
112 memcpy(ir_rx51->wbuf, buffer, count * sizeof(unsigned int)); in ir_rx51_tx()
115 wait_event_interruptible(ir_rx51->wqueue, ir_rx51->wbuf_index < 0); in ir_rx51_tx()
119 ir_rx51->wbuf[count] = -1; /* Insert termination mark */ in ir_rx51_tx()
127 ir_rx51->wbuf_index = 1; in ir_rx51_tx()
128 hrtimer_start(&ir_rx51->timer, in ir_rx51_tx()
129 ns_to_ktime(US_TO_NS(ir_rx51->wbuf[0])), in ir_rx51_tx()
135 wait_event_interruptible(ir_rx51->wqueue, ir_rx51->wbuf_index < 0); in ir_rx51_tx()
144 struct ir_rx51 *ir_rx51 = dev->priv; in ir_rx51_open()
146 if (test_and_set_bit(1, &ir_rx51->device_is_open)) in ir_rx51_open()
147 return -EBUSY; in ir_rx51_open()
149 ir_rx51->pwm = pwm_get(ir_rx51->dev, NULL); in ir_rx51_open()
150 if (IS_ERR(ir_rx51->pwm)) { in ir_rx51_open()
151 int res = PTR_ERR(ir_rx51->pwm); in ir_rx51_open()
153 dev_err(ir_rx51->dev, "pwm_get failed: %d\n", res); in ir_rx51_open()
162 struct ir_rx51 *ir_rx51 = dev->priv; in ir_rx51_release()
164 hrtimer_cancel(&ir_rx51->timer); in ir_rx51_release()
166 pwm_put(ir_rx51->pwm); in ir_rx51_release()
168 clear_bit(1, &ir_rx51->device_is_open); in ir_rx51_release()
173 .wbuf_index = -1,
178 struct ir_rx51 *ir_rx51 = dev->priv; in ir_rx51_set_duty_cycle()
180 ir_rx51->duty_cycle = duty; in ir_rx51_set_duty_cycle()
187 struct ir_rx51 *ir_rx51 = dev->priv; in ir_rx51_set_tx_carrier()
190 return -EINVAL; in ir_rx51_set_tx_carrier()
192 ir_rx51->freq = carrier; in ir_rx51_set_tx_carrier()
210 return -EAGAIN; in ir_rx51_suspend()
231 struct pwm_device *pwm; in ir_rx51_probe() local
234 pwm = pwm_get(&dev->dev, NULL); in ir_rx51_probe()
235 if (IS_ERR(pwm)) { in ir_rx51_probe()
236 int err = PTR_ERR(pwm); in ir_rx51_probe()
238 if (err != -EPROBE_DEFER) in ir_rx51_probe()
239 dev_err(&dev->dev, "pwm_get failed: %d\n", err); in ir_rx51_probe()
244 ir_rx51.freq = DIV_ROUND_CLOSEST_ULL(pwm_get_period(pwm), NSEC_PER_SEC); in ir_rx51_probe()
245 pwm_put(pwm); in ir_rx51_probe()
247 hrtimer_init(&ir_rx51.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); in ir_rx51_probe()
248 ir_rx51.timer.function = ir_rx51_timer_cb; in ir_rx51_probe()
250 ir_rx51.dev = &dev->dev; in ir_rx51_probe()
252 rcdev = devm_rc_allocate_device(&dev->dev, RC_DRIVER_IR_RAW_TX); in ir_rx51_probe()
254 return -ENOMEM; in ir_rx51_probe()
256 rcdev->priv = &ir_rx51; in ir_rx51_probe()
257 rcdev->open = ir_rx51_open; in ir_rx51_probe()
258 rcdev->close = ir_rx51_release; in ir_rx51_probe()
259 rcdev->tx_ir = ir_rx51_tx; in ir_rx51_probe()
260 rcdev->s_tx_duty_cycle = ir_rx51_set_duty_cycle; in ir_rx51_probe()
261 rcdev->s_tx_carrier = ir_rx51_set_tx_carrier; in ir_rx51_probe()
262 rcdev->driver_name = KBUILD_MODNAME; in ir_rx51_probe()
266 return devm_rc_register_device(&dev->dev, ir_rx51.rcdev); in ir_rx51_probe()
276 .compatible = "nokia,n900-ir",