Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARM: davinci: serial: provide API to initialze UART clocks

Provide an API to initialize a UART clock. Refactor existing
davinci_serial_init() to separate out the part which enables
the clock.

This will later be used to help DA850 DT boot support.

Signed-off-by: Sekhar Nori <nsekhar@ti.com>

+28 -12
+1
arch/arm/mach-davinci/include/mach/serial.h
··· 43 43 }; 44 44 45 45 extern int davinci_serial_init(struct davinci_uart_config *); 46 + extern int davinci_serial_setup_clk(unsigned instance, unsigned int *rate); 46 47 #endif 47 48 48 49 #endif /* __ASM_ARCH_SERIAL_H */
+27 -12
arch/arm/mach-davinci/serial.c
··· 70 70 UART_DM646X_SCR_TX_WATERMARK); 71 71 } 72 72 73 + /* Enable UART clock and obtain its rate */ 74 + int __init davinci_serial_setup_clk(unsigned instance, unsigned int *rate) 75 + { 76 + char name[16]; 77 + struct clk *clk; 78 + struct davinci_soc_info *soc_info = &davinci_soc_info; 79 + struct device *dev = &soc_info->serial_dev->dev; 80 + 81 + sprintf(name, "uart%d", instance); 82 + clk = clk_get(dev, name); 83 + if (IS_ERR(clk)) { 84 + pr_err("%s:%d: failed to get UART%d clock\n", 85 + __func__, __LINE__, instance); 86 + return PTR_ERR(clk); 87 + } 88 + 89 + clk_prepare_enable(clk); 90 + 91 + if (rate) 92 + *rate = clk_get_rate(clk); 93 + 94 + return 0; 95 + } 96 + 73 97 int __init davinci_serial_init(struct davinci_uart_config *info) 74 98 { 75 - int i; 76 - char name[16]; 77 - struct clk *uart_clk; 99 + int i, ret; 78 100 struct davinci_soc_info *soc_info = &davinci_soc_info; 79 101 struct device *dev = &soc_info->serial_dev->dev; 80 102 struct plat_serial8250_port *p = dev->platform_data; ··· 109 87 if (!(info->enabled_uarts & (1 << i))) 110 88 continue; 111 89 112 - sprintf(name, "uart%d", i); 113 - uart_clk = clk_get(dev, name); 114 - if (IS_ERR(uart_clk)) { 115 - printk(KERN_ERR "%s:%d: failed to get UART%d clock\n", 116 - __func__, __LINE__, i); 90 + ret = davinci_serial_setup_clk(i, &p->uartclk); 91 + if (ret) 117 92 continue; 118 - } 119 - 120 - clk_prepare_enable(uart_clk); 121 - p->uartclk = clk_get_rate(uart_clk); 122 93 123 94 if (!p->membase && p->mapbase) { 124 95 p->membase = ioremap(p->mapbase, SZ_4K);