| .. | .. |
|---|
| 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 |
|---|