diff options
Diffstat (limited to 'arch/arm/mach-davinci/serial.c')
| -rw-r--r-- | arch/arm/mach-davinci/serial.c | 39 | 
1 files changed, 27 insertions, 12 deletions
diff --git a/arch/arm/mach-davinci/serial.c b/arch/arm/mach-davinci/serial.c index 1875740fe27..f2625814c3c 100644 --- a/arch/arm/mach-davinci/serial.c +++ b/arch/arm/mach-davinci/serial.c @@ -70,11 +70,33 @@ static void __init davinci_serial_reset(struct plat_serial8250_port *p)  				 UART_DM646X_SCR_TX_WATERMARK);  } -int __init davinci_serial_init(struct davinci_uart_config *info) +/* Enable UART clock and obtain its rate */ +int __init davinci_serial_setup_clk(unsigned instance, unsigned int *rate)  { -	int i;  	char name[16]; -	struct clk *uart_clk; +	struct clk *clk; +	struct davinci_soc_info *soc_info = &davinci_soc_info; +	struct device *dev = &soc_info->serial_dev->dev; + +	sprintf(name, "uart%d", instance); +	clk = clk_get(dev, name); +	if (IS_ERR(clk)) { +		pr_err("%s:%d: failed to get UART%d clock\n", +					__func__, __LINE__, instance); +		return PTR_ERR(clk); +	} + +	clk_prepare_enable(clk); + +	if (rate) +		*rate = clk_get_rate(clk); + +	return 0; +} + +int __init davinci_serial_init(struct davinci_uart_config *info) +{ +	int i, ret;  	struct davinci_soc_info *soc_info = &davinci_soc_info;  	struct device *dev = &soc_info->serial_dev->dev;  	struct plat_serial8250_port *p = dev->platform_data; @@ -87,16 +109,9 @@ int __init davinci_serial_init(struct davinci_uart_config *info)  		if (!(info->enabled_uarts & (1 << i)))  			continue; -		sprintf(name, "uart%d", i); -		uart_clk = clk_get(dev, name); -		if (IS_ERR(uart_clk)) { -			printk(KERN_ERR "%s:%d: failed to get UART%d clock\n", -					__func__, __LINE__, i); +		ret = davinci_serial_setup_clk(i, &p->uartclk); +		if (ret)  			continue; -		} - -		clk_enable(uart_clk); -		p->uartclk = clk_get_rate(uart_clk);  		if (!p->membase && p->mapbase) {  			p->membase = ioremap(p->mapbase, SZ_4K);  |