aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-ep93xx/core.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2010-08-07 20:07:31 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2010-08-07 20:07:31 -0400
commitfaa38b5e0e092914764cdba9f83d31a3f794d182 (patch)
treeb3e5921bdc36378033b4910eb4f29cb0dfc486e0 /arch/arm/mach-ep93xx/core.c
parent78417334b5cb6e1f915b8fdcc4fce3f1a1b4420c (diff)
parent74bf40f0793fed9e01eb6164c2ce63e8c27ca205 (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: (214 commits) ALSA: hda - Add pin-fix for HP dc5750 ALSA: als4000: Fix potentially invalid DMA mode setup ALSA: als4000: enable burst mode ALSA: hda - Fix initial capsrc selection in patch_alc269() ASoC: TWL4030: Capture route runtime DAPM ordering fix ALSA: hda - Add PC-beep whitelist for an Intel board ALSA: hda - More relax for pending period handling ALSA: hda - Define AC_FMT_* constants ALSA: hda - Fix beep frequency on IDT 92HD73xx and 92HD71Bxx codecs ALSA: hda - Add support for HDMI HBR passthrough ALSA: hda - Set Stream Type in Stream Format according to AES0 ALSA: hda - Fix Thinkpad X300 so SPDIF is not exposed ALSA: hda - FIX to not expose SPDIF on Thinkpad X301, since it does not have the ability to use SPDIF ASoC: wm9081: fix resource reclaim in wm9081_register error path ASoC: wm8978: fix a memory leak if a wm8978_register fail ASoC: wm8974: fix a memory leak if another WM8974 is registered ASoC: wm8961: fix resource reclaim in wm8961_register error path ASoC: wm8955: fix resource reclaim in wm8955_register error path ASoC: wm8940: fix a memory leak if wm8940_register return error ASoC: wm8904: fix resource reclaim in wm8904_register error path ...
Diffstat (limited to 'arch/arm/mach-ep93xx/core.c')
-rw-r--r--arch/arm/mach-ep93xx/core.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c
index 8e37a045188..4cb55d3902f 100644
--- a/arch/arm/mach-ep93xx/core.c
+++ b/arch/arm/mach-ep93xx/core.c
@@ -758,6 +758,73 @@ void ep93xx_keypad_release_gpio(struct platform_device *pdev)
758} 758}
759EXPORT_SYMBOL(ep93xx_keypad_release_gpio); 759EXPORT_SYMBOL(ep93xx_keypad_release_gpio);
760 760
761/*************************************************************************
762 * EP93xx I2S audio peripheral handling
763 *************************************************************************/
764static struct resource ep93xx_i2s_resource[] = {
765 {
766 .start = EP93XX_I2S_PHYS_BASE,
767 .end = EP93XX_I2S_PHYS_BASE + 0x100 - 1,
768 .flags = IORESOURCE_MEM,
769 },
770};
771
772static struct platform_device ep93xx_i2s_device = {
773 .name = "ep93xx-i2s",
774 .id = -1,
775 .num_resources = ARRAY_SIZE(ep93xx_i2s_resource),
776 .resource = ep93xx_i2s_resource,
777};
778
779void __init ep93xx_register_i2s(void)
780{
781 platform_device_register(&ep93xx_i2s_device);
782}
783
784#define EP93XX_SYSCON_DEVCFG_I2S_MASK (EP93XX_SYSCON_DEVCFG_I2SONSSP | \
785 EP93XX_SYSCON_DEVCFG_I2SONAC97)
786
787#define EP93XX_I2SCLKDIV_MASK (EP93XX_SYSCON_I2SCLKDIV_ORIDE | \
788 EP93XX_SYSCON_I2SCLKDIV_SPOL)
789
790int ep93xx_i2s_acquire(unsigned i2s_pins, unsigned i2s_config)
791{
792 unsigned val;
793
794 /* Sanity check */
795 if (i2s_pins & ~EP93XX_SYSCON_DEVCFG_I2S_MASK)
796 return -EINVAL;
797 if (i2s_config & ~EP93XX_I2SCLKDIV_MASK)
798 return -EINVAL;
799
800 /* Must have only one of I2SONSSP/I2SONAC97 set */
801 if ((i2s_pins & EP93XX_SYSCON_DEVCFG_I2SONSSP) ==
802 (i2s_pins & EP93XX_SYSCON_DEVCFG_I2SONAC97))
803 return -EINVAL;
804
805 ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_I2S_MASK);
806 ep93xx_devcfg_set_bits(i2s_pins);
807
808 /*
809 * This is potentially racy with the clock api for i2s_mclk, sclk and
810 * lrclk. Since the i2s driver is the only user of those clocks we
811 * rely on it to prevent parallel use of this function and the
812 * clock api for the i2s clocks.
813 */
814 val = __raw_readl(EP93XX_SYSCON_I2SCLKDIV);
815 val &= ~EP93XX_I2SCLKDIV_MASK;
816 val |= i2s_config;
817 ep93xx_syscon_swlocked_write(val, EP93XX_SYSCON_I2SCLKDIV);
818
819 return 0;
820}
821EXPORT_SYMBOL(ep93xx_i2s_acquire);
822
823void ep93xx_i2s_release(void)
824{
825 ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_I2S_MASK);
826}
827EXPORT_SYMBOL(ep93xx_i2s_release);
761 828
762extern void ep93xx_gpio_init(void); 829extern void ep93xx_gpio_init(void);
763 830