mirror of
https://github.com/torvalds/linux.git
synced 2024-11-16 17:12:06 +00:00
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: Alexander Shiyan <shc_work@mail.ru> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
e087ab74f3
commit
90efa75f7a
@ -122,7 +122,6 @@ static struct resource sc26xx_rsrc[] = {
|
||||
|
||||
static struct sccnxp_pdata sccnxp_data = {
|
||||
.reg_shift = 2,
|
||||
.frequency = 3686400,
|
||||
.mctrl_cfg[0] = MCTRL_SIG(DTR_OP, LINE_OP7) |
|
||||
MCTRL_SIG(RTS_OP, LINE_OP3) |
|
||||
MCTRL_SIG(DSR_IP, LINE_IP5) |
|
||||
|
@ -15,6 +15,7 @@
|
||||
#define SUPPORT_SYSRQ
|
||||
#endif
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
@ -783,9 +784,10 @@ static int sccnxp_probe(struct platform_device *pdev)
|
||||
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
int chiptype = pdev->id_entry->driver_data;
|
||||
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;
|
||||
void __iomem *membase;
|
||||
struct clk *clk;
|
||||
|
||||
membase = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(membase))
|
||||
@ -898,11 +900,25 @@ static int sccnxp_probe(struct platform_device *pdev)
|
||||
} else if (PTR_ERR(s->regulator) == -EPROBE_DEFER)
|
||||
return -EPROBE_DEFER;
|
||||
|
||||
if (!pdata) {
|
||||
dev_warn(&pdev->dev,
|
||||
"No platform data supplied, using defaults\n");
|
||||
s->pdata.frequency = s->freq_std;
|
||||
clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(clk)) {
|
||||
if (PTR_ERR(clk) == -EPROBE_DEFER) {
|
||||
ret = -EPROBE_DEFER;
|
||||
goto err_out;
|
||||
}
|
||||
dev_notice(&pdev->dev, "Using default clock frequency\n");
|
||||
uartclk = s->freq_std;
|
||||
} 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));
|
||||
|
||||
if (s->pdata.poll_time_us) {
|
||||
@ -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.dev_name = "ttySC";
|
||||
s->uart.major = SCCNXP_MAJOR;
|
||||
@ -959,7 +967,7 @@ static int sccnxp_probe(struct platform_device *pdev)
|
||||
s->port[i].mapbase = res->start;
|
||||
s->port[i].membase = membase;
|
||||
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;
|
||||
uart_add_one_port(&s->uart, &s->port[i]);
|
||||
/* Set direction to input */
|
||||
|
@ -60,7 +60,6 @@
|
||||
* };
|
||||
*
|
||||
* static struct sccnxp_pdata sc2892_info = {
|
||||
* .frequency = 3686400,
|
||||
* .mctrl_cfg[0] = MCTRL_SIG(DIR_OP, LINE_OP0),
|
||||
* .mctrl_cfg[1] = MCTRL_SIG(DIR_OP, LINE_OP1),
|
||||
* };
|
||||
@ -78,8 +77,6 @@
|
||||
|
||||
/* SCCNXP platform data structure */
|
||||
struct sccnxp_pdata {
|
||||
/* Frequency (extrenal clock or crystal) */
|
||||
int frequency;
|
||||
/* Shift for A0 line */
|
||||
const u8 reg_shift;
|
||||
/* Modem control lines configuration */
|
||||
|
Loading…
Reference in New Issue
Block a user