| .. | .. |
|---|
| 129 | 129 | return 0; |
|---|
| 130 | 130 | } |
|---|
| 131 | 131 | |
|---|
| 132 | | -EARLYCON_DECLARE(jz4740_uart, ingenic_early_console_setup); |
|---|
| 133 | 132 | OF_EARLYCON_DECLARE(jz4740_uart, "ingenic,jz4740-uart", |
|---|
| 134 | 133 | ingenic_early_console_setup); |
|---|
| 135 | 134 | |
|---|
| 136 | | -EARLYCON_DECLARE(jz4770_uart, ingenic_early_console_setup); |
|---|
| 137 | 135 | OF_EARLYCON_DECLARE(jz4770_uart, "ingenic,jz4770-uart", |
|---|
| 138 | 136 | ingenic_early_console_setup); |
|---|
| 139 | 137 | |
|---|
| 140 | | -EARLYCON_DECLARE(jz4775_uart, ingenic_early_console_setup); |
|---|
| 141 | 138 | OF_EARLYCON_DECLARE(jz4775_uart, "ingenic,jz4775-uart", |
|---|
| 142 | 139 | ingenic_early_console_setup); |
|---|
| 143 | 140 | |
|---|
| 144 | | -EARLYCON_DECLARE(jz4780_uart, ingenic_early_console_setup); |
|---|
| 145 | 141 | OF_EARLYCON_DECLARE(jz4780_uart, "ingenic,jz4780-uart", |
|---|
| 142 | + ingenic_early_console_setup); |
|---|
| 143 | + |
|---|
| 144 | +OF_EARLYCON_DECLARE(x1000_uart, "ingenic,x1000-uart", |
|---|
| 146 | 145 | ingenic_early_console_setup); |
|---|
| 147 | 146 | |
|---|
| 148 | 147 | static void ingenic_uart_serial_out(struct uart_port *p, int offset, int value) |
|---|
| 149 | 148 | { |
|---|
| 149 | + unsigned int flags; |
|---|
| 150 | + bool is_console; |
|---|
| 150 | 151 | int ier; |
|---|
| 151 | 152 | |
|---|
| 152 | 153 | switch (offset) { |
|---|
| .. | .. |
|---|
| 168 | 169 | * If we have enabled modem status IRQs we should enable |
|---|
| 169 | 170 | * modem mode. |
|---|
| 170 | 171 | */ |
|---|
| 172 | + is_console = uart_console(p); |
|---|
| 173 | + if (is_console) |
|---|
| 174 | + console_atomic_lock(&flags); |
|---|
| 171 | 175 | ier = p->serial_in(p, UART_IER); |
|---|
| 176 | + if (is_console) |
|---|
| 177 | + console_atomic_unlock(flags); |
|---|
| 172 | 178 | |
|---|
| 173 | 179 | if (ier & UART_IER_MSI) |
|---|
| 174 | 180 | value |= UART_MCR_MDCE | UART_MCR_FCM; |
|---|
| .. | .. |
|---|
| 208 | 214 | static int ingenic_uart_probe(struct platform_device *pdev) |
|---|
| 209 | 215 | { |
|---|
| 210 | 216 | struct uart_8250_port uart = {}; |
|---|
| 211 | | - struct resource *regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|---|
| 212 | | - struct resource *irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
|---|
| 213 | 217 | struct ingenic_uart_data *data; |
|---|
| 214 | 218 | const struct ingenic_uart_config *cdata; |
|---|
| 215 | 219 | const struct of_device_id *match; |
|---|
| 216 | | - int err, line; |
|---|
| 220 | + struct resource *regs; |
|---|
| 221 | + int irq, err, line; |
|---|
| 217 | 222 | |
|---|
| 218 | 223 | match = of_match_device(of_match, &pdev->dev); |
|---|
| 219 | 224 | if (!match) { |
|---|
| .. | .. |
|---|
| 222 | 227 | } |
|---|
| 223 | 228 | cdata = match->data; |
|---|
| 224 | 229 | |
|---|
| 225 | | - if (!regs || !irq) { |
|---|
| 226 | | - dev_err(&pdev->dev, "no registers/irq defined\n"); |
|---|
| 230 | + irq = platform_get_irq(pdev, 0); |
|---|
| 231 | + if (irq < 0) |
|---|
| 232 | + return irq; |
|---|
| 233 | + |
|---|
| 234 | + regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|---|
| 235 | + if (!regs) { |
|---|
| 236 | + dev_err(&pdev->dev, "no registers defined\n"); |
|---|
| 227 | 237 | return -EINVAL; |
|---|
| 228 | 238 | } |
|---|
| 229 | 239 | |
|---|
| .. | .. |
|---|
| 239 | 249 | uart.port.regshift = 2; |
|---|
| 240 | 250 | uart.port.serial_out = ingenic_uart_serial_out; |
|---|
| 241 | 251 | uart.port.serial_in = ingenic_uart_serial_in; |
|---|
| 242 | | - uart.port.irq = irq->start; |
|---|
| 252 | + uart.port.irq = irq; |
|---|
| 243 | 253 | uart.port.dev = &pdev->dev; |
|---|
| 244 | 254 | uart.port.fifosize = cdata->fifosize; |
|---|
| 245 | 255 | uart.tx_loadsz = cdata->tx_loadsz; |
|---|
| .. | .. |
|---|
| 256 | 266 | return -ENOMEM; |
|---|
| 257 | 267 | |
|---|
| 258 | 268 | data->clk_module = devm_clk_get(&pdev->dev, "module"); |
|---|
| 259 | | - if (IS_ERR(data->clk_module)) { |
|---|
| 260 | | - err = PTR_ERR(data->clk_module); |
|---|
| 261 | | - if (err != -EPROBE_DEFER) |
|---|
| 262 | | - dev_err(&pdev->dev, |
|---|
| 263 | | - "unable to get module clock: %d\n", err); |
|---|
| 264 | | - return err; |
|---|
| 265 | | - } |
|---|
| 269 | + if (IS_ERR(data->clk_module)) |
|---|
| 270 | + return dev_err_probe(&pdev->dev, PTR_ERR(data->clk_module), |
|---|
| 271 | + "unable to get module clock\n"); |
|---|
| 266 | 272 | |
|---|
| 267 | 273 | data->clk_baud = devm_clk_get(&pdev->dev, "baud"); |
|---|
| 268 | | - if (IS_ERR(data->clk_baud)) { |
|---|
| 269 | | - err = PTR_ERR(data->clk_baud); |
|---|
| 270 | | - if (err != -EPROBE_DEFER) |
|---|
| 271 | | - dev_err(&pdev->dev, |
|---|
| 272 | | - "unable to get baud clock: %d\n", err); |
|---|
| 273 | | - return err; |
|---|
| 274 | | - } |
|---|
| 274 | + if (IS_ERR(data->clk_baud)) |
|---|
| 275 | + return dev_err_probe(&pdev->dev, PTR_ERR(data->clk_baud), |
|---|
| 276 | + "unable to get baud clock\n"); |
|---|
| 275 | 277 | |
|---|
| 276 | 278 | err = clk_prepare_enable(data->clk_module); |
|---|
| 277 | 279 | if (err) { |
|---|
| .. | .. |
|---|
| 328 | 330 | .fifosize = 64, |
|---|
| 329 | 331 | }; |
|---|
| 330 | 332 | |
|---|
| 333 | +static const struct ingenic_uart_config x1000_uart_config = { |
|---|
| 334 | + .tx_loadsz = 32, |
|---|
| 335 | + .fifosize = 64, |
|---|
| 336 | +}; |
|---|
| 337 | + |
|---|
| 331 | 338 | static const struct of_device_id of_match[] = { |
|---|
| 332 | 339 | { .compatible = "ingenic,jz4740-uart", .data = &jz4740_uart_config }, |
|---|
| 333 | 340 | { .compatible = "ingenic,jz4760-uart", .data = &jz4760_uart_config }, |
|---|
| 334 | 341 | { .compatible = "ingenic,jz4770-uart", .data = &jz4760_uart_config }, |
|---|
| 335 | 342 | { .compatible = "ingenic,jz4775-uart", .data = &jz4760_uart_config }, |
|---|
| 336 | 343 | { .compatible = "ingenic,jz4780-uart", .data = &jz4780_uart_config }, |
|---|
| 344 | + { .compatible = "ingenic,x1000-uart", .data = &x1000_uart_config }, |
|---|
| 337 | 345 | { /* sentinel */ } |
|---|
| 338 | 346 | }; |
|---|
| 339 | 347 | MODULE_DEVICE_TABLE(of, of_match); |
|---|