|
@@ -65,6 +65,9 @@ void get_sys_info (sys_info_t * sysInfo)
|
|
int get_clocks (void)
|
|
int get_clocks (void)
|
|
{
|
|
{
|
|
sys_info_t sys_info;
|
|
sys_info_t sys_info;
|
|
|
|
+#ifdef CONFIG_MPC8544
|
|
|
|
+ volatile ccsr_gur_t *gur = (void *) CFG_MPC85xx_GUTS_ADDR;
|
|
|
|
+#endif
|
|
#if defined(CONFIG_CPM2)
|
|
#if defined(CONFIG_CPM2)
|
|
volatile ccsr_cpm_t *cpm = (ccsr_cpm_t *)CFG_MPC85xx_CPM_ADDR;
|
|
volatile ccsr_cpm_t *cpm = (ccsr_cpm_t *)CFG_MPC85xx_CPM_ADDR;
|
|
uint sccr, dfbrg;
|
|
uint sccr, dfbrg;
|
|
@@ -78,8 +81,34 @@ int get_clocks (void)
|
|
gd->cpu_clk = sys_info.freqProcessor;
|
|
gd->cpu_clk = sys_info.freqProcessor;
|
|
gd->bus_clk = sys_info.freqSystemBus;
|
|
gd->bus_clk = sys_info.freqSystemBus;
|
|
gd->mem_clk = sys_info.freqDDRBus;
|
|
gd->mem_clk = sys_info.freqDDRBus;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * The base clock for I2C depends on the actual SOC. Unfortunately,
|
|
|
|
+ * there is no pattern that can be used to determine the frequency, so
|
|
|
|
+ * the only choice is to look up the actual SOC number and use the value
|
|
|
|
+ * for that SOC. This information is taken from application note
|
|
|
|
+ * AN2919.
|
|
|
|
+ */
|
|
|
|
+#if defined(CONFIG_MPC8540) || defined(CONFIG_MPC8541) || \
|
|
|
|
+ defined(CONFIG_MPC8560) || defined(CONFIG_MPC8555)
|
|
gd->i2c1_clk = sys_info.freqSystemBus;
|
|
gd->i2c1_clk = sys_info.freqSystemBus;
|
|
- gd->i2c2_clk = sys_info.freqSystemBus;
|
|
|
|
|
|
+#elif defined(CONFIG_MPC8544)
|
|
|
|
+ /*
|
|
|
|
+ * On the 8544, the I2C clock is the same as the SEC clock. This can be
|
|
|
|
+ * either CCB/2 or CCB/3, depending on the value of cfg_sec_freq. See
|
|
|
|
+ * 4.4.3.3 of the 8544 RM. Note that this might actually work for all
|
|
|
|
+ * 85xx, but only the 8544 has cfg_sec_freq, so it's unknown if the
|
|
|
|
+ * PORDEVSR2_SEC_CFG bit is 0 on all 85xx boards that are not an 8544.
|
|
|
|
+ */
|
|
|
|
+ if (gur->pordevsr2 & MPC85xx_PORDEVSR2_SEC_CFG)
|
|
|
|
+ gd->i2c1_clk = sys_info.freqSystemBus / 3;
|
|
|
|
+ else
|
|
|
|
+ gd->i2c1_clk = sys_info.freqSystemBus / 2;
|
|
|
|
+#else
|
|
|
|
+ /* Most 85xx SOCs use CCB/2, so this is the default behavior. */
|
|
|
|
+ gd->i2c1_clk = sys_info.freqSystemBus / 2;
|
|
|
|
+#endif
|
|
|
|
+ gd->i2c2_clk = gd->i2c1_clk;
|
|
|
|
|
|
#if defined(CONFIG_CPM2)
|
|
#if defined(CONFIG_CPM2)
|
|
gd->vco_out = 2*sys_info.freqSystemBus;
|
|
gd->vco_out = 2*sys_info.freqSystemBus;
|