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