Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v6.16-rc3 251 lines 9.2 kB view raw
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * This file incorporates work covered by the following copyright notice: 4 * Copyright (c) 2020 Intel Corporation 5 * Copyright(c) 2024 Advanced Micro Devices, Inc. 6 * 7 */ 8 9#ifndef SOC_SDW_UTILS_H 10#define SOC_SDW_UTILS_H 11 12#include <sound/soc.h> 13#include <sound/soc-acpi.h> 14 15#define SOC_SDW_MAX_DAI_NUM 8 16#define SOC_SDW_MAX_NO_PROPS 2 17#define SOC_SDW_JACK_JDSRC(quirk) ((quirk) & GENMASK(3, 0)) 18 19/* If a CODEC has an optional speaker output, this quirk will enable it */ 20#define SOC_SDW_CODEC_SPKR BIT(15) 21/* 22 * If the CODEC has additional devices attached directly to it. 23 * 24 * For the cs42l43: 25 * - 0 - No speaker output 26 * - SOC_SDW_CODEC_SPKR - CODEC internal speaker 27 * - SOC_SDW_SIDECAR_AMPS - 2x Sidecar amplifiers + CODEC internal speaker 28 * - SOC_SDW_CODEC_SPKR | SOF_SIDECAR_AMPS - Not currently supported 29 */ 30#define SOC_SDW_SIDECAR_AMPS BIT(16) 31#define SOC_SDW_CODEC_MIC BIT(17) 32 33#define SOC_SDW_UNUSED_DAI_ID -1 34#define SOC_SDW_JACK_OUT_DAI_ID 0 35#define SOC_SDW_JACK_IN_DAI_ID 1 36#define SOC_SDW_AMP_OUT_DAI_ID 2 37#define SOC_SDW_AMP_IN_DAI_ID 3 38#define SOC_SDW_DMIC_DAI_ID 4 39 40#define SOC_SDW_DAI_TYPE_JACK 0 41#define SOC_SDW_DAI_TYPE_AMP 1 42#define SOC_SDW_DAI_TYPE_MIC 2 43 44struct asoc_sdw_codec_info; 45 46struct asoc_sdw_dai_info { 47 const bool direction[2]; /* playback & capture support */ 48 const char *dai_name; 49 const int dai_type; 50 const int dailink[2]; /* dailink id for each direction */ 51 const struct snd_kcontrol_new *controls; 52 const int num_controls; 53 const struct snd_soc_dapm_widget *widgets; 54 const int num_widgets; 55 int (*init)(struct snd_soc_card *card, 56 struct snd_soc_dai_link *dai_links, 57 struct asoc_sdw_codec_info *info, 58 bool playback); 59 int (*exit)(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link); 60 int (*rtd_init)(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai); 61 bool rtd_init_done; /* Indicate that the rtd_init callback is done */ 62 unsigned long quirk; 63 bool quirk_exclude; 64}; 65 66struct asoc_sdw_codec_info { 67 const int part_id; 68 const int version_id; 69 const char *codec_name; 70 int amp_num; 71 const u8 acpi_id[ACPI_ID_LEN]; 72 const bool ignore_internal_dmic; 73 const struct snd_soc_ops *ops; 74 struct asoc_sdw_dai_info dais[SOC_SDW_MAX_DAI_NUM]; 75 const int dai_num; 76 77 int (*codec_card_late_probe)(struct snd_soc_card *card); 78 79 int (*count_sidecar)(struct snd_soc_card *card, 80 int *num_dais, int *num_devs); 81 int (*add_sidecar)(struct snd_soc_card *card, 82 struct snd_soc_dai_link **dai_links, 83 struct snd_soc_codec_conf **codec_conf); 84}; 85 86struct asoc_sdw_mc_private { 87 struct snd_soc_card card; 88 struct snd_soc_jack sdw_headset; 89 struct device *headset_codec_dev; /* only one headset per card */ 90 struct device *amp_dev1, *amp_dev2; 91 bool append_dai_type; 92 bool ignore_internal_dmic; 93 void *private; 94 unsigned long mc_quirk; 95 int codec_info_list_count; 96}; 97 98struct asoc_sdw_endpoint { 99 struct list_head list; 100 101 u32 link_mask; 102 const char *codec_name; 103 const char *name_prefix; 104 bool include_sidecar; 105 106 struct asoc_sdw_codec_info *codec_info; 107 const struct asoc_sdw_dai_info *dai_info; 108}; 109 110struct asoc_sdw_dailink { 111 bool initialised; 112 113 u8 group_id; 114 u32 link_mask[SNDRV_PCM_STREAM_LAST + 1]; 115 int num_devs[SNDRV_PCM_STREAM_LAST + 1]; 116 struct list_head endpoints; 117}; 118 119extern struct asoc_sdw_codec_info codec_info_list[]; 120int asoc_sdw_get_codec_info_list_count(void); 121 122int asoc_sdw_startup(struct snd_pcm_substream *substream); 123int asoc_sdw_prepare(struct snd_pcm_substream *substream); 124int asoc_sdw_prepare(struct snd_pcm_substream *substream); 125int asoc_sdw_trigger(struct snd_pcm_substream *substream, int cmd); 126int asoc_sdw_hw_params(struct snd_pcm_substream *substream, 127 struct snd_pcm_hw_params *params); 128int asoc_sdw_hw_free(struct snd_pcm_substream *substream); 129void asoc_sdw_shutdown(struct snd_pcm_substream *substream); 130 131const char *asoc_sdw_get_codec_name(struct device *dev, 132 const struct asoc_sdw_codec_info *codec_info, 133 const struct snd_soc_acpi_link_adr *adr_link, 134 int adr_index); 135 136struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_part(const u64 adr); 137 138struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_acpi(const u8 *acpi_id); 139 140struct asoc_sdw_codec_info *asoc_sdw_find_codec_info_dai(const char *dai_name, 141 int *dai_index); 142 143struct snd_soc_dai_link *asoc_sdw_mc_find_codec_dai_used(struct snd_soc_card *card, 144 const char *dai_name); 145 146void asoc_sdw_mc_dailink_exit_loop(struct snd_soc_card *card); 147 148int asoc_sdw_card_late_probe(struct snd_soc_card *card); 149 150void asoc_sdw_init_dai_link(struct device *dev, struct snd_soc_dai_link *dai_links, 151 int *be_id, char *name, int playback, int capture, 152 struct snd_soc_dai_link_component *cpus, int cpus_num, 153 struct snd_soc_dai_link_component *platform_component, 154 int num_platforms, struct snd_soc_dai_link_component *codecs, 155 int codecs_num, int no_pcm, 156 int (*init)(struct snd_soc_pcm_runtime *rtd), 157 const struct snd_soc_ops *ops); 158 159int asoc_sdw_init_simple_dai_link(struct device *dev, struct snd_soc_dai_link *dai_links, 160 int *be_id, char *name, int playback, int capture, 161 const char *cpu_dai_name, const char *platform_comp_name, 162 const char *codec_name, const char *codec_dai_name, 163 int no_pcm, int (*init)(struct snd_soc_pcm_runtime *rtd), 164 const struct snd_soc_ops *ops); 165 166int asoc_sdw_count_sdw_endpoints(struct snd_soc_card *card, int *num_devs, int *num_ends); 167 168struct asoc_sdw_dailink *asoc_sdw_find_dailink(struct asoc_sdw_dailink *dailinks, 169 const struct snd_soc_acpi_endpoint *new); 170 171int asoc_sdw_parse_sdw_endpoints(struct snd_soc_card *card, 172 struct asoc_sdw_dailink *soc_dais, 173 struct asoc_sdw_endpoint *soc_ends, 174 int *num_devs); 175 176int asoc_sdw_rtd_init(struct snd_soc_pcm_runtime *rtd); 177 178/* DMIC support */ 179int asoc_sdw_dmic_init(struct snd_soc_pcm_runtime *rtd); 180 181/* RT711 support */ 182int asoc_sdw_rt711_init(struct snd_soc_card *card, 183 struct snd_soc_dai_link *dai_links, 184 struct asoc_sdw_codec_info *info, 185 bool playback); 186int asoc_sdw_rt711_exit(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link); 187 188/* RT711-SDCA support */ 189int asoc_sdw_rt_sdca_jack_init(struct snd_soc_card *card, 190 struct snd_soc_dai_link *dai_links, 191 struct asoc_sdw_codec_info *info, 192 bool playback); 193int asoc_sdw_rt_sdca_jack_exit(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link); 194 195/* RT1308 I2S support */ 196extern const struct snd_soc_ops soc_sdw_rt1308_i2s_ops; 197 198/* generic amp support */ 199int asoc_sdw_rt_amp_init(struct snd_soc_card *card, 200 struct snd_soc_dai_link *dai_links, 201 struct asoc_sdw_codec_info *info, 202 bool playback); 203int asoc_sdw_rt_amp_exit(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link); 204 205/* CS42L43 support */ 206int asoc_sdw_cs42l43_spk_init(struct snd_soc_card *card, 207 struct snd_soc_dai_link *dai_links, 208 struct asoc_sdw_codec_info *info, 209 bool playback); 210 211/* CS AMP support */ 212int asoc_sdw_bridge_cs35l56_count_sidecar(struct snd_soc_card *card, 213 int *num_dais, int *num_devs); 214int asoc_sdw_bridge_cs35l56_add_sidecar(struct snd_soc_card *card, 215 struct snd_soc_dai_link **dai_links, 216 struct snd_soc_codec_conf **codec_conf); 217int asoc_sdw_bridge_cs35l56_spk_init(struct snd_soc_card *card, 218 struct snd_soc_dai_link *dai_links, 219 struct asoc_sdw_codec_info *info, 220 bool playback); 221 222int asoc_sdw_cs_amp_init(struct snd_soc_card *card, 223 struct snd_soc_dai_link *dai_links, 224 struct asoc_sdw_codec_info *info, 225 bool playback); 226int asoc_sdw_cs_spk_feedback_rtd_init(struct snd_soc_pcm_runtime *rtd, 227 struct snd_soc_dai *dai); 228int asoc_sdw_cs35l56_volume_limit(struct snd_soc_card *card, const char *name_prefix); 229 230/* MAXIM codec support */ 231int asoc_sdw_maxim_init(struct snd_soc_card *card, 232 struct snd_soc_dai_link *dai_links, 233 struct asoc_sdw_codec_info *info, 234 bool playback); 235 236/* dai_link init callbacks */ 237int asoc_sdw_rt_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai); 238int asoc_sdw_rt_sdca_jack_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai); 239int asoc_sdw_rt_amp_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai); 240int asoc_sdw_rt700_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai); 241int asoc_sdw_rt711_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai); 242int asoc_sdw_rt_mf_sdca_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai); 243int asoc_sdw_rt5682_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai); 244int asoc_sdw_cs42l42_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai); 245int asoc_sdw_cs42l43_hs_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai); 246int asoc_sdw_cs42l43_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai); 247int asoc_sdw_cs42l43_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai); 248int asoc_sdw_cs_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai); 249int asoc_sdw_maxim_spk_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai); 250 251#endif