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-- From mboxrd@z Thu Jan 1 00:00:00 1970 From: eric@eukrea.com (=?ISO-8859-1?Q?Eric_B=E9nard?=) Date: Thu, 27 May 2010 03:44:33 +0200 Subject: [alsa-devel] [PATCH] imx-ssi.c: fix I2S slave setup In-Reply-To: <20100527005756.GD22091@sirena.org.uk> References: <1274891873-3704-1-git-send-email-eric@eukrea.com> <20100527005756.GD22091@sirena.org.uk> Message-ID: <4BFDCE81.6050802@eukrea.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Mark, Le 27/05/2010 02:57, Mark Brown a ?crit : > 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 codec which is the master), but on the way the i.MX's SSI outputs the data vs the framesync provided by the external codec. If this setting is not the right one (even if sound works perfectly here with it), then there is a bug somewhere else preventing the i.MX's SSI to provide he right data to my TLV320AIC23B using I2S. Please find attached the patches which add the TLV320 support to our i.MX27 board because the bug may be there :-) Eric