[PATCH] clk: mxs: source LCD clock from PLL instead of from ref_xtal

Shawn Guo shawn.guo at linaro.org
Mon Sep 23 08:42:58 EDT 2013


Copy Mike who will help apply the patch.

On Mon, Sep 23, 2013 at 09:50:23AM +0200, Hector Palacios wrote:
> The lcd clock hierarchy is as follows:
> 
>     ref_clk (24MHz)-----\
>                          +--+ lcdif_sel (MUX type)
>     frac1_clk (480Mhz)--/   |
>                             \--+ lcdif_div (DIV type)
>                                |
>                                \-- lcdif (GATE type)
> 
> The mxsfb driver retrieves the 'lcdif_div' clock from the DT, but the
> 'lcdif_sel' is by default sourced from 'ref_clk' which is a fixed 24MHz.
> This means the pixel clock can only be 24MHz or a power-of-two divisor
> of that frequency (12, 6, 3...) which is a very poor divisor granularity.
> 
> Since the driver doesn't know about the different clocks that can
> source its clk parent from, we must select the PLL (480MHz) to be the
> parent during the general clocks initialization. This allows for much
> better divisor granularity and for more accurate frequencies for LCD
> displays.
> 
> Signed-off-by: Hector Palacios <hector.palacios at digi.com>
> Tested-by: Fabio Estevam <fabio.estevam at freescale.com>
> CC: Maxime Rippard <maxime.ripard at free-electrons.com>
> CC: Marek Vasut <marex at denx.de>
> CC: Alexandre Belloni <alexandre.belloni at free-electrons.com>
> CC: Gwenhael Goavec-Merou <gwenhael.goavec-merou at armadeus.com>

Acked-by: Shawn Guo <shawn.guo at linaro.org>

> ---
>  drivers/clk/mxs/clk-imx28.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/clk/mxs/clk-imx28.c b/drivers/clk/mxs/clk-imx28.c
> index 4faf0af..882ec3f 100644
> --- a/drivers/clk/mxs/clk-imx28.c
> +++ b/drivers/clk/mxs/clk-imx28.c
> @@ -246,6 +246,12 @@ int __init mx28_clocks_init(void)
>  	clk_data.clk_num = ARRAY_SIZE(clks);
>  	of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
>  
> +	/*
> +	 * Select PLL as the parent source of lcdif_sel clk to have a finer
> +	 * granularity when calculating the LCD pixelclock
> +	 */
> +	clk_set_parent(clks[lcdif_sel], clks[ref_pix]);
> +
>  	clk_register_clkdev(clks[enet_out], NULL, "enet_out");
>  
>  	for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)




More information about the linux-arm-kernel mailing list