1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun * Copyright (c) 2020 Intel Corporation 3*4882a593Smuzhiyun */ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* 6*4882a593Smuzhiyun * sof_sdw_common.h - prototypes for common helpers 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef SND_SOC_SOF_SDW_COMMON_H 10*4882a593Smuzhiyun #define SND_SOC_SOF_SDW_COMMON_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/bits.h> 13*4882a593Smuzhiyun #include <linux/types.h> 14*4882a593Smuzhiyun #include <sound/soc.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define MAX_NO_PROPS 2 17*4882a593Smuzhiyun #define MAX_HDMI_NUM 4 18*4882a593Smuzhiyun #define SDW_DMIC_DAI_ID 4 19*4882a593Smuzhiyun #define SDW_MAX_CPU_DAIS 16 20*4882a593Smuzhiyun #define SDW_INTEL_BIDIR_PDI_BASE 2 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* 8 combinations with 4 links + unused group 0 */ 23*4882a593Smuzhiyun #define SDW_MAX_GROUPS 9 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun enum { 26*4882a593Smuzhiyun SOF_RT711_JD_SRC_JD1 = 1, 27*4882a593Smuzhiyun SOF_RT711_JD_SRC_JD2 = 2, 28*4882a593Smuzhiyun }; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun enum { 31*4882a593Smuzhiyun SOF_PRE_TGL_HDMI_COUNT = 3, 32*4882a593Smuzhiyun SOF_TGL_HDMI_COUNT = 4, 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun enum { 36*4882a593Smuzhiyun SOF_I2S_SSP0 = BIT(0), 37*4882a593Smuzhiyun SOF_I2S_SSP1 = BIT(1), 38*4882a593Smuzhiyun SOF_I2S_SSP2 = BIT(2), 39*4882a593Smuzhiyun SOF_I2S_SSP3 = BIT(3), 40*4882a593Smuzhiyun SOF_I2S_SSP4 = BIT(4), 41*4882a593Smuzhiyun SOF_I2S_SSP5 = BIT(5), 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define SOF_RT711_JDSRC(quirk) ((quirk) & GENMASK(1, 0)) 45*4882a593Smuzhiyun #define SOF_SDW_FOUR_SPK BIT(2) 46*4882a593Smuzhiyun #define SOF_SDW_TGL_HDMI BIT(3) 47*4882a593Smuzhiyun #define SOF_SDW_PCH_DMIC BIT(4) 48*4882a593Smuzhiyun #define SOF_SSP_PORT(x) (((x) & GENMASK(5, 0)) << 5) 49*4882a593Smuzhiyun #define SOF_SSP_GET_PORT(quirk) (((quirk) >> 5) & GENMASK(5, 0)) 50*4882a593Smuzhiyun #define SOF_RT715_DAI_ID_FIX BIT(11) 51*4882a593Smuzhiyun #define SOF_SDW_NO_AGGREGATION BIT(12) 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun struct sof_sdw_codec_info { 54*4882a593Smuzhiyun const int part_id; 55*4882a593Smuzhiyun const int version_id; 56*4882a593Smuzhiyun int amp_num; 57*4882a593Smuzhiyun const u8 acpi_id[ACPI_ID_LEN]; 58*4882a593Smuzhiyun const bool direction[2]; // playback & capture support 59*4882a593Smuzhiyun const bool ignore_pch_dmic; 60*4882a593Smuzhiyun const char *dai_name; 61*4882a593Smuzhiyun const struct snd_soc_ops *ops; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun int (*init)(const struct snd_soc_acpi_link_adr *link, 64*4882a593Smuzhiyun struct snd_soc_dai_link *dai_links, 65*4882a593Smuzhiyun struct sof_sdw_codec_info *info, 66*4882a593Smuzhiyun bool playback); 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun int (*exit)(struct device *dev, struct snd_soc_dai_link *dai_link); 69*4882a593Smuzhiyun bool late_probe; 70*4882a593Smuzhiyun int (*codec_card_late_probe)(struct snd_soc_card *card); 71*4882a593Smuzhiyun }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun struct mc_private { 74*4882a593Smuzhiyun struct list_head hdmi_pcm_list; 75*4882a593Smuzhiyun bool common_hdmi_codec_drv; 76*4882a593Smuzhiyun bool idisp_codec; 77*4882a593Smuzhiyun struct snd_soc_jack sdw_headset; 78*4882a593Smuzhiyun }; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun extern unsigned long sof_sdw_quirk; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun int sdw_startup(struct snd_pcm_substream *substream); 83*4882a593Smuzhiyun int sdw_prepare(struct snd_pcm_substream *substream); 84*4882a593Smuzhiyun int sdw_trigger(struct snd_pcm_substream *substream, int cmd); 85*4882a593Smuzhiyun int sdw_hw_free(struct snd_pcm_substream *substream); 86*4882a593Smuzhiyun void sdw_shutdown(struct snd_pcm_substream *substream); 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* generic HDMI support */ 89*4882a593Smuzhiyun int sof_sdw_hdmi_init(struct snd_soc_pcm_runtime *rtd); 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun int sof_sdw_hdmi_card_late_probe(struct snd_soc_card *card); 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /* DMIC support */ 94*4882a593Smuzhiyun int sof_sdw_dmic_init(struct snd_soc_pcm_runtime *rtd); 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /* RT711 support */ 97*4882a593Smuzhiyun int sof_sdw_rt711_init(const struct snd_soc_acpi_link_adr *link, 98*4882a593Smuzhiyun struct snd_soc_dai_link *dai_links, 99*4882a593Smuzhiyun struct sof_sdw_codec_info *info, 100*4882a593Smuzhiyun bool playback); 101*4882a593Smuzhiyun int sof_sdw_rt711_exit(struct device *dev, struct snd_soc_dai_link *dai_link); 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun /* RT711-SDCA support */ 104*4882a593Smuzhiyun int sof_sdw_rt711_sdca_init(const struct snd_soc_acpi_link_adr *link, 105*4882a593Smuzhiyun struct snd_soc_dai_link *dai_links, 106*4882a593Smuzhiyun struct sof_sdw_codec_info *info, 107*4882a593Smuzhiyun bool playback); 108*4882a593Smuzhiyun int sof_sdw_rt711_sdca_exit(struct device *dev, struct snd_soc_dai_link *dai_link); 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* RT700 support */ 111*4882a593Smuzhiyun int sof_sdw_rt700_init(const struct snd_soc_acpi_link_adr *link, 112*4882a593Smuzhiyun struct snd_soc_dai_link *dai_links, 113*4882a593Smuzhiyun struct sof_sdw_codec_info *info, 114*4882a593Smuzhiyun bool playback); 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun /* RT1308 support */ 117*4882a593Smuzhiyun extern struct snd_soc_ops sof_sdw_rt1308_i2s_ops; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun int sof_sdw_rt1308_init(const struct snd_soc_acpi_link_adr *link, 120*4882a593Smuzhiyun struct snd_soc_dai_link *dai_links, 121*4882a593Smuzhiyun struct sof_sdw_codec_info *info, 122*4882a593Smuzhiyun bool playback); 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun /* RT1316 support */ 125*4882a593Smuzhiyun int sof_sdw_rt1316_init(const struct snd_soc_acpi_link_adr *link, 126*4882a593Smuzhiyun struct snd_soc_dai_link *dai_links, 127*4882a593Smuzhiyun struct sof_sdw_codec_info *info, 128*4882a593Smuzhiyun bool playback); 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun /* RT715 support */ 131*4882a593Smuzhiyun int sof_sdw_rt715_init(const struct snd_soc_acpi_link_adr *link, 132*4882a593Smuzhiyun struct snd_soc_dai_link *dai_links, 133*4882a593Smuzhiyun struct sof_sdw_codec_info *info, 134*4882a593Smuzhiyun bool playback); 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun /* RT715-SDCA support */ 137*4882a593Smuzhiyun int sof_sdw_rt715_sdca_init(const struct snd_soc_acpi_link_adr *link, 138*4882a593Smuzhiyun struct snd_soc_dai_link *dai_links, 139*4882a593Smuzhiyun struct sof_sdw_codec_info *info, 140*4882a593Smuzhiyun bool playback); 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun /* MAX98373 support */ 143*4882a593Smuzhiyun int sof_sdw_mx8373_init(const struct snd_soc_acpi_link_adr *link, 144*4882a593Smuzhiyun struct snd_soc_dai_link *dai_links, 145*4882a593Smuzhiyun struct sof_sdw_codec_info *info, 146*4882a593Smuzhiyun bool playback); 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun int sof_sdw_mx8373_late_probe(struct snd_soc_card *card); 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun /* RT5682 support */ 151*4882a593Smuzhiyun int sof_sdw_rt5682_init(const struct snd_soc_acpi_link_adr *link, 152*4882a593Smuzhiyun struct snd_soc_dai_link *dai_links, 153*4882a593Smuzhiyun struct sof_sdw_codec_info *info, 154*4882a593Smuzhiyun bool playback); 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun #endif 157