mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (24 commits) ALSA: hda/realtek - Skip invalid digital out pins ALSA: hda/sigmatel - Automatically retrieve digital I/O widgets ALSA: hda - Remove unused variables ALSA: hda/realtek - Don't create alt-stream for capture when unnecessary ALSA: hda - Add support for 92HD65 / 92HD66 family of codecs ALSA: hda - Disable power-widget control for IDT 92HD83/93 as default ALSA: hda - Check NO_PRESENCE pincfg default bit ASoC: Ensure we always delay for WM8962 FLL when starting from SYSCLK ASoC: Ensure the WM8962 oscillator and PLLs start up disabled ASoC: Ensure WM8962 PLL registers are reset ALSA: intel8x0 - Fix inclusion of kvm_para.h ALSA: hda_hwdep: Fix possible buffer overflow ASoC: Fix return value of wm5100_gpio_direction_out() ASoC: WM8904: Set `invert' bit for Capture Switch ASoC: Leave input audio data bit length settings untouched in wm8711_set_dai_fmt ASoC: wm8711: Fix wrong mask for setting input audio data bit length select ALSA: intel8x0: Improve performance in virtual environment ALSA: hdspm - Enable all firmware ranges for PCI MADI/AES cards ALSA: hdsp - Correct HDSP_VERSION_BIT constant, thus partly fixing RPM detection ALSA: hdspm - Fix MADI channel format in the status ioctl ...
This commit is contained in:
commit
b2409fb6a4
@ -272,7 +272,14 @@ static int snd_hwdep_control_ioctl(struct snd_card *card,
|
|||||||
if (get_user(device, (int __user *)arg))
|
if (get_user(device, (int __user *)arg))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
mutex_lock(®ister_mutex);
|
mutex_lock(®ister_mutex);
|
||||||
device = device < 0 ? 0 : device + 1;
|
|
||||||
|
if (device < 0)
|
||||||
|
device = 0;
|
||||||
|
else if (device < SNDRV_MINOR_HWDEPS)
|
||||||
|
device++;
|
||||||
|
else
|
||||||
|
device = SNDRV_MINOR_HWDEPS;
|
||||||
|
|
||||||
while (device < SNDRV_MINOR_HWDEPS) {
|
while (device < SNDRV_MINOR_HWDEPS) {
|
||||||
if (snd_hwdep_search(card, device))
|
if (snd_hwdep_search(card, device))
|
||||||
break;
|
break;
|
||||||
|
@ -756,8 +756,6 @@ static int get_line_from_fw(char *buf, int size, struct firmware *fw)
|
|||||||
}
|
}
|
||||||
if (!fw->size)
|
if (!fw->size)
|
||||||
return 0;
|
return 0;
|
||||||
if (size < fw->size)
|
|
||||||
size = fw->size;
|
|
||||||
|
|
||||||
for (len = 0; len < fw->size; len++) {
|
for (len = 0; len < fw->size; len++) {
|
||||||
if (!*p)
|
if (!*p)
|
||||||
|
@ -442,6 +442,8 @@ struct auto_pin_cfg {
|
|||||||
(cfg & AC_DEFCFG_SEQUENCE)
|
(cfg & AC_DEFCFG_SEQUENCE)
|
||||||
#define get_defcfg_device(cfg) \
|
#define get_defcfg_device(cfg) \
|
||||||
((cfg & AC_DEFCFG_DEVICE) >> AC_DEFCFG_DEVICE_SHIFT)
|
((cfg & AC_DEFCFG_DEVICE) >> AC_DEFCFG_DEVICE_SHIFT)
|
||||||
|
#define get_defcfg_misc(cfg) \
|
||||||
|
((cfg & AC_DEFCFG_MISC) >> AC_DEFCFG_MISC_SHIFT)
|
||||||
|
|
||||||
/* bit-flags for snd_hda_parse_pin_def_config() behavior */
|
/* 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_HP_FIXUP (1 << 0) /* no HP-split */
|
||||||
@ -509,6 +511,8 @@ int snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid);
|
|||||||
static inline bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid)
|
static inline bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid)
|
||||||
{
|
{
|
||||||
return (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_PRES_DETECT) &&
|
return (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_PRES_DETECT) &&
|
||||||
|
!(get_defcfg_misc(snd_hda_codec_get_pincfg(codec, nid) &
|
||||||
|
AC_DEFCFG_MISC_NO_PRESENCE)) &&
|
||||||
(get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP);
|
(get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1006,7 +1006,6 @@ static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid)
|
|||||||
unsigned int caps, config;
|
unsigned int caps, config;
|
||||||
int pin_idx;
|
int pin_idx;
|
||||||
struct hdmi_spec_per_pin *per_pin;
|
struct hdmi_spec_per_pin *per_pin;
|
||||||
struct hdmi_eld *eld;
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
caps = snd_hda_param_read(codec, pin_nid, AC_PAR_PIN_CAP);
|
caps = snd_hda_param_read(codec, pin_nid, AC_PAR_PIN_CAP);
|
||||||
@ -1023,7 +1022,6 @@ static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid)
|
|||||||
|
|
||||||
pin_idx = spec->num_pins;
|
pin_idx = spec->num_pins;
|
||||||
per_pin = &spec->pins[pin_idx];
|
per_pin = &spec->pins[pin_idx];
|
||||||
eld = &per_pin->sink_eld;
|
|
||||||
|
|
||||||
per_pin->pin_nid = pin_nid;
|
per_pin->pin_nid = pin_nid;
|
||||||
|
|
||||||
@ -1576,7 +1574,7 @@ static int nvhdmi_8ch_7x_pcm_prepare(struct hda_pcm_stream *hinfo,
|
|||||||
struct snd_pcm_substream *substream)
|
struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
int chs;
|
int chs;
|
||||||
unsigned int dataDCC1, 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 =
|
||||||
@ -1586,7 +1584,6 @@ static int nvhdmi_8ch_7x_pcm_prepare(struct hda_pcm_stream *hinfo,
|
|||||||
|
|
||||||
chs = substream->runtime->channels;
|
chs = substream->runtime->channels;
|
||||||
|
|
||||||
dataDCC1 = AC_DIG1_ENABLE | AC_DIG1_COPYRIGHT;
|
|
||||||
dataDCC2 = 0x2;
|
dataDCC2 = 0x2;
|
||||||
|
|
||||||
/* turn off SPDIF once; otherwise the IEC958 bits won't be updated */
|
/* turn off SPDIF once; otherwise the IEC958 bits won't be updated */
|
||||||
|
@ -1604,27 +1604,29 @@ static void alc_auto_init_digital(struct hda_codec *codec)
|
|||||||
static void alc_auto_parse_digital(struct hda_codec *codec)
|
static void alc_auto_parse_digital(struct hda_codec *codec)
|
||||||
{
|
{
|
||||||
struct alc_spec *spec = codec->spec;
|
struct alc_spec *spec = codec->spec;
|
||||||
int i, err;
|
int i, err, nums;
|
||||||
hda_nid_t dig_nid;
|
hda_nid_t dig_nid;
|
||||||
|
|
||||||
/* support multiple SPDIFs; the secondary is set up as a slave */
|
/* support multiple SPDIFs; the secondary is set up as a slave */
|
||||||
|
nums = 0;
|
||||||
for (i = 0; i < spec->autocfg.dig_outs; i++) {
|
for (i = 0; i < spec->autocfg.dig_outs; i++) {
|
||||||
hda_nid_t conn[4];
|
hda_nid_t conn[4];
|
||||||
err = snd_hda_get_connections(codec,
|
err = snd_hda_get_connections(codec,
|
||||||
spec->autocfg.dig_out_pins[i],
|
spec->autocfg.dig_out_pins[i],
|
||||||
conn, ARRAY_SIZE(conn));
|
conn, ARRAY_SIZE(conn));
|
||||||
if (err < 0)
|
if (err <= 0)
|
||||||
continue;
|
continue;
|
||||||
dig_nid = conn[0]; /* assume the first element is audio-out */
|
dig_nid = conn[0]; /* assume the first element is audio-out */
|
||||||
if (!i) {
|
if (!nums) {
|
||||||
spec->multiout.dig_out_nid = dig_nid;
|
spec->multiout.dig_out_nid = dig_nid;
|
||||||
spec->dig_out_type = spec->autocfg.dig_out_type[0];
|
spec->dig_out_type = spec->autocfg.dig_out_type[0];
|
||||||
} else {
|
} else {
|
||||||
spec->multiout.slave_dig_outs = spec->slave_dig_outs;
|
spec->multiout.slave_dig_outs = spec->slave_dig_outs;
|
||||||
if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
|
if (nums >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
|
||||||
break;
|
break;
|
||||||
spec->slave_dig_outs[i - 1] = dig_nid;
|
spec->slave_dig_outs[nums - 1] = dig_nid;
|
||||||
}
|
}
|
||||||
|
nums++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spec->autocfg.dig_in_pin) {
|
if (spec->autocfg.dig_in_pin) {
|
||||||
@ -2270,6 +2272,7 @@ static int alc_build_pcms(struct hda_codec *codec)
|
|||||||
struct alc_spec *spec = codec->spec;
|
struct alc_spec *spec = codec->spec;
|
||||||
struct hda_pcm *info = spec->pcm_rec;
|
struct hda_pcm *info = spec->pcm_rec;
|
||||||
const struct hda_pcm_stream *p;
|
const struct hda_pcm_stream *p;
|
||||||
|
bool have_multi_adcs;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
codec->num_pcms = 1;
|
codec->num_pcms = 1;
|
||||||
@ -2348,8 +2351,11 @@ static int alc_build_pcms(struct hda_codec *codec)
|
|||||||
/* If the use of more than one ADC is requested for the current
|
/* If the use of more than one ADC is requested for the current
|
||||||
* model, configure a second analog capture-only PCM.
|
* model, configure a second analog capture-only PCM.
|
||||||
*/
|
*/
|
||||||
|
have_multi_adcs = (spec->num_adc_nids > 1) &&
|
||||||
|
!spec->dyn_adc_switch && !spec->auto_mic &&
|
||||||
|
(!spec->input_mux || spec->input_mux->num_items > 1);
|
||||||
/* Additional Analaog capture for index #2 */
|
/* Additional Analaog capture for index #2 */
|
||||||
if (spec->alt_dac_nid || spec->num_adc_nids > 1) {
|
if (spec->alt_dac_nid || have_multi_adcs) {
|
||||||
codec->num_pcms = 3;
|
codec->num_pcms = 3;
|
||||||
info = spec->pcm_rec + 2;
|
info = spec->pcm_rec + 2;
|
||||||
info->name = spec->stream_name_analog;
|
info->name = spec->stream_name_analog;
|
||||||
@ -2365,7 +2371,7 @@ static int alc_build_pcms(struct hda_codec *codec)
|
|||||||
alc_pcm_null_stream;
|
alc_pcm_null_stream;
|
||||||
info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
|
info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
|
||||||
}
|
}
|
||||||
if (spec->num_adc_nids > 1) {
|
if (have_multi_adcs) {
|
||||||
p = spec->stream_analog_alt_capture;
|
p = spec->stream_analog_alt_capture;
|
||||||
if (!p)
|
if (!p)
|
||||||
p = &alc_pcm_analog_alt_capture;
|
p = &alc_pcm_analog_alt_capture;
|
||||||
@ -2657,7 +2663,6 @@ static int alc_auto_fill_adc_caps(struct hda_codec *codec)
|
|||||||
hda_nid_t *adc_nids = spec->private_adc_nids;
|
hda_nid_t *adc_nids = spec->private_adc_nids;
|
||||||
hda_nid_t *cap_nids = spec->private_capsrc_nids;
|
hda_nid_t *cap_nids = spec->private_capsrc_nids;
|
||||||
int max_nums = ARRAY_SIZE(spec->private_adc_nids);
|
int max_nums = ARRAY_SIZE(spec->private_adc_nids);
|
||||||
bool indep_capsrc = false;
|
|
||||||
int i, nums = 0;
|
int i, nums = 0;
|
||||||
|
|
||||||
nid = codec->start_nid;
|
nid = codec->start_nid;
|
||||||
@ -2679,13 +2684,11 @@ static int alc_auto_fill_adc_caps(struct hda_codec *codec)
|
|||||||
break;
|
break;
|
||||||
if (type == AC_WID_AUD_SEL) {
|
if (type == AC_WID_AUD_SEL) {
|
||||||
cap_nids[nums] = src;
|
cap_nids[nums] = src;
|
||||||
indep_capsrc = true;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
n = snd_hda_get_conn_list(codec, src, &list);
|
n = snd_hda_get_conn_list(codec, src, &list);
|
||||||
if (n > 1) {
|
if (n > 1) {
|
||||||
cap_nids[nums] = src;
|
cap_nids[nums] = src;
|
||||||
indep_capsrc = true;
|
|
||||||
break;
|
break;
|
||||||
} else if (n != 1)
|
} else if (n != 1)
|
||||||
break;
|
break;
|
||||||
|
@ -3791,9 +3791,10 @@ static int is_dual_headphones(struct hda_codec *codec)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in)
|
static int stac92xx_parse_auto_config(struct hda_codec *codec)
|
||||||
{
|
{
|
||||||
struct sigmatel_spec *spec = codec->spec;
|
struct sigmatel_spec *spec = codec->spec;
|
||||||
|
hda_nid_t dig_out = 0, dig_in = 0;
|
||||||
int hp_swap = 0;
|
int hp_swap = 0;
|
||||||
int i, err;
|
int i, err;
|
||||||
|
|
||||||
@ -3976,6 +3977,22 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out
|
|||||||
if (spec->multiout.max_channels > 2)
|
if (spec->multiout.max_channels > 2)
|
||||||
spec->surr_switch = 1;
|
spec->surr_switch = 1;
|
||||||
|
|
||||||
|
/* find digital out and in converters */
|
||||||
|
for (i = codec->start_nid; i < codec->start_nid + codec->num_nodes; i++) {
|
||||||
|
unsigned int wid_caps = get_wcaps(codec, i);
|
||||||
|
if (wid_caps & AC_WCAP_DIGITAL) {
|
||||||
|
switch (get_wcaps_type(wid_caps)) {
|
||||||
|
case AC_WID_AUD_OUT:
|
||||||
|
if (!dig_out)
|
||||||
|
dig_out = i;
|
||||||
|
break;
|
||||||
|
case AC_WID_AUD_IN:
|
||||||
|
if (!dig_in)
|
||||||
|
dig_in = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (spec->autocfg.dig_outs)
|
if (spec->autocfg.dig_outs)
|
||||||
spec->multiout.dig_out_nid = dig_out;
|
spec->multiout.dig_out_nid = dig_out;
|
||||||
if (dig_in && spec->autocfg.dig_in_pin)
|
if (dig_in && spec->autocfg.dig_in_pin)
|
||||||
@ -5279,7 +5296,7 @@ static int patch_stac925x(struct hda_codec *codec)
|
|||||||
spec->capvols = stac925x_capvols;
|
spec->capvols = stac925x_capvols;
|
||||||
spec->capsws = stac925x_capsws;
|
spec->capsws = stac925x_capsws;
|
||||||
|
|
||||||
err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
|
err = stac92xx_parse_auto_config(codec);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
if (spec->board_config < 0) {
|
if (spec->board_config < 0) {
|
||||||
printk(KERN_WARNING "hda_codec: No auto-config is "
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
||||||
@ -5420,7 +5437,7 @@ again:
|
|||||||
spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
|
spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
|
||||||
spec->pwr_nids = stac92hd73xx_pwr_nids;
|
spec->pwr_nids = stac92hd73xx_pwr_nids;
|
||||||
|
|
||||||
err = stac92xx_parse_auto_config(codec, 0x25, 0x27);
|
err = stac92xx_parse_auto_config(codec);
|
||||||
|
|
||||||
if (!err) {
|
if (!err) {
|
||||||
if (spec->board_config < 0) {
|
if (spec->board_config < 0) {
|
||||||
@ -5629,26 +5646,8 @@ again:
|
|||||||
stac92xx_set_config_regs(codec,
|
stac92xx_set_config_regs(codec,
|
||||||
stac92hd83xxx_brd_tbl[spec->board_config]);
|
stac92hd83xxx_brd_tbl[spec->board_config]);
|
||||||
|
|
||||||
switch (codec->vendor_id) {
|
if (spec->board_config != STAC_92HD83XXX_PWR_REF)
|
||||||
case 0x111d76d1:
|
|
||||||
case 0x111d76d9:
|
|
||||||
case 0x111d76df:
|
|
||||||
case 0x111d76e5:
|
|
||||||
case 0x111d7666:
|
|
||||||
case 0x111d7667:
|
|
||||||
case 0x111d7668:
|
|
||||||
case 0x111d7669:
|
|
||||||
case 0x111d76e3:
|
|
||||||
case 0x111d7604:
|
|
||||||
case 0x111d76d4:
|
|
||||||
case 0x111d7605:
|
|
||||||
case 0x111d76d5:
|
|
||||||
case 0x111d76e7:
|
|
||||||
if (spec->board_config == STAC_92HD83XXX_PWR_REF)
|
|
||||||
break;
|
|
||||||
spec->num_pwrs = 0;
|
spec->num_pwrs = 0;
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
codec->patch_ops = stac92xx_patch_ops;
|
codec->patch_ops = stac92xx_patch_ops;
|
||||||
|
|
||||||
@ -5675,7 +5674,7 @@ again:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
err = stac92xx_parse_auto_config(codec, 0x1d, 0);
|
err = stac92xx_parse_auto_config(codec);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
if (spec->board_config < 0) {
|
if (spec->board_config < 0) {
|
||||||
printk(KERN_WARNING "hda_codec: No auto-config is "
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
||||||
@ -5996,7 +5995,7 @@ again:
|
|||||||
|
|
||||||
spec->multiout.dac_nids = spec->dac_nids;
|
spec->multiout.dac_nids = spec->dac_nids;
|
||||||
|
|
||||||
err = stac92xx_parse_auto_config(codec, 0x21, 0);
|
err = stac92xx_parse_auto_config(codec);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
if (spec->board_config < 0) {
|
if (spec->board_config < 0) {
|
||||||
printk(KERN_WARNING "hda_codec: No auto-config is "
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
||||||
@ -6105,7 +6104,7 @@ static int patch_stac922x(struct hda_codec *codec)
|
|||||||
|
|
||||||
spec->multiout.dac_nids = spec->dac_nids;
|
spec->multiout.dac_nids = spec->dac_nids;
|
||||||
|
|
||||||
err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
|
err = stac92xx_parse_auto_config(codec);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
if (spec->board_config < 0) {
|
if (spec->board_config < 0) {
|
||||||
printk(KERN_WARNING "hda_codec: No auto-config is "
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
||||||
@ -6230,7 +6229,7 @@ static int patch_stac927x(struct hda_codec *codec)
|
|||||||
spec->aloopback_shift = 0;
|
spec->aloopback_shift = 0;
|
||||||
spec->eapd_switch = 1;
|
spec->eapd_switch = 1;
|
||||||
|
|
||||||
err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
|
err = stac92xx_parse_auto_config(codec);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
if (spec->board_config < 0) {
|
if (spec->board_config < 0) {
|
||||||
printk(KERN_WARNING "hda_codec: No auto-config is "
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
||||||
@ -6355,7 +6354,7 @@ static int patch_stac9205(struct hda_codec *codec)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = stac92xx_parse_auto_config(codec, 0x1f, 0x20);
|
err = stac92xx_parse_auto_config(codec);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
if (spec->board_config < 0) {
|
if (spec->board_config < 0) {
|
||||||
printk(KERN_WARNING "hda_codec: No auto-config is "
|
printk(KERN_WARNING "hda_codec: No auto-config is "
|
||||||
@ -6460,7 +6459,7 @@ static int patch_stac9872(struct hda_codec *codec)
|
|||||||
spec->capvols = stac9872_capvols;
|
spec->capvols = stac9872_capvols;
|
||||||
spec->capsws = stac9872_capsws;
|
spec->capsws = stac9872_capsws;
|
||||||
|
|
||||||
err = stac92xx_parse_auto_config(codec, 0x10, 0x12);
|
err = stac92xx_parse_auto_config(codec);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
stac92xx_free(codec);
|
stac92xx_free(codec);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -6565,6 +6564,18 @@ static const struct hda_codec_preset snd_hda_preset_sigmatel[] = {
|
|||||||
{ .id = 0x111d76e3, .name = "92HD98BXX", .patch = patch_stac92hd83xxx},
|
{ .id = 0x111d76e3, .name = "92HD98BXX", .patch = patch_stac92hd83xxx},
|
||||||
{ .id = 0x111d76e5, .name = "92HD99BXX", .patch = patch_stac92hd83xxx},
|
{ .id = 0x111d76e5, .name = "92HD99BXX", .patch = patch_stac92hd83xxx},
|
||||||
{ .id = 0x111d76e7, .name = "92HD90BXX", .patch = patch_stac92hd83xxx},
|
{ .id = 0x111d76e7, .name = "92HD90BXX", .patch = patch_stac92hd83xxx},
|
||||||
|
{ .id = 0x111d76e8, .name = "92HD66B1X5", .patch = patch_stac92hd83xxx},
|
||||||
|
{ .id = 0x111d76e9, .name = "92HD66B2X5", .patch = patch_stac92hd83xxx},
|
||||||
|
{ .id = 0x111d76ea, .name = "92HD66B3X5", .patch = patch_stac92hd83xxx},
|
||||||
|
{ .id = 0x111d76eb, .name = "92HD66C1X5", .patch = patch_stac92hd83xxx},
|
||||||
|
{ .id = 0x111d76ec, .name = "92HD66C2X5", .patch = patch_stac92hd83xxx},
|
||||||
|
{ .id = 0x111d76ed, .name = "92HD66C3X5", .patch = patch_stac92hd83xxx},
|
||||||
|
{ .id = 0x111d76ee, .name = "92HD66B1X3", .patch = patch_stac92hd83xxx},
|
||||||
|
{ .id = 0x111d76ef, .name = "92HD66B2X3", .patch = patch_stac92hd83xxx},
|
||||||
|
{ .id = 0x111d76f0, .name = "92HD66B3X3", .patch = patch_stac92hd83xxx},
|
||||||
|
{ .id = 0x111d76f1, .name = "92HD66C1X3", .patch = patch_stac92hd83xxx},
|
||||||
|
{ .id = 0x111d76f2, .name = "92HD66C2X3", .patch = patch_stac92hd83xxx},
|
||||||
|
{ .id = 0x111d76f3, .name = "92HD66C3/65", .patch = patch_stac92hd83xxx},
|
||||||
{} /* terminator */
|
{} /* terminator */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3700,13 +3700,8 @@ static const struct hda_verb vt1812_init_verbs[] = {
|
|||||||
static void set_widgets_power_state_vt1812(struct hda_codec *codec)
|
static void set_widgets_power_state_vt1812(struct hda_codec *codec)
|
||||||
{
|
{
|
||||||
struct via_spec *spec = codec->spec;
|
struct via_spec *spec = codec->spec;
|
||||||
int imux_is_smixer =
|
|
||||||
snd_hda_codec_read(codec, 0x13, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3;
|
|
||||||
unsigned int parm;
|
unsigned int parm;
|
||||||
unsigned int present;
|
unsigned int present;
|
||||||
/* MUX10 (1eh) = stereo mixer */
|
|
||||||
imux_is_smixer =
|
|
||||||
snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 5;
|
|
||||||
/* inputs */
|
/* inputs */
|
||||||
/* PW 5/6/7 (29h/2ah/2bh) */
|
/* PW 5/6/7 (29h/2ah/2bh) */
|
||||||
parm = AC_PWRST_D3;
|
parm = AC_PWRST_D3;
|
||||||
|
@ -42,6 +42,12 @@
|
|||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_KVM_GUEST
|
||||||
|
#include <linux/kvm_para.h>
|
||||||
|
#else
|
||||||
|
#define kvm_para_available() (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
|
MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
|
||||||
MODULE_DESCRIPTION("Intel 82801AA,82901AB,i810,i820,i830,i840,i845,MX440; SiS 7012; Ali 5455");
|
MODULE_DESCRIPTION("Intel 82801AA,82901AB,i810,i820,i830,i840,i845,MX440; SiS 7012; Ali 5455");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
@ -77,6 +83,7 @@ static int buggy_semaphore;
|
|||||||
static int buggy_irq = -1; /* auto-check */
|
static int buggy_irq = -1; /* auto-check */
|
||||||
static int xbox;
|
static int xbox;
|
||||||
static int spdif_aclink = -1;
|
static int spdif_aclink = -1;
|
||||||
|
static int inside_vm = -1;
|
||||||
|
|
||||||
module_param(index, int, 0444);
|
module_param(index, int, 0444);
|
||||||
MODULE_PARM_DESC(index, "Index value for Intel i8x0 soundcard.");
|
MODULE_PARM_DESC(index, "Index value for Intel i8x0 soundcard.");
|
||||||
@ -94,6 +101,8 @@ module_param(xbox, bool, 0444);
|
|||||||
MODULE_PARM_DESC(xbox, "Set to 1 for Xbox, if you have problems with the AC'97 codec detection.");
|
MODULE_PARM_DESC(xbox, "Set to 1 for Xbox, if you have problems with the AC'97 codec detection.");
|
||||||
module_param(spdif_aclink, int, 0444);
|
module_param(spdif_aclink, int, 0444);
|
||||||
MODULE_PARM_DESC(spdif_aclink, "S/PDIF over AC-link.");
|
MODULE_PARM_DESC(spdif_aclink, "S/PDIF over AC-link.");
|
||||||
|
module_param(inside_vm, bool, 0444);
|
||||||
|
MODULE_PARM_DESC(inside_vm, "KVM/Parallels optimization.");
|
||||||
|
|
||||||
/* just for backward compatibility */
|
/* just for backward compatibility */
|
||||||
static int enable;
|
static int enable;
|
||||||
@ -400,6 +409,7 @@ struct intel8x0 {
|
|||||||
unsigned buggy_irq: 1; /* workaround for buggy mobos */
|
unsigned buggy_irq: 1; /* workaround for buggy mobos */
|
||||||
unsigned xbox: 1; /* workaround for Xbox AC'97 detection */
|
unsigned xbox: 1; /* workaround for Xbox AC'97 detection */
|
||||||
unsigned buggy_semaphore: 1; /* workaround for buggy codec semaphore */
|
unsigned buggy_semaphore: 1; /* workaround for buggy codec semaphore */
|
||||||
|
unsigned inside_vm: 1; /* enable VM optimization */
|
||||||
|
|
||||||
int spdif_idx; /* SPDIF BAR index; *_SPBAR or -1 if use PCMOUT */
|
int spdif_idx; /* SPDIF BAR index; *_SPBAR or -1 if use PCMOUT */
|
||||||
unsigned int sdm_saved; /* SDM reg value */
|
unsigned int sdm_saved; /* SDM reg value */
|
||||||
@ -1065,8 +1075,11 @@ static snd_pcm_uframes_t snd_intel8x0_pcm_pointer(struct snd_pcm_substream *subs
|
|||||||
udelay(10);
|
udelay(10);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (civ == igetbyte(chip, ichdev->reg_offset + ICH_REG_OFF_CIV) &&
|
if (civ != igetbyte(chip, ichdev->reg_offset + ICH_REG_OFF_CIV))
|
||||||
ptr1 == igetword(chip, ichdev->reg_offset + ichdev->roff_picb))
|
continue;
|
||||||
|
if (chip->inside_vm)
|
||||||
|
break;
|
||||||
|
if (ptr1 == igetword(chip, ichdev->reg_offset + ichdev->roff_picb))
|
||||||
break;
|
break;
|
||||||
} while (timeout--);
|
} while (timeout--);
|
||||||
ptr = ichdev->last_pos;
|
ptr = ichdev->last_pos;
|
||||||
@ -2984,6 +2997,10 @@ static int __devinit snd_intel8x0_create(struct snd_card *card,
|
|||||||
if (xbox)
|
if (xbox)
|
||||||
chip->xbox = 1;
|
chip->xbox = 1;
|
||||||
|
|
||||||
|
chip->inside_vm = inside_vm;
|
||||||
|
if (inside_vm)
|
||||||
|
printk(KERN_INFO "intel8x0: enable KVM optimization\n");
|
||||||
|
|
||||||
if (pci->vendor == PCI_VENDOR_ID_INTEL &&
|
if (pci->vendor == PCI_VENDOR_ID_INTEL &&
|
||||||
pci->device == PCI_DEVICE_ID_INTEL_440MX)
|
pci->device == PCI_DEVICE_ID_INTEL_440MX)
|
||||||
chip->fix_nocache = 1; /* enable workaround */
|
chip->fix_nocache = 1; /* enable workaround */
|
||||||
@ -3226,6 +3243,14 @@ static int __devinit snd_intel8x0_probe(struct pci_dev *pci,
|
|||||||
buggy_irq = 0;
|
buggy_irq = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (inside_vm < 0) {
|
||||||
|
/* detect KVM and Parallels virtual environments */
|
||||||
|
inside_vm = kvm_para_available();
|
||||||
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
|
inside_vm = inside_vm || boot_cpu_has(X86_FEATURE_HYPERVISOR);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
if ((err = snd_intel8x0_create(card, pci, pci_id->driver_data,
|
if ((err = snd_intel8x0_create(card, pci, pci_id->driver_data,
|
||||||
&chip)) < 0) {
|
&chip)) < 0) {
|
||||||
snd_card_free(card);
|
snd_card_free(card);
|
||||||
|
@ -151,7 +151,7 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin");
|
|||||||
#define HDSP_PROGRAM 0x020
|
#define HDSP_PROGRAM 0x020
|
||||||
#define HDSP_CONFIG_MODE_0 0x040
|
#define HDSP_CONFIG_MODE_0 0x040
|
||||||
#define HDSP_CONFIG_MODE_1 0x080
|
#define HDSP_CONFIG_MODE_1 0x080
|
||||||
#define HDSP_VERSION_BIT 0x100
|
#define HDSP_VERSION_BIT (0x100 | HDSP_S_LOAD)
|
||||||
#define HDSP_BIGENDIAN_MODE 0x200
|
#define HDSP_BIGENDIAN_MODE 0x200
|
||||||
#define HDSP_RD_MULTIPLE 0x400
|
#define HDSP_RD_MULTIPLE 0x400
|
||||||
#define HDSP_9652_ENABLE_MIXER 0x800
|
#define HDSP_9652_ENABLE_MIXER 0x800
|
||||||
|
@ -520,16 +520,9 @@ MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}");
|
|||||||
#define HDSPM_DMA_AREA_BYTES (HDSPM_MAX_CHANNELS * HDSPM_CHANNEL_BUFFER_BYTES)
|
#define HDSPM_DMA_AREA_BYTES (HDSPM_MAX_CHANNELS * HDSPM_CHANNEL_BUFFER_BYTES)
|
||||||
#define HDSPM_DMA_AREA_KILOBYTES (HDSPM_DMA_AREA_BYTES/1024)
|
#define HDSPM_DMA_AREA_KILOBYTES (HDSPM_DMA_AREA_BYTES/1024)
|
||||||
|
|
||||||
/* revisions >= 230 indicate AES32 card */
|
|
||||||
#define HDSPM_MADI_ANCIENT_REV 204
|
|
||||||
#define HDSPM_MADI_OLD_REV 207
|
|
||||||
#define HDSPM_MADI_REV 210
|
|
||||||
#define HDSPM_RAYDAT_REV 211
|
#define HDSPM_RAYDAT_REV 211
|
||||||
#define HDSPM_AIO_REV 212
|
#define HDSPM_AIO_REV 212
|
||||||
#define HDSPM_MADIFACE_REV 213
|
#define HDSPM_MADIFACE_REV 213
|
||||||
#define HDSPM_AES_REV 240
|
|
||||||
#define HDSPM_AES32_REV 234
|
|
||||||
#define HDSPM_AES32_OLD_REV 233
|
|
||||||
|
|
||||||
/* speed factor modes */
|
/* speed factor modes */
|
||||||
#define HDSPM_SPEED_SINGLE 0
|
#define HDSPM_SPEED_SINGLE 0
|
||||||
@ -6253,7 +6246,7 @@ static int snd_hdspm_hwdep_ioctl(struct snd_hwdep *hw, struct file *file,
|
|||||||
status.card_specific.madi.madi_input =
|
status.card_specific.madi.madi_input =
|
||||||
(statusregister & HDSPM_AB_int) ? 1 : 0;
|
(statusregister & HDSPM_AB_int) ? 1 : 0;
|
||||||
status.card_specific.madi.channel_format =
|
status.card_specific.madi.channel_format =
|
||||||
(statusregister & HDSPM_TX_64ch) ? 1 : 0;
|
(statusregister & HDSPM_RX_64ch) ? 1 : 0;
|
||||||
/* TODO: Mac driver sets it when f_s>48kHz */
|
/* TODO: Mac driver sets it when f_s>48kHz */
|
||||||
status.card_specific.madi.frame_format = 0;
|
status.card_specific.madi.frame_format = 0;
|
||||||
|
|
||||||
@ -6503,13 +6496,6 @@ static int __devinit snd_hdspm_create(struct snd_card *card,
|
|||||||
strcpy(card->driver, "HDSPM");
|
strcpy(card->driver, "HDSPM");
|
||||||
|
|
||||||
switch (hdspm->firmware_rev) {
|
switch (hdspm->firmware_rev) {
|
||||||
case HDSPM_MADI_REV:
|
|
||||||
case HDSPM_MADI_OLD_REV:
|
|
||||||
case HDSPM_MADI_ANCIENT_REV:
|
|
||||||
hdspm->io_type = MADI;
|
|
||||||
hdspm->card_name = "RME MADI";
|
|
||||||
hdspm->midiPorts = 3;
|
|
||||||
break;
|
|
||||||
case HDSPM_RAYDAT_REV:
|
case HDSPM_RAYDAT_REV:
|
||||||
hdspm->io_type = RayDAT;
|
hdspm->io_type = RayDAT;
|
||||||
hdspm->card_name = "RME RayDAT";
|
hdspm->card_name = "RME RayDAT";
|
||||||
@ -6525,17 +6511,25 @@ static int __devinit snd_hdspm_create(struct snd_card *card,
|
|||||||
hdspm->card_name = "RME MADIface";
|
hdspm->card_name = "RME MADIface";
|
||||||
hdspm->midiPorts = 1;
|
hdspm->midiPorts = 1;
|
||||||
break;
|
break;
|
||||||
case HDSPM_AES_REV:
|
|
||||||
case HDSPM_AES32_REV:
|
|
||||||
case HDSPM_AES32_OLD_REV:
|
|
||||||
hdspm->io_type = AES32;
|
|
||||||
hdspm->card_name = "RME AES32";
|
|
||||||
hdspm->midiPorts = 2;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
snd_printk(KERN_ERR "HDSPM: unknown firmware revision %x\n",
|
if ((hdspm->firmware_rev == 0xf0) ||
|
||||||
|
((hdspm->firmware_rev >= 0xe6) &&
|
||||||
|
(hdspm->firmware_rev <= 0xea))) {
|
||||||
|
hdspm->io_type = AES32;
|
||||||
|
hdspm->card_name = "RME AES32";
|
||||||
|
hdspm->midiPorts = 2;
|
||||||
|
} else if ((hdspm->firmware_rev == 0xd5) ||
|
||||||
|
((hdspm->firmware_rev >= 0xc8) &&
|
||||||
|
(hdspm->firmware_rev <= 0xcf))) {
|
||||||
|
hdspm->io_type = MADI;
|
||||||
|
hdspm->card_name = "RME MADI";
|
||||||
|
hdspm->midiPorts = 3;
|
||||||
|
} else {
|
||||||
|
snd_printk(KERN_ERR
|
||||||
|
"HDSPM: unknown firmware revision %x\n",
|
||||||
hdspm->firmware_rev);
|
hdspm->firmware_rev);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = pci_enable_device(pci);
|
err = pci_enable_device(pci);
|
||||||
|
@ -430,6 +430,7 @@ static int tlv320aic23_set_dai_fmt(struct snd_soc_dai *codec_dai,
|
|||||||
iface_reg |= TLV320AIC23_MS_MASTER;
|
iface_reg |= TLV320AIC23_MS_MASTER;
|
||||||
break;
|
break;
|
||||||
case SND_SOC_DAIFMT_CBS_CFS:
|
case SND_SOC_DAIFMT_CBS_CFS:
|
||||||
|
iface_reg &= ~TLV320AIC23_MS_MASTER;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -1023,6 +1023,7 @@ static int aic3x_set_dai_fmt(struct snd_soc_dai *codec_dai,
|
|||||||
break;
|
break;
|
||||||
case SND_SOC_DAIFMT_CBS_CFS:
|
case SND_SOC_DAIFMT_CBS_CFS:
|
||||||
aic3x->master = 0;
|
aic3x->master = 0;
|
||||||
|
iface_areg &= ~(BIT_CLK_MASTER | WORD_CLK_MASTER);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -2361,13 +2361,17 @@ static int wm5100_gpio_direction_out(struct gpio_chip *chip,
|
|||||||
{
|
{
|
||||||
struct wm5100_priv *wm5100 = gpio_to_wm5100(chip);
|
struct wm5100_priv *wm5100 = gpio_to_wm5100(chip);
|
||||||
struct snd_soc_codec *codec = wm5100->codec;
|
struct snd_soc_codec *codec = wm5100->codec;
|
||||||
int val;
|
int val, ret;
|
||||||
|
|
||||||
val = (1 << WM5100_GP1_FN_SHIFT) | (!!value << WM5100_GP1_LVL_SHIFT);
|
val = (1 << WM5100_GP1_FN_SHIFT) | (!!value << WM5100_GP1_LVL_SHIFT);
|
||||||
|
|
||||||
return snd_soc_update_bits(codec, WM5100_GPIO_CTRL_1 + offset,
|
ret = snd_soc_update_bits(codec, WM5100_GPIO_CTRL_1 + offset,
|
||||||
WM5100_GP1_FN_MASK | WM5100_GP1_DIR |
|
WM5100_GP1_FN_MASK | WM5100_GP1_DIR |
|
||||||
WM5100_GP1_LVL, val);
|
WM5100_GP1_LVL, val);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wm5100_gpio_get(struct gpio_chip *chip, unsigned offset)
|
static int wm5100_gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||||
|
@ -151,7 +151,7 @@ static int wm8711_hw_params(struct snd_pcm_substream *substream,
|
|||||||
{
|
{
|
||||||
struct snd_soc_codec *codec = dai->codec;
|
struct snd_soc_codec *codec = dai->codec;
|
||||||
struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec);
|
struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec);
|
||||||
u16 iface = snd_soc_read(codec, WM8711_IFACE) & 0xfffc;
|
u16 iface = snd_soc_read(codec, WM8711_IFACE) & 0xfff3;
|
||||||
int i = get_coeff(wm8711->sysclk, params_rate(params));
|
int i = get_coeff(wm8711->sysclk, params_rate(params));
|
||||||
u16 srate = (coeff_div[i].sr << 2) |
|
u16 srate = (coeff_div[i].sr << 2) |
|
||||||
(coeff_div[i].bosr << 1) | coeff_div[i].usb;
|
(coeff_div[i].bosr << 1) | coeff_div[i].usb;
|
||||||
@ -232,7 +232,7 @@ static int wm8711_set_dai_fmt(struct snd_soc_dai *codec_dai,
|
|||||||
unsigned int fmt)
|
unsigned int fmt)
|
||||||
{
|
{
|
||||||
struct snd_soc_codec *codec = codec_dai->codec;
|
struct snd_soc_codec *codec = codec_dai->codec;
|
||||||
u16 iface = 0;
|
u16 iface = snd_soc_read(codec, WM8711_IFACE) & 0x000c;
|
||||||
|
|
||||||
/* set master/slave audio interface */
|
/* set master/slave audio interface */
|
||||||
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
||||||
|
@ -867,7 +867,7 @@ SOC_ENUM("Right Capture Mode", rin_mode),
|
|||||||
SOC_DOUBLE_R("Capture Volume", WM8904_ANALOGUE_LEFT_INPUT_0,
|
SOC_DOUBLE_R("Capture Volume", WM8904_ANALOGUE_LEFT_INPUT_0,
|
||||||
WM8904_ANALOGUE_RIGHT_INPUT_0, 0, 31, 0),
|
WM8904_ANALOGUE_RIGHT_INPUT_0, 0, 31, 0),
|
||||||
SOC_DOUBLE_R("Capture Switch", WM8904_ANALOGUE_LEFT_INPUT_0,
|
SOC_DOUBLE_R("Capture Switch", WM8904_ANALOGUE_LEFT_INPUT_0,
|
||||||
WM8904_ANALOGUE_RIGHT_INPUT_0, 7, 1, 0),
|
WM8904_ANALOGUE_RIGHT_INPUT_0, 7, 1, 1),
|
||||||
|
|
||||||
SOC_SINGLE("High Pass Filter Switch", WM8904_ADC_DIGITAL_0, 4, 1, 0),
|
SOC_SINGLE("High Pass Filter Switch", WM8904_ADC_DIGITAL_0, 4, 1, 0),
|
||||||
SOC_ENUM("High Pass Filter Mode", hpf_mode),
|
SOC_ENUM("High Pass Filter Mode", hpf_mode),
|
||||||
|
@ -621,7 +621,7 @@ static int wm8940_set_dai_clkdiv(struct snd_soc_dai *codec_dai,
|
|||||||
|
|
||||||
switch (div_id) {
|
switch (div_id) {
|
||||||
case WM8940_BCLKDIV:
|
case WM8940_BCLKDIV:
|
||||||
reg = snd_soc_read(codec, WM8940_CLOCK) & 0xFFEF3;
|
reg = snd_soc_read(codec, WM8940_CLOCK) & 0xFFE3;
|
||||||
ret = snd_soc_write(codec, WM8940_CLOCK, reg | (div << 2));
|
ret = snd_soc_write(codec, WM8940_CLOCK, reg | (div << 2));
|
||||||
break;
|
break;
|
||||||
case WM8940_MCLKDIV:
|
case WM8940_MCLKDIV:
|
||||||
|
@ -1961,7 +1961,13 @@ static int wm8962_readable_register(struct snd_soc_codec *codec, unsigned int re
|
|||||||
|
|
||||||
static int wm8962_reset(struct snd_soc_codec *codec)
|
static int wm8962_reset(struct snd_soc_codec *codec)
|
||||||
{
|
{
|
||||||
return snd_soc_write(codec, WM8962_SOFTWARE_RESET, 0x6243);
|
int ret;
|
||||||
|
|
||||||
|
ret = snd_soc_write(codec, WM8962_SOFTWARE_RESET, 0x6243);
|
||||||
|
if (ret != 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return snd_soc_write(codec, WM8962_PLL_SOFTWARE_RESET, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const DECLARE_TLV_DB_SCALE(inpga_tlv, -2325, 75, 0);
|
static const DECLARE_TLV_DB_SCALE(inpga_tlv, -2325, 75, 0);
|
||||||
@ -2360,15 +2366,14 @@ static int sysclk_event(struct snd_soc_dapm_widget *w,
|
|||||||
|
|
||||||
snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
|
snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
|
||||||
WM8962_FLL_ENA, WM8962_FLL_ENA);
|
WM8962_FLL_ENA, WM8962_FLL_ENA);
|
||||||
if (wm8962->irq) {
|
|
||||||
timeout = msecs_to_jiffies(5);
|
|
||||||
timeout = wait_for_completion_timeout(&wm8962->fll_lock,
|
|
||||||
timeout);
|
|
||||||
|
|
||||||
if (timeout == 0)
|
timeout = msecs_to_jiffies(5);
|
||||||
dev_err(codec->dev,
|
timeout = wait_for_completion_timeout(&wm8962->fll_lock,
|
||||||
"Timed out starting FLL\n");
|
timeout);
|
||||||
}
|
|
||||||
|
if (wm8962->irq && timeout == 0)
|
||||||
|
dev_err(codec->dev,
|
||||||
|
"Timed out starting FLL\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -4029,6 +4034,11 @@ static int wm8962_probe(struct snd_soc_codec *codec)
|
|||||||
snd_soc_update_bits(codec, WM8962_CLOCKING2,
|
snd_soc_update_bits(codec, WM8962_CLOCKING2,
|
||||||
WM8962_CLKREG_OVD, WM8962_CLKREG_OVD);
|
WM8962_CLKREG_OVD, WM8962_CLKREG_OVD);
|
||||||
|
|
||||||
|
/* Ensure that the oscillator and PLLs are disabled */
|
||||||
|
snd_soc_update_bits(codec, WM8962_PLL2,
|
||||||
|
WM8962_OSC_ENA | WM8962_PLL2_ENA | WM8962_PLL3_ENA,
|
||||||
|
0);
|
||||||
|
|
||||||
regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies);
|
regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies);
|
||||||
|
|
||||||
if (pdata) {
|
if (pdata) {
|
||||||
|
Loading…
Reference in New Issue
Block a user