dev-audio.c 6.4 KB

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