soc_sdw_utils.h 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * This file incorporates work covered by the following copyright notice:
  4. * Copyright (c) 2020 Intel Corporation
  5. * Copyright(c) 2024 Advanced Micro Devices, Inc.
  6. *
  7. */
  8. #ifndef SOC_SDW_UTILS_H
  9. #define SOC_SDW_UTILS_H
  10. #include <sound/soc.h>
  11. #include <sound/soc-acpi.h>
  12. #define SOC_SDW_MAX_DAI_NUM 8
  13. #define SOC_SDW_MAX_NO_PROPS 2
  14. #define SOC_SDW_JACK_JDSRC(quirk) ((quirk) & GENMASK(3, 0))
  15. /* If a CODEC has an optional speaker output, this quirk will enable it */
  16. #define SOC_SDW_CODEC_SPKR BIT(15)
  17. /*
  18. * If the CODEC has additional devices attached directly to it.
  19. *
  20. * For the cs42l43:
  21. * - 0 - No speaker output
  22. * - SOC_SDW_CODEC_SPKR - CODEC internal speaker
  23. * - SOC_SDW_SIDECAR_AMPS - 2x Sidecar amplifiers + CODEC internal speaker
  24. * - SOC_SDW_CODEC_SPKR | SOF_SIDECAR_AMPS - Not currently supported
  25. */
  26. #define SOC_SDW_SIDECAR_AMPS BIT(16)
  27. #define SOC_SDW_CODEC_MIC BIT(17)
  28. #define SOC_SDW_UNUSED_DAI_ID -1
  29. #define SOC_SDW_JACK_OUT_DAI_ID 0
  30. #define SOC_SDW_JACK_IN_DAI_ID 1
  31. #define SOC_SDW_AMP_OUT_DAI_ID 2
  32. #define SOC_SDW_AMP_IN_DAI_ID 3
  33. #define SOC_SDW_DMIC_DAI_ID 4
  34. #define SOC_SDW_DAI_TYPE_JACK 0
  35. #define SOC_SDW_DAI_TYPE_AMP 1
  36. #define SOC_SDW_DAI_TYPE_MIC 2
  37. struct asoc_sdw_codec_info;
  38. struct asoc_sdw_dai_info {
  39. const bool direction[2]; /* playback & capture support */
  40. const char *dai_name;
  41. const int dai_type;
  42. const int dailink[2]; /* dailink id for each direction */
  43. const struct snd_kcontrol_new *controls;
  44. const int num_controls;
  45. const struct snd_soc_dapm_widget *widgets;
  46. const int num_widgets;
  47. int (*init)(struct snd_soc_card *card,
  48. struct snd_soc_dai_link *dai_links,
  49. struct asoc_sdw_codec_info *info,
  50. bool playback);
  51. int (*exit)(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
  52. int (*rtd_init)(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai);
  53. bool rtd_init_done; /* Indicate that the rtd_init callback is done */
  54. unsigned long quirk;
  55. bool quirk_exclude;
  56. };
  57. struct asoc_sdw_codec_info {
  58. const int part_id;
  59. const int version_id;
  60. const char *codec_name;
  61. int amp_num;
  62. const u8 acpi_id[ACPI_ID_LEN];
  63. const bool ignore_internal_dmic;
  64. const struct snd_soc_ops *ops;
  65. struct asoc_sdw_dai_info dais[SOC_SDW_MAX_DAI_NUM];
  66. const int dai_num;
  67. int (*codec_card_late_probe)(struct snd_soc_card *card);
  68. int (*count_sidecar)(struct snd_soc_card *card,
  69. int *num_dais, int *num_devs);
  70. int (*add_sidecar)(struct snd_soc_card *card,
  71. struct snd_soc_dai_link **dai_links,
  72. struct snd_soc_codec_conf **codec_conf);
  73. };
  74. struct asoc_sdw_mc_private {
  75. struct snd_soc_card card;
  76. struct snd_soc_jack sdw_headset;
  77. struct device *headset_codec_dev; /* only one headset per card */
  78. struct device *amp_dev1, *amp_dev2;
  79. bool append_dai_type;
  80. bool ignore_internal_dmic;
  81. void *private;
  82. unsigned long mc_quirk;
  83. int codec_info_list_count;
  84. };
  85. struct asoc_sdw_endpoint {
  86. struct list_head list;
  87. u32 link_mask;
  88. const char *codec_name;
  89. const char *name_prefix;
  90. bool include_sidecar;
  91. struct asoc_sdw_codec_info *codec_info;
  92. const struct asoc_sdw_dai_info *dai_info;
  93. };
  94. struct asoc_sdw_dailink {
  95. bool initialised;
  96. u8 group_id;
  97. u32 link_mask[SNDRV_PCM_STREAM_LAST + 1];
  98. int num_devs[SNDRV_PCM_STREAM_LAST + 1];
  99. struct list_head endpoints;
  100. };
  101. extern struct asoc_sdw_codec_info codec_info_list[];
  102. int asoc_sdw_get_codec_info_list_count(void);
  103. int asoc_sdw_startup(struct snd_pcm_substream *substream);
  104. int asoc_sdw_prepare(struct snd_pcm_substream *substream);
  105. int asoc_sdw_prepare(struct snd_pcm_substream *substream);
  106. int asoc_sdw_trigger(struct snd_pcm_substream *substream, int cmd);
  107. int asoc_sdw_hw_params(struct snd_pcm_substream *substream,
  108. struct snd_pcm_hw_params *params);
  109. int asoc_sdw_hw_free(struct snd_pcm_substream *substream);
  110. void asoc_sdw_shutdown(struct snd_pcm_substream *substream);
  111. const char *asoc_sdw_get_codec_name(struct device *dev,
  112. const struct asoc_sdw_codec_info *codec_info,
  113. const struct snd_soc_acpi_link_adr *adr_link,
  114. int adr_index);
  115. struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_part(const u64 adr);
  116. struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_acpi(const u8 *acpi_id);
  117. struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_dai(const char *dai_name,
  118. int *dai_index);
  119. struct snd_soc_dai_link *asoc_sdw_mc_find_codec_dai_used(struct snd_soc_card *card,
  120. const char *dai_name);
  121. void asoc_sdw_mc_dailink_exit_loop(struct snd_soc_card *card);
  122. int asoc_sdw_card_late_probe(struct snd_soc_card *card);
  123. void asoc_sdw_init_dai_link(struct device *dev, struct snd_soc_dai_link *dai_links,
  124. int *be_id, char *name, int playback, int capture,
  125. struct snd_soc_dai_link_component *cpus, int cpus_num,
  126. struct snd_soc_dai_link_component *platform_component,
  127. int num_platforms, struct snd_soc_dai_link_component *codecs,
  128. int codecs_num, int (*init)(struct snd_soc_pcm_runtime *rtd),
  129. const struct snd_soc_ops *ops);
  130. int asoc_sdw_init_simple_dai_link(struct device *dev, struct snd_soc_dai_link *dai_links,
  131. int *be_id, char *name, int playback, int capture,
  132. const char *cpu_dai_name, const char *platform_comp_name,
  133. int num_platforms, const char *codec_name,
  134. const char *codec_dai_name,
  135. int (*init)(struct snd_soc_pcm_runtime *rtd),
  136. const struct snd_soc_ops *ops);
  137. int asoc_sdw_count_sdw_endpoints(struct snd_soc_card *card, int *num_devs, int *num_ends);
  138. struct asoc_sdw_dailink *asoc_sdw_find_dailink(struct asoc_sdw_dailink *dailinks,
  139. const struct snd_soc_acpi_endpoint *new);
  140. int asoc_sdw_parse_sdw_endpoints(struct snd_soc_card *card,
  141. struct asoc_sdw_dailink *soc_dais,
  142. struct asoc_sdw_endpoint *soc_ends,
  143. int *num_devs);
  144. int asoc_sdw_rtd_init(struct snd_soc_pcm_runtime *rtd);
  145. /* DMIC support */
  146. int asoc_sdw_dmic_init(struct snd_soc_pcm_runtime *rtd);
  147. /* RT711 support */
  148. int asoc_sdw_rt711_init(struct snd_soc_card *card,
  149. struct snd_soc_dai_link *dai_links,
  150. struct asoc_sdw_codec_info *info,
  151. bool playback);
  152. int asoc_sdw_rt711_exit(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
  153. /* RT711-SDCA support */
  154. int asoc_sdw_rt_sdca_jack_init(struct snd_soc_card *card,
  155. struct snd_soc_dai_link *dai_links,
  156. struct asoc_sdw_codec_info *info,
  157. bool playback);
  158. int asoc_sdw_rt_sdca_jack_exit(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
  159. /* RT1308 I2S support */
  160. extern const struct snd_soc_ops soc_sdw_rt1308_i2s_ops;
  161. /* generic amp support */
  162. int asoc_sdw_rt_amp_init(struct snd_soc_card *card,
  163. struct snd_soc_dai_link *dai_links,
  164. struct asoc_sdw_codec_info *info,
  165. bool playback);
  166. int asoc_sdw_rt_amp_exit(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
  167. /* CS42L43 support */
  168. int asoc_sdw_cs42l43_spk_init(struct snd_soc_card *card,
  169. struct snd_soc_dai_link *dai_links,
  170. struct asoc_sdw_codec_info *info,
  171. bool playback);
  172. /* CS AMP support */
  173. int asoc_sdw_bridge_cs35l56_count_sidecar(struct snd_soc_card *card,
  174. int *num_dais, int *num_devs);
  175. int asoc_sdw_bridge_cs35l56_add_sidecar(struct snd_soc_card *card,
  176. struct snd_soc_dai_link **dai_links,
  177. struct snd_soc_codec_conf **codec_conf);
  178. int asoc_sdw_bridge_cs35l56_spk_init(struct snd_soc_card *card,
  179. struct snd_soc_dai_link *dai_links,
  180. struct asoc_sdw_codec_info *info,
  181. bool playback);
  182. int asoc_sdw_cs_amp_init(struct snd_soc_card *card,
  183. struct snd_soc_dai_link *dai_links,
  184. struct asoc_sdw_codec_info *info,
  185. bool playback);
  186. /* MAXIM codec support */
  187. int asoc_sdw_maxim_init(struct snd_soc_card *card,
  188. struct snd_soc_dai_link *dai_links,
  189. struct asoc_sdw_codec_info *info,
  190. bool playback);
  191. /* dai_link init callbacks */
  192. int asoc_sdw_rt_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai);
  193. int asoc_sdw_rt_sdca_jack_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai);
  194. int asoc_sdw_rt_amp_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai);
  195. int asoc_sdw_rt700_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai);
  196. int asoc_sdw_rt711_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai);
  197. int asoc_sdw_rt712_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai);
  198. int asoc_sdw_rt722_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai);
  199. int asoc_sdw_rt5682_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai);
  200. int asoc_sdw_cs42l42_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai);
  201. int asoc_sdw_cs42l43_hs_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai);
  202. int asoc_sdw_cs42l43_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai);
  203. int asoc_sdw_cs42l43_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai);
  204. int asoc_sdw_cs_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai);
  205. int asoc_sdw_maxim_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai);
  206. #endif