162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci *  Copyright (c) 2020 Intel Corporation
362306a36Sopenharmony_ci */
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci/*
662306a36Sopenharmony_ci *  sof_sdw_common.h - prototypes for common helpers
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef SND_SOC_SOF_SDW_COMMON_H
1062306a36Sopenharmony_ci#define SND_SOC_SOF_SDW_COMMON_H
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/bits.h>
1362306a36Sopenharmony_ci#include <linux/types.h>
1462306a36Sopenharmony_ci#include <sound/soc.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define MAX_NO_PROPS 2
1762306a36Sopenharmony_ci#define MAX_HDMI_NUM 4
1862306a36Sopenharmony_ci#define SDW_UNUSED_DAI_ID -1
1962306a36Sopenharmony_ci#define SDW_JACK_OUT_DAI_ID 0
2062306a36Sopenharmony_ci#define SDW_JACK_IN_DAI_ID 1
2162306a36Sopenharmony_ci#define SDW_AMP_OUT_DAI_ID 2
2262306a36Sopenharmony_ci#define SDW_AMP_IN_DAI_ID 3
2362306a36Sopenharmony_ci#define SDW_DMIC_DAI_ID 4
2462306a36Sopenharmony_ci#define SDW_MAX_CPU_DAIS 16
2562306a36Sopenharmony_ci#define SDW_INTEL_BIDIR_PDI_BASE 2
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci/* 8 combinations with 4 links + unused group 0 */
2862306a36Sopenharmony_ci#define SDW_MAX_GROUPS 9
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cienum {
3162306a36Sopenharmony_ci	SOF_PRE_TGL_HDMI_COUNT = 3,
3262306a36Sopenharmony_ci	SOF_TGL_HDMI_COUNT = 4,
3362306a36Sopenharmony_ci};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cienum {
3662306a36Sopenharmony_ci	SOF_I2S_SSP0 = BIT(0),
3762306a36Sopenharmony_ci	SOF_I2S_SSP1 = BIT(1),
3862306a36Sopenharmony_ci	SOF_I2S_SSP2 = BIT(2),
3962306a36Sopenharmony_ci	SOF_I2S_SSP3 = BIT(3),
4062306a36Sopenharmony_ci	SOF_I2S_SSP4 = BIT(4),
4162306a36Sopenharmony_ci	SOF_I2S_SSP5 = BIT(5),
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#define SOF_JACK_JDSRC(quirk)		((quirk) & GENMASK(3, 0))
4562306a36Sopenharmony_ci#define SOF_SDW_FOUR_SPK		BIT(4)
4662306a36Sopenharmony_ci#define SOF_SDW_TGL_HDMI		BIT(5)
4762306a36Sopenharmony_ci#define SOF_SDW_PCH_DMIC		BIT(6)
4862306a36Sopenharmony_ci#define SOF_SSP_PORT(x)		(((x) & GENMASK(5, 0)) << 7)
4962306a36Sopenharmony_ci#define SOF_SSP_GET_PORT(quirk)	(((quirk) >> 7) & GENMASK(5, 0))
5062306a36Sopenharmony_ci#define SOF_SDW_NO_AGGREGATION		BIT(14)
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci/* BT audio offload: reserve 3 bits for future */
5362306a36Sopenharmony_ci#define SOF_BT_OFFLOAD_SSP_SHIFT	15
5462306a36Sopenharmony_ci#define SOF_BT_OFFLOAD_SSP_MASK	(GENMASK(17, 15))
5562306a36Sopenharmony_ci#define SOF_BT_OFFLOAD_SSP(quirk)	\
5662306a36Sopenharmony_ci	(((quirk) << SOF_BT_OFFLOAD_SSP_SHIFT) & SOF_BT_OFFLOAD_SSP_MASK)
5762306a36Sopenharmony_ci#define SOF_SSP_BT_OFFLOAD_PRESENT	BIT(18)
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define SOF_SDW_DAI_TYPE_JACK		0
6062306a36Sopenharmony_ci#define SOF_SDW_DAI_TYPE_AMP		1
6162306a36Sopenharmony_ci#define SOF_SDW_DAI_TYPE_MIC		2
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci#define SOF_SDW_MAX_DAI_NUM		3
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistruct sof_sdw_codec_info;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistruct sof_sdw_dai_info {
6862306a36Sopenharmony_ci	const bool direction[2]; /* playback & capture support */
6962306a36Sopenharmony_ci	const char *dai_name;
7062306a36Sopenharmony_ci	const int dai_type;
7162306a36Sopenharmony_ci	const int dailink[2]; /* dailink id for each direction */
7262306a36Sopenharmony_ci	int  (*init)(struct snd_soc_card *card,
7362306a36Sopenharmony_ci		     const struct snd_soc_acpi_link_adr *link,
7462306a36Sopenharmony_ci		     struct snd_soc_dai_link *dai_links,
7562306a36Sopenharmony_ci		     struct sof_sdw_codec_info *info,
7662306a36Sopenharmony_ci		     bool playback);
7762306a36Sopenharmony_ci	int (*exit)(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cistruct sof_sdw_codec_info {
8162306a36Sopenharmony_ci	const int part_id;
8262306a36Sopenharmony_ci	const int version_id;
8362306a36Sopenharmony_ci	const char *codec_name;
8462306a36Sopenharmony_ci	int amp_num;
8562306a36Sopenharmony_ci	const u8 acpi_id[ACPI_ID_LEN];
8662306a36Sopenharmony_ci	const bool ignore_pch_dmic;
8762306a36Sopenharmony_ci	const struct snd_soc_ops *ops;
8862306a36Sopenharmony_ci	struct sof_sdw_dai_info dais[SOF_SDW_MAX_DAI_NUM];
8962306a36Sopenharmony_ci	const int dai_num;
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	int (*codec_card_late_probe)(struct snd_soc_card *card);
9262306a36Sopenharmony_ci};
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistruct mc_private {
9562306a36Sopenharmony_ci	struct list_head hdmi_pcm_list;
9662306a36Sopenharmony_ci	bool idisp_codec;
9762306a36Sopenharmony_ci	struct snd_soc_jack sdw_headset;
9862306a36Sopenharmony_ci	struct device *headset_codec_dev; /* only one headset per card */
9962306a36Sopenharmony_ci	struct device *amp_dev1, *amp_dev2;
10062306a36Sopenharmony_ci};
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ciextern unsigned long sof_sdw_quirk;
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ciint sdw_startup(struct snd_pcm_substream *substream);
10562306a36Sopenharmony_ciint sdw_prepare(struct snd_pcm_substream *substream);
10662306a36Sopenharmony_ciint sdw_trigger(struct snd_pcm_substream *substream, int cmd);
10762306a36Sopenharmony_ciint sdw_hw_params(struct snd_pcm_substream *substream,
10862306a36Sopenharmony_ci		  struct snd_pcm_hw_params *params);
10962306a36Sopenharmony_ciint sdw_hw_free(struct snd_pcm_substream *substream);
11062306a36Sopenharmony_civoid sdw_shutdown(struct snd_pcm_substream *substream);
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci/* generic HDMI support */
11362306a36Sopenharmony_ciint sof_sdw_hdmi_init(struct snd_soc_pcm_runtime *rtd);
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ciint sof_sdw_hdmi_card_late_probe(struct snd_soc_card *card);
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci/* DMIC support */
11862306a36Sopenharmony_ciint sof_sdw_dmic_init(struct snd_soc_pcm_runtime *rtd);
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci/* RT711 support */
12162306a36Sopenharmony_ciint sof_sdw_rt711_init(struct snd_soc_card *card,
12262306a36Sopenharmony_ci		       const struct snd_soc_acpi_link_adr *link,
12362306a36Sopenharmony_ci		       struct snd_soc_dai_link *dai_links,
12462306a36Sopenharmony_ci		       struct sof_sdw_codec_info *info,
12562306a36Sopenharmony_ci		       bool playback);
12662306a36Sopenharmony_ciint sof_sdw_rt711_exit(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci/* RT711-SDCA support */
12962306a36Sopenharmony_ciint sof_sdw_rt_sdca_jack_init(struct snd_soc_card *card,
13062306a36Sopenharmony_ci			      const struct snd_soc_acpi_link_adr *link,
13162306a36Sopenharmony_ci			      struct snd_soc_dai_link *dai_links,
13262306a36Sopenharmony_ci			      struct sof_sdw_codec_info *info,
13362306a36Sopenharmony_ci			      bool playback);
13462306a36Sopenharmony_ciint sof_sdw_rt_sdca_jack_exit(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci/* RT712-SDCA support */
13762306a36Sopenharmony_ciint sof_sdw_rt712_sdca_init(struct snd_soc_card *card,
13862306a36Sopenharmony_ci			    const struct snd_soc_acpi_link_adr *link,
13962306a36Sopenharmony_ci			    struct snd_soc_dai_link *dai_links,
14062306a36Sopenharmony_ci			    struct sof_sdw_codec_info *info,
14162306a36Sopenharmony_ci			    bool playback);
14262306a36Sopenharmony_ciint sof_sdw_rt712_sdca_exit(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
14362306a36Sopenharmony_ciint sof_sdw_rt712_spk_init(struct snd_soc_card *card,
14462306a36Sopenharmony_ci			   const struct snd_soc_acpi_link_adr *link,
14562306a36Sopenharmony_ci			   struct snd_soc_dai_link *dai_links,
14662306a36Sopenharmony_ci			   struct sof_sdw_codec_info *info,
14762306a36Sopenharmony_ci			   bool playback);
14862306a36Sopenharmony_ciint sof_sdw_rt712_sdca_dmic_init(struct snd_soc_card *card,
14962306a36Sopenharmony_ci				 const struct snd_soc_acpi_link_adr *link,
15062306a36Sopenharmony_ci				 struct snd_soc_dai_link *dai_links,
15162306a36Sopenharmony_ci				 struct sof_sdw_codec_info *info,
15262306a36Sopenharmony_ci				 bool playback);
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci/* RT700 support */
15562306a36Sopenharmony_ciint sof_sdw_rt700_init(struct snd_soc_card *card,
15662306a36Sopenharmony_ci		       const struct snd_soc_acpi_link_adr *link,
15762306a36Sopenharmony_ci		       struct snd_soc_dai_link *dai_links,
15862306a36Sopenharmony_ci		       struct sof_sdw_codec_info *info,
15962306a36Sopenharmony_ci		       bool playback);
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci/* RT1308 I2S support */
16262306a36Sopenharmony_ciextern struct snd_soc_ops sof_sdw_rt1308_i2s_ops;
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci/* generic amp support */
16562306a36Sopenharmony_ciint sof_sdw_rt_amp_init(struct snd_soc_card *card,
16662306a36Sopenharmony_ci			const struct snd_soc_acpi_link_adr *link,
16762306a36Sopenharmony_ci			struct snd_soc_dai_link *dai_links,
16862306a36Sopenharmony_ci			struct sof_sdw_codec_info *info,
16962306a36Sopenharmony_ci			bool playback);
17062306a36Sopenharmony_ciint sof_sdw_rt_amp_exit(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci/* RT1316 support */
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci/* RT715 support */
17562306a36Sopenharmony_ciint sof_sdw_rt715_init(struct snd_soc_card *card,
17662306a36Sopenharmony_ci		       const struct snd_soc_acpi_link_adr *link,
17762306a36Sopenharmony_ci		       struct snd_soc_dai_link *dai_links,
17862306a36Sopenharmony_ci		       struct sof_sdw_codec_info *info,
17962306a36Sopenharmony_ci		       bool playback);
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci/* RT715-SDCA support */
18262306a36Sopenharmony_ciint sof_sdw_rt715_sdca_init(struct snd_soc_card *card,
18362306a36Sopenharmony_ci			    const struct snd_soc_acpi_link_adr *link,
18462306a36Sopenharmony_ci			    struct snd_soc_dai_link *dai_links,
18562306a36Sopenharmony_ci			    struct sof_sdw_codec_info *info,
18662306a36Sopenharmony_ci			    bool playback);
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci/* MAXIM codec support */
18962306a36Sopenharmony_ciint sof_sdw_maxim_init(struct snd_soc_card *card,
19062306a36Sopenharmony_ci		       const struct snd_soc_acpi_link_adr *link,
19162306a36Sopenharmony_ci		       struct snd_soc_dai_link *dai_links,
19262306a36Sopenharmony_ci		       struct sof_sdw_codec_info *info,
19362306a36Sopenharmony_ci		       bool playback);
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci/* RT5682 support */
19662306a36Sopenharmony_ciint sof_sdw_rt5682_init(struct snd_soc_card *card,
19762306a36Sopenharmony_ci			const struct snd_soc_acpi_link_adr *link,
19862306a36Sopenharmony_ci			struct snd_soc_dai_link *dai_links,
19962306a36Sopenharmony_ci			struct sof_sdw_codec_info *info,
20062306a36Sopenharmony_ci			bool playback);
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci/* CS42L42 support */
20362306a36Sopenharmony_ciint sof_sdw_cs42l42_init(struct snd_soc_card *card,
20462306a36Sopenharmony_ci			 const struct snd_soc_acpi_link_adr *link,
20562306a36Sopenharmony_ci			 struct snd_soc_dai_link *dai_links,
20662306a36Sopenharmony_ci			 struct sof_sdw_codec_info *info,
20762306a36Sopenharmony_ci			 bool playback);
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci/* CS AMP support */
21062306a36Sopenharmony_ciint sof_sdw_cs_amp_init(struct snd_soc_card *card,
21162306a36Sopenharmony_ci			const struct snd_soc_acpi_link_adr *link,
21262306a36Sopenharmony_ci			struct snd_soc_dai_link *dai_links,
21362306a36Sopenharmony_ci			struct sof_sdw_codec_info *info,
21462306a36Sopenharmony_ci			bool playback);
21562306a36Sopenharmony_ci#endif
216