summaryrefslogtreecommitdiff
path: root/arch/arm/mach-mvf/clock.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-mvf/clock.c')
-rw-r--r--arch/arm/mach-mvf/clock.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/arch/arm/mach-mvf/clock.c b/arch/arm/mach-mvf/clock.c
index 37247607311d..872f12f85d7b 100644
--- a/arch/arm/mach-mvf/clock.c
+++ b/arch/arm/mach-mvf/clock.c
@@ -1805,6 +1805,70 @@ static struct clk adc_clk[] = {
},
};
+static unsigned long _clk_can_get_rate(struct clk *clk)
+{
+ return clk_get_rate(clk->parent);
+}
+
+static int can_clk_enable(struct clk *can_clk)
+{
+ u32 reg;
+
+ /* enable CAN clk */
+ reg = __raw_readl(MXC_CCM_CSCDR2);
+ if(can_clk->id == 0)
+ reg |= MXC_CCM_CSCDR2_CAN0_EN;
+ if(can_clk->id == 1)
+ reg |= MXC_CCM_CSCDR2_CAN1_EN;
+ __raw_writel(reg, MXC_CCM_CSCDR2);
+
+ /* gate clock */
+ _clk_enable(can_clk);
+
+ return 0;
+}
+
+static int can_clk_disable(struct clk *can_clk)
+{
+ u32 reg;
+
+ /* disable CAN clk */
+ reg = __raw_readl(MXC_CCM_CSCDR2);
+ if(can_clk->id == 0)
+ reg &= ~MXC_CCM_CSCDR2_CAN0_EN;
+ if(can_clk->id == 1)
+ reg &= ~MXC_CCM_CSCDR2_CAN1_EN;
+ __raw_writel(reg, MXC_CCM_CSCDR2);
+
+ /* gate clock */
+ _clk_disable(can_clk);
+
+ return 0;
+}
+
+static struct clk can_clk[] = {
+ {
+ __INIT_CLK_DEBUG(can_clk)
+ .id = 0,
+ .parent = &ipg_clk,
+ .enable_reg = MXC_CCM_CCGR0,
+ .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
+ .enable = can_clk_enable,
+ .disable = can_clk_disable,
+ .get_rate = _clk_can_get_rate,
+ },
+ {
+ __INIT_CLK_DEBUG(can_clk)
+ .id = 1,
+ .parent = &ipg_clk,
+ .enable_reg = MXC_CCM_CCGR9,
+ .enable_shift = MXC_CCM_CCGRx_CG4_OFFSET,
+ .enable = can_clk_enable,
+ .disable = can_clk_disable,
+ .get_rate = _clk_can_get_rate,
+ },
+};
+
static struct clk i2c_clk[] = {
{
__INIT_CLK_DEBUG(i2c_clk_0)
@@ -2068,6 +2132,8 @@ static struct clk_lookup lookups[] = {
_REGISTER_CLOCK("fec.1", NULL, enet_clk[1]),
_REGISTER_CLOCK("mvf-adc.0", NULL, adc_clk[0]),
_REGISTER_CLOCK("mvf-adc.1", NULL, adc_clk[1]),
+ _REGISTER_CLOCK("mvf-flexcan.0", NULL, can_clk[0]),
+ _REGISTER_CLOCK("mvf-flexcan.1", NULL, can_clk[1]),
_REGISTER_CLOCK("switch.0", NULL, enet_clk[0]),
_REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk),
_REGISTER_CLOCK("sdhci-esdhc-imx.1", NULL, esdhc1_clk),