mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-11 18:26:02 +00:00
sound fixes for 3.13-rc1
Two peaks in diffstat are for the audio EQ init of IDT codecs and the EMU2004 usb mixer addition, both of which are pretty device-specific, so safe to apply. The rest are a bunch of small fixes, most of them are regression fixes. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJSh0+UAAoJEGwxgFQ9KSmkFpcQAK8+FlQyzjkUD8SAd9xINjm1 gC7b8cIldx9+LLDvKCshcqM8+RID3EhtUz5DgDmpG7LnJy30aYjhc1McGMiBXLE1 Lwxi5oM8Rka5OSeW1J98gApeS1QxKRRCjE/6X3Vnnzymy4YziBEf1E6u3o2ZqPiM jCLe3nuElrGKrfzoYIf4uI+oA2+iDzc29f/gFV0wl0TXBbuNwNgapfZjeDpyTM49 D9nhZ5bKddwxo8wgqySqfSrHU37tquNTTayTvD31Q9AQQzXWgTnv4uDpXACTY5h8 ynYEvkaOD3jMmjTLHU2ygVRKu1ydl+FV6I9JQGvaJbLl/KCGIW3IRQYowH/NltUu U/PmYuEOYL5tXNkkO1lN49Ohj2dmgmfO8I1cSUjPyKdNuFEE/AuTIFuSogKittgV vuQwyKhZ3sp8g1cQ5YbxSVJI7O+NyFd/XzeL6mIxnBIa6tf2NIIWVkvCFuEmrnKp nsVf+JV8wr2tCRHWXRpW9wdLCt5XvKfwXfMZxUKLkxdZMKWy4qwh5ROEs+Tap4D+ dMThpWDOpC5H92Ygei5dpFav2dL+Iq8+QzLwzgN+JFvtNVUfqKTo7a+jbRdQhoec w3DDxhS3MUwpenwiCX9M61RZZhQFNSn1t6J+wA5MCAnOfco71nkN1gf45iry3Vww j9zeFh22uHWN0ttyF5zl =lXBM -----END PGP SIGNATURE----- Merge tag 'sound-fix-3.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Two peaks in diffstat are for the audio EQ init of IDT codecs and the EMU2004 usb mixer addition, both of which are pretty device-specific, so safe to apply. The rest are a bunch of small fixes, most of them are regression fixes" * tag 'sound-fix-3.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (26 commits) ALSA: hda - load EQ params into IDT codec on HP bNB13 systems ASoC: cs42l52: Correct MIC CTL mask ASoC: wm8962: Turn on regcache_cache_only before disabling regulator ALSA: jack: Unregister input device at disconnection ALSA: pcsp: Fix the order of input device unregistration ASoC: fsl: imx-pcm-fiq: omit fiq counter to avoid harm in unbalanced situations ASoC: blackfin: Fix missing break ALSA: usb-audio: add front jack channel selector for EMU0204 ALSA: hda - Don't clear the power state at snd_hda_codec_reset() ASoC: arizona: Fix typo in name of EQ coefficient controls ALSA: hda - Control EAPD for Master volume on Lenovo N100 ALSA: hda - Don't turn off EAPD for headphone on Lenovo N100 ALSA: isa: not allocating enough space ALSA: snd-aoa: two copy and paste bugs ASoC: wm8997: Correct typo in ISRC mux routes ALSA: hda - Check keep_eapd_on before inv_eapd ALSA: hda - Fix Line Out automute on Realtek multifunction jacks ALSA: msnd: Avoid duplicated driver name ALSA: compress_core: don't return -EBADFD from poll if paused ALSA: hda - hdmi: Fix wrong baseline length in ATI/AMD generated ELD ...
This commit is contained in:
commit
73d75ba99e
@ -644,7 +644,7 @@ static int n##_control_put(struct snd_kcontrol *kcontrol, \
|
||||
struct snd_ctl_elem_value *ucontrol) \
|
||||
{ \
|
||||
struct gpio_runtime *gpio = snd_kcontrol_chip(kcontrol); \
|
||||
if (gpio->methods && gpio->methods->get_##n) \
|
||||
if (gpio->methods && gpio->methods->set_##n) \
|
||||
gpio->methods->set_##n(gpio, \
|
||||
!!ucontrol->value.integer.value[0]); \
|
||||
return 1; \
|
||||
@ -1135,7 +1135,7 @@ static int aoa_fabric_layout_resume(struct soundbus_dev *sdev)
|
||||
{
|
||||
struct layout_dev *ldev = dev_get_drvdata(&sdev->ofdev.dev);
|
||||
|
||||
if (ldev->gpio.methods && ldev->gpio.methods->all_amps_off)
|
||||
if (ldev->gpio.methods && ldev->gpio.methods->all_amps_restore)
|
||||
ldev->gpio.methods->all_amps_restore(&ldev->gpio);
|
||||
|
||||
return 0;
|
||||
|
@ -384,8 +384,7 @@ static unsigned int snd_compr_poll(struct file *f, poll_table *wait)
|
||||
return -EFAULT;
|
||||
|
||||
mutex_lock(&stream->device->lock);
|
||||
if (stream->runtime->state == SNDRV_PCM_STATE_PAUSED ||
|
||||
stream->runtime->state == SNDRV_PCM_STATE_OPEN) {
|
||||
if (stream->runtime->state == SNDRV_PCM_STATE_OPEN) {
|
||||
retval = -EBADFD;
|
||||
goto out;
|
||||
}
|
||||
|
@ -34,12 +34,12 @@ static int jack_switch_types[SND_JACK_SWITCH_TYPES] = {
|
||||
SW_LINEIN_INSERT,
|
||||
};
|
||||
|
||||
static int snd_jack_dev_free(struct snd_device *device)
|
||||
static int snd_jack_dev_disconnect(struct snd_device *device)
|
||||
{
|
||||
struct snd_jack *jack = device->device_data;
|
||||
|
||||
if (jack->private_free)
|
||||
jack->private_free(jack);
|
||||
if (!jack->input_dev)
|
||||
return 0;
|
||||
|
||||
/* If the input device is registered with the input subsystem
|
||||
* then we need to use a different deallocator. */
|
||||
@ -47,6 +47,18 @@ static int snd_jack_dev_free(struct snd_device *device)
|
||||
input_unregister_device(jack->input_dev);
|
||||
else
|
||||
input_free_device(jack->input_dev);
|
||||
jack->input_dev = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_jack_dev_free(struct snd_device *device)
|
||||
{
|
||||
struct snd_jack *jack = device->device_data;
|
||||
|
||||
if (jack->private_free)
|
||||
jack->private_free(jack);
|
||||
|
||||
snd_jack_dev_disconnect(device);
|
||||
|
||||
kfree(jack->id);
|
||||
kfree(jack);
|
||||
@ -110,6 +122,7 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,
|
||||
static struct snd_device_ops ops = {
|
||||
.dev_free = snd_jack_dev_free,
|
||||
.dev_register = snd_jack_dev_register,
|
||||
.dev_disconnect = snd_jack_dev_disconnect,
|
||||
};
|
||||
|
||||
jack = kzalloc(sizeof(struct snd_jack), GFP_KERNEL);
|
||||
|
@ -188,8 +188,8 @@ static int pcsp_probe(struct platform_device *dev)
|
||||
static int pcsp_remove(struct platform_device *dev)
|
||||
{
|
||||
struct snd_pcsp *chip = platform_get_drvdata(dev);
|
||||
alsa_card_pcsp_exit(chip);
|
||||
pcspkr_input_remove(chip->input_dev);
|
||||
alsa_card_pcsp_exit(chip);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -73,9 +73,11 @@
|
||||
#ifdef MSND_CLASSIC
|
||||
# include "msnd_classic.h"
|
||||
# define LOGNAME "msnd_classic"
|
||||
# define DEV_NAME "msnd-classic"
|
||||
#else
|
||||
# include "msnd_pinnacle.h"
|
||||
# define LOGNAME "snd_msnd_pinnacle"
|
||||
# define DEV_NAME "msnd-pinnacle"
|
||||
#endif
|
||||
|
||||
static void set_default_audio_parameters(struct snd_msnd *chip)
|
||||
@ -1067,8 +1069,6 @@ static int snd_msnd_isa_remove(struct device *pdev, unsigned int dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define DEV_NAME "msnd-pinnacle"
|
||||
|
||||
static struct isa_driver snd_msnd_driver = {
|
||||
.match = snd_msnd_isa_match,
|
||||
.probe = snd_msnd_isa_probe,
|
||||
|
@ -1196,7 +1196,7 @@ wavefront_send_multisample (snd_wavefront_t *dev, wavefront_patch_info *header)
|
||||
int num_samples;
|
||||
unsigned char *msample_hdr;
|
||||
|
||||
msample_hdr = kmalloc(sizeof(WF_MSAMPLE_BYTES), GFP_KERNEL);
|
||||
msample_hdr = kmalloc(WF_MSAMPLE_BYTES, GFP_KERNEL);
|
||||
if (! msample_hdr)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -2579,9 +2579,6 @@ int snd_hda_codec_reset(struct hda_codec *codec)
|
||||
cancel_delayed_work_sync(&codec->jackpoll_work);
|
||||
#ifdef CONFIG_PM
|
||||
cancel_delayed_work_sync(&codec->power_work);
|
||||
codec->power_on = 0;
|
||||
codec->power_transition = 0;
|
||||
codec->power_jiffies = jiffies;
|
||||
flush_workqueue(bus->workq);
|
||||
#endif
|
||||
snd_hda_ctls_clear(codec);
|
||||
|
@ -680,7 +680,7 @@ int snd_hdmi_get_eld_ati(struct hda_codec *codec, hda_nid_t nid,
|
||||
|
||||
spkalloc = snd_hda_codec_read(codec, nid, 0, ATI_VERB_GET_SPEAKER_ALLOCATION, 0);
|
||||
|
||||
if (!spkalloc) {
|
||||
if (spkalloc <= 0) {
|
||||
snd_printd(KERN_INFO "HDMI ATI/AMD: no speaker allocation for ELD\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -742,6 +742,9 @@ int snd_hdmi_get_eld_ati(struct hda_codec *codec, hda_nid_t nid,
|
||||
snd_hda_codec_write(codec, nid, 0, ATI_VERB_SET_AUDIO_DESCRIPTOR, i << 3);
|
||||
ati_sad = snd_hda_codec_read(codec, nid, 0, ATI_VERB_GET_AUDIO_DESCRIPTOR, 0);
|
||||
|
||||
if (ati_sad <= 0)
|
||||
continue;
|
||||
|
||||
if (ati_sad & ATI_AUDIODESC_RATES) {
|
||||
/* format is supported, copy SAD as-is */
|
||||
buf[pos++] = (ati_sad & 0x0000ff) >> 0;
|
||||
@ -765,21 +768,39 @@ int snd_hdmi_get_eld_ati(struct hda_codec *codec, hda_nid_t nid,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* HDMI VSDB latency format:
|
||||
* separately for both audio and video:
|
||||
* 0 field not valid or unknown latency
|
||||
* [1..251] msecs = (x-1)*2 (max 500ms with x = 251 = 0xfb)
|
||||
* 255 audio/video not supported
|
||||
*
|
||||
* HDA latency format:
|
||||
* single value indicating video latency relative to audio:
|
||||
* 0 unknown or 0ms
|
||||
* [1..250] msecs = x*2 (max 500ms with x = 250 = 0xfa)
|
||||
* [251..255] reserved
|
||||
*/
|
||||
aud_synch = snd_hda_codec_read(codec, nid, 0, ATI_VERB_GET_AUDIO_VIDEO_DELAY, 0);
|
||||
if ((aud_synch & ATI_DELAY_VIDEO_LATENCY) && (aud_synch & ATI_DELAY_AUDIO_LATENCY)) {
|
||||
int video_latency = (aud_synch & ATI_DELAY_VIDEO_LATENCY) - 1;
|
||||
int audio_latency = ((aud_synch & ATI_DELAY_AUDIO_LATENCY) >> 8) - 1;
|
||||
int video_latency_hdmi = (aud_synch & ATI_DELAY_VIDEO_LATENCY);
|
||||
int audio_latency_hdmi = (aud_synch & ATI_DELAY_AUDIO_LATENCY) >> 8;
|
||||
|
||||
if (video_latency > audio_latency)
|
||||
buf[6] = min(video_latency - audio_latency, 0xfa);
|
||||
if (video_latency_hdmi <= 0xfb && audio_latency_hdmi <= 0xfb &&
|
||||
video_latency_hdmi > audio_latency_hdmi)
|
||||
buf[6] = video_latency_hdmi - audio_latency_hdmi;
|
||||
/* else unknown/invalid or 0ms or video ahead of audio, so use zero */
|
||||
}
|
||||
|
||||
/* Baseline length */
|
||||
buf[2] = pos - 4;
|
||||
|
||||
/* SAD count */
|
||||
buf[5] |= ((pos - ELD_FIXED_BYTES - sink_desc_len) / 3) << 4;
|
||||
|
||||
/* Baseline ELD block length is 4-byte aligned */
|
||||
pos = round_up(pos, 4);
|
||||
|
||||
/* Baseline ELD length (4-byte header is not counted in) */
|
||||
buf[2] = (pos - 4) / 4;
|
||||
|
||||
*eld_size = pos;
|
||||
|
||||
return 0;
|
||||
|
@ -796,10 +796,10 @@ static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable)
|
||||
if (spec->own_eapd_ctl ||
|
||||
!(snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD))
|
||||
return;
|
||||
if (codec->inv_eapd)
|
||||
enable = !enable;
|
||||
if (spec->keep_eapd_on && !enable)
|
||||
return;
|
||||
if (codec->inv_eapd)
|
||||
enable = !enable;
|
||||
snd_hda_codec_update_cache(codec, pin, 0,
|
||||
AC_VERB_SET_EAPD_BTLENABLE,
|
||||
enable ? 0x02 : 0x00);
|
||||
|
@ -139,6 +139,18 @@ static int ad198x_suspend(struct hda_codec *codec)
|
||||
}
|
||||
#endif
|
||||
|
||||
/* follow EAPD via vmaster hook */
|
||||
static void ad_vmaster_eapd_hook(void *private_data, int enabled)
|
||||
{
|
||||
struct hda_codec *codec = private_data;
|
||||
struct ad198x_spec *spec = codec->spec;
|
||||
|
||||
if (!spec->eapd_nid)
|
||||
return;
|
||||
snd_hda_codec_update_cache(codec, spec->eapd_nid, 0,
|
||||
AC_VERB_SET_EAPD_BTLENABLE,
|
||||
enabled ? 0x02 : 0x00);
|
||||
}
|
||||
|
||||
/*
|
||||
* Automatic parse of I/O pins from the BIOS configuration
|
||||
@ -219,8 +231,14 @@ static int alloc_ad_spec(struct hda_codec *codec)
|
||||
static void ad_fixup_inv_jack_detect(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
if (action == HDA_FIXUP_ACT_PRE_PROBE)
|
||||
struct ad198x_spec *spec = codec->spec;
|
||||
|
||||
if (action == HDA_FIXUP_ACT_PRE_PROBE) {
|
||||
codec->inv_jack_detect = 1;
|
||||
spec->gen.keep_eapd_on = 1;
|
||||
spec->gen.vmaster_mute.hook = ad_vmaster_eapd_hook;
|
||||
spec->eapd_nid = 0x1b;
|
||||
}
|
||||
}
|
||||
|
||||
enum {
|
||||
@ -465,19 +483,6 @@ static int patch_ad1983(struct hda_codec *codec)
|
||||
* AD1981 HD specific
|
||||
*/
|
||||
|
||||
/* follow EAPD via vmaster hook */
|
||||
static void ad_vmaster_eapd_hook(void *private_data, int enabled)
|
||||
{
|
||||
struct hda_codec *codec = private_data;
|
||||
struct ad198x_spec *spec = codec->spec;
|
||||
|
||||
if (!spec->eapd_nid)
|
||||
return;
|
||||
snd_hda_codec_update_cache(codec, spec->eapd_nid, 0,
|
||||
AC_VERB_SET_EAPD_BTLENABLE,
|
||||
enabled ? 0x02 : 0x00);
|
||||
}
|
||||
|
||||
static void ad1981_fixup_hp_eapd(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
|
@ -47,6 +47,10 @@ struct cs_spec {
|
||||
unsigned int spdif_present:1;
|
||||
unsigned int sense_b:1;
|
||||
hda_nid_t vendor_nid;
|
||||
|
||||
/* for MBP SPDIF control */
|
||||
int (*spdif_sw_put)(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
};
|
||||
|
||||
/* available models with CS420x */
|
||||
@ -331,10 +335,21 @@ static int cs_init(struct hda_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cs_build_controls(struct hda_codec *codec)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = snd_hda_gen_build_controls(codec);
|
||||
if (err < 0)
|
||||
return err;
|
||||
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define cs_free snd_hda_gen_free
|
||||
|
||||
static const struct hda_codec_ops cs_patch_ops = {
|
||||
.build_controls = snd_hda_gen_build_controls,
|
||||
.build_controls = cs_build_controls,
|
||||
.build_pcms = snd_hda_gen_build_pcms,
|
||||
.init = cs_init,
|
||||
.free = cs_free,
|
||||
@ -599,12 +614,14 @@ static int patch_cs420x(struct hda_codec *codec)
|
||||
enum {
|
||||
CS4208_MAC_AUTO,
|
||||
CS4208_MBA6,
|
||||
CS4208_MBP11,
|
||||
CS4208_GPIO0,
|
||||
};
|
||||
|
||||
static const struct hda_model_fixup cs4208_models[] = {
|
||||
{ .id = CS4208_GPIO0, .name = "gpio0" },
|
||||
{ .id = CS4208_MBA6, .name = "mba6" },
|
||||
{ .id = CS4208_MBP11, .name = "mbp11" },
|
||||
{}
|
||||
};
|
||||
|
||||
@ -615,6 +632,7 @@ static const struct snd_pci_quirk cs4208_fixup_tbl[] = {
|
||||
|
||||
/* codec SSID matching */
|
||||
static const struct snd_pci_quirk cs4208_mac_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x106b, 0x5e00, "MacBookPro 11,2", CS4208_MBP11),
|
||||
SND_PCI_QUIRK(0x106b, 0x7100, "MacBookAir 6,1", CS4208_MBA6),
|
||||
SND_PCI_QUIRK(0x106b, 0x7200, "MacBookAir 6,2", CS4208_MBA6),
|
||||
{} /* terminator */
|
||||
@ -646,6 +664,36 @@ static void cs4208_fixup_mac(struct hda_codec *codec,
|
||||
snd_hda_apply_fixup(codec, action);
|
||||
}
|
||||
|
||||
static int cs4208_spdif_sw_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
struct cs_spec *spec = codec->spec;
|
||||
hda_nid_t pin = spec->gen.autocfg.dig_out_pins[0];
|
||||
int pinctl = ucontrol->value.integer.value[0] ? PIN_OUT : 0;
|
||||
|
||||
snd_hda_set_pin_ctl_cache(codec, pin, pinctl);
|
||||
return spec->spdif_sw_put(kcontrol, ucontrol);
|
||||
}
|
||||
|
||||
/* hook the SPDIF switch */
|
||||
static void cs4208_fixup_spdif_switch(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
if (action == HDA_FIXUP_ACT_BUILD) {
|
||||
struct cs_spec *spec = codec->spec;
|
||||
struct snd_kcontrol *kctl;
|
||||
|
||||
if (!spec->gen.autocfg.dig_out_pins[0])
|
||||
return;
|
||||
kctl = snd_hda_find_mixer_ctl(codec, "IEC958 Playback Switch");
|
||||
if (!kctl)
|
||||
return;
|
||||
spec->spdif_sw_put = kctl->put;
|
||||
kctl->put = cs4208_spdif_sw_put;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct hda_fixup cs4208_fixups[] = {
|
||||
[CS4208_MBA6] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
@ -653,6 +701,12 @@ static const struct hda_fixup cs4208_fixups[] = {
|
||||
.chained = true,
|
||||
.chain_id = CS4208_GPIO0,
|
||||
},
|
||||
[CS4208_MBP11] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = cs4208_fixup_spdif_switch,
|
||||
.chained = true,
|
||||
.chain_id = CS4208_GPIO0,
|
||||
},
|
||||
[CS4208_GPIO0] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = cs4208_fixup_gpio0,
|
||||
|
@ -763,12 +763,12 @@ static struct channel_map_table map_tables[] = {
|
||||
{ SNDRV_CHMAP_RC, RC },
|
||||
{ SNDRV_CHMAP_FLC, FLC },
|
||||
{ SNDRV_CHMAP_FRC, FRC },
|
||||
{ SNDRV_CHMAP_FLH, FLH },
|
||||
{ SNDRV_CHMAP_FRH, FRH },
|
||||
{ SNDRV_CHMAP_TFL, FLH },
|
||||
{ SNDRV_CHMAP_TFR, FRH },
|
||||
{ SNDRV_CHMAP_FLW, FLW },
|
||||
{ SNDRV_CHMAP_FRW, FRW },
|
||||
{ SNDRV_CHMAP_TC, TC },
|
||||
{ SNDRV_CHMAP_FCH, FCH },
|
||||
{ SNDRV_CHMAP_TFC, FCH },
|
||||
{} /* terminator */
|
||||
};
|
||||
|
||||
@ -1247,6 +1247,9 @@ static int hdmi_pin_hbr_setup(struct hda_codec *codec, hda_nid_t pin_nid,
|
||||
pinctl = snd_hda_codec_read(codec, pin_nid, 0,
|
||||
AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
|
||||
|
||||
if (pinctl < 0)
|
||||
return hbr ? -EINVAL : 0;
|
||||
|
||||
new_pinctl = pinctl & ~AC_PINCTL_EPT;
|
||||
if (hbr)
|
||||
new_pinctl |= AC_PINCTL_EPT_HBR;
|
||||
@ -3091,7 +3094,7 @@ static int atihdmi_pin_hbr_setup(struct hda_codec *codec, hda_nid_t pin_nid,
|
||||
int hbr_ctl, hbr_ctl_new;
|
||||
|
||||
hbr_ctl = snd_hda_codec_read(codec, pin_nid, 0, ATI_VERB_GET_HBR_CONTROL, 0);
|
||||
if (hbr_ctl & ATI_HBR_CAPABLE) {
|
||||
if (hbr_ctl >= 0 && (hbr_ctl & ATI_HBR_CAPABLE)) {
|
||||
if (hbr)
|
||||
hbr_ctl_new = hbr_ctl | ATI_HBR_ENABLE;
|
||||
else
|
||||
|
@ -3344,8 +3344,10 @@ static void alc_update_headset_mode(struct hda_codec *codec)
|
||||
else
|
||||
new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
|
||||
|
||||
if (new_headset_mode == spec->current_headset_mode)
|
||||
if (new_headset_mode == spec->current_headset_mode) {
|
||||
snd_hda_gen_update_outputs(codec);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (new_headset_mode) {
|
||||
case ALC_HEADSET_MODE_UNPLUGGED:
|
||||
|
@ -100,6 +100,7 @@ enum {
|
||||
STAC_92HD83XXX_HEADSET_JACK,
|
||||
STAC_92HD83XXX_HP,
|
||||
STAC_HP_ENVY_BASS,
|
||||
STAC_HP_BNB13_EQ,
|
||||
STAC_92HD83XXX_MODELS
|
||||
};
|
||||
|
||||
@ -2106,6 +2107,434 @@ static void stac92hd83xxx_fixup_headset_jack(struct hda_codec *codec,
|
||||
spec->headset_jack = 1;
|
||||
}
|
||||
|
||||
static const struct hda_verb hp_bnb13_eq_verbs[] = {
|
||||
/* 44.1KHz base */
|
||||
{ 0x22, 0x7A6, 0x3E },
|
||||
{ 0x22, 0x7A7, 0x68 },
|
||||
{ 0x22, 0x7A8, 0x17 },
|
||||
{ 0x22, 0x7A9, 0x3E },
|
||||
{ 0x22, 0x7AA, 0x68 },
|
||||
{ 0x22, 0x7AB, 0x17 },
|
||||
{ 0x22, 0x7AC, 0x00 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x83 },
|
||||
{ 0x22, 0x7A7, 0x2F },
|
||||
{ 0x22, 0x7A8, 0xD1 },
|
||||
{ 0x22, 0x7A9, 0x83 },
|
||||
{ 0x22, 0x7AA, 0x2F },
|
||||
{ 0x22, 0x7AB, 0xD1 },
|
||||
{ 0x22, 0x7AC, 0x01 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x3E },
|
||||
{ 0x22, 0x7A7, 0x68 },
|
||||
{ 0x22, 0x7A8, 0x17 },
|
||||
{ 0x22, 0x7A9, 0x3E },
|
||||
{ 0x22, 0x7AA, 0x68 },
|
||||
{ 0x22, 0x7AB, 0x17 },
|
||||
{ 0x22, 0x7AC, 0x02 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x7C },
|
||||
{ 0x22, 0x7A7, 0xC6 },
|
||||
{ 0x22, 0x7A8, 0x0C },
|
||||
{ 0x22, 0x7A9, 0x7C },
|
||||
{ 0x22, 0x7AA, 0xC6 },
|
||||
{ 0x22, 0x7AB, 0x0C },
|
||||
{ 0x22, 0x7AC, 0x03 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0xC3 },
|
||||
{ 0x22, 0x7A7, 0x25 },
|
||||
{ 0x22, 0x7A8, 0xAF },
|
||||
{ 0x22, 0x7A9, 0xC3 },
|
||||
{ 0x22, 0x7AA, 0x25 },
|
||||
{ 0x22, 0x7AB, 0xAF },
|
||||
{ 0x22, 0x7AC, 0x04 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x3E },
|
||||
{ 0x22, 0x7A7, 0x85 },
|
||||
{ 0x22, 0x7A8, 0x73 },
|
||||
{ 0x22, 0x7A9, 0x3E },
|
||||
{ 0x22, 0x7AA, 0x85 },
|
||||
{ 0x22, 0x7AB, 0x73 },
|
||||
{ 0x22, 0x7AC, 0x05 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x85 },
|
||||
{ 0x22, 0x7A7, 0x39 },
|
||||
{ 0x22, 0x7A8, 0xC7 },
|
||||
{ 0x22, 0x7A9, 0x85 },
|
||||
{ 0x22, 0x7AA, 0x39 },
|
||||
{ 0x22, 0x7AB, 0xC7 },
|
||||
{ 0x22, 0x7AC, 0x06 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x3C },
|
||||
{ 0x22, 0x7A7, 0x90 },
|
||||
{ 0x22, 0x7A8, 0xB0 },
|
||||
{ 0x22, 0x7A9, 0x3C },
|
||||
{ 0x22, 0x7AA, 0x90 },
|
||||
{ 0x22, 0x7AB, 0xB0 },
|
||||
{ 0x22, 0x7AC, 0x07 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x7A },
|
||||
{ 0x22, 0x7A7, 0xC6 },
|
||||
{ 0x22, 0x7A8, 0x39 },
|
||||
{ 0x22, 0x7A9, 0x7A },
|
||||
{ 0x22, 0x7AA, 0xC6 },
|
||||
{ 0x22, 0x7AB, 0x39 },
|
||||
{ 0x22, 0x7AC, 0x08 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0xC4 },
|
||||
{ 0x22, 0x7A7, 0xE9 },
|
||||
{ 0x22, 0x7A8, 0xDC },
|
||||
{ 0x22, 0x7A9, 0xC4 },
|
||||
{ 0x22, 0x7AA, 0xE9 },
|
||||
{ 0x22, 0x7AB, 0xDC },
|
||||
{ 0x22, 0x7AC, 0x09 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x3D },
|
||||
{ 0x22, 0x7A7, 0xE1 },
|
||||
{ 0x22, 0x7A8, 0x0D },
|
||||
{ 0x22, 0x7A9, 0x3D },
|
||||
{ 0x22, 0x7AA, 0xE1 },
|
||||
{ 0x22, 0x7AB, 0x0D },
|
||||
{ 0x22, 0x7AC, 0x0A },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x89 },
|
||||
{ 0x22, 0x7A7, 0xB6 },
|
||||
{ 0x22, 0x7A8, 0xEB },
|
||||
{ 0x22, 0x7A9, 0x89 },
|
||||
{ 0x22, 0x7AA, 0xB6 },
|
||||
{ 0x22, 0x7AB, 0xEB },
|
||||
{ 0x22, 0x7AC, 0x0B },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x39 },
|
||||
{ 0x22, 0x7A7, 0x9D },
|
||||
{ 0x22, 0x7A8, 0xFE },
|
||||
{ 0x22, 0x7A9, 0x39 },
|
||||
{ 0x22, 0x7AA, 0x9D },
|
||||
{ 0x22, 0x7AB, 0xFE },
|
||||
{ 0x22, 0x7AC, 0x0C },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x76 },
|
||||
{ 0x22, 0x7A7, 0x49 },
|
||||
{ 0x22, 0x7A8, 0x15 },
|
||||
{ 0x22, 0x7A9, 0x76 },
|
||||
{ 0x22, 0x7AA, 0x49 },
|
||||
{ 0x22, 0x7AB, 0x15 },
|
||||
{ 0x22, 0x7AC, 0x0D },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0xC8 },
|
||||
{ 0x22, 0x7A7, 0x80 },
|
||||
{ 0x22, 0x7A8, 0xF5 },
|
||||
{ 0x22, 0x7A9, 0xC8 },
|
||||
{ 0x22, 0x7AA, 0x80 },
|
||||
{ 0x22, 0x7AB, 0xF5 },
|
||||
{ 0x22, 0x7AC, 0x0E },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x40 },
|
||||
{ 0x22, 0x7A7, 0x00 },
|
||||
{ 0x22, 0x7A8, 0x00 },
|
||||
{ 0x22, 0x7A9, 0x40 },
|
||||
{ 0x22, 0x7AA, 0x00 },
|
||||
{ 0x22, 0x7AB, 0x00 },
|
||||
{ 0x22, 0x7AC, 0x0F },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x90 },
|
||||
{ 0x22, 0x7A7, 0x68 },
|
||||
{ 0x22, 0x7A8, 0xF1 },
|
||||
{ 0x22, 0x7A9, 0x90 },
|
||||
{ 0x22, 0x7AA, 0x68 },
|
||||
{ 0x22, 0x7AB, 0xF1 },
|
||||
{ 0x22, 0x7AC, 0x10 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x34 },
|
||||
{ 0x22, 0x7A7, 0x47 },
|
||||
{ 0x22, 0x7A8, 0x6C },
|
||||
{ 0x22, 0x7A9, 0x34 },
|
||||
{ 0x22, 0x7AA, 0x47 },
|
||||
{ 0x22, 0x7AB, 0x6C },
|
||||
{ 0x22, 0x7AC, 0x11 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x6F },
|
||||
{ 0x22, 0x7A7, 0x97 },
|
||||
{ 0x22, 0x7A8, 0x0F },
|
||||
{ 0x22, 0x7A9, 0x6F },
|
||||
{ 0x22, 0x7AA, 0x97 },
|
||||
{ 0x22, 0x7AB, 0x0F },
|
||||
{ 0x22, 0x7AC, 0x12 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0xCB },
|
||||
{ 0x22, 0x7A7, 0xB8 },
|
||||
{ 0x22, 0x7A8, 0x94 },
|
||||
{ 0x22, 0x7A9, 0xCB },
|
||||
{ 0x22, 0x7AA, 0xB8 },
|
||||
{ 0x22, 0x7AB, 0x94 },
|
||||
{ 0x22, 0x7AC, 0x13 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x40 },
|
||||
{ 0x22, 0x7A7, 0x00 },
|
||||
{ 0x22, 0x7A8, 0x00 },
|
||||
{ 0x22, 0x7A9, 0x40 },
|
||||
{ 0x22, 0x7AA, 0x00 },
|
||||
{ 0x22, 0x7AB, 0x00 },
|
||||
{ 0x22, 0x7AC, 0x14 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x95 },
|
||||
{ 0x22, 0x7A7, 0x76 },
|
||||
{ 0x22, 0x7A8, 0x5B },
|
||||
{ 0x22, 0x7A9, 0x95 },
|
||||
{ 0x22, 0x7AA, 0x76 },
|
||||
{ 0x22, 0x7AB, 0x5B },
|
||||
{ 0x22, 0x7AC, 0x15 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x31 },
|
||||
{ 0x22, 0x7A7, 0xAC },
|
||||
{ 0x22, 0x7A8, 0x31 },
|
||||
{ 0x22, 0x7A9, 0x31 },
|
||||
{ 0x22, 0x7AA, 0xAC },
|
||||
{ 0x22, 0x7AB, 0x31 },
|
||||
{ 0x22, 0x7AC, 0x16 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x6A },
|
||||
{ 0x22, 0x7A7, 0x89 },
|
||||
{ 0x22, 0x7A8, 0xA5 },
|
||||
{ 0x22, 0x7A9, 0x6A },
|
||||
{ 0x22, 0x7AA, 0x89 },
|
||||
{ 0x22, 0x7AB, 0xA5 },
|
||||
{ 0x22, 0x7AC, 0x17 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0xCE },
|
||||
{ 0x22, 0x7A7, 0x53 },
|
||||
{ 0x22, 0x7A8, 0xCF },
|
||||
{ 0x22, 0x7A9, 0xCE },
|
||||
{ 0x22, 0x7AA, 0x53 },
|
||||
{ 0x22, 0x7AB, 0xCF },
|
||||
{ 0x22, 0x7AC, 0x18 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x40 },
|
||||
{ 0x22, 0x7A7, 0x00 },
|
||||
{ 0x22, 0x7A8, 0x00 },
|
||||
{ 0x22, 0x7A9, 0x40 },
|
||||
{ 0x22, 0x7AA, 0x00 },
|
||||
{ 0x22, 0x7AB, 0x00 },
|
||||
{ 0x22, 0x7AC, 0x19 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
/* 48KHz base */
|
||||
{ 0x22, 0x7A6, 0x3E },
|
||||
{ 0x22, 0x7A7, 0x88 },
|
||||
{ 0x22, 0x7A8, 0xDC },
|
||||
{ 0x22, 0x7A9, 0x3E },
|
||||
{ 0x22, 0x7AA, 0x88 },
|
||||
{ 0x22, 0x7AB, 0xDC },
|
||||
{ 0x22, 0x7AC, 0x1A },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x82 },
|
||||
{ 0x22, 0x7A7, 0xEE },
|
||||
{ 0x22, 0x7A8, 0x46 },
|
||||
{ 0x22, 0x7A9, 0x82 },
|
||||
{ 0x22, 0x7AA, 0xEE },
|
||||
{ 0x22, 0x7AB, 0x46 },
|
||||
{ 0x22, 0x7AC, 0x1B },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x3E },
|
||||
{ 0x22, 0x7A7, 0x88 },
|
||||
{ 0x22, 0x7A8, 0xDC },
|
||||
{ 0x22, 0x7A9, 0x3E },
|
||||
{ 0x22, 0x7AA, 0x88 },
|
||||
{ 0x22, 0x7AB, 0xDC },
|
||||
{ 0x22, 0x7AC, 0x1C },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x7D },
|
||||
{ 0x22, 0x7A7, 0x09 },
|
||||
{ 0x22, 0x7A8, 0x28 },
|
||||
{ 0x22, 0x7A9, 0x7D },
|
||||
{ 0x22, 0x7AA, 0x09 },
|
||||
{ 0x22, 0x7AB, 0x28 },
|
||||
{ 0x22, 0x7AC, 0x1D },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0xC2 },
|
||||
{ 0x22, 0x7A7, 0xE5 },
|
||||
{ 0x22, 0x7A8, 0xB4 },
|
||||
{ 0x22, 0x7A9, 0xC2 },
|
||||
{ 0x22, 0x7AA, 0xE5 },
|
||||
{ 0x22, 0x7AB, 0xB4 },
|
||||
{ 0x22, 0x7AC, 0x1E },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x3E },
|
||||
{ 0x22, 0x7A7, 0xA3 },
|
||||
{ 0x22, 0x7A8, 0x1F },
|
||||
{ 0x22, 0x7A9, 0x3E },
|
||||
{ 0x22, 0x7AA, 0xA3 },
|
||||
{ 0x22, 0x7AB, 0x1F },
|
||||
{ 0x22, 0x7AC, 0x1F },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x84 },
|
||||
{ 0x22, 0x7A7, 0xCA },
|
||||
{ 0x22, 0x7A8, 0xF1 },
|
||||
{ 0x22, 0x7A9, 0x84 },
|
||||
{ 0x22, 0x7AA, 0xCA },
|
||||
{ 0x22, 0x7AB, 0xF1 },
|
||||
{ 0x22, 0x7AC, 0x20 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x3C },
|
||||
{ 0x22, 0x7A7, 0xD5 },
|
||||
{ 0x22, 0x7A8, 0x9C },
|
||||
{ 0x22, 0x7A9, 0x3C },
|
||||
{ 0x22, 0x7AA, 0xD5 },
|
||||
{ 0x22, 0x7AB, 0x9C },
|
||||
{ 0x22, 0x7AC, 0x21 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x7B },
|
||||
{ 0x22, 0x7A7, 0x35 },
|
||||
{ 0x22, 0x7A8, 0x0F },
|
||||
{ 0x22, 0x7A9, 0x7B },
|
||||
{ 0x22, 0x7AA, 0x35 },
|
||||
{ 0x22, 0x7AB, 0x0F },
|
||||
{ 0x22, 0x7AC, 0x22 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0xC4 },
|
||||
{ 0x22, 0x7A7, 0x87 },
|
||||
{ 0x22, 0x7A8, 0x45 },
|
||||
{ 0x22, 0x7A9, 0xC4 },
|
||||
{ 0x22, 0x7AA, 0x87 },
|
||||
{ 0x22, 0x7AB, 0x45 },
|
||||
{ 0x22, 0x7AC, 0x23 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x3E },
|
||||
{ 0x22, 0x7A7, 0x0A },
|
||||
{ 0x22, 0x7A8, 0x78 },
|
||||
{ 0x22, 0x7A9, 0x3E },
|
||||
{ 0x22, 0x7AA, 0x0A },
|
||||
{ 0x22, 0x7AB, 0x78 },
|
||||
{ 0x22, 0x7AC, 0x24 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x88 },
|
||||
{ 0x22, 0x7A7, 0xE2 },
|
||||
{ 0x22, 0x7A8, 0x05 },
|
||||
{ 0x22, 0x7A9, 0x88 },
|
||||
{ 0x22, 0x7AA, 0xE2 },
|
||||
{ 0x22, 0x7AB, 0x05 },
|
||||
{ 0x22, 0x7AC, 0x25 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x3A },
|
||||
{ 0x22, 0x7A7, 0x1A },
|
||||
{ 0x22, 0x7A8, 0xA3 },
|
||||
{ 0x22, 0x7A9, 0x3A },
|
||||
{ 0x22, 0x7AA, 0x1A },
|
||||
{ 0x22, 0x7AB, 0xA3 },
|
||||
{ 0x22, 0x7AC, 0x26 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x77 },
|
||||
{ 0x22, 0x7A7, 0x1D },
|
||||
{ 0x22, 0x7A8, 0xFB },
|
||||
{ 0x22, 0x7A9, 0x77 },
|
||||
{ 0x22, 0x7AA, 0x1D },
|
||||
{ 0x22, 0x7AB, 0xFB },
|
||||
{ 0x22, 0x7AC, 0x27 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0xC7 },
|
||||
{ 0x22, 0x7A7, 0xDA },
|
||||
{ 0x22, 0x7A8, 0xE5 },
|
||||
{ 0x22, 0x7A9, 0xC7 },
|
||||
{ 0x22, 0x7AA, 0xDA },
|
||||
{ 0x22, 0x7AB, 0xE5 },
|
||||
{ 0x22, 0x7AC, 0x28 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x40 },
|
||||
{ 0x22, 0x7A7, 0x00 },
|
||||
{ 0x22, 0x7A8, 0x00 },
|
||||
{ 0x22, 0x7A9, 0x40 },
|
||||
{ 0x22, 0x7AA, 0x00 },
|
||||
{ 0x22, 0x7AB, 0x00 },
|
||||
{ 0x22, 0x7AC, 0x29 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x8E },
|
||||
{ 0x22, 0x7A7, 0xD7 },
|
||||
{ 0x22, 0x7A8, 0x22 },
|
||||
{ 0x22, 0x7A9, 0x8E },
|
||||
{ 0x22, 0x7AA, 0xD7 },
|
||||
{ 0x22, 0x7AB, 0x22 },
|
||||
{ 0x22, 0x7AC, 0x2A },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x35 },
|
||||
{ 0x22, 0x7A7, 0x26 },
|
||||
{ 0x22, 0x7A8, 0xC6 },
|
||||
{ 0x22, 0x7A9, 0x35 },
|
||||
{ 0x22, 0x7AA, 0x26 },
|
||||
{ 0x22, 0x7AB, 0xC6 },
|
||||
{ 0x22, 0x7AC, 0x2B },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x71 },
|
||||
{ 0x22, 0x7A7, 0x28 },
|
||||
{ 0x22, 0x7A8, 0xDE },
|
||||
{ 0x22, 0x7A9, 0x71 },
|
||||
{ 0x22, 0x7AA, 0x28 },
|
||||
{ 0x22, 0x7AB, 0xDE },
|
||||
{ 0x22, 0x7AC, 0x2C },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0xCA },
|
||||
{ 0x22, 0x7A7, 0xD9 },
|
||||
{ 0x22, 0x7A8, 0x3A },
|
||||
{ 0x22, 0x7A9, 0xCA },
|
||||
{ 0x22, 0x7AA, 0xD9 },
|
||||
{ 0x22, 0x7AB, 0x3A },
|
||||
{ 0x22, 0x7AC, 0x2D },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x40 },
|
||||
{ 0x22, 0x7A7, 0x00 },
|
||||
{ 0x22, 0x7A8, 0x00 },
|
||||
{ 0x22, 0x7A9, 0x40 },
|
||||
{ 0x22, 0x7AA, 0x00 },
|
||||
{ 0x22, 0x7AB, 0x00 },
|
||||
{ 0x22, 0x7AC, 0x2E },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x93 },
|
||||
{ 0x22, 0x7A7, 0x5E },
|
||||
{ 0x22, 0x7A8, 0xD8 },
|
||||
{ 0x22, 0x7A9, 0x93 },
|
||||
{ 0x22, 0x7AA, 0x5E },
|
||||
{ 0x22, 0x7AB, 0xD8 },
|
||||
{ 0x22, 0x7AC, 0x2F },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x32 },
|
||||
{ 0x22, 0x7A7, 0xB7 },
|
||||
{ 0x22, 0x7A8, 0xB1 },
|
||||
{ 0x22, 0x7A9, 0x32 },
|
||||
{ 0x22, 0x7AA, 0xB7 },
|
||||
{ 0x22, 0x7AB, 0xB1 },
|
||||
{ 0x22, 0x7AC, 0x30 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x6C },
|
||||
{ 0x22, 0x7A7, 0xA1 },
|
||||
{ 0x22, 0x7A8, 0x28 },
|
||||
{ 0x22, 0x7A9, 0x6C },
|
||||
{ 0x22, 0x7AA, 0xA1 },
|
||||
{ 0x22, 0x7AB, 0x28 },
|
||||
{ 0x22, 0x7AC, 0x31 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0xCD },
|
||||
{ 0x22, 0x7A7, 0x48 },
|
||||
{ 0x22, 0x7A8, 0x4F },
|
||||
{ 0x22, 0x7A9, 0xCD },
|
||||
{ 0x22, 0x7AA, 0x48 },
|
||||
{ 0x22, 0x7AB, 0x4F },
|
||||
{ 0x22, 0x7AC, 0x32 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
{ 0x22, 0x7A6, 0x40 },
|
||||
{ 0x22, 0x7A7, 0x00 },
|
||||
{ 0x22, 0x7A8, 0x00 },
|
||||
{ 0x22, 0x7A9, 0x40 },
|
||||
{ 0x22, 0x7AA, 0x00 },
|
||||
{ 0x22, 0x7AB, 0x00 },
|
||||
{ 0x22, 0x7AC, 0x33 },
|
||||
{ 0x22, 0x7AD, 0x80 },
|
||||
/* common */
|
||||
{ 0x22, 0x782, 0xC1 },
|
||||
{ 0x22, 0x771, 0x2C },
|
||||
{ 0x22, 0x772, 0x2C },
|
||||
{ 0x22, 0x788, 0x04 },
|
||||
{ 0x01, 0x7B0, 0x08 },
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct hda_fixup stac92hd83xxx_fixups[] = {
|
||||
[STAC_92HD83XXX_REF] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
@ -2174,6 +2603,12 @@ static const struct hda_fixup stac92hd83xxx_fixups[] = {
|
||||
{}
|
||||
},
|
||||
},
|
||||
[STAC_HP_BNB13_EQ] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
.v.verbs = hp_bnb13_eq_verbs,
|
||||
.chained = true,
|
||||
.chain_id = STAC_92HD83XXX_HP_MIC_LED,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct hda_model_fixup stac92hd83xxx_models[] = {
|
||||
@ -2189,6 +2624,7 @@ static const struct hda_model_fixup stac92hd83xxx_models[] = {
|
||||
{ .id = STAC_92HD83XXX_HP_MIC_LED, .name = "hp-mic-led" },
|
||||
{ .id = STAC_92HD83XXX_HEADSET_JACK, .name = "headset-jack" },
|
||||
{ .id = STAC_HP_ENVY_BASS, .name = "hp-envy-bass" },
|
||||
{ .id = STAC_HP_BNB13_EQ, .name = "hp-bnb13-eq" },
|
||||
{}
|
||||
};
|
||||
|
||||
@ -2235,7 +2671,101 @@ static const struct snd_pci_quirk stac92hd83xxx_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1888,
|
||||
"HP Envy Spectre", STAC_HP_ENVY_BASS),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18df,
|
||||
"HP Folio", STAC_92HD83XXX_HP_MIC_LED),
|
||||
"HP Folio", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18F8,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1909,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x190A,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1940,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1941,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1942,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1943,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1944,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1945,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1946,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1948,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1949,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194A,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194B,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194C,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194E,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194F,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1950,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1951,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x195A,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x195B,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x195C,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1991,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2103,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2104,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2105,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2106,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2107,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2108,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2109,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x210A,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x210B,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211C,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211D,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211E,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211F,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2120,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2121,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2122,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2123,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x213E,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x213F,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2140,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B2,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B3,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B5,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B6,
|
||||
"HP bNB13", STAC_HP_BNB13_EQ),
|
||||
SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x1900,
|
||||
"HP", STAC_92HD83XXX_HP_MIC_LED),
|
||||
SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x2000,
|
||||
|
@ -121,6 +121,7 @@ static int bf5xx_i2s_hw_params(struct snd_pcm_substream *substream,
|
||||
bf5xx_i2s->tcr2 |= 7;
|
||||
bf5xx_i2s->rcr2 |= 7;
|
||||
sport_handle->wdsize = 1;
|
||||
break;
|
||||
case SNDRV_PCM_FORMAT_S16_LE:
|
||||
bf5xx_i2s->tcr2 |= 15;
|
||||
bf5xx_i2s->rcr2 |= 15;
|
||||
|
@ -179,7 +179,7 @@
|
||||
#define CS42L52_MICB_CTL 0x11
|
||||
#define CS42L52_MIC_CTL_MIC_SEL_MASK 0xBF
|
||||
#define CS42L52_MIC_CTL_MIC_SEL_SHIFT 6
|
||||
#define CS42L52_MIC_CTL_TYPE_MASK 0xDF
|
||||
#define CS42L52_MIC_CTL_TYPE_MASK 0x20
|
||||
#define CS42L52_MIC_CTL_TYPE_SHIFT 5
|
||||
|
||||
|
||||
|
@ -685,13 +685,13 @@ ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE),
|
||||
ARIZONA_MIXER_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE),
|
||||
ARIZONA_MIXER_CONTROLS("EQ4", ARIZONA_EQ4MIX_INPUT_1_SOURCE),
|
||||
|
||||
SND_SOC_BYTES_MASK("EQ1 Coefficeints", ARIZONA_EQ1_1, 21,
|
||||
SND_SOC_BYTES_MASK("EQ1 Coefficients", ARIZONA_EQ1_1, 21,
|
||||
ARIZONA_EQ1_ENA_MASK),
|
||||
SND_SOC_BYTES_MASK("EQ2 Coefficeints", ARIZONA_EQ2_1, 21,
|
||||
SND_SOC_BYTES_MASK("EQ2 Coefficients", ARIZONA_EQ2_1, 21,
|
||||
ARIZONA_EQ2_ENA_MASK),
|
||||
SND_SOC_BYTES_MASK("EQ3 Coefficeints", ARIZONA_EQ3_1, 21,
|
||||
SND_SOC_BYTES_MASK("EQ3 Coefficients", ARIZONA_EQ3_1, 21,
|
||||
ARIZONA_EQ3_ENA_MASK),
|
||||
SND_SOC_BYTES_MASK("EQ4 Coefficeints", ARIZONA_EQ4_1, 21,
|
||||
SND_SOC_BYTES_MASK("EQ4 Coefficients", ARIZONA_EQ4_1, 21,
|
||||
ARIZONA_EQ4_ENA_MASK),
|
||||
|
||||
SOC_SINGLE_TLV("EQ1 B1 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B1_GAIN_SHIFT,
|
||||
|
@ -101,13 +101,13 @@ ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE),
|
||||
ARIZONA_MIXER_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE),
|
||||
ARIZONA_MIXER_CONTROLS("EQ4", ARIZONA_EQ4MIX_INPUT_1_SOURCE),
|
||||
|
||||
SND_SOC_BYTES_MASK("EQ1 Coefficeints", ARIZONA_EQ1_1, 21,
|
||||
SND_SOC_BYTES_MASK("EQ1 Coefficients", ARIZONA_EQ1_1, 21,
|
||||
ARIZONA_EQ1_ENA_MASK),
|
||||
SND_SOC_BYTES_MASK("EQ2 Coefficeints", ARIZONA_EQ2_1, 21,
|
||||
SND_SOC_BYTES_MASK("EQ2 Coefficients", ARIZONA_EQ2_1, 21,
|
||||
ARIZONA_EQ2_ENA_MASK),
|
||||
SND_SOC_BYTES_MASK("EQ3 Coefficeints", ARIZONA_EQ3_1, 21,
|
||||
SND_SOC_BYTES_MASK("EQ3 Coefficients", ARIZONA_EQ3_1, 21,
|
||||
ARIZONA_EQ3_ENA_MASK),
|
||||
SND_SOC_BYTES_MASK("EQ4 Coefficeints", ARIZONA_EQ4_1, 21,
|
||||
SND_SOC_BYTES_MASK("EQ4 Coefficients", ARIZONA_EQ4_1, 21,
|
||||
ARIZONA_EQ4_ENA_MASK),
|
||||
|
||||
SOC_SINGLE_TLV("EQ1 B1 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B1_GAIN_SHIFT,
|
||||
|
@ -3728,6 +3728,8 @@ static int wm8962_i2c_probe(struct i2c_client *i2c,
|
||||
if (ret < 0)
|
||||
goto err_enable;
|
||||
|
||||
regcache_cache_only(wm8962->regmap, true);
|
||||
|
||||
/* The drivers should power up as needed */
|
||||
regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies);
|
||||
|
||||
|
@ -170,13 +170,13 @@ ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE),
|
||||
ARIZONA_MIXER_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE),
|
||||
ARIZONA_MIXER_CONTROLS("EQ4", ARIZONA_EQ4MIX_INPUT_1_SOURCE),
|
||||
|
||||
SND_SOC_BYTES_MASK("EQ1 Coefficeints", ARIZONA_EQ1_1, 21,
|
||||
SND_SOC_BYTES_MASK("EQ1 Coefficients", ARIZONA_EQ1_1, 21,
|
||||
ARIZONA_EQ1_ENA_MASK),
|
||||
SND_SOC_BYTES_MASK("EQ2 Coefficeints", ARIZONA_EQ2_1, 21,
|
||||
SND_SOC_BYTES_MASK("EQ2 Coefficients", ARIZONA_EQ2_1, 21,
|
||||
ARIZONA_EQ2_ENA_MASK),
|
||||
SND_SOC_BYTES_MASK("EQ3 Coefficeints", ARIZONA_EQ3_1, 21,
|
||||
SND_SOC_BYTES_MASK("EQ3 Coefficients", ARIZONA_EQ3_1, 21,
|
||||
ARIZONA_EQ3_ENA_MASK),
|
||||
SND_SOC_BYTES_MASK("EQ4 Coefficeints", ARIZONA_EQ4_1, 21,
|
||||
SND_SOC_BYTES_MASK("EQ4 Coefficients", ARIZONA_EQ4_1, 21,
|
||||
ARIZONA_EQ4_ENA_MASK),
|
||||
|
||||
SOC_SINGLE_TLV("EQ1 B1 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B1_GAIN_SHIFT,
|
||||
@ -887,7 +887,7 @@ static const struct snd_soc_dapm_route wm8997_dapm_routes[] = {
|
||||
ARIZONA_MIXER_ROUTES("Mic Mute Mixer", "Mic"),
|
||||
|
||||
ARIZONA_MUX_ROUTES("ISRC1INT1", "ISRC1INT1"),
|
||||
ARIZONA_MUX_ROUTES("ISRC1INT2", "ISRC2INT2"),
|
||||
ARIZONA_MUX_ROUTES("ISRC1INT2", "ISRC1INT2"),
|
||||
|
||||
ARIZONA_MUX_ROUTES("ISRC1DEC1", "ISRC1DEC1"),
|
||||
ARIZONA_MUX_ROUTES("ISRC1DEC2", "ISRC1DEC2"),
|
||||
|
@ -42,7 +42,8 @@ struct imx_pcm_runtime_data {
|
||||
struct hrtimer hrt;
|
||||
int poll_time_ns;
|
||||
struct snd_pcm_substream *substream;
|
||||
atomic_t running;
|
||||
atomic_t playing;
|
||||
atomic_t capturing;
|
||||
};
|
||||
|
||||
static enum hrtimer_restart snd_hrtimer_callback(struct hrtimer *hrt)
|
||||
@ -52,7 +53,7 @@ static enum hrtimer_restart snd_hrtimer_callback(struct hrtimer *hrt)
|
||||
struct snd_pcm_substream *substream = iprtd->substream;
|
||||
struct pt_regs regs;
|
||||
|
||||
if (!atomic_read(&iprtd->running))
|
||||
if (!atomic_read(&iprtd->playing) && !atomic_read(&iprtd->capturing))
|
||||
return HRTIMER_NORESTART;
|
||||
|
||||
get_fiq_regs(®s);
|
||||
@ -106,7 +107,6 @@ static int snd_imx_pcm_prepare(struct snd_pcm_substream *substream)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fiq_enable;
|
||||
static int imx_pcm_fiq;
|
||||
|
||||
static int snd_imx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
||||
@ -118,23 +118,27 @@ static int snd_imx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
case SNDRV_PCM_TRIGGER_RESUME:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||
atomic_set(&iprtd->running, 1);
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
atomic_set(&iprtd->playing, 1);
|
||||
else
|
||||
atomic_set(&iprtd->capturing, 1);
|
||||
hrtimer_start(&iprtd->hrt, ns_to_ktime(iprtd->poll_time_ns),
|
||||
HRTIMER_MODE_REL);
|
||||
if (++fiq_enable == 1)
|
||||
enable_fiq(imx_pcm_fiq);
|
||||
|
||||
enable_fiq(imx_pcm_fiq);
|
||||
break;
|
||||
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
||||
atomic_set(&iprtd->running, 0);
|
||||
|
||||
if (--fiq_enable == 0)
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
atomic_set(&iprtd->playing, 0);
|
||||
else
|
||||
atomic_set(&iprtd->capturing, 0);
|
||||
if (!atomic_read(&iprtd->playing) &&
|
||||
!atomic_read(&iprtd->capturing))
|
||||
disable_fiq(imx_pcm_fiq);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -182,7 +186,8 @@ static int snd_imx_open(struct snd_pcm_substream *substream)
|
||||
|
||||
iprtd->substream = substream;
|
||||
|
||||
atomic_set(&iprtd->running, 0);
|
||||
atomic_set(&iprtd->playing, 0);
|
||||
atomic_set(&iprtd->capturing, 0);
|
||||
hrtimer_init(&iprtd->hrt, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||
iprtd->hrt.function = snd_hrtimer_callback;
|
||||
|
||||
|
@ -907,19 +907,24 @@ static int snd_cs4231_playback_prepare(struct snd_pcm_substream *substream)
|
||||
struct snd_cs4231 *chip = snd_pcm_substream_chip(substream);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
|
||||
spin_lock_irqsave(&chip->lock, flags);
|
||||
|
||||
chip->image[CS4231_IFACE_CTRL] &= ~(CS4231_PLAYBACK_ENABLE |
|
||||
CS4231_PLAYBACK_PIO);
|
||||
|
||||
if (WARN_ON(runtime->period_size > 0xffff + 1))
|
||||
return -EINVAL;
|
||||
if (WARN_ON(runtime->period_size > 0xffff + 1)) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
chip->p_periods_sent = 0;
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&chip->lock, flags);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int snd_cs4231_capture_hw_params(struct snd_pcm_substream *substream,
|
||||
|
@ -433,6 +433,89 @@ static void snd_audigy2nx_proc_read(struct snd_info_entry *entry,
|
||||
}
|
||||
}
|
||||
|
||||
/* EMU0204 */
|
||||
static int snd_emu0204_ch_switch_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo)
|
||||
{
|
||||
static const char *texts[2] = {"1/2",
|
||||
"3/4"
|
||||
};
|
||||
|
||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
|
||||
uinfo->count = 1;
|
||||
uinfo->value.enumerated.items = 2;
|
||||
if (uinfo->value.enumerated.item > 1)
|
||||
uinfo->value.enumerated.item = 1;
|
||||
strcpy(uinfo->value.enumerated.name,
|
||||
texts[uinfo->value.enumerated.item]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_emu0204_ch_switch_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
ucontrol->value.enumerated.item[0] = kcontrol->private_value;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_emu0204_ch_switch_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
|
||||
unsigned int value = ucontrol->value.enumerated.item[0];
|
||||
int err, changed;
|
||||
unsigned char buf[2];
|
||||
|
||||
if (value > 1)
|
||||
return -EINVAL;
|
||||
|
||||
buf[0] = 0x01;
|
||||
buf[1] = value ? 0x02 : 0x01;
|
||||
|
||||
changed = value != kcontrol->private_value;
|
||||
down_read(&mixer->chip->shutdown_rwsem);
|
||||
if (mixer->chip->shutdown) {
|
||||
err = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
err = snd_usb_ctl_msg(mixer->chip->dev,
|
||||
usb_sndctrlpipe(mixer->chip->dev, 0), UAC_SET_CUR,
|
||||
USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
|
||||
0x0400, 0x0e00, buf, 2);
|
||||
out:
|
||||
up_read(&mixer->chip->shutdown_rwsem);
|
||||
if (err < 0)
|
||||
return err;
|
||||
kcontrol->private_value = value;
|
||||
return changed;
|
||||
}
|
||||
|
||||
|
||||
static struct snd_kcontrol_new snd_emu0204_controls[] = {
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "Front Jack Channels",
|
||||
.info = snd_emu0204_ch_switch_info,
|
||||
.get = snd_emu0204_ch_switch_get,
|
||||
.put = snd_emu0204_ch_switch_put,
|
||||
.private_value = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
|
||||
{
|
||||
int i, err;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(snd_emu0204_controls); ++i) {
|
||||
err = snd_ctl_add(mixer->chip->card,
|
||||
snd_ctl_new1(&snd_emu0204_controls[i], mixer));
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* ASUS Xonar U1 / U3 controls */
|
||||
|
||||
static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
|
||||
@ -1545,6 +1628,13 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
|
||||
snd_audigy2nx_proc_read);
|
||||
break;
|
||||
|
||||
/* EMU0204 */
|
||||
case USB_ID(0x041e, 0x3f19):
|
||||
err = snd_emu0204_controls_create(mixer);
|
||||
if (err < 0)
|
||||
break;
|
||||
break;
|
||||
|
||||
case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
|
||||
case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
|
||||
err = snd_c400_create_mixer(mixer);
|
||||
|
@ -273,8 +273,8 @@ static struct snd_pcm_chmap_elem *convert_chmap(int channels, unsigned int bits,
|
||||
SNDRV_CHMAP_TSL, /* top side left */
|
||||
SNDRV_CHMAP_TSR, /* top side right */
|
||||
SNDRV_CHMAP_BC, /* bottom center */
|
||||
SNDRV_CHMAP_BLC, /* bottom left center */
|
||||
SNDRV_CHMAP_BRC, /* bottom right center */
|
||||
SNDRV_CHMAP_RLC, /* back left of center */
|
||||
SNDRV_CHMAP_RRC, /* back right of center */
|
||||
0 /* terminator */
|
||||
};
|
||||
struct snd_pcm_chmap_elem *chmap;
|
||||
|
Loading…
Reference in New Issue
Block a user