|
@@ -11,7 +11,19 @@
|
|
|
#include <asm/arch/clock.h>
|
|
|
#include <asm/arch/clock_defs.h>
|
|
|
|
|
|
-#define MAX_SPEEDS 13
|
|
|
+/* DEV and ARM speed definitions as specified in DEVSPEED register */
|
|
|
+int __weak speeds[DEVSPEED_NUMSPDS] = {
|
|
|
+ SPD1000,
|
|
|
+ SPD1200,
|
|
|
+ SPD1350,
|
|
|
+ SPD1400,
|
|
|
+ SPD1500,
|
|
|
+ SPD1400,
|
|
|
+ SPD1350,
|
|
|
+ SPD1200,
|
|
|
+ SPD1000,
|
|
|
+ SPD800,
|
|
|
+};
|
|
|
|
|
|
static void wait_for_completion(const struct pll_init_data *data)
|
|
|
{
|
|
@@ -199,43 +211,44 @@ void init_plls(int num_pll, struct pll_init_data *config)
|
|
|
init_pll(&config[i]);
|
|
|
}
|
|
|
|
|
|
-static int get_max_speed(u32 val, int *speeds)
|
|
|
+static int get_max_speed(u32 val, u32 speed_supported)
|
|
|
{
|
|
|
- int j;
|
|
|
+ int speed;
|
|
|
|
|
|
- if (!val)
|
|
|
- return speeds[0];
|
|
|
-
|
|
|
- for (j = 1; j < MAX_SPEEDS; j++) {
|
|
|
- if (val == 1)
|
|
|
- return speeds[j];
|
|
|
- val >>= 1;
|
|
|
+ /* Left most setbit gives the speed */
|
|
|
+ for (speed = DEVSPEED_NUMSPDS; speed >= 0; speed--) {
|
|
|
+ if ((val & BIT(speed)) & speed_supported)
|
|
|
+ return speeds[speed];
|
|
|
}
|
|
|
|
|
|
+ /* If no bit is set, use SPD800 */
|
|
|
return SPD800;
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_SOC_K2HK
|
|
|
-static u32 read_efuse_bootrom(void)
|
|
|
-{
|
|
|
- return (cpu_revision() > 1) ? __raw_readl(KS2_EFUSE_BOOTROM) :
|
|
|
- __raw_readl(KS2_REV1_DEVSPEED);
|
|
|
-}
|
|
|
-#else
|
|
|
static inline u32 read_efuse_bootrom(void)
|
|
|
{
|
|
|
- return __raw_readl(KS2_EFUSE_BOOTROM);
|
|
|
+ if (cpu_is_k2hk() && (cpu_revision() <= 1))
|
|
|
+ return __raw_readl(KS2_REV1_DEVSPEED);
|
|
|
+ else
|
|
|
+ return __raw_readl(KS2_EFUSE_BOOTROM);
|
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
-#ifndef CONFIG_SOC_K2E
|
|
|
-inline int get_max_arm_speed(void)
|
|
|
+int get_max_arm_speed(void)
|
|
|
{
|
|
|
- return get_max_speed(read_efuse_bootrom() & 0xffff, arm_speeds);
|
|
|
+ u32 armspeed = read_efuse_bootrom();
|
|
|
+
|
|
|
+ armspeed = (armspeed & DEVSPEED_ARMSPEED_MASK) >>
|
|
|
+ DEVSPEED_ARMSPEED_SHIFT;
|
|
|
+
|
|
|
+ return get_max_speed(armspeed, ARM_SUPPORTED_SPEEDS);
|
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
-inline int get_max_dev_speed(void)
|
|
|
+int get_max_dev_speed(void)
|
|
|
{
|
|
|
- return get_max_speed((read_efuse_bootrom() >> 16) & 0xffff, dev_speeds);
|
|
|
+ u32 devspeed = read_efuse_bootrom();
|
|
|
+
|
|
|
+ devspeed = (devspeed & DEVSPEED_DEVSPEED_MASK) >>
|
|
|
+ DEVSPEED_DEVSPEED_SHIFT;
|
|
|
+
|
|
|
+ return get_max_speed(devspeed, DEV_SUPPORTED_SPEEDS);
|
|
|
}
|