2009-09-01 12:45:14 +08:00
/*
* File : sound / soc / blackfin / bf5xx - ad1836 . c
* Author : Barry Song < Barry . Song @ analog . com >
*
* Created : Aug 4 2009
* Description : Board driver for ad1836 sound chip
*
* Bugs : Enter bugs at http : //blackfin.uclinux.org/
*
* 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 <sound/core.h>
# include <sound/pcm.h>
# include <sound/soc.h>
# include <sound/pcm_params.h>
# include <asm/blackfin.h>
# include <asm/cacheflush.h>
# include <asm/irq.h>
# include <asm/dma.h>
# include <asm/portmux.h>
# include "../codecs/ad1836.h"
static struct snd_soc_card bf5xx_ad1836 ;
2013-05-28 19:22:16 +02:00
static int bf5xx_ad1836_init ( struct snd_soc_pcm_runtime * rtd )
2009-09-01 12:45:14 +08:00
{
2010-03-17 20:15:21 +00:00
struct snd_soc_dai * cpu_dai = rtd - > cpu_dai ;
2009-09-15 11:24:52 +08:00
unsigned int channel_map [ ] = { 0 , 4 , 1 , 5 , 2 , 6 , 3 , 7 } ;
2009-09-01 12:45:14 +08:00
int ret = 0 ;
2009-09-15 11:24:52 +08:00
/* set cpu DAI channel mapping */
ret = snd_soc_dai_set_channel_map ( cpu_dai , ARRAY_SIZE ( channel_map ) ,
channel_map , ARRAY_SIZE ( channel_map ) , channel_map ) ;
if ( ret < 0 )
return ret ;
2013-05-28 19:22:16 +02:00
ret = snd_soc_dai_set_tdm_slot ( cpu_dai , 0xFF , 0xFF , 8 , 32 ) ;
if ( ret < 0 )
return ret ;
2009-09-01 12:45:14 +08:00
return 0 ;
}
2012-02-01 19:24:21 +01:00
# define BF5XX_AD1836_DAIFMT (SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_IB_IF | \
SND_SOC_DAIFMT_CBM_CFM )
2012-08-10 18:06:08 -04:00
static struct snd_soc_dai_link bf5xx_ad1836_dai = {
. name = " ad1836 " ,
. stream_name = " AD1836 " ,
. codec_dai_name = " ad1836-hifi " ,
2013-05-28 19:22:16 +02:00
. platform_name = " bfin-i2s-pcm-audio " ,
2012-08-10 18:06:08 -04:00
. dai_fmt = BF5XX_AD1836_DAIFMT ,
2013-05-28 19:22:16 +02:00
. init = bf5xx_ad1836_init ,
2009-09-01 12:45:14 +08:00
} ;
static struct snd_soc_card bf5xx_ad1836 = {
2011-03-28 01:45:09 -04:00
. name = " bfin-ad1836 " ,
2011-12-22 21:17:22 +08:00
. owner = THIS_MODULE ,
2012-08-10 18:06:08 -04:00
. dai_link = & bf5xx_ad1836_dai ,
2009-09-01 12:45:14 +08:00
. num_links = 1 ,
} ;
2012-12-07 09:26:13 -05:00
static int bf5xx_ad1836_driver_probe ( struct platform_device * pdev )
2009-09-01 12:45:14 +08:00
{
2012-08-10 18:06:08 -04:00
struct snd_soc_card * card = & bf5xx_ad1836 ;
const char * * link_name ;
2009-09-01 12:45:14 +08:00
int ret ;
2012-08-10 18:06:08 -04:00
link_name = pdev - > dev . platform_data ;
if ( ! link_name ) {
dev_err ( & pdev - > dev , " No platform data supplied \n " ) ;
return - EINVAL ;
}
bf5xx_ad1836_dai . cpu_dai_name = link_name [ 0 ] ;
bf5xx_ad1836_dai . codec_name = link_name [ 1 ] ;
2009-09-01 12:45:14 +08:00
2012-08-10 18:06:08 -04:00
card - > dev = & pdev - > dev ;
platform_set_drvdata ( pdev , card ) ;
2009-09-01 12:45:14 +08:00
2012-08-10 18:06:08 -04:00
ret = snd_soc_register_card ( card ) ;
2009-09-01 12:45:14 +08:00
if ( ret )
2012-08-10 18:06:08 -04:00
dev_err ( & pdev - > dev , " Failed to register card \n " ) ;
2009-09-01 12:45:14 +08:00
return ret ;
}
2012-12-07 09:26:13 -05:00
static int bf5xx_ad1836_driver_remove ( struct platform_device * pdev )
2009-09-01 12:45:14 +08:00
{
2012-08-10 18:06:08 -04:00
struct snd_soc_card * card = platform_get_drvdata ( pdev ) ;
snd_soc_unregister_card ( card ) ;
return 0 ;
2009-09-01 12:45:14 +08:00
}
2012-08-10 18:06:08 -04:00
static struct platform_driver bf5xx_ad1836_driver = {
. driver = {
. name = " bfin-snd-ad1836 " ,
. pm = & snd_soc_pm_ops ,
} ,
. probe = bf5xx_ad1836_driver_probe ,
2012-12-07 09:26:13 -05:00
. remove = bf5xx_ad1836_driver_remove ,
2012-08-10 18:06:08 -04:00
} ;
module_platform_driver ( bf5xx_ad1836_driver ) ;
2009-09-01 12:45:14 +08:00
/* Module information */
MODULE_AUTHOR ( " Barry Song " ) ;
MODULE_DESCRIPTION ( " ALSA SoC AD1836 board driver " ) ;
MODULE_LICENSE ( " GPL " ) ;