Lines Matching refs:uport
118 struct uart_port uport; member
148 static void __qcom_geni_serial_cancel_tx_cmd(struct uart_port *uport);
149 static void qcom_geni_serial_cancel_tx_cmd(struct uart_port *uport);
150 static int qcom_geni_serial_port_setup(struct uart_port *uport);
152 static inline struct qcom_geni_serial_port *to_dev_port(struct uart_port *uport) in to_dev_port() argument
154 return container_of(uport, struct qcom_geni_serial_port, uport); in to_dev_port()
159 .uport = {
167 .uport = {
175 .uport = {
185 .uport = {
193 static int qcom_geni_serial_request_port(struct uart_port *uport) in qcom_geni_serial_request_port() argument
195 struct platform_device *pdev = to_platform_device(uport->dev); in qcom_geni_serial_request_port()
196 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_request_port()
198 uport->membase = devm_platform_ioremap_resource(pdev, 0); in qcom_geni_serial_request_port()
199 if (IS_ERR(uport->membase)) in qcom_geni_serial_request_port()
200 return PTR_ERR(uport->membase); in qcom_geni_serial_request_port()
201 port->se.base = uport->membase; in qcom_geni_serial_request_port()
205 static void qcom_geni_serial_config_port(struct uart_port *uport, int cfg_flags) in qcom_geni_serial_config_port() argument
208 uport->type = PORT_MSM; in qcom_geni_serial_config_port()
209 qcom_geni_serial_request_port(uport); in qcom_geni_serial_config_port()
213 static unsigned int qcom_geni_serial_get_mctrl(struct uart_port *uport) in qcom_geni_serial_get_mctrl() argument
218 if (uart_console(uport)) { in qcom_geni_serial_get_mctrl()
221 geni_ios = readl(uport->membase + SE_GENI_IOS); in qcom_geni_serial_get_mctrl()
229 static void qcom_geni_serial_set_mctrl(struct uart_port *uport, in qcom_geni_serial_set_mctrl() argument
233 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_set_mctrl()
235 if (uart_console(uport)) in qcom_geni_serial_set_mctrl()
241 if (!(mctrl & TIOCM_RTS) && !uport->suspended) in qcom_geni_serial_set_mctrl()
243 writel(uart_manual_rfr, uport->membase + SE_UART_MANUAL_RFR); in qcom_geni_serial_set_mctrl()
246 static const char *qcom_geni_serial_get_type(struct uart_port *uport) in qcom_geni_serial_get_type() argument
263 static bool qcom_geni_serial_main_active(struct uart_port *uport) in qcom_geni_serial_main_active() argument
265 return readl(uport->membase + SE_GENI_STATUS) & M_GENI_CMD_ACTIVE; in qcom_geni_serial_main_active()
268 static bool qcom_geni_serial_secondary_active(struct uart_port *uport) in qcom_geni_serial_secondary_active() argument
270 return readl(uport->membase + SE_GENI_STATUS) & S_GENI_CMD_ACTIVE; in qcom_geni_serial_secondary_active()
273 static bool qcom_geni_serial_poll_bitfield(struct uart_port *uport, in qcom_geni_serial_poll_bitfield() argument
279 struct qcom_geni_private_data *private_data = uport->private_data; in qcom_geni_serial_poll_bitfield()
282 port = to_dev_port(uport); in qcom_geni_serial_poll_bitfield()
293 reg = readl(uport->membase + offset); in qcom_geni_serial_poll_bitfield()
302 static bool qcom_geni_serial_poll_bit(struct uart_port *uport, in qcom_geni_serial_poll_bit() argument
305 return qcom_geni_serial_poll_bitfield(uport, offset, field, set ? field : 0); in qcom_geni_serial_poll_bit()
308 static void qcom_geni_serial_setup_tx(struct uart_port *uport, u32 xmit_size) in qcom_geni_serial_setup_tx() argument
312 writel(xmit_size, uport->membase + SE_UART_TX_TRANS_LEN); in qcom_geni_serial_setup_tx()
314 writel(m_cmd, uport->membase + SE_GENI_M_CMD0); in qcom_geni_serial_setup_tx()
317 static void qcom_geni_serial_poll_tx_done(struct uart_port *uport) in qcom_geni_serial_poll_tx_done() argument
321 done = qcom_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, in qcom_geni_serial_poll_tx_done()
324 writel(M_GENI_CMD_ABORT, uport->membase + in qcom_geni_serial_poll_tx_done()
326 qcom_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, in qcom_geni_serial_poll_tx_done()
328 writel(M_CMD_ABORT_EN, uport->membase + SE_GENI_M_IRQ_CLEAR); in qcom_geni_serial_poll_tx_done()
332 static void qcom_geni_serial_abort_rx(struct uart_port *uport) in qcom_geni_serial_abort_rx() argument
336 writel(S_GENI_CMD_ABORT, uport->membase + SE_GENI_S_CMD_CTRL_REG); in qcom_geni_serial_abort_rx()
337 qcom_geni_serial_poll_bit(uport, SE_GENI_S_CMD_CTRL_REG, in qcom_geni_serial_abort_rx()
339 writel(irq_clear, uport->membase + SE_GENI_S_IRQ_CLEAR); in qcom_geni_serial_abort_rx()
340 writel(FORCE_DEFAULT, uport->membase + GENI_FORCE_DEFAULT_REG); in qcom_geni_serial_abort_rx()
344 static int qcom_geni_serial_get_char(struct uart_port *uport) in qcom_geni_serial_get_char() argument
346 struct qcom_geni_private_data *private_data = uport->private_data; in qcom_geni_serial_get_char()
352 status = readl(uport->membase + SE_GENI_M_IRQ_STATUS); in qcom_geni_serial_get_char()
353 writel(status, uport->membase + SE_GENI_M_IRQ_CLEAR); in qcom_geni_serial_get_char()
355 status = readl(uport->membase + SE_GENI_S_IRQ_STATUS); in qcom_geni_serial_get_char()
356 writel(status, uport->membase + SE_GENI_S_IRQ_CLEAR); in qcom_geni_serial_get_char()
358 status = readl(uport->membase + SE_GENI_RX_FIFO_STATUS); in qcom_geni_serial_get_char()
376 readl(uport->membase + SE_GENI_RX_FIFOn); in qcom_geni_serial_get_char()
386 static void qcom_geni_serial_poll_put_char(struct uart_port *uport, in qcom_geni_serial_poll_put_char() argument
389 if (qcom_geni_serial_main_active(uport)) { in qcom_geni_serial_poll_put_char()
390 qcom_geni_serial_poll_tx_done(uport); in qcom_geni_serial_poll_put_char()
391 __qcom_geni_serial_cancel_tx_cmd(uport); in qcom_geni_serial_poll_put_char()
394 writel(M_CMD_DONE_EN, uport->membase + SE_GENI_M_IRQ_CLEAR); in qcom_geni_serial_poll_put_char()
395 qcom_geni_serial_setup_tx(uport, 1); in qcom_geni_serial_poll_put_char()
396 writel(c, uport->membase + SE_GENI_TX_FIFOn); in qcom_geni_serial_poll_put_char()
397 qcom_geni_serial_poll_tx_done(uport); in qcom_geni_serial_poll_put_char()
400 static int qcom_geni_serial_poll_init(struct uart_port *uport) in qcom_geni_serial_poll_init() argument
402 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_poll_init()
406 ret = qcom_geni_serial_port_setup(uport); in qcom_geni_serial_poll_init()
411 if (!qcom_geni_serial_secondary_active(uport)) in qcom_geni_serial_poll_init()
419 static void qcom_geni_serial_drain_fifo(struct uart_port *uport) in qcom_geni_serial_drain_fifo() argument
421 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_drain_fifo()
423 qcom_geni_serial_poll_bitfield(uport, SE_GENI_M_GP_LENGTH, GP_LENGTH, in qcom_geni_serial_drain_fifo()
427 static void qcom_geni_serial_wr_char(struct uart_port *uport, unsigned char ch) in qcom_geni_serial_wr_char() argument
429 struct qcom_geni_private_data *private_data = uport->private_data; in qcom_geni_serial_wr_char()
437 uport->membase + SE_GENI_TX_FIFOn); in qcom_geni_serial_wr_char()
443 __qcom_geni_serial_console_write(struct uart_port *uport, const char *s, in __qcom_geni_serial_console_write() argument
446 struct qcom_geni_private_data *private_data = uport->private_data; in __qcom_geni_serial_console_write()
460 writel(DEF_TX_WM, uport->membase + SE_GENI_TX_WATERMARK_REG); in __qcom_geni_serial_console_write()
461 writel(M_CMD_DONE_EN, uport->membase + SE_GENI_M_IRQ_CLEAR); in __qcom_geni_serial_console_write()
462 qcom_geni_serial_setup_tx(uport, bytes_to_send); in __qcom_geni_serial_console_write()
473 if (!qcom_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, in __qcom_geni_serial_console_write()
477 uart_console_write(uport, s + i, chars_to_write, in __qcom_geni_serial_console_write()
479 writel(M_TX_FIFO_WATERMARK_EN, uport->membase + in __qcom_geni_serial_console_write()
488 uport->membase + SE_GENI_TX_FIFOn); in __qcom_geni_serial_console_write()
492 qcom_geni_serial_poll_tx_done(uport); in __qcom_geni_serial_console_write()
498 struct uart_port *uport; in qcom_geni_serial_console_write() local
510 uport = &port->uport; in qcom_geni_serial_console_write()
512 locked = uart_port_trylock_irqsave(uport, &flags); in qcom_geni_serial_console_write()
514 uart_port_lock_irqsave(uport, &flags); in qcom_geni_serial_console_write()
516 m_irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_console_write()
517 s_irq_en = readl(uport->membase + SE_GENI_S_IRQ_EN); in qcom_geni_serial_console_write()
518 writel(0, uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_console_write()
519 writel(0, uport->membase + SE_GENI_S_IRQ_EN); in qcom_geni_serial_console_write()
521 if (qcom_geni_serial_main_active(uport)) { in qcom_geni_serial_console_write()
524 qcom_geni_serial_poll_tx_done(uport); in qcom_geni_serial_console_write()
526 qcom_geni_serial_drain_fifo(uport); in qcom_geni_serial_console_write()
528 qcom_geni_serial_cancel_tx_cmd(uport); in qcom_geni_serial_console_write()
531 __qcom_geni_serial_console_write(uport, s, count); in qcom_geni_serial_console_write()
533 writel(m_irq_en, uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_console_write()
534 writel(s_irq_en, uport->membase + SE_GENI_S_IRQ_EN); in qcom_geni_serial_console_write()
537 uart_port_unlock_irqrestore(uport, flags); in qcom_geni_serial_console_write()
540 static void handle_rx_console(struct uart_port *uport, u32 bytes, bool drop) in handle_rx_console() argument
545 struct qcom_geni_serial_port *port = to_dev_port(uport); in handle_rx_console()
547 tport = &uport->state->port; in handle_rx_console()
552 ioread32_rep(uport->membase + SE_GENI_RX_FIFOn, buf, 1); in handle_rx_console()
560 uport->icount.rx++; in handle_rx_console()
563 if (uart_handle_break(uport)) in handle_rx_console()
567 sysrq = uart_prepare_sysrq_char(uport, buf[c]); in handle_rx_console()
577 static void handle_rx_console(struct uart_port *uport, u32 bytes, bool drop) in handle_rx_console() argument
583 static void handle_rx_uart(struct uart_port *uport, u32 bytes) in handle_rx_uart() argument
585 struct qcom_geni_serial_port *port = to_dev_port(uport); in handle_rx_uart()
586 struct tty_port *tport = &uport->state->port; in handle_rx_uart()
591 dev_err_ratelimited(uport->dev, "failed to push data (%d < %u)\n", in handle_rx_uart()
594 uport->icount.rx += ret; in handle_rx_uart()
598 static unsigned int qcom_geni_serial_tx_empty(struct uart_port *uport) in qcom_geni_serial_tx_empty() argument
600 return !readl(uport->membase + SE_GENI_TX_FIFO_STATUS); in qcom_geni_serial_tx_empty()
603 static void qcom_geni_serial_stop_tx_dma(struct uart_port *uport) in qcom_geni_serial_stop_tx_dma() argument
605 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_stop_tx_dma()
608 if (!qcom_geni_serial_main_active(uport)) in qcom_geni_serial_stop_tx_dma()
620 done = qcom_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, in qcom_geni_serial_stop_tx_dma()
624 done = qcom_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, in qcom_geni_serial_stop_tx_dma()
627 dev_err_ratelimited(uport->dev, "M_CMD_ABORT_EN not set"); in qcom_geni_serial_stop_tx_dma()
628 writel(M_CMD_ABORT_EN, uport->membase + SE_GENI_M_IRQ_CLEAR); in qcom_geni_serial_stop_tx_dma()
631 writel(M_CMD_CANCEL_EN, uport->membase + SE_GENI_M_IRQ_CLEAR); in qcom_geni_serial_stop_tx_dma()
634 static void qcom_geni_serial_start_tx_dma(struct uart_port *uport) in qcom_geni_serial_start_tx_dma() argument
636 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_start_tx_dma()
637 struct tty_port *tport = &uport->state->port; in qcom_geni_serial_start_tx_dma()
651 qcom_geni_serial_setup_tx(uport, xmit_size); in qcom_geni_serial_start_tx_dma()
656 dev_err(uport->dev, "unable to start TX SE DMA: %d\n", ret); in qcom_geni_serial_start_tx_dma()
657 qcom_geni_serial_stop_tx_dma(uport); in qcom_geni_serial_start_tx_dma()
664 static void qcom_geni_serial_start_tx_fifo(struct uart_port *uport) in qcom_geni_serial_start_tx_fifo() argument
674 if (!qcom_geni_serial_main_active(uport) && in qcom_geni_serial_start_tx_fifo()
675 !qcom_geni_serial_tx_empty(uport)) { in qcom_geni_serial_start_tx_fifo()
676 if (uart_fifo_out(uport, &c, 1) == 1) { in qcom_geni_serial_start_tx_fifo()
677 writel(M_CMD_DONE_EN, uport->membase + SE_GENI_M_IRQ_CLEAR); in qcom_geni_serial_start_tx_fifo()
678 qcom_geni_serial_setup_tx(uport, 1); in qcom_geni_serial_start_tx_fifo()
679 writel(c, uport->membase + SE_GENI_TX_FIFOn); in qcom_geni_serial_start_tx_fifo()
683 irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_start_tx_fifo()
685 writel(DEF_TX_WM, uport->membase + SE_GENI_TX_WATERMARK_REG); in qcom_geni_serial_start_tx_fifo()
686 writel(irq_en, uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_start_tx_fifo()
689 static void qcom_geni_serial_stop_tx_fifo(struct uart_port *uport) in qcom_geni_serial_stop_tx_fifo() argument
693 irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_stop_tx_fifo()
695 writel(0, uport->membase + SE_GENI_TX_WATERMARK_REG); in qcom_geni_serial_stop_tx_fifo()
696 writel(irq_en, uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_stop_tx_fifo()
699 static void __qcom_geni_serial_cancel_tx_cmd(struct uart_port *uport) in __qcom_geni_serial_cancel_tx_cmd() argument
701 struct qcom_geni_serial_port *port = to_dev_port(uport); in __qcom_geni_serial_cancel_tx_cmd()
704 if (!qcom_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, in __qcom_geni_serial_cancel_tx_cmd()
707 qcom_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, in __qcom_geni_serial_cancel_tx_cmd()
709 writel(M_CMD_ABORT_EN, uport->membase + SE_GENI_M_IRQ_CLEAR); in __qcom_geni_serial_cancel_tx_cmd()
711 writel(M_CMD_CANCEL_EN, uport->membase + SE_GENI_M_IRQ_CLEAR); in __qcom_geni_serial_cancel_tx_cmd()
714 static void qcom_geni_serial_cancel_tx_cmd(struct uart_port *uport) in qcom_geni_serial_cancel_tx_cmd() argument
716 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_cancel_tx_cmd()
718 if (!qcom_geni_serial_main_active(uport)) in qcom_geni_serial_cancel_tx_cmd()
721 __qcom_geni_serial_cancel_tx_cmd(uport); in qcom_geni_serial_cancel_tx_cmd()
727 static void qcom_geni_serial_handle_rx_fifo(struct uart_port *uport, bool drop) in qcom_geni_serial_handle_rx_fifo() argument
735 status = readl(uport->membase + SE_GENI_RX_FIFO_STATUS); in qcom_geni_serial_handle_rx_fifo()
748 handle_rx_console(uport, total_bytes, drop); in qcom_geni_serial_handle_rx_fifo()
751 static void qcom_geni_serial_stop_rx_fifo(struct uart_port *uport) in qcom_geni_serial_stop_rx_fifo() argument
754 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_stop_rx_fifo()
757 irq_en = readl(uport->membase + SE_GENI_S_IRQ_EN); in qcom_geni_serial_stop_rx_fifo()
759 writel(irq_en, uport->membase + SE_GENI_S_IRQ_EN); in qcom_geni_serial_stop_rx_fifo()
761 irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_stop_rx_fifo()
763 writel(irq_en, uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_stop_rx_fifo()
765 if (!qcom_geni_serial_secondary_active(uport)) in qcom_geni_serial_stop_rx_fifo()
769 qcom_geni_serial_poll_bit(uport, SE_GENI_S_IRQ_STATUS, in qcom_geni_serial_stop_rx_fifo()
775 s_irq_status = readl(uport->membase + SE_GENI_S_IRQ_STATUS); in qcom_geni_serial_stop_rx_fifo()
778 qcom_geni_serial_handle_rx_fifo(uport, true); in qcom_geni_serial_stop_rx_fifo()
779 writel(s_irq_status, uport->membase + SE_GENI_S_IRQ_CLEAR); in qcom_geni_serial_stop_rx_fifo()
781 if (qcom_geni_serial_secondary_active(uport)) in qcom_geni_serial_stop_rx_fifo()
782 qcom_geni_serial_abort_rx(uport); in qcom_geni_serial_stop_rx_fifo()
785 static void qcom_geni_serial_start_rx_fifo(struct uart_port *uport) in qcom_geni_serial_start_rx_fifo() argument
788 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_start_rx_fifo()
790 if (qcom_geni_serial_secondary_active(uport)) in qcom_geni_serial_start_rx_fifo()
791 qcom_geni_serial_stop_rx_fifo(uport); in qcom_geni_serial_start_rx_fifo()
795 irq_en = readl(uport->membase + SE_GENI_S_IRQ_EN); in qcom_geni_serial_start_rx_fifo()
797 writel(irq_en, uport->membase + SE_GENI_S_IRQ_EN); in qcom_geni_serial_start_rx_fifo()
799 irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_start_rx_fifo()
801 writel(irq_en, uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_start_rx_fifo()
804 static void qcom_geni_serial_stop_rx_dma(struct uart_port *uport) in qcom_geni_serial_stop_rx_dma() argument
806 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_stop_rx_dma()
809 if (!qcom_geni_serial_secondary_active(uport)) in qcom_geni_serial_stop_rx_dma()
813 done = qcom_geni_serial_poll_bit(uport, SE_DMA_RX_IRQ_STAT, in qcom_geni_serial_stop_rx_dma()
817 uport->membase + SE_DMA_RX_IRQ_CLR); in qcom_geni_serial_stop_rx_dma()
819 qcom_geni_serial_abort_rx(uport); in qcom_geni_serial_stop_rx_dma()
821 writel(1, uport->membase + SE_DMA_RX_FSM_RST); in qcom_geni_serial_stop_rx_dma()
822 qcom_geni_serial_poll_bit(uport, SE_DMA_RX_IRQ_STAT, in qcom_geni_serial_stop_rx_dma()
825 uport->membase + SE_DMA_RX_IRQ_CLR); in qcom_geni_serial_stop_rx_dma()
835 static void qcom_geni_serial_start_rx_dma(struct uart_port *uport) in qcom_geni_serial_start_rx_dma() argument
837 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_start_rx_dma()
840 if (qcom_geni_serial_secondary_active(uport)) in qcom_geni_serial_start_rx_dma()
841 qcom_geni_serial_stop_rx_dma(uport); in qcom_geni_serial_start_rx_dma()
849 dev_err(uport->dev, "unable to start RX SE DMA: %d\n", ret); in qcom_geni_serial_start_rx_dma()
850 qcom_geni_serial_stop_rx_dma(uport); in qcom_geni_serial_start_rx_dma()
854 static void qcom_geni_serial_handle_rx_dma(struct uart_port *uport, bool drop) in qcom_geni_serial_handle_rx_dma() argument
856 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_handle_rx_dma()
860 if (!qcom_geni_serial_secondary_active(uport)) in qcom_geni_serial_handle_rx_dma()
869 rx_in = readl(uport->membase + SE_DMA_RX_LEN_IN); in qcom_geni_serial_handle_rx_dma()
871 dev_warn(uport->dev, "serial engine reports 0 RX bytes in!\n"); in qcom_geni_serial_handle_rx_dma()
876 handle_rx_uart(uport, rx_in); in qcom_geni_serial_handle_rx_dma()
882 dev_err(uport->dev, "unable to start RX SE DMA: %d\n", ret); in qcom_geni_serial_handle_rx_dma()
883 qcom_geni_serial_stop_rx_dma(uport); in qcom_geni_serial_handle_rx_dma()
887 static void qcom_geni_serial_start_rx(struct uart_port *uport) in qcom_geni_serial_start_rx() argument
889 uport->ops->start_rx(uport); in qcom_geni_serial_start_rx()
892 static void qcom_geni_serial_stop_rx(struct uart_port *uport) in qcom_geni_serial_stop_rx() argument
894 uport->ops->stop_rx(uport); in qcom_geni_serial_stop_rx()
897 static void qcom_geni_serial_stop_tx(struct uart_port *uport) in qcom_geni_serial_stop_tx() argument
899 uport->ops->stop_tx(uport); in qcom_geni_serial_stop_tx()
902 static void qcom_geni_serial_send_chunk_fifo(struct uart_port *uport, in qcom_geni_serial_send_chunk_fifo() argument
905 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_send_chunk_fifo()
913 uart_fifo_out(uport, buf, tx_bytes); in qcom_geni_serial_send_chunk_fifo()
915 iowrite32_rep(uport->membase + SE_GENI_TX_FIFOn, buf, 1); in qcom_geni_serial_send_chunk_fifo()
922 static void qcom_geni_serial_handle_tx_fifo(struct uart_port *uport, in qcom_geni_serial_handle_tx_fifo() argument
925 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_handle_tx_fifo()
926 struct tty_port *tport = &uport->state->port; in qcom_geni_serial_handle_tx_fifo()
933 status = readl(uport->membase + SE_GENI_TX_FIFO_STATUS); in qcom_geni_serial_handle_tx_fifo()
943 qcom_geni_serial_stop_tx_fifo(uport); in qcom_geni_serial_handle_tx_fifo()
959 qcom_geni_serial_setup_tx(uport, pending); in qcom_geni_serial_handle_tx_fifo()
963 irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_handle_tx_fifo()
966 uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_handle_tx_fifo()
969 qcom_geni_serial_send_chunk_fifo(uport, chunk); in qcom_geni_serial_handle_tx_fifo()
978 uport->membase + SE_GENI_M_IRQ_CLEAR); in qcom_geni_serial_handle_tx_fifo()
982 irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_handle_tx_fifo()
985 uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_handle_tx_fifo()
989 uart_write_wakeup(uport); in qcom_geni_serial_handle_tx_fifo()
992 static void qcom_geni_serial_handle_tx_dma(struct uart_port *uport) in qcom_geni_serial_handle_tx_dma() argument
994 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_handle_tx_dma()
995 struct tty_port *tport = &uport->state->port; in qcom_geni_serial_handle_tx_dma()
997 uart_xmit_advance(uport, port->tx_remaining); in qcom_geni_serial_handle_tx_dma()
1003 qcom_geni_serial_start_tx_dma(uport); in qcom_geni_serial_handle_tx_dma()
1006 uart_write_wakeup(uport); in qcom_geni_serial_handle_tx_dma()
1018 struct uart_port *uport = dev; in qcom_geni_serial_isr() local
1020 struct tty_port *tport = &uport->state->port; in qcom_geni_serial_isr()
1021 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_isr()
1023 if (uport->suspended) in qcom_geni_serial_isr()
1026 uart_port_lock(uport); in qcom_geni_serial_isr()
1028 m_irq_status = readl(uport->membase + SE_GENI_M_IRQ_STATUS); in qcom_geni_serial_isr()
1029 s_irq_status = readl(uport->membase + SE_GENI_S_IRQ_STATUS); in qcom_geni_serial_isr()
1030 dma_tx_status = readl(uport->membase + SE_DMA_TX_IRQ_STAT); in qcom_geni_serial_isr()
1031 dma_rx_status = readl(uport->membase + SE_DMA_RX_IRQ_STAT); in qcom_geni_serial_isr()
1032 geni_status = readl(uport->membase + SE_GENI_STATUS); in qcom_geni_serial_isr()
1033 dma = readl(uport->membase + SE_GENI_DMA_MODE_EN); in qcom_geni_serial_isr()
1034 m_irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); in qcom_geni_serial_isr()
1035 writel(m_irq_status, uport->membase + SE_GENI_M_IRQ_CLEAR); in qcom_geni_serial_isr()
1036 writel(s_irq_status, uport->membase + SE_GENI_S_IRQ_CLEAR); in qcom_geni_serial_isr()
1037 writel(dma_tx_status, uport->membase + SE_DMA_TX_IRQ_CLR); in qcom_geni_serial_isr()
1038 writel(dma_rx_status, uport->membase + SE_DMA_RX_IRQ_CLR); in qcom_geni_serial_isr()
1044 uport->icount.overrun++; in qcom_geni_serial_isr()
1050 uport->icount.parity++; in qcom_geni_serial_isr()
1053 uport->icount.brk++; in qcom_geni_serial_isr()
1059 qcom_geni_serial_handle_tx_dma(uport); in qcom_geni_serial_isr()
1066 uport->icount.parity++; in qcom_geni_serial_isr()
1071 uport->icount.brk++; in qcom_geni_serial_isr()
1074 qcom_geni_serial_handle_rx_dma(uport, drop_rx); in qcom_geni_serial_isr()
1079 qcom_geni_serial_handle_tx_fifo(uport, in qcom_geni_serial_isr()
1084 qcom_geni_serial_handle_rx_fifo(uport, drop_rx); in qcom_geni_serial_isr()
1088 uart_unlock_and_check_sysrq(uport); in qcom_geni_serial_isr()
1095 struct uart_port *uport; in setup_fifos() local
1098 uport = &port->uport; in setup_fifos()
1102 uport->fifosize = in setup_fifos()
1111 port->rx_buf = devm_krealloc(uport->dev, port->rx_buf, in setup_fifos()
1122 static void qcom_geni_serial_shutdown(struct uart_port *uport) in qcom_geni_serial_shutdown() argument
1124 disable_irq(uport->irq); in qcom_geni_serial_shutdown()
1126 uart_port_lock_irq(uport); in qcom_geni_serial_shutdown()
1127 qcom_geni_serial_stop_tx(uport); in qcom_geni_serial_shutdown()
1128 qcom_geni_serial_stop_rx(uport); in qcom_geni_serial_shutdown()
1130 qcom_geni_serial_cancel_tx_cmd(uport); in qcom_geni_serial_shutdown()
1131 uart_port_unlock_irq(uport); in qcom_geni_serial_shutdown()
1134 static void qcom_geni_serial_flush_buffer(struct uart_port *uport) in qcom_geni_serial_flush_buffer() argument
1136 qcom_geni_serial_cancel_tx_cmd(uport); in qcom_geni_serial_flush_buffer()
1139 static int qcom_geni_serial_port_setup(struct uart_port *uport) in qcom_geni_serial_port_setup() argument
1141 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_port_setup()
1149 dev_err(uport->dev, "Invalid FW loaded, proto: %d\n", proto); in qcom_geni_serial_port_setup()
1153 qcom_geni_serial_stop_rx(uport); in qcom_geni_serial_port_setup()
1159 writel(rxstale, uport->membase + SE_UART_RX_STALE_CNT); in qcom_geni_serial_port_setup()
1161 pin_swap = readl(uport->membase + SE_UART_IO_MACRO_CTRL); in qcom_geni_serial_port_setup()
1172 writel(pin_swap, uport->membase + SE_UART_IO_MACRO_CTRL); in qcom_geni_serial_port_setup()
1178 if (uart_console(uport)) in qcom_geni_serial_port_setup()
1179 qcom_geni_serial_poll_tx_done(uport); in qcom_geni_serial_port_setup()
1189 static int qcom_geni_serial_startup(struct uart_port *uport) in qcom_geni_serial_startup() argument
1192 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_startup()
1195 ret = qcom_geni_serial_port_setup(uport); in qcom_geni_serial_startup()
1200 uart_port_lock_irq(uport); in qcom_geni_serial_startup()
1201 qcom_geni_serial_start_rx(uport); in qcom_geni_serial_startup()
1202 uart_port_unlock_irq(uport); in qcom_geni_serial_startup()
1204 enable_irq(uport->irq); in qcom_geni_serial_startup()
1270 static void qcom_geni_serial_set_termios(struct uart_port *uport, in qcom_geni_serial_set_termios() argument
1283 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_set_termios()
1290 baud = uart_get_baud_rate(uport, termios, old, 300, 4000000); in qcom_geni_serial_set_termios()
1310 uport->uartclk = clk_rate; in qcom_geni_serial_set_termios()
1312 dev_pm_opp_set_rate(uport->dev, clk_rate); in qcom_geni_serial_set_termios()
1327 tx_trans_cfg = readl(uport->membase + SE_UART_TX_TRANS_CFG); in qcom_geni_serial_set_termios()
1328 tx_parity_cfg = readl(uport->membase + SE_UART_TX_PARITY_CFG); in qcom_geni_serial_set_termios()
1329 rx_trans_cfg = readl(uport->membase + SE_UART_RX_TRANS_CFG); in qcom_geni_serial_set_termios()
1330 rx_parity_cfg = readl(uport->membase + SE_UART_RX_PARITY_CFG); in qcom_geni_serial_set_termios()
1369 uart_update_timeout(uport, termios->c_cflag, baud); in qcom_geni_serial_set_termios()
1378 timeout = jiffies_to_usecs(uart_fifo_timeout(uport)); in qcom_geni_serial_set_termios()
1383 if (!uart_console(uport)) in qcom_geni_serial_set_termios()
1385 uport->membase + SE_UART_LOOPBACK_CFG); in qcom_geni_serial_set_termios()
1386 writel(tx_trans_cfg, uport->membase + SE_UART_TX_TRANS_CFG); in qcom_geni_serial_set_termios()
1387 writel(tx_parity_cfg, uport->membase + SE_UART_TX_PARITY_CFG); in qcom_geni_serial_set_termios()
1388 writel(rx_trans_cfg, uport->membase + SE_UART_RX_TRANS_CFG); in qcom_geni_serial_set_termios()
1389 writel(rx_parity_cfg, uport->membase + SE_UART_RX_PARITY_CFG); in qcom_geni_serial_set_termios()
1390 writel(bits_per_char, uport->membase + SE_UART_TX_WORD_LEN); in qcom_geni_serial_set_termios()
1391 writel(bits_per_char, uport->membase + SE_UART_RX_WORD_LEN); in qcom_geni_serial_set_termios()
1392 writel(stop_bit_len, uport->membase + SE_UART_TX_STOP_BIT_LEN); in qcom_geni_serial_set_termios()
1393 writel(ser_clk_cfg, uport->membase + GENI_SER_M_CLK_CFG); in qcom_geni_serial_set_termios()
1394 writel(ser_clk_cfg, uport->membase + GENI_SER_S_CLK_CFG); in qcom_geni_serial_set_termios()
1400 struct uart_port *uport; in qcom_geni_console_setup() local
1417 uport = &port->uport; in qcom_geni_console_setup()
1419 if (unlikely(!uport->membase)) in qcom_geni_console_setup()
1423 ret = qcom_geni_serial_port_setup(uport); in qcom_geni_console_setup()
1431 return uart_set_options(uport, co, baud, parity, bits, flow); in qcom_geni_console_setup()
1447 struct uart_port *uport = &dev->port; in qcom_geni_serial_earlycon_read() local
1452 ch = qcom_geni_serial_get_char(uport); in qcom_geni_serial_earlycon_read()
1477 struct uart_port *uport = &dev->port; in qcom_geni_serial_earlycon_setup() local
1486 if (!uport->membase) in qcom_geni_serial_earlycon_setup()
1489 uport->private_data = &earlycon_private_data; in qcom_geni_serial_earlycon_setup()
1492 se.base = uport->membase; in qcom_geni_serial_earlycon_setup()
1506 qcom_geni_serial_poll_tx_done(uport); in qcom_geni_serial_earlycon_setup()
1507 qcom_geni_serial_abort_rx(uport); in qcom_geni_serial_earlycon_setup()
1513 writel(tx_trans_cfg, uport->membase + SE_UART_TX_TRANS_CFG); in qcom_geni_serial_earlycon_setup()
1514 writel(tx_parity_cfg, uport->membase + SE_UART_TX_PARITY_CFG); in qcom_geni_serial_earlycon_setup()
1515 writel(rx_trans_cfg, uport->membase + SE_UART_RX_TRANS_CFG); in qcom_geni_serial_earlycon_setup()
1516 writel(rx_parity_cfg, uport->membase + SE_UART_RX_PARITY_CFG); in qcom_geni_serial_earlycon_setup()
1517 writel(bits_per_char, uport->membase + SE_UART_TX_WORD_LEN); in qcom_geni_serial_earlycon_setup()
1518 writel(bits_per_char, uport->membase + SE_UART_RX_WORD_LEN); in qcom_geni_serial_earlycon_setup()
1519 writel(stop_bit_len, uport->membase + SE_UART_TX_STOP_BIT_LEN); in qcom_geni_serial_earlycon_setup()
1575 static void qcom_geni_serial_pm(struct uart_port *uport, in qcom_geni_serial_pm() argument
1578 struct qcom_geni_serial_port *port = to_dev_port(uport); in qcom_geni_serial_pm()
1587 dev_pm_opp_set_rate(uport->dev, port->clk_rate); in qcom_geni_serial_pm()
1592 dev_pm_opp_set_rate(uport->dev, 0); in qcom_geni_serial_pm()
1642 struct uart_port *uport; in qcom_geni_serial_probe() local
1668 uport = &port->uport; in qcom_geni_serial_probe()
1670 if (uport->private_data) in qcom_geni_serial_probe()
1673 uport->dev = &pdev->dev; in qcom_geni_serial_probe()
1687 uport->mapbase = res->start; in qcom_geni_serial_probe()
1694 port->rx_buf = devm_kzalloc(uport->dev, in qcom_geni_serial_probe()
1711 port->name = devm_kasprintf(uport->dev, GFP_KERNEL, in qcom_geni_serial_probe()
1713 uart_console(uport) ? "console" : "uart", uport->line); in qcom_geni_serial_probe()
1720 uport->irq = irq; in qcom_geni_serial_probe()
1721 uport->has_sysrq = IS_ENABLED(CONFIG_SERIAL_QCOM_GENI_CONSOLE); in qcom_geni_serial_probe()
1743 uport->private_data = &port->private_data; in qcom_geni_serial_probe()
1746 irq_set_status_flags(uport->irq, IRQ_NOAUTOEN); in qcom_geni_serial_probe()
1747 ret = devm_request_irq(uport->dev, uport->irq, qcom_geni_serial_isr, in qcom_geni_serial_probe()
1748 IRQF_TRIGGER_HIGH, port->name, uport); in qcom_geni_serial_probe()
1750 dev_err(uport->dev, "Failed to get IRQ ret %d\n", ret); in qcom_geni_serial_probe()
1754 ret = uart_add_one_port(drv, uport); in qcom_geni_serial_probe()
1764 uart_remove_one_port(drv, uport); in qcom_geni_serial_probe()
1779 uart_remove_one_port(drv, &port->uport); in qcom_geni_serial_remove()
1785 struct uart_port *uport = &port->uport; in qcom_geni_serial_suspend() local
1786 struct qcom_geni_private_data *private_data = uport->private_data; in qcom_geni_serial_suspend()
1792 if (uart_console(uport)) { in qcom_geni_serial_suspend()
1796 return uart_suspend_port(private_data->drv, uport); in qcom_geni_serial_suspend()
1803 struct uart_port *uport = &port->uport; in qcom_geni_serial_resume() local
1804 struct qcom_geni_private_data *private_data = uport->private_data; in qcom_geni_serial_resume()
1806 ret = uart_resume_port(private_data->drv, uport); in qcom_geni_serial_resume()
1807 if (uart_console(uport)) { in qcom_geni_serial_resume()