From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?ISO-8859-1?Q?Eric_B=E9nard?= Subject: Re: [PATCH] imx-ssi.c: fix I2S slave setup Date: Thu, 27 May 2010 03:44:33 +0200 Message-ID: <4BFDCE81.6050802@eukrea.com> References: <1274891873-3704-1-git-send-email-eric@eukrea.com> <20100527005756.GD22091@sirena.org.uk> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------010207020109090402010001" Return-path: Received: from 30.mail-out.ovh.net (30.mail-out.ovh.net [213.186.62.213]) by alsa0.perex.cz (Postfix) with SMTP id D069D243BC for ; Thu, 27 May 2010 03:44:34 +0200 (CEST) In-Reply-To: <20100527005756.GD22091@sirena.org.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: alsa-devel-bounces@alsa-project.org Errors-To: alsa-devel-bounces@alsa-project.org To: Mark Brown Cc: s.hauer@pengutronix.de, alsa-devel@alsa-project.org, linux-arm-kernel@lists.infradead.org List-Id: alsa-devel@alsa-project.org This is a multi-part message in MIME format. --------------010207020109090402010001 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: quoted-printable Hi Mark, Le 27/05/2010 02:57, Mark Brown a =E9crit : > On Wed, May 26, 2010 at 06:37:53PM +0200, Eric B??nard wrote: >> * without this fix, the waveform on the SSI port are not real >> I2S signal (at least on i.MX27's SSI4) > > As I said in reply to your previous patch the current mainline i.MX > driver is not able to master the clocks at all? > the problem in not on the clocks (which are generated by the external=20 codec which is the master), but on the way the i.MX's SSI outputs the=20 data vs the framesync provided by the external codec. If this setting is not the right one (even if sound works perfectly here=20 with it), then there is a bug somewhere else preventing the i.MX's SSI=20 to provide he right data to my TLV320AIC23B using I2S. Please find attached the patches which add the TLV320 support to our=20 i.MX27 board because the bug may be there :-) Eric --------------010207020109090402010001 Content-Type: text/x-patch; name="0002-soc-imx-add-eukrea-tlv320.patch" Content-Disposition: attachment; filename="0002-soc-imx-add-eukrea-tlv320.patch" Content-Transfer-Encoding: quoted-printable >>From abf32c7690420cf313989c1adbf4ea03c3cf6250 Mon Sep 17 00:00:00 2001 From: =3D?utf-8?q?Eric=3D20B=3DC3=3DA9nard?=3D Date: Wed, 26 May 2010 21:16:54 +0200 Subject: [PATCH 2/4] soc/imx: add eukrea-tlv320 MIME-Version: 1.0 Content-Type: text/plain; charset=3Dutf-8 Content-Transfer-Encoding: 8bit Add the necessary files to support the TLV320AIC23B wired in I2S on our i.MX platforms. Signed-off-by: Eric B=C3=A9nard --- sound/soc/imx/Kconfig | 8 +++ sound/soc/imx/Makefile | 2 + sound/soc/imx/eukrea-tlv320.c | 131 +++++++++++++++++++++++++++++++++++= ++++++ 3 files changed, 141 insertions(+), 0 deletions(-) create mode 100644 sound/soc/imx/eukrea-tlv320.c diff --git a/sound/soc/imx/Kconfig b/sound/soc/imx/Kconfig index 7174b4c..3e27b16 100644 --- a/sound/soc/imx/Kconfig +++ b/sound/soc/imx/Kconfig @@ -11,3 +11,11 @@ config SND_IMX_SOC config SND_MXC_SOC_SSI tristate =20 +config SND_SOC_EUKREA_TLV320 + bool "Eukrea TLV320" + depends on MACH_EUKREA_MBIMX27_BASEBOARD + select SND_IMX_SOC + select SND_SOC_TLV320AIC23 + help + Enable I2S based access to the TLV320AIC23B codec attached + to the SSI4 interface diff --git a/sound/soc/imx/Makefile b/sound/soc/imx/Makefile index 9f8bb92..28d4b1e 100644 --- a/sound/soc/imx/Makefile +++ b/sound/soc/imx/Makefile @@ -10,3 +10,5 @@ obj-$(CONFIG_SND_IMX_SOC) +=3D snd-soc-imx.o # i.MX Machine Support snd-soc-phycore-ac97-objs :=3D phycore-ac97.o obj-$(CONFIG_SND_SOC_PHYCORE_AC97) +=3D snd-soc-phycore-ac97.o +snd-soc-eukrea-tlv320-objs :=3D eukrea-tlv320.o +obj-$(CONFIG_SND_SOC_EUKREA_TLV320) +=3D snd-soc-eukrea-tlv320.o diff --git a/sound/soc/imx/eukrea-tlv320.c b/sound/soc/imx/eukrea-tlv320.= c new file mode 100644 index 0000000..e368787 --- /dev/null +++ b/sound/soc/imx/eukrea-tlv320.c @@ -0,0 +1,131 @@ +/* + * eukrea-tlv320.c -- SoC audio for eukrea_cpuimxXX in I2S mode + * + * Copyright 2010 Eric B=C3=A9nard, Eukr=C3=A9a Electromatique + * + * based on sound/soc/s3c24xx/s3c24xx_simtec_tlv320aic23.c + * which is Copyright 2009 Simtec Electronics + * and on sound/soc/imx/phycore-ac97.c which is + * Copyright 2009 Sascha Hauer, Pengutronix + * + * This program is free software; you can redistribute it and/or modif= y 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. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../codecs/tlv320aic23.h" +#include "imx-ssi.h" + +#define CODEC_CLOCK 12000000 + +static int eukrea_tlv320_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd =3D substream->private_data; + struct snd_soc_dai *codec_dai =3D rtd->dai->codec_dai; + struct snd_soc_dai *cpu_dai =3D rtd->dai->cpu_dai; + int ret; + + /* Set the CODEC as the bus clock master, I2S */ + ret =3D snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBM_CFM); + if (ret) { + pr_err("%s: failed set cpu dai format\n", __func__); + return ret; + } + + /* Set the CODEC as the bus clock master */ + ret =3D snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBM_CFM); + if (ret) { + pr_err("%s: failed set codec dai format\n", __func__); + return ret; + } + + /* Set the codec system clock for DAC and ADC */ + ret =3D snd_soc_dai_set_sysclk(codec_dai, 0, + CODEC_CLOCK, SND_SOC_CLOCK_IN); + if (ret) { + pr_err("%s: failed setting codec sysclk\n", __func__); + return ret; + } + + return 0; +} + +static struct snd_soc_ops eukrea_tlv320_snd_ops =3D { + .hw_params =3D eukrea_tlv320_hw_params, +}; + +static struct snd_soc_dai_link eukrea_tlv320_dai =3D { + .name =3D "tlv320aic23", + .stream_name =3D "TLV320AIC23", + .codec_dai =3D &tlv320aic23_dai, + .ops =3D &eukrea_tlv320_snd_ops, +}; + +static struct snd_soc_card eukrea_tlv320 =3D { + .name =3D "cpuimx-audio", + .platform =3D &imx_soc_platform, + .dai_link =3D &eukrea_tlv320_dai, + .num_links =3D 1, +}; + +static struct snd_soc_device eukrea_tlv320_snd_devdata =3D { + .card =3D &eukrea_tlv320, + .codec_dev =3D &soc_codec_dev_tlv320aic23, +}; + +static struct platform_device *eukrea_tlv320_snd_device; + +static int __init eukrea_tlv320_init(void) +{ + int ret; + + if (!machine_is_eukrea_cpuimx27()) + /* return happy. We might run on a totally different machine */ + return 0; + + eukrea_tlv320_snd_device =3D platform_device_alloc("soc-audio", -1); + if (!eukrea_tlv320_snd_device) + return -ENOMEM; + + eukrea_tlv320_dai.cpu_dai =3D &imx_ssi_pcm_dai[0]; + + platform_set_drvdata(eukrea_tlv320_snd_device, &eukrea_tlv320_snd_devda= ta); + eukrea_tlv320_snd_devdata.dev =3D &eukrea_tlv320_snd_device->dev; + ret =3D platform_device_add(eukrea_tlv320_snd_device); + + if (ret) { + printk(KERN_ERR "ASoC: Platform device allocation failed\n"); + platform_device_put(eukrea_tlv320_snd_device); + } + + return ret; +} + +static void __exit eukrea_tlv320_exit(void) +{ + platform_device_unregister(eukrea_tlv320_snd_device); +} + +module_init(eukrea_tlv320_init); +module_exit(eukrea_tlv320_exit); + +MODULE_AUTHOR("Eric B=C3=A9nard "); +MODULE_DESCRIPTION("CPUIMX ALSA SoC driver"); +MODULE_LICENSE("GPL"); --=20 1.6.3.3 --------------010207020109090402010001 Content-Type: text/x-patch; name="0003-eukrea_mbimx27-add-audio-codec.patch" Content-Disposition: attachment; filename="0003-eukrea_mbimx27-add-audio-codec.patch" Content-Transfer-Encoding: quoted-printable >>From 24c2e0f732a2d95db2d5776539824632e0b08572 Mon Sep 17 00:00:00 2001 From: =3D?utf-8?q?Eric=3D20B=3DC3=3DA9nard?=3D Date: Wed, 26 May 2010 21:18:35 +0200 Subject: [PATCH 3/4] eukrea_mbimx27: add audio codec MIME-Version: 1.0 Content-Type: text/plain; charset=3Dutf-8 Content-Transfer-Encoding: 8bit Signed-off-by: Eric B=C3=A9nard --- arch/arm/mach-mx2/eukrea_mbimx27-baseboard.c | 44 ++++++++++++++++++++= +++++- 1 files changed, 43 insertions(+), 1 deletions(-) diff --git a/arch/arm/mach-mx2/eukrea_mbimx27-baseboard.c b/arch/arm/mach= -mx2/eukrea_mbimx27-baseboard.c index 34bdc26..471dbd2 100644 --- a/arch/arm/mach-mx2/eukrea_mbimx27-baseboard.c +++ b/arch/arm/mach-mx2/eukrea_mbimx27-baseboard.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Eric Benard - eric@eukrea.com + * Copyright (C) 2009-2010 Eric Benard - eric@eukrea.com * * Based on pcm970-baseboard.c which is : * Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de) @@ -37,6 +37,8 @@ #include #include #include +#include +#include =20 #include "devices.h" =20 @@ -93,6 +95,13 @@ static int eukrea_mbimx27_pins[] =3D { PD29_PF_CSPI1_SCLK, PD30_PF_CSPI1_MISO, PD31_PF_CSPI1_MOSI, + /* SSI4 */ +#if defined(CONFIG_SND_SOC_EUKREA_TLV320) + PC16_PF_SSI4_FS, + PC17_PF_SSI4_RXD | GPIO_PUEN, + PC18_PF_SSI4_TXD | GPIO_PUEN, + PC19_PF_SSI4_CLK, +#endif }; =20 static const uint32_t eukrea_mbimx27_keymap[] =3D { @@ -287,6 +296,12 @@ static struct spi_board_info eukrea_mbimx27_spi_boar= d_info[] __initdata =3D { }, }; =20 +static struct i2c_board_info eukrea_mbimx27_i2c_devices[] =3D { + { + I2C_BOARD_INFO("tlv320aic23", 0x1a), + }, +}; + static int eukrea_mbimx27_spi_cs[] =3D {GPIO_PORTD | 28}; =20 static struct spi_imx_master eukrea_mbimx27_spi_0_data =3D { @@ -303,6 +318,10 @@ static struct imxmmc_platform_data sdhc_pdata =3D { .dat3_card_detect =3D 1, }; =20 +struct imx_ssi_platform_data eukrea_mbimx27_ssi_pdata =3D { + .flags =3D IMX_SSI_DMA, +}; + /* * system init for baseboard usage. Will be called by cpuimx27 init. * @@ -314,6 +333,24 @@ void __init eukrea_mbimx27_baseboard_init(void) mxc_gpio_setup_multiple_pins(eukrea_mbimx27_pins, ARRAY_SIZE(eukrea_mbimx27_pins), "MBIMX27"); =20 +#if defined(CONFIG_SND_SOC_EUKREA_TLV320) + /* SSI unit master I2S codec connected to SSI_PINS_4*/ + mxc_audmux_v1_configure_port(MX27_AUDMUX_HPCR1_SSI0, + MXC_AUDMUX_V1_PCR_SYN | + MXC_AUDMUX_V1_PCR_TFSDIR | + MXC_AUDMUX_V1_PCR_TCLKDIR | + MXC_AUDMUX_V1_PCR_RFSDIR | + MXC_AUDMUX_V1_PCR_RCLKDIR | + MXC_AUDMUX_V1_PCR_TFCSEL(MX27_AUDMUX_HPCR3_SSI_PINS_4) | + MXC_AUDMUX_V1_PCR_RFCSEL(MX27_AUDMUX_HPCR3_SSI_PINS_4) | + MXC_AUDMUX_V1_PCR_RXDSEL(MX27_AUDMUX_HPCR3_SSI_PINS_4) + ); + mxc_audmux_v1_configure_port(MX27_AUDMUX_HPCR3_SSI_PINS_4, + MXC_AUDMUX_V1_PCR_SYN | + MXC_AUDMUX_V1_PCR_RXDSEL(MX27_AUDMUX_HPCR1_SSI0) + ); +#endif + mxc_register_device(&mxc_uart_device1, &uart_pdata[0]); mxc_register_device(&mxc_uart_device2, &uart_pdata[1]); #if !defined(MACH_EUKREA_CPUIMX27_USEUART4) @@ -323,6 +360,11 @@ void __init eukrea_mbimx27_baseboard_init(void) mxc_register_device(&mxc_fb_device, &eukrea_mbimx27_fb_data); mxc_register_device(&mxc_sdhc_device0, &sdhc_pdata); =20 + i2c_register_board_info(0, eukrea_mbimx27_i2c_devices, + ARRAY_SIZE(eukrea_mbimx27_i2c_devices)); + + mxc_register_device(&imx_ssi_device0, &eukrea_mbimx27_ssi_pdata); + #if defined(CONFIG_TOUCHSCREEN_ADS7846) \ || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) /* ADS7846 Touchscreen controller init */ --=20 1.6.3.3 --------------010207020109090402010001 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel --------------010207020109090402010001--