2009-06-03 23:08:38 +04:00
/* linux/arch/arm/plat-s3c/dev-audio.c
*
* Copyright 2009 Wolfson Microelectronics
* Mark Brown < broonie @ opensource . wolfsonmicro . 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/kernel.h>
# include <linux/string.h>
# include <linux/platform_device.h>
2010-02-12 13:38:51 +03:00
# include <linux/dma-mapping.h>
2010-08-05 02:54:49 +04:00
# include <linux/gpio.h>
2011-08-01 00:17:29 +04:00
# include <linux/export.h>
2009-06-03 23:08:38 +04:00
# include <mach/irqs.h>
# include <mach/map.h>
2009-11-17 10:53:56 +03:00
# include <mach/dma.h>
2009-06-03 23:08:38 +04:00
# include <plat/devs.h>
2012-08-24 17:22:12 +04:00
# include <linux/platform_data/asoc-s3c.h>
2009-11-17 10:53:56 +03:00
# include <plat/gpio-cfg.h>
2009-06-03 23:08:38 +04:00
2010-11-19 02:49:44 +03:00
static int s3c64xx_i2s_cfg_gpio ( struct platform_device * pdev )
2010-01-06 09:33:44 +03:00
{
2010-05-27 10:54:06 +04:00
unsigned int base ;
2010-01-06 09:33:44 +03:00
switch ( pdev - > id ) {
case 0 :
2010-05-27 10:54:06 +04:00
base = S3C64XX_GPD ( 0 ) ;
2010-01-06 09:33:44 +03:00
break ;
case 1 :
2010-05-27 10:54:06 +04:00
base = S3C64XX_GPE ( 0 ) ;
2010-08-26 19:07:23 +04:00
break ;
2010-11-19 02:49:44 +03:00
case 2 :
s3c_gpio_cfgpin ( S3C64XX_GPC ( 4 ) , S3C_GPIO_SFN ( 5 ) ) ;
s3c_gpio_cfgpin ( S3C64XX_GPC ( 5 ) , S3C_GPIO_SFN ( 5 ) ) ;
s3c_gpio_cfgpin ( S3C64XX_GPC ( 7 ) , S3C_GPIO_SFN ( 5 ) ) ;
s3c_gpio_cfgpin_range ( S3C64XX_GPH ( 6 ) , 4 , S3C_GPIO_SFN ( 5 ) ) ;
return 0 ;
2010-01-06 09:33:44 +03:00
default :
2010-08-26 19:07:23 +04:00
printk ( KERN_DEBUG " Invalid I2S Controller number: %d \n " ,
pdev - > id ) ;
2010-01-06 09:33:44 +03:00
return - EINVAL ;
}
2010-05-27 10:54:06 +04:00
s3c_gpio_cfgpin_range ( base , 5 , S3C_GPIO_SFN ( 3 ) ) ;
2010-01-06 09:33:44 +03:00
return 0 ;
}
2009-06-03 23:08:38 +04:00
static struct resource s3c64xx_iis0_resource [ ] = {
2012-05-12 11:12:25 +04:00
[ 0 ] = DEFINE_RES_MEM ( S3C64XX_PA_IIS0 , SZ_256 ) ,
[ 1 ] = DEFINE_RES_DMA ( DMACH_I2S0_OUT ) ,
[ 2 ] = DEFINE_RES_DMA ( DMACH_I2S0_IN ) ,
2010-01-06 09:33:44 +03:00
} ;
2010-11-19 02:49:44 +03:00
static struct s3c_audio_pdata i2sv3_pdata = {
. cfg_gpio = s3c64xx_i2s_cfg_gpio ,
2009-06-03 23:08:38 +04:00
} ;
struct platform_device s3c64xx_device_iis0 = {
2010-11-19 02:49:43 +03:00
. name = " samsung-i2s " ,
2009-06-03 23:08:38 +04:00
. id = 0 ,
. num_resources = ARRAY_SIZE ( s3c64xx_iis0_resource ) ,
. resource = s3c64xx_iis0_resource ,
2010-01-06 09:33:44 +03:00
. dev = {
2010-11-19 02:49:44 +03:00
. platform_data = & i2sv3_pdata ,
2010-01-06 09:33:44 +03:00
} ,
2009-06-03 23:08:38 +04:00
} ;
EXPORT_SYMBOL ( s3c64xx_device_iis0 ) ;
static struct resource s3c64xx_iis1_resource [ ] = {
2012-05-12 11:12:25 +04:00
[ 0 ] = DEFINE_RES_MEM ( S3C64XX_PA_IIS1 , SZ_256 ) ,
[ 1 ] = DEFINE_RES_DMA ( DMACH_I2S1_OUT ) ,
[ 2 ] = DEFINE_RES_DMA ( DMACH_I2S1_IN ) ,
2010-01-06 09:33:44 +03:00
} ;
2009-06-03 23:08:38 +04:00
struct platform_device s3c64xx_device_iis1 = {
2010-11-19 02:49:43 +03:00
. name = " samsung-i2s " ,
2009-06-03 23:08:38 +04:00
. id = 1 ,
. num_resources = ARRAY_SIZE ( s3c64xx_iis1_resource ) ,
. resource = s3c64xx_iis1_resource ,
2010-01-06 09:33:44 +03:00
. dev = {
2010-11-19 02:49:44 +03:00
. platform_data = & i2sv3_pdata ,
2010-01-06 09:33:44 +03:00
} ,
2009-06-03 23:08:38 +04:00
} ;
EXPORT_SYMBOL ( s3c64xx_device_iis1 ) ;
2009-06-03 23:08:39 +04:00
static struct resource s3c64xx_iisv4_resource [ ] = {
2012-05-12 11:12:25 +04:00
[ 0 ] = DEFINE_RES_MEM ( S3C64XX_PA_IISV4 , SZ_256 ) ,
[ 1 ] = DEFINE_RES_DMA ( DMACH_HSI_I2SV40_TX ) ,
[ 2 ] = DEFINE_RES_DMA ( DMACH_HSI_I2SV40_RX ) ,
2010-01-06 09:33:44 +03:00
} ;
2010-11-19 02:49:44 +03:00
static struct s3c_audio_pdata i2sv4_pdata = {
. cfg_gpio = s3c64xx_i2s_cfg_gpio ,
. type = {
. i2s = {
. quirks = QUIRK_PRI_6CHAN ,
} ,
} ,
2009-06-03 23:08:39 +04:00
} ;
struct platform_device s3c64xx_device_iisv4 = {
2010-11-19 02:49:44 +03:00
. name = " samsung-i2s " ,
. id = 2 ,
2009-06-03 23:08:39 +04:00
. num_resources = ARRAY_SIZE ( s3c64xx_iisv4_resource ) ,
. resource = s3c64xx_iisv4_resource ,
2010-01-06 09:33:44 +03:00
. dev = {
2010-11-19 02:49:44 +03:00
. platform_data = & i2sv4_pdata ,
2010-01-06 09:33:44 +03:00
} ,
2009-06-03 23:08:39 +04:00
} ;
EXPORT_SYMBOL ( s3c64xx_device_iisv4 ) ;
2009-11-17 10:53:56 +03:00
/* PCM Controller platform_devices */
static int s3c64xx_pcm_cfg_gpio ( struct platform_device * pdev )
{
2010-05-27 10:54:06 +04:00
unsigned int base ;
2009-11-17 10:53:56 +03:00
switch ( pdev - > id ) {
case 0 :
2010-05-27 10:54:06 +04:00
base = S3C64XX_GPD ( 0 ) ;
2009-11-17 10:53:56 +03:00
break ;
case 1 :
2010-05-27 10:54:06 +04:00
base = S3C64XX_GPE ( 0 ) ;
2009-11-17 10:53:56 +03:00
break ;
default :
2010-08-26 19:07:23 +04:00
printk ( KERN_DEBUG " Invalid PCM Controller number: %d \n " ,
pdev - > id ) ;
2009-11-17 10:53:56 +03:00
return - EINVAL ;
}
2010-05-27 10:54:06 +04:00
s3c_gpio_cfgpin_range ( base , 5 , S3C_GPIO_SFN ( 2 ) ) ;
2009-11-17 10:53:56 +03:00
return 0 ;
}
static struct resource s3c64xx_pcm0_resource [ ] = {
2012-05-12 11:12:25 +04:00
[ 0 ] = DEFINE_RES_MEM ( S3C64XX_PA_PCM0 , SZ_256 ) ,
[ 1 ] = DEFINE_RES_DMA ( DMACH_PCM0_TX ) ,
[ 2 ] = DEFINE_RES_DMA ( DMACH_PCM0_RX ) ,
2009-11-17 10:53:56 +03:00
} ;
2009-11-27 19:43:53 +03:00
static struct s3c_audio_pdata s3c_pcm0_pdata = {
2009-11-17 10:53:56 +03:00
. cfg_gpio = s3c64xx_pcm_cfg_gpio ,
} ;
struct platform_device s3c64xx_device_pcm0 = {
. name = " samsung-pcm " ,
. id = 0 ,
. num_resources = ARRAY_SIZE ( s3c64xx_pcm0_resource ) ,
. resource = s3c64xx_pcm0_resource ,
. dev = {
. platform_data = & s3c_pcm0_pdata ,
} ,
} ;
EXPORT_SYMBOL ( s3c64xx_device_pcm0 ) ;
static struct resource s3c64xx_pcm1_resource [ ] = {
2012-05-12 11:12:25 +04:00
[ 0 ] = DEFINE_RES_MEM ( S3C64XX_PA_PCM1 , SZ_256 ) ,
[ 1 ] = DEFINE_RES_DMA ( DMACH_PCM1_TX ) ,
[ 2 ] = DEFINE_RES_DMA ( DMACH_PCM1_RX ) ,
2009-11-17 10:53:56 +03:00
} ;
2009-11-27 19:43:53 +03:00
static struct s3c_audio_pdata s3c_pcm1_pdata = {
2009-11-17 10:53:56 +03:00
. cfg_gpio = s3c64xx_pcm_cfg_gpio ,
} ;
struct platform_device s3c64xx_device_pcm1 = {
. name = " samsung-pcm " ,
. id = 1 ,
. num_resources = ARRAY_SIZE ( s3c64xx_pcm1_resource ) ,
. resource = s3c64xx_pcm1_resource ,
. dev = {
. platform_data = & s3c_pcm1_pdata ,
} ,
} ;
EXPORT_SYMBOL ( s3c64xx_device_pcm1 ) ;
2010-02-12 13:38:51 +03:00
/* AC97 Controller platform devices */
static int s3c64xx_ac97_cfg_gpd ( struct platform_device * pdev )
{
2010-05-27 10:54:06 +04:00
return s3c_gpio_cfgpin_range ( S3C64XX_GPD ( 0 ) , 5 , S3C_GPIO_SFN ( 4 ) ) ;
2010-02-12 13:38:51 +03:00
}
static int s3c64xx_ac97_cfg_gpe ( struct platform_device * pdev )
{
2010-05-27 10:54:06 +04:00
return s3c_gpio_cfgpin_range ( S3C64XX_GPE ( 0 ) , 5 , S3C_GPIO_SFN ( 4 ) ) ;
2010-02-12 13:38:51 +03:00
}
static struct resource s3c64xx_ac97_resource [ ] = {
2012-05-12 11:12:25 +04:00
[ 0 ] = DEFINE_RES_MEM ( S3C64XX_PA_AC97 , SZ_256 ) ,
[ 1 ] = DEFINE_RES_DMA ( DMACH_AC97_PCMOUT ) ,
[ 2 ] = DEFINE_RES_DMA ( DMACH_AC97_PCMIN ) ,
[ 3 ] = DEFINE_RES_DMA ( DMACH_AC97_MICIN ) ,
[ 4 ] = DEFINE_RES_IRQ ( IRQ_AC97 ) ,
2010-02-12 13:38:51 +03:00
} ;
static struct s3c_audio_pdata s3c_ac97_pdata ;
static u64 s3c64xx_ac97_dmamask = DMA_BIT_MASK ( 32 ) ;
struct platform_device s3c64xx_device_ac97 = {
2010-11-22 09:36:00 +03:00
. name = " samsung-ac97 " ,
2010-02-12 13:38:51 +03:00
. id = - 1 ,
. num_resources = ARRAY_SIZE ( s3c64xx_ac97_resource ) ,
. resource = s3c64xx_ac97_resource ,
. dev = {
. platform_data = & s3c_ac97_pdata ,
. dma_mask = & s3c64xx_ac97_dmamask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
} ,
} ;
EXPORT_SYMBOL ( s3c64xx_device_ac97 ) ;
void __init s3c64xx_ac97_setup_gpio ( int num )
{
if ( num = = S3C64XX_AC97_GPD )
s3c_ac97_pdata . cfg_gpio = s3c64xx_ac97_cfg_gpd ;
else
s3c_ac97_pdata . cfg_gpio = s3c64xx_ac97_cfg_gpe ;
}