Commit 80776554 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Kumar Gala

cpm_uart: Add generic clock API support to set baudrates

This patch introduces baudrate setting support via the generic clock API.
When present the optional device tree clock property is used instead of
fsl-cpm-brg. Platforms can then define complex clock schemes, to output
the serial clock on an external pin for instance.
Signed-off-by: default avatarLaurent Pinchart <laurentp@cse-semaphore.com>
Signed-off-by: default avatarKumar Gala <galak@kernel.crashing.org>
parent 7485d26b
...@@ -283,6 +283,7 @@ config FSL_ULI1575 ...@@ -283,6 +283,7 @@ config FSL_ULI1575
config CPM config CPM
bool bool
select PPC_CLOCK
config OF_RTC config OF_RTC
bool bool
......
...@@ -77,6 +77,7 @@ struct uart_cpm_port { ...@@ -77,6 +77,7 @@ struct uart_cpm_port {
unsigned char *rx_buf; unsigned char *rx_buf;
u32 flags; u32 flags;
void (*set_lineif)(struct uart_cpm_port *); void (*set_lineif)(struct uart_cpm_port *);
struct clk *clk;
u8 brg; u8 brg;
uint dp_addr; uint dp_addr;
void *mem_addr; void *mem_addr;
......
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/of_gpio.h> #include <linux/of_gpio.h>
#include <linux/clk.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/irq.h> #include <asm/irq.h>
...@@ -596,7 +597,10 @@ static void cpm_uart_set_termios(struct uart_port *port, ...@@ -596,7 +597,10 @@ static void cpm_uart_set_termios(struct uart_port *port,
out_be16(&sccp->scc_psmr, (sbits << 12) | scval); out_be16(&sccp->scc_psmr, (sbits << 12) | scval);
} }
cpm_set_brg(pinfo->brg - 1, baud); if (pinfo->clk)
clk_set_rate(pinfo->clk, baud);
else
cpm_set_brg(pinfo->brg - 1, baud);
spin_unlock_irqrestore(&port->lock, flags); spin_unlock_irqrestore(&port->lock, flags);
} }
...@@ -1023,13 +1027,21 @@ static int cpm_uart_init_port(struct device_node *np, ...@@ -1023,13 +1027,21 @@ static int cpm_uart_init_port(struct device_node *np,
int ret; int ret;
int i; int i;
data = of_get_property(np, "fsl,cpm-brg", &len); data = of_get_property(np, "clock", NULL);
if (!data || len != 4) { if (data) {
printk(KERN_ERR "CPM UART %s has no/invalid " struct clk *clk = clk_get(NULL, (const char*)data);
"fsl,cpm-brg property.\n", np->name); if (!IS_ERR(clk))
return -EINVAL; pinfo->clk = clk;
}
if (!pinfo->clk) {
data = of_get_property(np, "fsl,cpm-brg", &len);
if (!data || len != 4) {
printk(KERN_ERR "CPM UART %s has no/invalid "
"fsl,cpm-brg property.\n", np->name);
return -EINVAL;
}
pinfo->brg = *data;
} }
pinfo->brg = *data;
data = of_get_property(np, "fsl,cpm-command", &len); data = of_get_property(np, "fsl,cpm-command", &len);
if (!data || len != 4) { if (!data || len != 4) {
......
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