Commit 90efa75f authored by Alexander Shiyan's avatar Alexander Shiyan Committed by Greg Kroah-Hartman

serial: sccnxp: Using CLK API for getting UART clock

This patch removes "frequency" parameter from SCCNXP platform_data
and uses CLK API for getting clock. If CLK ommited, default IC
frequency will be used instead.
Signed-off-by: default avatarAlexander Shiyan <shc_work@mail.ru>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e087ab74
...@@ -122,7 +122,6 @@ static struct resource sc26xx_rsrc[] = { ...@@ -122,7 +122,6 @@ static struct resource sc26xx_rsrc[] = {
static struct sccnxp_pdata sccnxp_data = { static struct sccnxp_pdata sccnxp_data = {
.reg_shift = 2, .reg_shift = 2,
.frequency = 3686400,
.mctrl_cfg[0] = MCTRL_SIG(DTR_OP, LINE_OP7) | .mctrl_cfg[0] = MCTRL_SIG(DTR_OP, LINE_OP7) |
MCTRL_SIG(RTS_OP, LINE_OP3) | MCTRL_SIG(RTS_OP, LINE_OP3) |
MCTRL_SIG(DSR_IP, LINE_IP5) | MCTRL_SIG(DSR_IP, LINE_IP5) |
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#define SUPPORT_SYSRQ #define SUPPORT_SYSRQ
#endif #endif
#include <linux/clk.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/device.h> #include <linux/device.h>
...@@ -783,9 +784,10 @@ static int sccnxp_probe(struct platform_device *pdev) ...@@ -783,9 +784,10 @@ static int sccnxp_probe(struct platform_device *pdev)
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
int chiptype = pdev->id_entry->driver_data; int chiptype = pdev->id_entry->driver_data;
struct sccnxp_pdata *pdata = dev_get_platdata(&pdev->dev); struct sccnxp_pdata *pdata = dev_get_platdata(&pdev->dev);
int i, ret, fifosize, freq_min, freq_max; int i, ret, fifosize, freq_min, freq_max, uartclk;
struct sccnxp_port *s; struct sccnxp_port *s;
void __iomem *membase; void __iomem *membase;
struct clk *clk;
membase = devm_ioremap_resource(&pdev->dev, res); membase = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(membase)) if (IS_ERR(membase))
...@@ -898,11 +900,25 @@ static int sccnxp_probe(struct platform_device *pdev) ...@@ -898,11 +900,25 @@ static int sccnxp_probe(struct platform_device *pdev)
} else if (PTR_ERR(s->regulator) == -EPROBE_DEFER) } else if (PTR_ERR(s->regulator) == -EPROBE_DEFER)
return -EPROBE_DEFER; return -EPROBE_DEFER;
if (!pdata) { clk = devm_clk_get(&pdev->dev, NULL);
dev_warn(&pdev->dev, if (IS_ERR(clk)) {
"No platform data supplied, using defaults\n"); if (PTR_ERR(clk) == -EPROBE_DEFER) {
s->pdata.frequency = s->freq_std; ret = -EPROBE_DEFER;
goto err_out;
}
dev_notice(&pdev->dev, "Using default clock frequency\n");
uartclk = s->freq_std;
} else } else
uartclk = clk_get_rate(clk);
/* Check input frequency */
if ((uartclk < freq_min) || (uartclk > freq_max)) {
dev_err(&pdev->dev, "Frequency out of bounds\n");
ret = -EINVAL;
goto err_out;
}
if (pdata)
memcpy(&s->pdata, pdata, sizeof(struct sccnxp_pdata)); memcpy(&s->pdata, pdata, sizeof(struct sccnxp_pdata));
if (s->pdata.poll_time_us) { if (s->pdata.poll_time_us) {
...@@ -920,14 +936,6 @@ static int sccnxp_probe(struct platform_device *pdev) ...@@ -920,14 +936,6 @@ static int sccnxp_probe(struct platform_device *pdev)
} }
} }
/* Check input frequency */
if ((s->pdata.frequency < freq_min) ||
(s->pdata.frequency > freq_max)) {
dev_err(&pdev->dev, "Frequency out of bounds\n");
ret = -EINVAL;
goto err_out;
}
s->uart.owner = THIS_MODULE; s->uart.owner = THIS_MODULE;
s->uart.dev_name = "ttySC"; s->uart.dev_name = "ttySC";
s->uart.major = SCCNXP_MAJOR; s->uart.major = SCCNXP_MAJOR;
...@@ -959,7 +967,7 @@ static int sccnxp_probe(struct platform_device *pdev) ...@@ -959,7 +967,7 @@ static int sccnxp_probe(struct platform_device *pdev)
s->port[i].mapbase = res->start; s->port[i].mapbase = res->start;
s->port[i].membase = membase; s->port[i].membase = membase;
s->port[i].regshift = s->pdata.reg_shift; s->port[i].regshift = s->pdata.reg_shift;
s->port[i].uartclk = s->pdata.frequency; s->port[i].uartclk = uartclk;
s->port[i].ops = &sccnxp_ops; s->port[i].ops = &sccnxp_ops;
uart_add_one_port(&s->uart, &s->port[i]); uart_add_one_port(&s->uart, &s->port[i]);
/* Set direction to input */ /* Set direction to input */
......
...@@ -60,7 +60,6 @@ ...@@ -60,7 +60,6 @@
* }; * };
* *
* static struct sccnxp_pdata sc2892_info = { * static struct sccnxp_pdata sc2892_info = {
* .frequency = 3686400,
* .mctrl_cfg[0] = MCTRL_SIG(DIR_OP, LINE_OP0), * .mctrl_cfg[0] = MCTRL_SIG(DIR_OP, LINE_OP0),
* .mctrl_cfg[1] = MCTRL_SIG(DIR_OP, LINE_OP1), * .mctrl_cfg[1] = MCTRL_SIG(DIR_OP, LINE_OP1),
* }; * };
...@@ -78,8 +77,6 @@ ...@@ -78,8 +77,6 @@
/* SCCNXP platform data structure */ /* SCCNXP platform data structure */
struct sccnxp_pdata { struct sccnxp_pdata {
/* Frequency (extrenal clock or crystal) */
int frequency;
/* Shift for A0 line */ /* Shift for A0 line */
const u8 reg_shift; const u8 reg_shift;
/* Modem control lines configuration */ /* Modem control lines configuration */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment