aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJarkko Nikula <jarkko.nikula@bitmer.com>2011-09-26 03:45:49 -0400
committerTony Lindgren <tony@atomide.com>2011-09-26 20:49:07 -0400
commit7bc0c4bac72375517d904e02c46da2a23e079e8b (patch)
treece6c581b486751062adafd0e33c126ccb183c116
parent09d28d2c19fe5c2d51b3133329584166dec89f86 (diff)
ARM: OMAP: mcbsp: Start generalize signal muxing functions
This generalizes the omap2_mcbsp1_mux_clkr_src and omap2_mcbsp1_mux_fsr_src implementation between generic McBSP and OMAP2 specific McBSP code. These functions are used to select source for CLKR and FSR signals on OMAP2+. Start generalizing the code by implementing an optional mux_signal function pointer in platform data that will implement the actual muxing and which is called now from omap2_mcbsp1_mux_clkr_src and omap2_mcbsp1_mux_fsr_src. These functions are to be removed later and cleanup the API so that mux_signal gets its arguments directly from client code. Signed-off-by: Jarkko Nikula <jarkko.nikula@bitmer.com> Acked-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Tested-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl> Signed-off-by: Tony Lindgren <tony@atomide.com>
-rw-r--r--arch/arm/mach-omap2/mcbsp.c43
-rw-r--r--arch/arm/plat-omap/include/plat/mcbsp.h1
-rw-r--r--arch/arm/plat-omap/mcbsp.c36
3 files changed, 53 insertions, 27 deletions
diff --git a/arch/arm/mach-omap2/mcbsp.c b/arch/arm/mach-omap2/mcbsp.c
index 3dd4c473809e..5063f253c4b9 100644
--- a/arch/arm/mach-omap2/mcbsp.c
+++ b/arch/arm/mach-omap2/mcbsp.c
@@ -34,33 +34,36 @@
34#include "cm2xxx_3xxx.h" 34#include "cm2xxx_3xxx.h"
35#include "cm-regbits-34xx.h" 35#include "cm-regbits-34xx.h"
36 36
37/* McBSP internal signal muxing functions */ 37/* McBSP internal signal muxing function */
38 38static int omap2_mcbsp1_mux_rx_clk(struct device *dev, const char *signal,
39void omap2_mcbsp1_mux_clkr_src(u8 mux) 39 const char *src)
40{ 40{
41 u32 v; 41 u32 v;
42 42
43 v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); 43 v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
44 if (mux == CLKR_SRC_CLKR)
45 v &= ~OMAP2_MCBSP1_CLKR_MASK;
46 else if (mux == CLKR_SRC_CLKX)
47 v |= OMAP2_MCBSP1_CLKR_MASK;
48 omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0);
49}
50EXPORT_SYMBOL(omap2_mcbsp1_mux_clkr_src);
51 44
52void omap2_mcbsp1_mux_fsr_src(u8 mux) 45 if (!strcmp(signal, "clkr")) {
53{ 46 if (!strcmp(src, "clkr"))
54 u32 v; 47 v &= ~OMAP2_MCBSP1_CLKR_MASK;
48 else if (!strcmp(src, "clkx"))
49 v |= OMAP2_MCBSP1_CLKR_MASK;
50 else
51 return -EINVAL;
52 } else if (!strcmp(signal, "fsr")) {
53 if (!strcmp(src, "fsr"))
54 v &= ~OMAP2_MCBSP1_FSR_MASK;
55 else if (!strcmp(src, "fsx"))
56 v |= OMAP2_MCBSP1_FSR_MASK;
57 else
58 return -EINVAL;
59 } else {
60 return -EINVAL;
61 }
55 62
56 v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
57 if (mux == FSR_SRC_FSR)
58 v &= ~OMAP2_MCBSP1_FSR_MASK;
59 else if (mux == FSR_SRC_FSX)
60 v |= OMAP2_MCBSP1_FSR_MASK;
61 omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0); 63 omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0);
64
65 return 0;
62} 66}
63EXPORT_SYMBOL(omap2_mcbsp1_mux_fsr_src);
64 67
65/* McBSP CLKS source switching function */ 68/* McBSP CLKS source switching function */
66static int omap2_mcbsp_set_clk_src(struct device *dev, struct clk *clk, 69static int omap2_mcbsp_set_clk_src(struct device *dev, struct clk *clk,
@@ -181,6 +184,8 @@ static int omap_init_mcbsp(struct omap_hwmod *oh, void *unused)
181 return PTR_ERR(pdev); 184 return PTR_ERR(pdev);
182 } 185 }
183 pdata->set_clk_src = omap2_mcbsp_set_clk_src; 186 pdata->set_clk_src = omap2_mcbsp_set_clk_src;
187 if (id == 1)
188 pdata->mux_signal = omap2_mcbsp1_mux_rx_clk;
184 omap_mcbsp_count++; 189 omap_mcbsp_count++;
185 return 0; 190 return 0;
186} 191}
diff --git a/arch/arm/plat-omap/include/plat/mcbsp.h b/arch/arm/plat-omap/include/plat/mcbsp.h
index c8ebfc9e92ff..8fa74e2c9d6e 100644
--- a/arch/arm/plat-omap/include/plat/mcbsp.h
+++ b/arch/arm/plat-omap/include/plat/mcbsp.h
@@ -309,6 +309,7 @@ struct omap_mcbsp_platform_data {
309 bool has_ccr; /* Transceiver has configuration control registers */ 309 bool has_ccr; /* Transceiver has configuration control registers */
310 int (*enable_st_clock)(unsigned int, bool); 310 int (*enable_st_clock)(unsigned int, bool);
311 int (*set_clk_src)(struct device *dev, struct clk *clk, const char *src); 311 int (*set_clk_src)(struct device *dev, struct clk *clk, const char *src);
312 int (*mux_signal)(struct device *dev, const char *signal, const char *src);
312}; 313};
313 314
314struct omap_mcbsp_st_data { 315struct omap_mcbsp_st_data {
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
index 38b67d9be5b3..4b15cd7926d7 100644
--- a/arch/arm/plat-omap/mcbsp.c
+++ b/arch/arm/plat-omap/mcbsp.c
@@ -922,21 +922,41 @@ int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id)
922} 922}
923EXPORT_SYMBOL(omap2_mcbsp_set_clks_src); 923EXPORT_SYMBOL(omap2_mcbsp_set_clks_src);
924 924
925#ifndef CONFIG_ARCH_OMAP2PLUS
926void omap2_mcbsp1_mux_clkr_src(u8 mux) 925void omap2_mcbsp1_mux_clkr_src(u8 mux)
927{ 926{
928 WARN(1, "%s: should never be called on an OMAP1-only kernel\n", 927 struct omap_mcbsp *mcbsp;
929 __func__); 928 const char *src;
930 return; 929
930 if (mux == CLKR_SRC_CLKR)
931 src = "clkr";
932 else if (mux == CLKR_SRC_CLKX)
933 src = "clkx";
934 else
935 return;
936
937 mcbsp = id_to_mcbsp_ptr(0);
938 if (mcbsp->pdata->mux_signal)
939 mcbsp->pdata->mux_signal(mcbsp->dev, "clkr", src);
931} 940}
941EXPORT_SYMBOL(omap2_mcbsp1_mux_clkr_src);
932 942
933void omap2_mcbsp1_mux_fsr_src(u8 mux) 943void omap2_mcbsp1_mux_fsr_src(u8 mux)
934{ 944{
935 WARN(1, "%s: should never be called on an OMAP1-only kernel\n", 945 struct omap_mcbsp *mcbsp;
936 __func__); 946 const char *src;
937 return; 947
948 if (mux == FSR_SRC_FSR)
949 src = "fsr";
950 else if (mux == FSR_SRC_FSX)
951 src = "fsx";
952 else
953 return;
954
955 mcbsp = id_to_mcbsp_ptr(0);
956 if (mcbsp->pdata->mux_signal)
957 mcbsp->pdata->mux_signal(mcbsp->dev, "fsr", src);
938} 958}
939#endif 959EXPORT_SYMBOL(omap2_mcbsp1_mux_fsr_src);
940 960
941#define max_thres(m) (mcbsp->pdata->buffer_size) 961#define max_thres(m) (mcbsp->pdata->buffer_size)
942#define valid_threshold(m, val) ((val) <= max_thres(m)) 962#define valid_threshold(m, val) ((val) <= max_thres(m))