diff options
| -rw-r--r-- | arch/powerpc/platforms/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/serial/cpm_uart/cpm_uart.h | 1 | ||||
| -rw-r--r-- | drivers/serial/cpm_uart/cpm_uart_core.c | 26 |
3 files changed, 21 insertions, 7 deletions
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index 18a71839dc9e..4c900efa164e 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig | |||
| @@ -283,6 +283,7 @@ config FSL_ULI1575 | |||
| 283 | 283 | ||
| 284 | config CPM | 284 | config CPM |
| 285 | bool | 285 | bool |
| 286 | select PPC_CLOCK | ||
| 286 | 287 | ||
| 287 | config OF_RTC | 288 | config OF_RTC |
| 288 | bool | 289 | bool |
diff --git a/drivers/serial/cpm_uart/cpm_uart.h b/drivers/serial/cpm_uart/cpm_uart.h index 5999ef5ac78e..7274b527a3c1 100644 --- a/drivers/serial/cpm_uart/cpm_uart.h +++ b/drivers/serial/cpm_uart/cpm_uart.h | |||
| @@ -77,6 +77,7 @@ struct uart_cpm_port { | |||
| 77 | unsigned char *rx_buf; | 77 | unsigned char *rx_buf; |
| 78 | u32 flags; | 78 | u32 flags; |
| 79 | void (*set_lineif)(struct uart_cpm_port *); | 79 | void (*set_lineif)(struct uart_cpm_port *); |
| 80 | struct clk *clk; | ||
| 80 | u8 brg; | 81 | u8 brg; |
| 81 | uint dp_addr; | 82 | uint dp_addr; |
| 82 | void *mem_addr; | 83 | void *mem_addr; |
diff --git a/drivers/serial/cpm_uart/cpm_uart_core.c b/drivers/serial/cpm_uart/cpm_uart_core.c index 5e0c17f71653..25efca5a7a1f 100644 --- a/drivers/serial/cpm_uart/cpm_uart_core.c +++ b/drivers/serial/cpm_uart/cpm_uart_core.c | |||
| @@ -45,6 +45,7 @@ | |||
| 45 | #include <linux/of_platform.h> | 45 | #include <linux/of_platform.h> |
| 46 | #include <linux/gpio.h> | 46 | #include <linux/gpio.h> |
| 47 | #include <linux/of_gpio.h> | 47 | #include <linux/of_gpio.h> |
| 48 | #include <linux/clk.h> | ||
| 48 | 49 | ||
| 49 | #include <asm/io.h> | 50 | #include <asm/io.h> |
| 50 | #include <asm/irq.h> | 51 | #include <asm/irq.h> |
| @@ -596,7 +597,10 @@ static void cpm_uart_set_termios(struct uart_port *port, | |||
| 596 | out_be16(&sccp->scc_psmr, (sbits << 12) | scval); | 597 | out_be16(&sccp->scc_psmr, (sbits << 12) | scval); |
| 597 | } | 598 | } |
| 598 | 599 | ||
| 599 | cpm_set_brg(pinfo->brg - 1, baud); | 600 | if (pinfo->clk) |
| 601 | clk_set_rate(pinfo->clk, baud); | ||
| 602 | else | ||
| 603 | cpm_set_brg(pinfo->brg - 1, baud); | ||
| 600 | spin_unlock_irqrestore(&port->lock, flags); | 604 | spin_unlock_irqrestore(&port->lock, flags); |
| 601 | } | 605 | } |
| 602 | 606 | ||
| @@ -1023,13 +1027,21 @@ static int cpm_uart_init_port(struct device_node *np, | |||
| 1023 | int ret; | 1027 | int ret; |
| 1024 | int i; | 1028 | int i; |
| 1025 | 1029 | ||
| 1026 | data = of_get_property(np, "fsl,cpm-brg", &len); | 1030 | data = of_get_property(np, "clock", NULL); |
| 1027 | if (!data || len != 4) { | 1031 | if (data) { |
| 1028 | printk(KERN_ERR "CPM UART %s has no/invalid " | 1032 | struct clk *clk = clk_get(NULL, (const char*)data); |
| 1029 | "fsl,cpm-brg property.\n", np->name); | 1033 | if (!IS_ERR(clk)) |
| 1030 | return -EINVAL; | 1034 | pinfo->clk = clk; |
| 1035 | } | ||
| 1036 | if (!pinfo->clk) { | ||
| 1037 | data = of_get_property(np, "fsl,cpm-brg", &len); | ||
| 1038 | if (!data || len != 4) { | ||
| 1039 | printk(KERN_ERR "CPM UART %s has no/invalid " | ||
| 1040 | "fsl,cpm-brg property.\n", np->name); | ||
| 1041 | return -EINVAL; | ||
| 1042 | } | ||
| 1043 | pinfo->brg = *data; | ||
| 1031 | } | 1044 | } |
| 1032 | pinfo->brg = *data; | ||
| 1033 | 1045 | ||
| 1034 | data = of_get_property(np, "fsl,cpm-command", &len); | 1046 | data = of_get_property(np, "fsl,cpm-command", &len); |
| 1035 | if (!data || len != 4) { | 1047 | if (!data || len != 4) { |
