Merge branch 'nfs-for-2.6.37' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6
[pandora-kernel.git] / arch / arm / mach-omap2 / mcbsp.c
index 4c9c999..f9c9df5 100644 (file)
@@ -22,7 +22,9 @@
 #include <plat/dma.h>
 #include <plat/cpu.h>
 #include <plat/mcbsp.h>
-#include <plat/control.h>
+
+#include "control.h"
+
 
 /* McBSP internal signal muxing functions */
 
@@ -32,7 +34,7 @@ void omap2_mcbsp1_mux_clkr_src(u8 mux)
 
        v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
        if (mux == CLKR_SRC_CLKR)
-               v &= OMAP2_MCBSP1_CLKR_MASK;
+               v &= ~OMAP2_MCBSP1_CLKR_MASK;
        else if (mux == CLKR_SRC_CLKX)
                v |= OMAP2_MCBSP1_CLKR_MASK;
        omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0);
@@ -45,13 +47,61 @@ void omap2_mcbsp1_mux_fsr_src(u8 mux)
 
        v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
        if (mux == FSR_SRC_FSR)
-               v &= OMAP2_MCBSP1_FSR_MASK;
+               v &= ~OMAP2_MCBSP1_FSR_MASK;
        else if (mux == FSR_SRC_FSX)
                v |= OMAP2_MCBSP1_FSR_MASK;
        omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0);
 }
 EXPORT_SYMBOL(omap2_mcbsp1_mux_fsr_src);
 
+/* McBSP CLKS source switching function */
+
+int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id)
+{
+       struct omap_mcbsp *mcbsp;
+       struct clk *fck_src;
+       char *fck_src_name;
+       int r;
+
+       if (!omap_mcbsp_check_valid_id(id)) {
+               pr_err("%s: Invalid id (%d)\n", __func__, id + 1);
+               return -EINVAL;
+       }
+       mcbsp = id_to_mcbsp_ptr(id);
+
+       if (fck_src_id == MCBSP_CLKS_PAD_SRC)
+               fck_src_name = "pad_fck";
+       else if (fck_src_id == MCBSP_CLKS_PRCM_SRC)
+               fck_src_name = "prcm_fck";
+       else
+               return -EINVAL;
+
+       fck_src = clk_get(mcbsp->dev, fck_src_name);
+       if (IS_ERR_OR_NULL(fck_src)) {
+               pr_err("omap-mcbsp: %s: could not clk_get() %s\n", "clks",
+                      fck_src_name);
+               return -EINVAL;
+       }
+
+       clk_disable(mcbsp->fclk);
+
+       r = clk_set_parent(mcbsp->fclk, fck_src);
+       if (IS_ERR_VALUE(r)) {
+               pr_err("omap-mcbsp: %s: could not clk_set_parent() to %s\n",
+                      "clks", fck_src_name);
+               clk_put(fck_src);
+               return -EINVAL;
+       }
+
+       clk_enable(mcbsp->fclk);
+
+       clk_put(fck_src);
+
+       return 0;
+}
+EXPORT_SYMBOL(omap2_mcbsp_set_clks_src);
+
+
 /* Platform data */
 
 #ifdef CONFIG_ARCH_OMAP2420