|
@@ -59,6 +59,7 @@ struct dw8250_data {
|
|
|
int last_mcr;
|
|
|
int line;
|
|
|
struct clk *clk;
|
|
|
+ struct clk *pclk;
|
|
|
struct uart_8250_dma dma;
|
|
|
};
|
|
|
|
|
@@ -359,10 +360,25 @@ static int dw8250_probe(struct platform_device *pdev)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
data->usr_reg = DW_UART_USR;
|
|
|
- data->clk = devm_clk_get(&pdev->dev, NULL);
|
|
|
+ data->clk = devm_clk_get(&pdev->dev, "baudclk");
|
|
|
+ if (IS_ERR(data->clk))
|
|
|
+ data->clk = devm_clk_get(&pdev->dev, NULL);
|
|
|
if (!IS_ERR(data->clk)) {
|
|
|
- clk_prepare_enable(data->clk);
|
|
|
- uart.port.uartclk = clk_get_rate(data->clk);
|
|
|
+ err = clk_prepare_enable(data->clk);
|
|
|
+ if (err)
|
|
|
+ dev_warn(&pdev->dev, "could not enable optional baudclk: %d\n",
|
|
|
+ err);
|
|
|
+ else
|
|
|
+ uart.port.uartclk = clk_get_rate(data->clk);
|
|
|
+ }
|
|
|
+
|
|
|
+ data->pclk = devm_clk_get(&pdev->dev, "apb_pclk");
|
|
|
+ if (!IS_ERR(data->pclk)) {
|
|
|
+ err = clk_prepare_enable(data->pclk);
|
|
|
+ if (err) {
|
|
|
+ dev_err(&pdev->dev, "could not enable apb_pclk\n");
|
|
|
+ return err;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
data->dma.rx_chan_id = -1;
|
|
@@ -408,6 +424,9 @@ static int dw8250_remove(struct platform_device *pdev)
|
|
|
|
|
|
serial8250_unregister_port(data->line);
|
|
|
|
|
|
+ if (!IS_ERR(data->pclk))
|
|
|
+ clk_disable_unprepare(data->pclk);
|
|
|
+
|
|
|
if (!IS_ERR(data->clk))
|
|
|
clk_disable_unprepare(data->clk);
|
|
|
|
|
@@ -445,6 +464,9 @@ static int dw8250_runtime_suspend(struct device *dev)
|
|
|
if (!IS_ERR(data->clk))
|
|
|
clk_disable_unprepare(data->clk);
|
|
|
|
|
|
+ if (!IS_ERR(data->pclk))
|
|
|
+ clk_disable_unprepare(data->pclk);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -452,6 +474,9 @@ static int dw8250_runtime_resume(struct device *dev)
|
|
|
{
|
|
|
struct dw8250_data *data = dev_get_drvdata(dev);
|
|
|
|
|
|
+ if (!IS_ERR(data->pclk))
|
|
|
+ clk_prepare_enable(data->pclk);
|
|
|
+
|
|
|
if (!IS_ERR(data->clk))
|
|
|
clk_prepare_enable(data->clk);
|
|
|
|