.. | .. |
---|
13 | 13 | #include <linux/console.h> |
---|
14 | 14 | #include <linux/sysrq.h> |
---|
15 | 15 | #include <linux/delay.h> |
---|
| 16 | +#include <linux/gpio/consumer.h> |
---|
16 | 17 | #include <linux/platform_device.h> |
---|
17 | 18 | #include <linux/of.h> |
---|
18 | 19 | #include <linux/of_platform.h> |
---|
.. | .. |
---|
28 | 29 | #include <asm/div64.h> |
---|
29 | 30 | |
---|
30 | 31 | #include <asm/mach-ath79/ar933x_uart.h> |
---|
| 32 | + |
---|
| 33 | +#include "serial_mctrl_gpio.h" |
---|
31 | 34 | |
---|
32 | 35 | #define DRIVER_NAME "ar933x-uart" |
---|
33 | 36 | |
---|
.. | .. |
---|
47 | 50 | unsigned int min_baud; |
---|
48 | 51 | unsigned int max_baud; |
---|
49 | 52 | struct clk *clk; |
---|
| 53 | + struct mctrl_gpios *gpios; |
---|
| 54 | + struct gpio_desc *rts_gpiod; |
---|
50 | 55 | }; |
---|
51 | 56 | |
---|
52 | 57 | static inline unsigned int ar933x_uart_read(struct ar933x_uart_port *up, |
---|
.. | .. |
---|
100 | 105 | ar933x_uart_write(up, AR933X_UART_INT_EN_REG, up->ier); |
---|
101 | 106 | } |
---|
102 | 107 | |
---|
| 108 | +static inline void ar933x_uart_start_rx_interrupt(struct ar933x_uart_port *up) |
---|
| 109 | +{ |
---|
| 110 | + up->ier |= AR933X_UART_INT_RX_VALID; |
---|
| 111 | + ar933x_uart_write(up, AR933X_UART_INT_EN_REG, up->ier); |
---|
| 112 | +} |
---|
| 113 | + |
---|
| 114 | +static inline void ar933x_uart_stop_rx_interrupt(struct ar933x_uart_port *up) |
---|
| 115 | +{ |
---|
| 116 | + up->ier &= ~AR933X_UART_INT_RX_VALID; |
---|
| 117 | + ar933x_uart_write(up, AR933X_UART_INT_EN_REG, up->ier); |
---|
| 118 | +} |
---|
| 119 | + |
---|
103 | 120 | static inline void ar933x_uart_putc(struct ar933x_uart_port *up, int ch) |
---|
104 | 121 | { |
---|
105 | 122 | unsigned int rdata; |
---|
.. | .. |
---|
125 | 142 | |
---|
126 | 143 | static unsigned int ar933x_uart_get_mctrl(struct uart_port *port) |
---|
127 | 144 | { |
---|
128 | | - return TIOCM_CAR; |
---|
| 145 | + struct ar933x_uart_port *up = |
---|
| 146 | + container_of(port, struct ar933x_uart_port, port); |
---|
| 147 | + int ret = TIOCM_CTS | TIOCM_DSR | TIOCM_CAR; |
---|
| 148 | + |
---|
| 149 | + mctrl_gpio_get(up->gpios, &ret); |
---|
| 150 | + |
---|
| 151 | + return ret; |
---|
129 | 152 | } |
---|
130 | 153 | |
---|
131 | 154 | static void ar933x_uart_set_mctrl(struct uart_port *port, unsigned int mctrl) |
---|
132 | 155 | { |
---|
| 156 | + struct ar933x_uart_port *up = |
---|
| 157 | + container_of(port, struct ar933x_uart_port, port); |
---|
| 158 | + |
---|
| 159 | + mctrl_gpio_set(up->gpios, mctrl); |
---|
133 | 160 | } |
---|
134 | 161 | |
---|
135 | 162 | static void ar933x_uart_start_tx(struct uart_port *port) |
---|
.. | .. |
---|
138 | 165 | container_of(port, struct ar933x_uart_port, port); |
---|
139 | 166 | |
---|
140 | 167 | ar933x_uart_start_tx_interrupt(up); |
---|
| 168 | +} |
---|
| 169 | + |
---|
| 170 | +static void ar933x_uart_wait_tx_complete(struct ar933x_uart_port *up) |
---|
| 171 | +{ |
---|
| 172 | + unsigned int status; |
---|
| 173 | + unsigned int timeout = 60000; |
---|
| 174 | + |
---|
| 175 | + /* Wait up to 60ms for the character(s) to be sent. */ |
---|
| 176 | + do { |
---|
| 177 | + status = ar933x_uart_read(up, AR933X_UART_CS_REG); |
---|
| 178 | + if (--timeout == 0) |
---|
| 179 | + break; |
---|
| 180 | + udelay(1); |
---|
| 181 | + } while (status & AR933X_UART_CS_TX_BUSY); |
---|
| 182 | + |
---|
| 183 | + if (timeout == 0) |
---|
| 184 | + dev_err(up->port.dev, "waiting for TX timed out\n"); |
---|
| 185 | +} |
---|
| 186 | + |
---|
| 187 | +static void ar933x_uart_rx_flush(struct ar933x_uart_port *up) |
---|
| 188 | +{ |
---|
| 189 | + unsigned int status; |
---|
| 190 | + |
---|
| 191 | + /* clear RX_VALID interrupt */ |
---|
| 192 | + ar933x_uart_write(up, AR933X_UART_INT_REG, AR933X_UART_INT_RX_VALID); |
---|
| 193 | + |
---|
| 194 | + /* remove characters from the RX FIFO */ |
---|
| 195 | + do { |
---|
| 196 | + ar933x_uart_write(up, AR933X_UART_DATA_REG, AR933X_UART_DATA_RX_CSR); |
---|
| 197 | + status = ar933x_uart_read(up, AR933X_UART_DATA_REG); |
---|
| 198 | + } while (status & AR933X_UART_DATA_RX_CSR); |
---|
141 | 199 | } |
---|
142 | 200 | |
---|
143 | 201 | static void ar933x_uart_stop_tx(struct uart_port *port) |
---|
.. | .. |
---|
153 | 211 | struct ar933x_uart_port *up = |
---|
154 | 212 | container_of(port, struct ar933x_uart_port, port); |
---|
155 | 213 | |
---|
156 | | - up->ier &= ~AR933X_UART_INT_RX_VALID; |
---|
157 | | - ar933x_uart_write(up, AR933X_UART_INT_EN_REG, up->ier); |
---|
| 214 | + ar933x_uart_stop_rx_interrupt(up); |
---|
158 | 215 | } |
---|
159 | 216 | |
---|
160 | 217 | static void ar933x_uart_break_ctl(struct uart_port *port, int break_state) |
---|
.. | .. |
---|
336 | 393 | static void ar933x_uart_tx_chars(struct ar933x_uart_port *up) |
---|
337 | 394 | { |
---|
338 | 395 | struct circ_buf *xmit = &up->port.state->xmit; |
---|
| 396 | + struct serial_rs485 *rs485conf = &up->port.rs485; |
---|
339 | 397 | int count; |
---|
| 398 | + bool half_duplex_send = false; |
---|
340 | 399 | |
---|
341 | 400 | if (uart_tx_stopped(&up->port)) |
---|
342 | 401 | return; |
---|
| 402 | + |
---|
| 403 | + if ((rs485conf->flags & SER_RS485_ENABLED) && |
---|
| 404 | + (up->port.x_char || !uart_circ_empty(xmit))) { |
---|
| 405 | + ar933x_uart_stop_rx_interrupt(up); |
---|
| 406 | + gpiod_set_value(up->rts_gpiod, !!(rs485conf->flags & SER_RS485_RTS_ON_SEND)); |
---|
| 407 | + half_duplex_send = true; |
---|
| 408 | + } |
---|
343 | 409 | |
---|
344 | 410 | count = up->port.fifosize; |
---|
345 | 411 | do { |
---|
.. | .. |
---|
368 | 434 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) |
---|
369 | 435 | uart_write_wakeup(&up->port); |
---|
370 | 436 | |
---|
371 | | - if (!uart_circ_empty(xmit)) |
---|
| 437 | + if (!uart_circ_empty(xmit)) { |
---|
372 | 438 | ar933x_uart_start_tx_interrupt(up); |
---|
| 439 | + } else if (half_duplex_send) { |
---|
| 440 | + ar933x_uart_wait_tx_complete(up); |
---|
| 441 | + ar933x_uart_rx_flush(up); |
---|
| 442 | + ar933x_uart_start_rx_interrupt(up); |
---|
| 443 | + gpiod_set_value(up->rts_gpiod, !!(rs485conf->flags & SER_RS485_RTS_AFTER_SEND)); |
---|
| 444 | + } |
---|
373 | 445 | } |
---|
374 | 446 | |
---|
375 | 447 | static irqreturn_t ar933x_uart_interrupt(int irq, void *dev_id) |
---|
.. | .. |
---|
427 | 499 | AR933X_UART_CS_TX_READY_ORIDE | AR933X_UART_CS_RX_READY_ORIDE); |
---|
428 | 500 | |
---|
429 | 501 | /* Enable RX interrupts */ |
---|
430 | | - up->ier = AR933X_UART_INT_RX_VALID; |
---|
431 | | - ar933x_uart_write(up, AR933X_UART_INT_EN_REG, up->ier); |
---|
| 502 | + ar933x_uart_start_rx_interrupt(up); |
---|
432 | 503 | |
---|
433 | 504 | spin_unlock_irqrestore(&up->port.lock, flags); |
---|
434 | 505 | |
---|
.. | .. |
---|
510 | 581 | .config_port = ar933x_uart_config_port, |
---|
511 | 582 | .verify_port = ar933x_uart_verify_port, |
---|
512 | 583 | }; |
---|
| 584 | + |
---|
| 585 | +static int ar933x_config_rs485(struct uart_port *port, |
---|
| 586 | + struct serial_rs485 *rs485conf) |
---|
| 587 | +{ |
---|
| 588 | + struct ar933x_uart_port *up = |
---|
| 589 | + container_of(port, struct ar933x_uart_port, port); |
---|
| 590 | + |
---|
| 591 | + if ((rs485conf->flags & SER_RS485_ENABLED) && |
---|
| 592 | + !up->rts_gpiod) { |
---|
| 593 | + dev_err(port->dev, "RS485 needs rts-gpio\n"); |
---|
| 594 | + return 1; |
---|
| 595 | + } |
---|
| 596 | + |
---|
| 597 | + if (rs485conf->flags & SER_RS485_ENABLED) |
---|
| 598 | + gpiod_set_value(up->rts_gpiod, |
---|
| 599 | + !!(rs485conf->flags & SER_RS485_RTS_AFTER_SEND)); |
---|
| 600 | + |
---|
| 601 | + port->rs485 = *rs485conf; |
---|
| 602 | + return 0; |
---|
| 603 | +} |
---|
513 | 604 | |
---|
514 | 605 | #ifdef CONFIG_SERIAL_AR933X_CONSOLE |
---|
515 | 606 | static struct ar933x_uart_port * |
---|
.. | .. |
---|
690 | 781 | port->regshift = 2; |
---|
691 | 782 | port->fifosize = AR933X_UART_FIFO_SIZE; |
---|
692 | 783 | port->ops = &ar933x_uart_ops; |
---|
| 784 | + port->rs485_config = ar933x_config_rs485; |
---|
693 | 785 | |
---|
694 | 786 | baud = ar933x_uart_get_baud(port->uartclk, AR933X_UART_MAX_SCALE, 1); |
---|
695 | 787 | up->min_baud = max_t(unsigned int, baud, AR933X_UART_MIN_BAUD); |
---|
.. | .. |
---|
697 | 789 | baud = ar933x_uart_get_baud(port->uartclk, 0, AR933X_UART_MAX_STEP); |
---|
698 | 790 | up->max_baud = min_t(unsigned int, baud, AR933X_UART_MAX_BAUD); |
---|
699 | 791 | |
---|
| 792 | + ret = uart_get_rs485_mode(port); |
---|
| 793 | + if (ret) |
---|
| 794 | + goto err_disable_clk; |
---|
| 795 | + |
---|
| 796 | + up->gpios = mctrl_gpio_init(port, 0); |
---|
| 797 | + if (IS_ERR(up->gpios) && PTR_ERR(up->gpios) != -ENOSYS) { |
---|
| 798 | + ret = PTR_ERR(up->gpios); |
---|
| 799 | + goto err_disable_clk; |
---|
| 800 | + } |
---|
| 801 | + |
---|
| 802 | + up->rts_gpiod = mctrl_gpio_to_gpiod(up->gpios, UART_GPIO_RTS); |
---|
| 803 | + |
---|
| 804 | + if ((port->rs485.flags & SER_RS485_ENABLED) && |
---|
| 805 | + !up->rts_gpiod) { |
---|
| 806 | + dev_err(&pdev->dev, "lacking rts-gpio, disabling RS485\n"); |
---|
| 807 | + port->rs485.flags &= ~SER_RS485_ENABLED; |
---|
| 808 | + } |
---|
| 809 | + |
---|
700 | 810 | #ifdef CONFIG_SERIAL_AR933X_CONSOLE |
---|
701 | 811 | ar933x_console_ports[up->port.line] = up; |
---|
702 | 812 | #endif |
---|