Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[pandora-kernel.git] / arch / powerpc / platforms / 52xx / mpc52xx_common.c
index 98367a0..8e3dd5a 100644 (file)
@@ -28,9 +28,10 @@ static struct of_device_id mpc52xx_xlb_ids[] __initdata = {
 static struct of_device_id mpc52xx_bus_ids[] __initdata = {
        { .compatible = "fsl,mpc5200-immr", },
        { .compatible = "fsl,mpc5200b-immr", },
-       { .compatible = "fsl,lpb", },
+       { .compatible = "simple-bus", },
 
        /* depreciated matches; shouldn't be used in new device trees */
+       { .compatible = "fsl,lpb", },
        { .type = "builtin", .compatible = "mpc5200", }, /* efika */
        { .type = "soc", .compatible = "mpc5200", }, /* lite5200 */
        {}
@@ -204,6 +205,43 @@ int mpc52xx_set_psc_clkdiv(int psc_id, int clkdiv)
 }
 EXPORT_SYMBOL(mpc52xx_set_psc_clkdiv);
 
+/**
+ * mpc52xx_get_xtal_freq - Get SYS_XTAL_IN frequency for a device
+ *
+ * @node: device node
+ *
+ * Returns the frequency of the external oscillator clock connected
+ * to the SYS_XTAL_IN pin, or 0 if it cannot be determined.
+ */
+unsigned int mpc52xx_get_xtal_freq(struct device_node *node)
+{
+       u32 val;
+       unsigned int freq;
+
+       if (!mpc52xx_cdm)
+               return 0;
+
+       freq = mpc52xx_find_ipb_freq(node);
+       if (!freq)
+               return 0;
+
+       if (in_8(&mpc52xx_cdm->ipb_clk_sel) & 0x1)
+               freq *= 2;
+
+       val  = in_be32(&mpc52xx_cdm->rstcfg);
+       if (val & (1 << 5))
+               freq *= 8;
+       else
+               freq *= 4;
+       if (val & (1 << 6))
+               freq /= 12;
+       else
+               freq /= 16;
+
+       return freq;
+}
+EXPORT_SYMBOL(mpc52xx_get_xtal_freq);
+
 /**
  * mpc52xx_restart: ppc_md->restart hook for mpc5200 using the watchdog timer
  */