18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Generic BIOS auto-parser helper functions for HD-audio
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (c) 2012 Takashi Iwai <tiwai@suse.de>
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#ifndef __SOUND_HDA_GENERIC_H
98c2ecf20Sopenharmony_ci#define __SOUND_HDA_GENERIC_H
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include <linux/leds.h>
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci/* table entry for multi-io paths */
148c2ecf20Sopenharmony_cistruct hda_multi_io {
158c2ecf20Sopenharmony_ci	hda_nid_t pin;		/* multi-io widget pin NID */
168c2ecf20Sopenharmony_ci	hda_nid_t dac;		/* DAC to be connected */
178c2ecf20Sopenharmony_ci	unsigned int ctl_in;	/* cached input-pin control value */
188c2ecf20Sopenharmony_ci};
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci/* Widget connection path
218c2ecf20Sopenharmony_ci *
228c2ecf20Sopenharmony_ci * For output, stored in the order of DAC -> ... -> pin,
238c2ecf20Sopenharmony_ci * for input, pin -> ... -> ADC.
248c2ecf20Sopenharmony_ci *
258c2ecf20Sopenharmony_ci * idx[i] contains the source index number to select on of the widget path[i];
268c2ecf20Sopenharmony_ci * e.g. idx[1] is the index of the DAC (path[0]) selected by path[1] widget
278c2ecf20Sopenharmony_ci * multi[] indicates whether it's a selector widget with multi-connectors
288c2ecf20Sopenharmony_ci * (i.e. the connection selection is mandatory)
298c2ecf20Sopenharmony_ci * vol_ctl and mute_ctl contains the NIDs for the assigned mixers
308c2ecf20Sopenharmony_ci */
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci#define MAX_NID_PATH_DEPTH	10
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cienum {
358c2ecf20Sopenharmony_ci	NID_PATH_VOL_CTL,
368c2ecf20Sopenharmony_ci	NID_PATH_MUTE_CTL,
378c2ecf20Sopenharmony_ci	NID_PATH_BOOST_CTL,
388c2ecf20Sopenharmony_ci	NID_PATH_NUM_CTLS
398c2ecf20Sopenharmony_ci};
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_cistruct nid_path {
428c2ecf20Sopenharmony_ci	int depth;
438c2ecf20Sopenharmony_ci	hda_nid_t path[MAX_NID_PATH_DEPTH];
448c2ecf20Sopenharmony_ci	unsigned char idx[MAX_NID_PATH_DEPTH];
458c2ecf20Sopenharmony_ci	unsigned char multi[MAX_NID_PATH_DEPTH];
468c2ecf20Sopenharmony_ci	unsigned int ctls[NID_PATH_NUM_CTLS]; /* NID_PATH_XXX_CTL */
478c2ecf20Sopenharmony_ci	bool active:1;		/* activated by driver */
488c2ecf20Sopenharmony_ci	bool pin_enabled:1;	/* pins are enabled */
498c2ecf20Sopenharmony_ci	bool pin_fixed:1;	/* path with fixed pin */
508c2ecf20Sopenharmony_ci	bool stream_enabled:1;	/* stream is active */
518c2ecf20Sopenharmony_ci};
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci/* mic/line-in auto switching entry */
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci#define MAX_AUTO_MIC_PINS	3
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_cistruct automic_entry {
588c2ecf20Sopenharmony_ci	hda_nid_t pin;		/* pin */
598c2ecf20Sopenharmony_ci	int idx;		/* imux index, -1 = invalid */
608c2ecf20Sopenharmony_ci	unsigned int attr;	/* pin attribute (INPUT_PIN_ATTR_*) */
618c2ecf20Sopenharmony_ci};
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci/* active stream id */
648c2ecf20Sopenharmony_cienum { STREAM_MULTI_OUT, STREAM_INDEP_HP };
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci/* PCM hook action */
678c2ecf20Sopenharmony_cienum {
688c2ecf20Sopenharmony_ci	HDA_GEN_PCM_ACT_OPEN,
698c2ecf20Sopenharmony_ci	HDA_GEN_PCM_ACT_PREPARE,
708c2ecf20Sopenharmony_ci	HDA_GEN_PCM_ACT_CLEANUP,
718c2ecf20Sopenharmony_ci	HDA_GEN_PCM_ACT_CLOSE,
728c2ecf20Sopenharmony_ci};
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci/* DAC assignment badness table */
758c2ecf20Sopenharmony_cistruct badness_table {
768c2ecf20Sopenharmony_ci	int no_primary_dac;	/* no primary DAC */
778c2ecf20Sopenharmony_ci	int no_dac;		/* no secondary DACs */
788c2ecf20Sopenharmony_ci	int shared_primary;	/* primary DAC is shared with main output */
798c2ecf20Sopenharmony_ci	int shared_surr;	/* secondary DAC shared with main or primary */
808c2ecf20Sopenharmony_ci	int shared_clfe;	/* third DAC shared with main or primary */
818c2ecf20Sopenharmony_ci	int shared_surr_main;	/* secondary DAC sahred with main/DAC0 */
828c2ecf20Sopenharmony_ci};
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ciextern const struct badness_table hda_main_out_badness;
858c2ecf20Sopenharmony_ciextern const struct badness_table hda_extra_out_badness;
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_cistruct hda_micmute_hook {
888c2ecf20Sopenharmony_ci	unsigned int led_mode;
898c2ecf20Sopenharmony_ci	unsigned int capture;
908c2ecf20Sopenharmony_ci	unsigned int led_value;
918c2ecf20Sopenharmony_ci	void (*old_hook)(struct hda_codec *codec,
928c2ecf20Sopenharmony_ci			 struct snd_kcontrol *kcontrol,
938c2ecf20Sopenharmony_ci			 struct snd_ctl_elem_value *ucontrol);
948c2ecf20Sopenharmony_ci};
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_cistruct hda_gen_spec {
978c2ecf20Sopenharmony_ci	char stream_name_analog[32];	/* analog PCM stream */
988c2ecf20Sopenharmony_ci	const struct hda_pcm_stream *stream_analog_playback;
998c2ecf20Sopenharmony_ci	const struct hda_pcm_stream *stream_analog_capture;
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci	char stream_name_alt_analog[32]; /* alternative analog PCM stream */
1028c2ecf20Sopenharmony_ci	const struct hda_pcm_stream *stream_analog_alt_playback;
1038c2ecf20Sopenharmony_ci	const struct hda_pcm_stream *stream_analog_alt_capture;
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci	char stream_name_digital[32];	/* digital PCM stream */
1068c2ecf20Sopenharmony_ci	const struct hda_pcm_stream *stream_digital_playback;
1078c2ecf20Sopenharmony_ci	const struct hda_pcm_stream *stream_digital_capture;
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci	/* PCM */
1108c2ecf20Sopenharmony_ci	unsigned int active_streams;
1118c2ecf20Sopenharmony_ci	struct mutex pcm_mutex;
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci	/* playback */
1148c2ecf20Sopenharmony_ci	struct hda_multi_out multiout;	/* playback set-up
1158c2ecf20Sopenharmony_ci					 * max_channels, dacs must be set
1168c2ecf20Sopenharmony_ci					 * dig_out_nid and hp_nid are optional
1178c2ecf20Sopenharmony_ci					 */
1188c2ecf20Sopenharmony_ci	hda_nid_t alt_dac_nid;
1198c2ecf20Sopenharmony_ci	hda_nid_t follower_dig_outs[3];	/* optional - for auto-parsing */
1208c2ecf20Sopenharmony_ci	int dig_out_type;
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ci	/* capture */
1238c2ecf20Sopenharmony_ci	unsigned int num_adc_nids;
1248c2ecf20Sopenharmony_ci	hda_nid_t adc_nids[AUTO_CFG_MAX_INS];
1258c2ecf20Sopenharmony_ci	hda_nid_t dig_in_nid;		/* digital-in NID; optional */
1268c2ecf20Sopenharmony_ci	hda_nid_t mixer_nid;		/* analog-mixer NID */
1278c2ecf20Sopenharmony_ci	hda_nid_t mixer_merge_nid;	/* aamix merge-point NID (optional) */
1288c2ecf20Sopenharmony_ci	const char *input_labels[HDA_MAX_NUM_INPUTS];
1298c2ecf20Sopenharmony_ci	int input_label_idxs[HDA_MAX_NUM_INPUTS];
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci	/* capture setup for dynamic dual-adc switch */
1328c2ecf20Sopenharmony_ci	hda_nid_t cur_adc;
1338c2ecf20Sopenharmony_ci	unsigned int cur_adc_stream_tag;
1348c2ecf20Sopenharmony_ci	unsigned int cur_adc_format;
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci	/* capture source */
1378c2ecf20Sopenharmony_ci	struct hda_input_mux input_mux;
1388c2ecf20Sopenharmony_ci	unsigned int cur_mux[3];
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci	/* channel model */
1418c2ecf20Sopenharmony_ci	/* min_channel_count contains the minimum channel count for primary
1428c2ecf20Sopenharmony_ci	 * outputs.  When multi_ios is set, the channels can be configured
1438c2ecf20Sopenharmony_ci	 * between min_channel_count and (min_channel_count + multi_ios * 2).
1448c2ecf20Sopenharmony_ci	 *
1458c2ecf20Sopenharmony_ci	 * ext_channel_count contains the current channel count of the primary
1468c2ecf20Sopenharmony_ci	 * out.  This varies in the range above.
1478c2ecf20Sopenharmony_ci	 *
1488c2ecf20Sopenharmony_ci	 * Meanwhile, const_channel_count is the channel count for all outputs
1498c2ecf20Sopenharmony_ci	 * including headphone and speakers.  It's a constant value, and the
1508c2ecf20Sopenharmony_ci	 * PCM is set up as max(ext_channel_count, const_channel_count).
1518c2ecf20Sopenharmony_ci	 */
1528c2ecf20Sopenharmony_ci	int min_channel_count;		/* min. channel count for primary out */
1538c2ecf20Sopenharmony_ci	int ext_channel_count;		/* current channel count for primary */
1548c2ecf20Sopenharmony_ci	int const_channel_count;	/* channel count for all */
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci	/* PCM information */
1578c2ecf20Sopenharmony_ci	struct hda_pcm *pcm_rec[3];	/* used in build_pcms() */
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci	/* dynamic controls, init_verbs and input_mux */
1608c2ecf20Sopenharmony_ci	struct auto_pin_cfg autocfg;
1618c2ecf20Sopenharmony_ci	struct snd_array kctls;
1628c2ecf20Sopenharmony_ci	hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
1638c2ecf20Sopenharmony_ci	hda_nid_t imux_pins[HDA_MAX_NUM_INPUTS];
1648c2ecf20Sopenharmony_ci	unsigned int dyn_adc_idx[HDA_MAX_NUM_INPUTS];
1658c2ecf20Sopenharmony_ci	/* shared hp/mic */
1668c2ecf20Sopenharmony_ci	hda_nid_t shared_mic_vref_pin;
1678c2ecf20Sopenharmony_ci	hda_nid_t hp_mic_pin;
1688c2ecf20Sopenharmony_ci	int hp_mic_mux_idx;
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ci	/* DAC/ADC lists */
1718c2ecf20Sopenharmony_ci	int num_all_dacs;
1728c2ecf20Sopenharmony_ci	hda_nid_t all_dacs[16];
1738c2ecf20Sopenharmony_ci	int num_all_adcs;
1748c2ecf20Sopenharmony_ci	hda_nid_t all_adcs[AUTO_CFG_MAX_INS];
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_ci	/* path list */
1778c2ecf20Sopenharmony_ci	struct snd_array paths;
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_ci	/* path indices */
1808c2ecf20Sopenharmony_ci	int out_paths[AUTO_CFG_MAX_OUTS];
1818c2ecf20Sopenharmony_ci	int hp_paths[AUTO_CFG_MAX_OUTS];
1828c2ecf20Sopenharmony_ci	int speaker_paths[AUTO_CFG_MAX_OUTS];
1838c2ecf20Sopenharmony_ci	int aamix_out_paths[3];
1848c2ecf20Sopenharmony_ci	int digout_paths[AUTO_CFG_MAX_OUTS];
1858c2ecf20Sopenharmony_ci	int input_paths[HDA_MAX_NUM_INPUTS][AUTO_CFG_MAX_INS];
1868c2ecf20Sopenharmony_ci	int loopback_paths[HDA_MAX_NUM_INPUTS];
1878c2ecf20Sopenharmony_ci	int loopback_merge_path;
1888c2ecf20Sopenharmony_ci	int digin_path;
1898c2ecf20Sopenharmony_ci
1908c2ecf20Sopenharmony_ci	/* auto-mic stuff */
1918c2ecf20Sopenharmony_ci	int am_num_entries;
1928c2ecf20Sopenharmony_ci	struct automic_entry am_entry[MAX_AUTO_MIC_PINS];
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_ci	/* for pin sensing */
1958c2ecf20Sopenharmony_ci	/* current status; set in hda_geneic.c */
1968c2ecf20Sopenharmony_ci	unsigned int hp_jack_present:1;
1978c2ecf20Sopenharmony_ci	unsigned int line_jack_present:1;
1988c2ecf20Sopenharmony_ci	unsigned int speaker_muted:1; /* current status of speaker mute */
1998c2ecf20Sopenharmony_ci	unsigned int line_out_muted:1; /* current status of LO mute */
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_ci	/* internal states of automute / autoswitch behavior */
2028c2ecf20Sopenharmony_ci	unsigned int auto_mic:1;
2038c2ecf20Sopenharmony_ci	unsigned int automute_speaker:1; /* automute speaker outputs */
2048c2ecf20Sopenharmony_ci	unsigned int automute_lo:1; /* automute LO outputs */
2058c2ecf20Sopenharmony_ci
2068c2ecf20Sopenharmony_ci	/* capabilities detected by parser */
2078c2ecf20Sopenharmony_ci	unsigned int detect_hp:1;	/* Headphone detection enabled */
2088c2ecf20Sopenharmony_ci	unsigned int detect_lo:1;	/* Line-out detection enabled */
2098c2ecf20Sopenharmony_ci	unsigned int automute_speaker_possible:1; /* there are speakers and either LO or HP */
2108c2ecf20Sopenharmony_ci	unsigned int automute_lo_possible:1;	  /* there are line outs and HP */
2118c2ecf20Sopenharmony_ci
2128c2ecf20Sopenharmony_ci	/* additional parameters set by codec drivers */
2138c2ecf20Sopenharmony_ci	unsigned int master_mute:1;	/* master mute over all */
2148c2ecf20Sopenharmony_ci	unsigned int keep_vref_in_automute:1; /* Don't clear VREF in automute */
2158c2ecf20Sopenharmony_ci	unsigned int line_in_auto_switch:1; /* allow line-in auto switch */
2168c2ecf20Sopenharmony_ci	unsigned int auto_mute_via_amp:1; /* auto-mute via amp instead of pinctl */
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ci	/* parser behavior flags; set before snd_hda_gen_parse_auto_config() */
2198c2ecf20Sopenharmony_ci	unsigned int suppress_auto_mute:1; /* suppress input jack auto mute */
2208c2ecf20Sopenharmony_ci	unsigned int suppress_auto_mic:1; /* suppress input jack auto switch */
2218c2ecf20Sopenharmony_ci
2228c2ecf20Sopenharmony_ci	/* other parse behavior flags */
2238c2ecf20Sopenharmony_ci	unsigned int need_dac_fix:1; /* need to limit DACs for multi channels */
2248c2ecf20Sopenharmony_ci	unsigned int hp_mic:1; /* Allow HP as a mic-in */
2258c2ecf20Sopenharmony_ci	unsigned int suppress_hp_mic_detect:1; /* Don't detect HP/mic */
2268c2ecf20Sopenharmony_ci	unsigned int no_primary_hp:1; /* Don't prefer HP pins to speaker pins */
2278c2ecf20Sopenharmony_ci	unsigned int no_multi_io:1; /* Don't try multi I/O config */
2288c2ecf20Sopenharmony_ci	unsigned int multi_cap_vol:1; /* allow multiple capture xxx volumes */
2298c2ecf20Sopenharmony_ci	unsigned int inv_dmic_split:1; /* inverted dmic w/a for conexant */
2308c2ecf20Sopenharmony_ci	unsigned int own_eapd_ctl:1; /* set EAPD by own function */
2318c2ecf20Sopenharmony_ci	unsigned int keep_eapd_on:1; /* don't turn off EAPD automatically */
2328c2ecf20Sopenharmony_ci	unsigned int vmaster_mute_enum:1; /* add vmaster mute mode enum */
2338c2ecf20Sopenharmony_ci	unsigned int indep_hp:1; /* independent HP supported */
2348c2ecf20Sopenharmony_ci	unsigned int prefer_hp_amp:1; /* enable HP amp for speaker if any */
2358c2ecf20Sopenharmony_ci	unsigned int add_stereo_mix_input:2; /* add aamix as a capture src */
2368c2ecf20Sopenharmony_ci	unsigned int add_jack_modes:1; /* add i/o jack mode enum ctls */
2378c2ecf20Sopenharmony_ci	unsigned int power_down_unused:1; /* power down unused widgets */
2388c2ecf20Sopenharmony_ci	unsigned int dac_min_mute:1; /* minimal = mute for DACs */
2398c2ecf20Sopenharmony_ci	unsigned int suppress_vmaster:1; /* don't create vmaster kctls */
2408c2ecf20Sopenharmony_ci	unsigned int obey_preferred_dacs:1; /* obey preferred_dacs assignment */
2418c2ecf20Sopenharmony_ci
2428c2ecf20Sopenharmony_ci	/* other internal flags */
2438c2ecf20Sopenharmony_ci	unsigned int no_analog:1; /* digital I/O only */
2448c2ecf20Sopenharmony_ci	unsigned int dyn_adc_switch:1; /* switch ADCs (for ALC275) */
2458c2ecf20Sopenharmony_ci	unsigned int indep_hp_enabled:1; /* independent HP enabled */
2468c2ecf20Sopenharmony_ci	unsigned int have_aamix_ctl:1;
2478c2ecf20Sopenharmony_ci	unsigned int hp_mic_jack_modes:1;
2488c2ecf20Sopenharmony_ci	unsigned int skip_verbs:1; /* don't apply verbs at snd_hda_gen_init() */
2498c2ecf20Sopenharmony_ci
2508c2ecf20Sopenharmony_ci	/* additional mute flags (only effective with auto_mute_via_amp=1) */
2518c2ecf20Sopenharmony_ci	u64 mute_bits;
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci	/* bitmask for skipping volume controls */
2548c2ecf20Sopenharmony_ci	u64 out_vol_mask;
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_ci	/* badness tables for output path evaluations */
2578c2ecf20Sopenharmony_ci	const struct badness_table *main_out_badness;
2588c2ecf20Sopenharmony_ci	const struct badness_table *extra_out_badness;
2598c2ecf20Sopenharmony_ci
2608c2ecf20Sopenharmony_ci	/* preferred pin/DAC pairs; an array of paired NIDs */
2618c2ecf20Sopenharmony_ci	const hda_nid_t *preferred_dacs;
2628c2ecf20Sopenharmony_ci
2638c2ecf20Sopenharmony_ci	/* loopback mixing mode */
2648c2ecf20Sopenharmony_ci	bool aamix_mode;
2658c2ecf20Sopenharmony_ci
2668c2ecf20Sopenharmony_ci	/* digital beep */
2678c2ecf20Sopenharmony_ci	hda_nid_t beep_nid;
2688c2ecf20Sopenharmony_ci
2698c2ecf20Sopenharmony_ci	/* for virtual master */
2708c2ecf20Sopenharmony_ci	hda_nid_t vmaster_nid;
2718c2ecf20Sopenharmony_ci	unsigned int vmaster_tlv[4];
2728c2ecf20Sopenharmony_ci	struct hda_vmaster_mute_hook vmaster_mute;
2738c2ecf20Sopenharmony_ci
2748c2ecf20Sopenharmony_ci	struct hda_loopback_check loopback;
2758c2ecf20Sopenharmony_ci	struct snd_array loopback_list;
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_ci	/* multi-io */
2788c2ecf20Sopenharmony_ci	int multi_ios;
2798c2ecf20Sopenharmony_ci	struct hda_multi_io multi_io[4];
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_ci	/* hooks */
2828c2ecf20Sopenharmony_ci	void (*init_hook)(struct hda_codec *codec);
2838c2ecf20Sopenharmony_ci	void (*automute_hook)(struct hda_codec *codec);
2848c2ecf20Sopenharmony_ci	void (*cap_sync_hook)(struct hda_codec *codec,
2858c2ecf20Sopenharmony_ci			      struct snd_kcontrol *kcontrol,
2868c2ecf20Sopenharmony_ci			      struct snd_ctl_elem_value *ucontrol);
2878c2ecf20Sopenharmony_ci
2888c2ecf20Sopenharmony_ci	/* mic mute LED hook; called via cap_sync_hook */
2898c2ecf20Sopenharmony_ci	struct hda_micmute_hook micmute_led;
2908c2ecf20Sopenharmony_ci
2918c2ecf20Sopenharmony_ci	/* PCM hooks */
2928c2ecf20Sopenharmony_ci	void (*pcm_playback_hook)(struct hda_pcm_stream *hinfo,
2938c2ecf20Sopenharmony_ci				  struct hda_codec *codec,
2948c2ecf20Sopenharmony_ci				  struct snd_pcm_substream *substream,
2958c2ecf20Sopenharmony_ci				  int action);
2968c2ecf20Sopenharmony_ci	void (*pcm_capture_hook)(struct hda_pcm_stream *hinfo,
2978c2ecf20Sopenharmony_ci				 struct hda_codec *codec,
2988c2ecf20Sopenharmony_ci				 struct snd_pcm_substream *substream,
2998c2ecf20Sopenharmony_ci				 int action);
3008c2ecf20Sopenharmony_ci
3018c2ecf20Sopenharmony_ci	/* automute / autoswitch hooks */
3028c2ecf20Sopenharmony_ci	void (*hp_automute_hook)(struct hda_codec *codec,
3038c2ecf20Sopenharmony_ci				 struct hda_jack_callback *cb);
3048c2ecf20Sopenharmony_ci	void (*line_automute_hook)(struct hda_codec *codec,
3058c2ecf20Sopenharmony_ci				   struct hda_jack_callback *cb);
3068c2ecf20Sopenharmony_ci	void (*mic_autoswitch_hook)(struct hda_codec *codec,
3078c2ecf20Sopenharmony_ci				    struct hda_jack_callback *cb);
3088c2ecf20Sopenharmony_ci
3098c2ecf20Sopenharmony_ci	/* leds */
3108c2ecf20Sopenharmony_ci	struct led_classdev *led_cdevs[NUM_AUDIO_LEDS];
3118c2ecf20Sopenharmony_ci};
3128c2ecf20Sopenharmony_ci
3138c2ecf20Sopenharmony_ci/* values for add_stereo_mix_input flag */
3148c2ecf20Sopenharmony_cienum {
3158c2ecf20Sopenharmony_ci	HDA_HINT_STEREO_MIX_DISABLE,	/* No stereo mix input */
3168c2ecf20Sopenharmony_ci	HDA_HINT_STEREO_MIX_ENABLE,	/* Add stereo mix input */
3178c2ecf20Sopenharmony_ci	HDA_HINT_STEREO_MIX_AUTO,	/* Add only if auto-mic is disabled */
3188c2ecf20Sopenharmony_ci};
3198c2ecf20Sopenharmony_ci
3208c2ecf20Sopenharmony_ciint snd_hda_gen_spec_init(struct hda_gen_spec *spec);
3218c2ecf20Sopenharmony_ci
3228c2ecf20Sopenharmony_ciint snd_hda_gen_init(struct hda_codec *codec);
3238c2ecf20Sopenharmony_civoid snd_hda_gen_free(struct hda_codec *codec);
3248c2ecf20Sopenharmony_ci
3258c2ecf20Sopenharmony_ciint snd_hda_get_path_idx(struct hda_codec *codec, struct nid_path *path);
3268c2ecf20Sopenharmony_cistruct nid_path *snd_hda_get_path_from_idx(struct hda_codec *codec, int idx);
3278c2ecf20Sopenharmony_cistruct nid_path *
3288c2ecf20Sopenharmony_cisnd_hda_add_new_path(struct hda_codec *codec, hda_nid_t from_nid,
3298c2ecf20Sopenharmony_ci		     hda_nid_t to_nid, int anchor_nid);
3308c2ecf20Sopenharmony_civoid snd_hda_activate_path(struct hda_codec *codec, struct nid_path *path,
3318c2ecf20Sopenharmony_ci			   bool enable, bool add_aamix);
3328c2ecf20Sopenharmony_ci
3338c2ecf20Sopenharmony_cistruct snd_kcontrol_new *
3348c2ecf20Sopenharmony_cisnd_hda_gen_add_kctl(struct hda_gen_spec *spec, const char *name,
3358c2ecf20Sopenharmony_ci		     const struct snd_kcontrol_new *temp);
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_ciint snd_hda_gen_parse_auto_config(struct hda_codec *codec,
3388c2ecf20Sopenharmony_ci				  struct auto_pin_cfg *cfg);
3398c2ecf20Sopenharmony_ciint snd_hda_gen_build_controls(struct hda_codec *codec);
3408c2ecf20Sopenharmony_ciint snd_hda_gen_build_pcms(struct hda_codec *codec);
3418c2ecf20Sopenharmony_civoid snd_hda_gen_reboot_notify(struct hda_codec *codec);
3428c2ecf20Sopenharmony_ci
3438c2ecf20Sopenharmony_ci/* standard jack event callbacks */
3448c2ecf20Sopenharmony_civoid snd_hda_gen_hp_automute(struct hda_codec *codec,
3458c2ecf20Sopenharmony_ci			     struct hda_jack_callback *jack);
3468c2ecf20Sopenharmony_civoid snd_hda_gen_line_automute(struct hda_codec *codec,
3478c2ecf20Sopenharmony_ci			       struct hda_jack_callback *jack);
3488c2ecf20Sopenharmony_civoid snd_hda_gen_mic_autoswitch(struct hda_codec *codec,
3498c2ecf20Sopenharmony_ci				struct hda_jack_callback *jack);
3508c2ecf20Sopenharmony_civoid snd_hda_gen_update_outputs(struct hda_codec *codec);
3518c2ecf20Sopenharmony_ci
3528c2ecf20Sopenharmony_ci#ifdef CONFIG_PM
3538c2ecf20Sopenharmony_ciint snd_hda_gen_check_power_status(struct hda_codec *codec, hda_nid_t nid);
3548c2ecf20Sopenharmony_ci#endif
3558c2ecf20Sopenharmony_ciunsigned int snd_hda_gen_path_power_filter(struct hda_codec *codec,
3568c2ecf20Sopenharmony_ci					   hda_nid_t nid,
3578c2ecf20Sopenharmony_ci					   unsigned int power_state);
3588c2ecf20Sopenharmony_civoid snd_hda_gen_stream_pm(struct hda_codec *codec, hda_nid_t nid, bool on);
3598c2ecf20Sopenharmony_ciint snd_hda_gen_fix_pin_power(struct hda_codec *codec, hda_nid_t pin);
3608c2ecf20Sopenharmony_ci
3618c2ecf20Sopenharmony_ciint snd_hda_gen_add_mute_led_cdev(struct hda_codec *codec,
3628c2ecf20Sopenharmony_ci				  int (*callback)(struct led_classdev *,
3638c2ecf20Sopenharmony_ci						  enum led_brightness));
3648c2ecf20Sopenharmony_ciint snd_hda_gen_add_micmute_led_cdev(struct hda_codec *codec,
3658c2ecf20Sopenharmony_ci				     int (*callback)(struct led_classdev *,
3668c2ecf20Sopenharmony_ci						     enum led_brightness));
3678c2ecf20Sopenharmony_ci
3688c2ecf20Sopenharmony_ci#endif /* __SOUND_HDA_GENERIC_H */
369