|
@@ -44,38 +44,109 @@ struct factory_config {
|
|
|
|
|
|
static struct factory_config factory_config;
|
|
|
|
|
|
+struct part_no_info {
|
|
|
+ const char *part_no; /* part number string of interest */
|
|
|
+ int max_freq; /* khz */
|
|
|
+};
|
|
|
+
|
|
|
+static struct part_no_info mityomapl138_pn_info[] = {
|
|
|
+ {
|
|
|
+ .part_no = "L138-C",
|
|
|
+ .max_freq = 300000,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .part_no = "L138-D",
|
|
|
+ .max_freq = 375000,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .part_no = "L138-F",
|
|
|
+ .max_freq = 456000,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .part_no = "1808-C",
|
|
|
+ .max_freq = 300000,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .part_no = "1808-D",
|
|
|
+ .max_freq = 375000,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .part_no = "1808-F",
|
|
|
+ .max_freq = 456000,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .part_no = "1810-D",
|
|
|
+ .max_freq = 375000,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+#ifdef CONFIG_CPU_FREQ
|
|
|
+static void mityomapl138_cpufreq_init(const char *partnum)
|
|
|
+{
|
|
|
+ int i, ret;
|
|
|
+
|
|
|
+ for (i = 0; partnum && i < ARRAY_SIZE(mityomapl138_pn_info); i++) {
|
|
|
+ /*
|
|
|
+ * the part number has additional characters beyond what is
|
|
|
+ * stored in the table. This information is not needed for
|
|
|
+ * determining the speed grade, and would require several
|
|
|
+ * more table entries. Only check the first N characters
|
|
|
+ * for a match.
|
|
|
+ */
|
|
|
+ if (!strncmp(partnum, mityomapl138_pn_info[i].part_no,
|
|
|
+ strlen(mityomapl138_pn_info[i].part_no))) {
|
|
|
+ da850_max_speed = mityomapl138_pn_info[i].max_freq;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = da850_register_cpufreq("pll0_sysclk3");
|
|
|
+ if (ret)
|
|
|
+ pr_warning("cpufreq registration failed: %d\n", ret);
|
|
|
+}
|
|
|
+#else
|
|
|
+static void mityomapl138_cpufreq_init(const char *partnum) { }
|
|
|
+#endif
|
|
|
+
|
|
|
static void read_factory_config(struct memory_accessor *a, void *context)
|
|
|
{
|
|
|
int ret;
|
|
|
+ const char *partnum = NULL;
|
|
|
struct davinci_soc_info *soc_info = &davinci_soc_info;
|
|
|
|
|
|
ret = a->read(a, (char *)&factory_config, 0, sizeof(factory_config));
|
|
|
if (ret != sizeof(struct factory_config)) {
|
|
|
pr_warning("MityOMAPL138: Read Factory Config Failed: %d\n",
|
|
|
ret);
|
|
|
- return;
|
|
|
+ goto bad_config;
|
|
|
}
|
|
|
|
|
|
if (factory_config.magic != FACTORY_CONFIG_MAGIC) {
|
|
|
pr_warning("MityOMAPL138: Factory Config Magic Wrong (%X)\n",
|
|
|
factory_config.magic);
|
|
|
- return;
|
|
|
+ goto bad_config;
|
|
|
}
|
|
|
|
|
|
if (factory_config.version != FACTORY_CONFIG_VERSION) {
|
|
|
pr_warning("MityOMAPL138: Factory Config Version Wrong (%X)\n",
|
|
|
factory_config.version);
|
|
|
- return;
|
|
|
+ goto bad_config;
|
|
|
}
|
|
|
|
|
|
pr_info("MityOMAPL138: Found MAC = %pM\n", factory_config.mac);
|
|
|
- pr_info("MityOMAPL138: Part Number = %s\n", factory_config.partnum);
|
|
|
if (is_valid_ether_addr(factory_config.mac))
|
|
|
memcpy(soc_info->emac_pdata->mac_addr,
|
|
|
factory_config.mac, ETH_ALEN);
|
|
|
else
|
|
|
pr_warning("MityOMAPL138: Invalid MAC found "
|
|
|
"in factory config block\n");
|
|
|
+
|
|
|
+ partnum = factory_config.partnum;
|
|
|
+ pr_info("MityOMAPL138: Part Number = %s\n", partnum);
|
|
|
+
|
|
|
+bad_config:
|
|
|
+ /* default maximum speed is valid for all platforms */
|
|
|
+ mityomapl138_cpufreq_init(partnum);
|
|
|
}
|
|
|
|
|
|
static struct at24_platform_data mityomapl138_fd_chip = {
|
|
@@ -383,10 +454,6 @@ static void __init mityomapl138_init(void)
|
|
|
if (ret)
|
|
|
pr_warning("rtc setup failed: %d\n", ret);
|
|
|
|
|
|
- ret = da850_register_cpufreq("pll0_sysclk3");
|
|
|
- if (ret)
|
|
|
- pr_warning("cpufreq registration failed: %d\n", ret);
|
|
|
-
|
|
|
ret = da8xx_register_cpuidle();
|
|
|
if (ret)
|
|
|
pr_warning("cpuidle registration failed: %d\n", ret);
|