Lines Matching full:up

108 static unsigned int serial_in(struct uart_sunsu_port *up, int offset)  in serial_in()  argument
110 offset <<= up->port.regshift; in serial_in()
112 switch (up->port.iotype) { in serial_in()
114 outb(up->port.hub6 - 1 + offset, up->port.iobase); in serial_in()
115 return inb(up->port.iobase + 1); in serial_in()
118 return readb(up->port.membase + offset); in serial_in()
121 return inb(up->port.iobase + offset); in serial_in()
125 static void serial_out(struct uart_sunsu_port *up, int offset, int value) in serial_out() argument
139 offset <<= up->port.regshift; in serial_out()
141 switch (up->port.iotype) { in serial_out()
143 outb(up->port.hub6 - 1 + offset, up->port.iobase); in serial_out()
144 outb(value, up->port.iobase + 1); in serial_out()
148 writeb(value, up->port.membase + offset); in serial_out()
152 outb(value, up->port.iobase + offset); in serial_out()
162 #define serial_inp(up, offset) serial_in(up, offset) argument
163 #define serial_outp(up, offset, value) serial_out(up, offset, value) argument
169 static void serial_icr_write(struct uart_sunsu_port *up, int offset, int value) in serial_icr_write() argument
171 serial_out(up, UART_SCR, offset); in serial_icr_write()
172 serial_out(up, UART_ICR, value); in serial_icr_write()
176 static unsigned int serial_icr_read(struct uart_sunsu_port *up, int offset)
180 serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD);
181 serial_out(up, UART_SCR, offset);
182 value = serial_in(up, UART_ICR);
183 serial_icr_write(up, UART_ACR, up->acr);
194 static int __enable_rsa(struct uart_sunsu_port *up) in __enable_rsa() argument
199 mode = serial_inp(up, UART_RSA_MSR); in __enable_rsa()
203 serial_outp(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO); in __enable_rsa()
204 mode = serial_inp(up, UART_RSA_MSR); in __enable_rsa()
209 up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16; in __enable_rsa()
214 static void enable_rsa(struct uart_sunsu_port *up) in enable_rsa() argument
216 if (up->port.type == PORT_RSA) { in enable_rsa()
217 if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) { in enable_rsa()
218 spin_lock_irq(&up->port.lock); in enable_rsa()
219 __enable_rsa(up); in enable_rsa()
220 spin_unlock_irq(&up->port.lock); in enable_rsa()
222 if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) in enable_rsa()
223 serial_outp(up, UART_RSA_FRR, 0); in enable_rsa()
233 static void disable_rsa(struct uart_sunsu_port *up) in disable_rsa() argument
238 if (up->port.type == PORT_RSA && in disable_rsa()
239 up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) { in disable_rsa()
240 spin_lock_irq(&up->port.lock); in disable_rsa()
242 mode = serial_inp(up, UART_RSA_MSR); in disable_rsa()
246 serial_outp(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO); in disable_rsa()
247 mode = serial_inp(up, UART_RSA_MSR); in disable_rsa()
252 up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16; in disable_rsa()
253 spin_unlock_irq(&up->port.lock); in disable_rsa()
268 struct uart_sunsu_port *up = in sunsu_stop_tx() local
271 __stop_tx(up); in sunsu_stop_tx()
276 if (up->port.type == PORT_16C950) { in sunsu_stop_tx()
277 up->acr |= UART_ACR_TXDIS; in sunsu_stop_tx()
278 serial_icr_write(up, UART_ACR, up->acr); in sunsu_stop_tx()
284 struct uart_sunsu_port *up = in sunsu_start_tx() local
287 if (!(up->ier & UART_IER_THRI)) { in sunsu_start_tx()
288 up->ier |= UART_IER_THRI; in sunsu_start_tx()
289 serial_out(up, UART_IER, up->ier); in sunsu_start_tx()
295 if (up->port.type == PORT_16C950 && up->acr & UART_ACR_TXDIS) { in sunsu_start_tx()
296 up->acr &= ~UART_ACR_TXDIS; in sunsu_start_tx()
297 serial_icr_write(up, UART_ACR, up->acr); in sunsu_start_tx()
303 struct uart_sunsu_port *up = in sunsu_stop_rx() local
306 up->ier &= ~UART_IER_RLSI; in sunsu_stop_rx()
307 up->port.read_status_mask &= ~UART_LSR_DR; in sunsu_stop_rx()
308 serial_out(up, UART_IER, up->ier); in sunsu_stop_rx()
313 struct uart_sunsu_port *up = in sunsu_enable_ms() local
317 spin_lock_irqsave(&up->port.lock, flags); in sunsu_enable_ms()
318 up->ier |= UART_IER_MSI; in sunsu_enable_ms()
319 serial_out(up, UART_IER, up->ier); in sunsu_enable_ms()
320 spin_unlock_irqrestore(&up->port.lock, flags); in sunsu_enable_ms()
324 receive_chars(struct uart_sunsu_port *up, unsigned char *status) in receive_chars() argument
326 struct tty_port *port = &up->port.state->port; in receive_chars()
332 ch = serial_inp(up, UART_RX); in receive_chars()
334 up->port.icount.rx++; in receive_chars()
343 up->port.icount.brk++; in receive_chars()
344 if (up->port.cons != NULL && in receive_chars()
345 up->port.line == up->port.cons->index) in receive_chars()
353 if (uart_handle_break(&up->port)) in receive_chars()
356 up->port.icount.parity++; in receive_chars()
358 up->port.icount.frame++; in receive_chars()
360 up->port.icount.overrun++; in receive_chars()
365 *status &= up->port.read_status_mask; in receive_chars()
367 if (up->port.cons != NULL && in receive_chars()
368 up->port.line == up->port.cons->index) { in receive_chars()
370 *status |= up->lsr_break_flag; in receive_chars()
371 up->lsr_break_flag = 0; in receive_chars()
381 if (uart_handle_sysrq_char(&up->port, ch)) in receive_chars()
383 if ((*status & up->port.ignore_status_mask) == 0) in receive_chars()
393 *status = serial_inp(up, UART_LSR); in receive_chars()
400 static void transmit_chars(struct uart_sunsu_port *up) in transmit_chars() argument
402 struct circ_buf *xmit = &up->port.state->xmit; in transmit_chars()
405 if (up->port.x_char) { in transmit_chars()
406 serial_outp(up, UART_TX, up->port.x_char); in transmit_chars()
407 up->port.icount.tx++; in transmit_chars()
408 up->port.x_char = 0; in transmit_chars()
411 if (uart_tx_stopped(&up->port)) { in transmit_chars()
412 sunsu_stop_tx(&up->port); in transmit_chars()
416 __stop_tx(up); in transmit_chars()
420 count = up->port.fifosize; in transmit_chars()
422 serial_out(up, UART_TX, xmit->buf[xmit->tail]); in transmit_chars()
424 up->port.icount.tx++; in transmit_chars()
430 uart_write_wakeup(&up->port); in transmit_chars()
433 __stop_tx(up); in transmit_chars()
436 static void check_modem_status(struct uart_sunsu_port *up) in check_modem_status() argument
440 status = serial_in(up, UART_MSR); in check_modem_status()
446 up->port.icount.rng++; in check_modem_status()
448 up->port.icount.dsr++; in check_modem_status()
450 uart_handle_dcd_change(&up->port, status & UART_MSR_DCD); in check_modem_status()
452 uart_handle_cts_change(&up->port, status & UART_MSR_CTS); in check_modem_status()
454 wake_up_interruptible(&up->port.state->port.delta_msr_wait); in check_modem_status()
459 struct uart_sunsu_port *up = dev_id; in sunsu_serial_interrupt() local
463 spin_lock_irqsave(&up->port.lock, flags); in sunsu_serial_interrupt()
466 status = serial_inp(up, UART_LSR); in sunsu_serial_interrupt()
468 receive_chars(up, &status); in sunsu_serial_interrupt()
469 check_modem_status(up); in sunsu_serial_interrupt()
471 transmit_chars(up); in sunsu_serial_interrupt()
473 spin_unlock_irqrestore(&up->port.lock, flags); in sunsu_serial_interrupt()
475 tty_flip_buffer_push(&up->port.state->port); in sunsu_serial_interrupt()
477 spin_lock_irqsave(&up->port.lock, flags); in sunsu_serial_interrupt()
479 } while (!(serial_in(up, UART_IIR) & UART_IIR_NO_INT)); in sunsu_serial_interrupt()
481 spin_unlock_irqrestore(&up->port.lock, flags); in sunsu_serial_interrupt()
492 static void sunsu_change_mouse_baud(struct uart_sunsu_port *up) in sunsu_change_mouse_baud() argument
494 unsigned int cur_cflag = up->cflag; in sunsu_change_mouse_baud()
497 up->cflag &= ~CBAUD; in sunsu_change_mouse_baud()
498 up->cflag |= suncore_mouse_baud_cflag_next(cur_cflag, &new_baud); in sunsu_change_mouse_baud()
500 quot = up->port.uartclk / (16 * new_baud); in sunsu_change_mouse_baud()
502 sunsu_change_speed(&up->port, up->cflag, 0, quot); in sunsu_change_mouse_baud()
505 static void receive_kbd_ms_chars(struct uart_sunsu_port *up, int is_break) in receive_kbd_ms_chars() argument
508 unsigned char ch = serial_inp(up, UART_RX); in receive_kbd_ms_chars()
511 if (up->su_type == SU_PORT_KBD) { in receive_kbd_ms_chars()
513 serio_interrupt(&up->serio, ch, 0); in receive_kbd_ms_chars()
515 } else if (up->su_type == SU_PORT_MS) { in receive_kbd_ms_chars()
520 sunsu_change_mouse_baud(up); in receive_kbd_ms_chars()
527 serio_interrupt(&up->serio, ch, 0); in receive_kbd_ms_chars()
532 } while (serial_in(up, UART_LSR) & UART_LSR_DR); in receive_kbd_ms_chars()
537 struct uart_sunsu_port *up = dev_id; in sunsu_kbd_ms_interrupt() local
539 if (!(serial_in(up, UART_IIR) & UART_IIR_NO_INT)) { in sunsu_kbd_ms_interrupt()
540 unsigned char status = serial_inp(up, UART_LSR); in sunsu_kbd_ms_interrupt()
543 receive_kbd_ms_chars(up, (status & UART_LSR_BI) != 0); in sunsu_kbd_ms_interrupt()
551 struct uart_sunsu_port *up = in sunsu_tx_empty() local
556 spin_lock_irqsave(&up->port.lock, flags); in sunsu_tx_empty()
557 ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0; in sunsu_tx_empty()
558 spin_unlock_irqrestore(&up->port.lock, flags); in sunsu_tx_empty()
565 struct uart_sunsu_port *up = in sunsu_get_mctrl() local
570 status = serial_in(up, UART_MSR); in sunsu_get_mctrl()
586 struct uart_sunsu_port *up = in sunsu_set_mctrl() local
601 serial_out(up, UART_MCR, mcr); in sunsu_set_mctrl()
606 struct uart_sunsu_port *up = in sunsu_break_ctl() local
610 spin_lock_irqsave(&up->port.lock, flags); in sunsu_break_ctl()
612 up->lcr |= UART_LCR_SBC; in sunsu_break_ctl()
614 up->lcr &= ~UART_LCR_SBC; in sunsu_break_ctl()
615 serial_out(up, UART_LCR, up->lcr); in sunsu_break_ctl()
616 spin_unlock_irqrestore(&up->port.lock, flags); in sunsu_break_ctl()
621 struct uart_sunsu_port *up = in sunsu_startup() local
626 if (up->port.type == PORT_16C950) { in sunsu_startup()
627 /* Wake up and initialize UART */ in sunsu_startup()
628 up->acr = 0; in sunsu_startup()
629 serial_outp(up, UART_LCR, 0xBF); in sunsu_startup()
630 serial_outp(up, UART_EFR, UART_EFR_ECB); in sunsu_startup()
631 serial_outp(up, UART_IER, 0); in sunsu_startup()
632 serial_outp(up, UART_LCR, 0); in sunsu_startup()
633 serial_icr_write(up, UART_CSR, 0); /* Reset the UART */ in sunsu_startup()
634 serial_outp(up, UART_LCR, 0xBF); in sunsu_startup()
635 serial_outp(up, UART_EFR, UART_EFR_ECB); in sunsu_startup()
636 serial_outp(up, UART_LCR, 0); in sunsu_startup()
641 * If this is an RSA port, see if we can kick it up to the in sunsu_startup()
644 enable_rsa(up); in sunsu_startup()
651 if (uart_config[up->port.type].flags & UART_CLEAR_FIFO) { in sunsu_startup()
652 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); in sunsu_startup()
653 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | in sunsu_startup()
655 serial_outp(up, UART_FCR, 0); in sunsu_startup()
661 (void) serial_inp(up, UART_LSR); in sunsu_startup()
662 (void) serial_inp(up, UART_RX); in sunsu_startup()
663 (void) serial_inp(up, UART_IIR); in sunsu_startup()
664 (void) serial_inp(up, UART_MSR); in sunsu_startup()
671 if (!(up->port.flags & UPF_BUGGY_UART) && in sunsu_startup()
672 (serial_inp(up, UART_LSR) == 0xff)) { in sunsu_startup()
673 printk("ttyS%d: LSR safety check engaged!\n", up->port.line); in sunsu_startup()
677 if (up->su_type != SU_PORT_PORT) { in sunsu_startup()
678 retval = request_irq(up->port.irq, sunsu_kbd_ms_interrupt, in sunsu_startup()
679 IRQF_SHARED, su_typev[up->su_type], up); in sunsu_startup()
681 retval = request_irq(up->port.irq, sunsu_serial_interrupt, in sunsu_startup()
682 IRQF_SHARED, su_typev[up->su_type], up); in sunsu_startup()
685 printk("su: Cannot register IRQ %d\n", up->port.irq); in sunsu_startup()
692 serial_outp(up, UART_LCR, UART_LCR_WLEN8); in sunsu_startup()
694 spin_lock_irqsave(&up->port.lock, flags); in sunsu_startup()
696 up->port.mctrl |= TIOCM_OUT2; in sunsu_startup()
698 sunsu_set_mctrl(&up->port, up->port.mctrl); in sunsu_startup()
699 spin_unlock_irqrestore(&up->port.lock, flags); in sunsu_startup()
706 up->ier = UART_IER_RLSI | UART_IER_RDI; in sunsu_startup()
707 serial_outp(up, UART_IER, up->ier); in sunsu_startup()
709 if (up->port.flags & UPF_FOURPORT) { in sunsu_startup()
714 icp = (up->port.iobase & 0xfe0) | 0x01f; in sunsu_startup()
722 (void) serial_inp(up, UART_LSR); in sunsu_startup()
723 (void) serial_inp(up, UART_RX); in sunsu_startup()
724 (void) serial_inp(up, UART_IIR); in sunsu_startup()
725 (void) serial_inp(up, UART_MSR); in sunsu_startup()
732 struct uart_sunsu_port *up = in sunsu_shutdown() local
739 up->ier = 0; in sunsu_shutdown()
740 serial_outp(up, UART_IER, 0); in sunsu_shutdown()
742 spin_lock_irqsave(&up->port.lock, flags); in sunsu_shutdown()
743 if (up->port.flags & UPF_FOURPORT) { in sunsu_shutdown()
745 inb((up->port.iobase & 0xfe0) | 0x1f); in sunsu_shutdown()
746 up->port.mctrl |= TIOCM_OUT1; in sunsu_shutdown()
748 up->port.mctrl &= ~TIOCM_OUT2; in sunsu_shutdown()
750 sunsu_set_mctrl(&up->port, up->port.mctrl); in sunsu_shutdown()
751 spin_unlock_irqrestore(&up->port.lock, flags); in sunsu_shutdown()
756 serial_out(up, UART_LCR, serial_inp(up, UART_LCR) & ~UART_LCR_SBC); in sunsu_shutdown()
757 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | in sunsu_shutdown()
760 serial_outp(up, UART_FCR, 0); in sunsu_shutdown()
766 disable_rsa(up); in sunsu_shutdown()
772 (void) serial_in(up, UART_RX); in sunsu_shutdown()
774 free_irq(up->port.irq, up); in sunsu_shutdown()
781 struct uart_sunsu_port *up = in sunsu_change_speed() local
818 if ((quot & 0xff) == 0 && up->port.type == PORT_16C950 && in sunsu_change_speed()
819 up->rev == 0x5201) in sunsu_change_speed()
822 if (uart_config[up->port.type].flags & UART_USE_FIFO) { in sunsu_change_speed()
823 if ((up->port.uartclk / quot) < (2400 * 16)) in sunsu_change_speed()
826 else if (up->port.type == PORT_RSA) in sunsu_change_speed()
832 if (up->port.type == PORT_16750) in sunsu_change_speed()
839 spin_lock_irqsave(&up->port.lock, flags); in sunsu_change_speed()
846 up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR; in sunsu_change_speed()
848 up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE; in sunsu_change_speed()
850 up->port.read_status_mask |= UART_LSR_BI; in sunsu_change_speed()
855 up->port.ignore_status_mask = 0; in sunsu_change_speed()
857 up->port.ignore_status_mask |= UART_LSR_PE | UART_LSR_FE; in sunsu_change_speed()
859 up->port.ignore_status_mask |= UART_LSR_BI; in sunsu_change_speed()
865 up->port.ignore_status_mask |= UART_LSR_OE; in sunsu_change_speed()
872 up->port.ignore_status_mask |= UART_LSR_DR; in sunsu_change_speed()
877 up->ier &= ~UART_IER_MSI; in sunsu_change_speed()
878 if (UART_ENABLE_MS(&up->port, cflag)) in sunsu_change_speed()
879 up->ier |= UART_IER_MSI; in sunsu_change_speed()
881 serial_out(up, UART_IER, up->ier); in sunsu_change_speed()
883 if (uart_config[up->port.type].flags & UART_STARTECH) { in sunsu_change_speed()
884 serial_outp(up, UART_LCR, 0xBF); in sunsu_change_speed()
885 serial_outp(up, UART_EFR, cflag & CRTSCTS ? UART_EFR_CTS :0); in sunsu_change_speed()
887 serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */ in sunsu_change_speed()
888 serial_outp(up, UART_DLL, quot & 0xff); /* LS of divisor */ in sunsu_change_speed()
889 serial_outp(up, UART_DLM, quot >> 8); /* MS of divisor */ in sunsu_change_speed()
890 if (up->port.type == PORT_16750) in sunsu_change_speed()
891 serial_outp(up, UART_FCR, fcr); /* set fcr */ in sunsu_change_speed()
892 serial_outp(up, UART_LCR, cval); /* reset DLAB */ in sunsu_change_speed()
893 up->lcr = cval; /* Save LCR */ in sunsu_change_speed()
894 if (up->port.type != PORT_16750) { in sunsu_change_speed()
897 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); in sunsu_change_speed()
899 serial_outp(up, UART_FCR, fcr); /* set fcr */ in sunsu_change_speed()
902 up->cflag = cflag; in sunsu_change_speed()
904 spin_unlock_irqrestore(&up->port.lock, flags); in sunsu_change_speed()
933 struct uart_sunsu_port *up = in sunsu_config_port() local
942 port->type = up->type_probed; /* XXX */ in sunsu_config_port()
992 struct uart_sunsu_port *up = serio->port_data; in sunsu_serio_write() local
999 lsr = serial_in(up, UART_LSR); in sunsu_serio_write()
1003 serial_out(up, UART_TX, ch); in sunsu_serio_write()
1012 struct uart_sunsu_port *up = serio->port_data; in sunsu_serio_open() local
1017 if (!up->serio_open) { in sunsu_serio_open()
1018 up->serio_open = 1; in sunsu_serio_open()
1029 struct uart_sunsu_port *up = serio->port_data; in sunsu_serio_close() local
1033 up->serio_open = 0; in sunsu_serio_close()
1039 static void sunsu_autoconfig(struct uart_sunsu_port *up) in sunsu_autoconfig() argument
1045 if (up->su_type == SU_PORT_NONE) in sunsu_autoconfig()
1048 up->type_probed = PORT_UNKNOWN; in sunsu_autoconfig()
1049 up->port.iotype = UPIO_MEM; in sunsu_autoconfig()
1051 spin_lock_irqsave(&up->port.lock, flags); in sunsu_autoconfig()
1053 if (!(up->port.flags & UPF_BUGGY_UART)) { in sunsu_autoconfig()
1063 scratch = serial_inp(up, UART_IER); in sunsu_autoconfig()
1064 serial_outp(up, UART_IER, 0); in sunsu_autoconfig()
1068 scratch2 = serial_inp(up, UART_IER); in sunsu_autoconfig()
1069 serial_outp(up, UART_IER, 0x0f); in sunsu_autoconfig()
1073 scratch3 = serial_inp(up, UART_IER); in sunsu_autoconfig()
1074 serial_outp(up, UART_IER, scratch); in sunsu_autoconfig()
1079 save_mcr = serial_in(up, UART_MCR); in sunsu_autoconfig()
1080 save_lcr = serial_in(up, UART_LCR); in sunsu_autoconfig()
1091 if (!(up->port.flags & UPF_SKIP_TEST)) { in sunsu_autoconfig()
1092 serial_outp(up, UART_MCR, UART_MCR_LOOP | 0x0A); in sunsu_autoconfig()
1093 status1 = serial_inp(up, UART_MSR) & 0xF0; in sunsu_autoconfig()
1094 serial_outp(up, UART_MCR, save_mcr); in sunsu_autoconfig()
1098 serial_outp(up, UART_LCR, 0xBF); /* set up for StarTech test */ in sunsu_autoconfig()
1099 serial_outp(up, UART_EFR, 0); /* EFR is the same as FCR */ in sunsu_autoconfig()
1100 serial_outp(up, UART_LCR, 0); in sunsu_autoconfig()
1101 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); in sunsu_autoconfig()
1102 scratch = serial_in(up, UART_IIR) >> 6; in sunsu_autoconfig()
1105 up->port.type = PORT_16450; in sunsu_autoconfig()
1108 up->port.type = PORT_UNKNOWN; in sunsu_autoconfig()
1111 up->port.type = PORT_16550; in sunsu_autoconfig()
1114 up->port.type = PORT_16550A; in sunsu_autoconfig()
1117 if (up->port.type == PORT_16550A) { in sunsu_autoconfig()
1119 serial_outp(up, UART_LCR, UART_LCR_DLAB); in sunsu_autoconfig()
1120 if (serial_in(up, UART_EFR) == 0) { in sunsu_autoconfig()
1121 up->port.type = PORT_16650; in sunsu_autoconfig()
1123 serial_outp(up, UART_LCR, 0xBF); in sunsu_autoconfig()
1124 if (serial_in(up, UART_EFR) == 0) in sunsu_autoconfig()
1125 up->port.type = PORT_16650V2; in sunsu_autoconfig()
1128 if (up->port.type == PORT_16550A) { in sunsu_autoconfig()
1130 serial_outp(up, UART_LCR, save_lcr | UART_LCR_DLAB); in sunsu_autoconfig()
1131 serial_outp(up, UART_FCR, in sunsu_autoconfig()
1133 scratch = serial_in(up, UART_IIR) >> 5; in sunsu_autoconfig()
1141 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); in sunsu_autoconfig()
1142 serial_outp(up, UART_LCR, 0); in sunsu_autoconfig()
1143 serial_outp(up, UART_FCR, in sunsu_autoconfig()
1145 scratch = serial_in(up, UART_IIR) >> 5; in sunsu_autoconfig()
1147 up->port.type = PORT_16750; in sunsu_autoconfig()
1149 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO); in sunsu_autoconfig()
1151 serial_outp(up, UART_LCR, save_lcr); in sunsu_autoconfig()
1152 if (up->port.type == PORT_16450) { in sunsu_autoconfig()
1153 scratch = serial_in(up, UART_SCR); in sunsu_autoconfig()
1154 serial_outp(up, UART_SCR, 0xa5); in sunsu_autoconfig()
1155 status1 = serial_in(up, UART_SCR); in sunsu_autoconfig()
1156 serial_outp(up, UART_SCR, 0x5a); in sunsu_autoconfig()
1157 status2 = serial_in(up, UART_SCR); in sunsu_autoconfig()
1158 serial_outp(up, UART_SCR, scratch); in sunsu_autoconfig()
1161 up->port.type = PORT_8250; in sunsu_autoconfig()
1164 up->port.fifosize = uart_config[up->port.type].dfl_xmit_fifo_size; in sunsu_autoconfig()
1166 if (up->port.type == PORT_UNKNOWN) in sunsu_autoconfig()
1168 up->type_probed = up->port.type; /* XXX */ in sunsu_autoconfig()
1174 if (up->port.type == PORT_RSA) in sunsu_autoconfig()
1175 serial_outp(up, UART_RSA_FRR, 0); in sunsu_autoconfig()
1177 serial_outp(up, UART_MCR, save_mcr); in sunsu_autoconfig()
1178 serial_outp(up, UART_FCR, (UART_FCR_ENABLE_FIFO | in sunsu_autoconfig()
1181 serial_outp(up, UART_FCR, 0); in sunsu_autoconfig()
1182 (void)serial_in(up, UART_RX); in sunsu_autoconfig()
1183 serial_outp(up, UART_IER, 0); in sunsu_autoconfig()
1186 spin_unlock_irqrestore(&up->port.lock, flags); in sunsu_autoconfig()
1196 static int sunsu_kbd_ms_init(struct uart_sunsu_port *up) in sunsu_kbd_ms_init() argument
1203 if (up->su_type == SU_PORT_KBD) { in sunsu_kbd_ms_init()
1204 up->cflag = B1200 | CS8 | CLOCAL | CREAD; in sunsu_kbd_ms_init()
1207 up->cflag = B4800 | CS8 | CLOCAL | CREAD; in sunsu_kbd_ms_init()
1210 quot = up->port.uartclk / (16 * baud); in sunsu_kbd_ms_init()
1212 sunsu_autoconfig(up); in sunsu_kbd_ms_init()
1213 if (up->port.type == PORT_UNKNOWN) in sunsu_kbd_ms_init()
1217 up->port.dev->of_node, in sunsu_kbd_ms_init()
1218 (up->su_type == SU_PORT_KBD) ? "Keyboard" : "Mouse", in sunsu_kbd_ms_init()
1219 (unsigned long long) up->port.mapbase, in sunsu_kbd_ms_init()
1220 up->port.irq); in sunsu_kbd_ms_init()
1223 serio = &up->serio; in sunsu_kbd_ms_init()
1224 serio->port_data = up; in sunsu_kbd_ms_init()
1227 if (up->su_type == SU_PORT_KBD) { in sunsu_kbd_ms_init()
1236 (!(up->port.line & 1) ? "su/serio0" : "su/serio1"), in sunsu_kbd_ms_init()
1242 serio->dev.parent = up->port.dev; in sunsu_kbd_ms_init()
1247 sunsu_change_speed(&up->port, up->cflag, 0, quot); in sunsu_kbd_ms_init()
1249 sunsu_startup(&up->port); in sunsu_kbd_ms_init()
1266 static void wait_for_xmitr(struct uart_sunsu_port *up) in wait_for_xmitr() argument
1270 /* Wait up to 10ms for the character(s) to be sent. */ in wait_for_xmitr()
1272 status = serial_in(up, UART_LSR); in wait_for_xmitr()
1275 up->lsr_break_flag = UART_LSR_BI; in wait_for_xmitr()
1282 /* Wait up to 1s for flow control if necessary */ in wait_for_xmitr()
1283 if (up->port.flags & UPF_CONS_FLOW) { in wait_for_xmitr()
1286 ((serial_in(up, UART_MSR) & UART_MSR_CTS) == 0)) in wait_for_xmitr()
1293 struct uart_sunsu_port *up = in sunsu_console_putchar() local
1296 wait_for_xmitr(up); in sunsu_console_putchar()
1297 serial_out(up, UART_TX, ch); in sunsu_console_putchar()
1307 struct uart_sunsu_port *up = &sunsu_ports[co->index]; in sunsu_console_write() local
1312 if (up->port.sysrq || oops_in_progress) in sunsu_console_write()
1313 locked = spin_trylock_irqsave(&up->port.lock, flags); in sunsu_console_write()
1315 spin_lock_irqsave(&up->port.lock, flags); in sunsu_console_write()
1320 ier = serial_in(up, UART_IER); in sunsu_console_write()
1321 serial_out(up, UART_IER, 0); in sunsu_console_write()
1323 uart_console_write(&up->port, s, count, sunsu_console_putchar); in sunsu_console_write()
1329 wait_for_xmitr(up); in sunsu_console_write()
1330 serial_out(up, UART_IER, ier); in sunsu_console_write()
1333 spin_unlock_irqrestore(&up->port.lock, flags); in sunsu_console_write()
1439 struct uart_sunsu_port *up; in su_probe() local
1449 up = &sunsu_ports[nr_inst]; in su_probe()
1451 up = kzalloc(sizeof(*up), GFP_KERNEL); in su_probe()
1452 if (!up) in su_probe()
1456 up->port.line = nr_inst; in su_probe()
1458 spin_lock_init(&up->port.lock); in su_probe()
1460 up->su_type = type; in su_probe()
1463 up->port.mapbase = rp->start; in su_probe()
1464 up->reg_size = resource_size(rp); in su_probe()
1465 up->port.membase = of_ioremap(rp, 0, up->reg_size, "su"); in su_probe()
1466 if (!up->port.membase) { in su_probe()
1468 kfree(up); in su_probe()
1472 up->port.irq = op->archdata.irqs[0]; in su_probe()
1474 up->port.dev = &op->dev; in su_probe()
1476 up->port.type = PORT_UNKNOWN; in su_probe()
1477 up->port.uartclk = (SU_BASE_BAUD * 16); in su_probe()
1480 if (up->su_type == SU_PORT_KBD || up->su_type == SU_PORT_MS) { in su_probe()
1481 err = sunsu_kbd_ms_init(up); in su_probe()
1484 up->port.membase, up->reg_size); in su_probe()
1485 kfree(up); in su_probe()
1488 platform_set_drvdata(op, up); in su_probe()
1495 up->port.flags |= UPF_BOOT_AUTOCONF; in su_probe()
1497 sunsu_autoconfig(up); in su_probe()
1500 if (up->port.type == PORT_UNKNOWN) in su_probe()
1503 up->port.ops = &sunsu_pops; in su_probe()
1511 &sunsu_reg, up->port.line, in su_probe()
1513 err = uart_add_one_port(&sunsu_reg, &up->port); in su_probe()
1517 platform_set_drvdata(op, up); in su_probe()
1524 of_iounmap(&op->resource[0], up->port.membase, up->reg_size); in su_probe()
1525 kfree(up); in su_probe()
1531 struct uart_sunsu_port *up = platform_get_drvdata(op); in su_remove() local
1534 if (up->su_type == SU_PORT_MS || in su_remove()
1535 up->su_type == SU_PORT_KBD) in su_remove()
1540 serio_unregister_port(&up->serio); in su_remove()
1542 } else if (up->port.type != PORT_UNKNOWN) in su_remove()
1543 uart_remove_one_port(&sunsu_reg, &up->port); in su_remove()
1545 if (up->port.membase) in su_remove()
1546 of_iounmap(&op->resource[0], up->port.membase, up->reg_size); in su_remove()
1549 kfree(up); in su_remove()