2010-09-08 19:21:23 +09:00
/* linux/arch/arm/mach-s5p64x0/dev-audio.c
*
* Copyright ( c ) 2010 Samsung Electronics Co . Ltd
* Jaswinder Singh < jassi . brar @ samsung . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# include <linux/platform_device.h>
# include <linux/dma-mapping.h>
# include <linux/gpio.h>
# include <plat/gpio-cfg.h>
2012-08-24 15:22:12 +02:00
# include <linux/platform_data/asoc-s3c.h>
2010-09-08 19:21:23 +09:00
# include <mach/map.h>
# include <mach/dma.h>
# include <mach/irqs.h>
2010-11-19 08:49:44 +09:00
static const char * rclksrc [ ] = {
[ 0 ] = " iis " ,
[ 1 ] = " sclk_audio2 " ,
} ;
2010-12-21 09:44:42 +09:00
static int s5p6440_cfg_i2s ( struct platform_device * pdev )
2010-09-08 19:21:23 +09:00
{
switch ( pdev - > id ) {
2010-11-19 08:49:44 +09:00
case 0 :
2010-12-21 09:44:42 +09:00
s3c_gpio_cfgpin_range ( S5P6440_GPC ( 4 ) , 2 , S3C_GPIO_SFN ( 5 ) ) ;
s3c_gpio_cfgpin ( S5P6440_GPC ( 7 ) , S3C_GPIO_SFN ( 5 ) ) ;
s3c_gpio_cfgpin_range ( S5P6440_GPH ( 6 ) , 4 , S3C_GPIO_SFN ( 5 ) ) ;
2010-09-08 19:21:23 +09:00
break ;
default :
printk ( KERN_ERR " Invalid Device %d \n " , pdev - > id ) ;
return - EINVAL ;
}
return 0 ;
}
2010-12-21 09:44:42 +09:00
static struct s3c_audio_pdata s5p6440_i2s_pdata = {
. cfg_gpio = s5p6440_cfg_i2s ,
2010-11-19 08:49:44 +09:00
. type = {
. i2s = {
. quirks = QUIRK_PRI_6CHAN ,
. src_clk = rclksrc ,
} ,
} ,
2010-09-08 19:21:23 +09:00
} ;
2010-12-21 09:44:42 +09:00
static struct resource s5p64x0_i2s0_resource [ ] = {
2012-05-12 16:12:30 +09:00
[ 0 ] = DEFINE_RES_MEM ( S5P64X0_PA_I2S , SZ_256 ) ,
[ 1 ] = DEFINE_RES_DMA ( DMACH_I2S0_TX ) ,
[ 2 ] = DEFINE_RES_DMA ( DMACH_I2S0_RX ) ,
2010-09-08 19:21:23 +09:00
} ;
struct platform_device s5p6440_device_iis = {
2010-11-19 08:49:44 +09:00
. name = " samsung-i2s " ,
. id = 0 ,
2010-12-21 09:44:42 +09:00
. num_resources = ARRAY_SIZE ( s5p64x0_i2s0_resource ) ,
. resource = s5p64x0_i2s0_resource ,
2010-09-08 19:21:23 +09:00
. dev = {
2010-12-21 09:44:42 +09:00
. platform_data = & s5p6440_i2s_pdata ,
} ,
} ;
static int s5p6450_cfg_i2s ( struct platform_device * pdev )
{
switch ( pdev - > id ) {
case 0 :
s3c_gpio_cfgpin_range ( S5P6450_GPR ( 4 ) , 5 , S3C_GPIO_SFN ( 5 ) ) ;
s3c_gpio_cfgpin_range ( S5P6450_GPR ( 13 ) , 2 , S3C_GPIO_SFN ( 5 ) ) ;
break ;
case 1 :
s3c_gpio_cfgpin ( S5P6440_GPB ( 4 ) , S3C_GPIO_SFN ( 5 ) ) ;
s3c_gpio_cfgpin_range ( S5P6450_GPC ( 0 ) , 4 , S3C_GPIO_SFN ( 5 ) ) ;
break ;
case 2 :
s3c_gpio_cfgpin_range ( S5P6450_GPK ( 0 ) , 5 , S3C_GPIO_SFN ( 5 ) ) ;
break ;
default :
printk ( KERN_ERR " Invalid Device %d \n " , pdev - > id ) ;
return - EINVAL ;
}
return 0 ;
}
static struct s3c_audio_pdata s5p6450_i2s0_pdata = {
. cfg_gpio = s5p6450_cfg_i2s ,
. type = {
. i2s = {
. quirks = QUIRK_PRI_6CHAN ,
. src_clk = rclksrc ,
} ,
2010-09-08 19:21:23 +09:00
} ,
} ;
struct platform_device s5p6450_device_iis0 = {
2010-11-19 08:49:44 +09:00
. name = " samsung-i2s " ,
. id = 0 ,
2010-12-21 09:44:42 +09:00
. num_resources = ARRAY_SIZE ( s5p64x0_i2s0_resource ) ,
. resource = s5p64x0_i2s0_resource ,
. dev = {
. platform_data = & s5p6450_i2s0_pdata ,
} ,
} ;
static struct s3c_audio_pdata s5p6450_i2s_pdata = {
. cfg_gpio = s5p6450_cfg_i2s ,
. type = {
. i2s = {
. src_clk = rclksrc ,
} ,
} ,
} ;
static struct resource s5p6450_i2s1_resource [ ] = {
2012-05-12 16:12:30 +09:00
[ 0 ] = DEFINE_RES_MEM ( S5P6450_PA_I2S1 , SZ_256 ) ,
[ 1 ] = DEFINE_RES_DMA ( DMACH_I2S1_TX ) ,
[ 2 ] = DEFINE_RES_DMA ( DMACH_I2S1_RX ) ,
2010-12-21 09:44:42 +09:00
} ;
struct platform_device s5p6450_device_iis1 = {
. name = " samsung-i2s " ,
. id = 1 ,
. num_resources = ARRAY_SIZE ( s5p6450_i2s1_resource ) ,
. resource = s5p6450_i2s1_resource ,
. dev = {
. platform_data = & s5p6450_i2s_pdata ,
} ,
} ;
static struct resource s5p6450_i2s2_resource [ ] = {
2012-05-12 16:12:30 +09:00
[ 0 ] = DEFINE_RES_MEM ( S5P6450_PA_I2S2 , SZ_256 ) ,
[ 1 ] = DEFINE_RES_DMA ( DMACH_I2S2_TX ) ,
[ 2 ] = DEFINE_RES_DMA ( DMACH_I2S2_RX ) ,
2010-12-21 09:44:42 +09:00
} ;
struct platform_device s5p6450_device_iis2 = {
. name = " samsung-i2s " ,
. id = 2 ,
. num_resources = ARRAY_SIZE ( s5p6450_i2s2_resource ) ,
. resource = s5p6450_i2s2_resource ,
2010-09-08 19:21:23 +09:00
. dev = {
2010-12-21 09:44:42 +09:00
. platform_data = & s5p6450_i2s_pdata ,
2010-09-08 19:21:23 +09:00
} ,
} ;
/* PCM Controller platform_devices */
static int s5p6440_pcm_cfg_gpio ( struct platform_device * pdev )
{
switch ( pdev - > id ) {
case 0 :
2010-10-01 13:45:54 +09:00
s3c_gpio_cfgpin_range ( S5P6440_GPR ( 6 ) , 3 , S3C_GPIO_SFN ( 2 ) ) ;
s3c_gpio_cfgpin_range ( S5P6440_GPR ( 13 ) , 2 , S3C_GPIO_SFN ( 2 ) ) ;
2010-09-08 19:21:23 +09:00
break ;
default :
printk ( KERN_DEBUG " Invalid PCM Controller number! " ) ;
return - EINVAL ;
}
return 0 ;
}
static struct s3c_audio_pdata s5p6440_pcm_pdata = {
. cfg_gpio = s5p6440_pcm_cfg_gpio ,
} ;
static struct resource s5p6440_pcm0_resource [ ] = {
2012-05-12 16:12:30 +09:00
[ 0 ] = DEFINE_RES_MEM ( S5P64X0_PA_PCM , SZ_256 ) ,
[ 1 ] = DEFINE_RES_DMA ( DMACH_PCM0_TX ) ,
[ 2 ] = DEFINE_RES_DMA ( DMACH_PCM0_RX ) ,
2010-09-08 19:21:23 +09:00
} ;
struct platform_device s5p6440_device_pcm = {
. name = " samsung-pcm " ,
. id = 0 ,
. num_resources = ARRAY_SIZE ( s5p6440_pcm0_resource ) ,
. resource = s5p6440_pcm0_resource ,
. dev = {
. platform_data = & s5p6440_pcm_pdata ,
} ,
} ;