>From 944e8e670dabdcafb9a8a2c3991ecd56ec2ef3dc Mon Sep 17 00:00:00 2001 From: Mickael GARDET Date: Tue, 17 May 2016 18:53:24 +0200 Subject: [PATCH 3/3] force_external_osc Change-Id: I7987701783564f05836b520a2926d6c1874dde31 --- drivers/clk/at91/clk-slow.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/drivers/clk/at91/clk-slow.c b/drivers/clk/at91/clk-slow.c index 2f13bd5..a8b0eed 100644 --- a/drivers/clk/at91/clk-slow.c +++ b/drivers/clk/at91/clk-slow.c @@ -70,6 +70,15 @@ struct clk_sam9x5_slow { #define to_clk_sam9x5_slow(hw) container_of(hw, struct clk_sam9x5_slow, hw) +static bool force_external_osc = false; +static int __init force_external_osc_setup(char *__unused) +{ + force_external_osc = true; + return 1; +} +__setup("slow_clock_external_osc",force_external_osc_setup); + + static struct clk *slow_clk; static int clk_slow_osc_prepare(struct clk_hw *hw) @@ -85,6 +94,15 @@ static int clk_slow_osc_prepare(struct clk_hw *hw) usleep_range(osc->startup_usec, osc->startup_usec + 1); + if(force_external_osc == true && !(tmp & AT91_SCKC_OSCSEL) ) + { + writel(tmp | AT91_SCKC_OSCSEL, sckcr); + + usleep_range(SLOWCK_SW_TIME_USEC, SLOWCK_SW_TIME_USEC + 1); + + writel(readl(sckcr) & ~AT91_SCKC_RCEN, sckcr); + } + return 0; } @@ -320,7 +338,11 @@ static u8 clk_sam9x5_slow_get_parent(struct clk_hw *hw) { struct clk_sam9x5_slow *slowck = to_clk_sam9x5_slow(hw); - return !!(readl(slowck->sckcr) & AT91_SCKC_OSCSEL); + if(force_external_osc == true) + return 1; + else + return !!(readl(slowck->sckcr) & AT91_SCKC_OSCSEL); + } static const struct clk_ops sam9x5_slow_ops = { @@ -353,7 +375,11 @@ at91_clk_register_sam9x5_slow(void __iomem *sckcr, slowck->hw.init = &init; slowck->sckcr = sckcr; - slowck->parent = !!(readl(sckcr) & AT91_SCKC_OSCSEL); + + if(force_external_osc == true) + slowck->parent = 1; + else + slowck->parent = !!(readl(sckcr) & AT91_SCKC_OSCSEL); clk = clk_register(NULL, &slowck->hw); if (IS_ERR(clk)) -- 2.5.5