EXPORT_SYMBOL(omap2_mcbsp1_mux_fsr_src);
 
 /* McBSP CLKS source switching function */
-
-int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id)
+static int omap2_mcbsp_set_clk_src(struct device *dev, struct clk *clk,
+                                  const char *src)
 {
-       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)
+       if (!strcmp(src, "clks_ext"))
                fck_src_name = "pad_fck";
-       else if (fck_src_id == MCBSP_CLKS_PRCM_SRC)
+       else if (!strcmp(src, "clks_fclk"))
                fck_src_name = "prcm_fck";
        else
                return -EINVAL;
 
-       fck_src = clk_get(mcbsp->dev, fck_src_name);
+       fck_src = clk_get(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;
        }
 
-       pm_runtime_put_sync(mcbsp->dev);
+       pm_runtime_put_sync(dev);
 
-       r = clk_set_parent(mcbsp->fclk, fck_src);
+       r = clk_set_parent(clk, fck_src);
        if (IS_ERR_VALUE(r)) {
                pr_err("omap-mcbsp: %s: could not clk_set_parent() to %s\n",
                       "clks", fck_src_name);
                return -EINVAL;
        }
 
-       pm_runtime_get_sync(mcbsp->dev);
+       pm_runtime_get_sync(dev);
 
        clk_put(fck_src);
 
        return 0;
 }
-EXPORT_SYMBOL(omap2_mcbsp_set_clks_src);
 
 static int omap3_enable_st_clock(unsigned int id, bool enable)
 {
                                        name, oh->name);
                return PTR_ERR(pdev);
        }
+       pdata->set_clk_src = omap2_mcbsp_set_clk_src;
        omap_mcbsp_count++;
        return 0;
 }
 
 struct omap_mcbsp_ops {
        void (*request)(unsigned int);
        void (*free)(unsigned int);
-       int (*set_clks_src)(u8, u8);
 };
 
 struct omap_mcbsp_platform_data {
        bool has_wakeup; /* Wakeup capability */
        bool has_ccr; /* Transceiver has configuration control registers */
        int (*enable_st_clock)(unsigned int, bool);
+       int (*set_clk_src)(struct device *dev, struct clk *clk, const char *src);
 };
 
 struct omap_mcbsp_st_data {
 extern struct omap_mcbsp **mcbsp_ptr;
 extern int omap_mcbsp_count;
 
-#define omap_mcbsp_check_valid_id(id)  (id < omap_mcbsp_count)
-#define id_to_mcbsp_ptr(id)            mcbsp_ptr[id];
-
 int omap_mcbsp_init(void);
 void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg * config);
 void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold);
 
 struct omap_mcbsp **mcbsp_ptr;
 int omap_mcbsp_count;
 
+#define omap_mcbsp_check_valid_id(id)  (id < omap_mcbsp_count)
+#define id_to_mcbsp_ptr(id)            mcbsp_ptr[id];
+
 static void omap_mcbsp_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val)
 {
        void __iomem *addr = mcbsp->io_base + reg * mcbsp->pdata->reg_step;
 }
 EXPORT_SYMBOL(omap_mcbsp_stop);
 
-/*
- * The following functions are only required on an OMAP1-only build.
- * mach-omap2/mcbsp.c contains the real functions
- */
-#ifndef CONFIG_ARCH_OMAP2PLUS
 int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id)
 {
-       WARN(1, "%s: should never be called on an OMAP1-only kernel\n",
-            __func__);
-       return -EINVAL;
+       struct omap_mcbsp *mcbsp;
+       const char *src;
+
+       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)
+               src = "clks_ext";
+       else if (fck_src_id == MCBSP_CLKS_PRCM_SRC)
+               src = "clks_fclk";
+       else
+               return -EINVAL;
+
+       if (mcbsp->pdata->set_clk_src)
+               return mcbsp->pdata->set_clk_src(mcbsp->dev, mcbsp->fclk, src);
+       else
+               return -EINVAL;
 }
+EXPORT_SYMBOL(omap2_mcbsp_set_clks_src);
 
+#ifndef CONFIG_ARCH_OMAP2PLUS
 void omap2_mcbsp1_mux_clkr_src(u8 mux)
 {
        WARN(1, "%s: should never be called on an OMAP1-only kernel\n",