dev-audio.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. /* linux/arch/arm/mach-s5pc100/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. #include <linux/platform_device.h>
  11. #include <linux/dma-mapping.h>
  12. #include <linux/gpio.h>
  13. #include <plat/gpio-cfg.h>
  14. #include <plat/audio.h>
  15. #include <mach/map.h>
  16. #include <mach/dma.h>
  17. #include <mach/irqs.h>
  18. static int s5pc100_cfg_i2s(struct platform_device *pdev)
  19. {
  20. /* configure GPIO for i2s port */
  21. switch (pdev->id) {
  22. case 1:
  23. s3c_gpio_cfgpin_range(S5PC100_GPC(0), 5, S3C_GPIO_SFN(2));
  24. break;
  25. case 2:
  26. s3c_gpio_cfgpin_range(S5PC100_GPG3(0), 5, S3C_GPIO_SFN(4));
  27. break;
  28. case -1: /* Dedicated pins */
  29. break;
  30. default:
  31. printk(KERN_ERR "Invalid Device %d\n", pdev->id);
  32. return -EINVAL;
  33. }
  34. return 0;
  35. }
  36. static struct s3c_audio_pdata s3c_i2s_pdata = {
  37. .cfg_gpio = s5pc100_cfg_i2s,
  38. };
  39. static struct resource s5pc100_iis0_resource[] = {
  40. [0] = {
  41. .start = S5PC100_PA_I2S0,
  42. .end = S5PC100_PA_I2S0 + 0x100 - 1,
  43. .flags = IORESOURCE_MEM,
  44. },
  45. [1] = {
  46. .start = DMACH_I2S0_TX,
  47. .end = DMACH_I2S0_TX,
  48. .flags = IORESOURCE_DMA,
  49. },
  50. [2] = {
  51. .start = DMACH_I2S0_RX,
  52. .end = DMACH_I2S0_RX,
  53. .flags = IORESOURCE_DMA,
  54. },
  55. };
  56. struct platform_device s5pc100_device_iis0 = {
  57. .name = "s3c64xx-iis-v4",
  58. .id = -1,
  59. .num_resources = ARRAY_SIZE(s5pc100_iis0_resource),
  60. .resource = s5pc100_iis0_resource,
  61. .dev = {
  62. .platform_data = &s3c_i2s_pdata,
  63. },
  64. };
  65. static struct resource s5pc100_iis1_resource[] = {
  66. [0] = {
  67. .start = S5PC100_PA_I2S1,
  68. .end = S5PC100_PA_I2S1 + 0x100 - 1,
  69. .flags = IORESOURCE_MEM,
  70. },
  71. [1] = {
  72. .start = DMACH_I2S1_TX,
  73. .end = DMACH_I2S1_TX,
  74. .flags = IORESOURCE_DMA,
  75. },
  76. [2] = {
  77. .start = DMACH_I2S1_RX,
  78. .end = DMACH_I2S1_RX,
  79. .flags = IORESOURCE_DMA,
  80. },
  81. };
  82. struct platform_device s5pc100_device_iis1 = {
  83. .name = "s3c64xx-iis",
  84. .id = 1,
  85. .num_resources = ARRAY_SIZE(s5pc100_iis1_resource),
  86. .resource = s5pc100_iis1_resource,
  87. .dev = {
  88. .platform_data = &s3c_i2s_pdata,
  89. },
  90. };
  91. static struct resource s5pc100_iis2_resource[] = {
  92. [0] = {
  93. .start = S5PC100_PA_I2S2,
  94. .end = S5PC100_PA_I2S2 + 0x100 - 1,
  95. .flags = IORESOURCE_MEM,
  96. },
  97. [1] = {
  98. .start = DMACH_I2S2_TX,
  99. .end = DMACH_I2S2_TX,
  100. .flags = IORESOURCE_DMA,
  101. },
  102. [2] = {
  103. .start = DMACH_I2S2_RX,
  104. .end = DMACH_I2S2_RX,
  105. .flags = IORESOURCE_DMA,
  106. },
  107. };
  108. struct platform_device s5pc100_device_iis2 = {
  109. .name = "s3c64xx-iis",
  110. .id = 2,
  111. .num_resources = ARRAY_SIZE(s5pc100_iis2_resource),
  112. .resource = s5pc100_iis2_resource,
  113. .dev = {
  114. .platform_data = &s3c_i2s_pdata,
  115. },
  116. };
  117. /* PCM Controller platform_devices */
  118. static int s5pc100_pcm_cfg_gpio(struct platform_device *pdev)
  119. {
  120. switch (pdev->id) {
  121. case 0:
  122. s3c_gpio_cfgpin_range(S5PC100_GPG3(0), 5, S3C_GPIO_SFN(5));
  123. break;
  124. case 1:
  125. s3c_gpio_cfgpin_range(S5PC100_GPC(0), 5, S3C_GPIO_SFN(3));
  126. break;
  127. default:
  128. printk(KERN_DEBUG "Invalid PCM Controller number!");
  129. return -EINVAL;
  130. }
  131. return 0;
  132. }
  133. static struct s3c_audio_pdata s3c_pcm_pdata = {
  134. .cfg_gpio = s5pc100_pcm_cfg_gpio,
  135. };
  136. static struct resource s5pc100_pcm0_resource[] = {
  137. [0] = {
  138. .start = S5PC100_PA_PCM0,
  139. .end = S5PC100_PA_PCM0 + 0x100 - 1,
  140. .flags = IORESOURCE_MEM,
  141. },
  142. [1] = {
  143. .start = DMACH_PCM0_TX,
  144. .end = DMACH_PCM0_TX,
  145. .flags = IORESOURCE_DMA,
  146. },
  147. [2] = {
  148. .start = DMACH_PCM0_RX,
  149. .end = DMACH_PCM0_RX,
  150. .flags = IORESOURCE_DMA,
  151. },
  152. };
  153. struct platform_device s5pc100_device_pcm0 = {
  154. .name = "samsung-pcm",
  155. .id = 0,
  156. .num_resources = ARRAY_SIZE(s5pc100_pcm0_resource),
  157. .resource = s5pc100_pcm0_resource,
  158. .dev = {
  159. .platform_data = &s3c_pcm_pdata,
  160. },
  161. };
  162. static struct resource s5pc100_pcm1_resource[] = {
  163. [0] = {
  164. .start = S5PC100_PA_PCM1,
  165. .end = S5PC100_PA_PCM1 + 0x100 - 1,
  166. .flags = IORESOURCE_MEM,
  167. },
  168. [1] = {
  169. .start = DMACH_PCM1_TX,
  170. .end = DMACH_PCM1_TX,
  171. .flags = IORESOURCE_DMA,
  172. },
  173. [2] = {
  174. .start = DMACH_PCM1_RX,
  175. .end = DMACH_PCM1_RX,
  176. .flags = IORESOURCE_DMA,
  177. },
  178. };
  179. struct platform_device s5pc100_device_pcm1 = {
  180. .name = "samsung-pcm",
  181. .id = 1,
  182. .num_resources = ARRAY_SIZE(s5pc100_pcm1_resource),
  183. .resource = s5pc100_pcm1_resource,
  184. .dev = {
  185. .platform_data = &s3c_pcm_pdata,
  186. },
  187. };
  188. /* AC97 Controller platform devices */
  189. static int s5pc100_ac97_cfg_gpio(struct platform_device *pdev)
  190. {
  191. return s3c_gpio_cfgpin_range(S5PC100_GPC(0), 5, S3C_GPIO_SFN(4));
  192. }
  193. static struct resource s5pc100_ac97_resource[] = {
  194. [0] = {
  195. .start = S5PC100_PA_AC97,
  196. .end = S5PC100_PA_AC97 + 0x100 - 1,
  197. .flags = IORESOURCE_MEM,
  198. },
  199. [1] = {
  200. .start = DMACH_AC97_PCMOUT,
  201. .end = DMACH_AC97_PCMOUT,
  202. .flags = IORESOURCE_DMA,
  203. },
  204. [2] = {
  205. .start = DMACH_AC97_PCMIN,
  206. .end = DMACH_AC97_PCMIN,
  207. .flags = IORESOURCE_DMA,
  208. },
  209. [3] = {
  210. .start = DMACH_AC97_MICIN,
  211. .end = DMACH_AC97_MICIN,
  212. .flags = IORESOURCE_DMA,
  213. },
  214. [4] = {
  215. .start = IRQ_AC97,
  216. .end = IRQ_AC97,
  217. .flags = IORESOURCE_IRQ,
  218. },
  219. };
  220. static struct s3c_audio_pdata s3c_ac97_pdata = {
  221. .cfg_gpio = s5pc100_ac97_cfg_gpio,
  222. };
  223. static u64 s5pc100_ac97_dmamask = DMA_BIT_MASK(32);
  224. struct platform_device s5pc100_device_ac97 = {
  225. .name = "s3c-ac97",
  226. .id = -1,
  227. .num_resources = ARRAY_SIZE(s5pc100_ac97_resource),
  228. .resource = s5pc100_ac97_resource,
  229. .dev = {
  230. .platform_data = &s3c_ac97_pdata,
  231. .dma_mask = &s5pc100_ac97_dmamask,
  232. .coherent_dma_mask = DMA_BIT_MASK(32),
  233. },
  234. };
  235. /* S/PDIF Controller platform_device */
  236. static int s5pc100_spdif_cfg_gpd(struct platform_device *pdev)
  237. {
  238. s3c_gpio_cfgpin_range(S5PC100_GPD(5), 2, S3C_GPIO_SFN(3));
  239. return 0;
  240. }
  241. static int s5pc100_spdif_cfg_gpg3(struct platform_device *pdev)
  242. {
  243. s3c_gpio_cfgpin_range(S5PC100_GPG3(5), 2, S3C_GPIO_SFN(3));
  244. return 0;
  245. }
  246. static struct resource s5pc100_spdif_resource[] = {
  247. [0] = {
  248. .start = S5PC100_PA_SPDIF,
  249. .end = S5PC100_PA_SPDIF + 0x100 - 1,
  250. .flags = IORESOURCE_MEM,
  251. },
  252. [1] = {
  253. .start = DMACH_SPDIF,
  254. .end = DMACH_SPDIF,
  255. .flags = IORESOURCE_DMA,
  256. },
  257. };
  258. static struct s3c_audio_pdata s5p_spdif_pdata = {
  259. .cfg_gpio = s5pc100_spdif_cfg_gpd,
  260. };
  261. static u64 s5pc100_spdif_dmamask = DMA_BIT_MASK(32);
  262. struct platform_device s5pc100_device_spdif = {
  263. .name = "samsung-spdif",
  264. .id = -1,
  265. .num_resources = ARRAY_SIZE(s5pc100_spdif_resource),
  266. .resource = s5pc100_spdif_resource,
  267. .dev = {
  268. .platform_data = &s5p_spdif_pdata,
  269. .dma_mask = &s5pc100_spdif_dmamask,
  270. .coherent_dma_mask = DMA_BIT_MASK(32),
  271. },
  272. };
  273. void __init s5pc100_spdif_setup_gpio(int gpio)
  274. {
  275. if (gpio == S5PC100_SPDIF_GPD)
  276. s5p_spdif_pdata.cfg_gpio = s5pc100_spdif_cfg_gpd;
  277. else
  278. s5p_spdif_pdata.cfg_gpio = s5pc100_spdif_cfg_gpg3;
  279. }