Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6

* master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6:
[SUNSAB]: Fix several bugs.

+42 -65
+42 -65
drivers/serial/sunsab.c
··· 58 58 unsigned char interrupt_mask1;/* ISR1 masking */ 59 59 unsigned char pvr_dtr_bit; /* Which PVR bit is DTR */ 60 60 unsigned char pvr_dsr_bit; /* Which PVR bit is DSR */ 61 + unsigned int gis_shift; 61 62 int type; /* SAB82532 version */ 62 63 63 64 /* Setting configuration bits while the transmitter is active ··· 306 305 struct tty_struct *tty; 307 306 union sab82532_irq_status status; 308 307 unsigned long flags; 308 + unsigned char gis; 309 309 310 310 spin_lock_irqsave(&up->port.lock, flags); 311 311 312 312 status.stat = 0; 313 - if (readb(&up->regs->r.gis) & SAB82532_GIS_ISA0) 313 + gis = readb(&up->regs->r.gis) >> up->gis_shift; 314 + if (gis & 1) 314 315 status.sreg.isr0 = readb(&up->regs->r.isr0); 315 - if (readb(&up->regs->r.gis) & SAB82532_GIS_ISA1) 316 + if (gis & 2) 316 317 status.sreg.isr1 = readb(&up->regs->r.isr1); 317 318 318 319 tty = NULL; ··· 325 322 tty = receive_chars(up, &status); 326 323 if ((status.sreg.isr0 & SAB82532_ISR0_CDSC) || 327 324 (status.sreg.isr1 & SAB82532_ISR1_CSC)) 328 - check_status(up, &status); 329 - if (status.sreg.isr1 & (SAB82532_ISR1_ALLS | SAB82532_ISR1_XPR)) 330 - transmit_chars(up, &status); 331 - } 332 - 333 - spin_unlock(&up->port.lock); 334 - 335 - if (tty) 336 - tty_flip_buffer_push(tty); 337 - 338 - up++; 339 - 340 - spin_lock(&up->port.lock); 341 - 342 - status.stat = 0; 343 - if (readb(&up->regs->r.gis) & SAB82532_GIS_ISB0) 344 - status.sreg.isr0 = readb(&up->regs->r.isr0); 345 - if (readb(&up->regs->r.gis) & SAB82532_GIS_ISB1) 346 - status.sreg.isr1 = readb(&up->regs->r.isr1); 347 - 348 - tty = NULL; 349 - if (status.stat) { 350 - if ((status.sreg.isr0 & (SAB82532_ISR0_TCD | SAB82532_ISR0_TIME | 351 - SAB82532_ISR0_RFO | SAB82532_ISR0_RPF)) || 352 - (status.sreg.isr1 & SAB82532_ISR1_BRK)) 353 - 354 - tty = receive_chars(up, &status); 355 - if ((status.sreg.isr0 & SAB82532_ISR0_CDSC) || 356 - (status.sreg.isr1 & (SAB82532_ISR1_BRK | SAB82532_ISR1_CSC))) 357 325 check_status(up, &status); 358 326 if (status.sreg.isr1 & (SAB82532_ISR1_ALLS | SAB82532_ISR1_XPR)) 359 327 transmit_chars(up, &status); ··· 513 539 struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; 514 540 unsigned long flags; 515 541 unsigned char tmp; 542 + int err = request_irq(up->port.irq, sunsab_interrupt, 543 + IRQF_SHARED, "sab", up); 544 + if (err) 545 + return err; 516 546 517 547 spin_lock_irqsave(&up->port.lock, flags); 518 548 ··· 619 641 #endif 620 642 621 643 spin_unlock_irqrestore(&up->port.lock, flags); 644 + free_irq(up->port.irq, up); 622 645 } 623 646 624 647 /* ··· 987 1008 if ((up->port.line & 0x1) == 0) { 988 1009 up->pvr_dsr_bit = (1 << 0); 989 1010 up->pvr_dtr_bit = (1 << 1); 1011 + up->gis_shift = 2; 990 1012 } else { 991 1013 up->pvr_dsr_bit = (1 << 3); 992 1014 up->pvr_dtr_bit = (1 << 2); 1015 + up->gis_shift = 0; 993 1016 } 994 1017 up->cached_pvr = (1 << 1) | (1 << 2) | (1 << 4); 995 1018 writeb(up->cached_pvr, &up->regs->w.pvr); ··· 1003 1022 1004 1023 up->tec_timeout = SAB82532_MAX_TEC_TIMEOUT; 1005 1024 up->cec_timeout = SAB82532_MAX_CEC_TIMEOUT; 1006 - 1007 - if (!(up->port.line & 0x01)) { 1008 - int err; 1009 - 1010 - err = request_irq(up->port.irq, sunsab_interrupt, 1011 - IRQF_SHARED, "sab", up); 1012 - if (err) { 1013 - of_iounmap(&op->resource[0], 1014 - up->port.membase, 1015 - sizeof(union sab82532_async_regs)); 1016 - return err; 1017 - } 1018 - } 1019 1025 1020 1026 return 0; 1021 1027 } ··· 1019 1051 0, 1020 1052 (inst * 2) + 0); 1021 1053 if (err) 1022 - return err; 1054 + goto out; 1023 1055 1024 1056 err = sunsab_init_one(&up[1], op, 1025 1057 sizeof(union sab82532_async_regs), 1026 1058 (inst * 2) + 1); 1027 - if (err) { 1028 - of_iounmap(&op->resource[0], 1029 - up[0].port.membase, 1030 - sizeof(union sab82532_async_regs)); 1031 - free_irq(up[0].port.irq, &up[0]); 1032 - return err; 1033 - } 1059 + if (err) 1060 + goto out1; 1034 1061 1035 1062 sunserial_console_match(SUNSAB_CONSOLE(), op->node, 1036 1063 &sunsab_reg, up[0].port.line); 1037 - uart_add_one_port(&sunsab_reg, &up[0].port); 1038 1064 1039 1065 sunserial_console_match(SUNSAB_CONSOLE(), op->node, 1040 1066 &sunsab_reg, up[1].port.line); 1041 - uart_add_one_port(&sunsab_reg, &up[1].port); 1067 + 1068 + err = uart_add_one_port(&sunsab_reg, &up[0].port); 1069 + if (err) 1070 + goto out2; 1071 + 1072 + err = uart_add_one_port(&sunsab_reg, &up[1].port); 1073 + if (err) 1074 + goto out3; 1042 1075 1043 1076 dev_set_drvdata(&op->dev, &up[0]); 1044 1077 1045 1078 inst++; 1046 1079 1047 1080 return 0; 1048 - } 1049 1081 1050 - static void __devexit sab_remove_one(struct uart_sunsab_port *up) 1051 - { 1052 - struct of_device *op = to_of_device(up->port.dev); 1053 - 1054 - uart_remove_one_port(&sunsab_reg, &up->port); 1055 - if (!(up->port.line & 1)) 1056 - free_irq(up->port.irq, up); 1082 + out3: 1083 + uart_remove_one_port(&sunsab_reg, &up[0].port); 1084 + out2: 1057 1085 of_iounmap(&op->resource[0], 1058 - up->port.membase, 1086 + up[1].port.membase, 1059 1087 sizeof(union sab82532_async_regs)); 1088 + out1: 1089 + of_iounmap(&op->resource[0], 1090 + up[0].port.membase, 1091 + sizeof(union sab82532_async_regs)); 1092 + out: 1093 + return err; 1060 1094 } 1061 1095 1062 1096 static int __devexit sab_remove(struct of_device *op) 1063 1097 { 1064 1098 struct uart_sunsab_port *up = dev_get_drvdata(&op->dev); 1065 1099 1066 - sab_remove_one(&up[0]); 1067 - sab_remove_one(&up[1]); 1100 + uart_remove_one_port(&sunsab_reg, &up[1].port); 1101 + uart_remove_one_port(&sunsab_reg, &up[0].port); 1102 + of_iounmap(&op->resource[0], 1103 + up[1].port.membase, 1104 + sizeof(union sab82532_async_regs)); 1105 + of_iounmap(&op->resource[0], 1106 + up[0].port.membase, 1107 + sizeof(union sab82532_async_regs)); 1068 1108 1069 1109 dev_set_drvdata(&op->dev, NULL); 1070 1110 ··· 1119 1143 1120 1144 sunsab_reg.minor = sunserial_current_minor; 1121 1145 sunsab_reg.nr = num_channels; 1146 + sunsab_reg.cons = SUNSAB_CONSOLE(); 1122 1147 1123 1148 err = uart_register_driver(&sunsab_reg); 1124 1149 if (err) {