• Home
  • Raw
  • Download

Lines Matching full:port

73 #define PSC(port) ((struct mpc52xx_psc __iomem *)((port)->membase))  argument
78 static irqreturn_t mpc5xxx_uart_process_int(struct uart_port *port);
85 void (*fifo_init)(struct uart_port *port);
86 int (*raw_rx_rdy)(struct uart_port *port);
87 int (*raw_tx_rdy)(struct uart_port *port);
88 int (*rx_rdy)(struct uart_port *port);
89 int (*tx_rdy)(struct uart_port *port);
90 int (*tx_empty)(struct uart_port *port);
91 void (*stop_rx)(struct uart_port *port);
92 void (*start_tx)(struct uart_port *port);
93 void (*stop_tx)(struct uart_port *port);
94 void (*rx_clr_irq)(struct uart_port *port);
95 void (*tx_clr_irq)(struct uart_port *port);
96 void (*write_char)(struct uart_port *port, unsigned char c);
97 unsigned char (*read_char)(struct uart_port *port);
98 void (*cw_disable_ints)(struct uart_port *port);
99 void (*cw_restore_ints)(struct uart_port *port);
100 unsigned int (*set_baudrate)(struct uart_port *port,
103 int (*clock_alloc)(struct uart_port *port);
104 void (*clock_relse)(struct uart_port *port);
105 int (*clock)(struct uart_port *port, int enable);
109 irqreturn_t (*handle_irq)(struct uart_port *port);
110 u16 (*get_status)(struct uart_port *port);
111 u8 (*get_ipcr)(struct uart_port *port);
112 void (*command)(struct uart_port *port, u8 cmd);
113 void (*set_mode)(struct uart_port *port, u8 mr1, u8 mr2);
114 void (*set_rts)(struct uart_port *port, int state);
115 void (*enable_ms)(struct uart_port *port);
116 void (*set_sicr)(struct uart_port *port, u32 val);
117 void (*set_imr)(struct uart_port *port, u16 val);
118 u8 (*get_mr1)(struct uart_port *port);
131 static u16 mpc52xx_psc_get_status(struct uart_port *port) in mpc52xx_psc_get_status() argument
133 return in_be16(&PSC(port)->mpc52xx_psc_status); in mpc52xx_psc_get_status()
136 static u8 mpc52xx_psc_get_ipcr(struct uart_port *port) in mpc52xx_psc_get_ipcr() argument
138 return in_8(&PSC(port)->mpc52xx_psc_ipcr); in mpc52xx_psc_get_ipcr()
141 static void mpc52xx_psc_command(struct uart_port *port, u8 cmd) in mpc52xx_psc_command() argument
143 out_8(&PSC(port)->command, cmd); in mpc52xx_psc_command()
146 static void mpc52xx_psc_set_mode(struct uart_port *port, u8 mr1, u8 mr2) in mpc52xx_psc_set_mode() argument
148 out_8(&PSC(port)->command, MPC52xx_PSC_SEL_MODE_REG_1); in mpc52xx_psc_set_mode()
149 out_8(&PSC(port)->mode, mr1); in mpc52xx_psc_set_mode()
150 out_8(&PSC(port)->mode, mr2); in mpc52xx_psc_set_mode()
153 static void mpc52xx_psc_set_rts(struct uart_port *port, int state) in mpc52xx_psc_set_rts() argument
156 out_8(&PSC(port)->op1, MPC52xx_PSC_OP_RTS); in mpc52xx_psc_set_rts()
158 out_8(&PSC(port)->op0, MPC52xx_PSC_OP_RTS); in mpc52xx_psc_set_rts()
161 static void mpc52xx_psc_enable_ms(struct uart_port *port) in mpc52xx_psc_enable_ms() argument
163 struct mpc52xx_psc __iomem *psc = PSC(port); in mpc52xx_psc_enable_ms()
170 port->read_status_mask |= MPC52xx_PSC_IMR_IPC; in mpc52xx_psc_enable_ms()
171 out_be16(&psc->mpc52xx_psc_imr, port->read_status_mask); in mpc52xx_psc_enable_ms()
174 static void mpc52xx_psc_set_sicr(struct uart_port *port, u32 val) in mpc52xx_psc_set_sicr() argument
176 out_be32(&PSC(port)->sicr, val); in mpc52xx_psc_set_sicr()
179 static void mpc52xx_psc_set_imr(struct uart_port *port, u16 val) in mpc52xx_psc_set_imr() argument
181 out_be16(&PSC(port)->mpc52xx_psc_imr, val); in mpc52xx_psc_set_imr()
184 static u8 mpc52xx_psc_get_mr1(struct uart_port *port) in mpc52xx_psc_get_mr1() argument
186 out_8(&PSC(port)->command, MPC52xx_PSC_SEL_MODE_REG_1); in mpc52xx_psc_get_mr1()
187 return in_8(&PSC(port)->mode); in mpc52xx_psc_get_mr1()
191 #define FIFO_52xx(port) ((struct mpc52xx_psc_fifo __iomem *)(PSC(port)+1)) argument
192 static void mpc52xx_psc_fifo_init(struct uart_port *port) in mpc52xx_psc_fifo_init() argument
194 struct mpc52xx_psc __iomem *psc = PSC(port); in mpc52xx_psc_fifo_init()
195 struct mpc52xx_psc_fifo __iomem *fifo = FIFO_52xx(port); in mpc52xx_psc_fifo_init()
202 port->read_status_mask |= MPC52xx_PSC_IMR_RXRDY | MPC52xx_PSC_IMR_TXRDY; in mpc52xx_psc_fifo_init()
203 out_be16(&psc->mpc52xx_psc_imr, port->read_status_mask); in mpc52xx_psc_fifo_init()
206 static int mpc52xx_psc_raw_rx_rdy(struct uart_port *port) in mpc52xx_psc_raw_rx_rdy() argument
208 return in_be16(&PSC(port)->mpc52xx_psc_status) in mpc52xx_psc_raw_rx_rdy()
212 static int mpc52xx_psc_raw_tx_rdy(struct uart_port *port) in mpc52xx_psc_raw_tx_rdy() argument
214 return in_be16(&PSC(port)->mpc52xx_psc_status) in mpc52xx_psc_raw_tx_rdy()
219 static int mpc52xx_psc_rx_rdy(struct uart_port *port) in mpc52xx_psc_rx_rdy() argument
221 return in_be16(&PSC(port)->mpc52xx_psc_isr) in mpc52xx_psc_rx_rdy()
222 & port->read_status_mask in mpc52xx_psc_rx_rdy()
226 static int mpc52xx_psc_tx_rdy(struct uart_port *port) in mpc52xx_psc_tx_rdy() argument
228 return in_be16(&PSC(port)->mpc52xx_psc_isr) in mpc52xx_psc_tx_rdy()
229 & port->read_status_mask in mpc52xx_psc_tx_rdy()
233 static int mpc52xx_psc_tx_empty(struct uart_port *port) in mpc52xx_psc_tx_empty() argument
235 u16 sts = in_be16(&PSC(port)->mpc52xx_psc_status); in mpc52xx_psc_tx_empty()
240 static void mpc52xx_psc_start_tx(struct uart_port *port) in mpc52xx_psc_start_tx() argument
242 port->read_status_mask |= MPC52xx_PSC_IMR_TXRDY; in mpc52xx_psc_start_tx()
243 out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask); in mpc52xx_psc_start_tx()
246 static void mpc52xx_psc_stop_tx(struct uart_port *port) in mpc52xx_psc_stop_tx() argument
248 port->read_status_mask &= ~MPC52xx_PSC_IMR_TXRDY; in mpc52xx_psc_stop_tx()
249 out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask); in mpc52xx_psc_stop_tx()
252 static void mpc52xx_psc_stop_rx(struct uart_port *port) in mpc52xx_psc_stop_rx() argument
254 port->read_status_mask &= ~MPC52xx_PSC_IMR_RXRDY; in mpc52xx_psc_stop_rx()
255 out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask); in mpc52xx_psc_stop_rx()
258 static void mpc52xx_psc_rx_clr_irq(struct uart_port *port) in mpc52xx_psc_rx_clr_irq() argument
262 static void mpc52xx_psc_tx_clr_irq(struct uart_port *port) in mpc52xx_psc_tx_clr_irq() argument
266 static void mpc52xx_psc_write_char(struct uart_port *port, unsigned char c) in mpc52xx_psc_write_char() argument
268 out_8(&PSC(port)->mpc52xx_psc_buffer_8, c); in mpc52xx_psc_write_char()
271 static unsigned char mpc52xx_psc_read_char(struct uart_port *port) in mpc52xx_psc_read_char() argument
273 return in_8(&PSC(port)->mpc52xx_psc_buffer_8); in mpc52xx_psc_read_char()
276 static void mpc52xx_psc_cw_disable_ints(struct uart_port *port) in mpc52xx_psc_cw_disable_ints() argument
278 out_be16(&PSC(port)->mpc52xx_psc_imr, 0); in mpc52xx_psc_cw_disable_ints()
281 static void mpc52xx_psc_cw_restore_ints(struct uart_port *port) in mpc52xx_psc_cw_restore_ints() argument
283 out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask); in mpc52xx_psc_cw_restore_ints()
286 static unsigned int mpc5200_psc_set_baudrate(struct uart_port *port, in mpc5200_psc_set_baudrate() argument
294 baud = uart_get_baud_rate(port, new, old, in mpc5200_psc_set_baudrate()
295 port->uartclk / (32 * 0xffff) + 1, in mpc5200_psc_set_baudrate()
296 port->uartclk / 32); in mpc5200_psc_set_baudrate()
297 divisor = (port->uartclk + 16 * baud) / (32 * baud); in mpc5200_psc_set_baudrate()
300 mpc52xx_set_divisor(PSC(port), 0xdd00, divisor); in mpc5200_psc_set_baudrate()
304 static unsigned int mpc5200b_psc_set_baudrate(struct uart_port *port, in mpc5200b_psc_set_baudrate() argument
314 baud = uart_get_baud_rate(port, new, old, in mpc5200b_psc_set_baudrate()
315 port->uartclk / (32 * 0xffff) + 1, in mpc5200b_psc_set_baudrate()
316 port->uartclk / 4); in mpc5200b_psc_set_baudrate()
317 divisor = (port->uartclk + 2 * baud) / (4 * baud); in mpc5200b_psc_set_baudrate()
326 mpc52xx_set_divisor(PSC(port), prescaler, divisor); in mpc5200b_psc_set_baudrate()
330 static void mpc52xx_psc_get_irq(struct uart_port *port, struct device_node *np) in mpc52xx_psc_get_irq() argument
332 port->irqflags = 0; in mpc52xx_psc_get_irq()
333 port->irq = irq_of_parse_and_map(np, 0); in mpc52xx_psc_get_irq()
336 /* 52xx specific interrupt handler. The caller holds the port lock */
337 static irqreturn_t mpc52xx_psc_handle_irq(struct uart_port *port) in mpc52xx_psc_handle_irq() argument
339 return mpc5xxx_uart_process_int(port); in mpc52xx_psc_handle_irq()
405 #define FIFO_512x(port) ((struct mpc512x_psc_fifo __iomem *)(PSC(port)+1)) argument
420 static void mpc512x_psc_fifo_init(struct uart_port *port) in mpc512x_psc_fifo_init() argument
423 out_be16(&PSC(port)->mpc52xx_psc_clock_select, 0xdd00); in mpc512x_psc_fifo_init()
425 out_be32(&FIFO_512x(port)->txcmd, MPC512x_PSC_FIFO_RESET_SLICE); in mpc512x_psc_fifo_init()
426 out_be32(&FIFO_512x(port)->txcmd, MPC512x_PSC_FIFO_ENABLE_SLICE); in mpc512x_psc_fifo_init()
427 out_be32(&FIFO_512x(port)->txalarm, 1); in mpc512x_psc_fifo_init()
428 out_be32(&FIFO_512x(port)->tximr, 0); in mpc512x_psc_fifo_init()
430 out_be32(&FIFO_512x(port)->rxcmd, MPC512x_PSC_FIFO_RESET_SLICE); in mpc512x_psc_fifo_init()
431 out_be32(&FIFO_512x(port)->rxcmd, MPC512x_PSC_FIFO_ENABLE_SLICE); in mpc512x_psc_fifo_init()
432 out_be32(&FIFO_512x(port)->rxalarm, 1); in mpc512x_psc_fifo_init()
433 out_be32(&FIFO_512x(port)->rximr, 0); in mpc512x_psc_fifo_init()
435 out_be32(&FIFO_512x(port)->tximr, MPC512x_PSC_FIFO_ALARM); in mpc512x_psc_fifo_init()
436 out_be32(&FIFO_512x(port)->rximr, MPC512x_PSC_FIFO_ALARM); in mpc512x_psc_fifo_init()
439 static int mpc512x_psc_raw_rx_rdy(struct uart_port *port) in mpc512x_psc_raw_rx_rdy() argument
441 return !(in_be32(&FIFO_512x(port)->rxsr) & MPC512x_PSC_FIFO_EMPTY); in mpc512x_psc_raw_rx_rdy()
444 static int mpc512x_psc_raw_tx_rdy(struct uart_port *port) in mpc512x_psc_raw_tx_rdy() argument
446 return !(in_be32(&FIFO_512x(port)->txsr) & MPC512x_PSC_FIFO_FULL); in mpc512x_psc_raw_tx_rdy()
449 static int mpc512x_psc_rx_rdy(struct uart_port *port) in mpc512x_psc_rx_rdy() argument
451 return in_be32(&FIFO_512x(port)->rxsr) in mpc512x_psc_rx_rdy()
452 & in_be32(&FIFO_512x(port)->rximr) in mpc512x_psc_rx_rdy()
456 static int mpc512x_psc_tx_rdy(struct uart_port *port) in mpc512x_psc_tx_rdy() argument
458 return in_be32(&FIFO_512x(port)->txsr) in mpc512x_psc_tx_rdy()
459 & in_be32(&FIFO_512x(port)->tximr) in mpc512x_psc_tx_rdy()
463 static int mpc512x_psc_tx_empty(struct uart_port *port) in mpc512x_psc_tx_empty() argument
465 return in_be32(&FIFO_512x(port)->txsr) in mpc512x_psc_tx_empty()
469 static void mpc512x_psc_stop_rx(struct uart_port *port) in mpc512x_psc_stop_rx() argument
473 rx_fifo_imr = in_be32(&FIFO_512x(port)->rximr); in mpc512x_psc_stop_rx()
475 out_be32(&FIFO_512x(port)->rximr, rx_fifo_imr); in mpc512x_psc_stop_rx()
478 static void mpc512x_psc_start_tx(struct uart_port *port) in mpc512x_psc_start_tx() argument
482 tx_fifo_imr = in_be32(&FIFO_512x(port)->tximr); in mpc512x_psc_start_tx()
484 out_be32(&FIFO_512x(port)->tximr, tx_fifo_imr); in mpc512x_psc_start_tx()
487 static void mpc512x_psc_stop_tx(struct uart_port *port) in mpc512x_psc_stop_tx() argument
491 tx_fifo_imr = in_be32(&FIFO_512x(port)->tximr); in mpc512x_psc_stop_tx()
493 out_be32(&FIFO_512x(port)->tximr, tx_fifo_imr); in mpc512x_psc_stop_tx()
496 static void mpc512x_psc_rx_clr_irq(struct uart_port *port) in mpc512x_psc_rx_clr_irq() argument
498 out_be32(&FIFO_512x(port)->rxisr, in_be32(&FIFO_512x(port)->rxisr)); in mpc512x_psc_rx_clr_irq()
501 static void mpc512x_psc_tx_clr_irq(struct uart_port *port) in mpc512x_psc_tx_clr_irq() argument
503 out_be32(&FIFO_512x(port)->txisr, in_be32(&FIFO_512x(port)->txisr)); in mpc512x_psc_tx_clr_irq()
506 static void mpc512x_psc_write_char(struct uart_port *port, unsigned char c) in mpc512x_psc_write_char() argument
508 out_8(&FIFO_512x(port)->txdata_8, c); in mpc512x_psc_write_char()
511 static unsigned char mpc512x_psc_read_char(struct uart_port *port) in mpc512x_psc_read_char() argument
513 return in_8(&FIFO_512x(port)->rxdata_8); in mpc512x_psc_read_char()
516 static void mpc512x_psc_cw_disable_ints(struct uart_port *port) in mpc512x_psc_cw_disable_ints() argument
518 port->read_status_mask = in mpc512x_psc_cw_disable_ints()
519 in_be32(&FIFO_512x(port)->tximr) << 16 | in mpc512x_psc_cw_disable_ints()
520 in_be32(&FIFO_512x(port)->rximr); in mpc512x_psc_cw_disable_ints()
521 out_be32(&FIFO_512x(port)->tximr, 0); in mpc512x_psc_cw_disable_ints()
522 out_be32(&FIFO_512x(port)->rximr, 0); in mpc512x_psc_cw_disable_ints()
525 static void mpc512x_psc_cw_restore_ints(struct uart_port *port) in mpc512x_psc_cw_restore_ints() argument
527 out_be32(&FIFO_512x(port)->tximr, in mpc512x_psc_cw_restore_ints()
528 (port->read_status_mask >> 16) & 0x7f); in mpc512x_psc_cw_restore_ints()
529 out_be32(&FIFO_512x(port)->rximr, port->read_status_mask & 0x7f); in mpc512x_psc_cw_restore_ints()
532 static unsigned int mpc512x_psc_set_baudrate(struct uart_port *port, in mpc512x_psc_set_baudrate() argument
553 baud = uart_get_baud_rate(port, new, old, in mpc512x_psc_set_baudrate()
554 port->uartclk / (16 * 0xffff) + 1, in mpc512x_psc_set_baudrate()
555 port->uartclk / 16); in mpc512x_psc_set_baudrate()
556 divisor = (port->uartclk + 8 * baud) / (16 * baud); in mpc512x_psc_set_baudrate()
559 mpc52xx_set_divisor(PSC(port), 0xdd00, divisor); in mpc512x_psc_set_baudrate()
635 /* 512x specific interrupt handler. The caller holds the port lock */
636 static irqreturn_t mpc512x_psc_handle_irq(struct uart_port *port) in mpc512x_psc_handle_irq() argument
644 /* Check if it is an interrupt for this port */ in mpc512x_psc_handle_irq()
645 psc_num = (port->mapbase & 0xf00) >> 8; in mpc512x_psc_handle_irq()
648 return mpc5xxx_uart_process_int(port); in mpc512x_psc_handle_irq()
657 static int mpc512x_psc_alloc_clock(struct uart_port *port) in mpc512x_psc_alloc_clock() argument
663 psc_num = (port->mapbase & 0xf00) >> 8; in mpc512x_psc_alloc_clock()
665 clk = devm_clk_get(port->dev, "mclk"); in mpc512x_psc_alloc_clock()
667 dev_err(port->dev, "Failed to get MCLK!\n"); in mpc512x_psc_alloc_clock()
673 dev_err(port->dev, "Failed to enable MCLK!\n"); in mpc512x_psc_alloc_clock()
678 clk = devm_clk_get(port->dev, "ipg"); in mpc512x_psc_alloc_clock()
680 dev_err(port->dev, "Failed to get IPG clock!\n"); in mpc512x_psc_alloc_clock()
686 dev_err(port->dev, "Failed to enable IPG clock!\n"); in mpc512x_psc_alloc_clock()
706 static void mpc512x_psc_relse_clock(struct uart_port *port) in mpc512x_psc_relse_clock() argument
711 psc_num = (port->mapbase & 0xf00) >> 8; in mpc512x_psc_relse_clock()
724 static int mpc512x_psc_endis_clock(struct uart_port *port, int enable) in mpc512x_psc_endis_clock() argument
730 if (uart_console(port)) in mpc512x_psc_endis_clock()
733 psc_num = (port->mapbase & 0xf00) >> 8; in mpc512x_psc_endis_clock()
736 dev_err(port->dev, "Failed to get PSC clock entry!\n"); in mpc512x_psc_endis_clock()
740 dev_dbg(port->dev, "mclk %sable\n", enable ? "en" : "dis"); in mpc512x_psc_endis_clock()
744 dev_err(port->dev, "Failed to enable MCLK!\n"); in mpc512x_psc_endis_clock()
752 static void mpc512x_psc_get_irq(struct uart_port *port, struct device_node *np) in mpc512x_psc_get_irq() argument
754 port->irqflags = IRQF_SHARED; in mpc512x_psc_get_irq()
755 port->irq = psc_fifoc_irq; in mpc512x_psc_get_irq()
761 #define PSC_5125(port) ((struct mpc5125_psc __iomem *)((port)->membase)) argument
762 #define FIFO_5125(port) ((struct mpc512x_psc_fifo __iomem *)(PSC_5125(port)+1)) argument
764 static void mpc5125_psc_fifo_init(struct uart_port *port) in mpc5125_psc_fifo_init() argument
767 out_8(&PSC_5125(port)->mpc52xx_psc_clock_select, 0xdd); in mpc5125_psc_fifo_init()
769 out_be32(&FIFO_5125(port)->txcmd, MPC512x_PSC_FIFO_RESET_SLICE); in mpc5125_psc_fifo_init()
770 out_be32(&FIFO_5125(port)->txcmd, MPC512x_PSC_FIFO_ENABLE_SLICE); in mpc5125_psc_fifo_init()
771 out_be32(&FIFO_5125(port)->txalarm, 1); in mpc5125_psc_fifo_init()
772 out_be32(&FIFO_5125(port)->tximr, 0); in mpc5125_psc_fifo_init()
774 out_be32(&FIFO_5125(port)->rxcmd, MPC512x_PSC_FIFO_RESET_SLICE); in mpc5125_psc_fifo_init()
775 out_be32(&FIFO_5125(port)->rxcmd, MPC512x_PSC_FIFO_ENABLE_SLICE); in mpc5125_psc_fifo_init()
776 out_be32(&FIFO_5125(port)->rxalarm, 1); in mpc5125_psc_fifo_init()
777 out_be32(&FIFO_5125(port)->rximr, 0); in mpc5125_psc_fifo_init()
779 out_be32(&FIFO_5125(port)->tximr, MPC512x_PSC_FIFO_ALARM); in mpc5125_psc_fifo_init()
780 out_be32(&FIFO_5125(port)->rximr, MPC512x_PSC_FIFO_ALARM); in mpc5125_psc_fifo_init()
783 static int mpc5125_psc_raw_rx_rdy(struct uart_port *port) in mpc5125_psc_raw_rx_rdy() argument
785 return !(in_be32(&FIFO_5125(port)->rxsr) & MPC512x_PSC_FIFO_EMPTY); in mpc5125_psc_raw_rx_rdy()
788 static int mpc5125_psc_raw_tx_rdy(struct uart_port *port) in mpc5125_psc_raw_tx_rdy() argument
790 return !(in_be32(&FIFO_5125(port)->txsr) & MPC512x_PSC_FIFO_FULL); in mpc5125_psc_raw_tx_rdy()
793 static int mpc5125_psc_rx_rdy(struct uart_port *port) in mpc5125_psc_rx_rdy() argument
795 return in_be32(&FIFO_5125(port)->rxsr) & in mpc5125_psc_rx_rdy()
796 in_be32(&FIFO_5125(port)->rximr) & MPC512x_PSC_FIFO_ALARM; in mpc5125_psc_rx_rdy()
799 static int mpc5125_psc_tx_rdy(struct uart_port *port) in mpc5125_psc_tx_rdy() argument
801 return in_be32(&FIFO_5125(port)->txsr) & in mpc5125_psc_tx_rdy()
802 in_be32(&FIFO_5125(port)->tximr) & MPC512x_PSC_FIFO_ALARM; in mpc5125_psc_tx_rdy()
805 static int mpc5125_psc_tx_empty(struct uart_port *port) in mpc5125_psc_tx_empty() argument
807 return in_be32(&FIFO_5125(port)->txsr) & MPC512x_PSC_FIFO_EMPTY; in mpc5125_psc_tx_empty()
810 static void mpc5125_psc_stop_rx(struct uart_port *port) in mpc5125_psc_stop_rx() argument
814 rx_fifo_imr = in_be32(&FIFO_5125(port)->rximr); in mpc5125_psc_stop_rx()
816 out_be32(&FIFO_5125(port)->rximr, rx_fifo_imr); in mpc5125_psc_stop_rx()
819 static void mpc5125_psc_start_tx(struct uart_port *port) in mpc5125_psc_start_tx() argument
823 tx_fifo_imr = in_be32(&FIFO_5125(port)->tximr); in mpc5125_psc_start_tx()
825 out_be32(&FIFO_5125(port)->tximr, tx_fifo_imr); in mpc5125_psc_start_tx()
828 static void mpc5125_psc_stop_tx(struct uart_port *port) in mpc5125_psc_stop_tx() argument
832 tx_fifo_imr = in_be32(&FIFO_5125(port)->tximr); in mpc5125_psc_stop_tx()
834 out_be32(&FIFO_5125(port)->tximr, tx_fifo_imr); in mpc5125_psc_stop_tx()
837 static void mpc5125_psc_rx_clr_irq(struct uart_port *port) in mpc5125_psc_rx_clr_irq() argument
839 out_be32(&FIFO_5125(port)->rxisr, in_be32(&FIFO_5125(port)->rxisr)); in mpc5125_psc_rx_clr_irq()
842 static void mpc5125_psc_tx_clr_irq(struct uart_port *port) in mpc5125_psc_tx_clr_irq() argument
844 out_be32(&FIFO_5125(port)->txisr, in_be32(&FIFO_5125(port)->txisr)); in mpc5125_psc_tx_clr_irq()
847 static void mpc5125_psc_write_char(struct uart_port *port, unsigned char c) in mpc5125_psc_write_char() argument
849 out_8(&FIFO_5125(port)->txdata_8, c); in mpc5125_psc_write_char()
852 static unsigned char mpc5125_psc_read_char(struct uart_port *port) in mpc5125_psc_read_char() argument
854 return in_8(&FIFO_5125(port)->rxdata_8); in mpc5125_psc_read_char()
857 static void mpc5125_psc_cw_disable_ints(struct uart_port *port) in mpc5125_psc_cw_disable_ints() argument
859 port->read_status_mask = in mpc5125_psc_cw_disable_ints()
860 in_be32(&FIFO_5125(port)->tximr) << 16 | in mpc5125_psc_cw_disable_ints()
861 in_be32(&FIFO_5125(port)->rximr); in mpc5125_psc_cw_disable_ints()
862 out_be32(&FIFO_5125(port)->tximr, 0); in mpc5125_psc_cw_disable_ints()
863 out_be32(&FIFO_5125(port)->rximr, 0); in mpc5125_psc_cw_disable_ints()
866 static void mpc5125_psc_cw_restore_ints(struct uart_port *port) in mpc5125_psc_cw_restore_ints() argument
868 out_be32(&FIFO_5125(port)->tximr, in mpc5125_psc_cw_restore_ints()
869 (port->read_status_mask >> 16) & 0x7f); in mpc5125_psc_cw_restore_ints()
870 out_be32(&FIFO_5125(port)->rximr, port->read_status_mask & 0x7f); in mpc5125_psc_cw_restore_ints()
882 static unsigned int mpc5125_psc_set_baudrate(struct uart_port *port, in mpc5125_psc_set_baudrate() argument
894 baud = uart_get_baud_rate(port, new, old, in mpc5125_psc_set_baudrate()
895 port->uartclk / (16 * 0xffff) + 1, in mpc5125_psc_set_baudrate()
896 port->uartclk / 16); in mpc5125_psc_set_baudrate()
897 divisor = (port->uartclk + 8 * baud) / (16 * baud); in mpc5125_psc_set_baudrate()
900 mpc5125_set_divisor(PSC_5125(port), 0xdd, divisor); in mpc5125_psc_set_baudrate()
908 static u16 mpc5125_psc_get_status(struct uart_port *port) in mpc5125_psc_get_status() argument
910 return in_be16(&PSC_5125(port)->mpc52xx_psc_status); in mpc5125_psc_get_status()
913 static u8 mpc5125_psc_get_ipcr(struct uart_port *port) in mpc5125_psc_get_ipcr() argument
915 return in_8(&PSC_5125(port)->mpc52xx_psc_ipcr); in mpc5125_psc_get_ipcr()
918 static void mpc5125_psc_command(struct uart_port *port, u8 cmd) in mpc5125_psc_command() argument
920 out_8(&PSC_5125(port)->command, cmd); in mpc5125_psc_command()
923 static void mpc5125_psc_set_mode(struct uart_port *port, u8 mr1, u8 mr2) in mpc5125_psc_set_mode() argument
925 out_8(&PSC_5125(port)->mr1, mr1); in mpc5125_psc_set_mode()
926 out_8(&PSC_5125(port)->mr2, mr2); in mpc5125_psc_set_mode()
929 static void mpc5125_psc_set_rts(struct uart_port *port, int state) in mpc5125_psc_set_rts() argument
932 out_8(&PSC_5125(port)->op1, MPC52xx_PSC_OP_RTS); in mpc5125_psc_set_rts()
934 out_8(&PSC_5125(port)->op0, MPC52xx_PSC_OP_RTS); in mpc5125_psc_set_rts()
937 static void mpc5125_psc_enable_ms(struct uart_port *port) in mpc5125_psc_enable_ms() argument
939 struct mpc5125_psc __iomem *psc = PSC_5125(port); in mpc5125_psc_enable_ms()
946 port->read_status_mask |= MPC52xx_PSC_IMR_IPC; in mpc5125_psc_enable_ms()
947 out_be16(&psc->mpc52xx_psc_imr, port->read_status_mask); in mpc5125_psc_enable_ms()
950 static void mpc5125_psc_set_sicr(struct uart_port *port, u32 val) in mpc5125_psc_set_sicr() argument
952 out_be32(&PSC_5125(port)->sicr, val); in mpc5125_psc_set_sicr()
955 static void mpc5125_psc_set_imr(struct uart_port *port, u16 val) in mpc5125_psc_set_imr() argument
957 out_be16(&PSC_5125(port)->mpc52xx_psc_imr, val); in mpc5125_psc_set_imr()
960 static u8 mpc5125_psc_get_mr1(struct uart_port *port) in mpc5125_psc_get_mr1() argument
962 return in_8(&PSC_5125(port)->mr1); in mpc5125_psc_get_mr1()
1044 mpc52xx_uart_tx_empty(struct uart_port *port) in mpc52xx_uart_tx_empty() argument
1046 return psc_ops->tx_empty(port) ? TIOCSER_TEMT : 0; in mpc52xx_uart_tx_empty()
1050 mpc52xx_uart_set_mctrl(struct uart_port *port, unsigned int mctrl) in mpc52xx_uart_set_mctrl() argument
1052 psc_ops->set_rts(port, mctrl & TIOCM_RTS); in mpc52xx_uart_set_mctrl()
1056 mpc52xx_uart_get_mctrl(struct uart_port *port) in mpc52xx_uart_get_mctrl() argument
1059 u8 status = psc_ops->get_ipcr(port); in mpc52xx_uart_get_mctrl()
1070 mpc52xx_uart_stop_tx(struct uart_port *port) in mpc52xx_uart_stop_tx() argument
1072 /* port->lock taken by caller */ in mpc52xx_uart_stop_tx()
1073 psc_ops->stop_tx(port); in mpc52xx_uart_stop_tx()
1077 mpc52xx_uart_start_tx(struct uart_port *port) in mpc52xx_uart_start_tx() argument
1079 /* port->lock taken by caller */ in mpc52xx_uart_start_tx()
1080 psc_ops->start_tx(port); in mpc52xx_uart_start_tx()
1084 mpc52xx_uart_stop_rx(struct uart_port *port) in mpc52xx_uart_stop_rx() argument
1086 /* port->lock taken by caller */ in mpc52xx_uart_stop_rx()
1087 psc_ops->stop_rx(port); in mpc52xx_uart_stop_rx()
1091 mpc52xx_uart_enable_ms(struct uart_port *port) in mpc52xx_uart_enable_ms() argument
1093 psc_ops->enable_ms(port); in mpc52xx_uart_enable_ms()
1097 mpc52xx_uart_break_ctl(struct uart_port *port, int ctl) in mpc52xx_uart_break_ctl() argument
1100 spin_lock_irqsave(&port->lock, flags); in mpc52xx_uart_break_ctl()
1103 psc_ops->command(port, MPC52xx_PSC_START_BRK); in mpc52xx_uart_break_ctl()
1105 psc_ops->command(port, MPC52xx_PSC_STOP_BRK); in mpc52xx_uart_break_ctl()
1107 spin_unlock_irqrestore(&port->lock, flags); in mpc52xx_uart_break_ctl()
1111 mpc52xx_uart_startup(struct uart_port *port) in mpc52xx_uart_startup() argument
1116 ret = psc_ops->clock(port, 1); in mpc52xx_uart_startup()
1122 ret = request_irq(port->irq, mpc52xx_uart_int, in mpc52xx_uart_startup()
1123 port->irqflags, "mpc52xx_psc_uart", port); in mpc52xx_uart_startup()
1127 /* Reset/activate the port, clear and enable interrupts */ in mpc52xx_uart_startup()
1128 psc_ops->command(port, MPC52xx_PSC_RST_RX); in mpc52xx_uart_startup()
1129 psc_ops->command(port, MPC52xx_PSC_RST_TX); in mpc52xx_uart_startup()
1138 psc_ops->set_sicr(port, 0); /* UART mode DCD ignored */ in mpc52xx_uart_startup()
1140 psc_ops->fifo_init(port); in mpc52xx_uart_startup()
1142 psc_ops->command(port, MPC52xx_PSC_TX_ENABLE); in mpc52xx_uart_startup()
1143 psc_ops->command(port, MPC52xx_PSC_RX_ENABLE); in mpc52xx_uart_startup()
1149 mpc52xx_uart_shutdown(struct uart_port *port) in mpc52xx_uart_shutdown() argument
1151 /* Shut down the port. Leave TX active if on a console port */ in mpc52xx_uart_shutdown()
1152 psc_ops->command(port, MPC52xx_PSC_RST_RX); in mpc52xx_uart_shutdown()
1153 if (!uart_console(port)) in mpc52xx_uart_shutdown()
1154 psc_ops->command(port, MPC52xx_PSC_RST_TX); in mpc52xx_uart_shutdown()
1156 port->read_status_mask = 0; in mpc52xx_uart_shutdown()
1157 psc_ops->set_imr(port, port->read_status_mask); in mpc52xx_uart_shutdown()
1160 psc_ops->clock(port, 0); in mpc52xx_uart_shutdown()
1163 psc_ops->cw_disable_ints(port); in mpc52xx_uart_shutdown()
1166 free_irq(port->irq, port); in mpc52xx_uart_shutdown()
1170 mpc52xx_uart_set_termios(struct uart_port *port, struct ktermios *new, in mpc52xx_uart_set_termios() argument
1218 spin_lock_irqsave(&port->lock, flags); in mpc52xx_uart_set_termios()
1226 /* while (j-- && mpc52xx_uart_int_rx_chars(port)); */ in mpc52xx_uart_set_termios()
1227 while (!mpc52xx_uart_tx_empty(port) && --j) in mpc52xx_uart_set_termios()
1236 psc_ops->command(port, MPC52xx_PSC_RST_RX); in mpc52xx_uart_set_termios()
1237 psc_ops->command(port, MPC52xx_PSC_RST_TX); in mpc52xx_uart_set_termios()
1240 psc_ops->set_mode(port, mr1, mr2); in mpc52xx_uart_set_termios()
1241 baud = psc_ops->set_baudrate(port, new, old); in mpc52xx_uart_set_termios()
1243 /* Update the per-port timeout */ in mpc52xx_uart_set_termios()
1244 uart_update_timeout(port, new->c_cflag, baud); in mpc52xx_uart_set_termios()
1246 if (UART_ENABLE_MS(port, new->c_cflag)) in mpc52xx_uart_set_termios()
1247 mpc52xx_uart_enable_ms(port); in mpc52xx_uart_set_termios()
1250 psc_ops->command(port, MPC52xx_PSC_TX_ENABLE); in mpc52xx_uart_set_termios()
1251 psc_ops->command(port, MPC52xx_PSC_RX_ENABLE); in mpc52xx_uart_set_termios()
1254 spin_unlock_irqrestore(&port->lock, flags); in mpc52xx_uart_set_termios()
1258 mpc52xx_uart_type(struct uart_port *port) in mpc52xx_uart_type() argument
1264 return port->type == PORT_MPC52xx ? "MPC5xxx PSC" : NULL; in mpc52xx_uart_type()
1268 mpc52xx_uart_release_port(struct uart_port *port) in mpc52xx_uart_release_port() argument
1271 psc_ops->clock_relse(port); in mpc52xx_uart_release_port()
1274 if (port->flags & UPF_IOREMAP) { in mpc52xx_uart_release_port()
1275 iounmap(port->membase); in mpc52xx_uart_release_port()
1276 port->membase = NULL; in mpc52xx_uart_release_port()
1279 release_mem_region(port->mapbase, sizeof(struct mpc52xx_psc)); in mpc52xx_uart_release_port()
1283 mpc52xx_uart_request_port(struct uart_port *port) in mpc52xx_uart_request_port() argument
1287 if (port->flags & UPF_IOREMAP) /* Need to remap ? */ in mpc52xx_uart_request_port()
1288 port->membase = ioremap(port->mapbase, in mpc52xx_uart_request_port()
1291 if (!port->membase) in mpc52xx_uart_request_port()
1294 err = request_mem_region(port->mapbase, sizeof(struct mpc52xx_psc), in mpc52xx_uart_request_port()
1301 err = psc_ops->clock_alloc(port); in mpc52xx_uart_request_port()
1309 release_mem_region(port->mapbase, sizeof(struct mpc52xx_psc)); in mpc52xx_uart_request_port()
1311 if (port->flags & UPF_IOREMAP) { in mpc52xx_uart_request_port()
1312 iounmap(port->membase); in mpc52xx_uart_request_port()
1313 port->membase = NULL; in mpc52xx_uart_request_port()
1319 mpc52xx_uart_config_port(struct uart_port *port, int flags) in mpc52xx_uart_config_port() argument
1322 && (mpc52xx_uart_request_port(port) == 0)) in mpc52xx_uart_config_port()
1323 port->type = PORT_MPC52xx; in mpc52xx_uart_config_port()
1327 mpc52xx_uart_verify_port(struct uart_port *port, struct serial_struct *ser) in mpc52xx_uart_verify_port() argument
1332 if ((ser->irq != port->irq) || in mpc52xx_uart_verify_port()
1334 (ser->baud_base != port->uartclk) || in mpc52xx_uart_verify_port()
1335 (ser->iomem_base != (void *)port->mapbase) || in mpc52xx_uart_verify_port()
1369 mpc52xx_uart_int_rx_chars(struct uart_port *port) in mpc52xx_uart_int_rx_chars() argument
1371 struct tty_port *tport = &port->state->port; in mpc52xx_uart_int_rx_chars()
1376 while (psc_ops->raw_rx_rdy(port)) { in mpc52xx_uart_int_rx_chars()
1378 ch = psc_ops->read_char(port); in mpc52xx_uart_int_rx_chars()
1381 if (uart_handle_sysrq_char(port, ch)) in mpc52xx_uart_int_rx_chars()
1387 port->icount.rx++; in mpc52xx_uart_int_rx_chars()
1389 status = psc_ops->get_status(port); in mpc52xx_uart_int_rx_chars()
1397 uart_handle_break(port); in mpc52xx_uart_int_rx_chars()
1398 port->icount.brk++; in mpc52xx_uart_int_rx_chars()
1401 port->icount.parity++; in mpc52xx_uart_int_rx_chars()
1405 port->icount.frame++; in mpc52xx_uart_int_rx_chars()
1409 psc_ops->command(port, MPC52xx_PSC_RST_ERR_STAT); in mpc52xx_uart_int_rx_chars()
1420 port->icount.overrun++; in mpc52xx_uart_int_rx_chars()
1424 spin_unlock(&port->lock); in mpc52xx_uart_int_rx_chars()
1426 spin_lock(&port->lock); in mpc52xx_uart_int_rx_chars()
1428 return psc_ops->raw_rx_rdy(port); in mpc52xx_uart_int_rx_chars()
1432 mpc52xx_uart_int_tx_chars(struct uart_port *port) in mpc52xx_uart_int_tx_chars() argument
1434 struct circ_buf *xmit = &port->state->xmit; in mpc52xx_uart_int_tx_chars()
1437 if (port->x_char) { in mpc52xx_uart_int_tx_chars()
1438 psc_ops->write_char(port, port->x_char); in mpc52xx_uart_int_tx_chars()
1439 port->icount.tx++; in mpc52xx_uart_int_tx_chars()
1440 port->x_char = 0; in mpc52xx_uart_int_tx_chars()
1445 if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { in mpc52xx_uart_int_tx_chars()
1446 mpc52xx_uart_stop_tx(port); in mpc52xx_uart_int_tx_chars()
1451 while (psc_ops->raw_tx_rdy(port)) { in mpc52xx_uart_int_tx_chars()
1452 psc_ops->write_char(port, xmit->buf[xmit->tail]); in mpc52xx_uart_int_tx_chars()
1454 port->icount.tx++; in mpc52xx_uart_int_tx_chars()
1461 uart_write_wakeup(port); in mpc52xx_uart_int_tx_chars()
1465 mpc52xx_uart_stop_tx(port); in mpc52xx_uart_int_tx_chars()
1473 mpc5xxx_uart_process_int(struct uart_port *port) in mpc5xxx_uart_process_int() argument
1484 psc_ops->rx_clr_irq(port); in mpc5xxx_uart_process_int()
1485 if (psc_ops->rx_rdy(port)) in mpc5xxx_uart_process_int()
1486 keepgoing |= mpc52xx_uart_int_rx_chars(port); in mpc5xxx_uart_process_int()
1488 psc_ops->tx_clr_irq(port); in mpc5xxx_uart_process_int()
1489 if (psc_ops->tx_rdy(port)) in mpc5xxx_uart_process_int()
1490 keepgoing |= mpc52xx_uart_int_tx_chars(port); in mpc5xxx_uart_process_int()
1492 status = psc_ops->get_ipcr(port); in mpc5xxx_uart_process_int()
1494 uart_handle_dcd_change(port, !(status & MPC52xx_PSC_DCD)); in mpc5xxx_uart_process_int()
1497 uart_handle_cts_change(port, !(status & MPC52xx_PSC_CTS)); in mpc5xxx_uart_process_int()
1511 struct uart_port *port = dev_id; in mpc52xx_uart_int() local
1514 spin_lock(&port->lock); in mpc52xx_uart_int()
1516 ret = psc_ops->handle_irq(port); in mpc52xx_uart_int()
1518 spin_unlock(&port->lock); in mpc52xx_uart_int()
1530 mpc52xx_console_get_options(struct uart_port *port, in mpc52xx_console_get_options() argument
1535 pr_debug("mpc52xx_console_get_options(port=%p)\n", port); in mpc52xx_console_get_options()
1538 mr1 = psc_ops->get_mr1(port); in mpc52xx_console_get_options()
1568 struct uart_port *port = &mpc52xx_uart_ports[co->index]; in mpc52xx_console_write() local
1572 psc_ops->cw_disable_ints(port); in mpc52xx_console_write()
1576 while (!mpc52xx_uart_tx_empty(port) && --j) in mpc52xx_console_write()
1583 psc_ops->write_char(port, '\r'); in mpc52xx_console_write()
1586 psc_ops->write_char(port, *s); in mpc52xx_console_write()
1590 while (!mpc52xx_uart_tx_empty(port) && --j) in mpc52xx_console_write()
1595 psc_ops->cw_restore_ints(port); in mpc52xx_console_write()
1602 struct uart_port *port = &mpc52xx_uart_ports[co->index]; in mpc52xx_console_setup() local
1642 /* Basic port init. Needed since we use some uart_??? func before in mpc52xx_console_setup()
1644 spin_lock_init(&port->lock); in mpc52xx_console_setup()
1645 port->uartclk = uartclk; in mpc52xx_console_setup()
1646 port->ops = &mpc52xx_uart_ops; in mpc52xx_console_setup()
1647 port->mapbase = res.start; in mpc52xx_console_setup()
1648 port->membase = ioremap(res.start, sizeof(struct mpc52xx_psc)); in mpc52xx_console_setup()
1649 port->irq = irq_of_parse_and_map(np, 0); in mpc52xx_console_setup()
1651 if (port->membase == NULL) in mpc52xx_console_setup()
1655 (void *)port->mapbase, port->membase, in mpc52xx_console_setup()
1656 port->irq, port->uartclk); in mpc52xx_console_setup()
1658 /* Setup the port parameters accoding to options */ in mpc52xx_console_setup()
1662 mpc52xx_console_get_options(port, &baud, &parity, &bits, &flow); in mpc52xx_console_setup()
1667 return uart_set_options(port, co, baud, parity, bits, flow); in mpc52xx_console_setup()
1737 struct uart_port *port = NULL; in mpc52xx_uart_of_probe() local
1759 /* Init the port structure */ in mpc52xx_uart_of_probe()
1760 port = &mpc52xx_uart_ports[idx]; in mpc52xx_uart_of_probe()
1762 spin_lock_init(&port->lock); in mpc52xx_uart_of_probe()
1763 port->uartclk = uartclk; in mpc52xx_uart_of_probe()
1764 port->fifosize = 512; in mpc52xx_uart_of_probe()
1765 port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_MPC52xx_CONSOLE); in mpc52xx_uart_of_probe()
1766 port->iotype = UPIO_MEM; in mpc52xx_uart_of_probe()
1767 port->flags = UPF_BOOT_AUTOCONF | in mpc52xx_uart_of_probe()
1768 (uart_console(port) ? 0 : UPF_IOREMAP); in mpc52xx_uart_of_probe()
1769 port->line = idx; in mpc52xx_uart_of_probe()
1770 port->ops = &mpc52xx_uart_ops; in mpc52xx_uart_of_probe()
1771 port->dev = &op->dev; in mpc52xx_uart_of_probe()
1778 port->mapbase = res.start; in mpc52xx_uart_of_probe()
1779 if (!port->mapbase) { in mpc52xx_uart_of_probe()
1784 psc_ops->get_irq(port, op->dev.of_node); in mpc52xx_uart_of_probe()
1785 if (port->irq == 0) { in mpc52xx_uart_of_probe()
1791 (void *)port->mapbase, port->irq, port->uartclk); in mpc52xx_uart_of_probe()
1793 /* Add the port to the uart sub-system */ in mpc52xx_uart_of_probe()
1794 ret = uart_add_one_port(&mpc52xx_uart_driver, port); in mpc52xx_uart_of_probe()
1798 platform_set_drvdata(op, (void *)port); in mpc52xx_uart_of_probe()
1805 struct uart_port *port = platform_get_drvdata(op); in mpc52xx_uart_of_remove() local
1807 if (port) in mpc52xx_uart_of_remove()
1808 uart_remove_one_port(&mpc52xx_uart_driver, port); in mpc52xx_uart_of_remove()
1817 struct uart_port *port = platform_get_drvdata(op); in mpc52xx_uart_of_suspend() local
1819 if (port) in mpc52xx_uart_of_suspend()
1820 uart_suspend_port(&mpc52xx_uart_driver, port); in mpc52xx_uart_of_suspend()
1828 struct uart_port *port = platform_get_drvdata(op); in mpc52xx_uart_of_resume() local
1830 if (port) in mpc52xx_uart_of_resume()
1831 uart_resume_port(&mpc52xx_uart_driver, port); in mpc52xx_uart_of_resume()