static int sprd_probe(struct platform_device *pdev) { struct resource *res; struct uart_port *up; struct clk *clk; int irq; int index; int ret; for (index = 0; index < ARRAY_SIZE(sprd_port); index++) if (sprd_port[index] == NULL) break; if (index == ARRAY_SIZE(sprd_port)) return -EBUSY; index = sprd_probe_dt_alias(index, &pdev->dev); sprd_port[index] = devm_kzalloc(&pdev->dev, sizeof(*sprd_port[index]), GFP_KERNEL); if (!sprd_port[index]) return -ENOMEM; up = &sprd_port[index]->port; up->dev = &pdev->dev; up->line = index; up->type = PORT_SPRD; up->iotype = UPIO_MEM; up->uartclk = SPRD_DEF_RATE; up->fifosize = SPRD_FIFO_SIZE; up->ops = &serial_sprd_ops; up->flags = UPF_BOOT_AUTOCONF; clk = devm_clk_get(&pdev->dev, NULL); if (!IS_ERR_OR_NULL(clk)) up->uartclk = clk_get_rate(clk); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(&pdev->dev, "not provide mem resource\n"); return -ENODEV; } up->mapbase = res->start; up->membase = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(up->membase)) return PTR_ERR(up->membase); irq = platform_get_irq(pdev, 0); if (irq < 0) { dev_err(&pdev->dev, "not provide irq resource\n"); return -ENODEV; } up->irq = irq; if (!sprd_ports_num) { ret = uart_register_driver(&sprd_uart_driver); if (ret < 0) { pr_err("Failed to register SPRD-UART driver\n"); return ret; } } sprd_ports_num++; ret = uart_add_one_port(&sprd_uart_driver, up); if (ret) { sprd_port[index] = NULL; sprd_remove(pdev); } platform_set_drvdata(pdev, up); return ret; }
static int sprd_probe(struct platform_device *pdev) { struct resource *res; struct uart_port *up; int irq; int index; int ret; for (index = 0; index < ARRAY_SIZE(sprd_port); index++) if (sprd_port[index] == NULL) break; if (index == ARRAY_SIZE(sprd_port)) return -EBUSY; index = sprd_probe_dt_alias(index, &pdev->dev); sprd_port[index] = devm_kzalloc(&pdev->dev, sizeof(*sprd_port[index]), GFP_KERNEL); if (!sprd_port[index]) return -ENOMEM; up = &sprd_port[index]->port; up->dev = &pdev->dev; up->line = index; up->type = PORT_SPRD; up->iotype = UPIO_MEM; up->uartclk = SPRD_DEF_RATE; up->fifosize = SPRD_FIFO_SIZE; up->ops = &serial_sprd_ops; up->flags = UPF_BOOT_AUTOCONF; ret = sprd_clk_init(up); if (ret) return ret; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); up->membase = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(up->membase)) return PTR_ERR(up->membase); up->mapbase = res->start; irq = platform_get_irq(pdev, 0); if (irq < 0) { dev_err(&pdev->dev, "not provide irq resource: %d\n", irq); return irq; } up->irq = irq; /* * Allocate one dma buffer to prepare for receive transfer, in case * memory allocation failure at runtime. */ ret = sprd_rx_alloc_buf(sprd_port[index]); if (ret) return ret; if (!sprd_ports_num) { ret = uart_register_driver(&sprd_uart_driver); if (ret < 0) { pr_err("Failed to register SPRD-UART driver\n"); return ret; } } sprd_ports_num++; ret = uart_add_one_port(&sprd_uart_driver, up); if (ret) { sprd_port[index] = NULL; sprd_remove(pdev); } platform_set_drvdata(pdev, up); return ret; }