1/* linux/arch/arm/mach-s5p6440/dev-audio.c 2 * 3 * Copyright (c) 2010 Samsung Electronics Co. Ltd 4 * Jaswinder Singh <jassi.brar@samsung.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 */ 10 11#include <linux/platform_device.h> 12#include <linux/dma-mapping.h> 13#include <linux/gpio.h> 14 15#include <plat/gpio-cfg.h> 16#include <plat/audio.h> 17 18#include <mach/map.h> 19#include <mach/dma.h> 20#include <mach/irqs.h> 21 22static int s5p6440_cfg_i2s(struct platform_device *pdev) 23{ 24 /* configure GPIO for i2s port */ 25 switch (pdev->id) { 26 case -1: 27 s3c_gpio_cfgpin(S5P6440_GPR(4), S3C_GPIO_SFN(5)); 28 s3c_gpio_cfgpin(S5P6440_GPR(5), S3C_GPIO_SFN(5)); 29 s3c_gpio_cfgpin(S5P6440_GPR(6), S3C_GPIO_SFN(5)); 30 s3c_gpio_cfgpin(S5P6440_GPR(7), S3C_GPIO_SFN(5)); 31 s3c_gpio_cfgpin(S5P6440_GPR(8), S3C_GPIO_SFN(5)); 32 s3c_gpio_cfgpin(S5P6440_GPR(13), S3C_GPIO_SFN(5)); 33 s3c_gpio_cfgpin(S5P6440_GPR(14), S3C_GPIO_SFN(5)); 34 break; 35 36 default: 37 printk(KERN_ERR "Invalid Device %d\n", pdev->id); 38 return -EINVAL; 39 } 40 41 return 0; 42} 43 44static struct s3c_audio_pdata s3c_i2s_pdata = { 45 .cfg_gpio = s5p6440_cfg_i2s, 46}; 47 48static struct resource s5p6440_iis0_resource[] = { 49 [0] = { 50 .start = S5P6440_PA_I2S, 51 .end = S5P6440_PA_I2S + 0x100 - 1, 52 .flags = IORESOURCE_MEM, 53 }, 54 [1] = { 55 .start = DMACH_I2S0_TX, 56 .end = DMACH_I2S0_TX, 57 .flags = IORESOURCE_DMA, 58 }, 59 [2] = { 60 .start = DMACH_I2S0_RX, 61 .end = DMACH_I2S0_RX, 62 .flags = IORESOURCE_DMA, 63 }, 64}; 65 66struct platform_device s5p6440_device_iis = { 67 .name = "s3c64xx-iis-v4", 68 .id = -1, 69 .num_resources = ARRAY_SIZE(s5p6440_iis0_resource), 70 .resource = s5p6440_iis0_resource, 71 .dev = { 72 .platform_data = &s3c_i2s_pdata, 73 }, 74}; 75 76/* PCM Controller platform_devices */ 77 78static int s5p6440_pcm_cfg_gpio(struct platform_device *pdev) 79{ 80 switch (pdev->id) { 81 case 0: 82 s3c_gpio_cfgpin(S5P6440_GPR(7), S3C_GPIO_SFN(2)); 83 s3c_gpio_cfgpin(S5P6440_GPR(13), S3C_GPIO_SFN(2)); 84 s3c_gpio_cfgpin(S5P6440_GPR(14), S3C_GPIO_SFN(2)); 85 s3c_gpio_cfgpin(S5P6440_GPR(8), S3C_GPIO_SFN(2)); 86 s3c_gpio_cfgpin(S5P6440_GPR(6), S3C_GPIO_SFN(2)); 87 break; 88 89 default: 90 printk(KERN_DEBUG "Invalid PCM Controller number!"); 91 return -EINVAL; 92 } 93 94 return 0; 95} 96 97static struct s3c_audio_pdata s3c_pcm_pdata = { 98 .cfg_gpio = s5p6440_pcm_cfg_gpio, 99}; 100 101static struct resource s5p6440_pcm0_resource[] = { 102 [0] = { 103 .start = S5P6440_PA_PCM, 104 .end = S5P6440_PA_PCM + 0x100 - 1, 105 .flags = IORESOURCE_MEM, 106 }, 107 [1] = { 108 .start = DMACH_PCM0_TX, 109 .end = DMACH_PCM0_TX, 110 .flags = IORESOURCE_DMA, 111 }, 112 [2] = { 113 .start = DMACH_PCM0_RX, 114 .end = DMACH_PCM0_RX, 115 .flags = IORESOURCE_DMA, 116 }, 117}; 118 119struct platform_device s5p6440_device_pcm = { 120 .name = "samsung-pcm", 121 .id = 0, 122 .num_resources = ARRAY_SIZE(s5p6440_pcm0_resource), 123 .resource = s5p6440_pcm0_resource, 124 .dev = { 125 .platform_data = &s3c_pcm_pdata, 126 }, 127}; 128