On Sat, 2009-03-14 at 17:22 +0530, umeshyv wrote: > Hi to all, > I downloaded latest kernel for mips (linux-2.6.28.4).How do I > configure Asoc driver(wm8731 codec,I2S based) for DbAu1200 > development board.Please guide me with your valuable > suggestions.waiting for your valuable reply > I just recently had the same request from someone else and created a pair of patches for this. It has only been through limited testing so I can't promise that it's perfect, but it basically works. >From 4fec1f6b93b09df62294d8fb08ae9d5266453d5f Mon Sep 17 00:00:00 2001 From: khickey <khickey@35c7ba61-0b3b-44cf-8ad4-8c98d727fa3b> Date: Wed, 11 Mar 2009 21:06:51 +0000 Subject: [PATCH] DB1200: Sample I2S audio sound machine Added a sound machine in the model of sample-ac97 for I2S audio with the WM8731 codec. Signed-off-by: Kevin Hickey <khickey@xxxxxxxxxxx> git-svn-id: svn://coredev/Linux-kernel/trunk@65 35c7ba61-0b3b-44cf-8ad4-8c98d727fa3b --- sound/soc/au1x/Kconfig | 9 ++ sound/soc/au1x/Makefile | 2 + sound/soc/au1x/sample-i2s.c | 187 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 198 insertions(+), 0 deletions(-) create mode 100644 sound/soc/au1x/sample-i2s.c diff --git a/sound/soc/au1x/Kconfig b/sound/soc/au1x/Kconfig index c7ca3f2..abf333b 100644 --- a/sound/soc/au1x/Kconfig +++ b/sound/soc/au1x/Kconfig @@ -22,6 +22,15 @@ config SND_SOC_AU1XPSC_AC97 ## ## Boards ## +config SND_SOC_SAMPLE_PSC_I2S + tristate "Sample Au12x0/Au1550 PSC I2S sound machine" + depends on SND_SOC_AU1XPSC + select SND_SOC_AU1XPSC_I2S + select SND_SOC_WM8731 + help + This is a sample I2S sound machine for use with the DB1200 + development board, which has a WM8731 codec. + config SND_SOC_SAMPLE_PSC_AC97 tristate "Sample Au12x0/Au1550 PSC AC97 sound machine" depends on SND_SOC_AU1XPSC diff --git a/sound/soc/au1x/Makefile b/sound/soc/au1x/Makefile index b48bb36..b8e54a4 100644 --- a/sound/soc/au1x/Makefile +++ b/sound/soc/au1x/Makefile @@ -9,7 +9,9 @@ obj-$(CONFIG_SND_SOC_AU1XPSC_AC97) += snd-soc-au1xpsc-ac97.o # Boards snd-soc-sample-ac97-objs := sample-ac97.o +snd-soc-sample-i2s-objs := sample-i2s.o snd-soc-hmp10-ac97-objs := hmp10-ac97.o obj-$(CONFIG_SND_SOC_SAMPLE_PSC_AC97) += snd-soc-sample-ac97.o +obj-$(CONFIG_SND_SOC_SAMPLE_PSC_I2S) += snd-soc-sample-i2s.o obj-$(CONFIG_SND_SOC_HMP10_AC97) += snd-soc-hmp10-ac97.o diff --git a/sound/soc/au1x/sample-i2s.c b/sound/soc/au1x/sample-i2s.c new file mode 100644 index 0000000..612cfaa --- /dev/null +++ b/sound/soc/au1x/sample-i2s.c @@ -0,0 +1,187 @@ +/* + * Sample Au12x0 PSC I2S sound machine. + * + * Copyright (c) 2009 RMI Corporation <khickey@xxxxxxxxxxx> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms outlined in the file COPYING at the root of this + * source archive. + * + * This is a very generic I2S sound machine driver for boards which + * have I2S audio at PSC1 (e.g. DB1200 demoboards). + * + * This file is based on sample-ac97.c by Manuel Lauss + */ + +#include <linux/module.h> +#include <linux/moduleparam.h> +#include <linux/timer.h> +#include <linux/interrupt.h> +#include <linux/platform_device.h> +#include <sound/core.h> +#include <sound/pcm.h> +#include <sound/soc.h> +#include <sound/soc-dapm.h> +#include <asm/mach-au1x00/au1000.h> +#include <asm/mach-au1x00/au1xxx_psc.h> +#include <asm/mach-au1x00/au1xxx_dbdma.h> + +#ifdef CONFIG_MIPS_DB1200 +#include <asm/mach-db1x00/db1200.h> +#endif + +#include "../codecs/wm8731.h" +#include "psc.h" + +static int au1xpsc_sample_i2s_init(struct snd_soc_codec *codec) +{ + snd_soc_dapm_sync(codec); + return 0; +} + +static int au1xpsc_sample_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; + int ret = 0; + + ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_CBM_CFM); + return ret; +} + + +static struct snd_soc_ops au1xpsc_sample_ops = { + .hw_params = au1xpsc_sample_hw_params, +}; + +static struct snd_soc_dai_link au1xpsc_sample_i2s_dai = { + .name = "I2S", + .stream_name = "I2S WM8731", + .cpu_dai = &au1xpsc_i2s_dai, /* see psc-i2s.c */ + .codec_dai = &wm8731_dai, /* see codecs/wm8731.c */ + .init = au1xpsc_sample_i2s_init, + .ops = &au1xpsc_sample_ops, +}; + +static struct snd_soc_card au1xpsc_sample_i2s_machine = { + .name = "Au1xxx PSC I2S Audio", + .dai_link = &au1xpsc_sample_i2s_dai, + .platform = &au1xpsc_soc_platform, /* see dbdma2.c */ + .num_links = 1, + .platform = &au1xpsc_soc_platform, /* see dbdma2.c */ +}; + +static struct wm8731_setup_data au1xpsc_sample_wm8731_setup = { + .i2c_bus = 0, + .i2c_address = 0x1b, +}; + +static struct snd_soc_device au1xpsc_sample_i2s_devdata = { + .card = &au1xpsc_sample_i2s_machine, + .codec_dev = &soc_codec_dev_wm8731, + .codec_data = &au1xpsc_sample_wm8731_setup, +}; + +static struct resource au1xpsc_psc1_res[] = { + [0] = { + .start = CPHYSADDR(PSC1_BASE_ADDR), + .end = CPHYSADDR(PSC1_BASE_ADDR) + 0x000fffff, + .flags = IORESOURCE_MEM, + }, + [1] = { +#ifdef CONFIG_SOC_AU1200 + .start = AU1200_PSC1_INT, + .end = AU1200_PSC1_INT, +#elif defined(CONFIG_SOC_AU1550) + .start = AU1550_PSC1_INT, + .end = AU1550_PSC1_INT, +#elif defined(CONFIG_SOC_AU13XX) + .start = AU1300_IRQ_PSC1, + .end = AU1300_IRQ_PSC1, +#endif + .flags = IORESOURCE_IRQ, + }, + [2] = { + .start = DSCR_CMD0_PSC1_TX, + .end = DSCR_CMD0_PSC1_TX, + .flags = IORESOURCE_DMA, + }, + [3] = { + .start = DSCR_CMD0_PSC1_RX, + .end = DSCR_CMD0_PSC1_RX, + .flags = IORESOURCE_DMA, + }, +}; + +static struct platform_device *au1xpsc_sample_i2s_dev; + +static int __init au1xpsc_sample_i2s_load(void) +{ + int ret; + +#ifdef CONFIG_SOC_AU1200 + unsigned long io; + + /* modify sys_pinfunc for AC97 on PSC1 */ + io = au_readl(SYS_PINFUNC); + io |= SYS_PINFUNC_P1C; + io &= ~(SYS_PINFUNC_P1A | SYS_PINFUNC_P1B); + au_writel(io, SYS_PINFUNC); + au_sync(); + +#endif + + /* + * The DB1200 has a mux coming out of PSC1 that switches between AC97 + * and I2S. The default is AC97 so we have to make sure to change it + * here. + */ +#ifdef CONFIG_MIPS_DB1200 + AU_SET_BITS_16(BCSR_RESETS_PCS1MUX, &bcsr->resets); +#endif + + ret = -ENOMEM; + + /* setup PSC clock source for AC97 part: external clock provided + * by codec. The psc-ac97.c driver depends on this setting! + */ + au_writel(PSC_SEL_CLK_SERCLK, PSC1_BASE_ADDR + PSC_SEL_OFFSET); + au_sync(); + + au1xpsc_sample_i2s_dev = platform_device_alloc("soc-audio", -1); + if (!au1xpsc_sample_i2s_dev) + goto out; + + au1xpsc_sample_i2s_dev->resource = + kmemdup(au1xpsc_psc1_res, sizeof(struct resource) * + ARRAY_SIZE(au1xpsc_psc1_res), GFP_KERNEL); + au1xpsc_sample_i2s_dev->num_resources = ARRAY_SIZE(au1xpsc_psc1_res); + au1xpsc_sample_i2s_dev->id = 1; + + platform_set_drvdata(au1xpsc_sample_i2s_dev, + &au1xpsc_sample_i2s_devdata); + au1xpsc_sample_i2s_devdata.dev = &au1xpsc_sample_i2s_dev->dev; + ret = platform_device_add(au1xpsc_sample_i2s_dev); + + if (ret) { + platform_device_put(au1xpsc_sample_i2s_dev); + au1xpsc_sample_i2s_dev = NULL; + } + +out: + return ret; +} + +static void __exit au1xpsc_sample_i2s_exit(void) +{ + platform_device_unregister(au1xpsc_sample_i2s_dev); +} + +module_init(au1xpsc_sample_i2s_load); +module_exit(au1xpsc_sample_i2s_exit); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Au1xxx PSC sample I2S machine"); +MODULE_AUTHOR("Kevin Hickey <khickey@xxxxxxxxxxx>"); -- 1.5.4.3 >From 6a54eade32f3df84af3644ea7991f48e7ea91f99 Mon Sep 17 00:00:00 2001 From: khickey <khickey@35c7ba61-0b3b-44cf-8ad4-8c98d727fa3b> Date: Fri, 13 Mar 2009 14:01:04 +0000 Subject: [PATCH] DB1200: Bugfix - WM8731 powerup The existing WM8731 code was not powering up the codec properly, resulting in no sound. The clock output, oscillator and DAC were all staying powered down. git-svn-id: svn://coredev/Linux-kernel/trunk@69 35c7ba61-0b3b-44cf-8ad4-8c98d727fa3b --- sound/soc/codecs/wm8731.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c index c444b9f..0dcf172 100644 --- a/sound/soc/codecs/wm8731.c +++ b/sound/soc/codecs/wm8731.c @@ -418,8 +418,8 @@ static int wm8731_set_bias_level(struct snd_soc_codec *codec, switch (level) { case SND_SOC_BIAS_ON: - /* vref/mid, osc on, dac unmute */ - wm8731_write(codec, WM8731_PWR, reg); + /* Turn everything on */ + wm8731_write(codec, WM8731_PWR, 0); break; case SND_SOC_BIAS_PREPARE: break; -- 1.5.4.3 -- Kevin Hickey Alchemy Solutions RMI Corporation khickey@xxxxxxxxxxx P: 512.691.8044