From 5349364d8cb03780a54d04222a43e7f626e03669 Mon Sep 17 00:00:00 2001
From: Cecil <knoppmyth@gmail.com>
Date: Fri, 22 Jul 2011 12:42:44 -0700
Subject: lirc:Bumped to latest.

---
 abs/core/lirc/PKGBUILD                        |  140 ++-
 abs/core/lirc/irexec.conf                     |    5 +
 abs/core/lirc/irexecd                         |   38 +
 abs/core/lirc/kernel-2.6.33.patch             |  475 -------
 abs/core/lirc/kernel-2.6.35.patch             | 1654 -------------------------
 abs/core/lirc/kernel-2.6.39.patch             |   54 +
 abs/core/lirc/lirc.install                    |   42 +-
 abs/core/lirc/lirc.logrotate                  |    5 +
 abs/core/lirc/lirc_atiusb-kfifo.patch         |   31 +
 abs/core/lirc/lirc_wpc8769l.patch             |   88 ++
 abs/core/lirc/lircd                           |   52 +
 abs/core/lirc/lircd-handle-large-config.patch |   39 +
 abs/core/lirc/lircd.conf                      |    8 +
 abs/core/lirc/lircmd                          |   36 +
 14 files changed, 452 insertions(+), 2215 deletions(-)
 create mode 100644 abs/core/lirc/irexec.conf
 create mode 100755 abs/core/lirc/irexecd
 delete mode 100644 abs/core/lirc/kernel-2.6.33.patch
 delete mode 100644 abs/core/lirc/kernel-2.6.35.patch
 create mode 100644 abs/core/lirc/kernel-2.6.39.patch
 create mode 100644 abs/core/lirc/lirc.logrotate
 create mode 100644 abs/core/lirc/lirc_atiusb-kfifo.patch
 create mode 100644 abs/core/lirc/lirc_wpc8769l.patch
 create mode 100755 abs/core/lirc/lircd
 create mode 100644 abs/core/lirc/lircd-handle-large-config.patch
 create mode 100644 abs/core/lirc/lircd.conf
 create mode 100755 abs/core/lirc/lircmd

diff --git a/abs/core/lirc/PKGBUILD b/abs/core/lirc/PKGBUILD
index e8ddd4d..8f7a5ae 100644
--- a/abs/core/lirc/PKGBUILD
+++ b/abs/core/lirc/PKGBUILD
@@ -1,59 +1,103 @@
-# $Id: PKGBUILD 100623 2010-11-24 21:20:40Z tpowa $
+# $Id: PKGBUILD 127217 2011-06-11 09:10:14Z ibiru $
 # Maintainer: Paul Mattal <paul@archlinux.org>
 
-pkgname=lirc
-pkgver=0.9.0.pre1
-pkgrel=3
-_kernver=2.6.37-LinHES
-pkgdesc="Linux Infrared Remote Control kernel modules for stock arch kernel"
+pkgbase=lirc
+pkgname=('lirc' 'lirc-utils')
+pkgver=0.9.0
+pkgrel=4
+epoch=1
+_kernver=2.6.39-LinHES
 arch=('i686' 'x86_64')
 url="http://www.lirc.org/"
 license=('GPL')
-#depends=('lirc-utils' 'kernel26>=2.6.36' 'kernel26<2.6.37')
-depends=('lirc-utils' 'kernel26>=2.6.37')
-#makedepends=('help2man' 'kernel26-headers>=2.6.36' 'kernel26-headers<2.6.37')
-makedepends=('help2man' 'kernel26-headers>=2.6.37')
-replaces=('lirc+pctv')
-options=('!makeflags')
-install=$pkgname.install
-source=(http://www.lirc.org/software/snapshots/lirc-0.9.0-pre1.tar.bz2
-        #"http://prdownloads.sourceforge.net/${pkgname}/${pkgname}-${pkgver}.tar.bz2"
-        )
-md5sums=('13ba59178adee4e6be8a9a1966ab3133')
+makedepends=('help2man' 'kernel26-headers>=2.6.39' 'kernel26-headers<2.6.40' 'alsa-lib' 'libx11' 'libftdi' 'libirman' 'python')
+options=('!makeflags' '!strip')
+source=(http://prdownloads.sourceforge.net/${pkgbase}/${pkgbase}-${pkgver}.tar.bz2
+        lirc_wpc8769l.patch
+        lircd-handle-large-config.patch
+        lirc_atiusb-kfifo.patch
+        kernel-2.6.39.patch
+	lircd lircmd lirc.logrotate lircd.conf irexec.conf irexecd)
+md5sums=('b232aef26f23fe33ea8305d276637086'
+         '1cce37e18e3f6f46044abab29016d18f'
+         'b70cc9640505205446ec47b7d4779f38'
+         '1f8b104a2365d9f93404b143f499059b'
+         '087a7d102e1c96bf1179f38db2b0b237'
+         '8d0e238dc0eda95e340fe570605da492'
+         '85f7fdac55e5256967241864049bf5e9'
+         '3deb02604b37811d41816e9b4385fcc3'
+         '5b1f8c9cd788a39a6283f93302ce5c6e'
+         'f0c0ac930326168035f0c8e24357ae55'
+         '69d099e6deedfa3c1ee2b6e82d9b8bfb')
 
 build() {
-	# configure
-	cd ${srcdir}/lirc-0.9.0-pre1
-	./configure --enable-sandboxed --prefix=/usr \
-		--with-driver=all --with-kerneldir=/usr/src/linux-${_kernver}/ \
-		--with-moduledir=/lib/modules/${_kernver}/kernel/drivers/misc \
-	        --with-transmitter
-
-	# disable parallel and bt829
-        # because of incompatibility with smp systems
-        sed -i -e "s:lirc_parallel::" -e "s:lirc_bt829::" \
-		Makefile drivers/Makefile drivers/*/Makefile tools/Makefile
-	# lirc_i2c  lirc_igorplugusb  lirc_imon  lirc_it87  lirc_ite8709
-        # lirc_sasem  lirc_serial  lirc_sir lirc_ttusbir lirc_zilog
-        # because part of kernel 2.6.36 staging tree
-        sed -i -e "s:lirc_i2c::" -e "s:lirc_igorplugusb::" -e "s:lirc_imon::" \
-		-e "s:lirc_it87::" -e "s:lirc_ite8709::" -e "s:lirc_sasem::" \
-		-e "s:lirc_serial::" -e "s:lirc_sir::" -e "s:lirc_ttusbir::" \
-		-e "s:lirc_zilog::" Makefile drivers/Makefile drivers/*/Makefile tools/Makefile
-	# disable lirc_gpio due to brokeness of kernel 2.6.23
-	sed -i -e "s:lirc_gpio::" \
-		Makefile drivers/Makefile drivers/*/Makefile tools/Makefile
-
-	# build
-	cd drivers
-	make
+  cd "${srcdir}/lirc-${pkgver}"
+  patch -Np1 -i "${srcdir}/lirc_wpc8769l.patch"
+  patch -Np1 -i "${srcdir}/lircd-handle-large-config.patch"
+  patch -Np1 -i "${srcdir}/lirc_atiusb-kfifo.patch"
+  patch -Np1 -i "${srcdir}/kernel-2.6.39.patch"
+
+  sed -i '/AC_PATH_XTRA/d' configure.ac
+  sed -e 's/@X_CFLAGS@//g' \
+      -e 's/@X_LIBS@//g' \
+      -e 's/@X_PRE_LIBS@//g' \
+      -e 's/@X_EXTRA_LIBS@//g' -i Makefile.am tools/Makefile.am
+  libtoolize
+  autoreconf
+
+  PYTHON=python2 ./configure --enable-sandboxed --prefix=/usr \
+      --with-driver=all --with-kerneldir=/usr/src/linux-${_kernver}/ \
+      --with-moduledir=/lib/modules/${_kernver}/kernel/drivers/misc \
+      --with-transmitter
+
+  # Remove drivers already in kernel
+  sed -e "s:lirc_dev::" -e "s:lirc_bt829::" -e "s:lirc_igorplugusb::" \
+      -e "s:lirc_imon::" -e "s:lirc_parallel::" -e "s:lirc_sasem::" \
+      -e "s:lirc_serial::" -e "s:lirc_sir::" -e "s:lirc_ttusbir::" \
+      -i Makefile drivers/Makefile drivers/*/Makefile tools/Makefile 
+  make
+}
+
+package_lirc() {
+  pkgdesc="Linux Infrared Remote Control kernel modules for stock arch kernel"
+  depends=('lirc-utils' 'kernel26>=2.6.39' 'kernel26<2.6.40')
+  replaces=('lirc+pctv')
+  install=lirc.install
+
+  cd "${srcdir}/lirc-${pkgver}/drivers"
+  make DESTDIR="${pkgdir}" install
+
+  # set the kernel we've built for inside the install script
+  sed -i -e "s/KERNEL_VERSION=.*/KERNEL_VERSION=${_kernver}/g" "${startdir}/lirc.install"
+  # gzip -9 modules
+  find "${pkgdir}" -name '*.ko' -exec gzip -9 {} \;
 }
 
