diff options
| -rw-r--r-- | drivers/staging/lirc/lirc_serial.c | 44 |
1 files changed, 21 insertions, 23 deletions
diff --git a/drivers/staging/lirc/lirc_serial.c b/drivers/staging/lirc/lirc_serial.c index 4a3cca03224a..805df913bb6e 100644 --- a/drivers/staging/lirc/lirc_serial.c +++ b/drivers/staging/lirc/lirc_serial.c | |||
| @@ -838,7 +838,23 @@ static int hardware_init_port(void) | |||
| 838 | 838 | ||
| 839 | static int init_port(void) | 839 | static int init_port(void) |
| 840 | { | 840 | { |
| 841 | int i, nlow, nhigh; | 841 | int i, nlow, nhigh, result; |
| 842 | |||
| 843 | result = request_irq(irq, irq_handler, | ||
| 844 | IRQF_DISABLED | (share_irq ? IRQF_SHARED : 0), | ||
| 845 | LIRC_DRIVER_NAME, (void *)&hardware); | ||
| 846 | |||
| 847 | switch (result) { | ||
| 848 | case -EBUSY: | ||
| 849 | printk(KERN_ERR LIRC_DRIVER_NAME ": IRQ %d busy\n", irq); | ||
| 850 | return -EBUSY; | ||
| 851 | case -EINVAL: | ||
| 852 | printk(KERN_ERR LIRC_DRIVER_NAME | ||
| 853 | ": Bad irq number or handler\n"); | ||
| 854 | return -EINVAL; | ||
| 855 | default: | ||
| 856 | break; | ||
| 857 | }; | ||
| 842 | 858 | ||
| 843 | /* Reserve io region. */ | 859 | /* Reserve io region. */ |
| 844 | /* | 860 | /* |
| @@ -893,34 +909,17 @@ static int init_port(void) | |||
| 893 | printk(KERN_INFO LIRC_DRIVER_NAME ": Manually using active " | 909 | printk(KERN_INFO LIRC_DRIVER_NAME ": Manually using active " |
| 894 | "%s receiver\n", sense ? "low" : "high"); | 910 | "%s receiver\n", sense ? "low" : "high"); |
| 895 | 911 | ||
| 912 | dprintk("Interrupt %d, port %04x obtained\n", irq, io); | ||
| 896 | return 0; | 913 | return 0; |
| 897 | } | 914 | } |
| 898 | 915 | ||
| 899 | static int set_use_inc(void *data) | 916 | static int set_use_inc(void *data) |
| 900 | { | 917 | { |
| 901 | int result; | ||
| 902 | unsigned long flags; | 918 | unsigned long flags; |
| 903 | 919 | ||
| 904 | /* initialize timestamp */ | 920 | /* initialize timestamp */ |
| 905 | do_gettimeofday(&lasttv); | 921 | do_gettimeofday(&lasttv); |
| 906 | 922 | ||
| 907 | result = request_irq(irq, irq_handler, | ||
| 908 | IRQF_DISABLED | (share_irq ? IRQF_SHARED : 0), | ||
| 909 | LIRC_DRIVER_NAME, (void *)&hardware); | ||
| 910 | |||
| 911 | switch (result) { | ||
| 912 | case -EBUSY: | ||
| 913 | printk(KERN_ERR LIRC_DRIVER_NAME ": IRQ %d busy\n", irq); | ||
| 914 | return -EBUSY; | ||
| 915 | case -EINVAL: | ||
| 916 | printk(KERN_ERR LIRC_DRIVER_NAME | ||
| 917 | ": Bad irq number or handler\n"); | ||
| 918 | return -EINVAL; | ||
| 919 | default: | ||
| 920 | dprintk("Interrupt %d, port %04x obtained\n", irq, io); | ||
| 921 | break; | ||
| 922 | } | ||
| 923 | |||
| 924 | spin_lock_irqsave(&hardware[type].lock, flags); | 923 | spin_lock_irqsave(&hardware[type].lock, flags); |
| 925 | 924 | ||
| 926 | /* Set DLAB 0. */ | 925 | /* Set DLAB 0. */ |
| @@ -945,10 +944,6 @@ static void set_use_dec(void *data) | |||
| 945 | soutp(UART_IER, sinp(UART_IER) & | 944 | soutp(UART_IER, sinp(UART_IER) & |
| 946 | (~(UART_IER_MSI|UART_IER_RLSI|UART_IER_THRI|UART_IER_RDI))); | 945 | (~(UART_IER_MSI|UART_IER_RLSI|UART_IER_THRI|UART_IER_RDI))); |
| 947 | spin_unlock_irqrestore(&hardware[type].lock, flags); | 946 | spin_unlock_irqrestore(&hardware[type].lock, flags); |
| 948 | |||
| 949 | free_irq(irq, (void *)&hardware); | ||
| 950 | |||
| 951 | dprintk("freed IRQ %d\n", irq); | ||
| 952 | } | 947 | } |
| 953 | 948 | ||
| 954 | static ssize_t lirc_write(struct file *file, const char *buf, | 949 | static ssize_t lirc_write(struct file *file, const char *buf, |
| @@ -1256,6 +1251,9 @@ exit_serial_exit: | |||
| 1256 | static void __exit lirc_serial_exit_module(void) | 1251 | static void __exit lirc_serial_exit_module(void) |
| 1257 | { | 1252 | { |
| 1258 | lirc_serial_exit(); | 1253 | lirc_serial_exit(); |
| 1254 | |||
| 1255 | free_irq(irq, (void *)&hardware); | ||
| 1256 | |||
| 1259 | if (iommap != 0) | 1257 | if (iommap != 0) |
| 1260 | release_mem_region(iommap, 8 << ioshift); | 1258 | release_mem_region(iommap, 8 << ioshift); |
| 1261 | else | 1259 | else |
