summaryrefslogtreecommitdiffstats
path: root/firmware/target/arm/imx233/clkctrl-imx233.c
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2012-12-26 01:06:04 +0100
committerAmaury Pouly <amaury.pouly@gmail.com>2012-12-26 01:17:28 +0100
commitca83b558dffbdc91e7ada0e1c48c208b945e1385 (patch)
treea07be868bc57bde3e106a95d358856aeebd0c200 /firmware/target/arm/imx233/clkctrl-imx233.c
parent423755d1bd8e12c9b525b7d3c2918510d72bb37e (diff)
downloadrockbox-ca83b558dffbdc91e7ada0e1c48c208b945e1385.tar.gz
rockbox-ca83b558dffbdc91e7ada0e1c48c208b945e1385.tar.bz2
rockbox-ca83b558dffbdc91e7ada0e1c48c208b945e1385.zip
imx233: fix potential hbus dividor settings + doc
HBUS uses the same field for integer and fractional dividers, the choice is made by a bit. Make sure both are changed together, otherwise this could result in the wrong divider to be used and in HBUS freq to be too low or too high (very bad). Change-Id: I253d8eeee26c5038868b729c4f791511295a39f0
Diffstat (limited to 'firmware/target/arm/imx233/clkctrl-imx233.c')
-rw-r--r--firmware/target/arm/imx233/clkctrl-imx233.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/firmware/target/arm/imx233/clkctrl-imx233.c b/firmware/target/arm/imx233/clkctrl-imx233.c
index ccccaae59d..cfee4aea37 100644
--- a/firmware/target/arm/imx233/clkctrl-imx233.c
+++ b/firmware/target/arm/imx233/clkctrl-imx233.c
@@ -103,7 +103,9 @@ void imx233_clkctrl_set_clock_divisor(enum imx233_clock_t clk, int div)
__FIELD_SET(HW_CLKCTRL_EMI, DIV_EMI, div);
break;
case CLK_HBUS:
- __FIELD_SET(HW_CLKCTRL_HBUS, DIV, div);
+ /* disable frac enable at the same time */
+ HW_CLKCTRL_HBUS = div << HW_CLKCTRL_HBUS__DIV_BP |
+ (HW_CLKCTRL_HBUS & ~(HW_CLKCTRL_HBUS__DIV_FRAC_EN | HW_CLKCTRL_HBUS__DIV_BM));
break;
case CLK_XBUS:
__FIELD_SET(HW_CLKCTRL_XBUS, DIV, div);
@@ -137,8 +139,9 @@ void imx233_clkctrl_set_fractional_divisor(enum imx233_clock_t clk, int fracdiv)
switch(clk)
{
case CLK_HBUS:
- __FIELD_SET(HW_CLKCTRL_HBUS, DIV, fracdiv);
- __REG_SET(HW_CLKCTRL_HBUS) = HW_CLKCTRL_HBUS__DIV_FRAC_EN;
+ /* set frac enable at the same time */
+ HW_CLKCTRL_HBUS = fracdiv << HW_CLKCTRL_HBUS__DIV_BP | HW_CLKCTRL_HBUS__DIV_FRAC_EN |
+ (HW_CLKCTRL_HBUS & ~HW_CLKCTRL_HBUS__DIV_BM);
return;
case CLK_PIX: REG = &HW_CLKCTRL_FRAC_PIX; break;
case CLK_IO: REG = &HW_CLKCTRL_FRAC_IO; break;