|
@@ -584,6 +584,23 @@ static int vt8500_serial_probe(struct platform_device *pdev)
|
|
|
if (!vt8500_port)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
+ vt8500_port->uart.membase = devm_request_and_ioremap(&pdev->dev, mmres);
|
|
|
+ if (!vt8500_port->uart.membase)
|
|
|
+ return -EADDRNOTAVAIL;
|
|
|
+
|
|
|
+ vt8500_port->clk = of_clk_get(pdev->dev.of_node, 0);
|
|
|
+ if (IS_ERR(vt8500_port->clk)) {
|
|
|
+ dev_err(&pdev->dev, "failed to get clock\n");
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = clk_prepare_enable(vt8500_port->clk);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(&pdev->dev, "failed to enable clock\n");
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+
|
|
|
vt8500_port->uart.type = PORT_VT8500;
|
|
|
vt8500_port->uart.iotype = UPIO_MEM;
|
|
|
vt8500_port->uart.mapbase = mmres->start;
|
|
@@ -593,25 +610,11 @@ static int vt8500_serial_probe(struct platform_device *pdev)
|
|
|
vt8500_port->uart.line = port;
|
|
|
vt8500_port->uart.dev = &pdev->dev;
|
|
|
vt8500_port->uart.flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF;
|
|
|
-
|
|
|
- vt8500_port->clk = of_clk_get(pdev->dev.of_node, 0);
|
|
|
- if (vt8500_port->clk) {
|
|
|
- vt8500_port->uart.uartclk = clk_get_rate(vt8500_port->clk);
|
|
|
- } else {
|
|
|
- /* use the default of 24Mhz if not specified and warn */
|
|
|
- pr_warn("%s: serial clock source not specified\n", __func__);
|
|
|
- vt8500_port->uart.uartclk = 24000000;
|
|
|
- }
|
|
|
+ vt8500_port->uart.uartclk = clk_get_rate(vt8500_port->clk);
|
|
|
|
|
|
snprintf(vt8500_port->name, sizeof(vt8500_port->name),
|
|
|
"VT8500 UART%d", pdev->id);
|
|
|
|
|
|
- vt8500_port->uart.membase = devm_request_and_ioremap(&pdev->dev, mmres);
|
|
|
- if (!vt8500_port->uart.membase) {
|
|
|
- ret = -EADDRNOTAVAIL;
|
|
|
- goto err;
|
|
|
- }
|
|
|
-
|
|
|
vt8500_uart_ports[port] = vt8500_port;
|
|
|
|
|
|
uart_add_one_port(&vt8500_uart_driver, &vt8500_port->uart);
|
|
@@ -630,6 +633,7 @@ static int vt8500_serial_remove(struct platform_device *pdev)
|
|
|
struct vt8500_port *vt8500_port = platform_get_drvdata(pdev);
|
|
|
|
|
|
platform_set_drvdata(pdev, NULL);
|
|
|
+ clk_disable_unprepare(vt8500_port->clk);
|
|
|
uart_remove_one_port(&vt8500_uart_driver, &vt8500_port->uart);
|
|
|
kfree(vt8500_port);
|
|
|
|