Lines Matching refs:port
72 #define SCIx_IRQ_IS_MUXED(port) \ argument
73 ((port)->irqs[SCIx_ERI_IRQ] == \
74 (port)->irqs[SCIx_RXI_IRQ]) || \
75 ((port)->irqs[SCIx_ERI_IRQ] && \
76 ((port)->irqs[SCIx_RXI_IRQ] < 0))
79 struct uart_port port; member
128 return container_of(uart, struct sci_port, port); in to_sci_port()
452 if (!sci_port->port.dev) in sci_port_enable()
455 pm_runtime_get_sync(sci_port->port.dev); in sci_port_enable()
458 sci_port->port.uartclk = clk_get_rate(sci_port->iclk); in sci_port_enable()
464 if (!sci_port->port.dev) in sci_port_disable()
478 pm_runtime_put_sync(sci_port->port.dev); in sci_port_disable()
481 static inline unsigned long port_rx_irq_mask(struct uart_port *port) in port_rx_irq_mask() argument
490 return SCSCR_RIE | (to_sci_port(port)->cfg->scscr & SCSCR_REIE); in port_rx_irq_mask()
493 static void sci_start_tx(struct uart_port *port) in sci_start_tx() argument
495 struct sci_port *s = to_sci_port(port); in sci_start_tx()
499 if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) { in sci_start_tx()
500 u16 new, scr = serial_port_in(port, SCSCR); in sci_start_tx()
506 serial_port_out(port, SCSCR, new); in sci_start_tx()
509 if (s->chan_tx && !uart_circ_empty(&s->port.state->xmit) && in sci_start_tx()
516 if (!s->chan_tx || port->type == PORT_SCIFA || port->type == PORT_SCIFB) { in sci_start_tx()
518 ctrl = serial_port_in(port, SCSCR); in sci_start_tx()
519 serial_port_out(port, SCSCR, ctrl | SCSCR_TIE); in sci_start_tx()
523 static void sci_stop_tx(struct uart_port *port) in sci_stop_tx() argument
528 ctrl = serial_port_in(port, SCSCR); in sci_stop_tx()
530 if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) in sci_stop_tx()
535 serial_port_out(port, SCSCR, ctrl); in sci_stop_tx()
538 static void sci_start_rx(struct uart_port *port) in sci_start_rx() argument
542 ctrl = serial_port_in(port, SCSCR) | port_rx_irq_mask(port); in sci_start_rx()
544 if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) in sci_start_rx()
547 serial_port_out(port, SCSCR, ctrl); in sci_start_rx()
550 static void sci_stop_rx(struct uart_port *port) in sci_stop_rx() argument
554 ctrl = serial_port_in(port, SCSCR); in sci_stop_rx()
556 if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) in sci_stop_rx()
559 ctrl &= ~port_rx_irq_mask(port); in sci_stop_rx()
561 serial_port_out(port, SCSCR, ctrl); in sci_stop_rx()
564 static void sci_clear_SCxSR(struct uart_port *port, unsigned int mask) in sci_clear_SCxSR() argument
566 if (port->type == PORT_SCI) { in sci_clear_SCxSR()
568 serial_port_out(port, SCxSR, mask); in sci_clear_SCxSR()
569 } else if (to_sci_port(port)->overrun_mask == SCIFA_ORER) { in sci_clear_SCxSR()
572 serial_port_out(port, SCxSR, in sci_clear_SCxSR()
573 serial_port_in(port, SCxSR) & mask); in sci_clear_SCxSR()
576 serial_port_out(port, SCxSR, mask & ~(SCIF_FERC | SCIF_PERC)); in sci_clear_SCxSR()
583 static int sci_poll_get_char(struct uart_port *port) in sci_poll_get_char() argument
589 status = serial_port_in(port, SCxSR); in sci_poll_get_char()
590 if (status & SCxSR_ERRORS(port)) { in sci_poll_get_char()
591 sci_clear_SCxSR(port, SCxSR_ERROR_CLEAR(port)); in sci_poll_get_char()
597 if (!(status & SCxSR_RDxF(port))) in sci_poll_get_char()
600 c = serial_port_in(port, SCxRDR); in sci_poll_get_char()
603 serial_port_in(port, SCxSR); in sci_poll_get_char()
604 sci_clear_SCxSR(port, SCxSR_RDxF_CLEAR(port)); in sci_poll_get_char()
610 static void sci_poll_put_char(struct uart_port *port, unsigned char c) in sci_poll_put_char() argument
615 status = serial_port_in(port, SCxSR); in sci_poll_put_char()
616 } while (!(status & SCxSR_TDxE(port))); in sci_poll_put_char()
618 serial_port_out(port, SCxTDR, c); in sci_poll_put_char()
619 sci_clear_SCxSR(port, SCxSR_TDxE_CLEAR(port) & ~SCxSR_TEND(port)); in sci_poll_put_char()
623 static void sci_init_pins(struct uart_port *port, unsigned int cflag) in sci_init_pins() argument
625 struct sci_port *s = to_sci_port(port); in sci_init_pins()
632 s->cfg->ops->init_pins(port, cflag); in sci_init_pins()
647 status = serial_port_in(port, SCSPTR); in sci_init_pins()
650 serial_port_out(port, SCSPTR, status); /* Set RTS = 1 */ in sci_init_pins()
654 static int sci_txfill(struct uart_port *port) in sci_txfill() argument
658 reg = sci_getreg(port, SCTFDR); in sci_txfill()
660 return serial_port_in(port, SCTFDR) & ((port->fifosize << 1) - 1); in sci_txfill()
662 reg = sci_getreg(port, SCFDR); in sci_txfill()
664 return serial_port_in(port, SCFDR) >> 8; in sci_txfill()
666 return !(serial_port_in(port, SCxSR) & SCI_TDRE); in sci_txfill()
669 static int sci_txroom(struct uart_port *port) in sci_txroom() argument
671 return port->fifosize - sci_txfill(port); in sci_txroom()
674 static int sci_rxfill(struct uart_port *port) in sci_rxfill() argument
678 reg = sci_getreg(port, SCRFDR); in sci_rxfill()
680 return serial_port_in(port, SCRFDR) & ((port->fifosize << 1) - 1); in sci_rxfill()
682 reg = sci_getreg(port, SCFDR); in sci_rxfill()
684 return serial_port_in(port, SCFDR) & ((port->fifosize << 1) - 1); in sci_rxfill()
686 return (serial_port_in(port, SCxSR) & SCxSR_RDxF(port)) != 0; in sci_rxfill()
692 static inline int sci_rxd_in(struct uart_port *port) in sci_rxd_in() argument
694 struct sci_port *s = to_sci_port(port); in sci_rxd_in()
707 static void sci_transmit_chars(struct uart_port *port) in sci_transmit_chars() argument
709 struct circ_buf *xmit = &port->state->xmit; in sci_transmit_chars()
710 unsigned int stopped = uart_tx_stopped(port); in sci_transmit_chars()
715 status = serial_port_in(port, SCxSR); in sci_transmit_chars()
716 if (!(status & SCxSR_TDxE(port))) { in sci_transmit_chars()
717 ctrl = serial_port_in(port, SCSCR); in sci_transmit_chars()
722 serial_port_out(port, SCSCR, ctrl); in sci_transmit_chars()
726 count = sci_txroom(port); in sci_transmit_chars()
731 if (port->x_char) { in sci_transmit_chars()
732 c = port->x_char; in sci_transmit_chars()
733 port->x_char = 0; in sci_transmit_chars()
741 serial_port_out(port, SCxTDR, c); in sci_transmit_chars()
743 port->icount.tx++; in sci_transmit_chars()
746 sci_clear_SCxSR(port, SCxSR_TDxE_CLEAR(port)); in sci_transmit_chars()
749 uart_write_wakeup(port); in sci_transmit_chars()
751 sci_stop_tx(port); in sci_transmit_chars()
753 ctrl = serial_port_in(port, SCSCR); in sci_transmit_chars()
755 if (port->type != PORT_SCI) { in sci_transmit_chars()
756 serial_port_in(port, SCxSR); /* Dummy read */ in sci_transmit_chars()
757 sci_clear_SCxSR(port, SCxSR_TDxE_CLEAR(port)); in sci_transmit_chars()
761 serial_port_out(port, SCSCR, ctrl); in sci_transmit_chars()
768 static void sci_receive_chars(struct uart_port *port) in sci_receive_chars() argument
770 struct sci_port *sci_port = to_sci_port(port); in sci_receive_chars()
771 struct tty_port *tport = &port->state->port; in sci_receive_chars()
776 status = serial_port_in(port, SCxSR); in sci_receive_chars()
777 if (!(status & SCxSR_RDxF(port))) in sci_receive_chars()
782 count = tty_buffer_request_room(tport, sci_rxfill(port)); in sci_receive_chars()
788 if (port->type == PORT_SCI) { in sci_receive_chars()
789 char c = serial_port_in(port, SCxRDR); in sci_receive_chars()
790 if (uart_handle_sysrq_char(port, c) || in sci_receive_chars()
797 char c = serial_port_in(port, SCxRDR); in sci_receive_chars()
799 status = serial_port_in(port, SCxSR); in sci_receive_chars()
804 (status & SCxSR_FER(port))) { in sci_receive_chars()
810 dev_dbg(port->dev, "debounce<%02x>\n", c); in sci_receive_chars()
819 if (uart_handle_sysrq_char(port, c)) { in sci_receive_chars()
825 if (status & SCxSR_FER(port)) { in sci_receive_chars()
827 port->icount.frame++; in sci_receive_chars()
828 dev_notice(port->dev, "frame error\n"); in sci_receive_chars()
829 } else if (status & SCxSR_PER(port)) { in sci_receive_chars()
831 port->icount.parity++; in sci_receive_chars()
832 dev_notice(port->dev, "parity error\n"); in sci_receive_chars()
840 serial_port_in(port, SCxSR); /* dummy read */ in sci_receive_chars()
841 sci_clear_SCxSR(port, SCxSR_RDxF_CLEAR(port)); in sci_receive_chars()
844 port->icount.rx += count; in sci_receive_chars()
851 serial_port_in(port, SCxSR); /* dummy read */ in sci_receive_chars()
852 sci_clear_SCxSR(port, SCxSR_RDxF_CLEAR(port)); in sci_receive_chars()
866 static inline void sci_schedule_break_timer(struct sci_port *port) in sci_schedule_break_timer() argument
868 mod_timer(&port->break_timer, jiffies + SCI_BREAK_JIFFIES); in sci_schedule_break_timer()
874 struct sci_port *port = (struct sci_port *)data; in sci_break_timer() local
876 if (sci_rxd_in(&port->port) == 0) { in sci_break_timer()
877 port->break_flag = 1; in sci_break_timer()
878 sci_schedule_break_timer(port); in sci_break_timer()
879 } else if (port->break_flag == 1) { in sci_break_timer()
881 port->break_flag = 2; in sci_break_timer()
882 sci_schedule_break_timer(port); in sci_break_timer()
884 port->break_flag = 0; in sci_break_timer()
887 static int sci_handle_errors(struct uart_port *port) in sci_handle_errors() argument
890 unsigned short status = serial_port_in(port, SCxSR); in sci_handle_errors()
891 struct tty_port *tport = &port->state->port; in sci_handle_errors()
892 struct sci_port *s = to_sci_port(port); in sci_handle_errors()
896 port->icount.overrun++; in sci_handle_errors()
902 dev_notice(port->dev, "overrun error\n"); in sci_handle_errors()
905 if (status & SCxSR_FER(port)) { in sci_handle_errors()
906 if (sci_rxd_in(port) == 0) { in sci_handle_errors()
908 struct sci_port *sci_port = to_sci_port(port); in sci_handle_errors()
911 port->icount.brk++; in sci_handle_errors()
917 if (uart_handle_break(port)) in sci_handle_errors()
920 dev_dbg(port->dev, "BREAK detected\n"); in sci_handle_errors()
928 port->icount.frame++; in sci_handle_errors()
933 dev_notice(port->dev, "frame error\n"); in sci_handle_errors()
937 if (status & SCxSR_PER(port)) { in sci_handle_errors()
939 port->icount.parity++; in sci_handle_errors()
944 dev_notice(port->dev, "parity error\n"); in sci_handle_errors()
953 static int sci_handle_fifo_overrun(struct uart_port *port) in sci_handle_fifo_overrun() argument
955 struct tty_port *tport = &port->state->port; in sci_handle_fifo_overrun()
956 struct sci_port *s = to_sci_port(port); in sci_handle_fifo_overrun()
961 reg = sci_getreg(port, s->overrun_reg); in sci_handle_fifo_overrun()
965 status = serial_port_in(port, s->overrun_reg); in sci_handle_fifo_overrun()
968 serial_port_out(port, s->overrun_reg, status); in sci_handle_fifo_overrun()
970 port->icount.overrun++; in sci_handle_fifo_overrun()
975 dev_dbg(port->dev, "overrun error\n"); in sci_handle_fifo_overrun()
982 static int sci_handle_breaks(struct uart_port *port) in sci_handle_breaks() argument
985 unsigned short status = serial_port_in(port, SCxSR); in sci_handle_breaks()
986 struct tty_port *tport = &port->state->port; in sci_handle_breaks()
987 struct sci_port *s = to_sci_port(port); in sci_handle_breaks()
989 if (uart_handle_break(port)) in sci_handle_breaks()
992 if (!s->break_flag && status & SCxSR_BRK(port)) { in sci_handle_breaks()
998 port->icount.brk++; in sci_handle_breaks()
1004 dev_dbg(port->dev, "BREAK detected\n"); in sci_handle_breaks()
1010 copied += sci_handle_fifo_overrun(port); in sci_handle_breaks()
1019 struct uart_port *port = &s->port; in sci_dma_tx_complete() local
1020 struct circ_buf *xmit = &port->state->xmit; in sci_dma_tx_complete()
1023 dev_dbg(port->dev, "%s(%d)\n", __func__, port->line); in sci_dma_tx_complete()
1025 spin_lock_irqsave(&port->lock, flags); in sci_dma_tx_complete()
1030 port->icount.tx += s->tx_dma_len; in sci_dma_tx_complete()
1033 uart_write_wakeup(port); in sci_dma_tx_complete()
1040 if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) { in sci_dma_tx_complete()
1041 u16 ctrl = serial_port_in(port, SCSCR); in sci_dma_tx_complete()
1042 serial_port_out(port, SCSCR, ctrl & ~SCSCR_TIE); in sci_dma_tx_complete()
1046 spin_unlock_irqrestore(&port->lock, flags); in sci_dma_tx_complete()
1052 struct uart_port *port = &s->port; in sci_dma_rx_push() local
1053 struct tty_port *tport = &port->state->port; in sci_dma_rx_push()
1058 dev_warn(port->dev, "Rx overrun: dropping %zu bytes\n", in sci_dma_rx_push()
1060 port->icount.buf_overrun++; in sci_dma_rx_push()
1063 port->icount.rx += copied; in sci_dma_rx_push()
1076 dev_err(s->port.dev, "%s: Rx cookie %d not found!\n", __func__, in sci_dma_rx_find_active()
1084 struct uart_port *port = &s->port; in sci_rx_dma_release() local
1087 spin_lock_irqsave(&port->lock, flags); in sci_rx_dma_release()
1090 spin_unlock_irqrestore(&port->lock, flags); in sci_rx_dma_release()
1096 sci_start_rx(port); in sci_rx_dma_release()
1103 struct uart_port *port = &s->port; in sci_dma_rx_complete() local
1108 dev_dbg(port->dev, "%s(%d) active cookie %d\n", __func__, port->line, in sci_dma_rx_complete()
1111 spin_lock_irqsave(&port->lock, flags); in sci_dma_rx_complete()
1120 tty_flip_buffer_push(&port->state->port); in sci_dma_rx_complete()
1138 dev_dbg(port->dev, "%s: cookie %d #%d, new active cookie %d\n", in sci_dma_rx_complete()
1140 spin_unlock_irqrestore(&port->lock, flags); in sci_dma_rx_complete()
1144 spin_unlock_irqrestore(&port->lock, flags); in sci_dma_rx_complete()
1145 dev_warn(port->dev, "Failed submitting Rx DMA descriptor\n"); in sci_dma_rx_complete()
1152 struct uart_port *port = &s->port; in sci_tx_dma_release() local
1155 spin_lock_irqsave(&port->lock, flags); in sci_tx_dma_release()
1158 spin_unlock_irqrestore(&port->lock, flags); in sci_tx_dma_release()
1164 sci_start_tx(port); in sci_tx_dma_release()
1188 dev_dbg(s->port.dev, "%s(): cookie %d to #%d\n", __func__, in sci_submit_rx()
1203 dev_warn(s->port.dev, "Failed to re-start Rx DMA, using PIO\n"); in sci_submit_rx()
1212 struct uart_port *port = &s->port; in work_fn_tx() local
1213 struct circ_buf *xmit = &port->state->xmit; in work_fn_tx()
1223 spin_lock_irq(&port->lock); in work_fn_tx()
1228 spin_unlock_irq(&port->lock); in work_fn_tx()
1234 dev_warn(port->dev, "Failed preparing Tx DMA descriptor\n"); in work_fn_tx()
1243 spin_lock_irq(&port->lock); in work_fn_tx()
1246 spin_unlock_irq(&port->lock); in work_fn_tx()
1249 dev_warn(port->dev, "Failed submitting Tx DMA descriptor\n"); in work_fn_tx()
1255 dev_dbg(port->dev, "%s: %p: %d...%d, cookie %d\n", in work_fn_tx()
1265 struct uart_port *port = &s->port; in rx_timer_fn() local
1273 spin_lock_irqsave(&port->lock, flags); in rx_timer_fn()
1275 dev_dbg(port->dev, "DMA Rx timed out\n"); in rx_timer_fn()
1279 spin_unlock_irqrestore(&port->lock, flags); in rx_timer_fn()
1285 dev_dbg(port->dev, "Cookie %d #%d has already completed\n", in rx_timer_fn()
1287 spin_unlock_irqrestore(&port->lock, flags); in rx_timer_fn()
1303 spin_unlock_irqrestore(&port->lock, flags); in rx_timer_fn()
1304 dev_dbg(port->dev, "Transaction complete after DMA engine was stopped"); in rx_timer_fn()
1311 dev_dbg(port->dev, "Read %u bytes with cookie %d\n", read, in rx_timer_fn()
1317 tty_flip_buffer_push(&port->state->port); in rx_timer_fn()
1320 if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) in rx_timer_fn()
1324 scr = serial_port_in(port, SCSCR); in rx_timer_fn()
1325 if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) { in rx_timer_fn()
1329 serial_port_out(port, SCSCR, scr | SCSCR_RIE); in rx_timer_fn()
1331 spin_unlock_irqrestore(&port->lock, flags); in rx_timer_fn()
1334 static struct dma_chan *sci_request_dma_chan(struct uart_port *port, in sci_request_dma_chan() argument
1347 (void *)(unsigned long)id, port->dev, in sci_request_dma_chan()
1350 dev_warn(port->dev, in sci_request_dma_chan()
1358 cfg.dst_addr = port->mapbase + in sci_request_dma_chan()
1359 (sci_getreg(port, SCxTDR)->offset << port->regshift); in sci_request_dma_chan()
1362 cfg.src_addr = port->mapbase + in sci_request_dma_chan()
1363 (sci_getreg(port, SCxRDR)->offset << port->regshift); in sci_request_dma_chan()
1369 dev_warn(port->dev, "dmaengine_slave_config failed %d\n", ret); in sci_request_dma_chan()
1377 static void sci_request_dma(struct uart_port *port) in sci_request_dma() argument
1379 struct sci_port *s = to_sci_port(port); in sci_request_dma()
1382 dev_dbg(port->dev, "%s: port %d\n", __func__, port->line); in sci_request_dma()
1384 if (!port->dev->of_node && in sci_request_dma()
1389 chan = sci_request_dma_chan(port, DMA_MEM_TO_DEV, s->cfg->dma_slave_tx); in sci_request_dma()
1390 dev_dbg(port->dev, "%s: TX: got channel %p\n", __func__, chan); in sci_request_dma()
1395 port->state->xmit.buf, in sci_request_dma()
1399 dev_warn(port->dev, "Failed mapping Tx DMA descriptor\n"); in sci_request_dma()
1403 dev_dbg(port->dev, "%s: mapped %lu@%p to %pad\n", in sci_request_dma()
1405 port->state->xmit.buf, &s->tx_dma_addr); in sci_request_dma()
1411 chan = sci_request_dma_chan(port, DMA_DEV_TO_MEM, s->cfg->dma_slave_rx); in sci_request_dma()
1412 dev_dbg(port->dev, "%s: RX: got channel %p\n", __func__, chan); in sci_request_dma()
1420 s->buf_len_rx = 2 * max_t(size_t, 16, port->fifosize); in sci_request_dma()
1424 dev_warn(port->dev, in sci_request_dma()
1445 if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) in sci_request_dma()
1450 static void sci_free_dma(struct uart_port *port) in sci_free_dma() argument
1452 struct sci_port *s = to_sci_port(port); in sci_free_dma()
1460 static inline void sci_request_dma(struct uart_port *port) in sci_request_dma() argument
1464 static inline void sci_free_dma(struct uart_port *port) in sci_free_dma() argument
1472 struct uart_port *port = ptr; in sci_rx_interrupt() local
1473 struct sci_port *s = to_sci_port(port); in sci_rx_interrupt()
1476 u16 scr = serial_port_in(port, SCSCR); in sci_rx_interrupt()
1477 u16 ssr = serial_port_in(port, SCxSR); in sci_rx_interrupt()
1480 if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) { in sci_rx_interrupt()
1487 serial_port_out(port, SCSCR, scr); in sci_rx_interrupt()
1489 serial_port_out(port, SCxSR, in sci_rx_interrupt()
1490 ssr & ~(SCIF_DR | SCxSR_RDxF(port))); in sci_rx_interrupt()
1491 dev_dbg(port->dev, "Rx IRQ %lu: setup t-out in %u jiffies\n", in sci_rx_interrupt()
1510 struct uart_port *port = ptr; in sci_tx_interrupt() local
1513 spin_lock_irqsave(&port->lock, flags); in sci_tx_interrupt()
1514 sci_transmit_chars(port); in sci_tx_interrupt()
1515 spin_unlock_irqrestore(&port->lock, flags); in sci_tx_interrupt()
1522 struct uart_port *port = ptr; in sci_er_interrupt() local
1523 struct sci_port *s = to_sci_port(port); in sci_er_interrupt()
1526 if (port->type == PORT_SCI) { in sci_er_interrupt()
1527 if (sci_handle_errors(port)) { in sci_er_interrupt()
1529 serial_port_in(port, SCxSR); in sci_er_interrupt()
1530 sci_clear_SCxSR(port, SCxSR_RDxF_CLEAR(port)); in sci_er_interrupt()
1533 sci_handle_fifo_overrun(port); in sci_er_interrupt()
1538 sci_clear_SCxSR(port, SCxSR_ERROR_CLEAR(port)); in sci_er_interrupt()
1549 struct uart_port *port = ptr; in sci_br_interrupt() local
1552 sci_handle_breaks(port); in sci_br_interrupt()
1553 sci_clear_SCxSR(port, SCxSR_BREAK_CLEAR(port)); in sci_br_interrupt()
1561 struct uart_port *port = ptr; in sci_mpxed_interrupt() local
1562 struct sci_port *s = to_sci_port(port); in sci_mpxed_interrupt()
1565 ssr_status = serial_port_in(port, SCxSR); in sci_mpxed_interrupt()
1566 scr_status = serial_port_in(port, SCSCR); in sci_mpxed_interrupt()
1570 if (sci_getreg(port, s->overrun_reg)->size) in sci_mpxed_interrupt()
1571 orer_status = serial_port_in(port, s->overrun_reg); in sci_mpxed_interrupt()
1574 err_enabled = scr_status & port_rx_irq_mask(port); in sci_mpxed_interrupt()
1577 if ((ssr_status & SCxSR_TDxE(port)) && (scr_status & SCSCR_TIE) && in sci_mpxed_interrupt()
1585 if (((ssr_status & SCxSR_RDxF(port)) || s->chan_rx) && in sci_mpxed_interrupt()
1590 if ((ssr_status & SCxSR_ERRORS(port)) && err_enabled) in sci_mpxed_interrupt()
1594 if ((ssr_status & SCxSR_BRK(port)) && err_enabled) in sci_mpxed_interrupt()
1599 sci_handle_fifo_overrun(port); in sci_mpxed_interrupt()
1642 static int sci_request_irq(struct sci_port *port) in sci_request_irq() argument
1644 struct uart_port *up = &port->port; in sci_request_irq()
1651 if (SCIx_IRQ_IS_MUXED(port)) { in sci_request_irq()
1655 irq = port->irqs[i]; in sci_request_irq()
1666 port->irqstr[j] = kasprintf(GFP_KERNEL, "%s:%s", in sci_request_irq()
1668 if (!port->irqstr[j]) in sci_request_irq()
1672 port->irqstr[j], port); in sci_request_irq()
1683 free_irq(port->irqs[i], port); in sci_request_irq()
1687 kfree(port->irqstr[j]); in sci_request_irq()
1692 static void sci_free_irq(struct sci_port *port) in sci_free_irq() argument
1701 int irq = port->irqs[i]; in sci_free_irq()
1710 free_irq(port->irqs[i], port); in sci_free_irq()
1711 kfree(port->irqstr[i]); in sci_free_irq()
1713 if (SCIx_IRQ_IS_MUXED(port)) { in sci_free_irq()
1720 static unsigned int sci_tx_empty(struct uart_port *port) in sci_tx_empty() argument
1722 unsigned short status = serial_port_in(port, SCxSR); in sci_tx_empty()
1723 unsigned short in_tx_fifo = sci_txfill(port); in sci_tx_empty()
1725 return (status & SCxSR_TEND(port)) && !in_tx_fifo ? TIOCSER_TEMT : 0; in sci_tx_empty()
1740 static void sci_set_mctrl(struct uart_port *port, unsigned int mctrl) in sci_set_mctrl() argument
1748 reg = sci_getreg(port, SCFCR); in sci_set_mctrl()
1750 serial_port_out(port, SCFCR, in sci_set_mctrl()
1751 serial_port_in(port, SCFCR) | in sci_set_mctrl()
1756 static unsigned int sci_get_mctrl(struct uart_port *port) in sci_get_mctrl() argument
1765 static void sci_break_ctl(struct uart_port *port, int break_state) in sci_break_ctl() argument
1767 struct sci_port *s = to_sci_port(port); in sci_break_ctl()
1780 scsptr = serial_port_in(port, SCSPTR); in sci_break_ctl()
1781 scscr = serial_port_in(port, SCSCR); in sci_break_ctl()
1791 serial_port_out(port, SCSPTR, scsptr); in sci_break_ctl()
1792 serial_port_out(port, SCSCR, scscr); in sci_break_ctl()
1795 static int sci_startup(struct uart_port *port) in sci_startup() argument
1797 struct sci_port *s = to_sci_port(port); in sci_startup()
1801 dev_dbg(port->dev, "%s(%d)\n", __func__, port->line); in sci_startup()
1807 sci_request_dma(port); in sci_startup()
1809 spin_lock_irqsave(&port->lock, flags); in sci_startup()
1810 sci_start_tx(port); in sci_startup()
1811 sci_start_rx(port); in sci_startup()
1812 spin_unlock_irqrestore(&port->lock, flags); in sci_startup()
1817 static void sci_shutdown(struct uart_port *port) in sci_shutdown() argument
1819 struct sci_port *s = to_sci_port(port); in sci_shutdown()
1822 dev_dbg(port->dev, "%s(%d)\n", __func__, port->line); in sci_shutdown()
1824 spin_lock_irqsave(&port->lock, flags); in sci_shutdown()
1825 sci_stop_rx(port); in sci_shutdown()
1826 sci_stop_tx(port); in sci_shutdown()
1827 spin_unlock_irqrestore(&port->lock, flags); in sci_shutdown()
1831 dev_dbg(port->dev, "%s(%d) deleting rx_timer\n", __func__, in sci_shutdown()
1832 port->line); in sci_shutdown()
1837 sci_free_dma(port); in sci_shutdown()
1927 static void sci_reset(struct uart_port *port) in sci_reset() argument
1933 status = serial_port_in(port, SCxSR); in sci_reset()
1934 } while (!(status & SCxSR_TEND(port))); in sci_reset()
1936 serial_port_out(port, SCSCR, 0x00); /* TE=0, RE=0, CKE1=0 */ in sci_reset()
1938 reg = sci_getreg(port, SCFCR); in sci_reset()
1940 serial_port_out(port, SCFCR, SCFCR_RFRST | SCFCR_TFRST); in sci_reset()
1943 static void sci_set_termios(struct uart_port *port, struct ktermios *termios, in sci_set_termios() argument
1946 struct sci_port *s = to_sci_port(port); in sci_set_termios()
1969 max_baud = port->uartclk ? port->uartclk / 16 : 115200; in sci_set_termios()
1971 baud = uart_get_baud_rate(port, termios, old, 0, max_baud); in sci_set_termios()
1972 if (likely(baud && port->uartclk)) { in sci_set_termios()
1975 sci_baud_calc_hscif(baud, port->uartclk, &t, &srr, in sci_set_termios()
1978 t = sci_scbrr_calc(s, baud, port->uartclk); in sci_set_termios()
1986 sci_reset(port); in sci_set_termios()
1988 smr_val |= serial_port_in(port, SCSMR) & SCSMR_CKS; in sci_set_termios()
1990 uart_update_timeout(port, termios->c_cflag, baud); in sci_set_termios()
1992 dev_dbg(port->dev, "%s: SMR %x, cks %x, t %x, SCSCR %x\n", in sci_set_termios()
1996 serial_port_out(port, SCSMR, (smr_val & ~SCSMR_CKS) | cks); in sci_set_termios()
1997 serial_port_out(port, SCBRR, t); in sci_set_termios()
1998 reg = sci_getreg(port, HSSRR); in sci_set_termios()
2000 serial_port_out(port, HSSRR, srr | HSCIF_SRE); in sci_set_termios()
2003 serial_port_out(port, SCSMR, smr_val); in sci_set_termios()
2005 sci_init_pins(port, termios->c_cflag); in sci_set_termios()
2007 reg = sci_getreg(port, SCFCR); in sci_set_termios()
2009 unsigned short ctrl = serial_port_in(port, SCFCR); in sci_set_termios()
2025 serial_port_out(port, SCFCR, ctrl); in sci_set_termios()
2028 serial_port_out(port, SCSCR, s->cfg->scscr); in sci_set_termios()
2066 dev_dbg(port->dev, "DMA Rx t-out %ums, tty t-out %u jiffies\n", in sci_set_termios()
2067 s->rx_timeout * 1000 / HZ, port->timeout); in sci_set_termios()
2074 sci_start_rx(port); in sci_set_termios()
2079 static void sci_pm(struct uart_port *port, unsigned int state, in sci_pm() argument
2082 struct sci_port *sci_port = to_sci_port(port); in sci_pm()
2094 static const char *sci_type(struct uart_port *port) in sci_type() argument
2096 switch (port->type) { in sci_type()
2114 static int sci_remap_port(struct uart_port *port) in sci_remap_port() argument
2116 struct sci_port *sport = to_sci_port(port); in sci_remap_port()
2121 if (port->membase) in sci_remap_port()
2124 if (port->flags & UPF_IOREMAP) { in sci_remap_port()
2125 port->membase = ioremap_nocache(port->mapbase, sport->reg_size); in sci_remap_port()
2126 if (unlikely(!port->membase)) { in sci_remap_port()
2127 dev_err(port->dev, "can't remap port#%d\n", port->line); in sci_remap_port()
2136 port->membase = (void __iomem *)(uintptr_t)port->mapbase; in sci_remap_port()
2142 static void sci_release_port(struct uart_port *port) in sci_release_port() argument
2144 struct sci_port *sport = to_sci_port(port); in sci_release_port()
2146 if (port->flags & UPF_IOREMAP) { in sci_release_port()
2147 iounmap(port->membase); in sci_release_port()
2148 port->membase = NULL; in sci_release_port()
2151 release_mem_region(port->mapbase, sport->reg_size); in sci_release_port()
2154 static int sci_request_port(struct uart_port *port) in sci_request_port() argument
2157 struct sci_port *sport = to_sci_port(port); in sci_request_port()
2160 res = request_mem_region(port->mapbase, sport->reg_size, in sci_request_port()
2161 dev_name(port->dev)); in sci_request_port()
2163 dev_err(port->dev, "request_mem_region failed."); in sci_request_port()
2167 ret = sci_remap_port(port); in sci_request_port()
2176 static void sci_config_port(struct uart_port *port, int flags) in sci_config_port() argument
2179 struct sci_port *sport = to_sci_port(port); in sci_config_port()
2181 port->type = sport->cfg->type; in sci_config_port()
2182 sci_request_port(port); in sci_config_port()
2186 static int sci_verify_port(struct uart_port *port, struct serial_struct *ser) in sci_verify_port() argument
2222 struct uart_port *port = &sci_port->port; in sci_init_single() local
2229 port->ops = &sci_uart_ops; in sci_init_single()
2230 port->iotype = UPIO_MEM; in sci_init_single()
2231 port->line = index; in sci_init_single()
2237 port->mapbase = res->start; in sci_init_single()
2265 port->fifosize = 256; in sci_init_single()
2271 port->fifosize = 128; in sci_init_single()
2277 port->fifosize = 64; in sci_init_single()
2283 port->fifosize = 16; in sci_init_single()
2295 port->fifosize = 1; in sci_init_single()
2327 port->dev = &dev->dev; in sci_init_single()
2356 port->type = p->type; in sci_init_single()
2357 port->flags = UPF_FIXED_PORT | p->flags; in sci_init_single()
2358 port->regshift = p->regshift; in sci_init_single()
2367 port->irq = sci_port->irqs[SCIx_RXI_IRQ]; in sci_init_single()
2368 port->irqflags = 0; in sci_init_single()
2370 port->serial_in = sci_serial_in; in sci_init_single()
2371 port->serial_out = sci_serial_out; in sci_init_single()
2374 dev_dbg(port->dev, "DMA tx %d, rx %d\n", in sci_init_single()
2380 static void sci_cleanup_single(struct sci_port *port) in sci_cleanup_single() argument
2382 clk_put(port->iclk); in sci_cleanup_single()
2383 clk_put(port->fclk); in sci_cleanup_single()
2385 pm_runtime_disable(port->port.dev); in sci_cleanup_single()
2389 static void serial_console_putchar(struct uart_port *port, int ch) in serial_console_putchar() argument
2391 sci_poll_put_char(port, ch); in serial_console_putchar()
2402 struct uart_port *port = &sci_port->port; in serial_console_write() local
2408 if (port->sysrq) in serial_console_write()
2411 locked = spin_trylock(&port->lock); in serial_console_write()
2413 spin_lock(&port->lock); in serial_console_write()
2416 ctrl = serial_port_in(port, SCSCR); in serial_console_write()
2417 serial_port_out(port, SCSCR, sci_port->cfg->scscr); in serial_console_write()
2419 uart_console_write(port, s, count, serial_console_putchar); in serial_console_write()
2422 bits = SCxSR_TDxE(port) | SCxSR_TEND(port); in serial_console_write()
2423 while ((serial_port_in(port, SCxSR) & bits) != bits) in serial_console_write()
2427 serial_port_out(port, SCSCR, ctrl); in serial_console_write()
2430 spin_unlock(&port->lock); in serial_console_write()
2437 struct uart_port *port; in serial_console_setup() local
2451 port = &sci_port->port; in serial_console_setup()
2456 if (!port->ops) in serial_console_setup()
2459 ret = sci_remap_port(port); in serial_console_setup()
2466 return uart_set_options(port, co, baud, parity, bits, flow); in serial_console_setup()
2534 struct sci_port *port = platform_get_drvdata(dev); in sci_remove() local
2536 uart_remove_one_port(&sci_uart_driver, &port->port); in sci_remove()
2538 sci_cleanup_single(port); in sci_remove()
2643 ret = uart_add_one_port(&sci_uart_driver, &sciport->port); in sci_probe_single()
2700 uart_suspend_port(&sci_uart_driver, &sport->port); in sci_suspend()
2710 uart_resume_port(&sci_uart_driver, &sport->port); in sci_resume()