Skip to content

Commit

Permalink
ARM: davinci: serial: provide API to initialze UART clocks
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sekhar Nori committed Oct 27, 2012
1 parent b6f1ffe commit 76d57ce
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 12 deletions.
1 change: 1 addition & 0 deletions arch/arm/mach-davinci/include/mach/serial.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ struct davinci_uart_config {
};

extern int davinci_serial_init(struct davinci_uart_config *);
extern int davinci_serial_setup_clk(unsigned instance, unsigned int *rate);
#endif

#endif /* __ASM_ARCH_SERIAL_H */
39 changes: 27 additions & 12 deletions arch/arm/mach-davinci/serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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_prepare_enable(uart_clk);
p->uartclk = clk_get_rate(uart_clk);

if (!p->membase && p->mapbase) {
p->membase = ioremap(p->mapbase, SZ_4K);
Expand Down

0 comments on commit 76d57ce

Please sign in to comment.