/* a special bypass for COEF 0; read the cached value at the second time */ unsignedint alc_get_coef0(struct hda_codec *codec)
{ struct alc_spec *spec = codec->spec;
void alc_fixup_micmute_led(struct hda_codec *codec, conststruct hda_fixup *fix, int action)
{ if (action == HDA_FIXUP_ACT_PRE_PROBE)
snd_hda_gen_add_micmute_led_cdev(codec, NULL);
}
EXPORT_SYMBOL_NS_GPL(alc_fixup_micmute_led, "SND_HDA_CODEC_REALTEK");
/* * Fix hardware PLL issue * On some codecs, the analog PLL gating control must be off while * the default value is 1.
*/ void alc_fix_pll(struct hda_codec *codec)
{ struct alc_spec *spec = codec->spec;
kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume"); if (!kctl) return;
uctl = kzalloc(sizeof(*uctl), GFP_KERNEL); if (!uctl) return;
val = snd_hda_codec_read(codec, jack->nid, 0,
AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
val &= HDA_AMP_VOLMASK;
uctl->value.integer.value[0] = val;
uctl->value.integer.value[1] = val;
kctl->put(kctl, uctl);
kfree(uctl);
}
EXPORT_SYMBOL_NS_GPL(alc_update_knob_master, "SND_HDA_CODEC_REALTEK");
/* Change EAPD to verb control */ void alc_fill_eapd_coef(struct hda_codec *codec)
{ int coef;
coef = alc_get_coef0(codec);
switch (codec->core.vendor_id) { case 0x10ec0262:
alc_update_coef_idx(codec, 0x7, 0, 1<<5); break; case 0x10ec0267: case 0x10ec0268:
alc_update_coef_idx(codec, 0x7, 0, 1<<13); break; case 0x10ec0269: if ((coef & 0x00f0) == 0x0010)
alc_update_coef_idx(codec, 0xd, 0, 1<<14); if ((coef & 0x00f0) == 0x0020)
alc_update_coef_idx(codec, 0x4, 1<<15, 0); if ((coef & 0x00f0) == 0x0030)
alc_update_coef_idx(codec, 0x10, 1<<9, 0); break; case 0x10ec0280: case 0x10ec0284: case 0x10ec0290: case 0x10ec0292:
alc_update_coef_idx(codec, 0x4, 1<<15, 0); break; case 0x10ec0225: case 0x10ec0295: case 0x10ec0299:
alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
fallthrough; case 0x10ec0215: case 0x10ec0236: case 0x10ec0245: case 0x10ec0256: case 0x10ec0257: case 0x10ec0285: case 0x10ec0289:
alc_update_coef_idx(codec, 0x36, 1<<13, 0);
fallthrough; case 0x10ec0230: case 0x10ec0233: case 0x10ec0235: case 0x10ec0255: case 0x19e58326: case 0x10ec0282: case 0x10ec0283: case 0x10ec0286: case 0x10ec0288: case 0x10ec0298: case 0x10ec0300:
alc_update_coef_idx(codec, 0x10, 1<<9, 0); break; case 0x10ec0275:
alc_update_coef_idx(codec, 0xe, 0, 1<<0); break; case 0x10ec0287:
alc_update_coef_idx(codec, 0x10, 1<<9, 0);
alc_write_coef_idx(codec, 0x8, 0x4ab7); break; case 0x10ec0293:
alc_update_coef_idx(codec, 0xa, 1<<13, 0); break; case 0x10ec0234: case 0x10ec0274:
alc_write_coef_idx(codec, 0x6e, 0x0c25);
fallthrough; case 0x10ec0294: case 0x10ec0700: case 0x10ec0701: case 0x10ec0703: case 0x10ec0711:
alc_update_coef_idx(codec, 0x10, 1<<15, 0); break; case 0x10ec0662: if ((coef & 0x00f0) == 0x0030)
alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */ break; case 0x10ec0272: case 0x10ec0273: case 0x10ec0663: case 0x10ec0665: case 0x10ec0670: case 0x10ec0671: case 0x10ec0672:
alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */ break; case 0x10ec0222: case 0x10ec0623:
alc_update_coef_idx(codec, 0x19, 1<<13, 0); break; case 0x10ec0668:
alc_update_coef_idx(codec, 0x7, 3<<13, 0); break; case 0x10ec0867:
alc_update_coef_idx(codec, 0x4, 1<<10, 0); break; case 0x10ec0888: if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
alc_update_coef_idx(codec, 0x7, 1<<5, 0); break; case 0x10ec0892: case 0x10ec0897:
alc_update_coef_idx(codec, 0x7, 1<<5, 0); break; case 0x10ec0899: case 0x10ec0900: case 0x10ec0b00: case 0x10ec1168: case 0x10ec1220:
alc_update_coef_idx(codec, 0x7, 1<<1, 0); break;
}
}
EXPORT_SYMBOL_NS_GPL(alc_fill_eapd_coef, "SND_HDA_CODEC_REALTEK");
/* turn on/off EAPD control (only if available) */ staticvoid set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
{ if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN) return; if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
on ? 2 : 0);
}
/* turn on/off EAPD controls of the codec */ void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
{ /* We currently only handle front, HP */ staticconst hda_nid_t pins[] = {
0x0f, 0x10, 0x14, 0x15, 0x17, 0
}; const hda_nid_t *p; for (p = pins; *p; p++)
set_eapd(codec, *p, on);
}
EXPORT_SYMBOL_NS_GPL(alc_auto_setup_eapd, "SND_HDA_CODEC_REALTEK");
/* Returns the nid of the external mic input pin, or 0 if it cannot be found. */ int alc_find_ext_mic_pin(struct hda_codec *codec)
{ struct alc_spec *spec = codec->spec; struct auto_pin_cfg *cfg = &spec->gen.autocfg;
hda_nid_t nid; unsignedint defcfg; int i;
for (i = 0; i < cfg->num_inputs; i++) { if (cfg->inputs[i].type != AUTO_PIN_MIC) continue;
nid = cfg->inputs[i].pin;
defcfg = snd_hda_codec_get_pincfg(codec, nid); if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT) continue; return nid;
}
void alc_headset_mic_no_shutup(struct hda_codec *codec)
{ conststruct hda_pincfg *pin; int mic_pin = alc_find_ext_mic_pin(codec); int i;
/* don't shut up pins when unloading the driver; otherwise it breaks * the default pin setup at the next load of the driver
*/ if (codec->bus->shutdown) return;
snd_array_for_each(&codec->init_pins, i, pin) { /* use read here for syncing after issuing each verb */ if (pin->nid != mic_pin)
snd_hda_codec_read(codec, pin->nid, 0,
AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
}
switch (codec->core.vendor_id) { case 0x10ec0236: case 0x10ec0256: case 0x10ec0257: case 0x19e58326: case 0x10ec0283: case 0x10ec0285: case 0x10ec0286: case 0x10ec0287: case 0x10ec0288: case 0x10ec0295: case 0x10ec0298:
alc_headset_mic_no_shutup(codec); break; default:
snd_hda_shutup_pins(codec); break;
}
}
EXPORT_SYMBOL_NS_GPL(alc_shutup_pins, "SND_HDA_CODEC_REALTEK");
/* generic shutup callback; * just turning off EAPD and a little pause for avoiding pop-noise
*/ void alc_eapd_shutup(struct hda_codec *codec)
{ struct alc_spec *spec = codec->spec;
alc_auto_setup_eapd(codec, false); if (!spec->no_depop_delay)
msleep(200);
alc_shutup_pins(codec);
}
EXPORT_SYMBOL_NS_GPL(alc_eapd_shutup, "SND_HDA_CODEC_REALTEK");
/* additional initialization for ALC888 variants */ staticvoid alc888_coef_init(struct hda_codec *codec)
{ switch (alc_get_coef0(codec) & 0x00f0) { /* alc888-VA */ case 0x00: /* alc888-VB */ case 0x10:
alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */ break;
}
}
/* generic EAPD initialization */ void alc_auto_init_amp(struct hda_codec *codec, int type)
{
alc_auto_setup_eapd(codec, true);
alc_write_gpio(codec); switch (type) { case ALC_INIT_DEFAULT: switch (codec->core.vendor_id) { case 0x10ec0260:
alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010); break; case 0x10ec0880: case 0x10ec0882: case 0x10ec0883: case 0x10ec0885:
alc_update_coef_idx(codec, 7, 0, 0x2030); break; case 0x10ec0888:
alc888_coef_init(codec); break;
} break;
}
}
EXPORT_SYMBOL_NS_GPL(alc_auto_init_amp, "SND_HDA_CODEC_REALTEK");
/* get a primary headphone pin if available */
hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
{ if (spec->gen.autocfg.hp_pins[0]) return spec->gen.autocfg.hp_pins[0]; if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT) return spec->gen.autocfg.line_out_pins[0]; return 0;
}
EXPORT_SYMBOL_NS_GPL(alc_get_hp_pin, "SND_HDA_CODEC_REALTEK");
/* * Realtek SSID verification
*/
/* Could be any non-zero and even value. When used as fixup, tells * the driver to ignore any present sku defines.
*/ #define ALC_FIXUP_SKU_IGNORE (2)
/* return the position of NID in the list, or -1 if not found */ staticint find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
{ int i; for (i = 0; i < nums; i++) if (list[i] == nid) return i; return -1;
} /* return true if the given NID is found in the list */ staticbool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
{ return find_idx_in_nid_list(nid, list, nums) >= 0;
}
/* check subsystem ID and set up device-specific initialization; * return 1 if initialized, 0 if invalid SSID
*/ /* 32-bit subsystem ID for BIOS loading in HD Audio codec. * 31 ~ 16 : Manufacture ID * 15 ~ 8 : SKU ID * 7 ~ 0 : Assembly ID * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
*/ int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
{ unsignedint ass, tmp, i; unsigned nid; struct alc_spec *spec = codec->spec;
if (spec->cdefine.fixup) {
ass = spec->cdefine.sku_cfg; if (ass == ALC_FIXUP_SKU_IGNORE) return 0; goto do_sku;
}
ass = codec->core.subsystem_id & 0xffff; if (codec->bus->pci &&
ass != codec->bus->pci->subsystem_device && (ass & 1)) goto do_sku;
/* invalid SSID, check the special NID pin defcfg instead */ /* * 31~30 : port connectivity * 29~21 : reserve * 20 : PCBEEP input * 19~16 : Check sum (15:1) * 15~1 : Custom * 0 : override
*/
nid = 0x1d; if (codec->core.vendor_id == 0x10ec0260)
nid = 0x17;
ass = snd_hda_codec_get_pincfg(codec, nid);
codec_dbg(codec, "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
ass, nid); if (!(ass & 1)) return 0; if ((ass >> 30) != 1) /* no physical connection */ return 0;
/* check sum */
tmp = 0; for (i = 1; i < 16; i++) { if ((ass >> i) & 1)
tmp++;
} if (((ass >> 16) & 0xf) != tmp) return 0;
do_sku:
codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
ass & 0xffff, codec->core.vendor_id); /* * 0 : override * 1 : Swap Jack * 2 : 0 --> Desktop, 1 --> Laptop * 3~5 : External Amplifier control * 7~6 : Reserved
*/
tmp = (ass & 0x38) >> 3; /* external Amp control */ if (spec->init_amp == ALC_INIT_UNDEFINED) { switch (tmp) { case 1:
alc_setup_gpio(codec, 0x01); break; case 3:
alc_setup_gpio(codec, 0x02); break; case 7:
alc_setup_gpio(codec, 0x04); break; case 5: default:
spec->init_amp = ALC_INIT_DEFAULT; break;
}
}
/* is laptop or Desktop and enable the function "Mute internal speaker * when the external headphone out jack is plugged"
*/ if (!(ass & 0x8000)) return 1; /* * 10~8 : Jack location * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered * 14~13: Resvered * 15 : 1 --> enable the function "Mute internal speaker * when the external headphone out jack is plugged"
*/ if (!alc_get_hp_pin(spec)) {
hda_nid_t nid;
tmp = (ass >> 11) & 0x3; /* HP to chassis */
nid = ports[tmp]; if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
spec->gen.autocfg.line_outs)) return 1;
spec->gen.autocfg.hp_pins[0] = nid;
} return 1;
}
EXPORT_SYMBOL_NS_GPL(alc_subsystem_id, "SND_HDA_CODEC_REALTEK");
/* Check the validity of ALC subsystem-id
* ports contains an array of 4 pin NIDs for port-A, E, D and I */ void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
{ if (!alc_subsystem_id(codec, ports)) { struct alc_spec *spec = codec->spec; if (spec->init_amp == ALC_INIT_UNDEFINED) {
codec_dbg(codec, "realtek: Enable default setup for auto mode as fallback\n");
spec->init_amp = ALC_INIT_DEFAULT;
}
}
}
EXPORT_SYMBOL_NS_GPL(alc_ssid_check, "SND_HDA_CODEC_REALTEK");
/* set up and create beep controls */ int alc_set_beep_amp(struct alc_spec *spec, hda_nid_t nid, int idx, int dir)
{ struct snd_kcontrol_new *knew; unsignedint beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir); int i;
for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
&alc_beep_mixer[i]); if (!knew) return -ENOMEM;
knew->private_value = beep_amp;
} return 0;
}
EXPORT_SYMBOL_NS_GPL(alc_set_beep_amp, "SND_HDA_CODEC_REALTEK");
/* parse the BIOS configuration and set up the alc_spec */ /* return 1 if successful, 0 if the proper config is not found, * or a negative error code
*/ int alc_parse_auto_config(struct hda_codec *codec, const hda_nid_t *ignore_nids, const hda_nid_t *ssid_nids)
{ struct alc_spec *spec = codec->spec; struct auto_pin_cfg *cfg = &spec->gen.autocfg; int err;
/* For dual-codec configuration, we need to disable some features to avoid * conflicts of kctls and PCM streams
*/ void alc_fixup_dual_codecs(struct hda_codec *codec, conststruct hda_fixup *fix, int action)
{ struct alc_spec *spec = codec->spec;
if (action != HDA_FIXUP_ACT_PRE_PROBE) return; /* disable vmaster */
spec->gen.suppress_vmaster = 1; /* auto-mute and auto-mic switch don't work with multiple codecs */
spec->gen.suppress_auto_mute = 1;
spec->gen.suppress_auto_mic = 1; /* disable aamix as well */
spec->gen.mixer_nid = 0; /* add location prefix to avoid conflicts */
codec->force_pin_prefix = 1;
}
EXPORT_SYMBOL_NS_GPL(alc_fixup_dual_codecs, "SND_HDA_CODEC_REALTEK");
switch (action) { case HDA_FIXUP_ACT_PRE_PROBE: /* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise * it causes a click noise at start up
*/
snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
spec->shutup = alc_shutup_dell_xps13; break; case HDA_FIXUP_ACT_PROBE: /* Make the internal mic the default input source. */ for (i = 0; i < imux->num_items; i++) { if (spec->gen.imux_pins[i] == 0x12) {
spec->gen.cur_mux[0] = i; break;
}
} break;
}
}
EXPORT_SYMBOL_NS_GPL(alc_fixup_dell_xps13, "SND_HDA_CODEC_REALTEK");
switch (codec->core.vendor_id) { case 0x10ec0255:
alc_process_coef_fw(codec, coef0255); break; case 0x10ec0230: case 0x10ec0236: case 0x10ec0256: case 0x19e58326:
alc_hp_mute_disable(codec, 75);
alc_process_coef_fw(codec, coef0256); break; case 0x10ec0234: case 0x10ec0274: case 0x10ec0294:
alc_process_coef_fw(codec, coef0274); break; case 0x10ec0233: case 0x10ec0283:
alc_process_coef_fw(codec, coef0233); break; case 0x10ec0286: case 0x10ec0288:
alc_process_coef_fw(codec, coef0288); break; case 0x10ec0298:
alc_process_coef_fw(codec, coef0298);
alc_process_coef_fw(codec, coef0288); break; case 0x10ec0292:
alc_process_coef_fw(codec, coef0292); break; case 0x10ec0293:
alc_process_coef_fw(codec, coef0293); break; case 0x10ec0668:
alc_process_coef_fw(codec, coef0668); break; case 0x10ec0215: case 0x10ec0225: case 0x10ec0285: case 0x10ec0295: case 0x10ec0289: case 0x10ec0299:
alc_hp_mute_disable(codec, 75);
alc_process_coef_fw(codec, alc225_pre_hsmode);
alc_process_coef_fw(codec, coef0225); break; case 0x10ec0867:
alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0); break;
}
codec_dbg(codec, "Headset jack set to unplugged mode.\n");
}
switch (codec->core.vendor_id) { case 0x10ec0215: case 0x10ec0225: case 0x10ec0285: case 0x10ec0295: case 0x10ec0289: case 0x10ec0299:
alc_process_coef_fw(codec, alc225_pre_hsmode);
alc_process_coef_fw(codec, coef0225);
alc_hp_enable_unmute(codec, 75); break; case 0x10ec0255:
alc_process_coef_fw(codec, coef0255); break; case 0x10ec0230: case 0x10ec0236: case 0x10ec0256: case 0x19e58326:
alc_write_coef_idx(codec, 0x1b, 0x0e4b);
alc_write_coef_idx(codec, 0x45, 0xc089);
msleep(50);
alc_process_coef_fw(codec, coef0256);
alc_hp_enable_unmute(codec, 75); break; case 0x10ec0234: case 0x10ec0274: case 0x10ec0294:
alc_process_coef_fw(codec, coef0274); break; case 0x10ec0233: case 0x10ec0283:
alc_process_coef_fw(codec, coef0233); break; case 0x10ec0286: case 0x10ec0288: case 0x10ec0298:
alc_process_coef_fw(codec, coef0288); break; case 0x10ec0292:
alc_process_coef_fw(codec, coef0292); break; case 0x10ec0293:
alc_process_coef_fw(codec, coef0293); break; case 0x10ec0668:
alc_process_coef_fw(codec, coef0688); break; case 0x10ec0867:
alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0); break;
}
codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
}
/* Iphone type */ staticvoid alc_headset_mode_ctia(struct hda_codec *codec)
{ int val;
switch (codec->core.vendor_id) { case 0x10ec0255:
alc_process_coef_fw(codec, coef0255); break; case 0x10ec0230: case 0x10ec0236: case 0x10ec0256: case 0x19e58326:
alc_process_coef_fw(codec, coef0256);
alc_hp_enable_unmute(codec, 75); break; case 0x10ec0234: case 0x10ec0274: case 0x10ec0294:
alc_write_coef_idx(codec, 0x45, 0xd689); break; case 0x10ec0233: case 0x10ec0283:
alc_process_coef_fw(codec, coef0233); break; case 0x10ec0298:
val = alc_read_coef_idx(codec, 0x50); if (val & (1 << 12)) {
alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
msleep(300);
} else {
alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
msleep(300);
} break; case 0x10ec0286: case 0x10ec0288:
alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
msleep(300);
alc_process_coef_fw(codec, coef0288); break; case 0x10ec0292:
alc_process_coef_fw(codec, coef0292); break; case 0x10ec0293:
alc_process_coef_fw(codec, coef0293); break; case 0x10ec0668:
alc_process_coef_fw(codec, coef0688); break; case 0x10ec0215: case 0x10ec0225: case 0x10ec0285: case 0x10ec0295: case 0x10ec0289: case 0x10ec0299:
val = alc_read_coef_idx(codec, 0x45); if (val & (1 << 9))
alc_process_coef_fw(codec, coef0225_2); else
alc_process_coef_fw(codec, coef0225_1);
alc_hp_enable_unmute(codec, 75); break; case 0x10ec0867:
alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0); break;
}
codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
}
switch (codec->core.vendor_id) { case 0x10ec0255:
alc_process_coef_fw(codec, coef0255); break; case 0x10ec0230: case 0x10ec0236: case 0x10ec0256: case 0x19e58326:
alc_process_coef_fw(codec, coef0256);
alc_hp_enable_unmute(codec, 75); break; case 0x10ec0234: case 0x10ec0274: case 0x10ec0294:
alc_write_coef_idx(codec, 0x45, 0xe689); break; case 0x10ec0233: case 0x10ec0283:
alc_process_coef_fw(codec, coef0233); break; case 0x10ec0298:
alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
msleep(300); break; case 0x10ec0286: case 0x10ec0288:
alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
msleep(300);
alc_process_coef_fw(codec, coef0288); break; case 0x10ec0292:
alc_process_coef_fw(codec, coef0292); break; case 0x10ec0293:
alc_process_coef_fw(codec, coef0293); break; case 0x10ec0668:
alc_process_coef_fw(codec, coef0688); break; case 0x10ec0215: case 0x10ec0225: case 0x10ec0285: case 0x10ec0295: case 0x10ec0289: case 0x10ec0299:
alc_process_coef_fw(codec, coef0225);
alc_hp_enable_unmute(codec, 75); break;
}
codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
}
/* Find mic pins */ for (i = 0; i < cfg->num_inputs; i++) { if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
spec->headset_mic_pin = cfg->inputs[i].pin; if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
spec->headphone_mic_pin = cfg->inputs[i].pin;
}
if (action == HDA_FIXUP_ACT_PRE_PROBE)
spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
}
EXPORT_SYMBOL_NS_GPL(alc_fixup_headset_mic, "SND_HDA_CODEC_REALTEK");
/* update LED status via GPIO */ void alc_update_gpio_led(struct hda_codec *codec, unsignedint mask, int polarity, bool enabled)
{ if (polarity)
enabled = !enabled;
alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
}
EXPORT_SYMBOL_NS_GPL(alc_update_gpio_led, "SND_HDA_CODEC_REALTEK");
/* turn on/off mic-mute LED via GPIO per capture hook */ staticint micmute_led_set(struct led_classdev *led_cdev, enum led_brightness brightness)
{ struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent); struct alc_spec *spec = codec->spec;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.