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: Laurent Pinchart <laurentp@cse-semaphore.com> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
This commit is contained in:
committed by
Kumar Gala
parent
7485d26b7e
commit
80776554b6
@ -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 {
|
|||||||
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 @@
|
|||||||
#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,
|
|||||||
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,
|
|||||||
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) {
|
||||||
|
Reference in New Issue
Block a user