Commit 6de15b2a authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'topic/hda' into for-linus

parents 775b2449 8a390576
snd-hda-intel-objs := hda_intel.o snd-hda-intel-objs := hda_intel.o
snd-hda-codec-y := hda_codec.o hda_jack.o snd-hda-codec-y := hda_codec.o hda_jack.o hda_auto_parser.o
snd-hda-codec-$(CONFIG_SND_HDA_GENERIC) += hda_generic.o snd-hda-codec-$(CONFIG_SND_HDA_GENERIC) += hda_generic.o
snd-hda-codec-$(CONFIG_PROC_FS) += hda_proc.o snd-hda-codec-$(CONFIG_PROC_FS) += hda_proc.o
snd-hda-codec-$(CONFIG_SND_HDA_HWDEP) += hda_hwdep.o snd-hda-codec-$(CONFIG_SND_HDA_HWDEP) += hda_hwdep.o
......
This diff is collapsed.
/*
* BIOS auto-parser helper functions for HD-audio
*
* Copyright (c) 2012 Takashi Iwai <tiwai@suse.de>
*
* This driver is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
#ifndef __SOUND_HDA_AUTO_PARSER_H
#define __SOUND_HDA_AUTO_PARSER_H
/*
* Helper for automatic pin configuration
*/
enum {
AUTO_PIN_MIC,
AUTO_PIN_LINE_IN,
AUTO_PIN_CD,
AUTO_PIN_AUX,
AUTO_PIN_LAST
};
enum {
AUTO_PIN_LINE_OUT,
AUTO_PIN_SPEAKER_OUT,
AUTO_PIN_HP_OUT
};
#define AUTO_CFG_MAX_OUTS HDA_MAX_OUTS
#define AUTO_CFG_MAX_INS 8
struct auto_pin_cfg_item {
hda_nid_t pin;
int type;
};
struct auto_pin_cfg;
const char *hda_get_autocfg_input_label(struct hda_codec *codec,
const struct auto_pin_cfg *cfg,
int input);
int snd_hda_get_pin_label(struct hda_codec *codec, hda_nid_t nid,
const struct auto_pin_cfg *cfg,
char *label, int maxlen, int *indexp);
enum {
INPUT_PIN_ATTR_UNUSED, /* pin not connected */
INPUT_PIN_ATTR_INT, /* internal mic/line-in */
INPUT_PIN_ATTR_DOCK, /* docking mic/line-in */
INPUT_PIN_ATTR_NORMAL, /* mic/line-in jack */
INPUT_PIN_ATTR_FRONT, /* mic/line-in jack in front */
INPUT_PIN_ATTR_REAR, /* mic/line-in jack in rear */
};
int snd_hda_get_input_pin_attr(unsigned int def_conf);
struct auto_pin_cfg {
int line_outs;
/* sorted in the order of Front/Surr/CLFE/Side */
hda_nid_t line_out_pins[AUTO_CFG_MAX_OUTS];
int speaker_outs;
hda_nid_t speaker_pins[AUTO_CFG_MAX_OUTS];
int hp_outs;
int line_out_type; /* AUTO_PIN_XXX_OUT */
hda_nid_t hp_pins[AUTO_CFG_MAX_OUTS];
int num_inputs;
struct auto_pin_cfg_item inputs[AUTO_CFG_MAX_INS];
int dig_outs;
hda_nid_t dig_out_pins[2];
hda_nid_t dig_in_pin;
hda_nid_t mono_out_pin;
int dig_out_type[2]; /* HDA_PCM_TYPE_XXX */
int dig_in_type; /* HDA_PCM_TYPE_XXX */
};
/* bit-flags for snd_hda_parse_pin_def_config() behavior */
#define HDA_PINCFG_NO_HP_FIXUP (1 << 0) /* no HP-split */
#define HDA_PINCFG_NO_LO_FIXUP (1 << 1) /* don't take other outs as LO */
int snd_hda_parse_pin_defcfg(struct hda_codec *codec,
struct auto_pin_cfg *cfg,
const hda_nid_t *ignore_nids,
unsigned int cond_flags);
/* older function */
#define snd_hda_parse_pin_def_config(codec, cfg, ignore) \
snd_hda_parse_pin_defcfg(codec, cfg, ignore, 0)
/*
*/
struct hda_gen_spec {
/* fix-up list */
int fixup_id;
const struct hda_fixup *fixup_list;
const char *fixup_name;
/* additional init verbs */
struct snd_array verbs;
};
/*
* Fix-up pin default configurations and add default verbs
*/
struct hda_pintbl {
hda_nid_t nid;
u32 val;
};
struct hda_model_fixup {
const int id;
const char *name;
};
struct hda_fixup {
int type;
bool chained;
int chain_id;
union {
const struct hda_pintbl *pins;
const struct hda_verb *verbs;
void (*func)(struct hda_codec *codec,
const struct hda_fixup *fix,
int action);
} v;
};
/* fixup types */
enum {
HDA_FIXUP_INVALID,
HDA_FIXUP_PINS,
HDA_FIXUP_VERBS,
HDA_FIXUP_FUNC,
};
/* fixup action definitions */
enum {
HDA_FIXUP_ACT_PRE_PROBE,
HDA_FIXUP_ACT_PROBE,
HDA_FIXUP_ACT_INIT,
HDA_FIXUP_ACT_BUILD,
};
int snd_hda_gen_add_verbs(struct hda_gen_spec *spec,
const struct hda_verb *list);
void snd_hda_gen_apply_verbs(struct hda_codec *codec);
void snd_hda_apply_pincfgs(struct hda_codec *codec,
const struct hda_pintbl *cfg);
void snd_hda_apply_fixup(struct hda_codec *codec, int action);
void snd_hda_pick_fixup(struct hda_codec *codec,
const struct hda_model_fixup *models,
const struct snd_pci_quirk *quirk,
const struct hda_fixup *fixlist);
#endif /* __SOUND_HDA_AUTO_PARSER_H */
This diff is collapsed.
...@@ -704,8 +704,6 @@ struct hda_codec_ops { ...@@ -704,8 +704,6 @@ struct hda_codec_ops {
unsigned int power_state); unsigned int power_state);
#ifdef CONFIG_PM #ifdef CONFIG_PM
int (*suspend)(struct hda_codec *codec, pm_message_t state); int (*suspend)(struct hda_codec *codec, pm_message_t state);
int (*post_suspend)(struct hda_codec *codec);
int (*pre_resume)(struct hda_codec *codec);
int (*resume)(struct hda_codec *codec); int (*resume)(struct hda_codec *codec);
#endif #endif
#ifdef CONFIG_SND_HDA_POWER_SAVE #ifdef CONFIG_SND_HDA_POWER_SAVE
...@@ -829,6 +827,7 @@ struct hda_codec { ...@@ -829,6 +827,7 @@ struct hda_codec {
struct mutex spdif_mutex; struct mutex spdif_mutex;
struct mutex control_mutex; struct mutex control_mutex;
struct mutex hash_mutex;
struct snd_array spdif_out; struct snd_array spdif_out;
unsigned int spdif_in_enable; /* SPDIF input enable? */ unsigned int spdif_in_enable; /* SPDIF input enable? */
const hda_nid_t *slave_dig_outs; /* optional digital out slave widgets */ const hda_nid_t *slave_dig_outs; /* optional digital out slave widgets */
...@@ -861,12 +860,13 @@ struct hda_codec { ...@@ -861,12 +860,13 @@ struct hda_codec {
unsigned int no_jack_detect:1; /* Machine has no jack-detection */ unsigned int no_jack_detect:1; /* Machine has no jack-detection */
#ifdef CONFIG_SND_HDA_POWER_SAVE #ifdef CONFIG_SND_HDA_POWER_SAVE
unsigned int power_on :1; /* current (global) power-state */ unsigned int power_on :1; /* current (global) power-state */
unsigned int power_transition :1; /* power-state in transition */ int power_transition; /* power-state in transition */
int power_count; /* current (global) power refcount */ int power_count; /* current (global) power refcount */
struct delayed_work power_work; /* delayed task for powerdown */ struct delayed_work power_work; /* delayed task for powerdown */
unsigned long power_on_acct; unsigned long power_on_acct;
unsigned long power_off_acct; unsigned long power_off_acct;
unsigned long power_jiffies; unsigned long power_jiffies;
spinlock_t power_lock;
#endif #endif
/* codec-specific additional proc output */ /* codec-specific additional proc output */
...@@ -911,10 +911,13 @@ int snd_hda_get_sub_nodes(struct hda_codec *codec, hda_nid_t nid, ...@@ -911,10 +911,13 @@ int snd_hda_get_sub_nodes(struct hda_codec *codec, hda_nid_t nid,
hda_nid_t *start_id); hda_nid_t *start_id);
int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid, int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid,
hda_nid_t *conn_list, int max_conns); hda_nid_t *conn_list, int max_conns);
static inline int
snd_hda_get_num_conns(struct hda_codec *codec, hda_nid_t nid)
{
return snd_hda_get_connections(codec, nid, NULL, 0);
}
int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid, int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid,
hda_nid_t *conn_list, int max_conns); hda_nid_t *conn_list, int max_conns);
int snd_hda_get_conn_list(struct hda_codec *codec, hda_nid_t nid,
const hda_nid_t **listp);
int snd_hda_override_conn_list(struct hda_codec *codec, hda_nid_t nid, int nums, int snd_hda_override_conn_list(struct hda_codec *codec, hda_nid_t nid, int nums,
const hda_nid_t *list); const hda_nid_t *list);
int snd_hda_get_conn_index(struct hda_codec *codec, hda_nid_t mux, int snd_hda_get_conn_index(struct hda_codec *codec, hda_nid_t mux,
...@@ -1051,12 +1054,10 @@ const char *snd_hda_get_jack_location(u32 cfg); ...@@ -1051,12 +1054,10 @@ const char *snd_hda_get_jack_location(u32 cfg);
#ifdef CONFIG_SND_HDA_POWER_SAVE #ifdef CONFIG_SND_HDA_POWER_SAVE
void snd_hda_power_up(struct hda_codec *codec); void snd_hda_power_up(struct hda_codec *codec);
void snd_hda_power_down(struct hda_codec *codec); void snd_hda_power_down(struct hda_codec *codec);
#define snd_hda_codec_needs_resume(codec) codec->power_count
void snd_hda_update_power_acct(struct hda_codec *codec); void snd_hda_update_power_acct(struct hda_codec *codec);
#else #else
static inline void snd_hda_power_up(struct hda_codec *codec) {} static inline void snd_hda_power_up(struct hda_codec *codec) {}
static inline void snd_hda_power_down(struct hda_codec *codec) {} static inline void snd_hda_power_down(struct hda_codec *codec) {}
#define snd_hda_codec_needs_resume(codec) 1
#endif #endif
#ifdef CONFIG_SND_HDA_PATCH_LOADER #ifdef CONFIG_SND_HDA_PATCH_LOADER
......
...@@ -497,6 +497,7 @@ enum { ...@@ -497,6 +497,7 @@ enum {
AZX_DRIVER_NVIDIA, AZX_DRIVER_NVIDIA,
AZX_DRIVER_TERA, AZX_DRIVER_TERA,
AZX_DRIVER_CTX, AZX_DRIVER_CTX,
AZX_DRIVER_CTHDA,
AZX_DRIVER_GENERIC, AZX_DRIVER_GENERIC,
AZX_NUM_DRIVERS, /* keep this as last entry */ AZX_NUM_DRIVERS, /* keep this as last entry */
}; };
...@@ -518,6 +519,7 @@ enum { ...@@ -518,6 +519,7 @@ enum {
#define AZX_DCAPS_OLD_SSYNC (1 << 20) /* Old SSYNC reg for ICH */ #define AZX_DCAPS_OLD_SSYNC (1 << 20) /* Old SSYNC reg for ICH */
#define AZX_DCAPS_BUFSIZE (1 << 21) /* no buffer size alignment */ #define AZX_DCAPS_BUFSIZE (1 << 21) /* no buffer size alignment */
#define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */ #define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */
#define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */
/* quirks for ATI SB / AMD Hudson */ /* quirks for ATI SB / AMD Hudson */
#define AZX_DCAPS_PRESET_ATI_SB \ #define AZX_DCAPS_PRESET_ATI_SB \
...@@ -533,6 +535,9 @@ enum { ...@@ -533,6 +535,9 @@ enum {
(AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\ (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\
AZX_DCAPS_ALIGN_BUFSIZE) AZX_DCAPS_ALIGN_BUFSIZE)
#define AZX_DCAPS_PRESET_CTHDA \
(AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY)
static char *driver_short_names[] __devinitdata = { static char *driver_short_names[] __devinitdata = {
[AZX_DRIVER_ICH] = "HDA Intel", [AZX_DRIVER_ICH] = "HDA Intel",
[AZX_DRIVER_PCH] = "HDA Intel PCH", [AZX_DRIVER_PCH] = "HDA Intel PCH",
...@@ -546,6 +551,7 @@ static char *driver_short_names[] __devinitdata = { ...@@ -546,6 +551,7 @@ static char *driver_short_names[] __devinitdata = {
[AZX_DRIVER_NVIDIA] = "HDA NVidia", [AZX_DRIVER_NVIDIA] = "HDA NVidia",
[AZX_DRIVER_TERA] = "HDA Teradici", [AZX_DRIVER_TERA] = "HDA Teradici",
[AZX_DRIVER_CTX] = "HDA Creative", [AZX_DRIVER_CTX] = "HDA Creative",
[AZX_DRIVER_CTHDA] = "HDA Creative",
[AZX_DRIVER_GENERIC] = "HD-Audio Generic", [AZX_DRIVER_GENERIC] = "HD-Audio Generic",
}; };
...@@ -1285,7 +1291,8 @@ static irqreturn_t azx_interrupt(int irq, void *dev_id) ...@@ -1285,7 +1291,8 @@ static irqreturn_t azx_interrupt(int irq, void *dev_id)
/* /*
* set up a BDL entry * set up a BDL entry
*/ */
static int setup_bdle(struct snd_pcm_substream *substream, static int setup_bdle(struct azx *chip,
struct snd_pcm_substream *substream,
struct azx_dev *azx_dev, u32 **bdlp, struct azx_dev *azx_dev, u32 **bdlp,
int ofs, int size, int with_ioc) int ofs, int size, int with_ioc)
{ {
...@@ -1304,6 +1311,12 @@ static int setup_bdle(struct snd_pcm_substream *substream, ...@@ -1304,6 +1311,12 @@ static int setup_bdle(struct snd_pcm_substream *substream,
bdl[1] = cpu_to_le32(upper_32_bits(addr)); bdl[1] = cpu_to_le32(upper_32_bits(addr));
/* program the size field of the BDL entry */ /* program the size field of the BDL entry */
chunk = snd_pcm_sgbuf_get_chunk_size(substream, ofs, size); chunk = snd_pcm_sgbuf_get_chunk_size(substream, ofs, size);
/* one BDLE cannot cross 4K boundary on CTHDA chips */
if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY) {
u32 remain = 0x1000 - (ofs & 0xfff);
if (chunk > remain)
chunk = remain;
}
bdl[2] = cpu_to_le32(chunk); bdl[2] = cpu_to_le32(chunk);
/* program the IOC to enable interrupt /* program the IOC to enable interrupt
* only when the whole fragment is processed * only when the whole fragment is processed
...@@ -1356,7 +1369,7 @@ static int azx_setup_periods(struct azx *chip, ...@@ -1356,7 +1369,7 @@ static int azx_setup_periods(struct azx *chip,
bdl_pos_adj[chip->dev_index]); bdl_pos_adj[chip->dev_index]);
pos_adj = 0; pos_adj = 0;
} else { } else {
ofs = setup_bdle(substream, azx_dev, ofs = setup_bdle(chip, substream, azx_dev,
&bdl, ofs, pos_adj, &bdl, ofs, pos_adj,
!substream->runtime->no_period_wakeup); !substream->runtime->no_period_wakeup);
if (ofs < 0) if (ofs < 0)
...@@ -1366,10 +1379,10 @@ static int azx_setup_periods(struct azx *chip, ...@@ -1366,10 +1379,10 @@ static int azx_setup_periods(struct azx *chip,
pos_adj = 0; pos_adj = 0;
for (i = 0; i < periods; i++) { for (i = 0; i < periods; i++) {
if (i == periods - 1 && pos_adj) if (i == periods - 1 && pos_adj)
ofs = setup_bdle(substream, azx_dev, &bdl, ofs, ofs = setup_bdle(chip, substream, azx_dev, &bdl, ofs,
period_bytes - pos_adj, 0); period_bytes - pos_adj, 0);
else else
ofs = setup_bdle(substream, azx_dev, &bdl, ofs, ofs = setup_bdle(chip, substream, azx_dev, &bdl, ofs,
period_bytes, period_bytes,
!substream->runtime->no_period_wakeup); !substream->runtime->no_period_wakeup);
if (ofs < 0) if (ofs < 0)
...@@ -2353,17 +2366,6 @@ static void azx_power_notify(struct hda_bus *bus) ...@@ -2353,17 +2366,6 @@ static void azx_power_notify(struct hda_bus *bus)
* power management * power management
*/ */
static int snd_hda_codecs_inuse(struct hda_bus *bus)
{
struct hda_codec *codec;
list_for_each_entry(codec, &bus->codec_list, list) {
if (snd_hda_codec_needs_resume(codec))
return 1;
}
return 0;
}
static int azx_suspend(struct pci_dev *pci, pm_message_t state) static int azx_suspend(struct pci_dev *pci, pm_message_t state)
{ {
struct snd_card *card = pci_get_drvdata(pci); struct snd_card *card = pci_get_drvdata(pci);
...@@ -2410,8 +2412,7 @@ static int azx_resume(struct pci_dev *pci) ...@@ -2410,8 +2412,7 @@ static int azx_resume(struct pci_dev *pci)
return -EIO; return -EIO;
azx_init_pci(chip); azx_init_pci(chip);
if (snd_hda_codecs_inuse(chip->bus)) azx_init_chip(chip, 1);
azx_init_chip(chip, 1);
snd_hda_resume(chip->bus); snd_hda_resume(chip->bus);
snd_power_change_state(card, SNDRV_CTL_POWER_D0); snd_power_change_state(card, SNDRV_CTL_POWER_D0);
...@@ -3130,6 +3131,11 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { ...@@ -3130,6 +3131,11 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
.driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND | .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB }, AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
#endif #endif
/* CTHDA chips */
{ PCI_DEVICE(0x1102, 0x0010),
.driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
{ PCI_DEVICE(0x1102, 0x0012),
.driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
/* Vortex86MX */ /* Vortex86MX */
{ PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC }, { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
/* VMware HDAudio */ /* VMware HDAudio */
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <sound/jack.h> #include <sound/jack.h>
#include "hda_codec.h" #include "hda_codec.h"
#include "hda_local.h" #include "hda_local.h"
#include "hda_auto_parser.h"
#include "hda_jack.h" #include "hda_jack.h"
bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid) bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid)
......
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
#ifndef __SOUND_HDA_JACK_H #ifndef __SOUND_HDA_JACK_H
#define __SOUND_HDA_JACK_H #define __SOUND_HDA_JACK_H
struct auto_pin_cfg;
struct hda_jack_tbl { struct hda_jack_tbl {
hda_nid_t nid; hda_nid_t nid;
unsigned char action; /* event action (0 = none) */ unsigned char action; /* event action (0 = none) */
......
...@@ -262,6 +262,8 @@ int snd_hda_input_mux_put(struct hda_codec *codec, ...@@ -262,6 +262,8 @@ int snd_hda_input_mux_put(struct hda_codec *codec,
const struct hda_input_mux *imux, const struct hda_input_mux *imux,
struct snd_ctl_elem_value *ucontrol, hda_nid_t nid, struct snd_ctl_elem_value *ucontrol, hda_nid_t nid,
unsigned int *cur_val); unsigned int *cur_val);
int snd_hda_add_imux_item(struct hda_input_mux *imux, const char *label,
int index, int *type_index_ret);
/* /*
* Channel mode helper * Channel mode helper
...@@ -393,72 +395,7 @@ struct hda_bus_unsolicited { ...@@ -393,72 +395,7 @@ struct hda_bus_unsolicited {
struct hda_bus *bus; struct hda_bus *bus;
}; };
/* /* helper macros to retrieve pin default-config values */
* Helper for automatic pin configuration
*/
enum {
AUTO_PIN_MIC,
AUTO_PIN_LINE_IN,
AUTO_PIN_CD,
AUTO_PIN_AUX,
AUTO_PIN_LAST
};
enum {
AUTO_PIN_LINE_OUT,
AUTO_PIN_SPEAKER_OUT,
AUTO_PIN_HP_OUT
};
#define AUTO_CFG_MAX_OUTS HDA_MAX_OUTS
#define AUTO_CFG_MAX_INS 8
struct auto_pin_cfg_item {
hda_nid_t pin;
int type;
};
struct auto_pin_cfg;
const char *hda_get_autocfg_input_label(struct hda_codec *codec,
const struct auto_pin_cfg *cfg,
int input);
int snd_hda_get_pin_label(struct hda_codec *codec, hda_nid_t nid,
const struct auto_pin_cfg *cfg,
char *label, int maxlen, int *indexp);
int snd_hda_add_imux_item(struct hda_input_mux *imux, const char *label,
int index, int *type_index_ret);
enum {
INPUT_PIN_ATTR_UNUSED, /* pin not connected */
INPUT_PIN_ATTR_INT, /* internal mic/line-in */
INPUT_PIN_ATTR_DOCK, /* docking mic/line-in */
INPUT_PIN_ATTR_NORMAL, /* mic/line-in jack */
INPUT_PIN_ATTR_FRONT, /* mic/line-in jack in front */
INPUT_PIN_ATTR_REAR, /* mic/line-in jack in rear */
};
int snd_hda_get_input_pin_attr(unsigned int def_conf);
struct auto_pin_cfg {
int line_outs;
/* sorted in the order of Front/Surr/CLFE/Side */
hda_nid_t line_out_pins[AUTO_CFG_MAX_OUTS];
int speaker_outs;
hda_nid_t speaker_pins[AUTO_CFG_MAX_OUTS];
int hp_outs;
int line_out_type; /* AUTO_PIN_XXX_OUT */
hda_nid_t hp_pins[AUTO_CFG_MAX_OUTS];
int num_inputs;
struct auto_pin_cfg_item inputs[AUTO_CFG_MAX_INS];
int dig_outs;
hda_nid_t dig_out_pins[2];
hda_nid_t dig_in_pin;
hda_nid_t mono_out_pin;
int dig_out_type[2]; /* HDA_PCM_TYPE_XXX */
int dig_in_type; /* HDA_PCM_TYPE_XXX */
};
#define get_defcfg_connect(cfg) \ #define get_defcfg_connect(cfg) \
((cfg & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT) ((cfg & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT)
#define get_defcfg_association(cfg) \ #define get_defcfg_association(cfg) \
...@@ -472,19 +409,6 @@ struct auto_pin_cfg { ...@@ -472,19 +409,6 @@ struct auto_pin_cfg {
#define get_defcfg_misc(cfg) \ #define get_defcfg_misc(cfg) \
((cfg & AC_DEFCFG_MISC) >> AC_DEFCFG_MISC_SHIFT) ((cfg & AC_DEFCFG_MISC) >> AC_DEFCFG_MISC_SHIFT)
/* bit-flags for snd_hda_parse_pin_def_config() behavior */
#define HDA_PINCFG_NO_HP_FIXUP (1 << 0) /* no HP-split */
#define HDA_PINCFG_NO_LO_FIXUP (1 << 1) /* don't take other outs as LO */
int snd_hda_parse_pin_defcfg(struct hda_codec *codec,
struct auto_pin_cfg *cfg,
const hda_nid_t *ignore_nids,
unsigned int cond_flags);
/* older function */
#define snd_hda_parse_pin_def_config(codec, cfg, ignore) \
snd_hda_parse_pin_defcfg(codec, cfg, ignore, 0)
/* amp values */ /* amp values */
#define AMP_IN_MUTE(idx) (0x7080 | ((idx)<<8)) #define AMP_IN_MUTE(idx) (0x7080 | ((idx)<<8))
#define AMP_IN_UNMUTE(idx) (0x7000 | ((idx)<<8)) #define AMP_IN_UNMUTE(idx) (0x7000 | ((idx)<<8))
...@@ -502,6 +426,46 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec, ...@@ -502,6 +426,46 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec,
#define PIN_HP (AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN) #define PIN_HP (AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN)
#define PIN_HP_AMP (AC_PINCTL_HP_EN) #define PIN_HP_AMP (AC_PINCTL_HP_EN)
unsigned int snd_hda_get_default_vref(struct hda_codec *codec, hda_nid_t pin);
int _snd_hda_set_pin_ctl(struct hda_codec *codec, hda_nid_t pin,
unsigned int val, bool cached);
/**
* _snd_hda_set_pin_ctl - Set a pin-control value safely
* @codec: the codec instance
* @pin: the pin NID to set the control
* @val: the pin-control value (AC_PINCTL_* bits)
*
* This function sets the pin-control value to the given pin, but
* filters out the invalid pin-control bits when the pin has no such
* capabilities. For example, when PIN_HP is passed but the pin has no
* HP-drive capability, the HP bit is omitted.
*
* The function doesn't check the input VREF capability bits, though.
* Use snd_hda_get_default_vref() to guess the right value.
* Also, this function is only for analog pins, not for HDMI pins.
*/
static inline int
snd_hda_set_pin_ctl(struct hda_codec *codec, hda_nid_t pin, unsigned int val)
{
return _snd_hda_set_pin_ctl(codec, pin, val, false);
}
/**
* snd_hda_set_pin_ctl_cache - Set a pin-control value safely
* @codec: the codec instance
* @pin: the pin NID to set the control
* @val: the pin-control value (AC_PINCTL_* bits)
*
* Just like snd_hda_set_pin_ctl() but write to cache as well.
*/
static inline int
snd_hda_set_pin_ctl_cache(struct hda_codec *codec, hda_nid_t pin,
unsigned int val)
{
return _snd_hda_set_pin_ctl(codec, pin, val, true);
}
/* /*
* get widget capabilities * get widget capabilities
*/ */
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <sound/core.h> #include <sound/core.h>
#include "hda_codec.h" #include "hda_codec.h"
#include "hda_local.h" #include "hda_local.h"
#include "hda_auto_parser.h"
#include "hda_beep.h" #include "hda_beep.h"
#include "hda_jack.h" #include "hda_jack.h"
...@@ -1742,9 +1743,7 @@ static int ad1981_hp_master_sw_put(struct snd_kcontrol *kcontrol, ...@@ -1742,9 +1743,7 @@ static int ad1981_hp_master_sw_put(struct snd_kcontrol *kcontrol,
if (! ad198x_eapd_put(kcontrol, ucontrol)) if (! ad198x_eapd_put(kcontrol, ucontrol))
return 0; return 0;
/* change speaker pin appropriately */ /* change speaker pin appropriately */
snd_hda_codec_write(codec, 0x05, 0, snd_hda_set_pin_ctl(codec, 0x05, spec->cur_eapd ? PIN_OUT : 0);
AC_VERB_SET_PIN_WIDGET_CONTROL,
spec->cur_eapd ? PIN_OUT : 0);
/* toggle HP mute appropriately */ /* toggle HP mute appropriately */
snd_hda_codec_amp_stereo(codec, 0x06, HDA_OUTPUT, 0, snd_hda_codec_amp_stereo(codec, 0x06, HDA_OUTPUT, 0,
HDA_AMP_MUTE, HDA_AMP_MUTE,
...@@ -3103,7 +3102,7 @@ static void ad1988_auto_set_output_and_unmute(struct hda_codec *codec, ...@@ -3103,7 +3102,7 @@ static void ad1988_auto_set_output_and_unmute(struct hda_codec *codec,
int dac_idx) int dac_idx)
{ {
/* set as output */ /* set as output */
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type); snd_hda_set_pin_ctl(codec, nid, pin_type);
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE); snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
switch (nid) { switch (nid) {
case 0x11: /* port-A - DAC 03 */ case 0x11: /* port-A - DAC 03 */
...@@ -3157,6 +3156,7 @@ static void ad1988_auto_init_analog_input(struct hda_codec *codec) ...@@ -3157,6 +3156,7 @@ static void ad1988_auto_init_analog_input(struct hda_codec *codec)
for (i = 0; i < cfg->num_inputs; i++) { for (i = 0; i < cfg->num_inputs; i++) {
hda_nid_t nid = cfg->inputs[i].pin; hda_nid_t nid = cfg->inputs[i].pin;
int type = cfg->inputs[i].type; int type = cfg->inputs[i].type;
int val;
switch (nid) { switch (nid) {
case 0x15: /* port-C */ case 0x15: /* port-C */
snd_hda_codec_write(codec, 0x33, 0, AC_VERB_SET_CONNECT_SEL, 0x0); snd_hda_codec_write(codec, 0x33, 0, AC_VERB_SET_CONNECT_SEL, 0x0);
...@@ -3165,8 +3165,10 @@ static void ad1988_auto_init_analog_input(struct hda_codec *codec) ...@@ -3165,8 +3165,10 @@ static void ad1988_auto_init_analog_input(struct hda_codec *codec)
snd_hda_codec_write(codec, 0x34, 0, AC_VERB_SET_CONNECT_SEL, 0x0); snd_hda_codec_write(codec, 0x34, 0, AC_VERB_SET_CONNECT_SEL, 0x0);
break; break;
} }
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val = PIN_IN;
type == AUTO_PIN_MIC ? PIN_VREF80 : PIN_IN); if (type == AUTO_PIN_MIC)
val |= snd_hda_get_default_vref(codec, nid);
snd_hda_set_pin_ctl(codec, nid, val);
if (nid != AD1988_PIN_CD_NID) if (nid != AD1988_PIN_CD_NID)
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
AMP_OUT_MUTE); AMP_OUT_MUTE);
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <sound/core.h> #include <sound/core.h>
#include "hda_codec.h" #include "hda_codec.h"
#include "hda_local.h" #include "hda_local.h"
#include "hda_auto_parser.h"
/* /*
*/ */
...@@ -341,8 +342,7 @@ static int ca0110_build_pcms(struct hda_codec *codec) ...@@ -341,8 +342,7 @@ static int ca0110_build_pcms(struct hda_codec *codec)
static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac) static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac)
{ {
if (pin) { if (pin) {
snd_hda_codec_write(codec, pin, 0, snd_hda_set_pin_ctl(codec, pin, PIN_HP);
AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
if (get_wcaps(codec, pin) & AC_WCAP_OUT_AMP) if (get_wcaps(codec, pin) & AC_WCAP_OUT_AMP)
snd_hda_codec_write(codec, pin, 0, snd_hda_codec_write(codec, pin, 0,
AC_VERB_SET_AMP_GAIN_MUTE, AC_VERB_SET_AMP_GAIN_MUTE,
...@@ -356,8 +356,8 @@ static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac) ...@@ -356,8 +356,8 @@ static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac)
static void init_input(struct hda_codec *codec, hda_nid_t pin, hda_nid_t adc) static void init_input(struct hda_codec *codec, hda_nid_t pin, hda_nid_t adc)
{ {
if (pin) { if (pin) {
snd_hda_codec_write(codec, pin, 0, snd_hda_set_pin_ctl(codec, pin, PIN_IN |
AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80); snd_hda_get_default_vref(codec, pin));
if (get_wcaps(codec, pin) & AC_WCAP_IN_AMP) if (get_wcaps(codec, pin) & AC_WCAP_IN_AMP)
snd_hda_codec_write(codec, pin, 0, snd_hda_codec_write(codec, pin, 0,
AC_VERB_SET_AMP_GAIN_MUTE, AC_VERB_SET_AMP_GAIN_MUTE,
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <sound/core.h> #include <sound/core.h>
#include "hda_codec.h" #include "hda_codec.h"
#include "hda_local.h" #include "hda_local.h"
#include "hda_auto_parser.h"
#define WIDGET_CHIP_CTRL 0x15 #define WIDGET_CHIP_CTRL 0x15
#define WIDGET_DSP_CTRL 0x16 #define WIDGET_DSP_CTRL 0x16
...@@ -239,8 +240,7 @@ enum get_set { ...@@ -239,8 +240,7 @@ enum get_set {
static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac) static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac)
{ {
if (pin) { if (pin) {
snd_hda_codec_write(codec, pin, 0, snd_hda_set_pin_ctl(codec, pin, PIN_HP);
AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
if (get_wcaps(codec, pin) & AC_WCAP_OUT_AMP) if (get_wcaps(codec, pin) & AC_WCAP_OUT_AMP)
snd_hda_codec_write(codec, pin, 0, snd_hda_codec_write(codec, pin, 0,
AC_VERB_SET_AMP_GAIN_MUTE, AC_VERB_SET_AMP_GAIN_MUTE,
...@@ -254,9 +254,8 @@ static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac) ...@@ -254,9 +254,8 @@ static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac)
static void init_input(struct hda_codec *codec, hda_nid_t pin, hda_nid_t adc) static void init_input(struct hda_codec *codec, hda_nid_t pin, hda_nid_t adc)
{ {
if (pin) { if (pin) {
snd_hda_codec_write(codec, pin, 0, snd_hda_set_pin_ctl(codec, pin, PIN_IN |
AC_VERB_SET_PIN_WIDGET_CONTROL, snd_hda_get_default_vref(codec, pin));
PIN_VREF80);
if (get_wcaps(codec, pin) & AC_WCAP_IN_AMP) if (get_wcaps(codec, pin) & AC_WCAP_IN_AMP)
snd_hda_codec_write(codec, pin, 0, snd_hda_codec_write(codec, pin, 0,
AC_VERB_SET_AMP_GAIN_MUTE, AC_VERB_SET_AMP_GAIN_MUTE,
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <sound/core.h> #include <sound/core.h>
#include "hda_codec.h" #include "hda_codec.h"
#include "hda_local.h" #include "hda_local.h"
#include "hda_auto_parser.h"
#include "hda_jack.h" #include "hda_jack.h"
#include <sound/tlv.h> #include <sound/tlv.h>
...@@ -933,8 +934,7 @@ static void cs_automute(struct hda_codec *codec) ...@@ -933,8 +934,7 @@ static void cs_automute(struct hda_codec *codec)
pin_ctl = 0; pin_ctl = 0;
nid = cfg->speaker_pins[i]; nid = cfg->speaker_pins[i];
snd_hda_codec_write(codec, nid, 0, snd_hda_set_pin_ctl(codec, nid, pin_ctl);
AC_VERB_SET_PIN_WIDGET_CONTROL, pin_ctl);
} }
if (spec->gpio_eapd_hp) { if (spec->gpio_eapd_hp) {
unsigned int gpio = hp_present ? unsigned int gpio = hp_present ?
...@@ -948,16 +948,14 @@ static void cs_automute(struct hda_codec *codec) ...@@ -948,16 +948,14 @@ static void cs_automute(struct hda_codec *codec)
/* mute HPs if spdif jack (SENSE_B) is present */ /* mute HPs if spdif jack (SENSE_B) is present */
for (i = 0; i < cfg->hp_outs; i++) { for (i = 0; i < cfg->hp_outs; i++) {
nid = cfg->hp_pins[i]; nid = cfg->hp_pins[i];
snd_hda_codec_write(codec, nid, 0, snd_hda_set_pin_ctl(codec, nid,
AC_VERB_SET_PIN_WIDGET_CONTROL,
(spdif_present && spec->sense_b) ? 0 : PIN_HP); (spdif_present && spec->sense_b) ? 0 : PIN_HP);
} }
/* SPDIF TX on/off */ /* SPDIF TX on/off */
if (cfg->dig_outs) { if (cfg->dig_outs) {
nid = cfg->dig_out_pins[0]; nid = cfg->dig_out_pins[0];
snd_hda_codec_write(codec, nid, 0, snd_hda_set_pin_ctl(codec, nid,
AC_VERB_SET_PIN_WIDGET_CONTROL,
spdif_present ? PIN_OUT : 0); spdif_present ? PIN_OUT : 0);
} }
...@@ -1024,13 +1022,11 @@ static void init_output(struct hda_codec *codec) ...@@ -1024,13 +1022,11 @@ static void init_output(struct hda_codec *codec)
/* set appropriate pin controls */ /* set appropriate pin controls */
for (i = 0; i < cfg->line_outs; i++) for (i = 0; i < cfg->line_outs; i++)
snd_hda_codec_write(codec, cfg->line_out_pins[i], 0, snd_hda_set_pin_ctl(codec, cfg->line_out_pins[i], PIN_OUT);
AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
/* HP */ /* HP */
for (i = 0; i < cfg->hp_outs; i++) { for (i = 0; i < cfg->hp_outs; i++) {
hda_nid_t nid = cfg->hp_pins[i]; hda_nid_t nid = cfg->hp_pins[i];
snd_hda_codec_write(codec, nid, 0, snd_hda_set_pin_ctl(codec, nid, PIN_HP);
AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
if (!cfg->speaker_outs) if (!cfg->speaker_outs)
continue; continue;
if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP) { if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP) {
...@@ -1041,8 +1037,7 @@ static void init_output(struct hda_codec *codec) ...@@ -1041,8 +1037,7 @@ static void init_output(struct hda_codec *codec)
/* Speaker */ /* Speaker */
for (i = 0; i < cfg->speaker_outs; i++) for (i = 0; i < cfg->speaker_outs; i++)
snd_hda_codec_write(codec, cfg->speaker_pins[i], 0, snd_hda_set_pin_ctl(codec, cfg->speaker_pins[i], PIN_OUT);
AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
/* SPDIF is enabled on presence detect for CS421x */ /* SPDIF is enabled on presence detect for CS421x */
if (spec->hp_detect || spec->spdif_detect) if (spec->hp_detect || spec->spdif_detect)
...@@ -1063,14 +1058,9 @@ static void init_input(struct hda_codec *codec) ...@@ -1063,14 +1058,9 @@ static void init_input(struct hda_codec *codec)
continue; continue;
/* set appropriate pin control and mute first */ /* set appropriate pin control and mute first */
ctl = PIN_IN; ctl = PIN_IN;
if (cfg->inputs[i].type == AUTO_PIN_MIC) { if (cfg->inputs[i].type == AUTO_PIN_MIC)
unsigned int caps = snd_hda_query_pin_caps(codec, pin); ctl |= snd_hda_get_default_vref(codec, pin);
caps >>= AC_PINCAP_VREF_SHIFT; snd_hda_set_pin_ctl(codec, pin, ctl);
if (caps & AC_PINCAP_VREF_80)
ctl = PIN_VREF80;
}
snd_hda_codec_write(codec, pin, 0,
AC_VERB_SET_PIN_WIDGET_CONTROL, ctl);
snd_hda_codec_write(codec, spec->adc_nid[i], 0, snd_hda_codec_write(codec, spec->adc_nid[i], 0,
AC_VERB_SET_AMP_GAIN_MUTE, AC_VERB_SET_AMP_GAIN_MUTE,
AMP_IN_MUTE(spec->adc_idx[i])); AMP_IN_MUTE(spec->adc_idx[i]));
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <sound/core.h> #include <sound/core.h>
#include "hda_codec.h" #include "hda_codec.h"
#include "hda_local.h" #include "hda_local.h"
#include "hda_auto_parser.h"
#define NUM_PINS 11 #define NUM_PINS 11
......
This diff is collapsed.
...@@ -1592,10 +1592,10 @@ static int nvhdmi_8ch_7x_pcm_prepare(struct hda_pcm_stream *hinfo, ...@@ -1592,10 +1592,10 @@ static int nvhdmi_8ch_7x_pcm_prepare(struct hda_pcm_stream *hinfo,
unsigned int dataDCC2, channel_id; unsigned int dataDCC2, channel_id;
int i; int i;
struct hdmi_spec *spec = codec->spec; struct hdmi_spec *spec = codec->spec;
struct hda_spdif_out *spdif = struct hda_spdif_out *spdif;
snd_hda_spdif_out_of_nid(codec, spec->cvts[0].cvt_nid);
mutex_lock(&codec->spdif_mutex); mutex_lock(&codec->spdif_mutex);
spdif = snd_hda_spdif_out_of_nid(codec, spec->cvts[0].cvt_nid);
chs = substream->runtime->channels; chs = substream->runtime->channels;
......
This diff is collapsed.
This diff is collapsed.
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
#include <sound/asoundef.h> #include <sound/asoundef.h>
#include "hda_codec.h" #include "hda_codec.h"
#include "hda_local.h" #include "hda_local.h"
#include "hda_auto_parser.h"
#include "hda_jack.h" #include "hda_jack.h"
/* Pin Widget NID */ /* Pin Widget NID */
...@@ -484,7 +485,7 @@ static void activate_output_mix(struct hda_codec *codec, struct nid_path *path, ...@@ -484,7 +485,7 @@ static void activate_output_mix(struct hda_codec *codec, struct nid_path *path,
if (!path) if (!path)
return; return;
num = snd_hda_get_conn_list(codec, mix_nid, NULL); num = snd_hda_get_num_conns(codec, mix_nid);
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
if (i == idx) if (i == idx)
val = AMP_IN_UNMUTE(i); val = AMP_IN_UNMUTE(i);
...@@ -532,8 +533,7 @@ static void init_output_pin(struct hda_codec *codec, hda_nid_t pin, ...@@ -532,8 +533,7 @@ static void init_output_pin(struct hda_codec *codec, hda_nid_t pin,
{ {
if (!pin) if (!pin)
return; return;
snd_hda_codec_write(codec, pin, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, snd_hda_set_pin_ctl(codec, pin, pin_type);
pin_type);
if (snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD) if (snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD)
snd_hda_codec_write(codec, pin, 0, snd_hda_codec_write(codec, pin, 0,
AC_VERB_SET_EAPD_BTLENABLE, 0x02); AC_VERB_SET_EAPD_BTLENABLE, 0x02);
...@@ -662,12 +662,12 @@ static void via_auto_init_analog_input(struct hda_codec *codec) ...@@ -662,12 +662,12 @@ static void via_auto_init_analog_input(struct hda_codec *codec)
hda_nid_t nid = cfg->inputs[i].pin; hda_nid_t nid = cfg->inputs[i].pin;
if (spec->smart51_enabled && is_smart51_pins(codec, nid)) if (spec->smart51_enabled && is_smart51_pins(codec, nid))
ctl = PIN_OUT; ctl = PIN_OUT;
else if (cfg->inputs[i].type == AUTO_PIN_MIC) else {
ctl = PIN_VREF50;
else
ctl = PIN_IN; ctl = PIN_IN;
snd_hda_codec_write(codec, nid, 0, if (cfg->inputs[i].type == AUTO_PIN_MIC)
AC_VERB_SET_PIN_WIDGET_CONTROL, ctl); ctl |= snd_hda_get_default_vref(codec, nid);
}
snd_hda_set_pin_ctl(codec, nid, ctl);
} }
/* init input-src */ /* init input-src */
...@@ -1006,9 +1006,7 @@ static int via_smart51_put(struct snd_kcontrol *kcontrol, ...@@ -1006,9 +1006,7 @@ static int via_smart51_put(struct snd_kcontrol *kcontrol,
AC_VERB_GET_PIN_WIDGET_CONTROL, 0); AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
parm &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN); parm &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
parm |= out_in; parm |= out_in;
snd_hda_codec_write(codec, nid, 0, snd_hda_set_pin_ctl(codec, nid, parm);
AC_VERB_SET_PIN_WIDGET_CONTROL,
parm);
if (out_in == AC_PINCTL_OUT_EN) { if (out_in == AC_PINCTL_OUT_EN) {
mute_aa_path(codec, 1); mute_aa_path(codec, 1);
notify_aa_path_ctls(codec); notify_aa_path_ctls(codec);
...@@ -1647,8 +1645,7 @@ static void toggle_output_mutes(struct hda_codec *codec, int num_pins, ...@@ -1647,8 +1645,7 @@ static void toggle_output_mutes(struct hda_codec *codec, int num_pins,
parm &= ~AC_PINCTL_OUT_EN; parm &= ~AC_PINCTL_OUT_EN;
else else
parm |= AC_PINCTL_OUT_EN; parm |= AC_PINCTL_OUT_EN;
snd_hda_codec_write(codec, pins[i], 0, snd_hda_set_pin_ctl(codec, pins[i], parm);
AC_VERB_SET_PIN_WIDGET_CONTROL, parm);
} }
} }
...@@ -1709,8 +1706,7 @@ static void via_gpio_control(struct hda_codec *codec) ...@@ -1709,8 +1706,7 @@ static void via_gpio_control(struct hda_codec *codec)
if (gpio_data == 0x02) { if (gpio_data == 0x02) {
/* unmute line out */ /* unmute line out */
snd_hda_codec_write(codec, spec->autocfg.line_out_pins[0], 0, snd_hda_set_pin_ctl(codec, spec->autocfg.line_out_pins[0],
AC_VERB_SET_PIN_WIDGET_CONTROL,
PIN_OUT); PIN_OUT);
if (vol_counter & 0x20) { if (vol_counter & 0x20) {
/* decrease volume */ /* decrease volume */
...@@ -1728,9 +1724,7 @@ static void via_gpio_control(struct hda_codec *codec) ...@@ -1728,9 +1724,7 @@ static void via_gpio_control(struct hda_codec *codec)
} }
} else if (!(gpio_data & 0x02)) { } else if (!(gpio_data & 0x02)) {
/* mute line out */ /* mute line out */
snd_hda_codec_write(codec, spec->autocfg.line_out_pins[0], 0, snd_hda_set_pin_ctl(codec, spec->autocfg.line_out_pins[0], 0);
AC_VERB_SET_PIN_WIDGET_CONTROL,
0);
} }
} }
...@@ -2757,8 +2751,7 @@ static void via_auto_init_dig_in(struct hda_codec *codec) ...@@ -2757,8 +2751,7 @@ static void via_auto_init_dig_in(struct hda_codec *codec)
struct via_spec *spec = codec->spec; struct via_spec *spec = codec->spec;
if (!spec->dig_in_nid) if (!spec->dig_in_nid)
return; return;
snd_hda_codec_write(codec, spec->autocfg.dig_in_pin, 0, snd_hda_set_pin_ctl(codec, spec->autocfg.dig_in_pin, PIN_IN);
AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN);
} }
/* initialize the unsolicited events */ /* initialize the unsolicited events */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment