1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * HD-audio HDMI codec driver 4 */ 5 6 #ifndef __HDA_HDMI_LOCAL_H 7 #define __HDA_HDMI_LOCAL_H 8 9 #include <sound/core.h> 10 #include <sound/jack.h> 11 #include <sound/hdaudio.h> 12 #include <sound/hda_i915.h> 13 #include <sound/hda_chmap.h> 14 #include <sound/hda_codec.h> 15 #include "hda_local.h" 16 17 struct hdmi_spec_per_cvt { 18 hda_nid_t cvt_nid; 19 bool assigned; /* the stream has been assigned */ 20 bool silent_stream; /* silent stream activated */ 21 unsigned int channels_min; 22 unsigned int channels_max; 23 u32 rates; 24 u64 formats; 25 unsigned int maxbps; 26 }; 27 28 /* max. connections to a widget */ 29 #define HDA_MAX_CONNECTIONS 32 30 31 struct hdmi_spec_per_pin { 32 hda_nid_t pin_nid; 33 int dev_id; 34 /* pin idx, different device entries on the same pin use the same idx */ 35 int pin_nid_idx; 36 int num_mux_nids; 37 hda_nid_t mux_nids[HDA_MAX_CONNECTIONS]; 38 int mux_idx; 39 hda_nid_t cvt_nid; 40 41 struct hda_codec *codec; 42 struct hdmi_eld sink_eld; 43 struct mutex lock; 44 struct delayed_work work; 45 struct hdmi_pcm *pcm; /* pointer to spec->pcm_rec[n] dynamically*/ 46 int pcm_idx; /* which pcm is attached. -1 means no pcm is attached */ 47 int prev_pcm_idx; /* previously assigned pcm index */ 48 int repoll_count; 49 bool setup; /* the stream has been set up by prepare callback */ 50 bool silent_stream; 51 int channels; /* current number of channels */ 52 bool non_pcm; 53 bool chmap_set; /* channel-map override by ALSA API? */ 54 unsigned char chmap[8]; /* ALSA API channel-map */ 55 #ifdef CONFIG_SND_PROC_FS 56 struct snd_info_entry *proc_entry; 57 #endif 58 }; 59 60 /* operations used by generic code that can be overridden by codec drivers */ 61 struct hdmi_ops { 62 int (*pin_get_eld)(struct hda_codec *codec, hda_nid_t pin_nid, 63 int dev_id, unsigned char *buf, int *eld_size); 64 65 void (*pin_setup_infoframe)(struct hda_codec *codec, hda_nid_t pin_nid, 66 int dev_id, 67 int ca, int active_channels, int conn_type); 68 69 /* enable/disable HBR (HD passthrough) */ 70 int (*pin_hbr_setup)(struct hda_codec *codec, hda_nid_t pin_nid, 71 int dev_id, bool hbr); 72 73 int (*setup_stream)(struct hda_codec *codec, hda_nid_t cvt_nid, 74 hda_nid_t pin_nid, int dev_id, u32 stream_tag, 75 int format); 76 77 void (*pin_cvt_fixup)(struct hda_codec *codec, 78 struct hdmi_spec_per_pin *per_pin, 79 hda_nid_t cvt_nid); 80 81 void (*silent_stream)(struct hda_codec *codec, 82 struct hdmi_spec_per_pin *per_pin, 83 bool enable); 84 }; 85 86 struct hdmi_pcm { 87 struct hda_pcm *pcm; 88 struct snd_jack *jack; 89 struct snd_kcontrol *eld_ctl; 90 }; 91 92 enum { 93 SILENT_STREAM_OFF = 0, 94 SILENT_STREAM_KAE, /* use standard HDA Keep-Alive */ 95 SILENT_STREAM_I915, /* Intel i915 extension */ 96 }; 97 98 struct hdmi_spec { 99 struct hda_codec *codec; 100 int num_cvts; 101 struct snd_array cvts; /* struct hdmi_spec_per_cvt */ 102 hda_nid_t cvt_nids[4]; /* only for haswell fix */ 103 104 /* 105 * num_pins is the number of virtual pins 106 * for example, there are 3 pins, and each pin 107 * has 4 device entries, then the num_pins is 12 108 */ 109 int num_pins; 110 /* 111 * num_nids is the number of real pins 112 * In the above example, num_nids is 3 113 */ 114 int num_nids; 115 /* 116 * dev_num is the number of device entries 117 * on each pin. 118 * In the above example, dev_num is 4 119 */ 120 int dev_num; 121 struct snd_array pins; /* struct hdmi_spec_per_pin */ 122 struct hdmi_pcm pcm_rec[8]; 123 struct mutex pcm_lock; 124 struct mutex bind_lock; /* for audio component binding */ 125 /* pcm_bitmap means which pcms have been assigned to pins*/ 126 unsigned long pcm_bitmap; 127 int pcm_used; /* counter of pcm_rec[] */ 128 /* bitmap shows whether the pcm is opened in user space 129 * bit 0 means the first playback PCM (PCM3); 130 * bit 1 means the second playback PCM, and so on. 131 */ 132 unsigned long pcm_in_use; 133 134 struct hdmi_eld temp_eld; 135 struct hdmi_ops ops; 136 137 bool dyn_pin_out; 138 bool static_pcm_mapping; 139 /* hdmi interrupt trigger control flag for Nvidia codec */ 140 bool hdmi_intr_trig_ctrl; 141 bool nv_dp_workaround; /* workaround DP audio infoframe for Nvidia */ 142 143 bool intel_hsw_fixup; /* apply Intel platform-specific fixups */ 144 /* 145 * Non-generic VIA/NVIDIA specific 146 */ 147 struct hda_multi_out multiout; 148 struct hda_pcm_stream pcm_playback; 149 150 bool use_acomp_notifier; /* use eld_notify callback for hotplug */ 151 bool acomp_registered; /* audio component registered in this driver */ 152 bool force_connect; /* force connectivity */ 153 struct drm_audio_component_audio_ops drm_audio_ops; 154 int (*port2pin)(struct hda_codec *codec, int port); /* reverse port/pin mapping */ 155 156 struct hdac_chmap chmap; 157 hda_nid_t vendor_nid; 158 const int *port_map; 159 int port_num; 160 int silent_stream_type; 161 162 const struct snd_pcm_hw_constraint_list *hw_constraints_channels; 163 }; 164 165 #ifdef CONFIG_SND_HDA_COMPONENT 166 static inline bool codec_has_acomp(struct hda_codec *codec) 167 { 168 struct hdmi_spec *spec = codec->spec; 169 170 return spec->use_acomp_notifier; 171 } 172 #else 173 #define codec_has_acomp(codec) false 174 #endif 175 176 struct hdmi_audio_infoframe { 177 u8 type; /* 0x84 */ 178 u8 ver; /* 0x01 */ 179 u8 len; /* 0x0a */ 180 181 u8 checksum; 182 183 u8 CC02_CT47; /* CC in bits 0:2, CT in 4:7 */ 184 u8 SS01_SF24; 185 u8 CXT04; 186 u8 CA; 187 u8 LFEPBL01_LSV36_DM_INH7; 188 }; 189 190 struct dp_audio_infoframe { 191 u8 type; /* 0x84 */ 192 u8 len; /* 0x1b */ 193 u8 ver; /* 0x11 << 2 */ 194 195 u8 CC02_CT47; /* match with HDMI infoframe from this on */ 196 u8 SS01_SF24; 197 u8 CXT04; 198 u8 CA; 199 u8 LFEPBL01_LSV36_DM_INH7; 200 }; 201 202 union audio_infoframe { 203 struct hdmi_audio_infoframe hdmi; 204 struct dp_audio_infoframe dp; 205 DECLARE_FLEX_ARRAY(u8, bytes); 206 }; 207 208 #ifdef LIMITED_RATE_FMT_SUPPORT 209 /* support only the safe format and rate */ 210 #define SUPPORTED_RATES SNDRV_PCM_RATE_48000 211 #define SUPPORTED_MAXBPS 16 212 #define SUPPORTED_FORMATS SNDRV_PCM_FMTBIT_S16_LE 213 #else 214 /* support all rates and formats */ 215 #define SUPPORTED_RATES \ 216 (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |\ 217 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |\ 218 SNDRV_PCM_RATE_192000) 219 #define SUPPORTED_MAXBPS 24 220 #define SUPPORTED_FORMATS \ 221 (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE) 222 #endif 223 224 /* 225 * HDMI routines 226 */ 227 228 #define get_pin(spec, idx) \ 229 ((struct hdmi_spec_per_pin *)snd_array_elem(&spec->pins, idx)) 230 #define get_cvt(spec, idx) \ 231 ((struct hdmi_spec_per_cvt *)snd_array_elem(&spec->cvts, idx)) 232 /* obtain hdmi_pcm object assigned to idx */ 233 #define get_hdmi_pcm(spec, idx) (&(spec)->pcm_rec[idx]) 234 /* obtain hda_pcm object assigned to idx */ 235 #define get_pcm_rec(spec, idx) (get_hdmi_pcm(spec, idx)->pcm) 236 237 /* Generic HDMI codec support */ 238 int snd_hda_hdmi_generic_alloc(struct hda_codec *codec); 239 int snd_hda_hdmi_parse_codec(struct hda_codec *codec); 240 int snd_hda_hdmi_generic_probe(struct hda_codec *codec); 241 void snd_hda_hdmi_generic_remove(struct hda_codec *codec); 242 243 int snd_hda_hdmi_generic_build_pcms(struct hda_codec *codec); 244 int snd_hda_hdmi_generic_build_controls(struct hda_codec *codec); 245 int snd_hda_hdmi_generic_init(struct hda_codec *codec); 246 int snd_hda_hdmi_generic_suspend(struct hda_codec *codec); 247 int snd_hda_hdmi_generic_resume(struct hda_codec *codec); 248 void snd_hda_hdmi_generic_unsol_event(struct hda_codec *codec, unsigned int res); 249 250 int snd_hda_hdmi_pin_id_to_pin_index(struct hda_codec *codec, 251 hda_nid_t pin_nid, int dev_id); 252 #define pin_id_to_pin_index(codec, pin, dev) \ 253 snd_hda_hdmi_pin_id_to_pin_index(codec, pin, dev) 254 int snd_hda_hdmi_generic_init_per_pins(struct hda_codec *codec); 255 void snd_hda_hdmi_generic_spec_free(struct hda_codec *codec); 256 int snd_hda_hdmi_setup_stream(struct hda_codec *codec, 257 hda_nid_t cvt_nid, 258 hda_nid_t pin_nid, int dev_id, 259 u32 stream_tag, int format); 260 261 int snd_hda_hdmi_generic_pcm_prepare(struct hda_pcm_stream *hinfo, 262 struct hda_codec *codec, 263 unsigned int stream_tag, 264 unsigned int format, 265 struct snd_pcm_substream *substream); 266 int snd_hda_hdmi_generic_pcm_cleanup(struct hda_pcm_stream *hinfo, 267 struct hda_codec *codec, 268 struct snd_pcm_substream *substream); 269 270 void snd_hda_hdmi_check_presence_and_report(struct hda_codec *codec, 271 hda_nid_t nid, int dev_id); 272 void snd_hda_hdmi_setup_audio_infoframe(struct hda_codec *codec, 273 struct hdmi_spec_per_pin *per_pin, 274 bool non_pcm); 275 276 /* Audio component support */ 277 void snd_hda_hdmi_setup_drm_audio_ops(struct hda_codec *codec, 278 const struct drm_audio_component_audio_ops *ops); 279 void snd_hda_hdmi_acomp_init(struct hda_codec *codec, 280 const struct drm_audio_component_audio_ops *ops, 281 int (*port2pin)(struct hda_codec *, int)); 282 void snd_hda_hdmi_acomp_pin_eld_notify(void *audio_ptr, int port, int dev_id); 283 int snd_hda_hdmi_acomp_master_bind(struct device *dev, 284 struct drm_audio_component *acomp); 285 void snd_hda_hdmi_acomp_master_unbind(struct device *dev, 286 struct drm_audio_component *acomp); 287 288 /* Simple / legacy HDMI codec support */ 289 int snd_hda_hdmi_simple_probe(struct hda_codec *codec, 290 hda_nid_t cvt_nid, hda_nid_t pin_nid); 291 void snd_hda_hdmi_simple_remove(struct hda_codec *codec); 292 293 int snd_hda_hdmi_simple_build_pcms(struct hda_codec *codec); 294 int snd_hda_hdmi_simple_build_controls(struct hda_codec *codec); 295 int snd_hda_hdmi_simple_init(struct hda_codec *codec); 296 void snd_hda_hdmi_simple_unsol_event(struct hda_codec *codec, 297 unsigned int res); 298 int snd_hda_hdmi_simple_pcm_open(struct hda_pcm_stream *hinfo, 299 struct hda_codec *codec, 300 struct snd_pcm_substream *substream); 301 302 #endif /* __HDA_HDMI_LOCAL_H */ 303