diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/serial/Kconfig | 7 | ||||
-rw-r--r-- | drivers/serial/mrst_max3110.c | 55 |
2 files changed, 28 insertions, 34 deletions
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 12900f7083b0..ba4b390299d5 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig | |||
@@ -717,13 +717,6 @@ config SERIAL_MRST_MAX3110 | |||
717 | the Intel Moorestown platform. On other systems use the max3100 | 717 | the Intel Moorestown platform. On other systems use the max3100 |
718 | driver. | 718 | driver. |
719 | 719 | ||
720 | config MRST_MAX3110_IRQ | ||
721 | boolean "Enable GPIO IRQ for Max3110 over Moorestown" | ||
722 | default n | ||
723 | depends on SERIAL_MRST_MAX3110 && GPIO_LANGWELL | ||
724 | help | ||
725 | This has to be enabled after Moorestown GPIO driver is loaded | ||
726 | |||
727 | config SERIAL_MFD_HSU | 720 | config SERIAL_MFD_HSU |
728 | tristate "Medfield High Speed UART support" | 721 | tristate "Medfield High Speed UART support" |
729 | depends on PCI | 722 | depends on PCI |
diff --git a/drivers/serial/mrst_max3110.c b/drivers/serial/mrst_max3110.c index af8db27f9e87..b62857bf2fdb 100644 --- a/drivers/serial/mrst_max3110.c +++ b/drivers/serial/mrst_max3110.c | |||
@@ -447,7 +447,6 @@ static int max3110_main_thread(void *_max) | |||
447 | return ret; | 447 | return ret; |
448 | } | 448 | } |
449 | 449 | ||
450 | #ifdef CONFIG_MRST_MAX3110_IRQ | ||
451 | static irqreturn_t serial_m3110_irq(int irq, void *dev_id) | 450 | static irqreturn_t serial_m3110_irq(int irq, void *dev_id) |
452 | { | 451 | { |
453 | struct uart_max3110 *max = dev_id; | 452 | struct uart_max3110 *max = dev_id; |
@@ -459,7 +458,7 @@ static irqreturn_t serial_m3110_irq(int irq, void *dev_id) | |||
459 | 458 | ||
460 | return IRQ_HANDLED; | 459 | return IRQ_HANDLED; |
461 | } | 460 | } |
462 | #else | 461 | |
463 | /* if don't use RX IRQ, then need a thread to polling read */ | 462 | /* if don't use RX IRQ, then need a thread to polling read */ |
464 | static int max3110_read_thread(void *_max) | 463 | static int max3110_read_thread(void *_max) |
465 | { | 464 | { |
@@ -482,7 +481,6 @@ static int max3110_read_thread(void *_max) | |||
482 | 481 | ||
483 | return 0; | 482 | return 0; |
484 | } | 483 | } |
485 | #endif | ||
486 | 484 | ||
487 | static int serial_m3110_startup(struct uart_port *port) | 485 | static int serial_m3110_startup(struct uart_port *port) |
488 | { | 486 | { |
@@ -505,34 +503,38 @@ static int serial_m3110_startup(struct uart_port *port) | |||
505 | /* as we use thread to handle tx/rx, need set low latency */ | 503 | /* as we use thread to handle tx/rx, need set low latency */ |
506 | port->state->port.tty->low_latency = 1; | 504 | port->state->port.tty->low_latency = 1; |
507 | 505 | ||
508 | #ifdef CONFIG_MRST_MAX3110_IRQ | 506 | if (max->irq) { |
509 | ret = request_irq(max->irq, serial_m3110_irq, | 507 | max->read_thread = NULL; |
508 | ret = request_irq(max->irq, serial_m3110_irq, | ||
510 | IRQ_TYPE_EDGE_FALLING, "max3110", max); | 509 | IRQ_TYPE_EDGE_FALLING, "max3110", max); |
511 | if (ret) | 510 | if (ret) { |
512 | return ret; | 511 | max->irq = 0; |
512 | pr_err(PR_FMT "unable to allocate IRQ, polling\n"); | ||
513 | } else { | ||
514 | /* Enable RX IRQ only */ | ||
515 | config |= WC_RXA_IRQ_ENABLE; | ||
516 | } | ||
517 | } | ||
513 | 518 | ||
514 | /* Enable RX IRQ only */ | 519 | if (max->irq == 0) { |
515 | config |= WC_RXA_IRQ_ENABLE; | 520 | /* If IRQ is disabled, start a read thread for input data */ |
516 | #else | 521 | max->read_thread = |
517 | /* If IRQ is disabled, start a read thread for input data */ | 522 | kthread_run(max3110_read_thread, max, "max3110_read"); |
518 | max->read_thread = | 523 | if (IS_ERR(max->read_thread)) { |
519 | kthread_run(max3110_read_thread, max, "max3110_read"); | 524 | ret = PTR_ERR(max->read_thread); |
520 | if (IS_ERR(max->read_thread)) { | 525 | max->read_thread = NULL; |
521 | ret = PTR_ERR(max->read_thread); | 526 | pr_err(PR_FMT "Can't create read thread!\n"); |
522 | max->read_thread = NULL; | 527 | return ret; |
523 | pr_err(PR_FMT "Can't create read thread!"); | 528 | } |
524 | return ret; | ||
525 | } | 529 | } |
526 | #endif | ||
527 | 530 | ||
528 | ret = max3110_out(max, config); | 531 | ret = max3110_out(max, config); |
529 | if (ret) { | 532 | if (ret) { |
530 | #ifdef CONFIG_MRST_MAX3110_IRQ | 533 | if (max->irq) |
531 | free_irq(max->irq, max); | 534 | free_irq(max->irq, max); |
532 | #else | 535 | if (max->read_thread) |
533 | kthread_stop(max->read_thread); | 536 | kthread_stop(max->read_thread); |
534 | max->read_thread = NULL; | 537 | max->read_thread = NULL; |
535 | #endif | ||
536 | return ret; | 538 | return ret; |
537 | } | 539 | } |
538 | 540 | ||
@@ -551,9 +553,8 @@ static void serial_m3110_shutdown(struct uart_port *port) | |||
551 | max->read_thread = NULL; | 553 | max->read_thread = NULL; |
552 | } | 554 | } |
553 | 555 | ||
554 | #ifdef CONFIG_MRST_MAX3110_IRQ | 556 | if (max->irq) |
555 | free_irq(max->irq, max); | 557 | free_irq(max->irq, max); |
556 | #endif | ||
557 | 558 | ||
558 | /* Disable interrupts from this port */ | 559 | /* Disable interrupts from this port */ |
559 | config = WC_TAG | WC_SW_SHDI; | 560 | config = WC_TAG | WC_SW_SHDI; |