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