From: Ben Dooks <ben-linux@fluff.org>
To: Nicolas Ferre <nicolas.ferre@atmel.com>
Cc: avictor.za@gmail.com, linux-arm-kernel@lists.arm.linux.org.uk,
patrice.vilchez@atmel.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/3] at91: Support for at91sam9g45: clocks management
Date: Thu, 4 Jun 2009 09:33:33 +0100 [thread overview]
Message-ID: <20090604083332.GA3331@fluff.org.uk> (raw)
In-Reply-To: <4a78a0b84331f1fb5ea111657992b3557f70a1b3.1244104625.git.nicolas.ferre@atmel.com>
On Thu, Jun 04, 2009 at 10:48:01AM +0200, Nicolas Ferre wrote:
> Add the at91sam9g45 series support to the AT91 generic clock file.
> This takes care of the particularities of the PMC for this series.
> It also takes advantage of the management by functionalities of
> those PLLs and clocks.
>
> Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
personally, please don't post between open and subscriber only lists,
this should really only be sent to linux-arm-kernel.
> ---
> arch/arm/mach-at91/clock.c | 62 ++++++++++++++++++++++++++++++++++++-------
> 1 files changed, 52 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm/mach-at91/clock.c b/arch/arm/mach-at91/clock.c
> index bac578f..6396680 100644
> --- a/arch/arm/mach-at91/clock.c
> +++ b/arch/arm/mach-at91/clock.c
> @@ -47,20 +47,25 @@
> * Chips have some kind of clocks : group them by functionality
> */
> #define cpu_has_utmi() ( cpu_is_at91cap9() \
how does this pass checkpatch? no spaces after (.
> - || cpu_is_at91sam9rl())
> + || cpu_is_at91sam9rl() \
> + || cpu_is_at91sam9g45())
>
> -#define cpu_has_800M_plla() (cpu_is_at91sam9g20())
> +#define cpu_has_800M_plla() ( cpu_is_at91sam9g20() \
> + || cpu_is_at91sam9g45())
>
> -#define cpu_has_pllb() (!cpu_is_at91sam9rl())
> +#define cpu_has_300M_plla() (0)
>
> -#define cpu_has_upll() (0)
> +#define cpu_has_pllb() (!(cpu_is_at91sam9rl() \
> + || cpu_is_at91sam9g45()))
> +
> +#define cpu_has_upll() (cpu_is_at91sam9g45())
>
> /* USB host HS & FS */
> #define cpu_has_uhp() (!cpu_is_at91sam9rl())
>
> /* USB device FS only */
> -#define cpu_has_udpfs() (!cpu_is_at91sam9rl())
> -
> +#define cpu_has_udpfs() (!(cpu_is_at91sam9rl() \
> + || cpu_is_at91sam9g45()))
>
> static LIST_HEAD(clocks);
> static DEFINE_SPINLOCK(clk_lock);
> @@ -133,6 +138,13 @@ static void pmc_uckr_mode(struct clk *clk, int is_on)
> {
> unsigned int uckr = at91_sys_read(AT91_CKGR_UCKR);
>
> + if (cpu_is_at91sam9g45()) {
> + if (is_on)
> + uckr |= AT91_PMC_BIASEN;
> + else
> + uckr &= ~AT91_PMC_BIASEN;
> + }
> +
> if (is_on) {
> is_on = AT91_PMC_LOCKU;
> at91_sys_write(AT91_CKGR_UCKR, uckr | clk->pmc_mask);
> @@ -310,6 +322,7 @@ long clk_round_rate(struct clk *clk, unsigned long rate)
> unsigned long flags;
> unsigned prescale;
> unsigned long actual;
> + unsigned long prev = ULONG_MAX;
>
> if (!clk_is_programmable(clk))
> return -EINVAL;
> @@ -317,8 +330,16 @@ long clk_round_rate(struct clk *clk, unsigned long rate)
>
> actual = clk->parent->rate_hz;
> for (prescale = 0; prescale < 7; prescale++) {
> - if (actual && actual <= rate)
> + if (actual > rate)
> + prev = actual;
> +
> + if (actual && actual <= rate) {
> + if ((prev - rate) < (rate - actual)) {
> + actual = prev;
> + prescale--;
> + }
> break;
> + }
> actual >>= 1;
> }
>
> @@ -373,6 +394,10 @@ int clk_set_parent(struct clk *clk, struct clk *parent)
> return -EBUSY;
> if (!clk_is_primary(parent) || !clk_is_programmable(clk))
> return -EINVAL;
> +
> + if (cpu_is_at91sam9rl() && parent->id == AT91_PMC_CSS_PLLB)
> + return -EINVAL;
> +
> spin_lock_irqsave(&clk_lock, flags);
>
> clk->rate_hz = parent->rate_hz;
> @@ -637,6 +662,7 @@ int __init at91_clock_init(unsigned long main_clock)
> {
> unsigned tmp, freq, mckr;
> int i;
> + int pll_overclock = false;
>
> /*
> * When the bootloader initialized the main oscillator correctly,
> @@ -654,12 +680,25 @@ int __init at91_clock_init(unsigned long main_clock)
>
> /* report if PLLA is more than mildly overclocked */
> plla.rate_hz = at91_pll_rate(&plla, main_clock, at91_sys_read(AT91_CKGR_PLLAR));
> - if ((!cpu_has_800M_plla() && plla.rate_hz > 209000000)
> - || (cpu_has_800M_plla() && plla.rate_hz > 800000000))
> + if (cpu_has_300M_plla()) {
> + if (plla.rate_hz > 300000000)
> + pll_overclock = true;
> + } else if (cpu_has_800M_plla()) {
> + if (plla.rate_hz > 800000000)
> + pll_overclock = true;
> + } else {
> + if (plla.rate_hz > 209000000)
> + pll_overclock = true;
> + }
> + if (pll_overclock)
> pr_info("Clocks: PLLA overclocked, %ld MHz\n", plla.rate_hz / 1000000);
>
> + if (cpu_is_at91sam9g45()) {
> + mckr = at91_sys_read(AT91_PMC_MCKR);
> + plla.rate_hz /= (1 << ((mckr & AT91_PMC_PLLADIV2) >> 12)); /* plla divisor by 2 */
> + }
>
> - if (cpu_has_upll() && !cpu_has_pllb()) {
> + if (!cpu_has_pllb() && cpu_has_upll()) {
> /* setup UTMI clock as the fourth primary clock
> * (instead of pllb) */
> utmi_clk.type |= CLK_TYPE_PRIMARY;
> @@ -701,6 +740,9 @@ int __init at91_clock_init(unsigned long main_clock)
> freq / ((mckr & AT91_PMC_MDIV) >> 7) : freq; /* mdiv ; (x >> 7) = ((x >> 8) * 2) */
> if (mckr & AT91_PMC_PDIV)
> freq /= 2; /* processor clock division */
> + } else if (cpu_is_at91sam9g45()) {
> + mck.rate_hz = (mckr & AT91_PMC_MDIV) == AT91SAM9_PMC_MDIV_3 ?
> + freq / 3 : freq / (1 << ((mckr & AT91_PMC_MDIV) >> 8)); /* mdiv */
> } else {
> mck.rate_hz = freq / (1 << ((mckr & AT91_PMC_MDIV) >> 8)); /* mdiv */
> }
--
Ben (ben@fluff.org, http://www.fluff.org/)
'a smiley only costs 4 bytes'
next parent reply other threads:[~2009-06-04 8:34 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <0c80319114935c723d3bac8992e6b4d8fc464b0b.1244104624.git.nicolas.ferre@atmel.com>
[not found] ` <4a78a0b84331f1fb5ea111657992b3557f70a1b3.1244104625.git.nicolas.ferre@atmel.com>
2009-06-04 8:33 ` Ben Dooks [this message]
2009-06-04 8:46 ` [PATCH 2/3] at91: Support for at91sam9g45: clocks management Nicolas Ferre
2009-06-04 8:48 ` Nicolas Ferre
2009-06-04 8:32 ` Nicolas Ferre
2009-06-04 8:48 ` [PATCH 1/3] at91: Basic support for at91sam9g45 series: header files Nicolas Ferre
2009-06-23 14:24 ` Nicolas Ferre
[not found] ` <09d2752016cb8d3b2549b3937dd4915a32b9625f.1244104625.git.nicolas.ferre@atmel.com>
2009-06-04 8:48 ` [PATCH 3/3] at91: Support for at91sam9g45 series: core chip & board support Nicolas Ferre
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=20090604083332.GA3331@fluff.org.uk \
--to=ben-linux@fluff.org \
--cc=avictor.za@gmail.com \
--cc=linux-arm-kernel@lists.arm.linux.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=nicolas.ferre@atmel.com \
--cc=patrice.vilchez@atmel.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox