1e149ca29SPierre-Louis Bossart /* SPDX-License-Identifier: GPL-2.0-only
252db12d1SPierre-Louis Bossart  *  Copyright (c) 2020 Intel Corporation
352db12d1SPierre-Louis Bossart  */
452db12d1SPierre-Louis Bossart 
552db12d1SPierre-Louis Bossart /*
652db12d1SPierre-Louis Bossart  *  sof_sdw_common.h - prototypes for common helpers
752db12d1SPierre-Louis Bossart  */
852db12d1SPierre-Louis Bossart 
952db12d1SPierre-Louis Bossart #ifndef SND_SOC_SOF_SDW_COMMON_H
1052db12d1SPierre-Louis Bossart #define SND_SOC_SOF_SDW_COMMON_H
1152db12d1SPierre-Louis Bossart 
1252db12d1SPierre-Louis Bossart #include <linux/bits.h>
1352db12d1SPierre-Louis Bossart #include <linux/types.h>
14be3afa12Sranderwang #include <sound/soc.h>
1552db12d1SPierre-Louis Bossart 
1652db12d1SPierre-Louis Bossart #define MAX_NO_PROPS 2
1752db12d1SPierre-Louis Bossart #define MAX_HDMI_NUM 4
18b2745865SBard Liao #define SDW_UNUSED_DAI_ID -1
19b2745865SBard Liao #define SDW_JACK_OUT_DAI_ID 0
20b2745865SBard Liao #define SDW_JACK_IN_DAI_ID 1
21b2745865SBard Liao #define SDW_AMP_OUT_DAI_ID 2
22b2745865SBard Liao #define SDW_AMP_IN_DAI_ID 3
2352db12d1SPierre-Louis Bossart #define SDW_DMIC_DAI_ID 4
2452db12d1SPierre-Louis Bossart #define SDW_MAX_CPU_DAIS 16
2552db12d1SPierre-Louis Bossart #define SDW_INTEL_BIDIR_PDI_BASE 2
2652db12d1SPierre-Louis Bossart 
2752db12d1SPierre-Louis Bossart /* 8 combinations with 4 links + unused group 0 */
2852db12d1SPierre-Louis Bossart #define SDW_MAX_GROUPS 9
2952db12d1SPierre-Louis Bossart 
3052db12d1SPierre-Louis Bossart enum {
3152db12d1SPierre-Louis Bossart 	SOF_PRE_TGL_HDMI_COUNT = 3,
3252db12d1SPierre-Louis Bossart 	SOF_TGL_HDMI_COUNT = 4,
3352db12d1SPierre-Louis Bossart };
3452db12d1SPierre-Louis Bossart 
3552db12d1SPierre-Louis Bossart enum {
3652db12d1SPierre-Louis Bossart 	SOF_I2S_SSP0 = BIT(0),
3752db12d1SPierre-Louis Bossart 	SOF_I2S_SSP1 = BIT(1),
3852db12d1SPierre-Louis Bossart 	SOF_I2S_SSP2 = BIT(2),
3952db12d1SPierre-Louis Bossart 	SOF_I2S_SSP3 = BIT(3),
4052db12d1SPierre-Louis Bossart 	SOF_I2S_SSP4 = BIT(4),
4152db12d1SPierre-Louis Bossart 	SOF_I2S_SSP5 = BIT(5),
4252db12d1SPierre-Louis Bossart };
4352db12d1SPierre-Louis Bossart 
44752d4de4SBard Liao #define SOF_JACK_JDSRC(quirk)		((quirk) & GENMASK(3, 0))
45368fa526SBard Liao #define SOF_SDW_FOUR_SPK		BIT(4)
46368fa526SBard Liao #define SOF_SDW_TGL_HDMI		BIT(5)
47368fa526SBard Liao #define SOF_SDW_PCH_DMIC		BIT(6)
48368fa526SBard Liao #define SOF_SSP_PORT(x)		(((x) & GENMASK(5, 0)) << 7)
49368fa526SBard Liao #define SOF_SSP_GET_PORT(quirk)	(((quirk) >> 7) & GENMASK(5, 0))
50368fa526SBard Liao #define SOF_SDW_NO_AGGREGATION		BIT(14)
5152db12d1SPierre-Louis Bossart 
5219f1eaceSYong Zhi /* BT audio offload: reserve 3 bits for future */
53368fa526SBard Liao #define SOF_BT_OFFLOAD_SSP_SHIFT	15
54368fa526SBard Liao #define SOF_BT_OFFLOAD_SSP_MASK	(GENMASK(17, 15))
5519f1eaceSYong Zhi #define SOF_BT_OFFLOAD_SSP(quirk)	\
5619f1eaceSYong Zhi 	(((quirk) << SOF_BT_OFFLOAD_SSP_SHIFT) & SOF_BT_OFFLOAD_SSP_MASK)
57368fa526SBard Liao #define SOF_SSP_BT_OFFLOAD_PRESENT	BIT(18)
5819f1eaceSYong Zhi 
5907140abbSBard Liao #define SOF_SDW_DAI_TYPE_JACK		0
6007140abbSBard Liao #define SOF_SDW_DAI_TYPE_AMP		1
6107140abbSBard Liao #define SOF_SDW_DAI_TYPE_MIC		2
6207140abbSBard Liao 
6307140abbSBard Liao #define SOF_SDW_MAX_DAI_NUM		3
6407140abbSBard Liao 
6507140abbSBard Liao struct sof_sdw_codec_info;
6607140abbSBard Liao 
6707140abbSBard Liao struct sof_sdw_dai_info {
6807140abbSBard Liao 	const bool direction[2]; /* playback & capture support */
6907140abbSBard Liao 	const char *dai_name;
7007140abbSBard Liao 	const int dai_type;
71b2745865SBard Liao 	const int dailink[2]; /* dailink id for each direction */
7207140abbSBard Liao 	int  (*init)(struct snd_soc_card *card,
7307140abbSBard Liao 		     const struct snd_soc_acpi_link_adr *link,
7407140abbSBard Liao 		     struct snd_soc_dai_link *dai_links,
7507140abbSBard Liao 		     struct sof_sdw_codec_info *info,
7607140abbSBard Liao 		     bool playback);
7707140abbSBard Liao 	int (*exit)(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
7807140abbSBard Liao };
7907140abbSBard Liao 
8052db12d1SPierre-Louis Bossart struct sof_sdw_codec_info {
81535df653SBard Liao 	const int part_id;
822e2d287bSBard Liao 	const int version_id;
8300958200SCharles Keepax 	const char *codec_name;
8452db12d1SPierre-Louis Bossart 	int amp_num;
8552db12d1SPierre-Louis Bossart 	const u8 acpi_id[ACPI_ID_LEN];
8635564e2bSPierre-Louis Bossart 	const bool ignore_pch_dmic;
8752db12d1SPierre-Louis Bossart 	const struct snd_soc_ops *ops;
8807140abbSBard Liao 	struct sof_sdw_dai_info dais[SOF_SDW_MAX_DAI_NUM];
8907140abbSBard Liao 	const int dai_num;
9052db12d1SPierre-Louis Bossart 
91be3afa12Sranderwang 	int (*codec_card_late_probe)(struct snd_soc_card *card);
9252db12d1SPierre-Louis Bossart };
9352db12d1SPierre-Louis Bossart 
9452db12d1SPierre-Louis Bossart struct mc_private {
9552db12d1SPierre-Louis Bossart 	struct list_head hdmi_pcm_list;
9615ef2ea0SKai Vehmanen 	bool idisp_codec;
9752db12d1SPierre-Louis Bossart 	struct snd_soc_jack sdw_headset;
98cdf99c9aSPierre-Louis Bossart 	struct device *headset_codec_dev; /* only one headset per card */
991b435e40SShuming Fan 	struct device *amp_dev1, *amp_dev2;
10052db12d1SPierre-Louis Bossart };
10152db12d1SPierre-Louis Bossart 
10252db12d1SPierre-Louis Bossart extern unsigned long sof_sdw_quirk;
10352db12d1SPierre-Louis Bossart 
104be82e888SNaveen Manohar int sdw_startup(struct snd_pcm_substream *substream);
1057cc3b56fSRander Wang int sdw_prepare(struct snd_pcm_substream *substream);
1067cc3b56fSRander Wang int sdw_trigger(struct snd_pcm_substream *substream, int cmd);
1070281b02eSBard Liao int sdw_hw_params(struct snd_pcm_substream *substream,
1080281b02eSBard Liao 		  struct snd_pcm_hw_params *params);
1097cc3b56fSRander Wang int sdw_hw_free(struct snd_pcm_substream *substream);
110be82e888SNaveen Manohar void sdw_shutdown(struct snd_pcm_substream *substream);
111be82e888SNaveen Manohar 
11252db12d1SPierre-Louis Bossart /* generic HDMI support */
11352db12d1SPierre-Louis Bossart int sof_sdw_hdmi_init(struct snd_soc_pcm_runtime *rtd);
11452db12d1SPierre-Louis Bossart 
11552db12d1SPierre-Louis Bossart int sof_sdw_hdmi_card_late_probe(struct snd_soc_card *card);
11652db12d1SPierre-Louis Bossart 
11752db12d1SPierre-Louis Bossart /* DMIC support */
11852db12d1SPierre-Louis Bossart int sof_sdw_dmic_init(struct snd_soc_pcm_runtime *rtd);
11952db12d1SPierre-Louis Bossart 
12052db12d1SPierre-Louis Bossart /* RT711 support */
121cdf99c9aSPierre-Louis Bossart int sof_sdw_rt711_init(struct snd_soc_card *card,
122cdf99c9aSPierre-Louis Bossart 		       const struct snd_soc_acpi_link_adr *link,
12352db12d1SPierre-Louis Bossart 		       struct snd_soc_dai_link *dai_links,
12452db12d1SPierre-Louis Bossart 		       struct sof_sdw_codec_info *info,
12552db12d1SPierre-Louis Bossart 		       bool playback);
126cdf99c9aSPierre-Louis Bossart int sof_sdw_rt711_exit(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
12752db12d1SPierre-Louis Bossart 
128b75bea4bSBard Liao /* RT711-SDCA support */
12943f8012cSBard Liao int sof_sdw_rt_sdca_jack_init(struct snd_soc_card *card,
130cdf99c9aSPierre-Louis Bossart 			      const struct snd_soc_acpi_link_adr *link,
131b75bea4bSBard Liao 			      struct snd_soc_dai_link *dai_links,
132b75bea4bSBard Liao 			      struct sof_sdw_codec_info *info,
133b75bea4bSBard Liao 			      bool playback);
13443f8012cSBard Liao int sof_sdw_rt_sdca_jack_exit(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
135b75bea4bSBard Liao 
1365360c670SBard Liao /* RT712-SDCA support */
1375360c670SBard Liao int sof_sdw_rt712_sdca_init(struct snd_soc_card *card,
1385360c670SBard Liao 			    const struct snd_soc_acpi_link_adr *link,
1395360c670SBard Liao 			    struct snd_soc_dai_link *dai_links,
1405360c670SBard Liao 			    struct sof_sdw_codec_info *info,
1415360c670SBard Liao 			    bool playback);
1425360c670SBard Liao int sof_sdw_rt712_sdca_exit(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
1435360c670SBard Liao int sof_sdw_rt712_spk_init(struct snd_soc_card *card,
1445360c670SBard Liao 			   const struct snd_soc_acpi_link_adr *link,
1455360c670SBard Liao 			   struct snd_soc_dai_link *dai_links,
1465360c670SBard Liao 			   struct sof_sdw_codec_info *info,
1475360c670SBard Liao 			   bool playback);
1485360c670SBard Liao int sof_sdw_rt712_sdca_dmic_init(struct snd_soc_card *card,
1495360c670SBard Liao 				 const struct snd_soc_acpi_link_adr *link,
1505360c670SBard Liao 				 struct snd_soc_dai_link *dai_links,
1515360c670SBard Liao 				 struct sof_sdw_codec_info *info,
1525360c670SBard Liao 				 bool playback);
1535360c670SBard Liao 
15452db12d1SPierre-Louis Bossart /* RT700 support */
155cdf99c9aSPierre-Louis Bossart int sof_sdw_rt700_init(struct snd_soc_card *card,
156cdf99c9aSPierre-Louis Bossart 		       const struct snd_soc_acpi_link_adr *link,
15752db12d1SPierre-Louis Bossart 		       struct snd_soc_dai_link *dai_links,
15852db12d1SPierre-Louis Bossart 		       struct sof_sdw_codec_info *info,
15952db12d1SPierre-Louis Bossart 		       bool playback);
16052db12d1SPierre-Louis Bossart 
1615c10da43SGongjun Song /* RT1308 I2S support */
16252db12d1SPierre-Louis Bossart extern struct snd_soc_ops sof_sdw_rt1308_i2s_ops;
16352db12d1SPierre-Louis Bossart 
1645c10da43SGongjun Song /* generic amp support */
1655c10da43SGongjun Song int sof_sdw_rt_amp_init(struct snd_soc_card *card,
166cdf99c9aSPierre-Louis Bossart 			const struct snd_soc_acpi_link_adr *link,
16752db12d1SPierre-Louis Bossart 			struct snd_soc_dai_link *dai_links,
16852db12d1SPierre-Louis Bossart 			struct sof_sdw_codec_info *info,
16952db12d1SPierre-Louis Bossart 			bool playback);
1705c10da43SGongjun Song int sof_sdw_rt_amp_exit(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
17152db12d1SPierre-Louis Bossart 
172b75bea4bSBard Liao /* RT1316 support */
1738c4b3a8eSGongjun Song 
17452db12d1SPierre-Louis Bossart /* RT715 support */
175cdf99c9aSPierre-Louis Bossart int sof_sdw_rt715_init(struct snd_soc_card *card,
176cdf99c9aSPierre-Louis Bossart 		       const struct snd_soc_acpi_link_adr *link,
17752db12d1SPierre-Louis Bossart 		       struct snd_soc_dai_link *dai_links,
17852db12d1SPierre-Louis Bossart 		       struct sof_sdw_codec_info *info,
17952db12d1SPierre-Louis Bossart 		       bool playback);
18052db12d1SPierre-Louis Bossart 
181b75bea4bSBard Liao /* RT715-SDCA support */
182cdf99c9aSPierre-Louis Bossart int sof_sdw_rt715_sdca_init(struct snd_soc_card *card,
183cdf99c9aSPierre-Louis Bossart 			    const struct snd_soc_acpi_link_adr *link,
184b75bea4bSBard Liao 			    struct snd_soc_dai_link *dai_links,
185b75bea4bSBard Liao 			    struct sof_sdw_codec_info *info,
186b75bea4bSBard Liao 			    bool playback);
187b75bea4bSBard Liao 
188fcb3f0fbSUday M Bhat /* MAXIM codec support */
189fcb3f0fbSUday M Bhat int sof_sdw_maxim_init(struct snd_soc_card *card,
190cdf99c9aSPierre-Louis Bossart 		       const struct snd_soc_acpi_link_adr *link,
191be82e888SNaveen Manohar 		       struct snd_soc_dai_link *dai_links,
192be82e888SNaveen Manohar 		       struct sof_sdw_codec_info *info,
193be82e888SNaveen Manohar 		       bool playback);
194be82e888SNaveen Manohar 
195798313f2SNaveen Manohar /* RT5682 support */
196cdf99c9aSPierre-Louis Bossart int sof_sdw_rt5682_init(struct snd_soc_card *card,
197cdf99c9aSPierre-Louis Bossart 			const struct snd_soc_acpi_link_adr *link,
198798313f2SNaveen Manohar 			struct snd_soc_dai_link *dai_links,
199798313f2SNaveen Manohar 			struct sof_sdw_codec_info *info,
200798313f2SNaveen Manohar 			bool playback);
201798313f2SNaveen Manohar 
20243cdea08SUday M Bhat /* CS42L42 support */
20343cdea08SUday M Bhat int sof_sdw_cs42l42_init(struct snd_soc_card *card,
20443cdea08SUday M Bhat 			 const struct snd_soc_acpi_link_adr *link,
20543cdea08SUday M Bhat 			 struct snd_soc_dai_link *dai_links,
20643cdea08SUday M Bhat 			 struct sof_sdw_codec_info *info,
20743cdea08SUday M Bhat 			 bool playback);
20843cdea08SUday M Bhat 
209*4754e29cSChao Song /* CS AMP support */
210*4754e29cSChao Song int sof_sdw_cs_amp_init(struct snd_soc_card *card,
211*4754e29cSChao Song 			const struct snd_soc_acpi_link_adr *link,
212*4754e29cSChao Song 			struct snd_soc_dai_link *dai_links,
213*4754e29cSChao Song 			struct sof_sdw_codec_info *info,
214*4754e29cSChao Song 			bool playback);
21552db12d1SPierre-Louis Bossart #endif
216