2 * Copyright (C) 2008 Nokia Corporation
4 * Based on lirc_serial.c
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 #include <linux/clk.h>
17 #include <linux/module.h>
18 #include <linux/platform_device.h>
19 #include <linux/wait.h>
20 #include <linux/pwm.h>
22 #include <linux/hrtimer.h>
24 #include <media/rc-core.h>
25 #include <linux/platform_data/media/ir-rx51.h>
31 struct pwm_device
*pwm
;
34 struct ir_rx51_platform_data
*pdata
;
35 wait_queue_head_t wqueue
;
37 unsigned int freq
; /* carrier frequency */
38 unsigned int duty_cycle
; /* carrier duty cycle */
41 unsigned long device_is_open
;
44 static inline void ir_rx51_on(struct ir_rx51
*ir_rx51
)
46 pwm_enable(ir_rx51
->pwm
);
49 static inline void ir_rx51_off(struct ir_rx51
*ir_rx51
)
51 pwm_disable(ir_rx51
->pwm
);
54 static int init_timing_params(struct ir_rx51
*ir_rx51
)
56 struct pwm_device
*pwm
= ir_rx51
->pwm
;
57 int duty
, period
= DIV_ROUND_CLOSEST(NSEC_PER_SEC
, ir_rx51
->freq
);
59 duty
= DIV_ROUND_CLOSEST(ir_rx51
->duty_cycle
* period
, 100);
61 pwm_config(pwm
, duty
, period
);
66 static enum hrtimer_restart
ir_rx51_timer_cb(struct hrtimer
*timer
)
68 struct ir_rx51
*ir_rx51
= container_of(timer
, struct ir_rx51
, timer
);
71 if (ir_rx51
->wbuf_index
< 0) {
72 dev_err_ratelimited(ir_rx51
->dev
,
73 "BUG wbuf_index has value of %i\n",
79 * If we happen to hit an odd latency spike, loop through the
80 * pulses until we catch up.
85 if (ir_rx51
->wbuf_index
>= WBUF_LEN
)
87 if (ir_rx51
->wbuf
[ir_rx51
->wbuf_index
] == -1)
90 if (ir_rx51
->wbuf_index
% 2)
95 ns
= US_TO_NS(ir_rx51
->wbuf
[ir_rx51
->wbuf_index
]);
96 hrtimer_add_expires_ns(timer
, ns
);
98 ir_rx51
->wbuf_index
++;
100 now
= timer
->base
->get_time();
102 } while (hrtimer_get_expires_tv64(timer
) < now
);
104 return HRTIMER_RESTART
;
107 ir_rx51_off(ir_rx51
);
108 ir_rx51
->wbuf_index
= -1;
110 wake_up_interruptible(&ir_rx51
->wqueue
);
112 return HRTIMER_NORESTART
;
115 static int ir_rx51_tx(struct rc_dev
*dev
, unsigned int *buffer
,
118 struct ir_rx51
*ir_rx51
= dev
->priv
;
120 if (count
> WBUF_LEN
)
123 memcpy(ir_rx51
->wbuf
, buffer
, count
* sizeof(unsigned int));
125 /* Wait any pending transfers to finish */
126 wait_event_interruptible(ir_rx51
->wqueue
, ir_rx51
->wbuf_index
< 0);
128 init_timing_params(ir_rx51
);
129 if (count
< WBUF_LEN
)
130 ir_rx51
->wbuf
[count
] = -1; /* Insert termination mark */
133 * Adjust latency requirements so the device doesn't go in too
136 ir_rx51
->pdata
->set_max_mpu_wakeup_lat(ir_rx51
->dev
, 50);
139 ir_rx51
->wbuf_index
= 1;
140 hrtimer_start(&ir_rx51
->timer
,
141 ns_to_ktime(US_TO_NS(ir_rx51
->wbuf
[0])),
144 * Don't return back to the userspace until the transfer has
147 wait_event_interruptible(ir_rx51
->wqueue
, ir_rx51
->wbuf_index
< 0);
149 /* We can sleep again */
150 ir_rx51
->pdata
->set_max_mpu_wakeup_lat(ir_rx51
->dev
, -1);
155 static int ir_rx51_open(struct rc_dev
*dev
)
157 struct ir_rx51
*ir_rx51
= dev
->priv
;
159 if (test_and_set_bit(1, &ir_rx51
->device_is_open
))
162 ir_rx51
->pwm
= pwm_get(ir_rx51
->dev
, NULL
);
163 if (IS_ERR(ir_rx51
->pwm
)) {
164 int res
= PTR_ERR(ir_rx51
->pwm
);
166 dev_err(ir_rx51
->dev
, "pwm_get failed: %d\n", res
);
173 static void ir_rx51_release(struct rc_dev
*dev
)
175 struct ir_rx51
*ir_rx51
= dev
->priv
;
177 hrtimer_cancel(&ir_rx51
->timer
);
178 ir_rx51_off(ir_rx51
);
179 pwm_put(ir_rx51
->pwm
);
181 clear_bit(1, &ir_rx51
->device_is_open
);
184 static struct ir_rx51 ir_rx51
= {
189 static int ir_rx51_set_duty_cycle(struct rc_dev
*dev
, u32 duty
)
191 struct ir_rx51
*ir_rx51
= dev
->priv
;
193 ir_rx51
->duty_cycle
= duty
;
198 static int ir_rx51_set_tx_carrier(struct rc_dev
*dev
, u32 carrier
)
200 struct ir_rx51
*ir_rx51
= dev
->priv
;
202 if (carrier
> 500000 || carrier
< 20000)
205 ir_rx51
->freq
= carrier
;
212 static int ir_rx51_suspend(struct platform_device
*dev
, pm_message_t state
)
215 * In case the device is still open, do not suspend. Normally
216 * this should not be a problem as lircd only keeps the device
217 * open only for short periods of time. We also don't want to
218 * get involved with race conditions that might happen if we
219 * were in a middle of a transmit. Thus, we defer any suspend
220 * actions until transmit has completed.
222 if (test_and_set_bit(1, &ir_rx51
.device_is_open
))
225 clear_bit(1, &ir_rx51
.device_is_open
);
230 static int ir_rx51_resume(struct platform_device
*dev
)
237 #define ir_rx51_suspend NULL
238 #define ir_rx51_resume NULL
240 #endif /* CONFIG_PM */
242 static int ir_rx51_probe(struct platform_device
*dev
)
244 struct pwm_device
*pwm
;
245 struct rc_dev
*rcdev
;
247 ir_rx51
.pdata
= dev
->dev
.platform_data
;
249 if (!ir_rx51
.pdata
) {
250 dev_err(&dev
->dev
, "Platform Data is missing\n");
254 pwm
= pwm_get(&dev
->dev
, NULL
);
256 int err
= PTR_ERR(pwm
);
258 if (err
!= -EPROBE_DEFER
)
259 dev_err(&dev
->dev
, "pwm_get failed: %d\n", err
);
263 /* Use default, in case userspace does not set the carrier */
264 ir_rx51
.freq
= DIV_ROUND_CLOSEST(pwm_get_period(pwm
), NSEC_PER_SEC
);
267 hrtimer_init(&ir_rx51
.timer
, CLOCK_MONOTONIC
, HRTIMER_MODE_REL
);
268 ir_rx51
.timer
.function
= ir_rx51_timer_cb
;
270 ir_rx51
.dev
= &dev
->dev
;
272 rcdev
= devm_rc_allocate_device(&dev
->dev
, RC_DRIVER_IR_RAW_TX
);
276 rcdev
->priv
= &ir_rx51
;
277 rcdev
->open
= ir_rx51_open
;
278 rcdev
->close
= ir_rx51_release
;
279 rcdev
->tx_ir
= ir_rx51_tx
;
280 rcdev
->s_tx_duty_cycle
= ir_rx51_set_duty_cycle
;
281 rcdev
->s_tx_carrier
= ir_rx51_set_tx_carrier
;
282 rcdev
->driver_name
= KBUILD_MODNAME
;
284 ir_rx51
.rcdev
= rcdev
;
286 return devm_rc_register_device(&dev
->dev
, ir_rx51
.rcdev
);
289 static int ir_rx51_remove(struct platform_device
*dev
)
294 static const struct of_device_id ir_rx51_match
[] = {
296 .compatible
= "nokia,n900-ir",
300 MODULE_DEVICE_TABLE(of
, ir_rx51_match
);
302 static struct platform_driver ir_rx51_platform_driver
= {
303 .probe
= ir_rx51_probe
,
304 .remove
= ir_rx51_remove
,
305 .suspend
= ir_rx51_suspend
,
306 .resume
= ir_rx51_resume
,
308 .name
= KBUILD_MODNAME
,
309 .of_match_table
= of_match_ptr(ir_rx51_match
),
312 module_platform_driver(ir_rx51_platform_driver
);
314 MODULE_DESCRIPTION("IR TX driver for Nokia RX51");
315 MODULE_AUTHOR("Nokia Corporation");
316 MODULE_LICENSE("GPL");