aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/serial/mrst_max3110.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/serial/mrst_max3110.c')
-rw-r--r--drivers/serial/mrst_max3110.c55
1 files changed, 28 insertions, 27 deletions
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
451static irqreturn_t serial_m3110_irq(int irq, void *dev_id) 450static 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 */
464static int max3110_read_thread(void *_max) 463static 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
487static int serial_m3110_startup(struct uart_port *port) 485static 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;