mt8192-afe-control.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // MediaTek ALSA SoC Audio Control
  4. //
  5. // Copyright (c) 2020 MediaTek Inc.
  6. // Author: Shane Chien <[email protected]>
  7. //
  8. #include <linux/pm_runtime.h>
  9. #include "mt8192-afe-common.h"
  10. enum {
  11. MTK_AFE_RATE_8K = 0,
  12. MTK_AFE_RATE_11K = 1,
  13. MTK_AFE_RATE_12K = 2,
  14. MTK_AFE_RATE_384K = 3,
  15. MTK_AFE_RATE_16K = 4,
  16. MTK_AFE_RATE_22K = 5,
  17. MTK_AFE_RATE_24K = 6,
  18. MTK_AFE_RATE_352K = 7,
  19. MTK_AFE_RATE_32K = 8,
  20. MTK_AFE_RATE_44K = 9,
  21. MTK_AFE_RATE_48K = 10,
  22. MTK_AFE_RATE_88K = 11,
  23. MTK_AFE_RATE_96K = 12,
  24. MTK_AFE_RATE_176K = 13,
  25. MTK_AFE_RATE_192K = 14,
  26. MTK_AFE_RATE_260K = 15,
  27. };
  28. enum {
  29. MTK_AFE_DAI_MEMIF_RATE_8K = 0,
  30. MTK_AFE_DAI_MEMIF_RATE_16K = 1,
  31. MTK_AFE_DAI_MEMIF_RATE_32K = 2,
  32. MTK_AFE_DAI_MEMIF_RATE_48K = 3,
  33. };
  34. enum {
  35. MTK_AFE_PCM_RATE_8K = 0,
  36. MTK_AFE_PCM_RATE_16K = 1,
  37. MTK_AFE_PCM_RATE_32K = 2,
  38. MTK_AFE_PCM_RATE_48K = 3,
  39. };
  40. unsigned int mt8192_general_rate_transform(struct device *dev,
  41. unsigned int rate)
  42. {
  43. switch (rate) {
  44. case 8000:
  45. return MTK_AFE_RATE_8K;
  46. case 11025:
  47. return MTK_AFE_RATE_11K;
  48. case 12000:
  49. return MTK_AFE_RATE_12K;
  50. case 16000:
  51. return MTK_AFE_RATE_16K;
  52. case 22050:
  53. return MTK_AFE_RATE_22K;
  54. case 24000:
  55. return MTK_AFE_RATE_24K;
  56. case 32000:
  57. return MTK_AFE_RATE_32K;
  58. case 44100:
  59. return MTK_AFE_RATE_44K;
  60. case 48000:
  61. return MTK_AFE_RATE_48K;
  62. case 88200:
  63. return MTK_AFE_RATE_88K;
  64. case 96000:
  65. return MTK_AFE_RATE_96K;
  66. case 176400:
  67. return MTK_AFE_RATE_176K;
  68. case 192000:
  69. return MTK_AFE_RATE_192K;
  70. case 260000:
  71. return MTK_AFE_RATE_260K;
  72. case 352800:
  73. return MTK_AFE_RATE_352K;
  74. case 384000:
  75. return MTK_AFE_RATE_384K;
  76. default:
  77. dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n",
  78. __func__,
  79. rate, MTK_AFE_RATE_48K);
  80. return MTK_AFE_RATE_48K;
  81. }
  82. }
  83. static unsigned int dai_memif_rate_transform(struct device *dev,
  84. unsigned int rate)
  85. {
  86. switch (rate) {
  87. case 8000:
  88. return MTK_AFE_DAI_MEMIF_RATE_8K;
  89. case 16000:
  90. return MTK_AFE_DAI_MEMIF_RATE_16K;
  91. case 32000:
  92. return MTK_AFE_DAI_MEMIF_RATE_32K;
  93. case 48000:
  94. return MTK_AFE_DAI_MEMIF_RATE_48K;
  95. default:
  96. dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n",
  97. __func__,
  98. rate, MTK_AFE_DAI_MEMIF_RATE_16K);
  99. return MTK_AFE_DAI_MEMIF_RATE_16K;
  100. }
  101. }
  102. static unsigned int pcm_rate_transform(struct device *dev,
  103. unsigned int rate)
  104. {
  105. switch (rate) {
  106. case 8000:
  107. return MTK_AFE_PCM_RATE_8K;
  108. case 16000:
  109. return MTK_AFE_PCM_RATE_16K;
  110. case 32000:
  111. return MTK_AFE_PCM_RATE_32K;
  112. case 48000:
  113. return MTK_AFE_PCM_RATE_48K;
  114. default:
  115. dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n",
  116. __func__,
  117. rate, MTK_AFE_PCM_RATE_32K);
  118. return MTK_AFE_PCM_RATE_32K;
  119. }
  120. }
  121. unsigned int mt8192_rate_transform(struct device *dev,
  122. unsigned int rate, int aud_blk)
  123. {
  124. switch (aud_blk) {
  125. case MT8192_MEMIF_DAI:
  126. case MT8192_MEMIF_MOD_DAI:
  127. return dai_memif_rate_transform(dev, rate);
  128. case MT8192_DAI_PCM_1:
  129. case MT8192_DAI_PCM_2:
  130. return pcm_rate_transform(dev, rate);
  131. default:
  132. return mt8192_general_rate_transform(dev, rate);
  133. }
  134. }
  135. int mt8192_dai_set_priv(struct mtk_base_afe *afe, int id,
  136. int priv_size, const void *priv_data)
  137. {
  138. struct mt8192_afe_private *afe_priv = afe->platform_priv;
  139. void *temp_data;
  140. temp_data = devm_kzalloc(afe->dev,
  141. priv_size,
  142. GFP_KERNEL);
  143. if (!temp_data)
  144. return -ENOMEM;
  145. if (priv_data)
  146. memcpy(temp_data, priv_data, priv_size);
  147. afe_priv->dai_priv[id] = temp_data;
  148. return 0;
  149. }