brcm2708: update linux 4.4 patches to latest version
[openwrt/staging/wigyori.git] / target / linux / brcm2708 / patches-4.4 / 0042-lirc-added-support-for-RaspberryPi-GPIO.patch
1 From e39854b38284178a8c63b4dc160d5883c2ce0a42 Mon Sep 17 00:00:00 2001
2 From: Aron Szabo <aron@aron.ws>
3 Date: Sat, 16 Jun 2012 12:15:55 +0200
4 Subject: [PATCH] lirc: added support for RaspberryPi GPIO
5
6 lirc_rpi: Use read_current_timer to determine transmitter delay. Thanks to jjmz and others
7 See: https://github.com/raspberrypi/linux/issues/525
8
9 lirc: Remove restriction on gpio pins that can be used with lirc
10
11 Compute Module, for example could use different pins
12
13 lirc_rpi: Add parameter to specify input pin pull
14
15 Depending on the connected IR circuitry it might be desirable to change the
16 gpios internal pull from it pull-down default behaviour. Add a module
17 parameter to allow the user to set it explicitly.
18
19 Signed-off-by: Julian Scheel <julian@jusst.de>
20
21 lirc-rpi: Use the higher-level irq control functions
22
23 This module used to access the irq_chip methods of the
24 gpio controller directly, rather than going through the
25 standard enable_irq/irq_set_irq_type functions. This
26 caused problems on pinctrl-bcm2835 which only implements
27 the irq_enable/disable methods and not irq_unmask/mask.
28
29 lirc-rpi: Correct the interrupt usage
30
31 1) Correct the use of enable_irq (i.e. don't call it so often)
32 2) Correct the shutdown sequence.
33 3) Avoid a bcm2708_gpio driver quirk by setting the irq flags earlier
34
35 lirc-rpi: use getnstimeofday instead of read_current_timer
36
37 read_current_timer isn't guaranteed to return values in
38 microseconds, and indeed it doesn't on a Pi2.
39
40 Issue: linux#827
41
42 lirc-rpi: Add device tree support, and a suitable overlay
43
44 The overlay supports DT parameters that match the old module
45 parameters, except that gpio_in_pull should be set using the
46 strings "up", "down" or "off".
47
48 lirc-rpi: Also support pinctrl-bcm2835 in non-DT mode
49 ---
50 drivers/staging/media/lirc/Kconfig | 6 +
51 drivers/staging/media/lirc/Makefile | 1 +
52 drivers/staging/media/lirc/lirc_rpi.c | 730 ++++++++++++++++++++++++++++++++++
53 include/linux/platform_data/bcm2708.h | 23 ++
54 4 files changed, 760 insertions(+)
55 create mode 100644 drivers/staging/media/lirc/lirc_rpi.c
56 create mode 100644 include/linux/platform_data/bcm2708.h
57
58 --- a/drivers/staging/media/lirc/Kconfig
59 +++ b/drivers/staging/media/lirc/Kconfig
60 @@ -32,6 +32,12 @@ config LIRC_PARALLEL
61 help
62 Driver for Homebrew Parallel Port Receivers
63
64 +config LIRC_RPI
65 + tristate "Homebrew GPIO Port Receiver/Transmitter for the RaspberryPi"
66 + depends on LIRC
67 + help
68 + Driver for Homebrew GPIO Port Receiver/Transmitter for the RaspberryPi
69 +
70 config LIRC_SASEM
71 tristate "Sasem USB IR Remote"
72 depends on LIRC && USB
73 --- a/drivers/staging/media/lirc/Makefile
74 +++ b/drivers/staging/media/lirc/Makefile
75 @@ -6,6 +6,7 @@
76 obj-$(CONFIG_LIRC_BT829) += lirc_bt829.o
77 obj-$(CONFIG_LIRC_IMON) += lirc_imon.o
78 obj-$(CONFIG_LIRC_PARALLEL) += lirc_parallel.o
79 +obj-$(CONFIG_LIRC_RPI) += lirc_rpi.o
80 obj-$(CONFIG_LIRC_SASEM) += lirc_sasem.o
81 obj-$(CONFIG_LIRC_SERIAL) += lirc_serial.o
82 obj-$(CONFIG_LIRC_SIR) += lirc_sir.o
83 --- /dev/null
84 +++ b/drivers/staging/media/lirc/lirc_rpi.c
85 @@ -0,0 +1,730 @@
86 +/*
87 + * lirc_rpi.c
88 + *
89 + * lirc_rpi - Device driver that records pulse- and pause-lengths
90 + * (space-lengths) (just like the lirc_serial driver does)
91 + * between GPIO interrupt events on the Raspberry Pi.
92 + * Lots of code has been taken from the lirc_serial module,
93 + * so I would like say thanks to the authors.
94 + *
95 + * Copyright (C) 2012 Aron Robert Szabo <aron@reon.hu>,
96 + * Michael Bishop <cleverca22@gmail.com>
97 + * This program is free software; you can redistribute it and/or modify
98 + * it under the terms of the GNU General Public License as published by
99 + * the Free Software Foundation; either version 2 of the License, or
100 + * (at your option) any later version.
101 + *
102 + * This program is distributed in the hope that it will be useful,
103 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
104 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
105 + * GNU General Public License for more details.
106 + *
107 + * You should have received a copy of the GNU General Public License
108 + * along with this program; if not, write to the Free Software
109 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
110 + */
111 +
112 +#include <linux/module.h>
113 +#include <linux/errno.h>
114 +#include <linux/interrupt.h>
115 +#include <linux/sched.h>
116 +#include <linux/kernel.h>
117 +#include <linux/time.h>
118 +#include <linux/timex.h>
119 +#include <linux/timekeeping.h>
120 +#include <linux/string.h>
121 +#include <linux/delay.h>
122 +#include <linux/platform_device.h>
123 +#include <linux/irq.h>
124 +#include <linux/spinlock.h>
125 +#include <media/lirc.h>
126 +#include <media/lirc_dev.h>
127 +#include <linux/gpio.h>
128 +#include <linux/of_platform.h>
129 +#include <linux/platform_data/bcm2708.h>
130 +
131 +#define LIRC_DRIVER_NAME "lirc_rpi"
132 +#define RBUF_LEN 256
133 +#define LIRC_TRANSMITTER_LATENCY 50
134 +
135 +#ifndef MAX_UDELAY_MS
136 +#define MAX_UDELAY_US 5000
137 +#else
138 +#define MAX_UDELAY_US (MAX_UDELAY_MS*1000)
139 +#endif
140 +
141 +#define dprintk(fmt, args...) \
142 + do { \
143 + if (debug) \
144 + printk(KERN_DEBUG LIRC_DRIVER_NAME ": " \
145 + fmt, ## args); \
146 + } while (0)
147 +
148 +/* module parameters */
149 +
150 +/* set the default GPIO input pin */
151 +static int gpio_in_pin = 18;
152 +/* set the default pull behaviour for input pin */
153 +static int gpio_in_pull = BCM2708_PULL_DOWN;
154 +/* set the default GPIO output pin */
155 +static int gpio_out_pin = 17;
156 +/* enable debugging messages */
157 +static bool debug;
158 +/* -1 = auto, 0 = active high, 1 = active low */
159 +static int sense = -1;
160 +/* use softcarrier by default */
161 +static bool softcarrier = 1;
162 +/* 0 = do not invert output, 1 = invert output */
163 +static bool invert = 0;
164 +
165 +struct gpio_chip *gpiochip;
166 +static int irq_num;
167 +
168 +/* forward declarations */
169 +static long send_pulse(unsigned long length);
170 +static void send_space(long length);
171 +static void lirc_rpi_exit(void);
172 +
173 +static struct platform_device *lirc_rpi_dev;
174 +static struct timeval lasttv = { 0, 0 };
175 +static struct lirc_buffer rbuf;
176 +static spinlock_t lock;
177 +
178 +/* initialized/set in init_timing_params() */
179 +static unsigned int freq = 38000;
180 +static unsigned int duty_cycle = 50;
181 +static unsigned long period;
182 +static unsigned long pulse_width;
183 +static unsigned long space_width;
184 +
185 +static void safe_udelay(unsigned long usecs)
186 +{
187 + while (usecs > MAX_UDELAY_US) {
188 + udelay(MAX_UDELAY_US);
189 + usecs -= MAX_UDELAY_US;
190 + }
191 + udelay(usecs);
192 +}
193 +
194 +static unsigned long read_current_us(void)
195 +{
196 + struct timespec now;
197 + getnstimeofday(&now);
198 + return (now.tv_sec * 1000000) + (now.tv_nsec/1000);
199 +}
200 +
201 +static int init_timing_params(unsigned int new_duty_cycle,
202 + unsigned int new_freq)
203 +{
204 + if (1000 * 1000000L / new_freq * new_duty_cycle / 100 <=
205 + LIRC_TRANSMITTER_LATENCY)
206 + return -EINVAL;
207 + if (1000 * 1000000L / new_freq * (100 - new_duty_cycle) / 100 <=
208 + LIRC_TRANSMITTER_LATENCY)
209 + return -EINVAL;
210 + duty_cycle = new_duty_cycle;
211 + freq = new_freq;
212 + period = 1000 * 1000000L / freq;
213 + pulse_width = period * duty_cycle / 100;
214 + space_width = period - pulse_width;
215 + dprintk("in init_timing_params, freq=%d pulse=%ld, "
216 + "space=%ld\n", freq, pulse_width, space_width);
217 + return 0;
218 +}
219 +
220 +static long send_pulse_softcarrier(unsigned long length)
221 +{
222 + int flag;
223 + unsigned long actual, target;
224 + unsigned long actual_us, initial_us, target_us;
225 +
226 + length *= 1000;
227 +
228 + actual = 0; target = 0; flag = 0;
229 + actual_us = read_current_us();
230 +
231 + while (actual < length) {
232 + if (flag) {
233 + gpiochip->set(gpiochip, gpio_out_pin, invert);
234 + target += space_width;
235 + } else {
236 + gpiochip->set(gpiochip, gpio_out_pin, !invert);
237 + target += pulse_width;
238 + }
239 + initial_us = actual_us;
240 + target_us = actual_us + (target - actual) / 1000;
241 + /*
242 + * Note - we've checked in ioctl that the pulse/space
243 + * widths are big enough so that d is > 0
244 + */
245 + if ((int)(target_us - actual_us) > 0)
246 + udelay(target_us - actual_us);
247 + actual_us = read_current_us();
248 + actual += (actual_us - initial_us) * 1000;
249 + flag = !flag;
250 + }
251 + return (actual-length) / 1000;
252 +}
253 +
254 +static long send_pulse(unsigned long length)
255 +{
256 + if (length <= 0)
257 + return 0;
258 +
259 + if (softcarrier) {
260 + return send_pulse_softcarrier(length);
261 + } else {
262 + gpiochip->set(gpiochip, gpio_out_pin, !invert);
263 + safe_udelay(length);
264 + return 0;
265 + }
266 +}
267 +
268 +static void send_space(long length)
269 +{
270 + gpiochip->set(gpiochip, gpio_out_pin, invert);
271 + if (length <= 0)
272 + return;
273 + safe_udelay(length);
274 +}
275 +
276 +static void rbwrite(int l)
277 +{
278 + if (lirc_buffer_full(&rbuf)) {
279 + /* no new signals will be accepted */
280 + dprintk("Buffer overrun\n");
281 + return;
282 + }
283 + lirc_buffer_write(&rbuf, (void *)&l);
284 +}
285 +
286 +static void frbwrite(int l)
287 +{
288 + /* simple noise filter */
289 + static int pulse, space;
290 + static unsigned int ptr;
291 +
292 + if (ptr > 0 && (l & PULSE_BIT)) {
293 + pulse += l & PULSE_MASK;
294 + if (pulse > 250) {
295 + rbwrite(space);
296 + rbwrite(pulse | PULSE_BIT);
297 + ptr = 0;
298 + pulse = 0;
299 + }
300 + return;
301 + }
302 + if (!(l & PULSE_BIT)) {
303 + if (ptr == 0) {
304 + if (l > 20000) {
305 + space = l;
306 + ptr++;
307 + return;
308 + }
309 + } else {
310 + if (l > 20000) {
311 + space += pulse;
312 + if (space > PULSE_MASK)
313 + space = PULSE_MASK;
314 + space += l;
315 + if (space > PULSE_MASK)
316 + space = PULSE_MASK;
317 + pulse = 0;
318 + return;
319 + }
320 + rbwrite(space);
321 + rbwrite(pulse | PULSE_BIT);
322 + ptr = 0;
323 + pulse = 0;
324 + }
325 + }
326 + rbwrite(l);
327 +}
328 +
329 +static irqreturn_t irq_handler(int i, void *blah, struct pt_regs *regs)
330 +{
331 + struct timeval tv;
332 + long deltv;
333 + int data;
334 + int signal;
335 +
336 + /* use the GPIO signal level */
337 + signal = gpiochip->get(gpiochip, gpio_in_pin);
338 +
339 + if (sense != -1) {
340 + /* get current time */
341 + do_gettimeofday(&tv);
342 +
343 + /* calc time since last interrupt in microseconds */
344 + deltv = tv.tv_sec-lasttv.tv_sec;
345 + if (tv.tv_sec < lasttv.tv_sec ||
346 + (tv.tv_sec == lasttv.tv_sec &&
347 + tv.tv_usec < lasttv.tv_usec)) {
348 + printk(KERN_WARNING LIRC_DRIVER_NAME
349 + ": AIEEEE: your clock just jumped backwards\n");
350 + printk(KERN_WARNING LIRC_DRIVER_NAME
351 + ": %d %d %lx %lx %lx %lx\n", signal, sense,
352 + tv.tv_sec, lasttv.tv_sec,
353 + tv.tv_usec, lasttv.tv_usec);
354 + data = PULSE_MASK;
355 + } else if (deltv > 15) {
356 + data = PULSE_MASK; /* really long time */
357 + if (!(signal^sense)) {
358 + /* sanity check */
359 + printk(KERN_WARNING LIRC_DRIVER_NAME
360 + ": AIEEEE: %d %d %lx %lx %lx %lx\n",
361 + signal, sense, tv.tv_sec, lasttv.tv_sec,
362 + tv.tv_usec, lasttv.tv_usec);
363 + /*
364 + * detecting pulse while this
365 + * MUST be a space!
366 + */
367 + sense = sense ? 0 : 1;
368 + }
369 + } else {
370 + data = (int) (deltv*1000000 +
371 + (tv.tv_usec - lasttv.tv_usec));
372 + }
373 + frbwrite(signal^sense ? data : (data|PULSE_BIT));
374 + lasttv = tv;
375 + wake_up_interruptible(&rbuf.wait_poll);
376 + }
377 +
378 + return IRQ_HANDLED;
379 +}
380 +
381 +static int is_right_chip(struct gpio_chip *chip, void *data)
382 +{
383 + dprintk("is_right_chip %s %d\n", chip->label, strcmp(data, chip->label));
384 +
385 + if (strcmp(data, chip->label) == 0)
386 + return 1;
387 + return 0;
388 +}
389 +
390 +static inline int read_bool_property(const struct device_node *np,
391 + const char *propname,
392 + bool *out_value)
393 +{
394 + u32 value = 0;
395 + int err = of_property_read_u32(np, propname, &value);
396 + if (err == 0)
397 + *out_value = (value != 0);
398 + return err;
399 +}
400 +
401 +static void read_pin_settings(struct device_node *node)
402 +{
403 + u32 pin;
404 + int index;
405 +
406 + for (index = 0;
407 + of_property_read_u32_index(
408 + node,
409 + "brcm,pins",
410 + index,
411 + &pin) == 0;
412 + index++) {
413 + u32 function;
414 + int err;
415 + err = of_property_read_u32_index(
416 + node,
417 + "brcm,function",
418 + index,
419 + &function);
420 + if (err == 0) {
421 + if (function == 1) /* Output */
422 + gpio_out_pin = pin;
423 + else if (function == 0) /* Input */
424 + gpio_in_pin = pin;
425 + }
426 + }
427 +}
428 +
429 +static int init_port(void)
430 +{
431 + int i, nlow, nhigh;
432 + struct device_node *node;
433 +
434 + node = lirc_rpi_dev->dev.of_node;
435 +
436 + gpiochip = gpiochip_find("bcm2708_gpio", is_right_chip);
437 +
438 + /*
439 + * Because of the lack of a setpull function, only support
440 + * pinctrl-bcm2835 if using device tree.
441 + */
442 + if (!gpiochip && node)
443 + gpiochip = gpiochip_find("pinctrl-bcm2835", is_right_chip);
444 +
445 + if (!gpiochip) {
446 + pr_err(LIRC_DRIVER_NAME ": gpio chip not found!\n");
447 + return -ENODEV;
448 + }
449 +
450 + if (node) {
451 + struct device_node *pins_node;
452 +
453 + pins_node = of_parse_phandle(node, "pinctrl-0", 0);
454 + if (!pins_node) {
455 + printk(KERN_ERR LIRC_DRIVER_NAME
456 + ": pinctrl settings not found!\n");
457 + return -EINVAL;
458 + }
459 +
460 + read_pin_settings(pins_node);
461 +
462 + of_property_read_u32(node, "rpi,sense", &sense);
463 +
464 + read_bool_property(node, "rpi,softcarrier", &softcarrier);
465 +
466 + read_bool_property(node, "rpi,invert", &invert);
467 +
468 + read_bool_property(node, "rpi,debug", &debug);
469 +
470 + } else {
471 + return -EINVAL;
472 + }
473 +
474 + gpiochip->set(gpiochip, gpio_out_pin, invert);
475 +
476 + irq_num = gpiochip->to_irq(gpiochip, gpio_in_pin);
477 + dprintk("to_irq %d\n", irq_num);
478 +
479 + /* if pin is high, then this must be an active low receiver. */
480 + if (sense == -1) {
481 + /* wait 1/2 sec for the power supply */
482 + msleep(500);
483 +
484 + /*
485 + * probe 9 times every 0.04s, collect "votes" for
486 + * active high/low
487 + */
488 + nlow = 0;
489 + nhigh = 0;
490 + for (i = 0; i < 9; i++) {
491 + if (gpiochip->get(gpiochip, gpio_in_pin))
492 + nlow++;
493 + else
494 + nhigh++;
495 + msleep(40);
496 + }
497 + sense = (nlow >= nhigh ? 1 : 0);
498 + printk(KERN_INFO LIRC_DRIVER_NAME
499 + ": auto-detected active %s receiver on GPIO pin %d\n",
500 + sense ? "low" : "high", gpio_in_pin);
501 + } else {
502 + printk(KERN_INFO LIRC_DRIVER_NAME
503 + ": manually using active %s receiver on GPIO pin %d\n",
504 + sense ? "low" : "high", gpio_in_pin);
505 + }
506 +
507 + return 0;
508 +}
509 +
510 +// called when the character device is opened
511 +static int set_use_inc(void *data)
512 +{
513 + int result;
514 +
515 + /* initialize timestamp */
516 + do_gettimeofday(&lasttv);
517 +
518 + result = request_irq(irq_num,
519 + (irq_handler_t) irq_handler,
520 + IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING,
521 + LIRC_DRIVER_NAME, (void*) 0);
522 +
523 + switch (result) {
524 + case -EBUSY:
525 + printk(KERN_ERR LIRC_DRIVER_NAME
526 + ": IRQ %d is busy\n",
527 + irq_num);
528 + return -EBUSY;
529 + case -EINVAL:
530 + printk(KERN_ERR LIRC_DRIVER_NAME
531 + ": Bad irq number or handler\n");
532 + return -EINVAL;
533 + default:
534 + dprintk("Interrupt %d obtained\n",
535 + irq_num);
536 + break;
537 + };
538 +
539 + /* initialize pulse/space widths */
540 + init_timing_params(duty_cycle, freq);
541 +
542 + return 0;
543 +}
544 +
545 +static void set_use_dec(void *data)
546 +{
547 + /* GPIO Pin Falling/Rising Edge Detect Disable */
548 + irq_set_irq_type(irq_num, 0);
549 + disable_irq(irq_num);
550 +
551 + free_irq(irq_num, (void *) 0);
552 +
553 + dprintk(KERN_INFO LIRC_DRIVER_NAME
554 + ": freed IRQ %d\n", irq_num);
555 +}
556 +
557 +static ssize_t lirc_write(struct file *file, const char *buf,
558 + size_t n, loff_t *ppos)
559 +{
560 + int i, count;
561 + unsigned long flags;
562 + long delta = 0;
563 + int *wbuf;
564 +
565 + count = n / sizeof(int);
566 + if (n % sizeof(int) || count % 2 == 0)
567 + return -EINVAL;
568 + wbuf = memdup_user(buf, n);
569 + if (IS_ERR(wbuf))
570 + return PTR_ERR(wbuf);
571 + spin_lock_irqsave(&lock, flags);
572 +
573 + for (i = 0; i < count; i++) {
574 + if (i%2)
575 + send_space(wbuf[i] - delta);
576 + else
577 + delta = send_pulse(wbuf[i]);
578 + }
579 + gpiochip->set(gpiochip, gpio_out_pin, invert);
580 +
581 + spin_unlock_irqrestore(&lock, flags);
582 + kfree(wbuf);
583 + return n;
584 +}
585 +
586 +static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
587 +{
588 + int result;
589 + __u32 value;
590 +
591 + switch (cmd) {
592 + case LIRC_GET_SEND_MODE:
593 + return -ENOIOCTLCMD;
594 + break;
595 +
596 + case LIRC_SET_SEND_MODE:
597 + result = get_user(value, (__u32 *) arg);
598 + if (result)
599 + return result;
600 + /* only LIRC_MODE_PULSE supported */
601 + if (value != LIRC_MODE_PULSE)
602 + return -ENOSYS;
603 + break;
604 +
605 + case LIRC_GET_LENGTH:
606 + return -ENOSYS;
607 + break;
608 +
609 + case LIRC_SET_SEND_DUTY_CYCLE:
610 + dprintk("SET_SEND_DUTY_CYCLE\n");
611 + result = get_user(value, (__u32 *) arg);
612 + if (result)
613 + return result;
614 + if (value <= 0 || value > 100)
615 + return -EINVAL;
616 + return init_timing_params(value, freq);
617 + break;
618 +
619 + case LIRC_SET_SEND_CARRIER:
620 + dprintk("SET_SEND_CARRIER\n");
621 + result = get_user(value, (__u32 *) arg);
622 + if (result)
623 + return result;
624 + if (value > 500000 || value < 20000)
625 + return -EINVAL;
626 + return init_timing_params(duty_cycle, value);
627 + break;
628 +
629 + default:
630 + return lirc_dev_fop_ioctl(filep, cmd, arg);
631 + }
632 + return 0;
633 +}
634 +
635 +static const struct file_operations lirc_fops = {
636 + .owner = THIS_MODULE,
637 + .write = lirc_write,
638 + .unlocked_ioctl = lirc_ioctl,
639 + .read = lirc_dev_fop_read,
640 + .poll = lirc_dev_fop_poll,
641 + .open = lirc_dev_fop_open,
642 + .release = lirc_dev_fop_close,
643 + .llseek = no_llseek,
644 +};
645 +
646 +static struct lirc_driver driver = {
647 + .name = LIRC_DRIVER_NAME,
648 + .minor = -1,
649 + .code_length = 1,
650 + .sample_rate = 0,
651 + .data = NULL,
652 + .add_to_buf = NULL,
653 + .rbuf = &rbuf,
654 + .set_use_inc = set_use_inc,
655 + .set_use_dec = set_use_dec,
656 + .fops = &lirc_fops,
657 + .dev = NULL,
658 + .owner = THIS_MODULE,
659 +};
660 +
661 +static const struct of_device_id lirc_rpi_of_match[] = {
662 + { .compatible = "rpi,lirc-rpi", },
663 + {},
664 +};
665 +MODULE_DEVICE_TABLE(of, lirc_rpi_of_match);
666 +
667 +static struct platform_driver lirc_rpi_driver = {
668 + .driver = {
669 + .name = LIRC_DRIVER_NAME,
670 + .owner = THIS_MODULE,
671 + .of_match_table = of_match_ptr(lirc_rpi_of_match),
672 + },
673 +};
674 +
675 +static int __init lirc_rpi_init(void)
676 +{
677 + struct device_node *node;
678 + int result;
679 +
680 + /* Init read buffer. */
681 + result = lirc_buffer_init(&rbuf, sizeof(int), RBUF_LEN);
682 + if (result < 0)
683 + return -ENOMEM;
684 +
685 + result = platform_driver_register(&lirc_rpi_driver);
686 + if (result) {
687 + printk(KERN_ERR LIRC_DRIVER_NAME
688 + ": lirc register returned %d\n", result);
689 + goto exit_buffer_free;
690 + }
691 +
692 + node = of_find_compatible_node(NULL, NULL,
693 + lirc_rpi_of_match[0].compatible);
694 +
695 + if (node) {
696 + /* DT-enabled */
697 + lirc_rpi_dev = of_find_device_by_node(node);
698 + WARN_ON(lirc_rpi_dev->dev.of_node != node);
699 + of_node_put(node);
700 + }
701 + else {
702 + lirc_rpi_dev = platform_device_alloc(LIRC_DRIVER_NAME, 0);
703 + if (!lirc_rpi_dev) {
704 + result = -ENOMEM;
705 + goto exit_driver_unregister;
706 + }
707 +
708 + result = platform_device_add(lirc_rpi_dev);
709 + if (result)
710 + goto exit_device_put;
711 + }
712 +
713 + return 0;
714 +
715 + exit_device_put:
716 + platform_device_put(lirc_rpi_dev);
717 +
718 + exit_driver_unregister:
719 + platform_driver_unregister(&lirc_rpi_driver);
720 +
721 + exit_buffer_free:
722 + lirc_buffer_free(&rbuf);
723 +
724 + return result;
725 +}
726 +
727 +static void lirc_rpi_exit(void)
728 +{
729 + if (!lirc_rpi_dev->dev.of_node)
730 + platform_device_unregister(lirc_rpi_dev);
731 + platform_driver_unregister(&lirc_rpi_driver);
732 + lirc_buffer_free(&rbuf);
733 +}
734 +
735 +static int __init lirc_rpi_init_module(void)
736 +{
737 + int result;
738 +
739 + result = lirc_rpi_init();
740 + if (result)
741 + return result;
742 +
743 + result = init_port();
744 + if (result < 0)
745 + goto exit_rpi;
746 +
747 + driver.features = LIRC_CAN_SET_SEND_DUTY_CYCLE |
748 + LIRC_CAN_SET_SEND_CARRIER |
749 + LIRC_CAN_SEND_PULSE |
750 + LIRC_CAN_REC_MODE2;
751 +
752 + driver.dev = &lirc_rpi_dev->dev;
753 + driver.minor = lirc_register_driver(&driver);
754 +
755 + if (driver.minor < 0) {
756 + printk(KERN_ERR LIRC_DRIVER_NAME
757 + ": device registration failed with %d\n", result);
758 + result = -EIO;
759 + goto exit_rpi;
760 + }
761 +
762 + printk(KERN_INFO LIRC_DRIVER_NAME ": driver registered!\n");
763 +
764 + return 0;
765 +
766 + exit_rpi:
767 + lirc_rpi_exit();
768 +
769 + return result;
770 +}
771 +
772 +static void __exit lirc_rpi_exit_module(void)
773 +{
774 + lirc_unregister_driver(driver.minor);
775 +
776 + gpio_free(gpio_out_pin);
777 + gpio_free(gpio_in_pin);
778 +
779 + lirc_rpi_exit();
780 +
781 + printk(KERN_INFO LIRC_DRIVER_NAME ": cleaned up module\n");
782 +}
783 +
784 +module_init(lirc_rpi_init_module);
785 +module_exit(lirc_rpi_exit_module);
786 +
787 +MODULE_DESCRIPTION("Infra-red receiver and blaster driver for Raspberry Pi GPIO.");
788 +MODULE_AUTHOR("Aron Robert Szabo <aron@reon.hu>");
789 +MODULE_AUTHOR("Michael Bishop <cleverca22@gmail.com>");
790 +MODULE_LICENSE("GPL");
791 +
792 +module_param(gpio_out_pin, int, S_IRUGO);
793 +MODULE_PARM_DESC(gpio_out_pin, "GPIO output/transmitter pin number of the BCM"
794 + " processor. (default 17");
795 +
796 +module_param(gpio_in_pin, int, S_IRUGO);
797 +MODULE_PARM_DESC(gpio_in_pin, "GPIO input pin number of the BCM processor."
798 + " (default 18");
799 +
800 +module_param(gpio_in_pull, int, S_IRUGO);
801 +MODULE_PARM_DESC(gpio_in_pull, "GPIO input pin pull configuration."
802 + " (0 = off, 1 = up, 2 = down, default down)");
803 +
804 +module_param(sense, int, S_IRUGO);
805 +MODULE_PARM_DESC(sense, "Override autodetection of IR receiver circuit"
806 + " (0 = active high, 1 = active low )");
807 +
808 +module_param(softcarrier, bool, S_IRUGO);
809 +MODULE_PARM_DESC(softcarrier, "Software carrier (0 = off, 1 = on, default on)");
810 +
811 +module_param(invert, bool, S_IRUGO);
812 +MODULE_PARM_DESC(invert, "Invert output (0 = off, 1 = on, default off");
813 +
814 +module_param(debug, bool, S_IRUGO | S_IWUSR);
815 +MODULE_PARM_DESC(debug, "Enable debugging messages");
816 --- /dev/null
817 +++ b/include/linux/platform_data/bcm2708.h
818 @@ -0,0 +1,23 @@
819 +/*
820 + * include/linux/platform_data/bcm2708.h
821 + *
822 + * This program is free software; you can redistribute it and/or modify
823 + * it under the terms of the GNU General Public License version 2 as
824 + * published by the Free Software Foundation.
825 + *
826 + * (C) 2014 Julian Scheel <julian@jusst.de>
827 + *
828 + */
829 +#ifndef __BCM2708_H_
830 +#define __BCM2708_H_
831 +
832 +typedef enum {
833 + BCM2708_PULL_OFF,
834 + BCM2708_PULL_UP,
835 + BCM2708_PULL_DOWN
836 +} bcm2708_gpio_pull_t;
837 +
838 +extern int bcm2708_gpio_setpull(struct gpio_chip *gc, unsigned offset,
839 + bcm2708_gpio_pull_t value);
840 +
841 +#endif