/*
 * LIRC driver for ITE IT8712/IT8705 CIR port
 *
 * Copyright (C) 2001 Hans-Gunter Lutke Uphues <hg_lu@web.de>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 * USA
 *
 * ITE IT8705 and IT8712(not tested) and IT8720 CIR-port support for lirc based
 * via cut and paste from lirc_sir.c (C) 2000 Milan Pikula
 *
 * Attention: Sendmode only tested with debugging logs
 *
 * 2001/02/27 Christoph Bartelmus <lirc@bartelmus.de> :
 *   reimplemented read function
 * 2005/06/05 Andrew Calkin implemented support for Asus Digimatrix,
 *   based on work of the following member of the Outertrack Digimatrix
 *   Forum: Art103 <r_tay@hotmail.com>
 * 2009/12/24 James Edwards <jimbo-lirc@edwardsclan.net> implemeted support
 *   for ITE8704/ITE8718, on my machine, the DSDT reports 8704, but the
 *   chip identifies as 18.
 */

#include <linux/module.h>
#include <linux/sched.h>
#include <linux/errno.h>
#include <linux/signal.h>
#include <linux/fs.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/kernel.h>
#include <linux/time.h>
#include <linux/string.h>
#include <linux/types.h>
#include <linux/wait.h>
#include <linux/mm.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <asm/system.h>
#include <linux/io.h>
#include <linux/irq.h>
#include <linux/fcntl.h>

#include <linux/timer.h>
#include <linux/pnp.h>

#include <media/lirc.h>
#include <media/lirc_dev.h>

#include "lirc_it87.h"

#ifdef LIRC_IT87_DIGIMATRIX
static int digimatrix = 1;
static int it87_freq = 36; /* kHz */
static int irq = 9;
#else
static int digimatrix;
static int it87_freq = 38; /* kHz */
static int irq = IT87_CIR_DEFAULT_IRQ;
#endif

static unsigned long it87_bits_in_byte_out;
static unsigned long it87_send_counter;
static unsigned char it87_RXEN_mask = IT87_CIR_RCR_RXEN;

#define RBUF_LEN 1024

#define LIRC_DRIVER_NAME "lirc_it87"

/* timeout for sequences in jiffies (=5/100s) */
/* must be longer than TIME_CONST */
#define IT87_TIMEOUT	(HZ*5/100)

/* module parameters */
static int debug;
#define dprintk(fmt, args...)					\
	do {							\
		if (debug)					\
			printk(KERN_DEBUG LIRC_DRIVER_NAME ": "	\
			       fmt, ## args);			\
	} while (0)

static int io = IT87_CIR_DEFAULT_IOBASE;
/* receiver demodulator default: off */
static int it87_enable_demodulator;

static int timer_enabled;
static DEFINE_SPINLOCK(timer_lock);
static struct timer_list timerlist;
/* time of last signal change detected */
static struct timeval last_tv = {0, 0};
/* time of last UART data ready interrupt */
static struct timeval last_intr_tv = {0, 0};
static int last_value;

static DECLARE_WAIT_QUEUE_HEAD(lirc_read_queue);

static DEFINE_SPINLOCK(hardware_lock);
static DEFINE_SPINLOCK(dev_lock);
static bool device_open;

static int rx_buf[RBUF_LEN];
unsigned int rx_tail, rx_head;

static struct pnp_driver it87_pnp_driver;

/* SECTION: Prototypes */

/* Communication with user-space */
static int lirc_open(struct inode *inode, struct file *file);
static int lirc_close(struct inode *inode, struct file *file);
static unsigned int lirc_poll(struct file *file, poll_table *wait);
static ssize_t lirc_read(struct file *file, char *buf,
			 size_t count, loff_t *ppos);
static ssize_t lirc_write(struct file *file, const char *buf,
			  size_t n, loff_t *pos);
static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg);
static void add_read_queue(int flag, unsigned long val);
static int init_chrdev(void);
static void drop_chrdev(void);
/* Hardware */
static irqreturn_t it87_interrupt(int irq, void *dev_id);
static void send_space(unsigned long len);
static void send_pulse(unsigned long len);
static void init_send(void);
static void terminate_send(unsigned long len);
static int init_hardware(void);
static void drop_hardware(void);
/* Initialisation */
static int init_port(void);
static void drop_port(void);


/* SECTION: Communication with user-space */

static int lirc_open(struct inode *inode, struct file *file)
{
	spin_lock(&dev_lock);
	if (device_open) {
		spin_unlock(&dev_lock);
		return -EBUSY;
	}
	device_open = true;
	spin_unlock(&dev_lock);
	return 0;
}


static int lirc_close(struct inode *inode, struct file *file)
{
	spin_lock(&dev_lock);
	device_open = false;
	spin_unlock(&dev_lock);
	return 0;
}


static unsigned int lirc_poll(struct file *file, poll_table *wait)
{
	poll_wait(file, &lirc_read_queue, wait);
	if (rx_head != rx_tail)
		return POLLIN | POLLRDNORM;
	return 0;
}


static ssize_t lirc_read(struct file *file, char *buf,
			 size_t count, loff_t *ppos)
{
	int n = 0;
	int retval = 0;

	while (n < count) {
		if (file->f_flags & O_NONBLOCK && rx_head == rx_tail) {
			retval = -EAGAIN;
			break;
		}
		retval = wait_event_interruptible(lirc_read_queue,
						  rx_head != rx_tail);
		if (retval)
			break;

		if (copy_to_user((void *) buf + n, (void *) (rx_buf + rx_head),
				 sizeof(int))) {
			retval = -EFAULT;
			break;
		}
		rx_head = (rx_head + 1) & (RBUF_LEN - 1);
		n += sizeof(int);
	}
	if (n)
		return n;
	return retval;
}


static ssize_t lirc_write(struct file *file, const char *buf,
			  size_t n, loff_t *pos)
{
	int i = 0;
	int *tx_buf;

	if (n % sizeof(int))
		return -EINVAL;
	tx_buf = memdup_user(buf, n);
	if (IS_ERR(tx_buf))
		return PTR_ERR(tx_buf);
	n /= sizeof(int);
	init_send();
	while (1) {
		if (i >= n)
			break;
		if (tx_buf[i])
			send_pulse(tx_buf[i]);
		i++;
		if (i >= n)
			break;
		if (tx_buf[i])
			send_space(tx_buf[i]);
		i++;
	}
	terminate_send(tx_buf[i - 1]);
	kfree(tx_buf);
	return n;
}


static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
{
	int retval = 0;
	__u32 value = 0;
	unsigned long hw_flags;

	if (cmd == LIRC_GET_FEATURES)
		value = LIRC_CAN_SEND_PULSE |
			LIRC_CAN_SET_SEND_CARRIER |
			LIRC_CAN_REC_MODE2;
	else if (cmd == LIRC_GET_SEND_MODE)
		value = LIRC_MODE_PULSE;
	else if (cmd == LIRC_GET_REC_MODE)
		value = LIRC_MODE_MODE2;

	switch (cmd) {
	case LIRC_GET_FEATURES:
	case LIRC_GET_SEND_MODE:
	case LIRC_GET_REC_MODE:
		retval = put_user(value, (__u32 *) arg);
		break;

	case LIRC_SET_SEND_MODE:
	case LIRC_SET_REC_MODE:
		retval = get_user(value, (__u32 *) arg);
		break;

	case LIRC_SET_SEND_CARRIER:
		retval = get_user(value, (__u32 *) arg);
		if (retval)
			return retval;
		value /= 1000;
		if (value > IT87_CIR_FREQ_MAX ||
		    value < IT87_CIR_FREQ_MIN)
			return -EINVAL;

		it87_freq = value;

		spin_lock_irqsave(&hardware_lock, hw_flags);
		outb(((inb(io + IT87_CIR_TCR2) & IT87_CIR_TCR2_TXMPW) |
		      (it87_freq - IT87_CIR_FREQ_MIN) << 3),
		      io + IT87_CIR_TCR2);
		spin_unlock_irqrestore(&hardware_lock, hw_flags);
		dprintk("demodulation frequency: %d kHz\n", it87_freq);

		break;

	default:
		retval = -EINVAL;
	}

	if (retval)
		return retval;

	if (cmd == LIRC_SET_REC_MODE) {
		if (value != LIRC_MODE_MODE2)
			retval = -ENOSYS;
	} else if (cmd == LIRC_SET_SEND_MODE) {
		if (value != LIRC_MODE_PULSE)
			retval = -ENOSYS;
	}
	return retval;
}

static void add_read_queue(int flag, unsigned long val)
{
	unsigned int new_rx_tail;
	int newval;

	dprintk("add flag %d with val %lu\n", flag, val);

	newval = val & PULSE_MASK;

	/*
	 * statistically, pulses are ~TIME_CONST/2 too long. we could
	 * maybe make this more exact, but this is good enough
	 */
	if (flag) {
		/* pulse */
		if (newval > TIME_CONST / 2)
			newval -= TIME_CONST / 2;
		else /* should not ever happen */
			newval = 1;
		newval |= PULSE_BIT;
	} else
		newval += TIME_CONST / 2;
	new_rx_tail = (rx_tail + 1) & (RBUF_LEN - 1);
	if (new_rx_tail == rx_head) {
		dprintk("Buffer overrun.\n");
		return;
	}
	rx_buf[rx_tail] = newval;
	rx_tail = new_rx_tail;
	wake_up_interruptible(&lirc_read_queue);
}


static const struct file_operations lirc_fops = {
	.owner		= THIS_MODULE,
	.read		= lirc_read,
	.write		= lirc_write,
	.poll		= lirc_poll,
	.unlocked_ioctl	= lirc_ioctl,
#ifdef CONFIG_COMPAT
	.compat_ioctl	= lirc_ioctl,
#endif
	.open		= lirc_open,
	.release	= lirc_close,
	.llseek		= noop_llseek,
};

static int set_use_inc(void *data)
{
       return 0;
}

static void set_use_dec(void *data)
{
}

static struct lirc_driver driver = {
       .name		= LIRC_DRIVER_NAME,
       .minor		= -1,
       .code_length	= 1,
       .sample_rate	= 0,
       .data		= NULL,
       .add_to_buf	= NULL,
       .set_use_inc	= set_use_inc,
       .set_use_dec	= set_use_dec,
       .fops		= &lirc_fops,
       .dev		= NULL,
       .owner		= THIS_MODULE,
};


static int init_chrdev(void)
{
	driver.minor = lirc_register_driver(&driver);

	if (driver.minor < 0) {
		printk(KERN_ERR LIRC_DRIVER_NAME ": init_chrdev() failed.\n");
		return -EIO;
	}
	return 0;
}


static void drop_chrdev(void)
{
	lirc_unregister_driver(driver.minor);
}


/* SECTION: Hardware */
static long delta(struct timeval *tv1, struct timeval *tv2)
{
	unsigned long deltv;

	deltv = tv2->tv_sec - tv1->tv_sec;
	if (deltv > 15)
		deltv = 0xFFFFFF;
	else
		deltv = deltv*1000000 + tv2->tv_usec - tv1->tv_usec;
	return deltv;
}

static void it87_timeout(unsigned long data)
{
	unsigned long flags;

	/* avoid interference with interrupt */
	spin_lock_irqsave(&timer_lock, flags);

	if (digimatrix) {
		/* We have timed out. Disable the RX mechanism. */

		outb((inb(io + IT87_CIR_RCR) & ~IT87_CIR_RCR_RXEN) |
		     IT87_CIR_RCR_RXACT, io + IT87_CIR_RCR);
		if (it87_RXEN_mask)
			outb(inb(io + IT87_CIR_RCR) | IT87_CIR_RCR_RXEN,
			     io + IT87_CIR_RCR);
		dprintk(" TIMEOUT\n");
		timer_enabled = 0;

		/* fifo clear */
		outb(inb(io + IT87_CIR_TCR1) | IT87_CIR_TCR1_FIFOCLR,
		     io+IT87_CIR_TCR1);

	} else {
		/*
		 * if last received signal was a pulse, but receiving stopped
		 * within the 9 bit frame, we need to finish this pulse and
		 * simulate a signal change to from pulse to space. Otherwise
		 * upper layers will receive two sequences next time.
		 */

		if (last_value) {
			unsigned long pulse_end;

			/* determine 'virtual' pulse end: */
			pulse_end = delta(&last_tv, &last_intr_tv);
			dprintk("timeout add %d for %lu usec\n",
				last_value, pulse_end);
			add_read_queue(last_value, pulse_end);
			last_value = 0;
			last_tv = last_intr_tv;
		}
	}
	spin_unlock_irqrestore(&timer_lock, flags);
}

static irqreturn_t it87_interrupt(int irq, void *dev_id)
{
	unsigned char data;
	struct timeval curr_tv;
	static unsigned long deltv;
	unsigned long deltintrtv;
	unsigned long flags, hw_flags;
	int iir, lsr;
	int fifo = 0;
	static char lastbit;
	char bit;

	/* Bit duration in microseconds */
	const unsigned long bit_duration = 1000000ul /
		(115200 / IT87_CIR_BAUDRATE_DIVISOR);


	iir = inb(io + IT87_CIR_IIR);

	switch (iir & IT87_CIR_IIR_IID) {
	case 0x4:
	case 0x6:
		lsr = inb(io + IT87_CIR_RSR) & (IT87_CIR_RSR_RXFTO |
						IT87_CIR_RSR_RXFBC);
		fifo = lsr & IT87_CIR_RSR_RXFBC;
		dprintk("iir: 0x%x fifo: 0x%x\n", iir, lsr);

		/* avoid interference with timer */
		spin_lock_irqsave(&timer_lock, flags);
		spin_lock_irqsave(&hardware_lock, hw_flags);
		if (digimatrix) {
			static unsigned long acc_pulse;
			static unsigned long acc_space;

			do {
				data = inb(io + IT87_CIR_DR);
				data = ~data;
				fifo--;
				if (data != 0x00) {
					if (timer_enabled)
						del_timer(&timerlist);
					/*
					 * start timer for end of
					 * sequence detection
					 */
					timerlist.expires = jiffies +
							    IT87_TIMEOUT;
					add_timer(&timerlist);
					timer_enabled = 1;
				}
				/* Loop through */
				for (bit = 0; bit < 8; ++bit) {
					if ((data >> bit) & 1) {
						++acc_pulse;
						if (lastbit == 0) {
							add_read_queue(0,
								acc_space *
								 bit_duration);
							acc_space = 0;
						}
					} else {
						++acc_space;
						if (lastbit == 1) {
							add_read_queue(1,
								acc_pulse *
								 bit_duration);
							acc_pulse = 0;
						}
					}
					lastbit = (data >> bit) & 1;
				}

			} while (fifo != 0);
		} else { /* Normal Operation */
			do {
				del_timer(&timerlist);
				data = inb(io + IT87_CIR_DR);

				dprintk("data=%02x\n", data);
				do_gettimeofday(&curr_tv);
				deltv = delta(&last_tv, &curr_tv);
				deltintrtv = delta(&last_intr_tv, &curr_tv);

				dprintk("t %lu , d %d\n",
					deltintrtv, (int)data);

				/*
				 * if nothing came in last 2 cycles,
				 * it was gap
				 */
				if (deltintrtv > TIME_CONST * 2) {
					if (last_value) {
						dprintk("GAP\n");

						/* simulate signal change */
						add_read_queue(last_value,
							       deltv -
							       deltintrtv);
						last_value = 0;
						last_tv.tv_sec =
							last_intr_tv.tv_sec;
						last_tv.tv_usec =
							last_intr_tv.tv_usec;
						deltv = deltintrtv;
					}
				}
				data = 1;
				if (data ^ last_value) {
					/*
					 * deltintrtv > 2*TIME_CONST,
					 * remember ? the other case is
					 * timeout
					 */
					add_read_queue(last_value,
						       deltv-TIME_CONST);
					last_value = data;
					last_tv = curr_tv;
					if (last_tv.tv_usec >= TIME_CONST)
						last_tv.tv_usec -= TIME_CONST;
					else {
						last_tv.tv_sec--;
						last_tv.tv_usec += 1000000 -
							TIME_CONST;
					}
				}
				last_intr_tv = curr_tv;
				if (data) {
					/*
					 * start timer for end of
					 * sequence detection
					 */
					timerlist.expires =
						jiffies + IT87_TIMEOUT;
					add_timer(&timerlist);
				}
				outb((inb(io + IT87_CIR_RCR) &
				     ~IT87_CIR_RCR_RXEN) |
				     IT87_CIR_RCR_RXACT,
				     io + IT87_CIR_RCR);
				if (it87_RXEN_mask)
					outb(inb(io + IT87_CIR_RCR) |
					     IT87_CIR_RCR_RXEN,
					     io + IT87_CIR_RCR);
				fifo--;
			} while (fifo != 0);
		}
		spin_unlock_irqrestore(&hardware_lock, hw_flags);
		spin_unlock_irqrestore(&timer_lock, flags);

		return IRQ_RETVAL(IRQ_HANDLED);

	default:
		/* not our irq */
		dprintk("unknown IRQ (shouldn't happen) !!\n");
		return IRQ_RETVAL(IRQ_NONE);
	}
}


static void send_it87(unsigned long len, unsigned long stime,
		      unsigned char send_byte, unsigned int count_bits)
{
	long count = len / stime;
	long time_left = 0;
	static unsigned char byte_out;
	unsigned long hw_flags;

	dprintk("%s: len=%ld, sb=%d\n", __func__, len, send_byte);

	time_left = (long)len - (long)count * (long)stime;
	count += ((2 * time_left) / stime);
	while (count) {
		long i = 0;
		for (i = 0; i < count_bits; i++) {
			byte_out = (byte_out << 1) | (send_byte & 1);
			it87_bits_in_byte_out++;
		}
		if (it87_bits_in_byte_out == 8) {
			dprintk("out=0x%x, tsr_txfbc: 0x%x\n",
				byte_out,
				inb(io + IT87_CIR_TSR) &
				IT87_CIR_TSR_TXFBC);

			while ((inb(io + IT87_CIR_TSR) &
				IT87_CIR_TSR_TXFBC) >= IT87_CIR_FIFO_SIZE)
				;

			spin_lock_irqsave(&hardware_lock, hw_flags);
			outb(byte_out, io + IT87_CIR_DR);
			spin_unlock_irqrestore(&hardware_lock, hw_flags);

			it87_bits_in_byte_out = 0;
			it87_send_counter++;
			byte_out = 0;
		}
		count--;
	}
}


/*TODO: maybe exchange space and pulse because it8705 only modulates 0-bits */

static void send_space(unsigned long len)
{
	send_it87(len, TIME_CONST, IT87_CIR_SPACE, IT87_CIR_BAUDRATE_DIVISOR);
}

static void send_pulse(unsigned long len)
{
	send_it87(len, TIME_CONST, IT87_CIR_PULSE, IT87_CIR_BAUDRATE_DIVISOR);
}


static void init_send()
{
	unsigned long flags;

	spin_lock_irqsave(&hardware_lock, flags);
	/* RXEN=0: receiver disable */
	it87_RXEN_mask = 0;
	outb(inb(io + IT87_CIR_RCR) & ~IT87_CIR_RCR_RXEN,
	     io + IT87_CIR_RCR);
	spin_unlock_irqrestore(&hardware_lock, flags);
	it87_bits_in_byte_out = 0;
	it87_send_counter = 0;
}


static void terminate_send(unsigned long len)
{
	unsigned long flags;
	unsigned long last = 0;

	last = it87_send_counter;
	/* make sure all necessary data has been sent */
	while (last == it87_send_counter)
		send_space(len);
	/* wait until all data sent */
	while ((inb(io + IT87_CIR_TSR) & IT87_CIR_TSR_TXFBC) != 0)
		;
	/* then re-enable receiver */
	spin_lock_irqsave(&hardware_lock, flags);
	it87_RXEN_mask = IT87_CIR_RCR_RXEN;
	outb(inb(io + IT87_CIR_RCR) | IT87_CIR_RCR_RXEN,
	     io + IT87_CIR_RCR);
	spin_unlock_irqrestore(&hardware_lock, flags);
}


static int init_hardware(void)
{
	unsigned long flags;
	unsigned char it87_rcr = 0;

	spin_lock_irqsave(&hardware_lock, flags);
	/* init cir-port */
	/* enable r/w-access to Baudrate-Register */
	outb(IT87_CIR_IER_BR, io + IT87_CIR_IER);
	outb(IT87_CIR_BAUDRATE_DIVISOR % 0x100, io+IT87_CIR_BDLR);
	outb(IT87_CIR_BAUDRATE_DIVISOR / 0x100, io+IT87_CIR_BDHR);
	/* Baudrate Register off, define IRQs: Input only */
	if (digimatrix) {
		outb(IT87_CIR_IER_IEC | IT87_CIR_IER_RFOIE, io + IT87_CIR_IER);
		/* RX: HCFS=0, RXDCR = 001b (33,75..38,25 kHz), RXEN=1 */
	} else {
		outb(IT87_CIR_IER_IEC | IT87_CIR_IER_RDAIE, io + IT87_CIR_IER);
		/* RX: HCFS=0, RXDCR = 001b (35,6..40,3 kHz), RXEN=1 */
	}
	it87_rcr = (IT87_CIR_RCR_RXEN & it87_RXEN_mask) | 0x1;
	if (it87_enable_demodulator)
		it87_rcr |= IT87_CIR_RCR_RXEND;
	outb(it87_rcr, io + IT87_CIR_RCR);
	if (digimatrix) {
		/* Set FIFO depth to 1 byte, and disable TX */
		outb(inb(io + IT87_CIR_TCR1) |  0x00,
		     io + IT87_CIR_TCR1);

		/*
		 * TX: it87_freq (36kHz), 'reserved' sensitivity
		 * setting (0x00)
		 */
		outb(((it87_freq - IT87_CIR_FREQ_MIN) << 3) | 0x00,
		     io + IT87_CIR_TCR2);
	} else {
		/* TX: 38kHz, 13,3us (pulse-width) */
		outb(((it87_freq - IT87_CIR_FREQ_MIN) << 3) | 0x06,
		     io + IT87_CIR_TCR2);
	}
	spin_unlock_irqrestore(&hardware_lock, flags);
	return 0;
}


static void drop_hardware(void)
{
	unsigned long flags;

	spin_lock_irqsave(&hardware_lock, flags);
	disable_irq(irq);
	/* receiver disable */
	it87_RXEN_mask = 0;
	outb(0x1, io + IT87_CIR_RCR);
	/* turn off irqs */
	outb(0, io + IT87_CIR_IER);
	/* fifo clear */
	outb(IT87_CIR_TCR1_FIFOCLR, io+IT87_CIR_TCR1);
	/* reset */
	outb(IT87_CIR_IER_RESET, io+IT87_CIR_IER);
	enable_irq(irq);
	spin_unlock_irqrestore(&hardware_lock, flags);
}


static unsigned char it87_read(unsigned char port)
{
	outb(port, IT87_ADRPORT);
	return inb(IT87_DATAPORT);
}


static void it87_write(unsigned char port, unsigned char data)
{
	outb(port, IT87_ADRPORT);
	outb(data, IT87_DATAPORT);
}


/* SECTION: Initialisation */

static int init_port(void)
{
	unsigned long hw_flags;
	int retval = 0;

	unsigned char init_bytes[4] = IT87_INIT;
	unsigned char it87_chipid = 0;
	unsigned char ldn = 0;
	unsigned int  it87_io = 0;
	unsigned int  it87_irq = 0;

	/* Enter MB PnP Mode */
	outb(init_bytes[0], IT87_ADRPORT);
	outb(init_bytes[1], IT87_ADRPORT);
	outb(init_bytes[2], IT87_ADRPORT);
	outb(init_bytes[3], IT87_ADRPORT);

	/* 8712 or 8705 ? */
	it87_chipid = it87_read(IT87_CHIP_ID1);
	if (it87_chipid != 0x87) {
		retval = -ENXIO;
		return retval;
	}
	it87_chipid = it87_read(IT87_CHIP_ID2);
	if ((it87_chipid != 0x05) &&
		(it87_chipid != 0x12) &&
		(it87_chipid != 0x18) &&
		(it87_chipid != 0x20)) {
		printk(KERN_INFO LIRC_DRIVER_NAME
		       ": no IT8704/05/12/18/20 found (claimed IT87%02x), "
		       "exiting..\n", it87_chipid);
		retval = -ENXIO;
		return retval;
	}
	printk(KERN_INFO LIRC_DRIVER_NAME
	       ": found IT87%02x.\n",
	       it87_chipid);

	/* get I/O-Port and IRQ */
	if (it87_chipid == 0x12 || it87_chipid == 0x18)
		ldn = IT8712_CIR_LDN;
	else
		ldn = IT8705_CIR_LDN;
	it87_write(IT87_LDN, ldn);

	it87_io = it87_read(IT87_CIR_BASE_MSB) * 256 +
		  it87_read(IT87_CIR_BASE_LSB);
	if (it87_io == 0) {
		if (io == 0)
			io = IT87_CIR_DEFAULT_IOBASE;
		printk(KERN_INFO LIRC_DRIVER_NAME
		       ": set default io 0x%x\n",
		       io);
		it87_write(IT87_CIR_BASE_MSB, io / 0x100);
		it87_write(IT87_CIR_BASE_LSB, io % 0x100);
	} else
		io = it87_io;

	it87_irq = it87_read(IT87_CIR_IRQ);
	if (digimatrix || it87_irq == 0) {
		if (irq == 0)
			irq = IT87_CIR_DEFAULT_IRQ;
		printk(KERN_INFO LIRC_DRIVER_NAME
		       ": set default irq 0x%x\n",
		       irq);
		it87_write(IT87_CIR_IRQ, irq);
	} else
		irq = it87_irq;

	spin_lock_irqsave(&hardware_lock, hw_flags);
	/* reset */
	outb(IT87_CIR_IER_RESET, io+IT87_CIR_IER);
	/* fifo clear */
	outb(IT87_CIR_TCR1_FIFOCLR |
	     /*	     IT87_CIR_TCR1_ILE | */
	     IT87_CIR_TCR1_TXRLE |
	     IT87_CIR_TCR1_TXENDF, io+IT87_CIR_TCR1);
	spin_unlock_irqrestore(&hardware_lock, hw_flags);

	/* get I/O port access and IRQ line */
	if (request_region(io, 8, LIRC_DRIVER_NAME) == NULL) {
		printk(KERN_ERR LIRC_DRIVER_NAME
		       ": i/o port 0x%.4x already in use.\n", io);
		/* Leaving MB PnP Mode */
		it87_write(IT87_CFGCTRL, 0x2);
		return -EBUSY;
	}

	/* activate CIR-Device */
	it87_write(IT87_CIR_ACT, 0x1);

	/* Leaving MB PnP Mode */
	it87_write(IT87_CFGCTRL, 0x2);

	retval = request_irq(irq, it87_interrupt, 0 /*IRQF_DISABLED*/,
			     LIRC_DRIVER_NAME, NULL);
	if (retval < 0) {
		printk(KERN_ERR LIRC_DRIVER_NAME
		       ": IRQ %d already in use.\n",
		       irq);
		release_region(io, 8);
		return retval;
	}

	printk(KERN_INFO LIRC_DRIVER_NAME
	       ": I/O port 0x%.4x, IRQ %d.\n", io, irq);

	init_timer(&timerlist);
	timerlist.function = it87_timeout;
	timerlist.data = 0xabadcafe;

	return 0;
}


