File Index
Files and directories
Sign in
FILE

realtek.h

File preview with syntax highlighting.

linux-6.19.14/sound/hda/codecs/realtek/realtek.h C
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2//
  3// Realtek HD-audio codec support code
  4//
  5
  6#ifndef __HDA_REALTEK_H
  7#define __HDA_REALTEK_H
  8
  9#include <linux/acpi.h>
 10#include <linux/cleanup.h>
 11#include <linux/init.h>
 12#include <linux/delay.h>
 13#include <linux/slab.h>
 14#include <linux/pci.h>
 15#include <linux/dmi.h>
 16#include <linux/module.h>
 17#include <linux/i2c.h>
 18#include <linux/input.h>
 19#include <linux/leds.h>
 20#include <linux/ctype.h>
 21#include <linux/spi/spi.h>
 22#include <sound/core.h>
 23#include <sound/jack.h>
 24#include <sound/hda_codec.h>
 25#include "hda_local.h"
 26#include "hda_auto_parser.h"
 27#include "hda_beep.h"
 28#include "hda_jack.h"
 29#include "../generic.h"
 30#include "../side-codecs/hda_component.h"
 31
 32/* extra amp-initialization sequence types */
 33enum {
 34	ALC_INIT_UNDEFINED,
 35	ALC_INIT_NONE,
 36	ALC_INIT_DEFAULT,
 37};
 38
 39enum {
 40	ALC_HEADSET_MODE_UNKNOWN,
 41	ALC_HEADSET_MODE_UNPLUGGED,
 42	ALC_HEADSET_MODE_HEADSET,
 43	ALC_HEADSET_MODE_MIC,
 44	ALC_HEADSET_MODE_HEADPHONE,
 45};
 46
 47enum {
 48	ALC_HEADSET_TYPE_UNKNOWN,
 49	ALC_HEADSET_TYPE_CTIA,
 50	ALC_HEADSET_TYPE_OMTP,
 51};
 52
 53enum {
 54	ALC_KEY_MICMUTE_INDEX,
 55};
 56
 57struct alc_customize_define {
 58	unsigned int  sku_cfg;
 59	unsigned char port_connectivity;
 60	unsigned char check_sum;
 61	unsigned char customization;
 62	unsigned char external_amp;
 63	unsigned int  enable_pcbeep:1;
 64	unsigned int  platform_type:1;
 65	unsigned int  swap:1;
 66	unsigned int  override:1;
 67	unsigned int  fixup:1; /* Means that this sku is set by driver, not read from hw */
 68};
 69
 70struct alc_coef_led {
 71	unsigned int idx;
 72	unsigned int mask;
 73	unsigned int on;
 74	unsigned int off;
 75};
 76
 77struct alc_spec {
 78	struct hda_gen_spec gen; /* must be at head */
 79
 80	/* codec parameterization */
 81	struct alc_customize_define cdefine;
 82	unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
 83
 84	/* GPIO bits */
 85	unsigned int gpio_mask;
 86	unsigned int gpio_dir;
 87	unsigned int gpio_data;
 88	bool gpio_write_delay;	/* add a delay before writing gpio_data */
 89
 90	/* mute LED for HP laptops, see vref_mute_led_set() */
 91	int mute_led_polarity;
 92	int micmute_led_polarity;
 93	hda_nid_t mute_led_nid;
 94	hda_nid_t cap_mute_led_nid;
 95
 96	unsigned int gpio_mute_led_mask;
 97	unsigned int gpio_mic_led_mask;
 98	struct alc_coef_led mute_led_coef;
 99	struct alc_coef_led mic_led_coef;
100	struct mutex coef_mutex;
101
102	hda_nid_t headset_mic_pin;
103	hda_nid_t headphone_mic_pin;
104	int current_headset_mode;
105	int current_headset_type;
106
107	/* hooks */
108	void (*init_hook)(struct hda_codec *codec);
109	void (*power_hook)(struct hda_codec *codec);
110	void (*shutup)(struct hda_codec *codec);
111
112	int init_amp;
113	int codec_variant;	/* flag for other variants */
114	unsigned int has_alc5505_dsp:1;
115	unsigned int no_depop_delay:1;
116	unsigned int done_hp_init:1;
117	unsigned int no_shutup_pins:1;
118	unsigned int ultra_low_power:1;
119	unsigned int has_hs_key:1;
120	unsigned int no_internal_mic_pin:1;
121	unsigned int en_3kpull_low:1;
122	int num_speaker_amps;
123
124	/* for PLL fix */
125	hda_nid_t pll_nid;
126	unsigned int pll_coef_idx, pll_coef_bit;
127	unsigned int coef0;
128	struct input_dev *kb_dev;
129	u8 alc_mute_keycode_map[1];
130
131	/* component binding */
132	struct hda_component_parent comps;
133};
134
135int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
136			unsigned int coef_idx);
137void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
138			  unsigned int coef_idx, unsigned int coef_val);
139void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
140			   unsigned int coef_idx, unsigned int mask,
141			   unsigned int bits_set);
142#define alc_read_coef_idx(codec, coef_idx) \
143	alc_read_coefex_idx(codec, 0x20, coef_idx)
144#define alc_write_coef_idx(codec, coef_idx, coef_val) \
145	alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
146#define alc_update_coef_idx(codec, coef_idx, mask, bits_set)	\
147	alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
148
149unsigned int alc_get_coef0(struct hda_codec *codec);
150
151/* coef writes/updates batch */
152struct coef_fw {
153	unsigned char nid;
154	unsigned char idx;
155	unsigned short mask;
156	unsigned short val;
157};
158
159#define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
160	{ .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
161#define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
162#define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
163#define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
164
165void alc_process_coef_fw(struct hda_codec *codec, const struct coef_fw *fw);
166
167/*
168 * GPIO helpers
169 */
170void alc_setup_gpio(struct hda_codec *codec, unsigned int mask);
171void alc_write_gpio_data(struct hda_codec *codec);
172void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,
173			  bool on);
174void alc_write_gpio(struct hda_codec *codec);
175
176/* common GPIO fixups */
177void alc_fixup_gpio(struct hda_codec *codec, int action, unsigned int mask);
178void alc_fixup_gpio1(struct hda_codec *codec,
179		     const struct hda_fixup *fix, int action);
180void alc_fixup_gpio2(struct hda_codec *codec,
181		     const struct hda_fixup *fix, int action);
182void alc_fixup_gpio3(struct hda_codec *codec,
183		     const struct hda_fixup *fix, int action);
184void alc_fixup_gpio4(struct hda_codec *codec,
185		     const struct hda_fixup *fix, int action);
186void alc_fixup_micmute_led(struct hda_codec *codec,
187			   const struct hda_fixup *fix, int action);
188
189/*
190 * Common init code, callbacks and helpers
191 */
192void alc_fix_pll(struct hda_codec *codec);
193void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
194		      unsigned int coef_idx, unsigned int coef_bit);
195void alc_fill_eapd_coef(struct hda_codec *codec);
196void alc_auto_setup_eapd(struct hda_codec *codec, bool on);
197
198int alc_find_ext_mic_pin(struct hda_codec *codec);
199void alc_headset_mic_no_shutup(struct hda_codec *codec);
200void alc_shutup_pins(struct hda_codec *codec);
201void alc_eapd_shutup(struct hda_codec *codec);
202void alc_auto_init_amp(struct hda_codec *codec, int type);
203hda_nid_t alc_get_hp_pin(struct alc_spec *spec);
204int alc_auto_parse_customize_define(struct hda_codec *codec);
205int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports);
206void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports);
207int alc_build_controls(struct hda_codec *codec);
208void alc_update_knob_master(struct hda_codec *codec,
209			    struct hda_jack_callback *jack);
210
211static inline void alc_pre_init(struct hda_codec *codec)
212{
213	alc_fill_eapd_coef(codec);
214}
215
216#define is_s3_resume(codec) \
217	((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
218#define is_s4_resume(codec) \
219	((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
220#define is_s4_suspend(codec) \
221	((codec)->core.dev.power.power_state.event == PM_EVENT_FREEZE)
222
223int alc_init(struct hda_codec *codec);
224void alc_shutup(struct hda_codec *codec);
225void alc_power_eapd(struct hda_codec *codec);
226int alc_suspend(struct hda_codec *codec);
227int alc_resume(struct hda_codec *codec);
228
229int alc_parse_auto_config(struct hda_codec *codec,
230			  const hda_nid_t *ignore_nids,
231			  const hda_nid_t *ssid_nids);
232int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid);
233
234#define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
235
236#ifdef CONFIG_SND_HDA_INPUT_BEEP
237int alc_set_beep_amp(struct alc_spec *spec, hda_nid_t nid, int idx, int dir);
238int alc_has_cdefine_beep(struct hda_codec *codec);
239#define set_beep_amp		alc_set_beep_amp
240#define has_cdefine_beep	alc_has_cdefine_beep
241#else
242#define set_beep_amp(spec, nid, idx, dir)	0
243#define has_cdefine_beep(codec)		0
244#endif
245
246static inline void rename_ctl(struct hda_codec *codec, const char *oldname,
247			      const char *newname)
248{
249	struct snd_kcontrol *kctl;
250
251	kctl = snd_hda_find_mixer_ctl(codec, oldname);
252	if (kctl)
253		snd_ctl_rename(codec->card, kctl, newname);
254}
255
256/* Common fixups */
257void alc_fixup_sku_ignore(struct hda_codec *codec,
258			  const struct hda_fixup *fix, int action);
259void alc_fixup_no_depop_delay(struct hda_codec *codec,
260			      const struct hda_fixup *fix, int action);
261void alc_fixup_inv_dmic(struct hda_codec *codec,
262			const struct hda_fixup *fix, int action);
263void alc_fixup_dual_codecs(struct hda_codec *codec,
264			   const struct hda_fixup *fix, int action);
265void alc_fixup_bass_chmap(struct hda_codec *codec,
266			  const struct hda_fixup *fix, int action);
267void alc_fixup_headset_mode(struct hda_codec *codec,
268			    const struct hda_fixup *fix, int action);
269void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
270				      const struct hda_fixup *fix, int action);
271void alc_fixup_headset_mic(struct hda_codec *codec,
272			   const struct hda_fixup *fix, int action);
273void alc_update_headset_jack_cb(struct hda_codec *codec,
274				struct hda_jack_callback *jack);
275void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
276			 int polarity, bool enabled);
277void alc_fixup_hp_gpio_led(struct hda_codec *codec,
278			   int action,
279			   unsigned int mute_mask,
280			   unsigned int micmute_mask);
281void alc_fixup_no_jack_detect(struct hda_codec *codec,
282			      const struct hda_fixup *fix, int action);
283void alc_fixup_disable_aamix(struct hda_codec *codec,
284			     const struct hda_fixup *fix, int action);
285void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
286				 const struct hda_fixup *fix, int action);
287
288/* device-specific, but used by multiple codec drivers */
289void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
290				  const struct hda_fixup *fix,
291				  int action);
292void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
293					    const struct hda_fixup *fix,
294					    int action);
295void alc_fixup_dell_xps13(struct hda_codec *codec,
296			  const struct hda_fixup *fix, int action);
297
298/*
299 * COEF access helper functions
300 */
301static inline void coef_mutex_lock(struct hda_codec *codec)
302{
303	struct alc_spec *spec = codec->spec;
304
305	snd_hda_power_up_pm(codec);
306	mutex_lock(&spec->coef_mutex);
307}
308
309static inline void coef_mutex_unlock(struct hda_codec *codec)
310{
311	struct alc_spec *spec = codec->spec;
312
313	mutex_unlock(&spec->coef_mutex);
314	snd_hda_power_down_pm(codec);
315}
316
317DEFINE_GUARD(coef_mutex, struct hda_codec *, coef_mutex_lock(_T), coef_mutex_unlock(_T))
318
319#endif /* __HDA_REALTEK_H */
~/ Read-only file preview.