1/* linux/arch/arm/mach-s5p64x0/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 const char *rclksrc[] = { 23 [0] = "iis", 24 [1] = "sclk_audio2", 25}; 26 27static int s5p6440_cfg_i2s(struct platform_device *pdev) 28{ 29 switch (pdev->id) { 30 case 0: 31 s3c_gpio_cfgpin_range(S5P6440_GPC(4), 2, S3C_GPIO_SFN(5)); 32 s3c_gpio_cfgpin(S5P6440_GPC(7), S3C_GPIO_SFN(5)); 33 s3c_gpio_cfgpin_range(S5P6440_GPH(6), 4, S3C_GPIO_SFN(5)); 34 break; 35 default: 36 printk(KERN_ERR "Invalid Device %d\n", pdev->id); 37 return -EINVAL; 38 } 39 40 return 0; 41} 42 43static struct s3c_audio_pdata s5p6440_i2s_pdata = { 44 .cfg_gpio = s5p6440_cfg_i2s, 45 .type = { 46 .i2s = { 47 .quirks = QUIRK_PRI_6CHAN, 48 .src_clk = rclksrc, 49 }, 50 }, 51}; 52 53static struct resource s5p64x0_i2s0_resource[] = { 54 [0] = { 55 .start = S5P64X0_PA_I2S, 56 .end = S5P64X0_PA_I2S + 0x100 - 1, 57 .flags = IORESOURCE_MEM, 58 }, 59 [1] = { 60 .start = DMACH_I2S0_TX, 61 .end = DMACH_I2S0_TX, 62 .flags = IORESOURCE_DMA, 63 }, 64 [2] = { 65 .start = DMACH_I2S0_RX, 66 .end = DMACH_I2S0_RX, 67 .flags = IORESOURCE_DMA, 68 }, 69}; 70 71struct platform_device s5p6440_device_iis = { 72 .name = "samsung-i2s", 73 .id = 0, 74 .num_resources = ARRAY_SIZE(s5p64x0_i2s0_resource), 75 .resource = s5p64x0_i2s0_resource, 76 .dev = { 77 .platform_data = &s5p6440_i2s_pdata, 78 }, 79}; 80 81static int s5p6450_cfg_i2s(struct platform_device *pdev) 82{ 83 switch (pdev->id) { 84 case 0: 85 s3c_gpio_cfgpin_range(S5P6450_GPR(4), 5, S3C_GPIO_SFN(5)); 86 s3c_gpio_cfgpin_range(S5P6450_GPR(13), 2, S3C_GPIO_SFN(5)); 87 break; 88 case 1: 89 s3c_gpio_cfgpin(S5P6440_GPB(4), S3C_GPIO_SFN(5)); 90 s3c_gpio_cfgpin_range(S5P6450_GPC(0), 4, S3C_GPIO_SFN(5)); 91 break; 92 case 2: 93 s3c_gpio_cfgpin_range(S5P6450_GPK(0), 5, S3C_GPIO_SFN(5)); 94 break; 95 default: 96 printk(KERN_ERR "Invalid Device %d\n", pdev->id); 97 return -EINVAL; 98 } 99 100 return 0; 101} 102 103static struct s3c_audio_pdata s5p6450_i2s0_pdata = { 104 .cfg_gpio = s5p6450_cfg_i2s, 105 .type = { 106 .i2s = { 107 .quirks = QUIRK_PRI_6CHAN, 108 .src_clk = rclksrc, 109 }, 110 }, 111}; 112 113struct platform_device s5p6450_device_iis0 = { 114 .name = "samsung-i2s", 115 .id = 0, 116 .num_resources = ARRAY_SIZE(s5p64x0_i2s0_resource), 117 .resource = s5p64x0_i2s0_resource, 118 .dev = { 119 .platform_data = &s5p6450_i2s0_pdata, 120 }, 121}; 122 123static struct s3c_audio_pdata s5p6450_i2s_pdata = { 124 .cfg_gpio = s5p6450_cfg_i2s, 125 .type = { 126 .i2s = { 127 .src_clk = rclksrc, 128 }, 129 }, 130}; 131 132static struct resource s5p6450_i2s1_resource[] = { 133 [0] = { 134 .start = S5P6450_PA_I2S1, 135 .end = S5P6450_PA_I2S1 + 0x100 - 1, 136 .flags = IORESOURCE_MEM, 137 }, 138 [1] = { 139 .start = DMACH_I2S1_TX, 140 .end = DMACH_I2S1_TX, 141 .flags = IORESOURCE_DMA, 142 }, 143 [2] = { 144 .start = DMACH_I2S1_RX, 145 .end = DMACH_I2S1_RX, 146 .flags = IORESOURCE_DMA, 147 }, 148}; 149 150struct platform_device s5p6450_device_iis1 = { 151 .name = "samsung-i2s", 152 .id = 1, 153 .num_resources = ARRAY_SIZE(s5p6450_i2s1_resource), 154 .resource = s5p6450_i2s1_resource, 155 .dev = { 156 .platform_data = &s5p6450_i2s_pdata, 157 }, 158}; 159 160static struct resource s5p6450_i2s2_resource[] = { 161 [0] = { 162 .start = S5P6450_PA_I2S2, 163 .end = S5P6450_PA_I2S2 + 0x100 - 1, 164 .flags = IORESOURCE_MEM, 165 }, 166 [1] = { 167 .start = DMACH_I2S2_TX, 168 .end = DMACH_I2S2_TX, 169 .flags = IORESOURCE_DMA, 170 }, 171 [2] = { 172 .start = DMACH_I2S2_RX, 173 .end = DMACH_I2S2_RX, 174 .flags = IORESOURCE_DMA, 175 }, 176}; 177 178struct platform_device s5p6450_device_iis2 = { 179 .name = "samsung-i2s", 180 .id = 2, 181 .num_resources = ARRAY_SIZE(s5p6450_i2s2_resource), 182 .resource = s5p6450_i2s2_resource, 183 .dev = { 184 .platform_data = &s5p6450_i2s_pdata, 185 }, 186}; 187 188/* PCM Controller platform_devices */ 189 190static int s5p6440_pcm_cfg_gpio(struct platform_device *pdev) 191{ 192 switch (pdev->id) { 193 case 0: 194 s3c_gpio_cfgpin_range(S5P6440_GPR(6), 3, S3C_GPIO_SFN(2)); 195 s3c_gpio_cfgpin_range(S5P6440_GPR(13), 2, S3C_GPIO_SFN(2)); 196 break; 197 198 default: 199 printk(KERN_DEBUG "Invalid PCM Controller number!"); 200 return -EINVAL; 201 } 202 203 return 0; 204} 205 206static struct s3c_audio_pdata s5p6440_pcm_pdata = { 207 .cfg_gpio = s5p6440_pcm_cfg_gpio, 208}; 209 210static struct resource s5p6440_pcm0_resource[] = { 211 [0] = { 212 .start = S5P64X0_PA_PCM, 213 .end = S5P64X0_PA_PCM + 0x100 - 1, 214 .flags = IORESOURCE_MEM, 215 }, 216 [1] = { 217 .start = DMACH_PCM0_TX, 218 .end = DMACH_PCM0_TX, 219 .flags = IORESOURCE_DMA, 220 }, 221 [2] = { 222 .start = DMACH_PCM0_RX, 223 .end = DMACH_PCM0_RX, 224 .flags = IORESOURCE_DMA, 225 }, 226}; 227 228struct platform_device s5p6440_device_pcm = { 229 .name = "samsung-pcm", 230 .id = 0, 231 .num_resources = ARRAY_SIZE(s5p6440_pcm0_resource), 232 .resource = s5p6440_pcm0_resource, 233 .dev = { 234 .platform_data = &s5p6440_pcm_pdata, 235 }, 236}; 237