diff options
Diffstat (limited to 'drivers/clk/imx/clk.c')
| -rw-r--r-- | drivers/clk/imx/clk.c | 41 | 
1 files changed, 32 insertions, 9 deletions
| diff --git a/drivers/clk/imx/clk.c b/drivers/clk/imx/clk.c index 47882c51cb85..7cc669934253 100644 --- a/drivers/clk/imx/clk.c +++ b/drivers/clk/imx/clk.c @@ -147,8 +147,10 @@ void imx_cscmr1_fixup(u32 *val)  }  #ifndef MODULE -static int imx_keep_uart_clocks; -static struct clk ** const *imx_uart_clocks; + +static bool imx_keep_uart_clocks; +static int imx_enabled_uart_clocks; +static struct clk **imx_uart_clocks;  static int __init imx_keep_uart_clocks_param(char *str)  { @@ -161,24 +163,45 @@ __setup_param("earlycon", imx_keep_uart_earlycon,  __setup_param("earlyprintk", imx_keep_uart_earlyprintk,  	      imx_keep_uart_clocks_param, 0); -void imx_register_uart_clocks(struct clk ** const clks[]) +void imx_register_uart_clocks(unsigned int clk_count)  { +	imx_enabled_uart_clocks = 0; + +/* i.MX boards use device trees now.  For build tests without CONFIG_OF, do nothing */ +#ifdef CONFIG_OF  	if (imx_keep_uart_clocks) {  		int i; -		imx_uart_clocks = clks; -		for (i = 0; imx_uart_clocks[i]; i++) -			clk_prepare_enable(*imx_uart_clocks[i]); +		imx_uart_clocks = kcalloc(clk_count, sizeof(struct clk *), GFP_KERNEL); + +		if (!of_stdout) +			return; + +		for (i = 0; i < clk_count; i++) { +			imx_uart_clocks[imx_enabled_uart_clocks] = of_clk_get(of_stdout, i); + +			/* Stop if there are no more of_stdout references */ +			if (IS_ERR(imx_uart_clocks[imx_enabled_uart_clocks])) +				return; + +			/* Only enable the clock if it's not NULL */ +			if (imx_uart_clocks[imx_enabled_uart_clocks]) +				clk_prepare_enable(imx_uart_clocks[imx_enabled_uart_clocks++]); +		}  	} +#endif  }  static int __init imx_clk_disable_uart(void)  { -	if (imx_keep_uart_clocks && imx_uart_clocks) { +	if (imx_keep_uart_clocks && imx_enabled_uart_clocks) {  		int i; -		for (i = 0; imx_uart_clocks[i]; i++) -			clk_disable_unprepare(*imx_uart_clocks[i]); +		for (i = 0; i < imx_enabled_uart_clocks; i++) { +			clk_disable_unprepare(imx_uart_clocks[i]); +			clk_put(imx_uart_clocks[i]); +		} +		kfree(imx_uart_clocks);  	}  	return 0; | 
