sound fixes for 3.16-rc1
Most of changes are small and easy cleanup or fixes. - a few HD-audio Realtek codec fixes and quirks - Intel HDMI audio fixes for Broadwell and Haswell / ValleyView - FireWire sound stack cleanups - a couple of sequencer core fixes - compress ABI fix for 64bit - Conversion to modern ktime*() API -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJTmumTAAoJEGwxgFQ9KSmk68IQAKZNZ1v+L8y3F7/u6jgFXx8q K1AJoQH1ZnIUCoo5TZmeFftgn9B8fQMbX4yHCZNpPm3rcKvnT/kSF7/x6EEfJ8Cm rodcmD6C5wgaEQ6d5YKd/R3Wc0uYjakoof/ev5ffVDJ41mOnTNIAODkHAzLxjpNw 30V2oxH8F/myt4zFPJuUqSJhewH+rtKO6YXePHQ59800EUCb1A8KN0fXki3jytgb zbVBsbteEVIFwy4Rsr+EPybU6bmcFc3Zhb6I5r3J6utJJTdzT+eN2g09EY8zavfn aH4MbCPRQDqBnFgTzW0fqMpIZ+zZV/q5khuFyv9qouPfNvKflD2u5HswyDSH6Jd3 N/YiW5wim5pgQ2KNEv3oh/0psUoRyCsjgh/qlXAd+miBqeltjCATCvo0NALe2y9n vMdTt0P3eq/Q/BHfsLGYXavSnDotRFvTAk6Stkm46r+YwY8i+yq9GO9sSEJ3Uo2M ow80Lj71xbHXcGFA+zQKhW1PLpk3nIbNQhuQ0Mb+QCKT57s3CmCeW3gXNWviJGl6 3gQuUvNiWEyW+Z+oDacvj3+Ud8pWymfIwXZaMq0/jNBqXolwPVdgeIFzot5cDHxd T/OV04kbt34D0yty0hY0Hwrh97mnsCfpV/zlzGcvFeK8XDJthUmZaTQ5Jus485uh IRi5YoB6I0opWLKo7jVT =HPX8 -----END PGP SIGNATURE----- Merge tag 'sound-fix-3.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Most of changes are small and easy cleanup or fixes: - a few HD-audio Realtek codec fixes and quirks - Intel HDMI audio fixes for Broadwell and Haswell / ValleyView - FireWire sound stack cleanups - a couple of sequencer core fixes - compress ABI fix for 64bit - conversion to modern ktime*() API" * tag 'sound-fix-3.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (23 commits) ALSA: hda/realtek - Add more entry for enable HP mute led ALSA: hda - Add quirk for external mic on Lifebook U904 ALSA: hda - fix a fixup value for codec alc293 in the pin_quirk table ALSA: intel8x0: Use ktime and ktime_get() ALSA: core: Use ktime_get_ts() ALSA: hda - verify pin:converter connection on unsol event for HSW and VLV ALSA: compress: Cancel the optimization of compiler and fix the size of struct for all platform. ALSA: hda - Add quirk for ABit AA8XE Revert "ALSA: hda - mask buggy stream DMA0 for Broadwell display controller" ALSA: hda - using POS_FIX_LPIB on Broadwell HDMI Audio ALSA: hda/realtek - Add support of ALC667 codec ALSA: hda/realtek - Add more codec rename ALSA: hda/realtek - New vendor ID for ALC233 ALSA: hda - add two new pin tables ALSA: hda/realtek - Add support of ALC891 codec ALSA: seq: Continue broadcasting events to ports if one of them fails ALSA: bebob: Remove unused function prototype ALSA: fireworks: Remove meaningless mutex_destroy() ALSA: fireworks: Remove a constant over width to which it's applied ALSA: fireworks: Improve comments about Fireworks transaction ...
This commit is contained in:
Коммит
6391f34e84
|
@ -932,7 +932,7 @@ static inline void snd_pcm_gettime(struct snd_pcm_runtime *runtime,
|
|||
struct timespec *tv)
|
||||
{
|
||||
if (runtime->tstamp_type == SNDRV_PCM_TSTAMP_TYPE_MONOTONIC)
|
||||
do_posix_clock_monotonic_gettime(tv);
|
||||
ktime_get_ts(tv);
|
||||
else
|
||||
getnstimeofday(tv);
|
||||
}
|
||||
|
|
|
@ -80,7 +80,7 @@ struct snd_compr_tstamp {
|
|||
struct snd_compr_avail {
|
||||
__u64 avail;
|
||||
struct snd_compr_tstamp tstamp;
|
||||
};
|
||||
} __attribute__((packed));
|
||||
|
||||
enum snd_compr_direction {
|
||||
SND_COMPRESS_PLAYBACK = 0,
|
||||
|
|
|
@ -660,7 +660,7 @@ static int deliver_to_subscribers(struct snd_seq_client *client,
|
|||
int atomic, int hop)
|
||||
{
|
||||
struct snd_seq_subscribers *subs;
|
||||
int err = 0, num_ev = 0;
|
||||
int err, result = 0, num_ev = 0;
|
||||
struct snd_seq_event event_saved;
|
||||
struct snd_seq_client_port *src_port;
|
||||
struct snd_seq_port_subs_info *grp;
|
||||
|
@ -685,8 +685,12 @@ static int deliver_to_subscribers(struct snd_seq_client *client,
|
|||
subs->info.flags & SNDRV_SEQ_PORT_SUBS_TIME_REAL);
|
||||
err = snd_seq_deliver_single_event(client, event,
|
||||
0, atomic, hop);
|
||||
if (err < 0)
|
||||
break;
|
||||
if (err < 0) {
|
||||
/* save first error that occurs and continue */
|
||||
if (!result)
|
||||
result = err;
|
||||
continue;
|
||||
}
|
||||
num_ev++;
|
||||
/* restore original event record */
|
||||
*event = event_saved;
|
||||
|
@ -697,7 +701,7 @@ static int deliver_to_subscribers(struct snd_seq_client *client,
|
|||
up_read(&grp->list_mutex);
|
||||
*event = event_saved; /* restore */
|
||||
snd_seq_port_unlock(src_port);
|
||||
return (err < 0) ? err : num_ev;
|
||||
return (result < 0) ? result : num_ev;
|
||||
}
|
||||
|
||||
|
||||
|
@ -709,7 +713,7 @@ static int port_broadcast_event(struct snd_seq_client *client,
|
|||
struct snd_seq_event *event,
|
||||
int atomic, int hop)
|
||||
{
|
||||
int num_ev = 0, err = 0;
|
||||
int num_ev = 0, err, result = 0;
|
||||
struct snd_seq_client *dest_client;
|
||||
struct snd_seq_client_port *port;
|
||||
|
||||
|
@ -724,14 +728,18 @@ static int port_broadcast_event(struct snd_seq_client *client,
|
|||
err = snd_seq_deliver_single_event(NULL, event,
|
||||
SNDRV_SEQ_FILTER_BROADCAST,
|
||||
atomic, hop);
|
||||
if (err < 0)
|
||||
break;
|
||||
if (err < 0) {
|
||||
/* save first error that occurs and continue */
|
||||
if (!result)
|
||||
result = err;
|
||||
continue;
|
||||
}
|
||||
num_ev++;
|
||||
}
|
||||
read_unlock(&dest_client->ports_lock);
|
||||
snd_seq_client_unlock(dest_client);
|
||||
event->dest.port = SNDRV_SEQ_ADDRESS_BROADCAST; /* restore */
|
||||
return (err < 0) ? err : num_ev;
|
||||
return (result < 0) ? result : num_ev;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -741,7 +749,7 @@ static int port_broadcast_event(struct snd_seq_client *client,
|
|||
static int broadcast_event(struct snd_seq_client *client,
|
||||
struct snd_seq_event *event, int atomic, int hop)
|
||||
{
|
||||
int err = 0, num_ev = 0;
|
||||
int err, result = 0, num_ev = 0;
|
||||
int dest;
|
||||
struct snd_seq_addr addr;
|
||||
|
||||
|
@ -760,12 +768,16 @@ static int broadcast_event(struct snd_seq_client *client,
|
|||
err = snd_seq_deliver_single_event(NULL, event,
|
||||
SNDRV_SEQ_FILTER_BROADCAST,
|
||||
atomic, hop);
|
||||
if (err < 0)
|
||||
break;
|
||||
if (err < 0) {
|
||||
/* save first error that occurs and continue */
|
||||
if (!result)
|
||||
result = err;
|
||||
continue;
|
||||
}
|
||||
num_ev += err;
|
||||
}
|
||||
event->dest = addr; /* restore */
|
||||
return (err < 0) ? err : num_ev;
|
||||
return (result < 0) ? result : num_ev;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -124,7 +124,7 @@ int snd_seq_fifo_event_in(struct snd_seq_fifo *f,
|
|||
snd_use_lock_use(&f->use_lock);
|
||||
err = snd_seq_event_dup(f->pool, event, &cell, 1, NULL); /* always non-blocking */
|
||||
if (err < 0) {
|
||||
if (err == -ENOMEM)
|
||||
if ((err == -ENOMEM) || (err == -EAGAIN))
|
||||
atomic_inc(&f->overflow);
|
||||
snd_use_lock_free(&f->use_lock);
|
||||
return err;
|
||||
|
|
|
@ -390,7 +390,7 @@ static void snd_timer_notify1(struct snd_timer_instance *ti, int event)
|
|||
struct timespec tstamp;
|
||||
|
||||
if (timer_tstamp_monotonic)
|
||||
do_posix_clock_monotonic_gettime(&tstamp);
|
||||
ktime_get_ts(&tstamp);
|
||||
else
|
||||
getnstimeofday(&tstamp);
|
||||
if (snd_BUG_ON(event < SNDRV_TIMER_EVENT_START ||
|
||||
|
@ -1203,7 +1203,7 @@ static void snd_timer_user_tinterrupt(struct snd_timer_instance *timeri,
|
|||
}
|
||||
if (tu->last_resolution != resolution || ticks > 0) {
|
||||
if (timer_tstamp_monotonic)
|
||||
do_posix_clock_monotonic_gettime(&tstamp);
|
||||
ktime_get_ts(&tstamp);
|
||||
else
|
||||
getnstimeofday(&tstamp);
|
||||
}
|
||||
|
|
|
@ -208,8 +208,6 @@ int snd_bebob_stream_set_rate(struct snd_bebob *bebob, unsigned int rate);
|
|||
int snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob,
|
||||
bool *internal);
|
||||
int snd_bebob_stream_discover(struct snd_bebob *bebob);
|
||||
int snd_bebob_stream_map(struct snd_bebob *bebob,
|
||||
struct amdtp_stream *stream);
|
||||
int snd_bebob_stream_init_duplex(struct snd_bebob *bebob);
|
||||
int snd_bebob_stream_start_duplex(struct snd_bebob *bebob, unsigned int rate);
|
||||
void snd_bebob_stream_stop_duplex(struct snd_bebob *bebob);
|
||||
|
|
|
@ -655,8 +655,6 @@ void snd_bebob_stream_stop_duplex(struct snd_bebob *bebob)
|
|||
struct amdtp_stream *master, *slave;
|
||||
atomic_t *master_substreams, *slave_substreams;
|
||||
|
||||
mutex_lock(&bebob->mutex);
|
||||
|
||||
if (bebob->master == &bebob->rx_stream) {
|
||||
slave = &bebob->tx_stream;
|
||||
master = &bebob->rx_stream;
|
||||
|
@ -669,6 +667,8 @@ void snd_bebob_stream_stop_duplex(struct snd_bebob *bebob)
|
|||
master_substreams = &bebob->capture_substreams;
|
||||
}
|
||||
|
||||
mutex_lock(&bebob->mutex);
|
||||
|
||||
if (atomic_read(slave_substreams) == 0) {
|
||||
amdtp_stream_pcm_abort(slave);
|
||||
amdtp_stream_stop(slave);
|
||||
|
|
|
@ -346,7 +346,6 @@ static void __exit snd_efw_exit(void)
|
|||
{
|
||||
snd_efw_transaction_unregister();
|
||||
driver_unregister(&efw_driver.driver);
|
||||
mutex_destroy(&devices_mutex);
|
||||
}
|
||||
|
||||
module_init(snd_efw_init);
|
||||
|
|
|
@ -162,7 +162,6 @@ enum snd_efw_grp_type {
|
|||
SND_EFW_CH_TYPE_GUITAR = 7,
|
||||
SND_EFW_CH_TYPE_PIEZO_GUITAR = 8,
|
||||
SND_EFW_CH_TYPE_GUITAR_STRING = 9,
|
||||
SND_EFW_CH_TYPE_VIRTUAL = 0x10000,
|
||||
SND_EFW_CH_TYPE_DUMMY
|
||||
};
|
||||
struct snd_efw_phys_meters {
|
||||
|
|
|
@ -58,7 +58,7 @@ hwdep_read_resp_buf(struct snd_efw *efw, char __user *buf, long remained,
|
|||
efw->pull_ptr += till_end;
|
||||
if (efw->pull_ptr >= efw->resp_buf +
|
||||
snd_efw_resp_buf_size)
|
||||
efw->pull_ptr = efw->resp_buf;
|
||||
efw->pull_ptr -= snd_efw_resp_buf_size;
|
||||
|
||||
length -= till_end;
|
||||
buf += till_end;
|
||||
|
|
|
@ -284,8 +284,6 @@ void snd_efw_stream_stop_duplex(struct snd_efw *efw)
|
|||
struct amdtp_stream *master, *slave;
|
||||
atomic_t *master_substreams, *slave_substreams;
|
||||
|
||||
mutex_lock(&efw->mutex);
|
||||
|
||||
if (efw->master == &efw->rx_stream) {
|
||||
slave = &efw->tx_stream;
|
||||
master = &efw->rx_stream;
|
||||
|
@ -298,6 +296,8 @@ void snd_efw_stream_stop_duplex(struct snd_efw *efw)
|
|||
master_substreams = &efw->capture_substreams;
|
||||
}
|
||||
|
||||
mutex_lock(&efw->mutex);
|
||||
|
||||
if (atomic_read(slave_substreams) == 0) {
|
||||
stop_stream(efw, slave);
|
||||
|
||||
|
|
|
@ -8,19 +8,19 @@
|
|||
|
||||
/*
|
||||
* Fireworks have its own transaction. The transaction can be delivered by AV/C
|
||||
* Vendor Specific command. But at least Windows driver and firmware version 5.5
|
||||
* or later don't use it.
|
||||
* Vendor Specific command frame or usual asynchronous transaction. At least,
|
||||
* Windows driver and firmware version 5.5 or later don't use AV/C command.
|
||||
*
|
||||
* Transaction substance:
|
||||
* At first, 6 data exist. Following to the 6 data, parameters for each
|
||||
* commands exists. All of parameters are 32 bit alighed to big endian.
|
||||
* At first, 6 data exist. Following to the data, parameters for each command
|
||||
* exist. All of the parameters are 32 bit alighed to big endian.
|
||||
* data[0]: Length of transaction substance
|
||||
* data[1]: Transaction version
|
||||
* data[2]: Sequence number. This is incremented by the device
|
||||
* data[3]: transaction category
|
||||
* data[4]: transaction command
|
||||
* data[5]: return value in response.
|
||||
* data[6-]: parameters
|
||||
* data[3]: Transaction category
|
||||
* data[4]: Transaction command
|
||||
* data[5]: Return value in response.
|
||||
* data[6-]: Parameters
|
||||
*
|
||||
* Transaction address:
|
||||
* command: 0xecc000000000
|
||||
|
@ -148,7 +148,7 @@ copy_resp_to_buf(struct snd_efw *efw, void *data, size_t length, int *rcode)
|
|||
|
||||
efw->push_ptr += till_end;
|
||||
if (efw->push_ptr >= efw->resp_buf + snd_efw_resp_buf_size)
|
||||
efw->push_ptr = efw->resp_buf;
|
||||
efw->push_ptr -= snd_efw_resp_buf_size;
|
||||
|
||||
length -= till_end;
|
||||
data += till_end;
|
||||
|
|
|
@ -237,6 +237,12 @@ enum {
|
|||
AZX_DCAPS_COUNT_LPIB_DELAY | AZX_DCAPS_PM_RUNTIME | \
|
||||
AZX_DCAPS_I915_POWERWELL)
|
||||
|
||||
/* Broadwell HDMI can't use position buffer reliably, force to use LPIB */
|
||||
#define AZX_DCAPS_INTEL_BROADWELL \
|
||||
(AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_ALIGN_BUFSIZE | \
|
||||
AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_PM_RUNTIME | \
|
||||
AZX_DCAPS_I915_POWERWELL)
|
||||
|
||||
/* quirks for ATI SB / AMD Hudson */
|
||||
#define AZX_DCAPS_PRESET_ATI_SB \
|
||||
(AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \
|
||||
|
@ -1367,12 +1373,6 @@ static int azx_first_init(struct azx *chip)
|
|||
/* initialize streams */
|
||||
azx_init_stream(chip);
|
||||
|
||||
/* workaround for Broadwell HDMI: the first stream is broken,
|
||||
* so mask it by keeping it as if opened
|
||||
*/
|
||||
if (pci->vendor == 0x8086 && pci->device == 0x160c)
|
||||
chip->azx_dev[0].opened = 1;
|
||||
|
||||
/* initialize chip */
|
||||
azx_init_pci(chip);
|
||||
azx_init_chip(chip, (probe_only[dev] & 2) == 0);
|
||||
|
@ -1769,7 +1769,7 @@ static const struct pci_device_id azx_ids[] = {
|
|||
.driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
|
||||
/* Broadwell */
|
||||
{ PCI_DEVICE(0x8086, 0x160c),
|
||||
.driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
|
||||
.driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_BROADWELL },
|
||||
/* 5 Series/3400 */
|
||||
{ PCI_DEVICE(0x8086, 0x3b56),
|
||||
.driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
|
||||
|
|
|
@ -1594,10 +1594,18 @@ static bool hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll)
|
|||
* Re-setup pin and infoframe. This is needed e.g. when
|
||||
* - sink is first plugged-in (infoframe is not set up if !monitor_present)
|
||||
* - transcoder can change during stream playback on Haswell
|
||||
* and this can make HW reset converter selection on a pin.
|
||||
*/
|
||||
if (eld->eld_valid && !old_eld_valid && per_pin->setup)
|
||||
if (eld->eld_valid && !old_eld_valid && per_pin->setup) {
|
||||
if (is_haswell_plus(codec) || is_valleyview(codec)) {
|
||||
intel_verify_pin_cvt_connect(codec, per_pin);
|
||||
intel_not_share_assigned_cvt(codec, pin_nid,
|
||||
per_pin->mux_idx);
|
||||
}
|
||||
|
||||
hdmi_setup_audio_infoframe(codec, per_pin,
|
||||
per_pin->non_pcm);
|
||||
}
|
||||
}
|
||||
|
||||
if (eld_changed)
|
||||
|
|
|
@ -929,6 +929,7 @@ struct alc_codec_rename_pci_table {
|
|||
};
|
||||
|
||||
static struct alc_codec_rename_table rename_tbl[] = {
|
||||
{ 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
|
||||
{ 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
|
||||
{ 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
|
||||
{ 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
|
||||
|
@ -937,6 +938,7 @@ static struct alc_codec_rename_table rename_tbl[] = {
|
|||
{ 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
|
||||
{ 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
|
||||
{ 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
|
||||
{ 0x10ec0662, 0xffff, 0x4020, "ALC656" },
|
||||
{ 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
|
||||
{ 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
|
||||
{ 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
|
||||
|
@ -956,6 +958,19 @@ static struct alc_codec_rename_pci_table rename_pci_tbl[] = {
|
|||
{ 0x10ec0293, 0x1028, 0, "ALC3235" },
|
||||
{ 0x10ec0255, 0x1028, 0, "ALC3234" },
|
||||
{ 0x10ec0668, 0x1028, 0, "ALC3661" },
|
||||
{ 0x10ec0275, 0x1028, 0, "ALC3260" },
|
||||
{ 0x10ec0899, 0x1028, 0, "ALC3861" },
|
||||
{ 0x10ec0670, 0x1025, 0, "ALC669X" },
|
||||
{ 0x10ec0676, 0x1025, 0, "ALC679X" },
|
||||
{ 0x10ec0282, 0x1043, 0, "ALC3229" },
|
||||
{ 0x10ec0233, 0x1043, 0, "ALC3236" },
|
||||
{ 0x10ec0280, 0x103c, 0, "ALC3228" },
|
||||
{ 0x10ec0282, 0x103c, 0, "ALC3227" },
|
||||
{ 0x10ec0286, 0x103c, 0, "ALC3242" },
|
||||
{ 0x10ec0290, 0x103c, 0, "ALC3241" },
|
||||
{ 0x10ec0668, 0x103c, 0, "ALC3662" },
|
||||
{ 0x10ec0283, 0x17aa, 0, "ALC3239" },
|
||||
{ 0x10ec0292, 0x17aa, 0, "ALC3232" },
|
||||
{ } /* terminator */
|
||||
};
|
||||
|
||||
|
@ -1412,6 +1427,7 @@ static const struct snd_pci_quirk alc880_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
|
||||
SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
|
||||
SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
|
||||
SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
|
||||
SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
|
||||
SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
|
||||
SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
|
||||
|
@ -4230,6 +4246,7 @@ enum {
|
|||
ALC269_FIXUP_HEADSET_MIC,
|
||||
ALC269_FIXUP_QUANTA_MUTE,
|
||||
ALC269_FIXUP_LIFEBOOK,
|
||||
ALC269_FIXUP_LIFEBOOK_EXTMIC,
|
||||
ALC269_FIXUP_AMIC,
|
||||
ALC269_FIXUP_DMIC,
|
||||
ALC269VB_FIXUP_AMIC,
|
||||
|
@ -4367,6 +4384,13 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_QUANTA_MUTE
|
||||
},
|
||||
[ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x19, 0x01a1903c }, /* headset mic, with jack detect */
|
||||
{ }
|
||||
},
|
||||
},
|
||||
[ALC269_FIXUP_AMIC] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
|
@ -4741,18 +4765,12 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1028, 0x0614, "Dell Inspiron 3135", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
|
||||
SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
|
||||
SND_PCI_QUIRK(0x1028, 0x062c, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
|
||||
SND_PCI_QUIRK(0x1028, 0x063f, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x064d, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x0668, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x0669, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x0674, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x067e, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x067f, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x0680, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x0684, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x15cc, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x15cd, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
|
||||
|
@ -4764,14 +4782,24 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x1983, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
|
||||
/* ALC282 */
|
||||
SND_PCI_QUIRK(0x103c, 0x220d, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x220e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x220f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x2211, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x2212, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x2213, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x2266, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x2267, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x2269, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x226c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x226d, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x226f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x227a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x227b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
|
@ -4811,6 +4839,10 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x22c3, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
|
||||
SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
|
@ -4834,6 +4866,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
|
||||
SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
|
||||
SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
|
||||
SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
|
||||
SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
|
||||
|
@ -4974,6 +5007,26 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
|
|||
.subvendor = 0x1028,
|
||||
#ifdef CONFIG_SND_DEBUG_VERBOSE
|
||||
.name = "Dell",
|
||||
#endif
|
||||
.pins = (const struct hda_pintbl[]) {
|
||||
{0x12, 0x90a60160},
|
||||
{0x14, 0x90170120},
|
||||
{0x17, 0x90170140},
|
||||
{0x18, 0x40000000},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1a, 0x411111f0},
|
||||
{0x1b, 0x411111f0},
|
||||
{0x1d, 0x41163b05},
|
||||
{0x1e, 0x411111f0},
|
||||
{0x21, 0x0321102f},
|
||||
},
|
||||
.value = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
},
|
||||
{
|
||||
.codec = 0x10ec0255,
|
||||
.subvendor = 0x1028,
|
||||
#ifdef CONFIG_SND_DEBUG_VERBOSE
|
||||
.name = "Dell",
|
||||
#endif
|
||||
.pins = (const struct hda_pintbl[]) {
|
||||
{0x12, 0x90a60160},
|
||||
|
@ -5129,7 +5182,7 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
|
|||
{0x1d, 0x40700001},
|
||||
{0x1e, 0x411111f0},
|
||||
},
|
||||
.value = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
.value = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
@ -6012,6 +6065,27 @@ static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
|
|||
.subvendor = 0x1028,
|
||||
#ifdef CONFIG_SND_DEBUG_VERBOSE
|
||||
.name = "Dell",
|
||||
#endif
|
||||
.pins = (const struct hda_pintbl[]) {
|
||||
{0x12, 0x99a30140},
|
||||
{0x14, 0x90170110},
|
||||
{0x15, 0x0321101f},
|
||||
{0x16, 0x03011020},
|
||||
{0x18, 0x40000008},
|
||||
{0x19, 0x411111f0},
|
||||
{0x1a, 0x411111f0},
|
||||
{0x1b, 0x411111f0},
|
||||
{0x1d, 0x41000001},
|
||||
{0x1e, 0x411111f0},
|
||||
{0x1f, 0x411111f0},
|
||||
},
|
||||
.value = ALC668_FIXUP_AUTO_MUTE,
|
||||
},
|
||||
{
|
||||
.codec = 0x10ec0668,
|
||||
.subvendor = 0x1028,
|
||||
#ifdef CONFIG_SND_DEBUG_VERBOSE
|
||||
.name = "Dell",
|
||||
#endif
|
||||
.pins = (const struct hda_pintbl[]) {
|
||||
{0x12, 0x99a30150},
|
||||
|
@ -6190,6 +6264,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = {
|
|||
{ .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 },
|
||||
{ .id = 0x10ec0231, .name = "ALC231", .patch = patch_alc269 },
|
||||
{ .id = 0x10ec0233, .name = "ALC233", .patch = patch_alc269 },
|
||||
{ .id = 0x10ec0235, .name = "ALC233", .patch = patch_alc269 },
|
||||
{ .id = 0x10ec0255, .name = "ALC255", .patch = patch_alc269 },
|
||||
{ .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
|
||||
{ .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
|
||||
|
@ -6223,10 +6298,12 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = {
|
|||
.patch = patch_alc662 },
|
||||
{ .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
|
||||
{ .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
|
||||
{ .id = 0x10ec0667, .name = "ALC667", .patch = patch_alc662 },
|
||||
{ .id = 0x10ec0668, .name = "ALC668", .patch = patch_alc662 },
|
||||
{ .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
|
||||
{ .id = 0x10ec0671, .name = "ALC671", .patch = patch_alc662 },
|
||||
{ .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 },
|
||||
{ .id = 0x10ec0867, .name = "ALC891", .patch = patch_alc882 },
|
||||
{ .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
|
||||
{ .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
|
||||
{ .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
|
||||
|
|
|
@ -2779,7 +2779,7 @@ static void intel8x0_measure_ac97_clock(struct intel8x0 *chip)
|
|||
unsigned long port;
|
||||
unsigned long pos, pos1, t;
|
||||
int civ, timeout = 1000, attempt = 1;
|
||||
struct timespec start_time, stop_time;
|
||||
ktime_t start_time, stop_time;
|
||||
|
||||
if (chip->ac97_bus->clock != 48000)
|
||||
return; /* specified in module option */
|
||||
|
@ -2813,7 +2813,7 @@ static void intel8x0_measure_ac97_clock(struct intel8x0 *chip)
|
|||
iputbyte(chip, port + ICH_REG_OFF_CR, ICH_IOCE);
|
||||
iputdword(chip, ICHREG(ALI_DMACR), 1 << ichdev->ali_slot);
|
||||
}
|
||||
do_posix_clock_monotonic_gettime(&start_time);
|
||||
start_time = ktime_get();
|
||||
spin_unlock_irq(&chip->reg_lock);
|
||||
msleep(50);
|
||||
spin_lock_irq(&chip->reg_lock);
|
||||
|
@ -2837,7 +2837,7 @@ static void intel8x0_measure_ac97_clock(struct intel8x0 *chip)
|
|||
pos += ichdev->position;
|
||||
}
|
||||
chip->in_measurement = 0;
|
||||
do_posix_clock_monotonic_gettime(&stop_time);
|
||||
stop_time = ktime_get();
|
||||
/* stop */
|
||||
if (chip->device_type == DEVICE_ALI) {
|
||||
iputdword(chip, ICHREG(ALI_DMACR), 1 << (ichdev->ali_slot + 16));
|
||||
|
@ -2865,9 +2865,7 @@ static void intel8x0_measure_ac97_clock(struct intel8x0 *chip)
|
|||
}
|
||||
|
||||
pos /= 4;
|
||||
t = stop_time.tv_sec - start_time.tv_sec;
|
||||
t *= 1000000;
|
||||
t += (stop_time.tv_nsec - start_time.tv_nsec) / 1000;
|
||||
t = ktime_us_delta(stop_time, start_time);
|
||||
dev_info(chip->card->dev,
|
||||
"%s: measured %lu usecs (%lu samples)\n", __func__, t, pos);
|
||||
if (t == 0) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче