|
@@ -838,7 +838,23 @@ static int hardware_init_port(void)
|
|
|
|
|
|
static int init_port(void)
|
|
|
{
|
|
|
- int i, nlow, nhigh;
|
|
|
+ int i, nlow, nhigh, result;
|
|
|
+
|
|
|
+ result = request_irq(irq, irq_handler,
|
|
|
+ IRQF_DISABLED | (share_irq ? IRQF_SHARED : 0),
|
|
|
+ LIRC_DRIVER_NAME, (void *)&hardware);
|
|
|
+
|
|
|
+ switch (result) {
|
|
|
+ case -EBUSY:
|
|
|
+ printk(KERN_ERR LIRC_DRIVER_NAME ": IRQ %d busy\n", irq);
|
|
|
+ return -EBUSY;
|
|
|
+ case -EINVAL:
|
|
|
+ printk(KERN_ERR LIRC_DRIVER_NAME
|
|
|
+ ": Bad irq number or handler\n");
|
|
|
+ return -EINVAL;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ };
|
|
|
|
|
|
/* Reserve io region. */
|
|
|
/*
|
|
@@ -893,34 +909,17 @@ static int init_port(void)
|
|
|
printk(KERN_INFO LIRC_DRIVER_NAME ": Manually using active "
|
|
|
"%s receiver\n", sense ? "low" : "high");
|
|
|
|
|
|
+ dprintk("Interrupt %d, port %04x obtained\n", irq, io);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
static int set_use_inc(void *data)
|
|
|
{
|
|
|
- int result;
|
|
|
unsigned long flags;
|
|
|
|
|
|
/* initialize timestamp */
|
|
|
do_gettimeofday(&lasttv);
|
|
|
|
|
|
- result = request_irq(irq, irq_handler,
|
|
|
- IRQF_DISABLED | (share_irq ? IRQF_SHARED : 0),
|
|
|
- LIRC_DRIVER_NAME, (void *)&hardware);
|
|
|
-
|
|
|
- switch (result) {
|
|
|
- case -EBUSY:
|
|
|
- printk(KERN_ERR LIRC_DRIVER_NAME ": IRQ %d busy\n", irq);
|
|
|
- return -EBUSY;
|
|
|
- case -EINVAL:
|
|
|
- printk(KERN_ERR LIRC_DRIVER_NAME
|
|
|
- ": Bad irq number or handler\n");
|
|
|
- return -EINVAL;
|
|
|
- default:
|
|
|
- dprintk("Interrupt %d, port %04x obtained\n", irq, io);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
spin_lock_irqsave(&hardware[type].lock, flags);
|
|
|
|
|
|
/* Set DLAB 0. */
|
|
@@ -945,10 +944,6 @@ static void set_use_dec(void *data)
|
|
|
soutp(UART_IER, sinp(UART_IER) &
|
|
|
(~(UART_IER_MSI|UART_IER_RLSI|UART_IER_THRI|UART_IER_RDI)));
|
|
|
spin_unlock_irqrestore(&hardware[type].lock, flags);
|
|
|
-
|
|
|
- free_irq(irq, (void *)&hardware);
|
|
|
-
|
|
|
- dprintk("freed IRQ %d\n", irq);
|
|
|
}
|
|
|
|
|
|
static ssize_t lirc_write(struct file *file, const char *buf,
|
|
@@ -1256,6 +1251,9 @@ exit_serial_exit:
|
|
|
static void __exit lirc_serial_exit_module(void)
|
|
|
{
|
|
|
lirc_serial_exit();
|
|
|
+
|
|
|
+ free_irq(irq, (void *)&hardware);
|
|
|
+
|
|
|
if (iommap != 0)
|
|
|
release_mem_region(iommap, 8 << ioshift);
|
|
|
else
|