2010-02-10 10:42:33 +00:00
/*
* phycore - ac97 . c - - SoC audio for imx_phycore in AC97 mode
*
* Copyright 2009 Sascha Hauer , Pengutronix < s . hauer @ pengutronix . de >
*
* 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 .
*
*/
# include <linux/module.h>
# include <linux/moduleparam.h>
# include <linux/device.h>
# include <linux/i2c.h>
# include <sound/core.h>
# include <sound/pcm.h>
# include <sound/soc.h>
# include <asm/mach-types.h>
2012-03-05 22:30:53 +08:00
# include "imx-audmux.h"
2010-02-10 10:42:33 +00:00
static struct snd_soc_card imx_phycore ;
2017-03-14 00:42:22 +05:30
static const struct snd_soc_ops imx_phycore_hifi_ops = {
2010-02-10 10:42:33 +00:00
} ;
static struct snd_soc_dai_link imx_phycore_dai_ac97 [ ] = {
{
. name = " HiFi " ,
. stream_name = " HiFi " ,
2010-03-17 20:15:21 +00:00
. codec_dai_name = " wm9712-hifi " ,
. codec_name = " wm9712-codec " ,
2010-09-30 13:46:14 -07:00
. cpu_dai_name = " imx-ssi.0 " ,
2013-04-25 11:18:49 +08:00
. platform_name = " imx-ssi.0 " ,
2010-02-10 10:42:33 +00:00
. ops = & imx_phycore_hifi_ops ,
} ,
} ;
static struct snd_soc_card imx_phycore = {
2010-11-04 17:05:44 +01:00
. name = " PhyCORE-ac97-audio " ,
2011-12-23 14:47:08 +08:00
. owner = THIS_MODULE ,
2010-02-10 10:42:33 +00:00
. dai_link = imx_phycore_dai_ac97 ,
. num_links = ARRAY_SIZE ( imx_phycore_dai_ac97 ) ,
} ;
2010-11-25 15:14:03 +08:00
static struct platform_device * imx_phycore_snd_ac97_device ;
2010-02-10 10:42:33 +00:00
static struct platform_device * imx_phycore_snd_device ;
static int __init imx_phycore_init ( void )
{
int ret ;
2012-03-05 22:30:50 +08:00
if ( machine_is_pca100 ( ) ) {
2012-03-05 22:30:54 +08:00
imx_audmux_v1_configure_port ( MX27_AUDMUX_HPCR1_SSI0 ,
IMX_AUDMUX_V1_PCR_SYN | /* 4wire mode */
IMX_AUDMUX_V1_PCR_TFCSEL ( 3 ) |
IMX_AUDMUX_V1_PCR_TCLKDIR | /* clock is output */
IMX_AUDMUX_V1_PCR_RXDSEL ( 3 ) ) ;
imx_audmux_v1_configure_port ( 3 ,
IMX_AUDMUX_V1_PCR_SYN | /* 4wire mode */
IMX_AUDMUX_V1_PCR_TFCSEL ( 0 ) |
IMX_AUDMUX_V1_PCR_TFSDIR |
IMX_AUDMUX_V1_PCR_RXDSEL ( 0 ) ) ;
2012-03-05 22:30:50 +08:00
} else if ( machine_is_pcm043 ( ) ) {
2012-03-05 22:30:54 +08:00
imx_audmux_v2_configure_port ( 3 ,
IMX_AUDMUX_V2_PTCR_SYN | /* 4wire mode */
IMX_AUDMUX_V2_PTCR_TFSEL ( 0 ) |
IMX_AUDMUX_V2_PTCR_TFSDIR ,
IMX_AUDMUX_V2_PDCR_RXDSEL ( 0 ) ) ;
imx_audmux_v2_configure_port ( 0 ,
IMX_AUDMUX_V2_PTCR_SYN | /* 4wire mode */
IMX_AUDMUX_V2_PTCR_TCSEL ( 3 ) |
IMX_AUDMUX_V2_PTCR_TCLKDIR , /* clock is output */
IMX_AUDMUX_V2_PDCR_RXDSEL ( 3 ) ) ;
2012-03-05 22:30:50 +08:00
} else {
2010-02-10 10:42:33 +00:00
/* return happy. We might run on a totally different machine */
return 0 ;
2012-03-05 22:30:50 +08:00
}
2010-02-10 10:42:33 +00:00
2010-11-25 15:14:03 +08:00
imx_phycore_snd_ac97_device = platform_device_alloc ( " soc-audio " , - 1 ) ;
if ( ! imx_phycore_snd_ac97_device )
2010-02-10 10:42:33 +00:00
return - ENOMEM ;
2010-11-25 15:14:03 +08:00
platform_set_drvdata ( imx_phycore_snd_ac97_device , & imx_phycore ) ;
ret = platform_device_add ( imx_phycore_snd_ac97_device ) ;
if ( ret )
goto fail1 ;
2010-02-10 10:42:33 +00:00
2010-03-17 20:15:21 +00:00
imx_phycore_snd_device = platform_device_alloc ( " wm9712-codec " , - 1 ) ;
2010-11-25 15:14:03 +08:00
if ( ! imx_phycore_snd_device ) {
ret = - ENOMEM ;
goto fail2 ;
}
2010-02-10 10:42:33 +00:00
ret = platform_device_add ( imx_phycore_snd_device ) ;
if ( ret ) {
printk ( KERN_ERR " ASoC: Platform device allocation failed \n " ) ;
2010-11-25 15:14:03 +08:00
goto fail3 ;
2010-02-10 10:42:33 +00:00
}
2010-11-25 15:14:03 +08:00
return 0 ;
fail3 :
platform_device_put ( imx_phycore_snd_device ) ;
fail2 :
platform_device_del ( imx_phycore_snd_ac97_device ) ;
fail1 :
platform_device_put ( imx_phycore_snd_ac97_device ) ;
2010-02-10 10:42:33 +00:00
return ret ;
}
static void __exit imx_phycore_exit ( void )
{
platform_device_unregister ( imx_phycore_snd_device ) ;
2010-11-25 15:14:03 +08:00
platform_device_unregister ( imx_phycore_snd_ac97_device ) ;
2010-02-10 10:42:33 +00:00
}
late_initcall ( imx_phycore_init ) ;
module_exit ( imx_phycore_exit ) ;
MODULE_AUTHOR ( " Sascha Hauer <s.hauer@pengutronix.de> " ) ;
MODULE_DESCRIPTION ( " PhyCORE ALSA SoC driver " ) ;
MODULE_LICENSE ( " GPL " ) ;