summaryrefslogtreecommitdiff
path: root/target/linux/pxa/patches-2.6.21/028-gumstix-asoc.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/pxa/patches-2.6.21/028-gumstix-asoc.patch')
-rw-r--r--target/linux/pxa/patches-2.6.21/028-gumstix-asoc.patch224
1 files changed, 224 insertions, 0 deletions
diff --git a/target/linux/pxa/patches-2.6.21/028-gumstix-asoc.patch b/target/linux/pxa/patches-2.6.21/028-gumstix-asoc.patch
new file mode 100644
index 0000000000..48e64b5764
--- /dev/null
+++ b/target/linux/pxa/patches-2.6.21/028-gumstix-asoc.patch
@@ -0,0 +1,224 @@
+Index: linux-2.6.21gum/sound/soc/pxa/Kconfig
+===================================================================
+--- linux-2.6.21gum.orig/sound/soc/pxa/Kconfig
++++ linux-2.6.21gum/sound/soc/pxa/Kconfig
+@@ -16,6 +16,7 @@ config SND_PXA2XX_SOC_AC97
+ tristate
+ select AC97_BUS
+ select SND_SOC_AC97_BUS
++ select SND_PXA2XX_AC97
+
+ config SND_PXA2XX_SOC_I2S
+ tristate
+@@ -56,4 +57,12 @@ config SND_PXA2XX_SOC_TOSA
+ Say Y if you want to add support for SoC audio on Sharp
+ Zaurus SL-C6000x models (Tosa).
+
++config SND_PXA2XX_SOC_GUMSTIX
++ tristate "SoC AC97 Audio support for Gumstix"
++ depends on SND_PXA2XX_SOC && ARCH_GUMSTIX
++ select SND_PXA2XX_SOC_AC97
++ select SND_SOC_AC97_CODEC
++ help
++ Say Y if you want to add support for SoC audio on Gumstix
++
+ endmenu
+Index: linux-2.6.21gum/sound/soc/pxa/Makefile
+===================================================================
+--- linux-2.6.21gum.orig/sound/soc/pxa/Makefile
++++ linux-2.6.21gum/sound/soc/pxa/Makefile
+@@ -12,9 +12,11 @@ snd-soc-corgi-objs := corgi.o
+ snd-soc-poodle-objs := poodle.o
+ snd-soc-tosa-objs := tosa.o
+ snd-soc-spitz-objs := spitz.o
++snd-soc-gumstix-objs := gumstix.o
+
+ obj-$(CONFIG_SND_PXA2XX_SOC_CORGI) += snd-soc-corgi.o
+ obj-$(CONFIG_SND_PXA2XX_SOC_POODLE) += snd-soc-poodle.o
+ obj-$(CONFIG_SND_PXA2XX_SOC_TOSA) += snd-soc-tosa.o
+ obj-$(CONFIG_SND_PXA2XX_SOC_SPITZ) += snd-soc-spitz.o
++obj-$(CONFIG_SND_PXA2XX_SOC_GUMSTIX) += snd-soc-gumstix.o
+
+Index: linux-2.6.21gum/sound/soc/pxa/gumstix.c
+===================================================================
+--- /dev/null
++++ linux-2.6.21gum/sound/soc/pxa/gumstix.c
+@@ -0,0 +1,109 @@
++/*
++ * gumstix.c -- SoC audio for Gumstix
++ *
++ * Copyright 2005 Wolfson Microelectronics PLC.
++ * Copyright 2005 Openedhand Ltd.
++ * Copyright 2007 Gumstix Inc.
++ *
++ * Authors: Liam Girdwood <liam.girdwood@wolfsonmicro.com>
++ * Richard Purdie <richard@openedhand.com>
++ * Craig Hughes <craig@gumstix.com>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ *
++ * Revision history
++ * 26 April 2007 - Initial revision forked from tosa.c
++ *
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/device.h>
++
++#include <sound/driver.h>
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/soc.h>
++#include <sound/soc-dapm.h>
++
++#include <asm/mach-types.h>
++#include <asm/arch/pxa-regs.h>
++#include <asm/arch/hardware.h>
++#include <asm/arch/audio.h>
++#include <asm/arch/gumstix.h>
++
++#include "pxa2xx-pcm.h"
++#include "pxa2xx-ac97.h"
++#include "../codecs/ac97.h"
++
++static struct snd_soc_machine gumstix;
++
++static int gumstix_ac97_init(struct snd_soc_codec *codec)
++{
++ // For now, do nothing -- should move the ucb1400 patch stuff here
++ return 0;
++}
++
++/* For right now, just add UCB1400 -- once that's working, we can also add
++ * PCM channels via SPI to bluetooth module, GSM module, or whatnot */
++static struct snd_soc_dai_link gumstix_dai[] = {
++{
++ .name = "ucb1400",
++ .stream_name = "UCB1400",
++ .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI],
++ .codec_dai = &ac97_dai,
++ .init = gumstix_ac97_init,
++},
++};
++
++static struct snd_soc_machine snd_soc_machine_gumstix = {
++ .name = "Gumstix",
++ .dai_link = gumstix_dai,
++ .num_links = ARRAY_SIZE(gumstix_dai),
++};
++
++static struct snd_soc_device gumstix_snd_devdata = {
++ .machine = &snd_soc_machine_gumstix,
++ .platform = &pxa2xx_soc_platform,
++ .codec_dev = &soc_codec_dev_ac97,
++};
++
++static struct platform_device *gumstix_snd_device;
++
++static int __init gumstix_init(void)
++{
++ int ret;
++
++ if (!machine_is_gumstix())
++ return -ENODEV;
++
++ gumstix_snd_device = platform_device_alloc("soc-audio", -1);
++ if (!gumstix_snd_device)
++ return -ENOMEM;
++
++ platform_set_drvdata(gumstix_snd_device, &gumstix_snd_devdata);
++ gumstix_snd_devdata.dev = &gumstix_snd_device->dev;
++ ret = platform_device_add(gumstix_snd_device);
++
++ if (ret)
++ platform_device_put(gumstix_snd_device);
++
++ return ret;
++}
++
++static void __exit gumstix_exit(void)
++{
++ platform_device_unregister(gumstix_snd_device);
++}
++
++module_init(gumstix_init);
++module_exit(gumstix_exit);
++
++/* Module information */
++MODULE_AUTHOR("Craig Hughes <craig@gumstix.com>");
++MODULE_DESCRIPTION("ALSA SoC Gumstix");
++MODULE_LICENSE("GPL");
+Index: linux-2.6.21gum/sound/soc/codecs/ac97.c
+===================================================================
+--- linux-2.6.21gum.orig/sound/soc/codecs/ac97.c
++++ linux-2.6.21gum/sound/soc/codecs/ac97.c
+@@ -43,7 +43,7 @@ static int ac97_prepare(struct snd_pcm_s
+ #define STD_AC97_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\
+ SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
+
+-static struct snd_soc_codec_dai ac97_dai = {
++struct snd_soc_codec_dai ac97_dai = {
+ .name = "AC97 HiFi",
+ .playback = {
+ .stream_name = "AC97 Playback",
+@@ -61,6 +61,8 @@ static struct snd_soc_codec_dai ac97_dai
+ .prepare = ac97_prepare,},
+ };
+
++EXPORT_SYMBOL_GPL(ac97_dai);
++
+ static unsigned int ac97_read(struct snd_soc_codec *codec,
+ unsigned int reg)
+ {
+Index: linux-2.6.21gum/sound/soc/codecs/ac97.h
+===================================================================
+--- linux-2.6.21gum.orig/sound/soc/codecs/ac97.h
++++ linux-2.6.21gum/sound/soc/codecs/ac97.h
+@@ -14,5 +14,6 @@
+ #define __LINUX_SND_SOC_AC97_H
+
+ extern struct snd_soc_codec_device soc_codec_dev_ac97;
++extern struct snd_soc_codec_dai ac97_dai;
+
+ #endif
+Index: linux-2.6.21gum/sound/soc/pxa/pxa2xx-ac97.c
+===================================================================
+--- linux-2.6.21gum.orig/sound/soc/pxa/pxa2xx-ac97.c
++++ linux-2.6.21gum/sound/soc/pxa/pxa2xx-ac97.c
+@@ -154,18 +154,26 @@ static void pxa2xx_ac97_warm_reset(struc
+
+ static void pxa2xx_ac97_cold_reset(struct snd_ac97 *ac97)
+ {
+- GCR &= GCR_COLD_RST; /* clear everything but nCRST */
+- GCR &= ~GCR_COLD_RST; /* then assert nCRST */
+-
+- gsr_bits = 0;
+ #ifdef CONFIG_PXA27x
+ /* PXA27x Developers Manual section 13.5.2.2.1 */
++ GCR |= GCR_ACLINK_OFF;
++ udelay(5);
++ GCR &= GCR_COLD_RST; /* Mask all interrupts */
++ GCR &= ~GCR_COLD_RST; /* cold reset */
++ udelay(5);
+ pxa_set_cken(1 << 31, 1);
+ udelay(5);
+- pxa_set_cken(1 << 31, 0);
++ GCR |= GCR_PRIRDY_IEN|GCR_SECRDY_IEN; /* unmask the interrupts */
++ pxa_set_cken(1 << 31, 0); /* clear CKEN31 */
++ udelay(5);
+ GCR = GCR_COLD_RST;
+ udelay(50);
++ wait_event_timeout(gsr_wq, gsr_bits & (GSR_PCR | GSR_SCR), 1);
+ #else
++ GCR &= GCR_COLD_RST; /* clear everything but nCRST */
++ GCR &= ~GCR_COLD_RST; /* then assert nCRST */
++
++ gsr_bits = 0;
+ GCR = GCR_COLD_RST;
+ GCR |= GCR_CDONE_IE|GCR_SDONE_IE;
+ wait_event_timeout(gsr_wq, gsr_bits & (GSR_PCR | GSR_SCR), 1);