Path: blob/master/arch/arm/mach-exynos4/dev-audio.c
10817 views
/* linux/arch/arm/mach-exynos4/dev-audio.c1*2* Copyright (c) 2011 Samsung Electronics Co., Ltd.3* http://www.samsung.com4*5* Copyright (c) 2010 Samsung Electronics Co. Ltd6* Jaswinder Singh <[email protected]>7*8* This program is free software; you can redistribute it and/or modify9* it under the terms of the GNU General Public License version 2 as10* published by the Free Software Foundation.11*/1213#include <linux/platform_device.h>14#include <linux/dma-mapping.h>15#include <linux/gpio.h>1617#include <plat/gpio-cfg.h>18#include <plat/audio.h>1920#include <mach/map.h>21#include <mach/dma.h>22#include <mach/irqs.h>2324static const char *rclksrc[] = {25[0] = "busclk",26[1] = "i2sclk",27};2829static int exynos4_cfg_i2s(struct platform_device *pdev)30{31/* configure GPIO for i2s port */32switch (pdev->id) {33case 0:34s3c_gpio_cfgpin_range(EXYNOS4_GPZ(0), 7, S3C_GPIO_SFN(2));35break;36case 1:37s3c_gpio_cfgpin_range(EXYNOS4_GPC0(0), 5, S3C_GPIO_SFN(2));38break;39case 2:40s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 5, S3C_GPIO_SFN(4));41break;42default:43printk(KERN_ERR "Invalid Device %d\n", pdev->id);44return -EINVAL;45}4647return 0;48}4950static struct s3c_audio_pdata i2sv5_pdata = {51.cfg_gpio = exynos4_cfg_i2s,52.type = {53.i2s = {54.quirks = QUIRK_PRI_6CHAN | QUIRK_SEC_DAI55| QUIRK_NEED_RSTCLR,56.src_clk = rclksrc,57},58},59};6061static struct resource exynos4_i2s0_resource[] = {62[0] = {63.start = EXYNOS4_PA_I2S0,64.end = EXYNOS4_PA_I2S0 + 0x100 - 1,65.flags = IORESOURCE_MEM,66},67[1] = {68.start = DMACH_I2S0_TX,69.end = DMACH_I2S0_TX,70.flags = IORESOURCE_DMA,71},72[2] = {73.start = DMACH_I2S0_RX,74.end = DMACH_I2S0_RX,75.flags = IORESOURCE_DMA,76},77[3] = {78.start = DMACH_I2S0S_TX,79.end = DMACH_I2S0S_TX,80.flags = IORESOURCE_DMA,81},82};8384struct platform_device exynos4_device_i2s0 = {85.name = "samsung-i2s",86.id = 0,87.num_resources = ARRAY_SIZE(exynos4_i2s0_resource),88.resource = exynos4_i2s0_resource,89.dev = {90.platform_data = &i2sv5_pdata,91},92};9394static const char *rclksrc_v3[] = {95[0] = "sclk_i2s",96[1] = "no_such_clock",97};9899static struct s3c_audio_pdata i2sv3_pdata = {100.cfg_gpio = exynos4_cfg_i2s,101.type = {102.i2s = {103.quirks = QUIRK_NO_MUXPSR,104.src_clk = rclksrc_v3,105},106},107};108109static struct resource exynos4_i2s1_resource[] = {110[0] = {111.start = EXYNOS4_PA_I2S1,112.end = EXYNOS4_PA_I2S1 + 0x100 - 1,113.flags = IORESOURCE_MEM,114},115[1] = {116.start = DMACH_I2S1_TX,117.end = DMACH_I2S1_TX,118.flags = IORESOURCE_DMA,119},120[2] = {121.start = DMACH_I2S1_RX,122.end = DMACH_I2S1_RX,123.flags = IORESOURCE_DMA,124},125};126127struct platform_device exynos4_device_i2s1 = {128.name = "samsung-i2s",129.id = 1,130.num_resources = ARRAY_SIZE(exynos4_i2s1_resource),131.resource = exynos4_i2s1_resource,132.dev = {133.platform_data = &i2sv3_pdata,134},135};136137static struct resource exynos4_i2s2_resource[] = {138[0] = {139.start = EXYNOS4_PA_I2S2,140.end = EXYNOS4_PA_I2S2 + 0x100 - 1,141.flags = IORESOURCE_MEM,142},143[1] = {144.start = DMACH_I2S2_TX,145.end = DMACH_I2S2_TX,146.flags = IORESOURCE_DMA,147},148[2] = {149.start = DMACH_I2S2_RX,150.end = DMACH_I2S2_RX,151.flags = IORESOURCE_DMA,152},153};154155struct platform_device exynos4_device_i2s2 = {156.name = "samsung-i2s",157.id = 2,158.num_resources = ARRAY_SIZE(exynos4_i2s2_resource),159.resource = exynos4_i2s2_resource,160.dev = {161.platform_data = &i2sv3_pdata,162},163};164165/* PCM Controller platform_devices */166167static int exynos4_pcm_cfg_gpio(struct platform_device *pdev)168{169switch (pdev->id) {170case 0:171s3c_gpio_cfgpin_range(EXYNOS4_GPZ(0), 5, S3C_GPIO_SFN(3));172break;173case 1:174s3c_gpio_cfgpin_range(EXYNOS4_GPC0(0), 5, S3C_GPIO_SFN(3));175break;176case 2:177s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 5, S3C_GPIO_SFN(3));178break;179default:180printk(KERN_DEBUG "Invalid PCM Controller number!");181return -EINVAL;182}183184return 0;185}186187static struct s3c_audio_pdata s3c_pcm_pdata = {188.cfg_gpio = exynos4_pcm_cfg_gpio,189};190191static struct resource exynos4_pcm0_resource[] = {192[0] = {193.start = EXYNOS4_PA_PCM0,194.end = EXYNOS4_PA_PCM0 + 0x100 - 1,195.flags = IORESOURCE_MEM,196},197[1] = {198.start = DMACH_PCM0_TX,199.end = DMACH_PCM0_TX,200.flags = IORESOURCE_DMA,201},202[2] = {203.start = DMACH_PCM0_RX,204.end = DMACH_PCM0_RX,205.flags = IORESOURCE_DMA,206},207};208209struct platform_device exynos4_device_pcm0 = {210.name = "samsung-pcm",211.id = 0,212.num_resources = ARRAY_SIZE(exynos4_pcm0_resource),213.resource = exynos4_pcm0_resource,214.dev = {215.platform_data = &s3c_pcm_pdata,216},217};218219static struct resource exynos4_pcm1_resource[] = {220[0] = {221.start = EXYNOS4_PA_PCM1,222.end = EXYNOS4_PA_PCM1 + 0x100 - 1,223.flags = IORESOURCE_MEM,224},225[1] = {226.start = DMACH_PCM1_TX,227.end = DMACH_PCM1_TX,228.flags = IORESOURCE_DMA,229},230[2] = {231.start = DMACH_PCM1_RX,232.end = DMACH_PCM1_RX,233.flags = IORESOURCE_DMA,234},235};236237struct platform_device exynos4_device_pcm1 = {238.name = "samsung-pcm",239.id = 1,240.num_resources = ARRAY_SIZE(exynos4_pcm1_resource),241.resource = exynos4_pcm1_resource,242.dev = {243.platform_data = &s3c_pcm_pdata,244},245};246247static struct resource exynos4_pcm2_resource[] = {248[0] = {249.start = EXYNOS4_PA_PCM2,250.end = EXYNOS4_PA_PCM2 + 0x100 - 1,251.flags = IORESOURCE_MEM,252},253[1] = {254.start = DMACH_PCM2_TX,255.end = DMACH_PCM2_TX,256.flags = IORESOURCE_DMA,257},258[2] = {259.start = DMACH_PCM2_RX,260.end = DMACH_PCM2_RX,261.flags = IORESOURCE_DMA,262},263};264265struct platform_device exynos4_device_pcm2 = {266.name = "samsung-pcm",267.id = 2,268.num_resources = ARRAY_SIZE(exynos4_pcm2_resource),269.resource = exynos4_pcm2_resource,270.dev = {271.platform_data = &s3c_pcm_pdata,272},273};274275/* AC97 Controller platform devices */276277static int exynos4_ac97_cfg_gpio(struct platform_device *pdev)278{279return s3c_gpio_cfgpin_range(EXYNOS4_GPC0(0), 5, S3C_GPIO_SFN(4));280}281282static struct resource exynos4_ac97_resource[] = {283[0] = {284.start = EXYNOS4_PA_AC97,285.end = EXYNOS4_PA_AC97 + 0x100 - 1,286.flags = IORESOURCE_MEM,287},288[1] = {289.start = DMACH_AC97_PCMOUT,290.end = DMACH_AC97_PCMOUT,291.flags = IORESOURCE_DMA,292},293[2] = {294.start = DMACH_AC97_PCMIN,295.end = DMACH_AC97_PCMIN,296.flags = IORESOURCE_DMA,297},298[3] = {299.start = DMACH_AC97_MICIN,300.end = DMACH_AC97_MICIN,301.flags = IORESOURCE_DMA,302},303[4] = {304.start = IRQ_AC97,305.end = IRQ_AC97,306.flags = IORESOURCE_IRQ,307},308};309310static struct s3c_audio_pdata s3c_ac97_pdata = {311.cfg_gpio = exynos4_ac97_cfg_gpio,312};313314static u64 exynos4_ac97_dmamask = DMA_BIT_MASK(32);315316struct platform_device exynos4_device_ac97 = {317.name = "samsung-ac97",318.id = -1,319.num_resources = ARRAY_SIZE(exynos4_ac97_resource),320.resource = exynos4_ac97_resource,321.dev = {322.platform_data = &s3c_ac97_pdata,323.dma_mask = &exynos4_ac97_dmamask,324.coherent_dma_mask = DMA_BIT_MASK(32),325},326};327328/* S/PDIF Controller platform_device */329330static int exynos4_spdif_cfg_gpio(struct platform_device *pdev)331{332s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 2, S3C_GPIO_SFN(4));333334return 0;335}336337static struct resource exynos4_spdif_resource[] = {338[0] = {339.start = EXYNOS4_PA_SPDIF,340.end = EXYNOS4_PA_SPDIF + 0x100 - 1,341.flags = IORESOURCE_MEM,342},343[1] = {344.start = DMACH_SPDIF,345.end = DMACH_SPDIF,346.flags = IORESOURCE_DMA,347},348};349350static struct s3c_audio_pdata samsung_spdif_pdata = {351.cfg_gpio = exynos4_spdif_cfg_gpio,352};353354static u64 exynos4_spdif_dmamask = DMA_BIT_MASK(32);355356struct platform_device exynos4_device_spdif = {357.name = "samsung-spdif",358.id = -1,359.num_resources = ARRAY_SIZE(exynos4_spdif_resource),360.resource = exynos4_spdif_resource,361.dev = {362.platform_data = &samsung_spdif_pdata,363.dma_mask = &exynos4_spdif_dmamask,364.coherent_dma_mask = DMA_BIT_MASK(32),365},366};367368369