From: Marek Vasut <marex@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/4] arm: mxs: Add LCDIF clock configuration function
Date: Sun, 5 May 2013 23:26:22 +0200 [thread overview]
Message-ID: <201305052326.22896.marex@denx.de> (raw)
In-Reply-To: <1367176804-13526-1-git-send-email-marex@denx.de>
Hi Stefano,
you missed these.
> This function turns on the LCDIF clock and configures it's frequency. The
> dividers settings are calculated within the function and the current
> implementation should be fast and accurate.
>
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Fabio Estevam <fabio.estevam@freescale.com>
> Cc: Otavio Salvador <otavio@ossystems.com.br>
> Cc: Stefano Babic <sbabic@denx.de>
> ---
> arch/arm/cpu/arm926ejs/mxs/clock.c | 93
> +++++++++++++++++++++++++++++++++ arch/arm/include/asm/arch-mxs/clock.h |
> 1 +
> 2 files changed, 94 insertions(+)
>
> diff --git a/arch/arm/cpu/arm926ejs/mxs/clock.c
> b/arch/arm/cpu/arm926ejs/mxs/clock.c index 43e7663..f94107f 100644
> --- a/arch/arm/cpu/arm926ejs/mxs/clock.c
> +++ b/arch/arm/cpu/arm926ejs/mxs/clock.c
> @@ -325,6 +325,99 @@ void mxs_set_ssp_busclock(unsigned int bus, uint32_t
> freq) bus, tgtclk, freq);
> }
>
> +void mxs_set_lcdclk(uint32_t freq)
> +{
> + struct mxs_clkctrl_regs *clkctrl_regs =
> + (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
> + uint32_t fp, x, k_rest, k_best, x_best, tk;
> + int32_t k_best_l = 999, k_best_t = 0, x_best_l = 0xff, x_best_t = 0xff;
> +
> + if (freq == 0)
> + return;
> +
> +#if defined(CONFIG_MX23)
> + writel(CLKCTRL_CLKSEQ_BYPASS_PIX, &clkctrl_regs->hw_clkctrl_clkseq_clr);
> +#elif defined(CONFIG_MX28)
> + writel(CLKCTRL_CLKSEQ_BYPASS_DIS_LCDIF,
> &clkctrl_regs->hw_clkctrl_clkseq_clr); +#endif
> +
> + /*
> + * / 18 \ 1 1
> + * freq kHz = | 480000000 Hz * -- | * --- * ------
> + * \ x / k 1000
> + *
> + * 480000000 Hz 18
> + * ------------ * --
> + * freq kHz x
> + * k = -------------------
> + * 1000
> + */
> +
> + fp = ((PLL_FREQ_KHZ * 1000) / freq) * 18;
> +
> + for (x = 18; x <= 35; x++) {
> + tk = fp / x;
> + if ((tk / 1000 == 0) || (tk / 1000 > 255))
> + continue;
> +
> + k_rest = tk % 1000;
> +
> + if (k_rest < (k_best_l % 1000)) {
> + k_best_l = tk;
> + x_best_l = x;
> + }
> +
> + if (k_rest > (k_best_t % 1000)) {
> + k_best_t = tk;
> + x_best_t = x;
> + }
> + }
> +
> + if (1000 - (k_best_t % 1000) > (k_best_l % 1000)) {
> + k_best = k_best_l;
> + x_best = x_best_l;
> + } else {
> + k_best = k_best_t;
> + x_best = x_best_t;
> + }
> +
> + k_best /= 1000;
> +
> +#if defined(CONFIG_MX23)
> + writeb(CLKCTRL_FRAC_CLKGATE,
> + &clkctrl_regs->hw_clkctrl_frac0_set[CLKCTRL_FRAC0_PIX]);
> + writeb(CLKCTRL_FRAC_CLKGATE | (x_best & CLKCTRL_FRAC_FRAC_MASK),
> + &clkctrl_regs->hw_clkctrl_frac0[CLKCTRL_FRAC0_PIX]);
> + writeb(CLKCTRL_FRAC_CLKGATE,
> + &clkctrl_regs->hw_clkctrl_frac0_clr[CLKCTRL_FRAC0_PIX]);
> +
> + writel(CLKCTRL_PIX_CLKGATE,
> + &clkctrl_regs->hw_clkctrl_pix_set);
> + clrsetbits_le32(&clkctrl_regs->hw_clkctrl_pix,
> + CLKCTRL_PIX_DIV_MASK | CLKCTRL_PIX_CLKGATE,
> + k_best << CLKCTRL_PIX_DIV_OFFSET);
> +
> + while (readl(&clkctrl_regs->hw_clkctrl_pix) & CLKCTRL_PIX_BUSY)
> + ;
> +#elif defined(CONFIG_MX28)
> + writeb(CLKCTRL_FRAC_CLKGATE,
> + &clkctrl_regs->hw_clkctrl_frac1_set[CLKCTRL_FRAC1_PIX]);
> + writeb(CLKCTRL_FRAC_CLKGATE | (x_best & CLKCTRL_FRAC_FRAC_MASK),
> + &clkctrl_regs->hw_clkctrl_frac1[CLKCTRL_FRAC1_PIX]);
> + writeb(CLKCTRL_FRAC_CLKGATE,
> + &clkctrl_regs->hw_clkctrl_frac1_clr[CLKCTRL_FRAC1_PIX]);
> +
> + writel(CLKCTRL_DIS_LCDIF_CLKGATE,
> + &clkctrl_regs->hw_clkctrl_lcdif_set);
> + clrsetbits_le32(&clkctrl_regs->hw_clkctrl_lcdif,
> + CLKCTRL_DIS_LCDIF_DIV_MASK | CLKCTRL_DIS_LCDIF_CLKGATE,
> + k_best << CLKCTRL_DIS_LCDIF_DIV_OFFSET);
> +
> + while (readl(&clkctrl_regs->hw_clkctrl_lcdif) & CLKCTRL_DIS_LCDIF_BUSY)
> + ;
> +#endif
> +}
> +
> uint32_t mxc_get_clock(enum mxc_clock clk)
> {
> switch (clk) {
> diff --git a/arch/arm/include/asm/arch-mxs/clock.h
> b/arch/arm/include/asm/arch-mxs/clock.h index 3f7d3f0..9be53f0 100644
> --- a/arch/arm/include/asm/arch-mxs/clock.h
> +++ b/arch/arm/include/asm/arch-mxs/clock.h
> @@ -59,6 +59,7 @@ uint32_t mxc_get_clock(enum mxc_clock clk);
> void mxs_set_ioclk(enum mxs_ioclock io, uint32_t freq);
> void mxs_set_sspclk(enum mxs_sspclock ssp, uint32_t freq, int xtal);
> void mxs_set_ssp_busclock(unsigned int bus, uint32_t freq);
> +void mxs_set_lcdclk(uint32_t freq);
>
> /* Compatibility with the FEC Ethernet driver */
> #define imx_get_fecclk() mxc_get_clock(MXC_AHB_CLK)
Best regards,
Marek Vasut
next prev parent reply other threads:[~2013-05-05 21:26 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-28 19:20 [U-Boot] [PATCH 1/4] arm: mxs: Add LCDIF clock configuration function Marek Vasut
2013-04-28 19:20 ` [U-Boot] [PATCH 2/4] arm: mxs: Add LCDIF registers for i.MX233 Marek Vasut
2013-05-06 15:42 ` Stefano Babic
2013-04-28 19:20 ` [U-Boot] [PATCH 3/4] arm: mxs: Add MXS LCDIF driver Marek Vasut
2013-05-06 15:04 ` Anatolij Gustschin
2013-05-06 15:10 ` Stefano Babic
2013-05-06 15:42 ` Stefano Babic
2013-04-28 19:20 ` [U-Boot] [PATCH 4/4] arm: mxs: video: Enable MXS LCDIF on M28EVK Marek Vasut
2013-05-06 15:06 ` Anatolij Gustschin
2013-05-06 15:42 ` Stefano Babic
2013-05-05 21:26 ` Marek Vasut [this message]
2013-05-06 15:42 ` [U-Boot] [PATCH 1/4] arm: mxs: Add LCDIF clock configuration function Stefano Babic
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201305052326.22896.marex@denx.de \
--to=marex@denx.de \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.