sof_board_helpers.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright(c) 2023 Intel Corporation.
  4. */
  5. #ifndef __SOF_INTEL_BOARD_HELPERS_H
  6. #define __SOF_INTEL_BOARD_HELPERS_H
  7. #include <sound/soc.h>
  8. #include <sound/soc-acpi-intel-ssp-common.h>
  9. #include "sof_hdmi_common.h"
  10. /*
  11. * Common board quirks: from bit 8 to 31, LSB 8 bits reserved for machine
  12. * drivers
  13. */
  14. /* SSP port number for headphone codec: 3 bits */
  15. #define SOF_SSP_PORT_CODEC_SHIFT 8
  16. #define SOF_SSP_PORT_CODEC_MASK (GENMASK(10, 8))
  17. #define SOF_SSP_PORT_CODEC(quirk) \
  18. (((quirk) << SOF_SSP_PORT_CODEC_SHIFT) & SOF_SSP_PORT_CODEC_MASK)
  19. /* SSP port number for speaker amplifier: 3 bits */
  20. #define SOF_SSP_PORT_AMP_SHIFT 11
  21. #define SOF_SSP_PORT_AMP_MASK (GENMASK(13, 11))
  22. #define SOF_SSP_PORT_AMP(quirk) \
  23. (((quirk) << SOF_SSP_PORT_AMP_SHIFT) & SOF_SSP_PORT_AMP_MASK)
  24. /* SSP port number for BT audio offload: 3 bits */
  25. #define SOF_SSP_PORT_BT_OFFLOAD_SHIFT 14
  26. #define SOF_SSP_PORT_BT_OFFLOAD_MASK (GENMASK(16, 14))
  27. #define SOF_SSP_PORT_BT_OFFLOAD(quirk) \
  28. (((quirk) << SOF_SSP_PORT_BT_OFFLOAD_SHIFT) & SOF_SSP_PORT_BT_OFFLOAD_MASK)
  29. /* SSP port mask for HDMI capture: 6 bits */
  30. #define SOF_SSP_MASK_HDMI_CAPTURE_SHIFT 17
  31. #define SOF_SSP_MASK_HDMI_CAPTURE_MASK (GENMASK(22, 17))
  32. #define SOF_SSP_MASK_HDMI_CAPTURE(quirk) \
  33. (((quirk) << SOF_SSP_MASK_HDMI_CAPTURE_SHIFT) & SOF_SSP_MASK_HDMI_CAPTURE_MASK)
  34. /* Number of idisp HDMI BE link: 3 bits */
  35. #define SOF_NUM_IDISP_HDMI_SHIFT 23
  36. #define SOF_NUM_IDISP_HDMI_MASK (GENMASK(25, 23))
  37. #define SOF_NUM_IDISP_HDMI(quirk) \
  38. (((quirk) << SOF_NUM_IDISP_HDMI_SHIFT) & SOF_NUM_IDISP_HDMI_MASK)
  39. /* Board uses BT audio offload */
  40. #define SOF_BT_OFFLOAD_PRESENT BIT(26)
  41. enum {
  42. SOF_LINK_NONE = 0,
  43. SOF_LINK_CODEC,
  44. SOF_LINK_DMIC01,
  45. SOF_LINK_DMIC16K,
  46. SOF_LINK_IDISP_HDMI,
  47. SOF_LINK_AMP,
  48. SOF_LINK_BT_OFFLOAD,
  49. SOF_LINK_HDMI_IN,
  50. SOF_LINK_HDA,
  51. };
  52. #define SOF_LINK_ORDER_MASK (0xF)
  53. #define SOF_LINK_ORDER_SHIFT (4)
  54. #define SOF_LINK_ORDER(k1, k2, k3, k4, k5, k6, k7) \
  55. ((((k1) & SOF_LINK_ORDER_MASK) << (SOF_LINK_ORDER_SHIFT * 0)) | \
  56. (((k2) & SOF_LINK_ORDER_MASK) << (SOF_LINK_ORDER_SHIFT * 1)) | \
  57. (((k3) & SOF_LINK_ORDER_MASK) << (SOF_LINK_ORDER_SHIFT * 2)) | \
  58. (((k4) & SOF_LINK_ORDER_MASK) << (SOF_LINK_ORDER_SHIFT * 3)) | \
  59. (((k5) & SOF_LINK_ORDER_MASK) << (SOF_LINK_ORDER_SHIFT * 4)) | \
  60. (((k6) & SOF_LINK_ORDER_MASK) << (SOF_LINK_ORDER_SHIFT * 5)) | \
  61. (((k7) & SOF_LINK_ORDER_MASK) << (SOF_LINK_ORDER_SHIFT * 6)))
  62. #define SOF_LINK_IDS_MASK (0xF)
  63. #define SOF_LINK_IDS_SHIFT (4)
  64. #define SOF_LINK_IDS(k1, k2, k3, k4, k5, k6, k7) \
  65. ((((k1) & SOF_LINK_IDS_MASK) << (SOF_LINK_IDS_SHIFT * 0)) | \
  66. (((k2) & SOF_LINK_IDS_MASK) << (SOF_LINK_IDS_SHIFT * 1)) | \
  67. (((k3) & SOF_LINK_IDS_MASK) << (SOF_LINK_IDS_SHIFT * 2)) | \
  68. (((k4) & SOF_LINK_IDS_MASK) << (SOF_LINK_IDS_SHIFT * 3)) | \
  69. (((k5) & SOF_LINK_IDS_MASK) << (SOF_LINK_IDS_SHIFT * 4)) | \
  70. (((k6) & SOF_LINK_IDS_MASK) << (SOF_LINK_IDS_SHIFT * 5)) | \
  71. (((k7) & SOF_LINK_IDS_MASK) << (SOF_LINK_IDS_SHIFT * 6)))
  72. /*
  73. * sof_da7219_private: private data for da7219 machine driver
  74. *
  75. * @mclk_en: true for mclk pin is connected
  76. * @pll_bypass: true for PLL bypass mode
  77. */
  78. struct sof_da7219_private {
  79. bool mclk_en;
  80. bool pll_bypass;
  81. };
  82. /*
  83. * sof_rt5682_private: private data for rt5682 machine driver
  84. *
  85. * @mclk: mclk clock data
  86. * @is_legacy_cpu: true for BYT/CHT boards
  87. * @mclk_en: true for mclk pin is connected
  88. */
  89. struct sof_rt5682_private {
  90. struct clk *mclk;
  91. bool is_legacy_cpu;
  92. bool mclk_en;
  93. };
  94. /*
  95. * sof_card_private: common data for machine drivers
  96. *
  97. * @headset_jack: headset jack data
  98. * @hdmi: init data for hdmi dai link
  99. * @codec_type: type of headset codec
  100. * @amp_type: type of speaker amplifier
  101. * @dmic_be_num: number of Intel PCH DMIC BE link
  102. * @hdmi_num: number of Intel HDMI BE link
  103. * @ssp_codec: ssp port number of headphone BE link
  104. * @ssp_amp: ssp port number of speaker BE link
  105. * @ssp_bt: ssp port number of BT offload BE link
  106. * @ssp_mask_hdmi_in: ssp port mask of HDMI-IN BE link
  107. * @bt_offload_present: true to create BT offload BE link
  108. * @hda_codec_present: true to create HDA codec BE links
  109. * @codec_link: pointer to headset codec dai link
  110. * @amp_link: pointer to speaker amplifier dai link
  111. * @link_order_overwrite: custom DAI link order
  112. * @link_id_overwrite: custom DAI link ID
  113. * @da7219: private data for da7219 machine driver
  114. * @rt5682: private data for rt5682 machine driver
  115. */
  116. struct sof_card_private {
  117. struct snd_soc_jack headset_jack;
  118. struct sof_hdmi_private hdmi;
  119. enum snd_soc_acpi_intel_codec codec_type;
  120. enum snd_soc_acpi_intel_codec amp_type;
  121. int dmic_be_num;
  122. int hdmi_num;
  123. int ssp_codec;
  124. int ssp_amp;
  125. int ssp_bt;
  126. unsigned long ssp_mask_hdmi_in;
  127. bool bt_offload_present;
  128. bool hda_codec_present;
  129. struct snd_soc_dai_link *codec_link;
  130. struct snd_soc_dai_link *amp_link;
  131. unsigned long link_order_overwrite;
  132. /*
  133. * A variable stores id for all BE DAI links, use SOF_LINK_IDS macro to
  134. * build the value; use DAI link array index as id if zero.
  135. */
  136. unsigned long link_id_overwrite;
  137. union {
  138. struct sof_da7219_private da7219;
  139. struct sof_rt5682_private rt5682;
  140. };
  141. };
  142. int sof_intel_board_card_late_probe(struct snd_soc_card *card);
  143. int sof_intel_board_set_dai_link(struct device *dev, struct snd_soc_card *card,
  144. struct sof_card_private *ctx);
  145. struct sof_card_private *
  146. sof_intel_board_get_ctx(struct device *dev, unsigned long board_quirk);
  147. #endif /* __SOF_INTEL_BOARD_HELPERS_H */