ARM: tegra11: clock: Add internal LA clock initialization
Alex Frid [Sat, 28 Jul 2012 06:04:06 +0000 (23:04 -0700)]
Enabled clocks used by internal LA (LA, DDS, DP2 and HDMI) if
requested by settings in MISC_GP_TRANSACTOR_SCRATCH_0 register.

Bug 1001015

Change-Id: I5c0e42e3d1ac0e94849fa4cc4b50e3b80515bb38
Signed-off-by: Alex Frid <afrid@nvidia.com>
Reviewed-on: http://git-master/r/119176
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Bo Yan <byan@nvidia.com>

arch/arm/mach-tegra/clock.h
arch/arm/mach-tegra/common.c
arch/arm/mach-tegra/tegra11_clocks.c

index bf522b3..bece0b0 100644 (file)
@@ -258,6 +258,7 @@ struct tegra_sku_rate_limit {
 void tegra2_init_clocks(void);
 void tegra30_init_clocks(void);
 void tegra11x_init_clocks(void);
+void tegra11x_clk_init_la(void);
 void tegra_common_init_clock(void);
 void tegra_init_max_rate(struct clk *c, unsigned long max_rate);
 void clk_init(struct clk *clk);
index fa06450..b33f4ab 100644 (file)
@@ -645,6 +645,7 @@ void __init tegra11x_init_early(void)
        tegra11x_init_dvfs();
        tegra_common_init_clock();
        tegra_clk_init_from_table(tegra11x_clk_init_table);
+       tegra11x_clk_init_la();
        tegra_init_cache(true);
        tegra_pmc_init();
        tegra_powergate_init();
index 1744d62..2784e43 100644 (file)
@@ -480,9 +480,13 @@ static const struct utmi_clk_param utmi_parameters[] =
 
 static void __iomem *reg_clk_base = IO_ADDRESS(TEGRA_CLK_RESET_BASE);
 static void __iomem *reg_pmc_base = IO_ADDRESS(TEGRA_PMC_BASE);
-static void __iomem *misc_gp_hidrev_base = IO_ADDRESS(TEGRA_APB_MISC_BASE);
+static void __iomem *misc_gp_base = IO_ADDRESS(TEGRA_APB_MISC_BASE);
 
-#define MISC_GP_HIDREV                  0x804
+#define MISC_GP_HIDREV                         0x804
+#define MISC_GP_TRANSACTOR_SCRATCH_0           0x864
+#define MISC_GP_TRANSACTOR_SCRATCH_LA_ENABLE   (0x1 << 1)
+#define MISC_GP_TRANSACTOR_SCRATCH_DDS_ENABLE  (0x1 << 2)
+#define MISC_GP_TRANSACTOR_SCRATCH_DP2_ENABLE  (0x1 << 3)
 
 /*
  * Some peripheral clocks share an enable bit, so refcount the enable bits
@@ -501,7 +505,7 @@ static int tegra_periph_clk_enable_refcount[CLK_OUT_ENB_NUM * 32];
 #define pmc_readl(reg) \
        __raw_readl((u32)reg_pmc_base + (reg))
 #define chipid_readl() \
-       __raw_readl((u32)misc_gp_hidrev_base + MISC_GP_HIDREV)
+       __raw_readl((u32)misc_gp_base + MISC_GP_HIDREV)
 
 #define clk_writel_delay(value, reg)                                   \
        do {                                                            \
@@ -6226,6 +6230,40 @@ bool tegra_clk_is_parent_allowed(struct clk *c, struct clk *p)
        return true;
 }
 
+/* Internal LA may request some clocks to be enabled on init via TRANSACTION
+   SCRATCH register settings */
+void __init tegra11x_clk_init_la(void)
+{
+       struct clk *c;
+       u32 reg = readl((u32)misc_gp_base + MISC_GP_TRANSACTOR_SCRATCH_0);
+
+       if (!(reg & MISC_GP_TRANSACTOR_SCRATCH_LA_ENABLE))
+               return;
+
+       c = tegra_get_clock_by_name("la");
+       if (WARN(!c, "%s: could not find la clk\n", __func__))
+               return;
+       clk_enable(c);
+
+       if (reg & MISC_GP_TRANSACTOR_SCRATCH_DDS_ENABLE) {
+               c = tegra_get_clock_by_name("dds");
+               if (WARN(!c, "%s: could not find la clk\n", __func__))
+                       return;
+               clk_enable(c);
+       }
+       if (reg & MISC_GP_TRANSACTOR_SCRATCH_DP2_ENABLE) {
+               c = tegra_get_clock_by_name("dp2");
+               if (WARN(!c, "%s: could not find la clk\n", __func__))
+                       return;
+               clk_enable(c);
+
+               c = tegra_get_clock_by_name("hdmi");
+               if (WARN(!c, "%s: could not find la clk\n", __func__))
+                       return;
+               clk_enable(c);
+       }
+}
+
 void __init tegra11x_init_clocks(void)
 {
        int i;