acp-renoir.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
  2. //
  3. // This file is provided under a dual BSD/GPLv2 license. When using or
  4. // redistributing this file, you may do so under either license.
  5. //
  6. // Copyright(c) 2021 Advanced Micro Devices, Inc.
  7. //
  8. // Authors: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>
  9. //
  10. /*
  11. * Hardware interface for Renoir ACP block
  12. */
  13. #include <linux/platform_device.h>
  14. #include <linux/module.h>
  15. #include <linux/err.h>
  16. #include <linux/io.h>
  17. #include <sound/pcm_params.h>
  18. #include <sound/soc.h>
  19. #include <sound/soc-dai.h>
  20. #include <linux/dma-mapping.h>
  21. #include <linux/pm_runtime.h>
  22. #include "amd.h"
  23. #include "acp-mach.h"
  24. #define DRV_NAME "acp_asoc_renoir"
  25. static struct acp_resource rsrc = {
  26. .offset = 20,
  27. .no_of_ctrls = 1,
  28. .irqp_used = 0,
  29. .irq_reg_offset = 0x1800,
  30. .scratch_reg_offset = 0x12800,
  31. .sram_pte_offset = 0x02052800,
  32. };
  33. static struct snd_soc_acpi_codecs amp_rt1019 = {
  34. .num_codecs = 1,
  35. .codecs = {"10EC1019"}
  36. };
  37. static struct snd_soc_acpi_codecs amp_max = {
  38. .num_codecs = 1,
  39. .codecs = {"MX98360A"}
  40. };
  41. static struct snd_soc_acpi_mach snd_soc_acpi_amd_acp_machines[] = {
  42. {
  43. .id = "10EC5682",
  44. .drv_name = "acp3xalc56821019",
  45. .machine_quirk = snd_soc_acpi_codec_list,
  46. .quirk_data = &amp_rt1019,
  47. },
  48. {
  49. .id = "RTL5682",
  50. .drv_name = "acp3xalc5682sm98360",
  51. .machine_quirk = snd_soc_acpi_codec_list,
  52. .quirk_data = &amp_max,
  53. },
  54. {
  55. .id = "RTL5682",
  56. .drv_name = "acp3xalc5682s1019",
  57. .machine_quirk = snd_soc_acpi_codec_list,
  58. .quirk_data = &amp_rt1019,
  59. },
  60. {
  61. .id = "AMDI1019",
  62. .drv_name = "renoir-acp",
  63. },
  64. {
  65. .id = "ESSX8336",
  66. .drv_name = "acp3x-es83xx",
  67. },
  68. {},
  69. };
  70. static struct snd_soc_dai_driver acp_renoir_dai[] = {
  71. {
  72. .name = "acp-i2s-sp",
  73. .id = I2S_SP_INSTANCE,
  74. .playback = {
  75. .stream_name = "I2S SP Playback",
  76. .rates = SNDRV_PCM_RATE_8000_96000,
  77. .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 |
  78. SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,
  79. .channels_min = 2,
  80. .channels_max = 8,
  81. .rate_min = 8000,
  82. .rate_max = 96000,
  83. },
  84. .capture = {
  85. .stream_name = "I2S SP Capture",
  86. .rates = SNDRV_PCM_RATE_8000_48000,
  87. .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 |
  88. SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,
  89. .channels_min = 2,
  90. .channels_max = 2,
  91. .rate_min = 8000,
  92. .rate_max = 48000,
  93. },
  94. .ops = &asoc_acp_cpu_dai_ops,
  95. },
  96. {
  97. .name = "acp-i2s-bt",
  98. .id = I2S_BT_INSTANCE,
  99. .playback = {
  100. .stream_name = "I2S BT Playback",
  101. .rates = SNDRV_PCM_RATE_8000_96000,
  102. .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 |
  103. SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,
  104. .channels_min = 2,
  105. .channels_max = 8,
  106. .rate_min = 8000,
  107. .rate_max = 96000,
  108. },
  109. .capture = {
  110. .stream_name = "I2S BT Capture",
  111. .rates = SNDRV_PCM_RATE_8000_48000,
  112. .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 |
  113. SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,
  114. .channels_min = 2,
  115. .channels_max = 2,
  116. .rate_min = 8000,
  117. .rate_max = 48000,
  118. },
  119. .ops = &asoc_acp_cpu_dai_ops,
  120. },
  121. {
  122. .name = "acp-pdm-dmic",
  123. .id = DMIC_INSTANCE,
  124. .capture = {
  125. .rates = SNDRV_PCM_RATE_8000_48000,
  126. .formats = SNDRV_PCM_FMTBIT_S32_LE,
  127. .channels_min = 2,
  128. .channels_max = 2,
  129. .rate_min = 8000,
  130. .rate_max = 48000,
  131. },
  132. .ops = &acp_dmic_dai_ops,
  133. },
  134. };
  135. static int renoir_audio_probe(struct platform_device *pdev)
  136. {
  137. struct device *dev = &pdev->dev;
  138. struct acp_chip_info *chip;
  139. struct acp_dev_data *adata;
  140. struct resource *res;
  141. int ret;
  142. chip = dev_get_platdata(&pdev->dev);
  143. if (!chip || !chip->base) {
  144. dev_err(&pdev->dev, "ACP chip data is NULL\n");
  145. return -ENODEV;
  146. }
  147. if (chip->acp_rev != ACP3X_DEV) {
  148. dev_err(&pdev->dev, "Un-supported ACP Revision %d\n", chip->acp_rev);
  149. return -ENODEV;
  150. }
  151. adata = devm_kzalloc(dev, sizeof(struct acp_dev_data), GFP_KERNEL);
  152. if (!adata)
  153. return -ENOMEM;
  154. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "acp_mem");
  155. if (!res) {
  156. dev_err(&pdev->dev, "IORESOURCE_MEM FAILED\n");
  157. return -ENODEV;
  158. }
  159. adata->acp_base = devm_ioremap(&pdev->dev, res->start, resource_size(res));
  160. if (!adata->acp_base)
  161. return -ENOMEM;
  162. ret = platform_get_irq_byname(pdev, "acp_dai_irq");
  163. if (ret < 0)
  164. return ret;
  165. adata->i2s_irq = ret;
  166. adata->dev = dev;
  167. adata->dai_driver = acp_renoir_dai;
  168. adata->num_dai = ARRAY_SIZE(acp_renoir_dai);
  169. adata->rsrc = &rsrc;
  170. adata->platform = RENOIR;
  171. adata->flag = chip->flag;
  172. adata->machines = snd_soc_acpi_amd_acp_machines;
  173. acp_machine_select(adata);
  174. dev_set_drvdata(dev, adata);
  175. acp_enable_interrupts(adata);
  176. acp_platform_register(dev);
  177. pm_runtime_set_autosuspend_delay(&pdev->dev, ACP_SUSPEND_DELAY_MS);
  178. pm_runtime_use_autosuspend(&pdev->dev);
  179. pm_runtime_mark_last_busy(&pdev->dev);
  180. pm_runtime_set_active(&pdev->dev);
  181. pm_runtime_enable(&pdev->dev);
  182. return 0;
  183. }
  184. static void renoir_audio_remove(struct platform_device *pdev)
  185. {
  186. struct device *dev = &pdev->dev;
  187. struct acp_dev_data *adata = dev_get_drvdata(dev);
  188. acp_disable_interrupts(adata);
  189. acp_platform_unregister(dev);
  190. }
  191. static int __maybe_unused rn_pcm_resume(struct device *dev)
  192. {
  193. struct acp_dev_data *adata = dev_get_drvdata(dev);
  194. struct acp_stream *stream;
  195. struct snd_pcm_substream *substream;
  196. snd_pcm_uframes_t buf_in_frames;
  197. u64 buf_size;
  198. spin_lock(&adata->acp_lock);
  199. list_for_each_entry(stream, &adata->stream_list, list) {
  200. substream = stream->substream;
  201. if (substream && substream->runtime) {
  202. buf_in_frames = (substream->runtime->buffer_size);
  203. buf_size = frames_to_bytes(substream->runtime, buf_in_frames);
  204. config_pte_for_stream(adata, stream);
  205. config_acp_dma(adata, stream, buf_size);
  206. if (stream->dai_id)
  207. restore_acp_i2s_params(substream, adata, stream);
  208. else
  209. restore_acp_pdm_params(substream, adata);
  210. }
  211. }
  212. spin_unlock(&adata->acp_lock);
  213. return 0;
  214. }
  215. static const struct dev_pm_ops rn_dma_pm_ops = {
  216. SET_SYSTEM_SLEEP_PM_OPS(NULL, rn_pcm_resume)
  217. };
  218. static struct platform_driver renoir_driver = {
  219. .probe = renoir_audio_probe,
  220. .remove = renoir_audio_remove,
  221. .driver = {
  222. .name = "acp_asoc_renoir",
  223. .pm = &rn_dma_pm_ops,
  224. },
  225. };
  226. module_platform_driver(renoir_driver);
  227. MODULE_DESCRIPTION("AMD ACP Renoir Driver");
  228. MODULE_IMPORT_NS(SND_SOC_ACP_COMMON);
  229. MODULE_LICENSE("Dual BSD/GPL");
  230. MODULE_ALIAS("platform:" DRV_NAME);