diff options
author | Paul Walmsley <paul@pwsan.com> | 2010-10-08 13:40:19 -0400 |
---|---|---|
committer | Paul Walmsley <paul@pwsan.com> | 2010-10-08 13:40:19 -0400 |
commit | d13586574d373ef40acd4725c9a269daa355e412 (patch) | |
tree | 93e4a7c46fa0c2e1cccea572ef995dbde5c1fd19 /sound/soc/omap | |
parent | cf4c87abe238ec17cd0255b4e21abd949d7f811e (diff) |
OMAP: McBSP: implement functional clock switching via clock framework
Previously the OMAP McBSP ASoC driver implemented CLKS switching by
using omap_ctrl_{read,write}l() directly. This is against policy; the OMAP
System Control Module functions are not intended to be exported to drivers.
These symbols are no longer exported, so as a result, the OMAP McBSP ASoC
driver does not build as a module.
Resolve the CLKS clock changing portion of this problem by creating a
clock parent changing function that lives in
arch/arm/mach-omap2/mcbsp.c, and modify the ASoC driver to use it.
Due to the unfortunate way that McBSP support is implemented in ASoC
and the OMAP tree, this symbol must be exported for use by
sound/soc/omap/omap-mcbsp.c.
Going forward, the McBSP device driver should be moved from
arch/arm/*omap* into drivers/ or sound/soc/* and the CPU DAI driver
should be implemented as a platform_driver as many other ASoC CPU DAI
drivers are. These two steps should resolve many of the layering
problems, which will rapidly reappear during a McBSP hwmod/PM runtime
conversions.
Signed-off-by: Paul Walmsley <paul@pwsan.com>
Acked-by: Jarkko Nikula <jhnikula@gmail.com>
Acked-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/omap')
-rw-r--r-- | sound/soc/omap/omap-mcbsp.c | 69 |
1 files changed, 13 insertions, 56 deletions
diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index f50a5abb470f..b59ad11466a9 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c | |||
@@ -31,7 +31,6 @@ | |||
31 | #include <sound/initval.h> | 31 | #include <sound/initval.h> |
32 | #include <sound/soc.h> | 32 | #include <sound/soc.h> |
33 | 33 | ||
34 | #include <plat/control.h> | ||
35 | #include <plat/dma.h> | 34 | #include <plat/dma.h> |
36 | #include <plat/mcbsp.h> | 35 | #include <plat/mcbsp.h> |
37 | #include "omap-mcbsp.h" | 36 | #include "omap-mcbsp.h" |
@@ -608,66 +607,12 @@ static int omap_mcbsp_dai_set_clkdiv(struct snd_soc_dai *cpu_dai, | |||
608 | return 0; | 607 | return 0; |
609 | } | 608 | } |
610 | 609 | ||
611 | static int omap_mcbsp_dai_set_clks_src(struct omap_mcbsp_data *mcbsp_data, | ||
612 | int clk_id) | ||
613 | { | ||
614 | int sel_bit; | ||
615 | u16 reg, reg_devconf1 = OMAP243X_CONTROL_DEVCONF1; | ||
616 | |||
617 | if (cpu_class_is_omap1()) { | ||
618 | /* OMAP1's can use only external source clock */ | ||
619 | if (unlikely(clk_id == OMAP_MCBSP_SYSCLK_CLKS_FCLK)) | ||
620 | return -EINVAL; | ||
621 | else | ||
622 | return 0; | ||
623 | } | ||
624 | |||
625 | if (cpu_is_omap2420() && mcbsp_data->bus_id > 1) | ||
626 | return -EINVAL; | ||
627 | |||
628 | if (cpu_is_omap343x()) | ||
629 | reg_devconf1 = OMAP343X_CONTROL_DEVCONF1; | ||
630 | |||
631 | switch (mcbsp_data->bus_id) { | ||
632 | case 0: | ||
633 | reg = OMAP2_CONTROL_DEVCONF0; | ||
634 | sel_bit = 2; | ||
635 | break; | ||
636 | case 1: | ||
637 | reg = OMAP2_CONTROL_DEVCONF0; | ||
638 | sel_bit = 6; | ||
639 | break; | ||
640 | case 2: | ||
641 | reg = reg_devconf1; | ||
642 | sel_bit = 0; | ||
643 | break; | ||
644 | case 3: | ||
645 | reg = reg_devconf1; | ||
646 | sel_bit = 2; | ||
647 | break; | ||
648 | case 4: | ||
649 | reg = reg_devconf1; | ||
650 | sel_bit = 4; | ||
651 | break; | ||
652 | default: | ||
653 | return -EINVAL; | ||
654 | } | ||
655 | |||
656 | if (clk_id == OMAP_MCBSP_SYSCLK_CLKS_FCLK) | ||
657 | omap_ctrl_writel(omap_ctrl_readl(reg) & ~(1 << sel_bit), reg); | ||
658 | else | ||
659 | omap_ctrl_writel(omap_ctrl_readl(reg) | (1 << sel_bit), reg); | ||
660 | |||
661 | return 0; | ||
662 | } | ||
663 | |||
664 | static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai, | 610 | static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai, |
665 | int clk_id, unsigned int freq, | 611 | int clk_id, unsigned int freq, |
666 | int dir) | 612 | int dir) |
667 | { | 613 | { |
668 | struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); | 614 | struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); |
669 | struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs; | 615 | struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs; |
670 | struct omap_mcbsp_platform_data *pdata = cpu_dai->dev->platform_data; | ||
671 | int err = 0; | 616 | int err = 0; |
672 | 617 | ||
673 | /* The McBSP signal muxing functions are only available on McBSP1 */ | 618 | /* The McBSP signal muxing functions are only available on McBSP1 */ |
@@ -685,8 +630,20 @@ static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai, | |||
685 | regs->srgr2 |= CLKSM; | 630 | regs->srgr2 |= CLKSM; |
686 | break; | 631 | break; |
687 | case OMAP_MCBSP_SYSCLK_CLKS_FCLK: | 632 | case OMAP_MCBSP_SYSCLK_CLKS_FCLK: |
633 | if (cpu_class_is_omap1()) { | ||
634 | err = -EINVAL; | ||
635 | break; | ||
636 | } | ||
637 | err = omap2_mcbsp_set_clks_src(mcbsp_data->bus_id, | ||
638 | MCBSP_CLKS_PRCM_SRC); | ||
639 | break; | ||
688 | case OMAP_MCBSP_SYSCLK_CLKS_EXT: | 640 | case OMAP_MCBSP_SYSCLK_CLKS_EXT: |
689 | err = omap_mcbsp_dai_set_clks_src(mcbsp_data, clk_id); | 641 | if (cpu_class_is_omap1()) { |
642 | err = 0; | ||
643 | break; | ||
644 | } | ||
645 | err = omap2_mcbsp_set_clks_src(mcbsp_data->bus_id, | ||
646 | MCBSP_CLKS_PAD_SRC); | ||
690 | break; | 647 | break; |
691 | 648 | ||
692 | case OMAP_MCBSP_SYSCLK_CLKX_EXT: | 649 | case OMAP_MCBSP_SYSCLK_CLKX_EXT: |