From 4de3dd472d2dc434c0aed5e57fc8a27c44debe1f Mon Sep 17 00:00:00 2001 From: Russell King Date: Tue, 13 Sep 2016 18:51:55 +0100 Subject: add sa11x0 uart clocks Signed-off-by: Russell King --- arch/arm/mach-sa1100/clock.c | 3 +++ drivers/tty/serial/sa1100.c | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/arch/arm/mach-sa1100/clock.c b/arch/arm/mach-sa1100/clock.c index a33455e2fa31..0562273d49fc 100644 --- a/arch/arm/mach-sa1100/clock.c +++ b/arch/arm/mach-sa1100/clock.c @@ -105,6 +105,9 @@ int __init sa11xx_clk_init(void) return PTR_ERR(hw); clk_hw_register_clkdev(hw, "OSTIMER0", NULL); + clk_hw_register_clkdev(hw, NULL, "sa11x0-uart.1"); + clk_hw_register_clkdev(hw, NULL, "sa11x0-uart.2"); + clk_hw_register_clkdev(hw, NULL, "sa11x0-uart.3"); hw = kzalloc(sizeof(*hw), GFP_KERNEL); if (!hw) diff --git a/drivers/tty/serial/sa1100.c b/drivers/tty/serial/sa1100.c index d02be025263b..a812fae00feb 100644 --- a/drivers/tty/serial/sa1100.c +++ b/drivers/tty/serial/sa1100.c @@ -8,6 +8,7 @@ */ #include +#include #include #include #include @@ -76,6 +77,7 @@ struct sa1100_port { struct uart_port port; struct timer_list timer; unsigned int old_status; + struct clk *clk; struct mctrl_gpios *gpios; struct gpio_desc *xcvr_enable; unsigned wake; @@ -367,13 +369,19 @@ static int sa1100_startup(struct uart_port *port) container_of(port, struct sa1100_port, port); int retval; + retval = clk_prepare_enable(sport->clk); + if (retval) + return retval; + /* * Allocate the IRQ */ retval = request_irq(sport->port.irq, sa1100_int, 0, "sa11x0-uart", sport); - if (retval) + if (retval) { + clk_disable_unprepare(sport->clk); return retval; + } /* * Finally, clear and enable interrupts @@ -410,6 +418,8 @@ static void sa1100_shutdown(struct uart_port *port) * Disable all interrupts, port and break condition. */ UART_PUT_UTCR3(sport, 0); + + clk_disable_unprepare(sport->clk); } static void @@ -965,6 +975,10 @@ static int sa1100_serial_add_one_port(struct sa1100_port *sport, struct platform sport->xcvr_enable = NULL; } + sport->clk = devm_clk_get(sport->port.dev, NULL); + if (IS_ERR(sport->clk)) + return PTR_ERR(sport->clk); + device_init_wakeup(sport->port.dev, !!sport->wake); platform_set_drvdata(dev, sport); -- cgit