.. | .. |
---|
367 | 367 | if (sp->rx_dma.virt) |
---|
368 | 368 | dma_free_coherent(sp->port.dev, SPRD_UART_RX_SIZE, |
---|
369 | 369 | sp->rx_dma.virt, sp->rx_dma.phys_addr); |
---|
370 | | - |
---|
| 370 | + sp->rx_dma.virt = NULL; |
---|
371 | 371 | } |
---|
372 | 372 | |
---|
373 | 373 | static int sprd_rx_dma_config(struct uart_port *port, u32 burst) |
---|
.. | .. |
---|
1133 | 1133 | static int sprd_clk_init(struct uart_port *uport) |
---|
1134 | 1134 | { |
---|
1135 | 1135 | struct clk *clk_uart, *clk_parent; |
---|
1136 | | - struct sprd_uart_port *u = sprd_port[uport->line]; |
---|
| 1136 | + struct sprd_uart_port *u = container_of(uport, struct sprd_uart_port, port); |
---|
1137 | 1137 | |
---|
1138 | 1138 | clk_uart = devm_clk_get(uport->dev, "uart"); |
---|
1139 | 1139 | if (IS_ERR(clk_uart)) { |
---|
.. | .. |
---|
1176 | 1176 | { |
---|
1177 | 1177 | struct resource *res; |
---|
1178 | 1178 | struct uart_port *up; |
---|
| 1179 | + struct sprd_uart_port *sport; |
---|
1179 | 1180 | int irq; |
---|
1180 | 1181 | int index; |
---|
1181 | 1182 | int ret; |
---|
1182 | 1183 | |
---|
1183 | 1184 | index = of_alias_get_id(pdev->dev.of_node, "serial"); |
---|
1184 | | - if (index < 0 || index >= ARRAY_SIZE(sprd_port)) { |
---|
| 1185 | + if (index < 0 || index >= UART_NR_MAX) { |
---|
1185 | 1186 | dev_err(&pdev->dev, "got a wrong serial alias id %d\n", index); |
---|
1186 | 1187 | return -EINVAL; |
---|
1187 | 1188 | } |
---|
1188 | 1189 | |
---|
1189 | | - sprd_port[index] = devm_kzalloc(&pdev->dev, sizeof(*sprd_port[index]), |
---|
1190 | | - GFP_KERNEL); |
---|
1191 | | - if (!sprd_port[index]) |
---|
| 1190 | + sport = devm_kzalloc(&pdev->dev, sizeof(*sport), GFP_KERNEL); |
---|
| 1191 | + if (!sport) |
---|
1192 | 1192 | return -ENOMEM; |
---|
1193 | 1193 | |
---|
1194 | | - up = &sprd_port[index]->port; |
---|
| 1194 | + up = &sport->port; |
---|
1195 | 1195 | up->dev = &pdev->dev; |
---|
1196 | 1196 | up->line = index; |
---|
1197 | 1197 | up->type = PORT_SPRD; |
---|
.. | .. |
---|
1222 | 1222 | * Allocate one dma buffer to prepare for receive transfer, in case |
---|
1223 | 1223 | * memory allocation failure at runtime. |
---|
1224 | 1224 | */ |
---|
1225 | | - ret = sprd_rx_alloc_buf(sprd_port[index]); |
---|
| 1225 | + ret = sprd_rx_alloc_buf(sport); |
---|
1226 | 1226 | if (ret) |
---|
1227 | 1227 | return ret; |
---|
1228 | 1228 | |
---|
.. | .. |
---|
1230 | 1230 | ret = uart_register_driver(&sprd_uart_driver); |
---|
1231 | 1231 | if (ret < 0) { |
---|
1232 | 1232 | pr_err("Failed to register SPRD-UART driver\n"); |
---|
1233 | | - return ret; |
---|
| 1233 | + goto free_rx_buf; |
---|
1234 | 1234 | } |
---|
1235 | 1235 | } |
---|
| 1236 | + |
---|
1236 | 1237 | sprd_ports_num++; |
---|
| 1238 | + sprd_port[index] = sport; |
---|
1237 | 1239 | |
---|
1238 | 1240 | ret = uart_add_one_port(&sprd_uart_driver, up); |
---|
1239 | 1241 | if (ret) |
---|
1240 | | - sprd_remove(pdev); |
---|
| 1242 | + goto clean_port; |
---|
1241 | 1243 | |
---|
1242 | 1244 | platform_set_drvdata(pdev, up); |
---|
1243 | 1245 | |
---|
| 1246 | + return 0; |
---|
| 1247 | + |
---|
| 1248 | +clean_port: |
---|
| 1249 | + sprd_port[index] = NULL; |
---|
| 1250 | + if (--sprd_ports_num == 0) |
---|
| 1251 | + uart_unregister_driver(&sprd_uart_driver); |
---|
| 1252 | +free_rx_buf: |
---|
| 1253 | + sprd_rx_free_buf(sport); |
---|
1244 | 1254 | return ret; |
---|
1245 | 1255 | } |
---|
1246 | 1256 | |
---|