diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-08-22 15:19:01 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-08-22 15:19:01 -0400 |
commit | 2bbf6078dc948e87564c1a947f23ea4cf2349a13 (patch) | |
tree | 2fc93ee7a26febb4ff9554e40043f8e097726c6d /arch/arm | |
parent | 02e79476998ba7e62842d20dca898c403ad55c7e (diff) | |
parent | b8101048f0f3cd281ed4c4901e38ae2bcfb32030 (diff) |
Merge branch 'asoc-omap' into for-3.7
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-omap2/board-am3517evm.c | 13 | ||||
-rw-r--r-- | arch/arm/mach-omap2/mcbsp.c | 126 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/mcbsp.h | 2 |
3 files changed, 20 insertions, 121 deletions
diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-omap2/board-am3517evm.c index 18f601096ce1..592812af84da 100644 --- a/arch/arm/mach-omap2/board-am3517evm.c +++ b/arch/arm/mach-omap2/board-am3517evm.c | |||
@@ -264,6 +264,16 @@ static __init void am3517_evm_musb_init(void) | |||
264 | usb_musb_init(&musb_board_data); | 264 | usb_musb_init(&musb_board_data); |
265 | } | 265 | } |
266 | 266 | ||
267 | static __init void am3517_evm_mcbsp1_init(void) | ||
268 | { | ||
269 | u32 devconf0; | ||
270 | |||
271 | /* McBSP1 CLKR/FSR signal to be connected to CLKX/FSX pin */ | ||
272 | devconf0 = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); | ||
273 | devconf0 |= OMAP2_MCBSP1_CLKR_MASK | OMAP2_MCBSP1_FSR_MASK; | ||
274 | omap_ctrl_writel(devconf0, OMAP2_CONTROL_DEVCONF0); | ||
275 | } | ||
276 | |||
267 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | 277 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { |
268 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | 278 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, |
269 | #if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \ | 279 | #if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \ |
@@ -373,6 +383,9 @@ static void __init am3517_evm_init(void) | |||
373 | /* MUSB */ | 383 | /* MUSB */ |
374 | am3517_evm_musb_init(); | 384 | am3517_evm_musb_init(); |
375 | 385 | ||
386 | /* McBSP1 */ | ||
387 | am3517_evm_mcbsp1_init(); | ||
388 | |||
376 | /* MMC init function */ | 389 | /* MMC init function */ |
377 | omap_hsmmc_init(mmc); | 390 | omap_hsmmc_init(mmc); |
378 | } | 391 | } |
diff --git a/arch/arm/mach-omap2/mcbsp.c b/arch/arm/mach-omap2/mcbsp.c index 577cb77db26c..d57a3578bf03 100644 --- a/arch/arm/mach-omap2/mcbsp.c +++ b/arch/arm/mach-omap2/mcbsp.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/clk.h> | 15 | #include <linux/clk.h> |
16 | #include <linux/err.h> | 16 | #include <linux/err.h> |
17 | #include <linux/io.h> | 17 | #include <linux/io.h> |
18 | #include <linux/of.h> | ||
18 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
19 | #include <linux/slab.h> | 20 | #include <linux/slab.h> |
20 | 21 | ||
@@ -25,8 +26,6 @@ | |||
25 | #include <plat/omap_device.h> | 26 | #include <plat/omap_device.h> |
26 | #include <linux/pm_runtime.h> | 27 | #include <linux/pm_runtime.h> |
27 | 28 | ||
28 | #include "control.h" | ||
29 | |||
30 | /* | 29 | /* |
31 | * FIXME: Find a mechanism to enable/disable runtime the McBSP ICLK autoidle. | 30 | * FIXME: Find a mechanism to enable/disable runtime the McBSP ICLK autoidle. |
32 | * Sidetone needs non-gated ICLK and sidetone autoidle is broken. | 31 | * Sidetone needs non-gated ICLK and sidetone autoidle is broken. |
@@ -34,112 +33,6 @@ | |||
34 | #include "cm2xxx_3xxx.h" | 33 | #include "cm2xxx_3xxx.h" |
35 | #include "cm-regbits-34xx.h" | 34 | #include "cm-regbits-34xx.h" |
36 | 35 | ||
37 | /* McBSP1 internal signal muxing function for OMAP2/3 */ | ||
38 | static int omap2_mcbsp1_mux_rx_clk(struct device *dev, const char *signal, | ||
39 | const char *src) | ||
40 | { | ||
41 | u32 v; | ||
42 | |||
43 | v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); | ||
44 | |||
45 | if (!strcmp(signal, "clkr")) { | ||
46 | if (!strcmp(src, "clkr")) | ||
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 | } | ||
62 | |||
63 | omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0); | ||
64 | |||
65 | return 0; | ||
66 | } | ||
67 | |||
68 | /* McBSP4 internal signal muxing function for OMAP4 */ | ||
69 | #define OMAP4_CONTROL_MCBSPLP_ALBCTRLRX_FSX (1 << 31) | ||
70 | #define OMAP4_CONTROL_MCBSPLP_ALBCTRLRX_CLKX (1 << 30) | ||
71 | static int omap4_mcbsp4_mux_rx_clk(struct device *dev, const char *signal, | ||
72 | const char *src) | ||
73 | { | ||
74 | u32 v; | ||
75 | |||
76 | /* | ||
77 | * In CONTROL_MCBSPLP register only bit 30 (CLKR mux), and bit 31 (FSR | ||
78 | * mux) is used */ | ||
79 | v = omap4_ctrl_pad_readl(OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_MCBSPLP); | ||
80 | |||
81 | if (!strcmp(signal, "clkr")) { | ||
82 | if (!strcmp(src, "clkr")) | ||
83 | v &= ~OMAP4_CONTROL_MCBSPLP_ALBCTRLRX_CLKX; | ||
84 | else if (!strcmp(src, "clkx")) | ||
85 | v |= OMAP4_CONTROL_MCBSPLP_ALBCTRLRX_CLKX; | ||
86 | else | ||
87 | return -EINVAL; | ||
88 | } else if (!strcmp(signal, "fsr")) { | ||
89 | if (!strcmp(src, "fsr")) | ||
90 | v &= ~OMAP4_CONTROL_MCBSPLP_ALBCTRLRX_FSX; | ||
91 | else if (!strcmp(src, "fsx")) | ||
92 | v |= OMAP4_CONTROL_MCBSPLP_ALBCTRLRX_FSX; | ||
93 | else | ||
94 | return -EINVAL; | ||
95 | } else { | ||
96 | return -EINVAL; | ||
97 | } | ||
98 | |||
99 | omap4_ctrl_pad_writel(v, OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_MCBSPLP); | ||
100 | |||
101 | return 0; | ||
102 | } | ||
103 | |||
104 | /* McBSP CLKS source switching function */ | ||
105 | static int omap2_mcbsp_set_clk_src(struct device *dev, struct clk *clk, | ||
106 | const char *src) | ||
107 | { | ||
108 | struct clk *fck_src; | ||
109 | char *fck_src_name; | ||
110 | int r; | ||
111 | |||
112 | if (!strcmp(src, "clks_ext")) | ||
113 | fck_src_name = "pad_fck"; | ||
114 | else if (!strcmp(src, "clks_fclk")) | ||
115 | fck_src_name = "prcm_fck"; | ||
116 | else | ||
117 | return -EINVAL; | ||
118 | |||
119 | fck_src = clk_get(dev, fck_src_name); | ||
120 | if (IS_ERR_OR_NULL(fck_src)) { | ||
121 | pr_err("omap-mcbsp: %s: could not clk_get() %s\n", "clks", | ||
122 | fck_src_name); | ||
123 | return -EINVAL; | ||
124 | } | ||
125 | |||
126 | pm_runtime_put_sync(dev); | ||
127 | |||
128 | r = clk_set_parent(clk, fck_src); | ||
129 | if (IS_ERR_VALUE(r)) { | ||
130 | pr_err("omap-mcbsp: %s: could not clk_set_parent() to %s\n", | ||
131 | "clks", fck_src_name); | ||
132 | clk_put(fck_src); | ||
133 | return -EINVAL; | ||
134 | } | ||
135 | |||
136 | pm_runtime_get_sync(dev); | ||
137 | |||
138 | clk_put(fck_src); | ||
139 | |||
140 | return 0; | ||
141 | } | ||
142 | |||
143 | static int omap3_enable_st_clock(unsigned int id, bool enable) | 36 | static int omap3_enable_st_clock(unsigned int id, bool enable) |
144 | { | 37 | { |
145 | unsigned int w; | 38 | unsigned int w; |
@@ -181,17 +74,11 @@ static int __init omap_init_mcbsp(struct omap_hwmod *oh, void *unused) | |||
181 | pdata->reg_size = 4; | 74 | pdata->reg_size = 4; |
182 | pdata->has_ccr = true; | 75 | pdata->has_ccr = true; |
183 | } | 76 | } |
184 | pdata->set_clk_src = omap2_mcbsp_set_clk_src; | ||
185 | |||
186 | /* On OMAP2/3 the McBSP1 port has 6 pin configuration */ | ||
187 | if (id == 1 && oh->class->rev < MCBSP_CONFIG_TYPE4) | ||
188 | pdata->mux_signal = omap2_mcbsp1_mux_rx_clk; | ||
189 | 77 | ||
190 | /* On OMAP4 the McBSP4 port has 6 pin configuration */ | 78 | if (oh->class->rev == MCBSP_CONFIG_TYPE2) { |
191 | if (id == 4 && oh->class->rev == MCBSP_CONFIG_TYPE4) | 79 | /* The FIFO has 128 locations */ |
192 | pdata->mux_signal = omap4_mcbsp4_mux_rx_clk; | 80 | pdata->buffer_size = 0x80; |
193 | 81 | } else if (oh->class->rev == MCBSP_CONFIG_TYPE3) { | |
194 | if (oh->class->rev == MCBSP_CONFIG_TYPE3) { | ||
195 | if (id == 2) | 82 | if (id == 2) |
196 | /* The FIFO has 1024 + 256 locations */ | 83 | /* The FIFO has 1024 + 256 locations */ |
197 | pdata->buffer_size = 0x500; | 84 | pdata->buffer_size = 0x500; |
@@ -227,7 +114,8 @@ static int __init omap_init_mcbsp(struct omap_hwmod *oh, void *unused) | |||
227 | 114 | ||
228 | static int __init omap2_mcbsp_init(void) | 115 | static int __init omap2_mcbsp_init(void) |
229 | { | 116 | { |
230 | omap_hwmod_for_each_by_class("mcbsp", omap_init_mcbsp, NULL); | 117 | if (!of_have_populated_dt()) |
118 | omap_hwmod_for_each_by_class("mcbsp", omap_init_mcbsp, NULL); | ||
231 | 119 | ||
232 | return 0; | 120 | return 0; |
233 | } | 121 | } |
diff --git a/arch/arm/plat-omap/include/plat/mcbsp.h b/arch/arm/plat-omap/include/plat/mcbsp.h index 18814127809a..c78d90b28b19 100644 --- a/arch/arm/plat-omap/include/plat/mcbsp.h +++ b/arch/arm/plat-omap/include/plat/mcbsp.h | |||
@@ -47,8 +47,6 @@ struct omap_mcbsp_platform_data { | |||
47 | bool has_wakeup; /* Wakeup capability */ | 47 | bool has_wakeup; /* Wakeup capability */ |
48 | bool has_ccr; /* Transceiver has configuration control registers */ | 48 | bool has_ccr; /* Transceiver has configuration control registers */ |
49 | int (*enable_st_clock)(unsigned int, bool); | 49 | int (*enable_st_clock)(unsigned int, bool); |
50 | int (*set_clk_src)(struct device *dev, struct clk *clk, const char *src); | ||
51 | int (*mux_signal)(struct device *dev, const char *signal, const char *src); | ||
52 | }; | 50 | }; |
53 | 51 | ||
54 | /** | 52 | /** |