|
@@ -28,7 +28,7 @@ static unsigned int ram_clocks[] = {
|
|
|
|
|
|
/* vr9, ar10/grx390 clock */
|
|
|
#define CGU_SYS_XRX 0x0c
|
|
|
-#define CGU_IF_CLK_VR9 0x24
|
|
|
+#define CGU_IF_CLK_AR10 0x24
|
|
|
|
|
|
unsigned long ltq_danube_fpi_hz(void)
|
|
|
{
|
|
@@ -195,3 +195,158 @@ unsigned long ltq_vr9_pp32_hz(void)
|
|
|
|
|
|
return clk;
|
|
|
}
|
|
|
+
|
|
|
+unsigned long ltq_ar10_cpu_hz(void)
|
|
|
+{
|
|
|
+ unsigned int clksys;
|
|
|
+ int cpu_fs = (ltq_cgu_r32(CGU_SYS_XRX) >> 8) & 0x1;
|
|
|
+ int freq_div = (ltq_cgu_r32(CGU_SYS_XRX) >> 4) & 0x7;
|
|
|
+
|
|
|
+ switch (cpu_fs) {
|
|
|
+ case 0:
|
|
|
+ clksys = CLOCK_500M;
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ clksys = CLOCK_600M;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ clksys = CLOCK_500M;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (freq_div) {
|
|
|
+ case 0:
|
|
|
+ return clksys;
|
|
|
+ case 1:
|
|
|
+ return clksys >> 1;
|
|
|
+ case 2:
|
|
|
+ return clksys >> 2;
|
|
|
+ default:
|
|
|
+ return clksys;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+unsigned long ltq_ar10_fpi_hz(void)
|
|
|
+{
|
|
|
+ int freq_fpi = (ltq_cgu_r32(CGU_IF_CLK_AR10) >> 25) & 0xf;
|
|
|
+
|
|
|
+ switch (freq_fpi) {
|
|
|
+ case 1:
|
|
|
+ return CLOCK_300M;
|
|
|
+ case 5:
|
|
|
+ return CLOCK_250M;
|
|
|
+ case 2:
|
|
|
+ return CLOCK_150M;
|
|
|
+ case 6:
|
|
|
+ return CLOCK_125M;
|
|
|
+
|
|
|
+ default:
|
|
|
+ return CLOCK_125M;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+unsigned long ltq_ar10_pp32_hz(void)
|
|
|
+{
|
|
|
+ unsigned int clksys = (ltq_cgu_r32(CGU_SYS) >> 16) & 0x7;
|
|
|
+ unsigned long clk;
|
|
|
+
|
|
|
+ switch (clksys) {
|
|
|
+ case 1:
|
|
|
+ clk = CLOCK_250M;
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ clk = CLOCK_400M;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ clk = CLOCK_250M;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return clk;
|
|
|
+}
|
|
|
+
|
|
|
+unsigned long ltq_grx390_cpu_hz(void)
|
|
|
+{
|
|
|
+ unsigned int clksys;
|
|
|
+ int cpu_fs = ((ltq_cgu_r32(CGU_SYS_XRX) >> 9) & 0x3);
|
|
|
+ int freq_div = ((ltq_cgu_r32(CGU_SYS_XRX) >> 4) & 0x7);
|
|
|
+
|
|
|
+ switch (cpu_fs) {
|
|
|
+ case 0:
|
|
|
+ clksys = CLOCK_600M;
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ clksys = CLOCK_666M;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ clksys = CLOCK_720M;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ clksys = CLOCK_600M;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (freq_div) {
|
|
|
+ case 0:
|
|
|
+ return clksys;
|
|
|
+ case 1:
|
|
|
+ return clksys >> 1;
|
|
|
+ case 2:
|
|
|
+ return clksys >> 2;
|
|
|
+ default:
|
|
|
+ return clksys;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+unsigned long ltq_grx390_fpi_hz(void)
|
|
|
+{
|
|
|
+ /* fpi clock is derived from ddr_clk */
|
|
|
+ unsigned int clksys;
|
|
|
+ int cpu_fs = ((ltq_cgu_r32(CGU_SYS_XRX) >> 9) & 0x3);
|
|
|
+ int freq_div = ((ltq_cgu_r32(CGU_SYS_XRX)) & 0x7);
|
|
|
+ switch (cpu_fs) {
|
|
|
+ case 0:
|
|
|
+ clksys = CLOCK_600M;
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ clksys = CLOCK_666M;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ clksys = CLOCK_720M;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ clksys = CLOCK_600M;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (freq_div) {
|
|
|
+ case 1:
|
|
|
+ return clksys >> 1;
|
|
|
+ case 2:
|
|
|
+ return clksys >> 2;
|
|
|
+ default:
|
|
|
+ return clksys >> 1;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+unsigned long ltq_grx390_pp32_hz(void)
|
|
|
+{
|
|
|
+ unsigned int clksys = (ltq_cgu_r32(CGU_SYS) >> 16) & 0x7;
|
|
|
+ unsigned long clk;
|
|
|
+
|
|
|
+ switch (clksys) {
|
|
|
+ case 1:
|
|
|
+ clk = CLOCK_250M;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ clk = CLOCK_432M;
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ clk = CLOCK_400M;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ clk = CLOCK_250M;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return clk;
|
|
|
+}
|