serial: mrst_max3110: Make the IRQ option runtime
authorAlan Cox <alan@linux.intel.com>
Mon, 13 Sep 2010 07:39:56 +0000 (15:39 +0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 22 Oct 2010 17:20:03 +0000 (10:20 -0700)
And while we are at it allow it to fail to find one. Without this the IRQ
option will cause the 3110 driver to fail on 0.7 SFI firmware.

Acked-by: Feng Tang <feng.tang@intel.com>
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/serial/Kconfig
drivers/serial/mrst_max3110.c

index 12900f7083b08819fdf31b3ab626d560bbfa01f8..ba4b390299d561daa2722a95b54cd648a5248051 100644 (file)
@@ -717,13 +717,6 @@ config SERIAL_MRST_MAX3110
          the Intel Moorestown platform. On other systems use the max3100
          driver.
 
-config MRST_MAX3110_IRQ
-       boolean "Enable GPIO IRQ for Max3110 over Moorestown"
-       default n
-       depends on SERIAL_MRST_MAX3110 && GPIO_LANGWELL
-       help
-         This has to be enabled after Moorestown GPIO driver is loaded
-
 config SERIAL_MFD_HSU
        tristate "Medfield High Speed UART support"
        depends on PCI
index af8db27f9e87a9d642b9b976fc0ac802151debd5..b62857bf2fdbd61d17ca43550d8ee6e371172edf 100644 (file)
@@ -447,7 +447,6 @@ static int max3110_main_thread(void *_max)
        return ret;
 }
 
-#ifdef CONFIG_MRST_MAX3110_IRQ
 static irqreturn_t serial_m3110_irq(int irq, void *dev_id)
 {
        struct uart_max3110 *max = dev_id;
@@ -459,7 +458,7 @@ static irqreturn_t serial_m3110_irq(int irq, void *dev_id)
 
        return IRQ_HANDLED;
 }
-#else
+
 /* if don't use RX IRQ, then need a thread to polling read */
 static int max3110_read_thread(void *_max)
 {
@@ -482,7 +481,6 @@ static int max3110_read_thread(void *_max)
 
        return 0;
 }
-#endif
 
 static int serial_m3110_startup(struct uart_port *port)
 {
@@ -505,34 +503,38 @@ static int serial_m3110_startup(struct uart_port *port)
        /* as we use thread to handle tx/rx, need set low latency */
        port->state->port.tty->low_latency = 1;
 
-#ifdef CONFIG_MRST_MAX3110_IRQ
-       ret = request_irq(max->irq, serial_m3110_irq,
+       if (max->irq) {
+               max->read_thread = NULL;
+               ret = request_irq(max->irq, serial_m3110_irq,
                                IRQ_TYPE_EDGE_FALLING, "max3110", max);
-       if (ret)
-               return ret;
+               if (ret) {
+                       max->irq = 0;
+                       pr_err(PR_FMT "unable to allocate IRQ, polling\n");
+               }  else {
+                       /* Enable RX IRQ only */
+                       config |= WC_RXA_IRQ_ENABLE;
+               }
+       }
 
-       /* Enable RX IRQ only */
-       config |= WC_RXA_IRQ_ENABLE;
-#else
-       /* If IRQ is disabled, start a read thread for input data */
-       max->read_thread =
-               kthread_run(max3110_read_thread, max, "max3110_read");
-       if (IS_ERR(max->read_thread)) {
-               ret = PTR_ERR(max->read_thread);
-               max->read_thread = NULL;
-               pr_err(PR_FMT "Can't create read thread!");
-               return ret;
+       if (max->irq == 0) {
+               /* If IRQ is disabled, start a read thread for input data */
+               max->read_thread =
+                       kthread_run(max3110_read_thread, max, "max3110_read");
+               if (IS_ERR(max->read_thread)) {
+                       ret = PTR_ERR(max->read_thread);
+                       max->read_thread = NULL;
+                       pr_err(PR_FMT "Can't create read thread!\n");
+                       return ret;
+               }
        }
-#endif
 
        ret = max3110_out(max, config);
        if (ret) {
-#ifdef CONFIG_MRST_MAX3110_IRQ
-               free_irq(max->irq, max);
-#else
-               kthread_stop(max->read_thread);
+               if (max->irq)
+                       free_irq(max->irq, max);
+               if (max->read_thread)
+                       kthread_stop(max->read_thread);
                max->read_thread = NULL;
-#endif
                return ret;
        }
 
@@ -551,9 +553,8 @@ static void serial_m3110_shutdown(struct uart_port *port)
                max->read_thread = NULL;
        }
 
-#ifdef CONFIG_MRST_MAX3110_IRQ
-       free_irq(max->irq, max);
-#endif
+       if (max->irq)
+               free_irq(max->irq, max);
 
        /* Disable interrupts from this port */
        config = WC_TAG | WC_SW_SHDI;