| .. | .. |
|---|
| 12 | 12 | |
|---|
| 13 | 13 | #include "8250.h" |
|---|
| 14 | 14 | |
|---|
| 15 | | -/* Most (but not all) of UniPhier UART devices have 64-depth FIFO. */ |
|---|
| 16 | | -#define UNIPHIER_UART_DEFAULT_FIFO_SIZE 64 |
|---|
| 17 | | - |
|---|
| 18 | 15 | /* |
|---|
| 19 | 16 | * This hardware is similar to 8250, but its register map is a bit different: |
|---|
| 20 | 17 | * - MMIO32 (regshift = 2) |
|---|
| .. | .. |
|---|
| 78 | 75 | break; |
|---|
| 79 | 76 | case UART_LCR: |
|---|
| 80 | 77 | valshift = 8; |
|---|
| 81 | | - /* fall through */ |
|---|
| 78 | + fallthrough; |
|---|
| 82 | 79 | case UART_MCR: |
|---|
| 83 | 80 | offset = UNIPHIER_UART_LCR_MCR; |
|---|
| 84 | 81 | break; |
|---|
| .. | .. |
|---|
| 104 | 101 | case UART_SCR: |
|---|
| 105 | 102 | /* No SCR for this hardware. Use CHAR as a scratch register */ |
|---|
| 106 | 103 | valshift = 8; |
|---|
| 107 | | - /* fall through */ |
|---|
| 104 | + fallthrough; |
|---|
| 108 | 105 | case UART_FCR: |
|---|
| 109 | 106 | offset = UNIPHIER_UART_CHAR_FCR; |
|---|
| 110 | 107 | break; |
|---|
| .. | .. |
|---|
| 112 | 109 | valshift = 8; |
|---|
| 113 | 110 | /* Divisor latch access bit does not exist. */ |
|---|
| 114 | 111 | value &= ~UART_LCR_DLAB; |
|---|
| 115 | | - /* fall through */ |
|---|
| 112 | + fallthrough; |
|---|
| 116 | 113 | case UART_MCR: |
|---|
| 117 | 114 | offset = UNIPHIER_UART_LCR_MCR; |
|---|
| 118 | 115 | break; |
|---|
| .. | .. |
|---|
| 158 | 155 | writel(value, up->port.membase + UNIPHIER_UART_DLR); |
|---|
| 159 | 156 | } |
|---|
| 160 | 157 | |
|---|
| 161 | | -static int uniphier_of_serial_setup(struct device *dev, struct uart_port *port, |
|---|
| 162 | | - struct uniphier8250_priv *priv) |
|---|
| 163 | | -{ |
|---|
| 164 | | - int ret; |
|---|
| 165 | | - u32 prop; |
|---|
| 166 | | - struct device_node *np = dev->of_node; |
|---|
| 167 | | - |
|---|
| 168 | | - ret = of_alias_get_id(np, "serial"); |
|---|
| 169 | | - if (ret < 0) { |
|---|
| 170 | | - dev_err(dev, "failed to get alias id\n"); |
|---|
| 171 | | - return ret; |
|---|
| 172 | | - } |
|---|
| 173 | | - port->line = ret; |
|---|
| 174 | | - |
|---|
| 175 | | - /* Get clk rate through clk driver */ |
|---|
| 176 | | - priv->clk = devm_clk_get(dev, NULL); |
|---|
| 177 | | - if (IS_ERR(priv->clk)) { |
|---|
| 178 | | - dev_err(dev, "failed to get clock\n"); |
|---|
| 179 | | - return PTR_ERR(priv->clk); |
|---|
| 180 | | - } |
|---|
| 181 | | - |
|---|
| 182 | | - ret = clk_prepare_enable(priv->clk); |
|---|
| 183 | | - if (ret < 0) |
|---|
| 184 | | - return ret; |
|---|
| 185 | | - |
|---|
| 186 | | - port->uartclk = clk_get_rate(priv->clk); |
|---|
| 187 | | - |
|---|
| 188 | | - /* Check for fifo size */ |
|---|
| 189 | | - if (of_property_read_u32(np, "fifo-size", &prop) == 0) |
|---|
| 190 | | - port->fifosize = prop; |
|---|
| 191 | | - else |
|---|
| 192 | | - port->fifosize = UNIPHIER_UART_DEFAULT_FIFO_SIZE; |
|---|
| 193 | | - |
|---|
| 194 | | - return 0; |
|---|
| 195 | | -} |
|---|
| 196 | | - |
|---|
| 197 | 158 | static int uniphier_uart_probe(struct platform_device *pdev) |
|---|
| 198 | 159 | { |
|---|
| 199 | 160 | struct device *dev = &pdev->dev; |
|---|
| .. | .. |
|---|
| 215 | 176 | return -ENOMEM; |
|---|
| 216 | 177 | |
|---|
| 217 | 178 | irq = platform_get_irq(pdev, 0); |
|---|
| 218 | | - if (irq < 0) { |
|---|
| 219 | | - dev_err(dev, "failed to get IRQ number\n"); |
|---|
| 179 | + if (irq < 0) |
|---|
| 220 | 180 | return irq; |
|---|
| 221 | | - } |
|---|
| 222 | 181 | |
|---|
| 223 | 182 | priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); |
|---|
| 224 | 183 | if (!priv) |
|---|
| .. | .. |
|---|
| 226 | 185 | |
|---|
| 227 | 186 | memset(&up, 0, sizeof(up)); |
|---|
| 228 | 187 | |
|---|
| 229 | | - ret = uniphier_of_serial_setup(dev, &up.port, priv); |
|---|
| 230 | | - if (ret < 0) |
|---|
| 188 | + ret = of_alias_get_id(dev->of_node, "serial"); |
|---|
| 189 | + if (ret < 0) { |
|---|
| 190 | + dev_err(dev, "failed to get alias id\n"); |
|---|
| 231 | 191 | return ret; |
|---|
| 192 | + } |
|---|
| 193 | + up.port.line = ret; |
|---|
| 194 | + |
|---|
| 195 | + priv->clk = devm_clk_get(dev, NULL); |
|---|
| 196 | + if (IS_ERR(priv->clk)) { |
|---|
| 197 | + dev_err(dev, "failed to get clock\n"); |
|---|
| 198 | + return PTR_ERR(priv->clk); |
|---|
| 199 | + } |
|---|
| 200 | + |
|---|
| 201 | + ret = clk_prepare_enable(priv->clk); |
|---|
| 202 | + if (ret) |
|---|
| 203 | + return ret; |
|---|
| 204 | + |
|---|
| 205 | + up.port.uartclk = clk_get_rate(priv->clk); |
|---|
| 232 | 206 | |
|---|
| 233 | 207 | spin_lock_init(&priv->atomic_write_lock); |
|---|
| 234 | 208 | |
|---|
| .. | .. |
|---|
| 241 | 215 | |
|---|
| 242 | 216 | up.port.type = PORT_16550A; |
|---|
| 243 | 217 | up.port.iotype = UPIO_MEM32; |
|---|
| 218 | + up.port.fifosize = 64; |
|---|
| 244 | 219 | up.port.regshift = UNIPHIER_UART_REGSHIFT; |
|---|
| 245 | 220 | up.port.flags = UPF_FIXED_PORT | UPF_FIXED_TYPE; |
|---|
| 246 | 221 | up.capabilities = UART_CAP_FIFO; |
|---|
| 247 | 222 | |
|---|
| 223 | + if (of_property_read_bool(dev->of_node, "auto-flow-control")) |
|---|
| 224 | + up.capabilities |= UART_CAP_AFE; |
|---|
| 225 | + |
|---|
| 248 | 226 | up.port.serial_in = uniphier_serial_in; |
|---|
| 249 | 227 | up.port.serial_out = uniphier_serial_out; |
|---|
| 250 | 228 | up.dl_read = uniphier_serial_dl_read; |
|---|