aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0004-AFEB9260-ASoC-driver.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0004-AFEB9260-ASoC-driver.patch')
-rw-r--r--recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0004-AFEB9260-ASoC-driver.patch288
1 files changed, 288 insertions, 0 deletions
diff --git a/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0004-AFEB9260-ASoC-driver.patch b/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0004-AFEB9260-ASoC-driver.patch
new file mode 100644
index 0000000000..14d5b4c194
--- /dev/null
+++ b/recipes/linux/linux-2.6.29+2.6.30-rc4/afeb9260/0004-AFEB9260-ASoC-driver.patch
@@ -0,0 +1,288 @@
+From 3c3cda9dad06e4fd30b3ed794881bdcc95131df8 Mon Sep 17 00:00:00 2001
+From: Sergey Lapin <slapin@ossfans.org>
+Date: Sat, 18 Oct 2008 08:50:13 +0400
+Subject: [PATCH] AFEB9260 ASoC driver
+
+
+Signed-off-by: Sergey Lapin <slapin@ossfans.org>
+---
+ arch/arm/mach-at91/board-afeb-9260v1.c | 4 +
+ sound/soc/atmel/Kconfig | 8 ++
+ sound/soc/atmel/Makefile | 1 +
+ sound/soc/atmel/afeb9260.c | 217 ++++++++++++++++++++++++++++++++
+ 4 files changed, 230 insertions(+), 0 deletions(-)
+ create mode 100644 sound/soc/atmel/afeb9260.c
+
+diff --git a/arch/arm/mach-at91/board-afeb-9260v1.c b/arch/arm/mach-at91/board-afeb-9260v1.c
+index e263fda..e3f1c56 100644
+--- a/arch/arm/mach-at91/board-afeb-9260v1.c
++++ b/arch/arm/mach-at91/board-afeb-9260v1.c
+@@ -164,6 +164,8 @@ static struct at91_mmc_data __initdata afeb9260_mmc_data = {
+
+ static struct i2c_board_info __initdata afeb9260_i2c_devices[] = {
+ {
++ I2C_BOARD_INFO("tlv320aic23", 0x1a),
++ }, {
+ I2C_BOARD_INFO("fm3130", 0x68),
+ }, {
+ I2C_BOARD_INFO("24c64", 0x50),
+@@ -196,6 +198,8 @@ static void __init afeb9260_board_init(void)
+ /* I2C */
+ at91_add_device_i2c(afeb9260_i2c_devices,
+ ARRAY_SIZE(afeb9260_i2c_devices));
++ /* Audio */
++ at91_add_device_ssc(AT91SAM9260_ID_SSC, ATMEL_SSC_TX);
+ }
+
+ MACHINE_START(AFEB9260, "Custom afeb9260 board")
+diff --git a/sound/soc/atmel/Kconfig b/sound/soc/atmel/Kconfig
+index a608d70..e720d5e 100644
+--- a/sound/soc/atmel/Kconfig
++++ b/sound/soc/atmel/Kconfig
+@@ -41,3 +41,11 @@ config SND_AT32_SOC_PLAYPAQ_SLAVE
+ and FRAME signals on the PlayPaq. Unless you want to play
+ with the AT32 as the SSC master, you probably want to say N here,
+ as this will give you better sound quality.
++
++config SND_AT91_SOC_AFEB9260
++ tristate "SoC Audio support for AFEB9260 board"
++ depends on ARCH_AT91 && MACH_AFEB9260 && SND_ATMEL_SOC
++ select SND_ATMEL_SOC_SSC
++ select SND_SOC_TLV320AIC23
++ help
++ Say Y here to support sound on AFEB9260 board.
+diff --git a/sound/soc/atmel/Makefile b/sound/soc/atmel/Makefile
+index f54a7cc..ac2df98 100644
+--- a/sound/soc/atmel/Makefile
++++ b/sound/soc/atmel/Makefile
+@@ -13,3 +13,4 @@ snd-soc-playpaq-objs := playpaq_wm8510.o
+
+ obj-$(CONFIG_SND_AT91_SOC_SAM9G20_WM8731) += snd-soc-sam9g20-wm8731.o
+ obj-$(CONFIG_SND_AT32_SOC_PLAYPAQ) += snd-soc-playpaq.o
++obj-$(CONFIG_SND_AT91_SOC_AFEB9260) += afeb9260.o
+diff --git a/sound/soc/atmel/afeb9260.c b/sound/soc/atmel/afeb9260.c
+new file mode 100644
+index 0000000..1514d8d
+--- /dev/null
++++ b/sound/soc/atmel/afeb9260.c
+@@ -0,0 +1,217 @@
++/*
++ * afeb9260.c -- SoC audio for AFEB9260
++ *
++ * Copyright (C) 2008 Sergey Lapin <slapin@ossfans.org>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * version 2 as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
++ * 02110-1301 USA
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/kernel.h>
++#include <linux/clk.h>
++#include <linux/platform_device.h>
++
++#include <linux/atmel-ssc.h>
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/pcm_params.h>
++#include <sound/soc.h>
++#include <sound/soc-dapm.h>
++
++#include <asm/mach-types.h>
++#include <mach/hardware.h>
++#include <linux/gpio.h>
++
++#include "../codecs/tlv320aic23.h"
++#include "atmel-pcm.h"
++#include "atmel_ssc_dai.h"
++
++#define CODEC_CLOCK 12000000
++
++static int afeb9260_startup(struct snd_pcm_substream *substream)
++{
++ return 1;
++}
++
++static void afeb9260_shutdown(struct snd_pcm_substream *substream)
++{
++ struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream);
++
++ dev_dbg(rtd->socdev->dev, "shutdown");
++}
++
++static int afeb9260_hw_params(struct snd_pcm_substream *substream,
++ struct snd_pcm_hw_params *params)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
++ struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
++ int err;
++
++ /* Set codec DAI configuration */
++ err = snd_soc_dai_set_fmt(codec_dai,
++ SND_SOC_DAIFMT_I2S|
++ SND_SOC_DAIFMT_NB_IF |
++ SND_SOC_DAIFMT_CBM_CFM);
++ if (err < 0) {
++ printk(KERN_ERR "can't set codec DAI configuration\n");
++ return err;
++ }
++
++ /* Set cpu DAI configuration */
++ err = snd_soc_dai_set_fmt(cpu_dai,
++ SND_SOC_DAIFMT_I2S |
++ SND_SOC_DAIFMT_NB_IF |
++ SND_SOC_DAIFMT_CBM_CFM);
++ if (err < 0) {
++ printk(KERN_ERR "can't set cpu DAI configuration\n");
++ return err;
++ }
++
++ /* Set the codec system clock for DAC and ADC */
++ err =
++ snd_soc_dai_set_sysclk(codec_dai, 0, CODEC_CLOCK, SND_SOC_CLOCK_IN);
++
++ if (err < 0) {
++ printk(KERN_ERR "can't set codec system clock\n");
++ return err;
++ }
++
++ return err;
++}
++
++static struct snd_soc_ops afeb9260_ops = {
++ .startup = afeb9260_startup,
++ .hw_params = afeb9260_hw_params,
++ .shutdown = afeb9260_shutdown,
++};
++
++static const struct snd_soc_dapm_widget tlv320aic23_dapm_widgets[] = {
++ SND_SOC_DAPM_HP("Headphone Jack", NULL),
++ SND_SOC_DAPM_LINE("Line In", NULL),
++ SND_SOC_DAPM_MIC("Mic Jack", NULL),
++};
++
++static const struct snd_soc_dapm_route audio_map[] = {
++ {"Headphone Jack", NULL, "LHPOUT"},
++ {"Headphone Jack", NULL, "RHPOUT"},
++
++ {"LLINEIN", NULL, "Line In"},
++ {"RLINEIN", NULL, "Line In"},
++
++ {"MICIN", NULL, "Mic Jack"},
++};
++
++static int afeb9260_tlv320aic23_init(struct snd_soc_codec *codec)
++{
++
++ /* Add osk5912 specific widgets */
++ snd_soc_dapm_new_controls(codec, tlv320aic23_dapm_widgets,
++ ARRAY_SIZE(tlv320aic23_dapm_widgets));
++
++ /* Set up osk5912 specific audio path audio_map */
++ snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
++
++ snd_soc_dapm_enable_pin(codec, "Headphone Jack");
++ snd_soc_dapm_enable_pin(codec, "Line In");
++ snd_soc_dapm_enable_pin(codec, "Mic Jack");
++
++ snd_soc_dapm_sync(codec);
++
++ return 0;
++}
++
++/* Digital audio interface glue - connects codec <--> CPU */
++static struct snd_soc_dai_link afeb9260_dai = {
++ .name = "TLV320AIC23",
++ .stream_name = "AIC23",
++ .cpu_dai = &atmel_ssc_dai[0],
++ .codec_dai = &tlv320aic23_dai,
++ .init = afeb9260_tlv320aic23_init,
++ .ops = &afeb9260_ops,
++};
++
++/* Audio machine driver */
++static struct snd_soc_card snd_soc_machine_afeb9260 = {
++ .name = "AFEB9260",
++ .platform = &atmel_soc_platform,
++ .dai_link = &afeb9260_dai,
++ .num_links = 1,
++};
++
++/* Audio subsystem */
++static struct snd_soc_device afeb9260_snd_devdata = {
++ .card = &snd_soc_machine_afeb9260,
++ .codec_dev = &soc_codec_dev_tlv320aic23,
++};
++
++static struct platform_device *afeb9260_snd_device;
++
++static int __init afeb9260_soc_init(void)
++{
++ int err;
++ struct device *dev;
++ struct atmel_ssc_info *ssc_p = afeb9260_dai.cpu_dai->private_data;
++ struct ssc_device *ssc = NULL;
++
++ if (!(machine_is_afeb9260()))
++ return -ENODEV;
++
++ ssc = ssc_request(0);
++ if (IS_ERR(ssc)) {
++ printk(KERN_ERR "ASoC: Failed to request SSC 0\n");
++ err = PTR_ERR(ssc);
++ ssc = NULL;
++ goto err_ssc;
++ }
++ ssc_p->ssc = ssc;
++
++ afeb9260_snd_device = platform_device_alloc("soc-audio", -1);
++ if (!afeb9260_snd_device) {
++ printk(KERN_ERR "ASoC: Platform device allocation failed\n");
++ return -ENOMEM;
++ }
++
++ platform_set_drvdata(afeb9260_snd_device, &afeb9260_snd_devdata);
++ afeb9260_snd_devdata.dev = &afeb9260_snd_device->dev;
++ err = platform_device_add(afeb9260_snd_device);
++ if (err)
++ goto err1;
++
++ dev = &afeb9260_snd_device->dev;
++
++ return 0;
++err1:
++ platform_device_del(afeb9260_snd_device);
++ platform_device_put(afeb9260_snd_device);
++err_ssc:
++ return err;
++
++}
++
++static void __exit afeb9260_soc_exit(void)
++{
++ platform_device_unregister(afeb9260_snd_device);
++}
++
++module_init(afeb9260_soc_init);
++module_exit(afeb9260_soc_exit);
++
++MODULE_AUTHOR("Sergey Lapin <slapin@ossfans.org>");
++MODULE_DESCRIPTION("ALSA SoC for AFEB9260");
++MODULE_LICENSE("GPL");
++
+--
+1.5.6.5
+