CPU frequency change support for PXA250


前回から。

PXA250用のテーブルを用意したら案の定2.6.26でも起動できるようになったとさ。

ちなみに、最新のバージョン(2.6.35)なら既に修正させていないかと期待してみたんだがそんなことはなかった。つまりLinux的にもPXA250はいらない子らしい orz

diff -r 852e2edc5a56 arch/arm/mach-pxa/cpu-pxa.c
--- a/arch/arm/mach-pxa/cpu-pxa.c	Sun Nov 21 15:18:57 2010 +0900
+++ b/arch/arm/mach-pxa/cpu-pxa.c	Mon Nov 22 16:19:09 2010 +0900
@@ -74,11 +74,32 @@
 #define MDREFR_DRI_MASK		0xFFF
 
 /*
+ * PXA250 definitions
+ */
+#define CCLKCFG			CCLKCFG_TURBO | CCLKCFG_FCS
+
+static pxa_freqs_t pxa250_freqs[] =
+{
+	/* CPU   MEMBUS  CCCR  DIV2 CCLKCFG	   run  turbo PXbus SDRAM */
+	{ 99500,  99500, 0x121, 1,  CCLKCFG},	/*  99,   99,   50,   50  */
+	{199100,  99500, 0x221, 0,  CCLKCFG},	/*  99,  199,   50,   99  */
+	{298500,  99500, 0x321, 0,  CCLKCFG},	/*  99,  287,   50,   99  */
+	{298600,  99500, 0x1c1, 0,  CCLKCFG},	/* 199,  287,   99,   99  */
+	{398100,  99500, 0x241, 0,  CCLKCFG},	/* 199,  398,   99,   99  */
+#if 0 /* OverClock */
+	{471900, 118000, 0x242, 0,  CCLKFLG},	/* 236,  472,  118,  118  */
+#endif
+};
+
+#define NUM_PXA250_FREQS ARRAY_SIZE(pxa250_freqs)
+static struct cpufreq_frequency_table
+	pxa250_freq_table[NUM_PXA250_FREQS+1];
+
+/*
  * PXA255 definitions
  */
+
 /* Use the run mode frequencies for the CPUFREQ_POLICY_PERFORMANCE policy */
-#define CCLKCFG			CCLKCFG_TURBO | CCLKCFG_FCS
-
 static pxa_freqs_t pxa255_run_freqs[] =
 {
 	/* CPU   MEMBUS  CCCR  DIV2 CCLKCFG	   run  turbo PXbus SDRAM */
@@ -101,13 +122,13 @@
 	{398100, 99500,  0x241, 0,  CCLKCFG},	/* 199,  398,   99,   99  */
 };
 
-#define NUM_PXA25x_RUN_FREQS ARRAY_SIZE(pxa255_run_freqs)
-#define NUM_PXA25x_TURBO_FREQS ARRAY_SIZE(pxa255_turbo_freqs)
+#define NUM_PXA255_RUN_FREQS ARRAY_SIZE(pxa255_run_freqs)
+#define NUM_PXA255_TURBO_FREQS ARRAY_SIZE(pxa255_turbo_freqs)
 
 static struct cpufreq_frequency_table
-	pxa255_run_freq_table[NUM_PXA25x_RUN_FREQS+1];
+	pxa255_run_freq_table[NUM_PXA255_RUN_FREQS+1];
 static struct cpufreq_frequency_table
-	pxa255_turbo_freq_table[NUM_PXA25x_TURBO_FREQS+1];
+	pxa255_turbo_freq_table[NUM_PXA255_TURBO_FREQS+1];
 
 /*
  * PXA270 definitions
@@ -162,7 +183,11 @@
 			     struct cpufreq_frequency_table **freq_table,
 			     pxa_freqs_t **pxa_freqs)
 {
-	if (cpu_is_pxa25x()) {
+	if (cpu_is_pxa250()) {
+		*pxa_freqs = pxa250_freqs;
+		*freq_table = pxa250_freq_table;
+	}
+	if (cpu_is_pxa255()) {
 		if (policy->policy == CPUFREQ_POLICY_PERFORMANCE) {
 			*pxa_freqs = pxa255_run_freqs;
 			*freq_table = pxa255_run_freq_table;
@@ -342,15 +367,22 @@
 	policy->cur = get_clk_frequency_khz(0);	   /* current freq */
 	policy->min = policy->max = policy->cur;
 
-	/* Generate pxa25x the run cpufreq_frequency_table struct */
-	for (i = 0; i < NUM_PXA25x_RUN_FREQS; i++) {
+	/* Generate pxa250 the cpufreq_frequency_table struct */
+	for (i = 0; i < NUM_PXA250_FREQS; i++) {
+		pxa250_freq_table[i].frequency = pxa250_freqs[i].khz;
+		pxa250_freq_table[i].index = i;
+	}
+	pxa250_freq_table[i].frequency = CPUFREQ_TABLE_END;
+
+	/* Generate pxa255 the run cpufreq_frequency_table struct */
+	for (i = 0; i < NUM_PXA255_RUN_FREQS; i++) {
 		pxa255_run_freq_table[i].frequency = pxa255_run_freqs[i].khz;
 		pxa255_run_freq_table[i].index = i;
 	}
 	pxa255_run_freq_table[i].frequency = CPUFREQ_TABLE_END;
 
-	/* Generate pxa25x the turbo cpufreq_frequency_table struct */
-	for (i = 0; i < NUM_PXA25x_TURBO_FREQS; i++) {
+	/* Generate pxa255 the turbo cpufreq_frequency_table struct */
+	for (i = 0; i < NUM_PXA255_TURBO_FREQS; i++) {
 		pxa255_turbo_freq_table[i].frequency =
 			pxa255_turbo_freqs[i].khz;
 		pxa255_turbo_freq_table[i].index = i;
@@ -371,7 +403,9 @@
 	 * Set the policy's minimum and maximum frequencies from the tables
 	 * just constructed.  This sets cpuinfo.mxx_freq, min and max.
 	 */
-	if (cpu_is_pxa25x())
+	if (cpu_is_pxa250())
+		cpufreq_frequency_table_cpuinfo(policy, pxa250_freq_table);
+	else if (cpu_is_pxa255())
 		cpufreq_frequency_table_cpuinfo(policy, pxa255_run_freq_table);
 	else if (cpu_is_pxa27x())
 		cpufreq_frequency_table_cpuinfo(policy, pxa27x_freq_table);
diff -r 852e2edc5a56 include/asm-arm/arch-pxa/hardware.h
--- a/include/asm-arm/arch-pxa/hardware.h	Sun Nov 21 15:18:57 2010 +0900
+++ b/include/asm-arm/arch-pxa/hardware.h	Mon Nov 22 16:19:09 2010 +0900
@@ -69,6 +69,18 @@
 		_id == 0x212;				\
 	})
 
+#define __cpu_is_pxa250(id)				\
+	({						\
+		unsigned int _id = (id) >> 4 & 0xfff;	\
+		_id == 0x290;				\
+	})
+
+#define __cpu_is_pxa255(id)				\
+	({						\
+		unsigned int _id = (id) >> 4 & 0xfff;	\
+		_id == 0x2d0;				\
+	})
+
 #define __cpu_is_pxa25x(id)				\
 	({						\
 		unsigned int _id = (id) >> 4 & 0xfff;	\
@@ -76,6 +88,8 @@
 	})
 #else
 #define __cpu_is_pxa21x(id)	(0)
+#define __cpu_is_pxa250(id)	(0)
+#define __cpu_is_pxa255(id)	(0)
 #define __cpu_is_pxa25x(id)	(0)
 #endif
 
@@ -124,6 +138,16 @@
 		__cpu_is_pxa21x(read_cpuid_id());	\
 	})
 
+#define cpu_is_pxa250()					\
+	({						\
+		__cpu_is_pxa250(read_cpuid_id());	\
+	})
+
+#define cpu_is_pxa255()					\
+	({						\
+		__cpu_is_pxa255(read_cpuid_id());	\
+	})
+
 #define cpu_is_pxa25x()					\
 	({						\
 		__cpu_is_pxa25x(read_cpuid_id());	\