-package() {
-        cd ${srcdir}/lirc-0.9.0-pre1/drivers
-	make DESTDIR=${pkgdir} install
+package_lirc-utils() {
+  pkgdesc="Linux Infrared Remote Control utils"
+  depends=('alsa-lib' 'libx11' 'libftdi' 'libirman')
+  optdepends=('python2: pronto2lirc utility')
+  options=('strip' '!libtool')
+  backup=('etc/conf.d/lircd.conf' 'etc/conf.d/irexec.conf')
+
+  cd "${srcdir}/lirc-${pkgver}"
+  make DESTDIR="${pkgdir}" install
+  install -d "${pkgdir}/usr/share/lirc" "${pkgdir}/etc/rc.d"
+  cp "${srcdir}"/{lircd,lircmd,irexecd} "${pkgdir}/etc/rc.d"
+  cp -rp remotes "${pkgdir}/usr/share/lirc"
+  chmod -R go-w "${pkgdir}/usr/share/lirc/"
+
+  # install the logrotate config
+  install -Dm644 "${srcdir}/lirc.logrotate" "${pkgdir}/etc/logrotate.d/lirc"
+    
+  # install conf.d file
+  install -Dm644 "${srcdir}/lircd.conf" "${pkgdir}/etc/conf.d/lircd.conf"
+
+  # install conf.d file
+  install -Dm644 "${srcdir}/irexec.conf" "${pkgdir}/etc/conf.d/irexec.conf"
 
-	# set the kernel we've built for inside the install script
-	sed -i -e "s/KERNEL_VERSION=.*/KERNEL_VERSION=${_kernver}/g" \
-		${startdir}/lirc.install
+  install -d "${pkgdir}/etc/lirc"
+  
+  # remove built modules
+  rm -r "${pkgdir}/lib/"
 }
diff --git a/abs/core/lirc/irexec.conf b/abs/core/lirc/irexec.conf
new file mode 100644
index 0000000..f911c75
--- /dev/null
+++ b/abs/core/lirc/irexec.conf
@@ -0,0 +1,5 @@
+#
+# Parameters for irexec daemon (path to lircrc)
+#
+
+IREXEC_OPTS=""
\ No newline at end of file
diff --git a/abs/core/lirc/irexecd b/abs/core/lirc/irexecd
new file mode 100755
index 0000000..a64b033
--- /dev/null
+++ b/abs/core/lirc/irexecd
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+. /etc/rc.conf
+. /etc/rc.d/functions
+. /etc/conf.d/irexec.conf
+
+PID=`pidof -o %PPID /usr/bin/irexec`
+case "$1" in
+  start)
+    stat_busy "Starting IREXEC Daemon"
+    [ -z "$PID" ] && /usr/bin/irexec --daemon $IREXEC_OPTS
+    if [ $? -gt 0 ]; then
+      stat_fail
+    else
+      add_daemon irexecd
+      stat_done
+    fi
+    ;;
+  stop)
+    stat_busy "Stopping IREXEC Daemon"
+    [ ! -z "$PID" ]  && kill $PID &> /dev/null
+    if [ $? -gt 0 ]; then
+      stat_fail
+    else
+      rm_daemon irexecd
+      stat_done
+    fi
+    ;;
+  restart)
+    $0 stop
+    sleep 1
+    $0 start
+    ;;
+  *)
+    echo "usage: $0 {start|stop|restart}"
+esac
+exit 0
+
diff --git a/abs/core/lirc/kernel-2.6.33.patch b/abs/core/lirc/kernel-2.6.33.patch
deleted file mode 100644
index 7827e00..0000000
--- a/abs/core/lirc/kernel-2.6.33.patch
+++ /dev/null
@@ -1,475 +0,0 @@
---- drivers/lirc_dev/lirc_dev.h	2009/03/15 09:34:00	1.37 lirc-0_8_6
-+++ drivers/lirc_dev/lirc_dev.h	2009/12/28 15:21:17	1.38
-@@ -4,7 +4,7 @@
-  * (L) by Artur Lipowski <alipowski@interia.pl>
-  *        This code is licensed under GNU GPL
-  *
-- * $Id: lirc_dev.h,v 1.37 2009/03/15 09:34:00 lirc Exp $
-+ * $Id: lirc_dev.h,v 1.38 2009/12/28 15:21:17 jarodwilson Exp $
-  *
-  */
- 
-@@ -30,14 +30,19 @@
- 
- struct lirc_buffer {
- 	wait_queue_head_t wait_poll;
--	spinlock_t lock;
-+	spinlock_t fifo_lock;
- 	unsigned int chunk_size;
- 	unsigned int size; /* in chunks */
- 	/* Using chunks instead of bytes pretends to simplify boundary checking
- 	 * And should allow for some performance fine tunning later */
- #ifdef LIRC_HAVE_KFIFO
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- 	struct kfifo *fifo;
- #else
-+	struct kfifo fifo;
-+	u8 fifo_initialized;
-+#endif
-+#else
- 	unsigned int fill; /* in chunks */
- 	int head, tail;    /* in chunks */
- 	unsigned char *data;
-@@ -47,12 +52,12 @@
- static inline void lirc_buffer_lock(struct lirc_buffer *buf,
- 				    unsigned long *flags)
- {
--	spin_lock_irqsave(&buf->lock, *flags);
-+	spin_lock_irqsave(&buf->fifo_lock, *flags);
- }
- static inline void lirc_buffer_unlock(struct lirc_buffer *buf,
- 				      unsigned long *flags)
- {
--	spin_unlock_irqrestore(&buf->lock, *flags);
-+	spin_unlock_irqrestore(&buf->fifo_lock, *flags);
- }
- static inline void _lirc_buffer_clear(struct lirc_buffer *buf)
- {
-@@ -63,11 +68,20 @@
- #endif
- static inline void lirc_buffer_clear(struct lirc_buffer *buf)
- {
-+	unsigned long flags;
-+
- #ifdef LIRC_HAVE_KFIFO
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- 	if (buf->fifo)
- 		kfifo_reset(buf->fifo);
- #else
--	unsigned long flags;
-+	if (buf->fifo_initialized) {
-+		spin_lock_irqsave(&buf->fifo_lock, flags);
-+		kfifo_reset(&buf->fifo);
-+		spin_unlock_irqrestore(&buf->fifo_lock, flags);
-+	}
-+#endif
-+#else
- 	lirc_buffer_lock(buf, &flags);
- 	_lirc_buffer_clear(buf);
- 	lirc_buffer_unlock(buf, &flags);
-@@ -77,31 +91,47 @@
- 				    unsigned int chunk_size,
- 				    unsigned int size)
- {
-+	int ret = 0;
-+
- 	init_waitqueue_head(&buf->wait_poll);
--	spin_lock_init(&buf->lock);
-+	spin_lock_init(&buf->fifo_lock);
- #ifndef LIRC_HAVE_KFIFO
- 	_lirc_buffer_clear(buf);
- #endif
- 	buf->chunk_size = chunk_size;
- 	buf->size = size;
- #ifdef LIRC_HAVE_KFIFO
--	buf->fifo = kfifo_alloc(size*chunk_size, GFP_KERNEL, &buf->lock);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
-+	buf->fifo = kfifo_alloc(size*chunk_size, GFP_KERNEL, &buf->fifo_lock);
- 	if (!buf->fifo)
- 		return -ENOMEM;
- #else
-+	ret = kfifo_alloc(&buf->fifo, size * chunk_size, GFP_KERNEL);
-+	if (ret == 0)
-+		buf->fifo_initialized = 1;
-+#endif
-+#else
- 	buf->data = kmalloc(size*chunk_size, GFP_KERNEL);
- 	if (buf->data == NULL)
- 		return -ENOMEM;
- 	memset(buf->data, 0, size*chunk_size);
- #endif
--	return 0;
-+
-+	return ret;
- }
- static inline void lirc_buffer_free(struct lirc_buffer *buf)
- {
- #ifdef LIRC_HAVE_KFIFO
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- 	if (buf->fifo)
- 		kfifo_free(buf->fifo);
- #else
-+	if (buf->fifo_initialized) {
-+		kfifo_free(&buf->fifo);
-+		buf->fifo_initialized = 0;
-+	}
-+#endif
-+#else
- 	kfree(buf->data);
- 	buf->data = NULL;
- 	buf->head = 0;
-@@ -111,6 +141,25 @@
- 	buf->size = 0;
- #endif
- }
-+
-+#ifdef LIRC_HAVE_KFIFO
-+static inline int lirc_buffer_len(struct lirc_buffer *buf)
-+{
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
-+	return kfifo_len(buf->fifo);
-+#else
-+	int len;
-+	unsigned long flags;
-+
-+	spin_lock_irqsave(&buf->fifo_lock, flags);
-+	len = kfifo_len(&buf->fifo);
-+	spin_unlock_irqrestore(&buf->fifo_lock, flags);
-+
-+	return len;
-+#endif
-+}
-+#endif
-+
- #ifndef LIRC_HAVE_KFIFO
- static inline int  _lirc_buffer_full(struct lirc_buffer *buf)
- {
-@@ -120,7 +169,7 @@
- static inline int  lirc_buffer_full(struct lirc_buffer *buf)
- {
- #ifdef LIRC_HAVE_KFIFO
--	return kfifo_len(buf->fifo) == buf->size * buf->chunk_size;
-+	return lirc_buffer_len(buf) == buf->size * buf->chunk_size;
- #else
- 	unsigned long flags;
- 	int ret;
-@@ -139,7 +188,7 @@
- static inline int  lirc_buffer_empty(struct lirc_buffer *buf)
- {
- #ifdef LIRC_HAVE_KFIFO
--	return !kfifo_len(buf->fifo);
-+	return !lirc_buffer_len(buf);
- #else
- 	unsigned long flags;
- 	int ret;
-@@ -158,7 +207,7 @@
- static inline int  lirc_buffer_available(struct lirc_buffer *buf)
- {
- #ifdef LIRC_HAVE_KFIFO
--	return buf->size - (kfifo_len(buf->fifo) / buf->chunk_size);
-+	return buf->size - (lirc_buffer_len(buf) / buf->chunk_size);
- #else
- 	unsigned long flags;
- 	int ret;
-@@ -177,21 +226,30 @@
- 	buf->fill -= 1;
- }
- #endif
--static inline void lirc_buffer_read(struct lirc_buffer *buf,
--				    unsigned char *dest)
-+static inline unsigned int lirc_buffer_read(struct lirc_buffer *buf,
-+					    unsigned char *dest)
- {
-+	unsigned int ret = 0;
-+
- #ifdef LIRC_HAVE_KFIFO
--	if (kfifo_len(buf->fifo) >= buf->chunk_size)
--		kfifo_get(buf->fifo, dest, buf->chunk_size);
-+	if (lirc_buffer_len(buf) >= buf->chunk_size)
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
-+		ret = kfifo_get(buf->fifo, dest, buf->chunk_size);
-+#else
-+		ret = kfifo_out_locked(&buf->fifo, dest, buf->chunk_size,
-+				       &buf->fifo_lock);
-+#endif
- #else
- 	unsigned long flags;
- 	lirc_buffer_lock(buf, &flags);
- 	_lirc_buffer_read_1(buf, dest);
- 	lirc_buffer_unlock(buf, &flags);
- #endif
-+
-+	return ret;
- }
- #ifndef LIRC_HAVE_KFIFO
--static inline void _lirc_buffer_write_1(struct lirc_buffer *buf,
-+static inline  _lirc_buffer_write_1(struct lirc_buffer *buf,
- 				      unsigned char *orig)
- {
- 	memcpy(&buf->data[buf->tail*buf->chunk_size], orig, buf->chunk_size);
-@@ -199,17 +257,26 @@
- 	buf->fill++;
- }
- #endif
--static inline void lirc_buffer_write(struct lirc_buffer *buf,
--				     unsigned char *orig)
-+static inline unsigned int lirc_buffer_write(struct lirc_buffer *buf,
-+					     unsigned char *orig)
- {
-+	unsigned int ret = 0;
-+
- #ifdef LIRC_HAVE_KFIFO
--	kfifo_put(buf->fifo, orig, buf->chunk_size);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
-+	ret = kfifo_put(buf->fifo, orig, buf->chunk_size);
-+#else
-+	ret = kfifo_in_locked(&buf->fifo, orig, buf->chunk_size,
-+			      &buf->fifo_lock);
-+#endif
- #else
- 	unsigned long flags;
- 	lirc_buffer_lock(buf, &flags);
- 	_lirc_buffer_write_1(buf, orig);
- 	lirc_buffer_unlock(buf, &flags);
- #endif
-+
-+	return ret;
- }
- #ifndef LIRC_HAVE_KFIFO
- static inline void _lirc_buffer_write_n(struct lirc_buffer *buf,
-@@ -234,17 +301,26 @@
- 	buf->fill += count;
- }
- #endif
--static inline void lirc_buffer_write_n(struct lirc_buffer *buf,
--				       unsigned char *orig, int count)
-+static inline unsigned int lirc_buffer_write_n(struct lirc_buffer *buf,
-+					       unsigned char *orig, int count)
- {
-+	unsigned int ret = 0;
-+
- #ifdef LIRC_HAVE_KFIFO
--	kfifo_put(buf->fifo, orig, count * buf->chunk_size);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
-+	ret = kfifo_put(buf->fifo, orig, count * buf->chunk_size);
-+#else
-+	ret = kfifo_in_locked(&buf->fifo, orig, count * buf->chunk_size,
-+			      &buf->fifo_lock);
-+#endif
- #else
- 	unsigned long flags;
- 	lirc_buffer_lock(buf, &flags);
- 	_lirc_buffer_write_n(buf, orig, count);
- 	lirc_buffer_unlock(buf, &flags);
- #endif
-+
-+	return ret;
- }
- 
- struct lirc_driver {
---- drivers/lirc_dev/lirc_dev.c.old	2009-08-31 12:57:55.000000000 -0400
-+++ drivers/lirc_dev/lirc_dev.c	2010-03-07 01:40:17.000000000 -0500
-@@ -32,7 +32,11 @@
- #error "**********************************************************"
- #endif
- 
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- #include <linux/autoconf.h>
-+#else
-+#include <generated/autoconf.h>
-+#endif
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/sched.h>
---- drivers/lirc_sir/lirc_sir.c.old	2009-07-09 18:24:23.000000000 -0400
-+++ drivers/lirc_sir/lirc_sir.c	2010-03-07 01:40:17.000000000 -0500
-@@ -45,7 +45,11 @@
- # include <config.h>
- #endif
- 
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- #include <linux/autoconf.h>
-+#else
-+#include <generated/autoconf.h>
-+#endif
- #if !defined(CONFIG_SERIAL_MODULE)
- #if !defined(LIRC_ON_SA1100)
- #warning "******************************************"
---- drivers/lirc_serial/lirc_serial.c.old	2009-03-15 05:34:00.000000000 -0400
-+++ drivers/lirc_serial/lirc_serial.c	2010-03-07 01:40:17.000000000 -0500
-@@ -60,7 +60,11 @@
- #error "**********************************************************"
- #endif
- 
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- #include <linux/autoconf.h>
-+#else
-+#include <generated/autoconf.h>
-+#endif
- 
- #if defined(CONFIG_SERIAL) || defined(CONFIG_SERIAL_8250)
- #warning "******************************************"
---- drivers/lirc_bt829/lirc_bt829.c.old	2009-03-09 14:54:17.000000000 -0400
-+++ drivers/lirc_bt829/lirc_bt829.c	2010-03-07 01:40:17.000000000 -0500
-@@ -22,7 +22,11 @@
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 0)
- #error "This driver needs kernel version 2.4.0 or higher"
- #endif
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- #include <linux/autoconf.h>
-+#else
-+#include <generated/autoconf.h>
-+#endif
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/threads.h>
---- drivers/lirc_sasem/lirc_sasem.c.old	2009-02-28 05:27:10.000000000 -0500
-+++ drivers/lirc_sasem/lirc_sasem.c	2010-03-07 01:40:17.000000000 -0500
-@@ -41,7 +41,11 @@
- #error "*** Sorry, this driver requires kernel version 2.4.22 or higher"
- #endif
- 
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- #include <linux/autoconf.h>
-+#else
-+#include <generated/autoconf.h>
-+#endif
- 
- #include <linux/errno.h>
- #include <linux/init.h>
---- drivers/lirc_igorplugusb/lirc_igorplugusb.c.old	2009-08-02 05:54:10.000000000 -0400
-+++ drivers/lirc_igorplugusb/lirc_igorplugusb.c	2010-03-07 01:40:17.000000000 -0500
-@@ -47,7 +47,11 @@
- #error "*******************************************************"
- #endif
- 
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- #include <linux/autoconf.h>
-+#else
-+#include <generated/autoconf.h>
-+#endif
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/kmod.h>
---- drivers/lirc_imon/lirc_imon.c.old	2009-09-11 00:56:18.000000000 -0400
-+++ drivers/lirc_imon/lirc_imon.c	2010-03-07 01:40:17.000000000 -0500
-@@ -30,7 +30,11 @@
- #error "*** Sorry, this driver requires a 2.6 kernel"
- #endif
- 
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- #include <linux/autoconf.h>
-+#else
-+#include <generated/autoconf.h>
-+#endif
- 
- #include <linux/errno.h>
- #include <linux/init.h>
---- drivers/lirc_it87/lirc_it87.c.old	2009-06-01 08:21:31.000000000 -0400
-+++ drivers/lirc_it87/lirc_it87.c	2010-03-07 01:40:17.000000000 -0500
-@@ -36,7 +36,11 @@
- 
- #include <linux/version.h>
- #include <linux/module.h>
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- #include <linux/autoconf.h>
-+#else
-+#include <generated/autoconf.h>
-+#endif
- #include <linux/sched.h>
- #include <linux/errno.h>
- #include <linux/signal.h>
---- drivers/lirc_streamzap/lirc_streamzap.c.old	2009-03-15 05:34:00.000000000 -0400
-+++ drivers/lirc_streamzap/lirc_streamzap.c	2010-03-07 01:40:17.000000000 -0500
-@@ -35,7 +35,11 @@
- #error "Sorry, this driver needs kernel version 2.4.0 or higher"
- #error "*******************************************************"
- #endif
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- #include <linux/autoconf.h>
-+#else
-+#include <generated/autoconf.h>
-+#endif
- #include <linux/kernel.h>
- #include <linux/errno.h>
- #include <linux/init.h>
---- drivers/lirc_atiusb/lirc_atiusb.c.old	2009-03-10 20:21:46.000000000 -0400
-+++ drivers/lirc_atiusb/lirc_atiusb.c	2010-03-07 01:40:17.000000000 -0500
-@@ -43,7 +43,11 @@
- #error "*******************************************************"
- #endif
- 
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- #include <linux/autoconf.h>
-+#else
-+#include <generated/autoconf.h>
-+#endif
- 
- #include <linux/kernel.h>
- #include <linux/errno.h>
---- drivers/lirc_parallel/lirc_parallel.c.old	2009-03-08 15:22:28.000000000 -0400
-+++ drivers/lirc_parallel/lirc_parallel.c	2010-03-07 01:40:17.000000000 -0500
-@@ -34,7 +34,11 @@
- #error "**********************************************************"
- #endif
- 
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- #include <linux/autoconf.h>
-+#else
-+#include <generated/autoconf.h>
-+#endif
- #ifdef CONFIG_SMP
- #error "--- Sorry, this driver is not SMP safe. ---"
- #endif
-@@ -43,7 +47,11 @@
- #include <linux/sched.h>
- #include <linux/errno.h>
- #include <linux/signal.h>
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- #include <linux/autoconf.h>
-+#else
-+#include <generated/autoconf.h>
-+#endif
- #include <linux/fs.h>
- #include <linux/kernel.h>
- #include <linux/ioport.h>
---- drivers/lirc_wpc8769l/lirc_wpc8769l.c.old	2009-03-15 05:34:01.000000000 -0400
-+++ drivers/lirc_wpc8769l/lirc_wpc8769l.c	2010-03-07 01:40:17.000000000 -0500
-@@ -37,7 +37,11 @@
- #error "**********************************************************"
- #endif
- 
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- #include <linux/autoconf.h>
-+#else
-+#include <generated/autoconf.h>
-+#endif
- 
- #include <linux/module.h>
- #include <linux/errno.h>
---- drivers/lirc_mceusb/lirc_mceusb.c.old	2009-09-02 10:04:02.000000000 -0400
-+++ drivers/lirc_mceusb/lirc_mceusb.c	2010-03-07 01:40:17.000000000 -0500
-@@ -52,7 +52,11 @@
- #error "Sorry, this driver needs kernel version 2.6.5 or higher"
- #error "*******************************************************"
- #endif
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- #include <linux/autoconf.h>
-+#else
-+#include <generated/autoconf.h>
-+#endif
- #include <linux/kernel.h>
- #include <linux/errno.h>
- #include <linux/init.h>
---- drivers/lirc_i2c/lirc_i2c.c	2009/08/30 16:59:53	1.70
-+++ drivers/lirc_i2c/lirc_i2c.c	2009/12/15 05:37:00	1.71
-@@ -399,8 +399,8 @@
- 		.name	= "i2c ir driver",
- 	},
- #endif
--	.id		= I2C_DRIVERID_EXP3, /* FIXME */
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31)
-+	.id		= I2C_DRIVERID_EXP3, /* FIXME */
- 	.attach_adapter	= ir_probe,
- 	.detach_client	= ir_remove,
- #else
diff --git a/abs/core/lirc/kernel-2.6.35.patch b/abs/core/lirc/kernel-2.6.35.patch
deleted file mode 100644
index 179fe65..0000000
--- a/abs/core/lirc/kernel-2.6.35.patch
+++ /dev/null
@@ -1,1654 +0,0 @@
---- drivers/lirc_atiusb/lirc_atiusb.c	2009/03/11 00:21:46	1.85
-+++ drivers/lirc_atiusb/lirc_atiusb.c	2010/03/17 14:16:15	1.86
-@@ -17,7 +17,7 @@
-  *   Vassilis Virvilis <vasvir@iit.demokritos.gr> 2006
-  *      reworked the patch for lirc submission
-  *
-- * $Id: lirc_atiusb.c,v 1.85 2009/03/11 00:21:46 jarodwilson Exp $
-+ * $Id: lirc_atiusb.c,v 1.86 2010/03/17 14:16:15 jarodwilson Exp $
-  */
- 
- /*
-@@ -67,7 +69,7 @@
- #include "drivers/kcompat.h"
- #include "drivers/lirc_dev/lirc_dev.h"
- 
--#define DRIVER_VERSION		"$Revision: 1.85 $"
-+#define DRIVER_VERSION		"$Revision: 1.86 $"
- #define DRIVER_AUTHOR		"Paul Miller <pmiller9@users.sourceforge.net>"
- #define DRIVER_DESC		"USB remote driver for LIRC"
- #define DRIVER_NAME		"lirc_atiusb"
-@@ -1374,7 +1376,7 @@
- 	       DRIVER_VERSION "\n");
- 	printk(DRIVER_NAME ": " DRIVER_AUTHOR "\n");
- 	dprintk(DRIVER_NAME ": debug mode enabled: "
--		"$Id: lirc_atiusb.c,v 1.85 2009/03/11 00:21:46 jarodwilson Exp $\n");
-+		"$Id: lirc_atiusb.c,v 1.86 2010/03/17 14:16:15 jarodwilson Exp $\n");
- 
- 	repeat_jiffies = repeat*HZ/100;
- 
---- drivers/lirc_atiusb/lirc_atiusb.c	2010/03/17 14:16:15	1.86
-+++ drivers/lirc_atiusb/lirc_atiusb.c	2010/07/24 14:35:58	1.87
-@@ -17,7 +17,7 @@
-  *   Vassilis Virvilis <vasvir@iit.demokritos.gr> 2006
-  *      reworked the patch for lirc submission
-  *
-- * $Id: lirc_atiusb.c,v 1.86 2010/03/17 14:16:15 jarodwilson Exp $
-+ * $Id: lirc_atiusb.c,v 1.87 2010/07/24 14:35:58 jarodwilson Exp $
-  */
- 
- /*
-@@ -69,7 +69,7 @@
- #include "drivers/kcompat.h"
- #include "drivers/lirc_dev/lirc_dev.h"
- 
--#define DRIVER_VERSION		"$Revision: 1.86 $"
-+#define DRIVER_VERSION		"$Revision: 1.87 $"
- #define DRIVER_AUTHOR		"Paul Miller <pmiller9@users.sourceforge.net>"
- #define DRIVER_DESC		"USB remote driver for LIRC"
- #define DRIVER_NAME		"lirc_atiusb"
-@@ -824,7 +824,11 @@
- 				ir->devnum);
- 	case 3:
- #ifdef KERNEL_2_5
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34)
-+		usb_free_coherent(iep->ir->usbdev, iep->len, iep->buf, iep->dma);
-+#else
- 		usb_buffer_free(iep->ir->usbdev, iep->len, iep->buf, iep->dma);
-+#endif
- #else
- 		kfree(iep->buf);
- #endif
-@@ -869,7 +873,11 @@
- 	iep->len = len;
- 
- #ifdef KERNEL_2_5
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34)
-+	iep->buf = usb_alloc_coherent(dev, len, GFP_ATOMIC, &iep->dma);
-+#else
- 	iep->buf = usb_buffer_alloc(dev, len, GFP_ATOMIC, &iep->dma);
-+#endif
- #else
- 	iep->buf = kmalloc(len, GFP_KERNEL);
- #endif
-@@ -931,8 +939,13 @@
- 		}
- 	case 3:
- #ifdef KERNEL_2_5
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34)
-+		usb_free_coherent(oep->ir->usbdev, USB_OUTLEN,
-+				  oep->buf, oep->dma);
-+#else
- 		usb_buffer_free(oep->ir->usbdev, USB_OUTLEN,
- 				oep->buf, oep->dma);
-+#endif
- #else
- 		kfree(oep->buf);
- #endif
-@@ -965,8 +978,13 @@
- 		init_waitqueue_head(&oep->wait);
- 
- #ifdef KERNEL_2_5
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34)
-+		oep->buf = usb_alloc_coherent(dev, USB_OUTLEN,
-+					      GFP_ATOMIC, &oep->dma);
-+#else
- 		oep->buf = usb_buffer_alloc(dev, USB_OUTLEN,
- 					    GFP_ATOMIC, &oep->dma);
-+#endif
- #else
- 		oep->buf = kmalloc(USB_OUTLEN, GFP_KERNEL);
- #endif
-@@ -1376,7 +1394,7 @@
- 	       DRIVER_VERSION "\n");
- 	printk(DRIVER_NAME ": " DRIVER_AUTHOR "\n");
- 	dprintk(DRIVER_NAME ": debug mode enabled: "
--		"$Id: lirc_atiusb.c,v 1.86 2010/03/17 14:16:15 jarodwilson Exp $\n");
-+		"$Id: lirc_atiusb.c,v 1.87 2010/07/24 14:35:58 jarodwilson Exp $\n");
- 
- 	repeat_jiffies = repeat*HZ/100;
-
---- drivers/lirc_atiusb/lirc_atiusb.c	2010/07/24 14:35:58	1.87
-+++ drivers/lirc_atiusb/lirc_atiusb.c	2010/07/25 16:43:33	1.88
-@@ -17,7 +17,7 @@
-  *   Vassilis Virvilis <vasvir@iit.demokritos.gr> 2006
-  *      reworked the patch for lirc submission
-  *
-- * $Id: lirc_atiusb.c,v 1.87 2010/07/24 14:35:58 jarodwilson Exp $
-+ * $Id: lirc_atiusb.c,v 1.88 2010/07/25 16:43:33 jarodwilson Exp $
-  */
- 
- /*
-@@ -69,7 +69,7 @@
- #include "drivers/kcompat.h"
- #include "drivers/lirc_dev/lirc_dev.h"
- 
--#define DRIVER_VERSION		"$Revision: 1.87 $"
-+#define DRIVER_VERSION		"$Revision: 1.88 $"
- #define DRIVER_AUTHOR		"Paul Miller <pmiller9@users.sourceforge.net>"
- #define DRIVER_DESC		"USB remote driver for LIRC"
- #define DRIVER_NAME		"lirc_atiusb"
-@@ -824,12 +824,8 @@
- 				ir->devnum);
- 	case 3:
- #ifdef KERNEL_2_5
--#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34)
- 		usb_free_coherent(iep->ir->usbdev, iep->len, iep->buf, iep->dma);
- #else
--		usb_buffer_free(iep->ir->usbdev, iep->len, iep->buf, iep->dma);
--#endif
--#else
- 		kfree(iep->buf);
- #endif
- 		iep->buf = 0;
-@@ -873,12 +869,8 @@
- 	iep->len = len;
- 
- #ifdef KERNEL_2_5
--#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34)
- 	iep->buf = usb_alloc_coherent(dev, len, GFP_ATOMIC, &iep->dma);
- #else
--	iep->buf = usb_buffer_alloc(dev, len, GFP_ATOMIC, &iep->dma);
--#endif
--#else
- 	iep->buf = kmalloc(len, GFP_KERNEL);
- #endif
- 	if (!iep->buf) {
-@@ -939,14 +931,9 @@
- 		}
- 	case 3:
- #ifdef KERNEL_2_5
--#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34)
- 		usb_free_coherent(oep->ir->usbdev, USB_OUTLEN,
- 				  oep->buf, oep->dma);
- #else
--		usb_buffer_free(oep->ir->usbdev, USB_OUTLEN,
--				oep->buf, oep->dma);
--#endif
--#else
- 		kfree(oep->buf);
- #endif
- 		oep->buf = 0;
-@@ -978,14 +965,9 @@
- 		init_waitqueue_head(&oep->wait);
- 
- #ifdef KERNEL_2_5
--#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34)
- 		oep->buf = usb_alloc_coherent(dev, USB_OUTLEN,
- 					      GFP_ATOMIC, &oep->dma);
- #else
--		oep->buf = usb_buffer_alloc(dev, USB_OUTLEN,
--					    GFP_ATOMIC, &oep->dma);
--#endif
--#else
- 		oep->buf = kmalloc(USB_OUTLEN, GFP_KERNEL);
- #endif
- 		if (!oep->buf)
-@@ -1394,7 +1376,7 @@
- 	       DRIVER_VERSION "\n");
- 	printk(DRIVER_NAME ": " DRIVER_AUTHOR "\n");
- 	dprintk(DRIVER_NAME ": debug mode enabled: "
--		"$Id: lirc_atiusb.c,v 1.87 2010/07/24 14:35:58 jarodwilson Exp $\n");
-+		"$Id: lirc_atiusb.c,v 1.88 2010/07/25 16:43:33 jarodwilson Exp $\n");
- 
- 	repeat_jiffies = repeat*HZ/100;
- 
---- drivers/kcompat.h	2009/08/02 11:15:28	5.45
-+++ drivers/kcompat.h	2010/07/27 05:43:21	5.50
-@@ -1,4 +1,4 @@
--/*      $Id: kcompat.h,v 5.45 2009/08/02 11:15:28 lirc Exp $      */
-+/*      $Id: kcompat.h,v 5.50 2010/07/27 05:43:21 jarodwilson Exp $      */
- 
- #ifndef _KCOMPAT_H
- #define _KCOMPAT_H
-@@ -9,6 +9,11 @@
- #define __func__ __FUNCTION__
- #endif
- 
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 34)
-+#define usb_alloc_coherent usb_buffer_alloc
-+#define usb_free_coherent usb_buffer_free
-+#endif
-+
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)
- #define LIRC_THIS_MODULE(x) x,
- #else /* >= 2.6.16 */
-@@ -364,6 +369,11 @@
- #endif /* kernel < 2.6.11 */
- #endif /* kernel >= 2.6.0 */
- 
-+/*************************** pm_wakeup.h ******************************/
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 27)
-+static inline void device_set_wakeup_capable(struct device *dev, int val) {}
-+#endif /* kernel < 2.6.27 */
-+
- /*************************** interrupt.h ******************************/
- /* added in 2.6.18, old defines removed in 2.6.24 */
- #ifndef IRQF_DISABLED
-@@ -378,6 +388,9 @@
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 11)
- #define DEFINE_SPINLOCK(x) spinlock_t x = SPIN_LOCK_UNLOCKED
- #endif
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)
-+#define __SPIN_LOCK_UNLOCKED(x) SPIN_LOCK_UNLOCKED;
-+#endif
- 
- /***************************** slab.h *********************************/
- /* added in 2.6.14 */
-@@ -405,4 +418,14 @@
- #define BIT_WORD(nr)            ((nr) / BITS_PER_LONG)
- #endif
- 
-+/****************************** kernel.h **********************************/
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29)
-+#define DIV_ROUND_CLOSEST(x, divisor)(                  \
-+{                                                       \
-+        typeof(divisor) __divisor = divisor;            \
-+        (((x) + ((__divisor) / 2)) / (__divisor));      \
-+}                                                       \
-+)
-+#endif
-+
- #endif /* _KCOMPAT_H */
---- drivers/lirc_igorplugusb/lirc_igorplugusb.c	2009/11/09 18:59:21	1.35
-+++ drivers/lirc_igorplugusb/lirc_igorplugusb.c	2010/07/25 16:43:33	1.38
-@@ -450,7 +452,7 @@
- 	}
- 
- #if defined(KERNEL_2_5)
--	ir->buf_in = usb_buffer_alloc(dev,
-+	ir->buf_in = usb_alloc_coherent(dev,
- 			      DEVICE_BUFLEN+DEVICE_HEADERLEN,
- 			      GFP_ATOMIC, &ir->dma_in);
- #else
-@@ -486,7 +488,7 @@
- 	switch (mem_failure) {
- 	case 9:
- #if defined(KERNEL_2_5)
--		usb_buffer_free(dev, DEVICE_BUFLEN+DEVICE_HEADERLEN,
-+		usb_free_coherent(dev, DEVICE_BUFLEN+DEVICE_HEADERLEN,
- 			ir->buf_in, ir->dma_in);
- #else
- 		kfree(ir->buf_in);
-@@ -566,7 +568,7 @@
- 
- 
- #if defined(KERNEL_2_5)
--	usb_buffer_free(dev, ir->len_in, ir->buf_in, ir->dma_in);
-+	usb_free_coherent(dev, ir->len_in, ir->buf_in, ir->dma_in);
- #else
- 	kfree(ir->buf_in);
- #endif
---- drivers/lirc_mceusb/lirc_mceusb.c	2010/03/17 14:16:16	1.54
-+++ drivers/lirc_mceusb/lirc_mceusb.c	2010/07/25 16:43:33	1.70
-@@ -80,6 +80,7 @@
- #define DRIVER_NAME	"lirc_mceusb"
- 
- #define USB_BUFLEN	32	/* USB reception buffer length */
-+#define USB_CTRL_MSG_SZ	2	/* Size of usb ctrl msg on gen1 hw */
- #define LIRCBUF_SIZE	256	/* LIRC work buffer length */
- 
- /* MCE constants */
-@@ -95,7 +96,7 @@
- #define MCE_PULSE_BIT	0x80 /* Pulse bit, MSB set == PULSE else SPACE */
- #define MCE_PULSE_MASK	0x7F /* Pulse mask */
- #define MCE_MAX_PULSE_LENGTH 0x7F /* Longest transmittable pulse symbol */
--#define MCE_PACKET_LENGTH_MASK  0x7F /* Pulse mask */
-+#define MCE_PACKET_LENGTH_MASK  0x7F /* Packet length mask */
- 
- 
- /* module parameters */
-@@ -116,8 +117,8 @@
- #define RECV_FLAG_IN_PROGRESS	3
- #define RECV_FLAG_COMPLETE	4
- 
--#define MCEUSB_INBOUND		1
--#define MCEUSB_OUTBOUND		2
-+#define MCEUSB_RX		1
-+#define MCEUSB_TX		2
- 
- #define VENDOR_PHILIPS		0x0471
- #define VENDOR_SMK		0x0609
-@@ -211,6 +212,8 @@
- 	{ USB_DEVICE(VENDOR_FORMOSA, 0xe03a) },
- 	/* Formosa Industrial Computing AIM IR605/A */
- 	{ USB_DEVICE(VENDOR_FORMOSA, 0xe03c) },
-+	/* Formosa Industrial Computing AIM IR605/A */
-+	{ USB_DEVICE(VENDOR_FORMOSA, 0xe03e) },
- 	/* Fintek eHome Infrared Transceiver */
- 	{ USB_DEVICE(VENDOR_FINTEK, 0x0602) },
- 	/* Fintek eHome Infrared Transceiver (in the AOpen MP45) */
-@@ -233,8 +236,9 @@
- 	{ }
- };
- 
--static struct usb_device_id pinnacle_list[] = {
-+static struct usb_device_id gen3_list[] = {
- 	{ USB_DEVICE(VENDOR_PINNACLE, 0x0225) },
-+	{ USB_DEVICE(VENDOR_TOPSEED, 0x0008) },
- 	{}
- };
- 
-@@ -282,10 +286,9 @@
- 	unsigned char is_pulse;
- 	struct {
- 		u32 connected:1;
--		u32 pinnacle:1;
- 		u32 transmitter_mask_inverted:1;
- 		u32 microsoft_gen1:1;
--		u32 reserved:28;
-+		u32 reserved:29;
- 	} flags;
- 
- 	unsigned char transmitter_mask;
-@@ -295,16 +298,44 @@
- 	int send_flags;
- 	wait_queue_head_t wait_out;
- 
--	struct mutex lock;
-+	struct mutex dev_lock;
- };
- 
--/* init strings */
--static char init1[] = {0x00, 0xff, 0xaa, 0xff, 0x0b};
--static char init2[] = {0xff, 0x18};
--
--static char pin_init1[] = { 0x9f, 0x07};
--static char pin_init2[] = { 0x9f, 0x13};
--static char pin_init3[] = { 0x9f, 0x0d};
-+/*
-+ * MCE Device Command Strings
-+ * Device command responses vary from device to device...
-+ * - DEVICE_RESET resets the hardware to its default state
-+ * - GET_REVISION fetches the hardware/software revision, common
-+ *   replies are ff 0b 45 ff 1b 08 and ff 0b 50 ff 1b 42
-+ * - GET_CARRIER_FREQ gets the carrier mode and frequency of the
-+ *   device, with replies in the form of 9f 06 MM FF, where MM is 0-3,
-+ *   meaning clk of 10000000, 2500000, 625000 or 156250, and FF is
-+ *   ((clk / frequency) - 1)
-+ * - GET_RX_TIMEOUT fetches the receiver timeout in units of 50us,
-+ *   response in the form of 9f 0c msb lsb
-+ * - GET_TX_BITMASK fetches the transmitter bitmask, replies in
-+ *   the form of 9f 08 bm, where bm is the bitmask
-+ * - GET_RX_SENSOR fetches the RX sensor setting -- long-range
-+ *   general use one or short-range learning one, in the form of
-+ *   9f 14 ss, where ss is either 01 for long-range or 02 for short
-+ * - SET_CARRIER_FREQ sets a new carrier mode and frequency
-+ * - SET_TX_BITMASK sets the transmitter bitmask
-+ * - SET_RX_TIMEOUT sets the receiver timeout
-+ * - SET_RX_SENSOR sets which receiver sensor to use
-+ */
-+static char DEVICE_RESET[]	= {0x00, 0xff, 0xaa};
-+static char GET_REVISION[]	= {0xff, 0x0b};
-+static char GET_UNKNOWN[]	= {0xff, 0x18};
-+static char GET_UNKNOWN2[]	= {0x9f, 0x05};
-+static char GET_CARRIER_FREQ[]	= {0x9f, 0x07};
-+static char GET_RX_TIMEOUT[]	= {0x9f, 0x0d};
-+static char GET_TX_BITMASK[]	= {0x9f, 0x13};
-+static char GET_RX_SENSOR[]	= {0x9f, 0x15};
-+/* sub in desired values in lower byte or bytes for full command */
-+//static char SET_CARRIER_FREQ[]	= {0x9f, 0x06, 0x00, 0x00};
-+//static char SET_TX_BITMASK[]	= {0x9f, 0x08, 0x00};
-+//static char SET_RX_TIMEOUT[]	= {0x9f, 0x0c, 0x00, 0x00};
-+//static char SET_RX_SENSOR[]	= {0x9f, 0x14, 0x00};
- 
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 11)
- static unsigned long usecs_to_jiffies(const unsigned int u)
-@@ -320,22 +351,126 @@
- #endif
- }
- #endif
--static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf, int len)
-+static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf,
-+				 int len, bool out)
- {
- 	char codes[USB_BUFLEN * 3 + 1];
-+	char inout[9];
- 	int i;
-+	u8 cmd, subcmd, data1, data2;
-+	int idx = 0;
- 
--	if (len <= 0)
--		return;
-+	if (ir->flags.microsoft_gen1 && !out)
-+		idx = 2;
- 
--	if (ir->flags.microsoft_gen1 && len <= 2)
-+	if (len <= idx)
- 		return;
- 
- 	for (i = 0; i < len && i < USB_BUFLEN; i++)
- 		snprintf(codes + i * 3, 4, "%02x ", buf[i] & 0xFF);
- 
--	printk(KERN_INFO "" DRIVER_NAME "[%d]: data received %s (length=%d)\n",
--		ir->devnum, codes, len);
-+	printk(KERN_INFO "" DRIVER_NAME "[%d]: %sx data: %s (length=%d)\n",
-+		ir->devnum, (out ? "t" : "r"), codes, len);
-+
-+	if (out)
-+		strcpy(inout, "Request\0");
-+	else
-+		strcpy(inout, "Got\0");
-+
-+	cmd    = buf[idx] & 0xff;
-+	subcmd = buf[idx + 1] & 0xff;
-+	data1  = buf[idx + 2] & 0xff;
-+	data2  = buf[idx + 3] & 0xff;
-+
-+	switch (cmd) {
-+	case 0x00:
-+		if (subcmd == 0xff && data1 == 0xaa)
-+			printk(KERN_INFO "Device reset requested\n");
-+		else
-+			printk(KERN_INFO "Unknown command 0x%02x 0x%02x\n",
-+				cmd, subcmd);
-+		break;
-+	case 0xff:
-+		switch (subcmd) {
-+		case 0x0b:
-+			if (len == 2)
-+				printk(KERN_INFO "Get hw/sw rev?\n");
-+			else
-+				printk(KERN_INFO "hw/sw rev 0x%02x 0x%02x "
-+					"0x%02x 0x%02x\n", data1, data2,
-+					buf[4], buf[5]);
-+			break;
-+		case 0xaa:
-+			printk(KERN_INFO "Device reset requested\n");
-+			break;
-+		case 0xfe:
-+			printk(KERN_INFO "Previous command not supported\n");
-+			break;
-+		case 0x18:
-+		case 0x1b:
-+		default:
-+			printk(KERN_INFO "Unknown command 0x%02x 0x%02x\n",
-+				cmd, subcmd);
-+			break;
-+		}
-+		break;
-+	case 0x9f:
-+		switch (subcmd) {
-+		case 0x03:
-+			printk(KERN_INFO "Ping\n");
-+			break;
-+		case 0x04:
-+			printk(KERN_INFO "Resp to 9f 05 of 0x%02x 0x%02x\n",
-+				data1, data2);
-+			break;
-+		case 0x06:
-+			printk(KERN_INFO "%s carrier mode and freq of 0x%02x 0x%02x\n",
-+				inout, data1, data2);
-+			break;
-+		case 0x07:
-+			printk(KERN_INFO "Get carrier mode and freq\n");
-+			break;
-+		case 0x08:
-+			printk(KERN_INFO "%s transmit blaster mask of 0x%02x\n",
-+				inout, data1);
-+			break;
-+		case 0x0c:
-+			/* value is in units of 50us, so x*50/100 or x/2 ms */
-+			printk(KERN_INFO "%s receive timeout of %d ms\n",
-+				inout, ((data1 << 8) | data2) / 2);
-+			break;
-+		case 0x0d:
-+			printk(KERN_INFO "Get receive timeout\n");
-+			break;
-+		case 0x13:
-+			printk(KERN_INFO "Get transmit blaster mask\n");
-+			break;
-+		case 0x14:
-+			printk(KERN_INFO "%s %s-range receive sensor in use\n",
-+				inout, data1 == 0x02 ? "short" : "long");
-+			break;
-+		case 0x15:
-+			if (len == 2)
-+				printk(KERN_INFO "Get receive sensor\n");
-+			else
-+				printk(KERN_INFO "Received pulse count is %d\n",
-+					((data1 << 8) | data2));
-+			break;
-+		case 0xfe:
-+			printk(KERN_INFO "Error! Hardware is likely wedged...\n");
-+			break;
-+		case 0x05:
-+		case 0x09:
-+		case 0x0f:
-+		default:
-+			printk(KERN_INFO "Unknown command 0x%02x 0x%02x\n",
-+				cmd, subcmd);
-+			break;
-+		}
-+		break;
-+	default:
-+		break;
-+	}
- }
- 
- static void usb_async_callback(struct urb *urb, struct pt_regs *regs)
-@@ -355,54 +490,48 @@
- 			ir->devnum, urb->status, len);
- 
- 		if (debug)
--			mceusb_dev_printdata(ir, urb->transfer_buffer, len);
-+			mceusb_dev_printdata(ir, urb->transfer_buffer, len, true);
- 	}
- 
- }
- 
- /* request incoming or send outgoing usb packet - used to initialize remote */
--static void request_packet_async(struct mceusb_dev *ir,
--				 struct usb_endpoint_descriptor *ep,
--				 unsigned char *data, int size, int urb_type)
-+static void mce_request_packet(struct mceusb_dev *ir,
-+			       struct usb_endpoint_descriptor *ep,
-+			       unsigned char *data, int size, int urb_type)
- {
- 	int res;
- 	struct urb *async_urb;
- 	unsigned char *async_buf;
- 
--	if (urb_type) {
-+	if (urb_type == MCEUSB_TX) {
- 		async_urb = usb_alloc_urb(0, GFP_KERNEL);
--		if (unlikely(!async_urb))
-+		if (unlikely(!async_urb)) {
-+			printk(KERN_ERR "Error, couldn't allocate urb!\n");
- 			return;
-+		}
- 
--		async_buf = kmalloc(size, GFP_KERNEL);
-+		async_buf = kzalloc(size, GFP_KERNEL);
- 		if (!async_buf) {
-+			printk(KERN_ERR "Error, couldn't allocate buf!\n");
- 			usb_free_urb(async_urb);
- 			return;
- 		}
- 
--		if (urb_type == MCEUSB_OUTBOUND) {
--			/* outbound data */
--			usb_fill_int_urb(async_urb, ir->usbdev,
--				usb_sndintpipe(ir->usbdev,
--					ep->bEndpointAddress),
--				async_buf, size,
--				(usb_complete_t) usb_async_callback,
--				ir, ep->bInterval);
--			memcpy(async_buf, data, size);
--		} else {
--			/* inbound data */
--			usb_fill_int_urb(async_urb, ir->usbdev,
--				usb_rcvintpipe(ir->usbdev,
--					ep->bEndpointAddress),
--				async_buf, size,
--				(usb_complete_t) usb_async_callback,
--				ir, ep->bInterval);
--		}
--		async_urb->transfer_flags = URB_ASYNC_UNLINK;
--	} else {
-+		/* outbound data */
-+		usb_fill_int_urb(async_urb, ir->usbdev,
-+			usb_sndintpipe(ir->usbdev, ep->bEndpointAddress),
-+			async_buf, size, (usb_complete_t) usb_async_callback,
-+			ir, ep->bInterval);
-+		memcpy(async_buf, data, size);
-+
-+	} else if (urb_type == MCEUSB_RX) {
- 		/* standard request */
- 		async_urb = ir->urb_in;
- 		ir->send_flags = RECV_FLAG_IN_PROGRESS;
-+	} else {
-+		printk(KERN_ERR "Error! Unknown urb type %d\n", urb_type);
-+		return;
- 	}
- 
- 	dprintk(DRIVER_NAME "[%d]: receive request called (size=%#x)\n",
-@@ -421,6 +550,16 @@
- 		ir->devnum, res);
- }
- 
-+static void mce_async_out(struct mceusb_dev *ir, unsigned char *data, int size)
-+{
-+	mce_request_packet(ir, ir->usb_ep_out, data, size, MCEUSB_TX);
-+}
-+
-+static void mce_sync_in(struct mceusb_dev *ir, unsigned char *data, int size)
-+{
-+	mce_request_packet(ir, ir->usb_ep_in, data, size, MCEUSB_RX);
-+}
-+
- static int unregister_from_lirc(struct mceusb_dev *ir)
- {
- 	struct lirc_driver *d = ir->d;
-@@ -496,9 +635,9 @@
- 	dprintk(DRIVER_NAME "[%d]: mceusb IR device closed\n", ir->devnum);
- 
- 	if (ir->flags.connected) {
--		mutex_lock(&ir->lock);
-+		mutex_lock(&ir->dev_lock);
- 		ir->flags.connected = 0;
--		mutex_unlock(&ir->lock);
-+		mutex_unlock(&ir->dev_lock);
- 	}
- 	MOD_DEC_USE_COUNT;
- }
-@@ -616,7 +755,7 @@
- 	buf_len = urb->actual_length;
- 
- 	if (debug)
--		mceusb_dev_printdata(ir, urb->transfer_buffer, buf_len);
-+		mceusb_dev_printdata(ir, urb->transfer_buffer, buf_len, false);
- 
- 	if (ir->send_flags == RECV_FLAG_IN_PROGRESS) {
- 		ir->send_flags = SEND_FLAG_COMPLETE;
-@@ -715,8 +854,7 @@
- 	cmdbuf[cmdcount++] = 0x80;
- 
- 	/* Transmit the command to the mce device */
--	request_packet_async(ir, ir->usb_ep_out, cmdbuf,
--			     cmdcount, MCEUSB_OUTBOUND);
-+	mce_async_out(ir, cmdbuf, cmdcount);
- 
- 	/*
- 	 * The lircd gap calculation expects the write function to
-@@ -762,9 +900,7 @@
- 			ir->carrier_freq = carrier;
- 			dprintk(DRIVER_NAME "[%d]: SET_CARRIER disabling "
- 				"carrier modulation\n", ir->devnum);
--			request_packet_async(ir, ir->usb_ep_out,
--					     cmdbuf, sizeof(cmdbuf),
--					     MCEUSB_OUTBOUND);
-+			mce_async_out(ir, cmdbuf, sizeof(cmdbuf));
- 			return carrier;
- 		}
- 
-@@ -779,9 +915,7 @@
- 					ir->devnum, carrier);
- 
- 				/* Transmit new carrier to mce device */
--				request_packet_async(ir, ir->usb_ep_out,
--						     cmdbuf, sizeof(cmdbuf),
--						     MCEUSB_OUTBOUND);
-+				mce_async_out(ir, cmdbuf, sizeof(cmdbuf));
- 				return carrier;
- 			}
- 		}
-@@ -799,7 +933,6 @@
- {
- 	int result;
- 	unsigned int ivalue;
--	unsigned long lvalue;
- 	struct mceusb_dev *ir = NULL;
- 
- 	/* Retrieve lirc_driver data for the device */
-@@ -828,26 +961,6 @@
- 		dprintk(DRIVER_NAME ": SET_TRANSMITTERS mask=%d\n", ivalue);
- 		break;
- 
--	case LIRC_GET_SEND_MODE:
--
--		result = put_user(LIRC_SEND2MODE(LIRC_CAN_SEND_PULSE &
--						 LIRC_CAN_SEND_MASK),
--				  (unsigned long *) arg);
--
--		if (result)
--			return result;
--		break;
--
--	case LIRC_SET_SEND_MODE:
--
--		result = get_user(lvalue, (unsigned long *) arg);
--
--		if (result)
--			return result;
--		if (lvalue != (LIRC_MODE_PULSE&LIRC_CAN_SEND_MASK))
--			return -EINVAL;
--		break;
--
- 	case LIRC_SET_SEND_CARRIER:
- 
- 		result = get_user(ivalue, (unsigned int *) arg);
-@@ -870,45 +983,25 @@
- 	.ioctl	= mceusb_lirc_ioctl,
- };
- 
--static int mceusb_gen1_init(struct mceusb_dev *ir)
-+static void mceusb_gen1_init(struct mceusb_dev *ir)
- {
--	int i, ret;
--	char junk[64], data[8];
--	int partial = 0;
--
--	/*
--	 * Clear off the first few messages. These look like calibration
--	 * or test data, I can't really tell. This also flushes in case
--	 * we have random ir data queued up.
--	 */
--	for (i = 0; i < 40; i++)
--		usb_bulk_msg(ir->usbdev,
--			usb_rcvbulkpipe(ir->usbdev,
--				ir->usb_ep_in->bEndpointAddress),
--			junk, 64, &partial, HZ * 10);
--
--	ir->is_pulse = 1;
--
--	memset(data, 0, 8);
--
--	/* Get Status */
--	ret = usb_control_msg(ir->usbdev, usb_rcvctrlpipe(ir->usbdev, 0),
--			      USB_REQ_GET_STATUS, USB_DIR_IN,
--			      0, 0, data, 2, HZ * 3);
--
--	/*    ret = usb_get_status( ir->usbdev, 0, 0, data ); */
--	dprintk("%s - ret = %d status = 0x%x 0x%x\n", __func__,
--		ret, data[0], data[1]);
-+	int ret;
-+	int maxp = ir->len_in;
-+	char *data;
-+
-+	data = kzalloc(USB_CTRL_MSG_SZ, GFP_KERNEL);
-+	if (!data) {
-+		printk(KERN_ERR "%s: memory allocation failed!\n", __func__);
-+		return;
-+	}
- 
- 	/*
- 	 * This is a strange one. They issue a set address to the device
- 	 * on the receive control pipe and expect a certain value pair back
- 	 */
--	memset(data, 0, 8);
--
- 	ret = usb_control_msg(ir->usbdev, usb_rcvctrlpipe(ir->usbdev, 0),
- 			      USB_REQ_SET_ADDRESS, USB_TYPE_VENDOR, 0, 0,
--			      data, 2, HZ * 3);
-+			      data, USB_CTRL_MSG_SZ, HZ * 3);
- 	dprintk("%s - ret = %d, devnum = %d\n",
- 		__func__, ret, ir->usbdev->devnum);
- 	dprintk("%s - data[0] = %d, data[1] = %d\n",
-@@ -933,12 +1026,62 @@
- 			      0x0000, 0x0100, NULL, 0, HZ * 3);
- 	dprintk("%s - retC = %d\n", __func__, ret);
- 
--	return ret;
-+	/* device reset */
-+	mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET));
-+	mce_sync_in(ir, NULL, maxp);
-+
-+	/* get hw/sw revision? */
-+	mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION));
-+	mce_sync_in(ir, NULL, maxp);
-+
-+	kfree(data);
-+
-+	return;
- 
- };
- 
--static int mceusb_dev_probe(struct usb_interface *intf,
--				const struct usb_device_id *id)
-+static void mceusb_gen2_init(struct mceusb_dev *ir)
-+{
-+	int maxp = ir->len_in;
-+
-+	/* device reset */
-+	mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET));
-+	mce_sync_in(ir, NULL, maxp);
-+
-+	/* get hw/sw revision? */
-+	mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION));
-+	mce_sync_in(ir, NULL, maxp);
-+
-+	/* unknown what the next two actually return... */
-+	mce_async_out(ir, GET_UNKNOWN, sizeof(GET_UNKNOWN));
-+	mce_sync_in(ir, NULL, maxp);
-+	mce_async_out(ir, GET_UNKNOWN2, sizeof(GET_UNKNOWN2));
-+	mce_sync_in(ir, NULL, maxp);
-+}
-+
-+static void mceusb_get_parameters(struct mceusb_dev *ir)
-+{
-+	int maxp = ir->len_in;
-+
-+	/* get the carrier and frequency */
-+	mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ));
-+	mce_sync_in(ir, NULL, maxp);
-+
-+	/* get the transmitter bitmask */
-+	mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK));
-+	mce_sync_in(ir, NULL, maxp);
-+
-+	/* get receiver timeout value */
-+	mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT));
-+	mce_sync_in(ir, NULL, maxp);
-+
-+	/* get receiver sensor setting */
-+	mce_async_out(ir, GET_RX_SENSOR, sizeof(GET_RX_SENSOR));
-+	mce_sync_in(ir, NULL, maxp);
-+}
-+
-+static int __devinit mceusb_dev_probe(struct usb_interface *intf,
-+				      const struct usb_device_id *id)
- {
- 	struct usb_device *dev = interface_to_usbdev(intf);
- 	struct usb_host_interface *idesc;
-@@ -954,19 +1097,15 @@
- 	int i;
- 	char buf[63], name[128] = "";
- 	int mem_failure = 0;
--	int is_pinnacle;
--	int is_microsoft_gen1;
-+	bool is_gen3;
-+	bool is_microsoft_gen1;
- 
- 	dprintk(DRIVER_NAME ": %s called\n", __func__);
- 
--	usb_reset_device(dev);
--
- 	config = dev->actconfig;
--
- 	idesc = intf->cur_altsetting;
- 
--	is_pinnacle = usb_match_id(intf, pinnacle_list) ? 1 : 0;
--
-+	is_gen3 = usb_match_id(intf, gen3_list) ? 1 : 0;
- 	is_microsoft_gen1 = usb_match_id(intf, microsoft_gen1_list) ? 1 : 0;
- 
- 	/* step through the endpoints to find first bulk in and out endpoint */
-@@ -985,14 +1124,7 @@
- 				"found\n");
- 			ep_in = ep;
- 			ep_in->bmAttributes = USB_ENDPOINT_XFER_INT;
--			if (is_pinnacle)
--				/*
--				 * setting seems to 1 seem to cause issues with
--				 * Pinnacle timing out on transfer.
--				 */
--				ep_in->bInterval = ep->bInterval;
--			else
--				ep_in->bInterval = 1;
-+			ep_in->bInterval = 1;
- 		}
- 
- 		if ((ep_out == NULL)
-@@ -1007,14 +1139,7 @@
- 				"found\n");
- 			ep_out = ep;
- 			ep_out->bmAttributes = USB_ENDPOINT_XFER_INT;
--			if (is_pinnacle)
--				/*
--				 * setting seems to 1 seem to cause issues with
--				 * Pinnacle timing out on transfer.
--				 */
--				ep_out->bInterval = ep->bInterval;
--			else
--				ep_out->bInterval = 1;
-+			ep_out->bInterval = 1;
- 		}
- 	}
- 	if (ep_in == NULL || ep_out == NULL) {
-@@ -1029,39 +1154,27 @@
- 
- 	mem_failure = 0;
- 	ir = kzalloc(sizeof(struct mceusb_dev), GFP_KERNEL);
--	if (!ir) {
--		mem_failure = 1;
--		goto mem_failure_switch;
--	}
-+	if (!ir)
-+		goto mem_alloc_fail;
- 
- 	driver = kzalloc(sizeof(struct lirc_driver), GFP_KERNEL);
--	if (!driver) {
--		mem_failure = 2;
--		goto mem_failure_switch;
--	}
-+	if (!driver)
-+		goto mem_alloc_fail;
- 
--	rbuf = kmalloc(sizeof(struct lirc_buffer), GFP_KERNEL);
--	if (!rbuf) {
--		mem_failure = 3;
--		goto mem_failure_switch;
--	}
--
--	if (lirc_buffer_init(rbuf, sizeof(lirc_t), LIRCBUF_SIZE)) {
--		mem_failure = 4;
--		goto mem_failure_switch;
--	}
--
--	ir->buf_in = usb_buffer_alloc(dev, maxp, GFP_ATOMIC, &ir->dma_in);
--	if (!ir->buf_in) {
--		mem_failure = 5;
--		goto mem_failure_switch;
--	}
-+	rbuf = kzalloc(sizeof(struct lirc_buffer), GFP_KERNEL);
-+	if (!rbuf)
-+		goto mem_alloc_fail;
-+
-+	if (lirc_buffer_init(rbuf, sizeof(lirc_t), LIRCBUF_SIZE))
-+		goto mem_alloc_fail;
-+
-+	ir->buf_in = usb_alloc_coherent(dev, maxp, GFP_ATOMIC, &ir->dma_in);
-+	if (!ir->buf_in)
-+		goto buf_in_alloc_fail;
- 
- 	ir->urb_in = usb_alloc_urb(0, GFP_KERNEL);
--	if (!ir->urb_in) {
--		mem_failure = 7;
--		goto mem_failure_switch;
--	}
-+	if (!ir->urb_in)
-+		goto urb_in_alloc_fail;
- 
- 	strcpy(driver->name, DRIVER_NAME " ");
- 	driver->minor = -1;
-@@ -1078,33 +1191,12 @@
- 	driver->dev   = &intf->dev;
- 	driver->owner = THIS_MODULE;
- 
--	mutex_init(&ir->lock);
-+	mutex_init(&ir->dev_lock);
- 	init_waitqueue_head(&ir->wait_out);
- 
- 	minor = lirc_register_driver(driver);
- 	if (minor < 0)
--		mem_failure = 9;
--
--mem_failure_switch:
--
--	switch (mem_failure) {
--	case 9:
--		usb_free_urb(ir->urb_in);
--	case 7:
--		usb_buffer_free(dev, maxp, ir->buf_in, ir->dma_in);
--	case 5:
--		lirc_buffer_free(rbuf);
--	case 4:
--		kfree(rbuf);
--	case 3:
--		kfree(driver);
--	case 2:
--		kfree(ir);
--	case 1:
--		printk(DRIVER_NAME "[%d]: out of memory (code=%d)\n",
--			devnum, mem_failure);
--		return -ENOMEM;
--	}
-+		goto lirc_register_fail;
- 
- 	driver->minor = minor;
- 	ir->d = driver;
-@@ -1113,7 +1205,6 @@
- 	ir->len_in = maxp;
- 	ir->overflow_len = 0;
- 	ir->flags.connected = 0;
--	ir->flags.pinnacle = is_pinnacle;
- 	ir->flags.microsoft_gen1 = is_microsoft_gen1;
- 	ir->flags.transmitter_mask_inverted =
- 		usb_match_id(intf, transmitter_mask_list) ? 0 : 1;
-@@ -1121,8 +1212,6 @@
- 	ir->lircdata = PULSE_MASK;
- 	ir->is_pulse = 0;
- 
--	/* ir->flags.transmitter_mask_inverted must be set */
--	set_transmitter_mask(ir, MCE_DEFAULT_TX_MASK);
- 	/* Saving usb interface data for use by the transmitter routine */
- 	ir->usb_ep_in = ep_in;
- 	ir->usb_ep_out = ep_out;
-@@ -1139,73 +1228,49 @@
- 	printk(DRIVER_NAME "[%d]: %s on usb%d:%d\n", devnum, name,
- 	       dev->bus->busnum, devnum);
- 
--	/* inbound data */
-+	/* flush buffers on the device */
-+	mce_sync_in(ir, NULL, maxp);
-+	mce_sync_in(ir, NULL, maxp);
-+
-+	/* wire up inbound data handler */
- 	usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in,
- 		maxp, (usb_complete_t) mceusb_dev_recv, ir, ep_in->bInterval);
- 	ir->urb_in->transfer_dma = ir->dma_in;
- 	ir->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
- 
- 	/* initialize device */
--	if (ir->flags.pinnacle) {
--		int usbret;
--
--		/*
--		 * I have no idea why but this reset seems to be crucial to
--		 * getting the device to do outbound IO correctly - without
--		 * this the device seems to hang, ignoring all input - although
--		 * IR signals are correctly sent from the device, no input is
--		 * interpreted by the device and the host never does the
--		 * completion routine
--		 */
--
--		usbret = usb_reset_configuration(dev);
--		printk(DRIVER_NAME "[%d]: usb reset config ret %x\n",
--		       devnum, usbret);
--
--		/*
--		 * its possible we really should wait for a return
--		 * for each of these...
--		 */
--		request_packet_async(ir, ep_in, NULL, maxp, MCEUSB_INBOUND);
--		request_packet_async(ir, ep_out, pin_init1, sizeof(pin_init1),
--				     MCEUSB_OUTBOUND);
--		request_packet_async(ir, ep_in, NULL, maxp, MCEUSB_INBOUND);
--		request_packet_async(ir, ep_out, pin_init2, sizeof(pin_init2),
--				     MCEUSB_OUTBOUND);
--		request_packet_async(ir, ep_in, NULL, maxp, MCEUSB_INBOUND);
--		request_packet_async(ir, ep_out, pin_init3, sizeof(pin_init3),
--				     MCEUSB_OUTBOUND);
--	} else if (ir->flags.microsoft_gen1) {
--		/* original ms mce device requires some additional setup */
-+	if (ir->flags.microsoft_gen1)
- 		mceusb_gen1_init(ir);
--	} else {
-+	else if (!is_gen3)
-+		mceusb_gen2_init(ir);
- 
--		request_packet_async(ir, ep_in, NULL, maxp, MCEUSB_INBOUND);
--		request_packet_async(ir, ep_in, NULL, maxp, MCEUSB_INBOUND);
--		request_packet_async(ir, ep_out, init1,
--				     sizeof(init1), MCEUSB_OUTBOUND);
--		request_packet_async(ir, ep_in, NULL, maxp, MCEUSB_INBOUND);
--		request_packet_async(ir, ep_out, init2,
--				     sizeof(init2), MCEUSB_OUTBOUND);
--	}
-+	mceusb_get_parameters(ir);
- 
--	/*
--	 * if we don't issue the correct number of receives (MCEUSB_INBOUND)
--	 * for each outbound, then the first few ir pulses will be interpreted
--	 * by the usb_async_callback routine - we should ensure we have the
--	 * right amount OR less - as the meusb_dev_recv routine will handle
--	 * the control packets OK - they start with 0x9f - but the async
--	 * callback doesn't handle ir pulse packets
--	 */
--	request_packet_async(ir, ep_in, NULL, maxp, 0);
-+	/* ir->flags.transmitter_mask_inverted must be set */
-+	set_transmitter_mask(ir, MCE_DEFAULT_TX_MASK);
- 
- 	usb_set_intfdata(intf, ir);
- 
- 	return 0;
-+
-+	/* Error-handling path */
-+lirc_register_fail:
-+	usb_free_urb(ir->urb_in);
-+urb_in_alloc_fail:
-+	usb_free_coherent(dev, maxp, ir->buf_in, ir->dma_in);
-+buf_in_alloc_fail:
-+	lirc_buffer_free(rbuf);
-+mem_alloc_fail:
-+	kfree(rbuf);
-+	kfree(driver);
-+	kfree(ir);
-+	printk(KERN_ERR "out of memory (code=%d)\n", mem_failure);
-+
-+	return -ENOMEM;
- }
- 
- 
--static void mceusb_dev_disconnect(struct usb_interface *intf)
-+static void __devexit mceusb_dev_disconnect(struct usb_interface *intf)
- {
- 	struct usb_device *dev = interface_to_usbdev(intf);
- 	struct mceusb_dev *ir = usb_get_intfdata(intf);
-@@ -1218,11 +1283,11 @@
- 	ir->usbdev = NULL;
- 	wake_up_all(&ir->wait_out);
- 
--	mutex_lock(&ir->lock);
-+	mutex_lock(&ir->dev_lock);
- 	usb_kill_urb(ir->urb_in);
- 	usb_free_urb(ir->urb_in);
--	usb_buffer_free(dev, ir->len_in, ir->buf_in, ir->dma_in);
--	mutex_unlock(&ir->lock);
-+	usb_free_coherent(dev, ir->len_in, ir->buf_in, ir->dma_in);
-+	mutex_unlock(&ir->dev_lock);
- 
- 	unregister_from_lirc(ir);
- }
---- drivers/lirc_streamzap/lirc_streamzap.c	2010/03/17 14:16:16	1.48
-+++ drivers/lirc_streanzap/lirc_streamzap.c	2010/07/25 16:43:33	1.54
-@@ -1,4 +1,4 @@
--/*      $Id: lirc_streamzap.c,v 1.48 2009/03/15 09:34:00 lirc Exp $      */
-+/*      $Id: lirc_streamzap.c,v 1.54 2010/07/25 16:43:33 jarodwilson Exp $      */
- /*
-  * Streamzap Remote Control driver
-  *
-@@ -54,7 +56,7 @@
- #include "drivers/kcompat.h"
- #include "drivers/lirc_dev/lirc_dev.h"
- 
--#define DRIVER_VERSION	"$Revision: 1.48 $"
-+#define DRIVER_VERSION	"$Revision: 1.54 $"
- #define DRIVER_NAME	"lirc_streamzap"
- #define DRIVER_DESC	"Streamzap Remote Control driver"
- 
-@@ -83,10 +85,11 @@
- 
- #define STREAMZAP_PULSE_MASK 0xf0
- #define STREAMZAP_SPACE_MASK 0x0f
-+#define STREAMZAP_TIMEOUT    0xff
- #define STREAMZAP_RESOLUTION 256
- 
- /* number of samples buffered */
--#define STREAMZAP_BUFFER_SIZE 128
-+#define STREAMZAP_BUFFER_SIZE 256
- 
- enum StreamzapDecoderState {
- 	PulseSpace,
-@@ -154,6 +157,7 @@
- 	struct timer_list	flush_timer;
- 	int			flush;
- 	int			in_use;
-+	int			timeout_enabled;
- };
- 
- 
-@@ -317,12 +321,14 @@
- 
- 		deltv = sz->signal_start.tv_sec-sz->signal_last.tv_sec;
- 		if (deltv > 15) {
--			tmp = PULSE_MASK; /* really long time */
-+			/* really long time */
-+			tmp = LIRC_SPACE(LIRC_VALUE_MASK);
- 		} else {
- 			tmp = (lirc_t) (deltv*1000000+
- 					sz->signal_start.tv_usec -
- 					sz->signal_last.tv_usec);
- 			tmp -= sz->sum;
-+			tmp = LIRC_SPACE(tmp);
- 		}
- 		dprintk("ls %u", sz->driver.minor, tmp);
- 		push(sz, (char *)&tmp);
-@@ -334,7 +340,7 @@
- 	pulse = ((lirc_t) value)*STREAMZAP_RESOLUTION;
- 	pulse += STREAMZAP_RESOLUTION/2;
- 	sz->sum += pulse;
--	pulse |= PULSE_BIT;
-+	pulse =  LIRC_PULSE(pulse);
- 
- 	dprintk("p %u", sz->driver.minor, pulse&PULSE_MASK);
- 	push(sz, (char *)&pulse);
-@@ -354,6 +360,7 @@
- 	space = ((lirc_t) value)*STREAMZAP_RESOLUTION;
- 	space += STREAMZAP_RESOLUTION/2;
- 	sz->sum += space;
-+	space = LIRC_SPACE(space);
- 	dprintk("s %u", sz->driver.minor, space);
- 	push(sz, (char *)&space);
- }
-@@ -426,9 +433,16 @@
- 				sz->decoder_state = IgnorePulse;
- 				break;
- 			case FullSpace:
--				if (sz->buf_in[i] == 0xff) {
-+				if (sz->buf_in[i] == STREAMZAP_TIMEOUT) {
- 					sz->idle = 1;
- 					stop_timer(sz);
-+					if (sz->timeout_enabled) {
-+						lirc_t timeout =
-+							LIRC_TIMEOUT
-+							(STREAMZAP_TIMEOUT *
-+							 STREAMZAP_RESOLUTION);
-+						push(sz, (char *)&timeout);
-+					}
- 					flush_delay_buffer(sz);
- 				} else
- 					push_full_space(sz, sz->buf_in[i]);
-@@ -546,8 +560,8 @@
- 
- 	sz->buf_in_len = sz->endpoint->wMaxPacketSize;
- #ifdef KERNEL_2_5
--	sz->buf_in = usb_buffer_alloc(sz->udev, sz->buf_in_len,
--				      GFP_ATOMIC, &sz->dma_in);
-+	sz->buf_in = usb_alloc_coherent(sz->udev, sz->buf_in_len,
-+					GFP_ATOMIC, &sz->dma_in);
- #else
- 	sz->buf_in = kmalloc(sz->buf_in_len, GFP_KERNEL);
- #endif
-@@ -579,8 +593,12 @@
- 	sz->driver.minor = -1;
- 	sz->driver.sample_rate = 0;
- 	sz->driver.code_length = sizeof(lirc_t) * 8;
--	sz->driver.features = LIRC_CAN_REC_MODE2 | LIRC_CAN_GET_REC_RESOLUTION;
-+	sz->driver.features = LIRC_CAN_REC_MODE2 |
-+		LIRC_CAN_GET_REC_RESOLUTION |
-+		LIRC_CAN_SET_REC_TIMEOUT;
- 	sz->driver.data = sz;
-+	sz->driver.min_timeout = STREAMZAP_TIMEOUT * STREAMZAP_RESOLUTION;
-+	sz->driver.max_timeout = STREAMZAP_TIMEOUT * STREAMZAP_RESOLUTION;
- 	sz->driver.rbuf = &sz->lirc_buf;
- 	sz->driver.set_use_inc = &streamzap_use_inc;
- 	sz->driver.set_use_dec = &streamzap_use_dec;
-@@ -657,7 +675,7 @@
- 	if (sz) {
- 		usb_free_urb(sz->urb_in);
- #ifdef KERNEL_2_5
--		usb_buffer_free(udev, sz->buf_in_len, sz->buf_in, sz->dma_in);
-+		usb_free_coherent(udev, sz->buf_in_len, sz->buf_in, sz->dma_in);
- #else
- 		if (sz->buf_in) {
- 			kfree(sz->buf_in);
-@@ -691,6 +709,8 @@
- 	sz->flush = 1;
- 	add_timer(&sz->flush_timer);
- 
-+	sz->timeout_enabled = 0;
-+
- 	sz->urb_in->dev = sz->udev;
- #ifdef KERNEL_2_5
- 	if (usb_submit_urb(sz->urb_in, GFP_ATOMIC)) {
-@@ -733,18 +753,35 @@
- static int streamzap_ioctl(struct inode *node, struct file *filep,
- 			   unsigned int cmd, unsigned long arg)
- {
--	int result;
-+	int result = 0;
-+	lirc_t val;
-+	unsigned int flag = 0;
-+	struct usb_streamzap *sz = lirc_get_pdata(filep);
- 
- 	switch (cmd) {
- 	case LIRC_GET_REC_RESOLUTION:
- 		result = put_user(STREAMZAP_RESOLUTION, (unsigned int *) arg);
--		if (result)
--			return result;
-+		break;
-+	case LIRC_SET_REC_TIMEOUT:
-+		result = get_user(val, (lirc_t *)arg);
-+		if (result == 0) {
-+			if (val != STREAMZAP_TIMEOUT * STREAMZAP_RESOLUTION)
-+				result = -EINVAL;
-+		}
-+		break;
-+	case LIRC_SET_REC_TIMEOUT_REPORTS:
-+		result = get_user(flag, (unsigned int *)arg);
-+		if (result == 0) {
-+			if (flag != 0)
-+				sz->timeout_enabled = 1;
-+			else
-+				sz->timeout_enabled = 0;
-+		}
- 		break;
- 	default:
- 		return -ENOIOCTLCMD;
- 	}
--	return 0;
-+	return result;
- }
- 
- /**
-@@ -788,7 +825,7 @@
- 	usb_free_urb(sz->urb_in);
- 
- #ifdef KERNEL_2_5
--	usb_buffer_free(sz->udev, sz->buf_in_len, sz->buf_in, sz->dma_in);
-+	usb_free_coherent(sz->udev, sz->buf_in_len, sz->buf_in, sz->dma_in);
- #else
- 	kfree(sz->buf_in);
- #endif
---- drivers/lirc.h	2009/08/29 07:52:41	5.19
-+++ drivers/lirc.h	2010/05/13 15:45:48	5.27
-@@ -1,4 +1,4 @@
--/*      $Id: lirc.h,v 5.19 2009/08/29 07:52:41 lirc Exp $      */
-+/*      $Id: lirc.h,v 5.27 2010/05/13 15:45:48 lirc Exp $      */
- 
- #ifndef _LINUX_LIRC_H
- #define _LINUX_LIRC_H
-@@ -12,8 +12,31 @@
- #include <sys/ioctl.h>
- #endif
- 
--#define PULSE_BIT  0x01000000
--#define PULSE_MASK 0x00FFFFFF
-+/* <obsolete> */
-+#define PULSE_BIT       0x01000000
-+#define PULSE_MASK      0x00FFFFFF
-+/* </obsolete> */
-+
-+#define LIRC_MODE2_SPACE     0x00000000
-+#define LIRC_MODE2_PULSE     0x01000000
-+#define LIRC_MODE2_FREQUENCY 0x02000000
-+#define LIRC_MODE2_TIMEOUT   0x03000000
-+
-+#define LIRC_VALUE_MASK      0x00FFFFFF
-+#define LIRC_MODE2_MASK      0xFF000000
-+
-+#define LIRC_SPACE(val) (((val)&LIRC_VALUE_MASK) | LIRC_MODE2_SPACE)
-+#define LIRC_PULSE(val) (((val)&LIRC_VALUE_MASK) | LIRC_MODE2_PULSE)
-+#define LIRC_FREQUENCY(val) (((val)&LIRC_VALUE_MASK) | LIRC_MODE2_FREQUENCY)
-+#define LIRC_TIMEOUT(val) (((val)&LIRC_VALUE_MASK) | LIRC_MODE2_TIMEOUT)
-+
-+#define LIRC_VALUE(val) ((val)&LIRC_VALUE_MASK)
-+#define LIRC_MODE2(val) ((val)&LIRC_MODE2_MASK)
-+
-+#define LIRC_IS_SPACE(val) (LIRC_MODE2(val) == LIRC_MODE2_SPACE)
-+#define LIRC_IS_PULSE(val) (LIRC_MODE2(val) == LIRC_MODE2_PULSE)
-+#define LIRC_IS_FREQUENCY(val) (LIRC_MODE2(val) == LIRC_MODE2_FREQUENCY)
-+#define LIRC_IS_TIMEOUT(val) (LIRC_MODE2(val) == LIRC_MODE2_TIMEOUT)
- 
- typedef int lirc_t;
- 
-@@ -27,17 +50,17 @@
- #define LIRC_MODE_RAW                  0x00000001
- #define LIRC_MODE_PULSE                0x00000002
- #define LIRC_MODE_MODE2                0x00000004
--#define LIRC_MODE_CODE                 0x00000008
-+/* obsolete: #define LIRC_MODE_CODE                 0x00000008 */
- #define LIRC_MODE_LIRCCODE             0x00000010
--#define LIRC_MODE_STRING               0x00000020
-+/* obsolete: #define LIRC_MODE_STRING               0x00000020 */
- 
- 
- #define LIRC_CAN_SEND_RAW              LIRC_MODE2SEND(LIRC_MODE_RAW)
- #define LIRC_CAN_SEND_PULSE            LIRC_MODE2SEND(LIRC_MODE_PULSE)
- #define LIRC_CAN_SEND_MODE2            LIRC_MODE2SEND(LIRC_MODE_MODE2)
--#define LIRC_CAN_SEND_CODE             LIRC_MODE2SEND(LIRC_MODE_CODE)
-+/* obsolete: #define LIRC_CAN_SEND_CODE             LIRC_MODE2SEND(LIRC_MODE_CODE) */
- #define LIRC_CAN_SEND_LIRCCODE         LIRC_MODE2SEND(LIRC_MODE_LIRCCODE)
--#define LIRC_CAN_SEND_STRING           LIRC_MODE2SEND(LIRC_MODE_STRING)
-+/* obsolete: #define LIRC_CAN_SEND_STRING           LIRC_MODE2SEND(LIRC_MODE_STRING) */
- 
- #define LIRC_CAN_SEND_MASK             0x0000003f
- 
-@@ -48,9 +71,9 @@
- #define LIRC_CAN_REC_RAW               LIRC_MODE2REC(LIRC_MODE_RAW)
- #define LIRC_CAN_REC_PULSE             LIRC_MODE2REC(LIRC_MODE_PULSE)
- #define LIRC_CAN_REC_MODE2             LIRC_MODE2REC(LIRC_MODE_MODE2)
--#define LIRC_CAN_REC_CODE              LIRC_MODE2REC(LIRC_MODE_CODE)
-+/* obsolete: #define LIRC_CAN_REC_CODE              LIRC_MODE2REC(LIRC_MODE_CODE) */
- #define LIRC_CAN_REC_LIRCCODE          LIRC_MODE2REC(LIRC_MODE_LIRCCODE)
--#define LIRC_CAN_REC_STRING            LIRC_MODE2REC(LIRC_MODE_STRING)
-+/* obsolete: #define LIRC_CAN_REC_STRING            LIRC_MODE2REC(LIRC_MODE_STRING) */
- 
- #define LIRC_CAN_REC_MASK              LIRC_MODE2REC(LIRC_CAN_SEND_MASK)
- 
-@@ -60,6 +83,10 @@
- #define LIRC_CAN_SET_REC_DUTY_CYCLE_RANGE 0x40000000
- #define LIRC_CAN_SET_REC_CARRIER_RANGE    0x80000000
- #define LIRC_CAN_GET_REC_RESOLUTION       0x20000000
-+#define LIRC_CAN_SET_REC_TIMEOUT          0x10000000
-+#define LIRC_CAN_SET_REC_FILTER           0x08000000
-+
-+#define LIRC_CAN_MEASURE_CARRIER          0x02000000
- 
- #define LIRC_CAN_SEND(x) ((x)&LIRC_CAN_SEND_MASK)
- #define LIRC_CAN_REC(x) ((x)&LIRC_CAN_REC_MASK)
-@@ -78,10 +105,23 @@
- #define LIRC_GET_REC_DUTY_CYCLE        _IOR('i', 0x00000006, unsigned int)
- #define LIRC_GET_REC_RESOLUTION        _IOR('i', 0x00000007, unsigned int)
- 
-+#define LIRC_GET_MIN_TIMEOUT           _IOR('i', 0x00000008, lirc_t)
-+#define LIRC_GET_MAX_TIMEOUT           _IOR('i', 0x00000009, lirc_t)
-+
-+#define LIRC_GET_MIN_FILTER_PULSE      _IOR('i', 0x0000000a, lirc_t)
-+#define LIRC_GET_MAX_FILTER_PULSE      _IOR('i', 0x0000000b, lirc_t)
-+#define LIRC_GET_MIN_FILTER_SPACE      _IOR('i', 0x0000000c, lirc_t)
-+#define LIRC_GET_MAX_FILTER_SPACE      _IOR('i', 0x0000000d, lirc_t)
-+
- /* code length in bits, currently only for LIRC_MODE_LIRCCODE */
- #define LIRC_GET_LENGTH                _IOR('i', 0x0000000f, unsigned long)
- 
-+/* all values set should be reset by the driver when the device is
-+   reopened */
-+
-+/* obsolete: drivers only support one mode */
- #define LIRC_SET_SEND_MODE             _IOW('i', 0x00000011, unsigned long)
-+/* obsolete: drivers only support one mode */
- #define LIRC_SET_REC_MODE              _IOW('i', 0x00000012, unsigned long)
- /* Note: these can reset the according pulse_width */
- #define LIRC_SET_SEND_CARRIER          _IOW('i', 0x00000013, unsigned int)
-@@ -90,6 +130,26 @@
- #define LIRC_SET_REC_DUTY_CYCLE        _IOW('i', 0x00000016, unsigned int)
- #define LIRC_SET_TRANSMITTER_MASK      _IOW('i', 0x00000017, unsigned int)
- 
-+/* a value of 0 disables all hardware timeouts and data should be
-+   reported as soon as possible */
-+#define LIRC_SET_REC_TIMEOUT           _IOW('i', 0x00000018, lirc_t)
-+/* 1 enables, 0 disables timeout reports in MODE2 */
-+#define LIRC_SET_REC_TIMEOUT_REPORTS   _IOW('i', 0x00000019, unsigned int)
-+
-+/* pulses shorter than this are filtered out by hardware (software
-+   emulation in lirc_dev/lircd?) */
-+#define LIRC_SET_REC_FILTER_PULSE      _IOW('i', 0x0000001a, lirc_t)
-+/* spaces shorter than this are filtered out by hardware (software
-+   emulation in lirc_dev/lircd?) */
-+#define LIRC_SET_REC_FILTER_SPACE      _IOW('i', 0x0000001b, lirc_t)
-+/* if filter cannot be set independently for pulse/space, this should
-+   be used */
-+#define LIRC_SET_REC_FILTER            _IOW('i', 0x0000001c, lirc_t)
-+
-+/* if enabled from the next key press on the driver will send
-+   LIRC_MODE2_FREQUENCY packets */
-+#define LIRC_SET_MEASURE_CARRIER_MODE  _IOW('i', 0x0000001d, unsigned int)
-+
- /*
-  * to set a range use
-  * LIRC_SET_REC_DUTY_CYCLE_RANGE/LIRC_SET_REC_CARRIER_RANGE with the
-@@ -102,4 +162,7 @@
- 
- #define LIRC_NOTIFY_DECODE             _IO('i', 0x00000020)
- 
-+#define LIRC_SETUP_START               _IO('i', 0x00000021)
-+#define LIRC_SETUP_END                 _IO('i', 0x00000022)
-+
- #endif
---- drivers/lirc_dev/lirc_dev.c	2009/08/31 16:57:55	1.96
-+++ drivers/lirc_dev/lirc_dev.c	2010/05/13 15:45:48	1.105
-@@ -17,7 +17,7 @@
-  *  along with this program; if not, write to the Free Software
-  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-  *
-- * $Id: lirc_dev.c,v 1.96 2009/08/31 16:57:55 lirc Exp $
-+ * $Id: lirc_dev.c,v 1.105 2010/05/13 15:45:48 lirc Exp $
-  *
-  */
- 
-@@ -367,8 +369,7 @@
- 	ir->chunk_size = ir->buf->chunk_size;
- 
- 	if (d->features == 0)
--		d->features = (d->code_length > 8) ?
--			LIRC_CAN_REC_LIRCCODE : LIRC_CAN_REC_CODE;
-+		d->features = LIRC_CAN_REC_LIRCCODE;
- 
- 	ir->d = *d;
- 	ir->d.minor = minor;
-@@ -541,7 +542,7 @@
- static int irctl_open(struct inode *inode, struct file *file)
- {
- 	struct irctl *ir;
--	int retval;
-+	int retval = 0;
- 
- 	if (iminor(inode) >= MAX_IRCTL_DEVICES || !irctls[iminor(inode)]) {
- 		dprintk("lirc_dev [%d]: open result = -ENODEV\n",
-@@ -591,6 +592,8 @@
- 		if (ir->task)
- 			wake_up_process(ir->task);
- #endif
-+	} else {
-+		retval = -ENODEV;
- 	}
-  error:
- 	if (ir)
-@@ -692,6 +695,23 @@
- 	case LIRC_GET_FEATURES:
- 		result = put_user(ir->d.features, (unsigned long *)arg);
- 		break;
-+	case LIRC_GET_LENGTH:
-+		result = put_user(ir->d.code_length, (unsigned long *) arg);
-+		break;
-+	case LIRC_GET_MIN_TIMEOUT:
-+		if (!(ir->d.features & LIRC_CAN_SET_REC_TIMEOUT) ||
-+		    ir->d.min_timeout == 0)
-+			return -ENOSYS;
-+
-+		result = put_user(ir->d.min_timeout, (lirc_t *) arg);
-+		break;
-+	case LIRC_GET_MAX_TIMEOUT:
-+		if (!(ir->d.features & LIRC_CAN_SET_REC_TIMEOUT) ||
-+		    ir->d.max_timeout == 0)
-+			return -ENOSYS;
-+
-+		result = put_user(ir->d.max_timeout, (lirc_t *) arg);
-+		break;
- 	case LIRC_GET_REC_MODE:
- 		if (!(ir->d.features & LIRC_CAN_REC_MASK))
- 			return -ENOSYS;
-@@ -700,6 +720,16 @@
- 				  (ir->d.features & LIRC_CAN_REC_MASK),
- 				  (unsigned long *)arg);
- 		break;
-+	case LIRC_GET_SEND_MODE:
-+		if (!(ir->d.features & LIRC_CAN_SEND_MASK))
-+			return -ENOSYS;
-+
-+		result = put_user(LIRC_SEND2MODE
-+				  (ir->d.features & LIRC_CAN_SEND_MASK),
-+				  (unsigned long *)arg);
-+		break;
-+
-+	/*obsolete */
- 	case LIRC_SET_REC_MODE:
- 		if (!(ir->d.features & LIRC_CAN_REC_MASK))
- 			return -ENOSYS;
-@@ -707,18 +737,30 @@
- 		result = get_user(mode, (unsigned long *)arg);
- 		if (!result && !(LIRC_MODE2REC(mode) & ir->d.features))
- 			result = -EINVAL;
--		/*
--		 * FIXME: We should actually set the mode somehow but
--		 * for now, lirc_serial doesn't support mode changing either
--		 */
- 		break;
--	case LIRC_GET_LENGTH:
--		result = put_user(ir->d.code_length, (unsigned long *) arg);
-+	case LIRC_SET_SEND_MODE:
-+		if (!(ir->d.features & LIRC_CAN_SEND_MASK))
-+			return -ENOSYS;
-+
-+		result = get_user(mode, (unsigned long *)arg);
-+		if (!result && !(LIRC_MODE2SEND(mode) & ir->d.features))
-+			result = -EINVAL;
- 		break;
- 	default:
- 		result = -EINVAL;
- 	}
- 
-+	switch (cmd) {
-+	case LIRC_SET_REC_MODE:
-+	case LIRC_SET_SEND_MODE:
-+		printk(KERN_NOTICE LOGHEAD "userspace uses outdated ioctl "
-+			"please update your lirc installation\n",
-+			ir->d.name, ir->d.minor);
-+		break;
-+	default:
-+		break;
-+	}
-+
- 	dprintk(LOGHEAD "ioctl result = %d\n",
- 		ir->d.name, ir->d.minor, result);
- 
-@@ -791,16 +833,31 @@
- 	case LIRC_GET_SEND_DUTY_CYCLE:
- 	case LIRC_GET_REC_DUTY_CYCLE:
- 	case LIRC_GET_REC_RESOLUTION:
-+	case LIRC_GET_MIN_TIMEOUT:
-+	case LIRC_GET_MAX_TIMEOUT:
-+	case LIRC_GET_MIN_FILTER_PULSE:
-+	case LIRC_GET_MAX_FILTER_PULSE:
-+	case LIRC_GET_MIN_FILTER_SPACE:
-+	case LIRC_GET_MAX_FILTER_SPACE:
- 	case LIRC_SET_SEND_CARRIER:
- 	case LIRC_SET_REC_CARRIER:
- 	case LIRC_SET_SEND_DUTY_CYCLE:
- 	case LIRC_SET_REC_DUTY_CYCLE:
- 	case LIRC_SET_TRANSMITTER_MASK:
-+	case LIRC_SET_REC_TIMEOUT:
-+	case LIRC_SET_REC_TIMEOUT_REPORTS:
-+	case LIRC_SET_REC_FILTER_PULSE:
-+	case LIRC_SET_REC_FILTER_SPACE:
-+	case LIRC_SET_REC_FILTER:
-+	case LIRC_SET_MEASURE_CARRIER_MODE:
- 	case LIRC_SET_REC_DUTY_CYCLE_RANGE:
- 	case LIRC_SET_REC_CARRIER_RANGE:
-+	case LIRC_NOTIFY_DECODE:
-+	case LIRC_SETUP_START:
-+	case LIRC_SETUP_END:
- 		/*
--		 * These commands expect (unsigned int *)arg
--		 * so no problems here. Just handle the locking.
-+		 * These commands expect (unsigned int *) or (lirc_t *)
-+		 * arg so no problems here. Just handle the locking.
- 		 */
- 		lock_kernel();
- 		cmd = cmd32;
---- drivers/lirc_dev/lirc_dev.h	2009/12/28 15:21:17	1.38
-+++ drivers/lirc_dev/lirc_dev.h	2010/04/25 08:33:52	1.41
-@@ -4,7 +4,7 @@
-  * (L) by Artur Lipowski <alipowski@interia.pl>
-  *        This code is licensed under GNU GPL
-  *
-- * $Id: lirc_dev.h,v 1.38 2009/12/28 15:21:17 jarodwilson Exp $
-+ * $Id: lirc_dev.h,v 1.41 2010/04/25 08:33:52 lirc Exp $
-  *
-  */
- 
-@@ -28,6 +28,8 @@
- #include <linux/kfifo.h>
- #endif
- 
-+#include "drivers/lirc.h"
-+
- struct lirc_buffer {
- 	wait_queue_head_t wait_poll;
- 	spinlock_t fifo_lock;
-@@ -68,13 +70,13 @@
- #endif
- static inline void lirc_buffer_clear(struct lirc_buffer *buf)
- {
--	unsigned long flags;
--
- #ifdef LIRC_HAVE_KFIFO
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 33)
- 	if (buf->fifo)
- 		kfifo_reset(buf->fifo);
- #else
-+	unsigned long flags;
-+
- 	if (buf->fifo_initialized) {
- 		spin_lock_irqsave(&buf->fifo_lock, flags);
- 		kfifo_reset(&buf->fifo);
-@@ -82,6 +84,8 @@
- 	}
- #endif
- #else
-+	unsigned long flags;
-+
- 	lirc_buffer_lock(buf, &flags);
- 	_lirc_buffer_clear(buf);
- 	lirc_buffer_unlock(buf, &flags);
-@@ -331,6 +335,8 @@
- 	int sample_rate;
- 	unsigned long features;
- 	void *data;
-+	lirc_t min_timeout;
-+	lirc_t max_timeout;
- 	int (*add_to_buf) (void *data, struct lirc_buffer *buf);
- #ifndef LIRC_REMOVE_DURING_EXPORT
- 	wait_queue_head_t* (*get_queue) (void *data);
-@@ -338,7 +344,7 @@
- 	struct lirc_buffer *rbuf;
- 	int (*set_use_inc) (void *data);
- 	void (*set_use_dec) (void *data);
--	struct file_operations *fops;
-+	const struct file_operations *fops;
- 	struct device *dev;
- 	struct module *owner;
- };
diff --git a/abs/core/lirc/kernel-2.6.39.patch b/abs/core/lirc/kernel-2.6.39.patch
new file mode 100644
index 0000000..7353d61
--- /dev/null
+++ b/abs/core/lirc/kernel-2.6.39.patch
@@ -0,0 +1,54 @@
+diff -ru lirc-0.9.0/drivers//lirc_atiusb/lirc_atiusb.c lirc-0.9.0.new/drivers//lirc_atiusb/lirc_atiusb.c
+--- lirc-0.9.0/drivers//lirc_atiusb/lirc_atiusb.c	2011-03-25 23:28:18.000000000 +0100
++++ lirc-0.9.0.new/drivers//lirc_atiusb/lirc_atiusb.c	2011-06-07 17:02:20.356580306 +0200
+@@ -48,7 +48,6 @@
+ #include <linux/slab.h>
+ #include <linux/module.h>
+ #include <linux/kmod.h>
+-#include <linux/smp_lock.h>
+ #include <linux/completion.h>
+ #include <linux/uaccess.h>
+ #include <linux/usb.h>
+diff -ru lirc-0.9.0/drivers//lirc_i2c/lirc_i2c.c lirc-0.9.0.new/drivers//lirc_i2c/lirc_i2c.c
+--- lirc-0.9.0/drivers//lirc_i2c/lirc_i2c.c	2011-03-25 23:28:18.000000000 +0100
++++ lirc-0.9.0.new/drivers//lirc_i2c/lirc_i2c.c	2011-06-07 17:04:19.725933627 +0200
+@@ -555,8 +555,8 @@
+ 		kfree(ir);
+ 		return -EINVAL;
+ 	}
+-	printk(KERN_INFO "lirc_i2c: chip 0x%x found @ 0x%02x (%s)\n",
+-	       adap->id, addr, ir->c.name);
++	printk(KERN_INFO "lirc_i2c: chip found @ 0x%02x (%s)\n",
++	       addr, ir->c.name);
+ 
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 31)
+ 	/* register device */
+diff -ru lirc-0.9.0/drivers//lirc_wpc8769l/lirc_wpc8769l.c lirc-0.9.0.new/drivers//lirc_wpc8769l/lirc_wpc8769l.c
+--- lirc-0.9.0/drivers//lirc_wpc8769l/lirc_wpc8769l.c	2011-03-25 23:28:18.000000000 +0100
++++ lirc-0.9.0.new/drivers//lirc_wpc8769l/lirc_wpc8769l.c	2011-06-07 17:07:23.984935411 +0200
+@@ -361,14 +361,14 @@
+ 		size = count << 3;
+ 
+ 		ldata = (unsigned long *) data_buf;
+-		next_one = generic_find_next_le_bit(ldata, size, 0);
++		next_one = find_next_zero_bit_le(ldata, size, 0);
+ 
+ 		if (next_one > 0)
+ 			put_pulse_bit(next_one
+ 				* WPC8769L_USECS_PER_BIT);
+ 
+ 		while (next_one < size) {
+-			next_zero = generic_find_next_zero_le_bit(ldata,
++			next_zero = find_next_zero_bit_le(ldata,
+ 				size, next_one + 1);
+ 
+ 			put_space_bit(
+@@ -376,7 +376,7 @@
+ 				* WPC8769L_USECS_PER_BIT);
+ 
+ 			if (next_zero < size) {
+-				next_one = generic_find_next_le_bit(ldata,
++				next_one = find_next_bit_le(ldata,
+ 					size, next_zero + 1);
+ 
+ 				put_pulse_bit(
diff --git a/abs/core/lirc/lirc.install b/abs/core/lirc/lirc.install
index f22c9b1..26fb139 100644
--- a/abs/core/lirc/lirc.install
+++ b/abs/core/lirc/lirc.install
@@ -1,50 +1,16 @@
-# This is a default template for a post-install scriptlet.  You can
-# remove any functions you don't need (and this header).
+KERNEL_VERSION=2.6.39-ARCH
 
-# arg 1:  the new package version
-pre_install() {
-  /bin/true
-}
-
-# arg 1:  the new package version
 post_install() {
   # updating module dependencies
   echo ">>> Updating module dependencies. Please wait ..."
-  KERNEL_VERSION=2.6.37-LinHES
-  depmod -v $KERNEL_VERSION > /dev/null 2>&1
-  /bin/true
-}
-
-# arg 1:  the new package version
-# arg 2:  the old package version
-pre_upgrade() {
-  /bin/true
+  depmod $KERNEL_VERSION > /dev/null 2>&1
 }
 
-# arg 1:  the new package version
-# arg 2:  the old package version
 post_upgrade() {
-  # updating module dependencies
-  echo ">>> Updating module dependencies. Please wait ..."
-  KERNEL_VERSION=2.6.37-LinHES
-  depmod -v $KERNEL_VERSION > /dev/null 2>&1
-  /bin/true
-}
-
-# arg 1:  the old package version
-pre_remove() {
-  /bin/true
+  post_install
 }
 
 # arg 1:  the old package version
 post_remove() {
-  # updating module dependencies
-  echo ">>> Updating module dependencies. Please wait ..."
-  KERNEL_VERSION=2.6.37-LinHES
-  depmod -v $KERNEL_VERSION > /dev/null 2>&1
-  /bin/true
+  post_install
 }
-
-op=$1
-shift
-$op $*
diff --git a/abs/core/lirc/lirc.logrotate b/abs/core/lirc/lirc.logrotate
new file mode 100644
index 0000000..623c4f3
--- /dev/null
+++ b/abs/core/lirc/lirc.logrotate
@@ -0,0 +1,5 @@
+/var/log/lircd {
+   missingok
+   notifempty
+   delaycompress
+}
diff --git a/abs/core/lirc/lirc_atiusb-kfifo.patch b/abs/core/lirc/lirc_atiusb-kfifo.patch
new file mode 100644
index 0000000..a64984d
--- /dev/null
+++ b/abs/core/lirc/lirc_atiusb-kfifo.patch
@@ -0,0 +1,31 @@
+From ec3c5660e67c122e2d5eb9cfa838c9709fccf8e0 Mon Sep 17 00:00:00 2001
+From: Jason Martin <publicmsu@gmail.com>
+Date: Fri, 3 Jun 2011 00:12:51 -0400
+Subject: [PATCH] lirc_atiusb: fix buffer alloc to work with new kfifo
+
+I came across posts with regards to lirc_atiusb and its compatibility
+with newer kernels, and their use of kfifo.I spent a little bit of time
+this evening, and was able to correct the issues with the driver, and
+now have a functioning lirc_atiusb device under the 2.6.38 kernel.
+
+Signed-off-by: Jarod Wilson <jarod@redhat.com>
+---
+ drivers/lirc_atiusb/lirc_atiusb.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/lirc_atiusb/lirc_atiusb.c b/drivers/lirc_atiusb/lirc_atiusb.c
+index 52080de..bf2b631 100644
+--- a/drivers/lirc_atiusb/lirc_atiusb.c
++++ b/drivers/lirc_atiusb/lirc_atiusb.c
+@@ -1048,7 +1048,7 @@ static struct atirf_dev *new_irctl(struct usb_interface *intf)
+ 		goto new_irctl_failure_check;
+ 	}
+ 
+-	if (lirc_buffer_init(driver->rbuf, dclen, 1)) {
++	if (lirc_buffer_init(driver->rbuf, dclen, 2)) {
+ 		mem_failure = 4;
+ 		goto new_irctl_failure_check;
+ 	}
+-- 
+1.7.0.1
+
diff --git a/abs/core/lirc/lirc_wpc8769l.patch b/abs/core/lirc/lirc_wpc8769l.patch
new file mode 100644
index 0000000..e4e2a04
--- /dev/null
+++ b/abs/core/lirc/lirc_wpc8769l.patch
@@ -0,0 +1,88 @@
+From 413e83bf504fe9a9a177f27742220cfcb184b034 Mon Sep 17 00:00:00 2001
+From: =?utf8?q?Juan=20Jes=C3=BAs=20Garc=C3=ADa=20de=20Soria=20Lucena?= <skandalfo@gmail.com>
+Date: Wed, 30 Mar 2011 16:46:35 -0400
+Subject: [PATCH] Make lirc_wpc8769l functional again
+
+Signed-off-by: Jarod Wilson <jarod@redhat.com>
+---
+ drivers/lirc_wpc8769l/lirc_wpc8769l.c |   28 +++++++++++++++++-----------
+ 1 files changed, 17 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/lirc_wpc8769l/lirc_wpc8769l.c b/drivers/lirc_wpc8769l/lirc_wpc8769l.c
+index f820d11..4d04063 100644
+--- a/drivers/lirc_wpc8769l/lirc_wpc8769l.c
++++ b/drivers/lirc_wpc8769l/lirc_wpc8769l.c
+@@ -816,10 +816,6 @@ static int set_use_inc(void *data)
+ 	/* Reset last timeout value. */
+ 	lastus = 0;
+ 
+-	/* Init the read buffer. */
+-	if (lirc_buffer_init(&rbuf, sizeof(lirc_t), RBUF_LEN) < 0)
+-		return -ENOMEM;
+-
+ 	/* Acquire the IRQ. */
+ 	result = request_irq(irq, irq_handler,
+ 			   IRQF_DISABLED | IRQF_SHARED,
+@@ -863,9 +859,6 @@ static void set_use_dec(void *data)
+ 	/* Free the IRQ. */
+ 	free_irq(irq, THIS_MODULE);
+ 	dprintk("Freed IRQ %d\n", irq);
+-
+-	/* Free the RX buffer. */
+-	lirc_buffer_free(&rbuf);
+ }
+ 
+ static struct lirc_driver driver = {
+@@ -1065,19 +1058,29 @@ static int __init lirc_wpc8769l_module_init(void)
+ 	/* Do load-time checks. */
+ 	wpc8769l_power_up_and_check_if_we_woke_us_up();
+ 
++	/* Init the read buffer. */
++	if (lirc_buffer_init(&rbuf, sizeof(lirc_t), RBUF_LEN) < 0) {
++		rc = -ENOMEM;
++		goto exit_platform_exit;
++	}
++
+ 	/* Configure the driver hooks. */
+ 	driver.features = LIRC_CAN_REC_MODE2;
++	driver.dev = &lirc_wpc8769l_platform_dev->dev;
+ 	driver.minor = lirc_register_driver(&driver);
+ 	if (driver.minor < 0) {
+ 		eprintk("lirc_register_driver failed!\n");
+ 		rc = -EIO;
+-		goto exit_platform_exit;
++		goto exit_release_buffer;
+ 	}
+ 
+ 	iprintk("Driver loaded.\n");
+ 
+ 	return 0; /* Everything OK. */
+ 
++exit_release_buffer:
++	lirc_buffer_free(&rbuf);
++
+ exit_platform_exit:
+ 	lirc_wpc8769l_platform_exit();
+ 
+@@ -1095,12 +1098,15 @@ module_init(lirc_wpc8769l_module_init);
+ 
+ static void __exit lirc_wpc8769l_module_exit(void)
+ {
+-	/* Unregister the platform driver and device. */
+-	lirc_wpc8769l_platform_exit();
+-
+ 	/* Unregister the LIRC driver. */
+ 	lirc_unregister_driver(driver.minor);
+ 
++	/* Free the buffer. */
++	lirc_buffer_free(&rbuf);
++
++	/* Unregister the platform driver and device. */
++	lirc_wpc8769l_platform_exit();
++
+ 	/* Release the second range. */
+ 	if (baseport2)
+ 		release_region(baseport2, WPC8769L_IO_REGION_2_SIZE);
+-- 
+1.7.0.1
+
diff --git a/abs/core/lirc/lircd b/abs/core/lirc/lircd
new file mode 100755
index 0000000..e9739b3
--- /dev/null
+++ b/abs/core/lirc/lircd
@@ -0,0 +1,52 @@
+#!/bin/bash
+
+. /etc/rc.conf
+. /etc/rc.d/functions
+. /etc/conf.d/lircd.conf
+
+PID=$(pidof -o %PPID /usr/sbin/lircd)
+LIRCD_SYMLINKFILE=/dev/lircd
+LIRCD_SOCKET=/var/run/lirc/lircd
+case "$1" in
+  start)
+    stat_busy "Starting LIRC Daemon"
+   [ ! -d /var/run/lirc ] && install -d /var/run/lirc &>/dev/null
+    rm -f $LIRCD_SOCKET && ln -s $LIRCD_SOCKET $LIRCD_SYMLINKFILE
+    if [ $? -ne 0 ]; then
+      stat_fail
+      exit 0
+    fi
+    [ -n "$LIRC_DRIVER" ] && LIRC_EXTRAOPTS="-H $LIRC_DRIVER $LIRC_EXTRAOPTS"
+    [ -z "$PID" ] && 
+      if [ -n "$LIRC_DEVICE" ] ; then
+        eval /usr/sbin/lircd -d "$LIRC_DEVICE" $LIRC_EXTRAOPTS $LIRC_CONFIGFILE
+      else
+        /usr/sbin/lircd $LIRC_EXTRAOPTS $LIRC_CONFIGFILE
+      fi
+    if [ $? -gt 0 ]; then
+      stat_fail
+    else
+      add_daemon lircd
+      stat_done
+    fi
+    ;;
+  stop)
+    stat_busy "Stopping LIRC Daemon"
+    rm -f $LIRCD_SYMLINKFILE
+    [ ! -z "$PID" ] && kill $PID &> /dev/null
+    if [ $? -gt 0 ]; then
+      stat_fail
+    else
+      rm_daemon lircd
+      stat_done
+    fi
+    ;;
+  restart)
+    $0 stop
+    sleep 1
+    $0 start
+    ;;
+  *)
+    echo "usage: $0 start|stop|restart"
+esac
+exit 0
diff --git a/abs/core/lirc/lircd-handle-large-config.patch b/abs/core/lirc/lircd-handle-large-config.patch
new file mode 100644
index 0000000..85bc205
--- /dev/null
+++ b/abs/core/lirc/lircd-handle-large-config.patch
@@ -0,0 +1,39 @@
+From 5efb56bf22a5077db564c766ba7cc37bc269231d Mon Sep 17 00:00:00 2001
+From: Jarod Wilson <jarod@redhat.com>
+Date: Wed, 6 Apr 2011 11:04:12 -0400
+Subject: [PATCH] lircd: handle larger config files in write_socket better
+
+Pointed out by Michael Zanetti on list, irsend LIST has issues with long
+config files, which didn't exist in maintainer mode, as we were using a
+do while loop to make sure we spit out everything. Just use that loop
+all the time.
+
+Signed-off-by: Jarod Wilson <jarod@redhat.com>
+---
+ daemons/lircd.c |    8 ++------
+ 1 files changed, 2 insertions(+), 6 deletions(-)
+
+diff --git a/daemons/lircd.c b/daemons/lircd.c
+index 6c21a3a..ddcca05 100644
+--- a/daemons/lircd.c
++++ b/daemons/lircd.c
+@@ -231,14 +231,10 @@ inline int write_socket(int fd, const char *buf, int len)
+ 	int done, todo = len;
+ 
+ 	while (todo) {
+-#ifdef SIM_REC
+ 		do {
+ 			done = write(fd, buf, todo);
+-		}
+-		while (done < 0 && errno == EAGAIN);
+-#else
+-		done = write(fd, buf, todo);
+-#endif
++		} while (done < 0 && errno == EAGAIN);
++
+ 		if (done <= 0)
+ 			return (done);
+ 		buf += done;
+-- 
+1.7.0.1
+
diff --git a/abs/core/lirc/lircd.conf b/abs/core/lirc/lircd.conf
new file mode 100644
index 0000000..760dab0
--- /dev/null
+++ b/abs/core/lirc/lircd.conf
@@ -0,0 +1,8 @@
+#
+# Parameters for lirc daemon
+#
+
+LIRC_DEVICE="/dev/lirc0"
+LIRC_DRIVER=""
+LIRC_EXTRAOPTS=""
+LIRC_CONFIGFILE=""
diff --git a/abs/core/lirc/lircmd b/abs/core/lirc/lircmd
new file mode 100755
index 0000000..220c47c
--- /dev/null
+++ b/abs/core/lirc/lircmd
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+. /etc/rc.conf
+. /etc/rc.d/functions
+
+PID=`pidof -o %PPID /usr/sbin/lircmd`
+case "$1" in
+  start)
+    stat_busy "Starting lircmd Daemon"
+    [ -z "$PID" ] && /usr/sbin/lircmd
+    if [ $? -gt 0 ]; then
+      stat_fail
+    else
+      add_daemon lircmd
+      stat_done
+    fi
+    ;;
+  stop)
+    stat_busy "Stopping lircmd Daemon"
+    [ ! -z "$PID" ]  && kill $PID &> /dev/null
+    if [ $? -gt 0 ]; then
+      stat_fail
+    else
+      rm_daemon lircmd
+      stat_done
+    fi
+    ;;
+  restart)
+    $0 stop
+    sleep 1
+    $0 start
+    ;;
+  *)
+    echo "usage: $0 {start|stop|restart}"
+esac
+exit 0
-- 
cgit v0.12