static void drop_port(void)
{
#if 0
	unsigned char init_bytes[4] = IT87_INIT;

	/* Enter MB PnP Mode */
	outb(init_bytes[0], IT87_ADRPORT);
	outb(init_bytes[1], IT87_ADRPORT);
	outb(init_bytes[2], IT87_ADRPORT);
	outb(init_bytes[3], IT87_ADRPORT);

	/* deactivate CIR-Device */
	it87_write(IT87_CIR_ACT, 0x0);

	/* Leaving MB PnP Mode */
	it87_write(IT87_CFGCTRL, 0x2);
#endif

	del_timer_sync(&timerlist);
	free_irq(irq, NULL);
	release_region(io, 8);
}


static int init_lirc_it87(void)
{
	int retval;

	init_waitqueue_head(&lirc_read_queue);
	retval = init_port();
	if (retval < 0)
		return retval;
	init_hardware();
	printk(KERN_INFO LIRC_DRIVER_NAME ": Installed.\n");
	return 0;
}

static int it87_probe(struct pnp_dev *pnp_dev,
		      const struct pnp_device_id *dev_id)
{
	int retval;

	driver.dev = &pnp_dev->dev;

	retval = init_chrdev();
	if (retval < 0)
		return retval;

	retval = init_lirc_it87();
	if (retval)
		goto init_lirc_it87_failed;

	return 0;

init_lirc_it87_failed:
	drop_chrdev();

	return retval;
}

static int __init lirc_it87_init(void)
{
	return pnp_register_driver(&it87_pnp_driver);
}


static void __exit lirc_it87_exit(void)
{
	drop_hardware();
	drop_chrdev();
	drop_port();
	pnp_unregister_driver(&it87_pnp_driver);
	printk(KERN_INFO LIRC_DRIVER_NAME ": Uninstalled.\n");
}

/* SECTION: PNP for ITE8704/13/18 */

static const struct pnp_device_id pnp_dev_table[] = {
	{"ITE8704", 0},
	{"ITE8713", 0},
	{}
};

MODULE_DEVICE_TABLE(pnp, pnp_dev_table);

static struct pnp_driver it87_pnp_driver = {
	.name           = LIRC_DRIVER_NAME,
	.id_table       = pnp_dev_table,
	.probe		= it87_probe,
};

module_init(lirc_it87_init);
module_exit(lirc_it87_exit);

MODULE_DESCRIPTION("LIRC driver for ITE IT8704/05/12/18/20 CIR port");
MODULE_AUTHOR("Hans-Gunter Lutke Uphues");
MODULE_LICENSE("GPL");

module_param(io, int, S_IRUGO);
MODULE_PARM_DESC(io, "I/O base address (default: 0x310)");

module_param(irq, int, S_IRUGO);
#ifdef LIRC_IT87_DIGIMATRIX
MODULE_PARM_DESC(irq, "Interrupt (1,3-12) (default: 9)");
#else
MODULE_PARM_DESC(irq, "Interrupt (1,3-12) (default: 7)");
#endif

module_param(it87_enable_demodulator, bool, S_IRUGO);
MODULE_PARM_DESC(it87_enable_demodulator,
		 "Receiver demodulator enable/disable (1/0), default: 0");

module_param(debug, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug, "Enable debugging messages");

module_param(digimatrix, bool, S_IRUGO | S_IWUSR);
#ifdef LIRC_IT87_DIGIMATRIX
MODULE_PARM_DESC(digimatrix,
	"Asus Digimatrix it87 compat. enable/disable (1/0), default: 1");
#else
MODULE_PARM_DESC(digimatrix,
	"Asus Digimatrix it87 compat. enable/disable (1/0), default: 0");
#endif


module_param(it87_freq, int, S_IRUGO);
#ifdef LIRC_IT87_DIGIMATRIX
MODULE_PARM_DESC(it87_freq,
    "Carrier demodulator frequency (kHz), (default: 36)");
#else
MODULE_PARM_DESC(it87_freq,
    "Carrier demodulator frequency (kHz), (default: 38)");
#endif
