sound fixes for 4.13-rc1
Small last-minute fixes for 4.13-rc1: a couple of PCM fixes for m68k, a cleanup work for legacy ISA msnd driver, and a few HD-audio new IDs and quirks. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEECxfAB4MH3rD5mfB6bDGAVD0pKaQFAllohicOHHRpd2FpQHN1 c2UuZGUACgkQbDGAVD0pKaTI+g/9GUZDsSLf8EIMhyJqcR0kpMXi4oMC3H/7fCCg MEkGc4C8lG9ZpXpRthGWBwwIujIfH+QXdRpXZeHqV8yias80Ryi1rBd2BCk0eVuF hQXbCXAyhN7E6OXvgjIi7eQKwzGrwhV9OFTpChqcEIu2Oym8lD91DOU+hHtFGX56 5VM4zZ+KzDa11L3cYzWKP/PlsqBp9eGNfamf5Q5wb2SnaVYcxLSQWkgsTQloRK/b YOFMNvgUQV7XB23t8ouxPIo5YYCnX7xSyP1nkt9mL7z1CYn1q8hgG0yWw5lPK/6E tnjm2H2X6fcT+zSVxYKOn6WHcK2aER7PJZOaqkmmFp4cN31AqdkToT/fNWTELaaM pZe2fY0vfwtpvaVhonv70GEWcGyi9oa4CanOmDPNgti/V1Em0rBpoFa+FTlF4SWc VJsi5645b9ieQ/LvXsAHlVEflSWuRtdUxen1Hx1rVhUBKnDPRifIeClycjcqddNY uttMuQjzMs8S53G7bILHwLe0zyGEDFE/UH8/xooM9IiPr8Dd18wCu04Rlf/8dK5S VFjn1VKhcc0HVtWCUPlHGW+RxsLWwI26CUH15sAH6v08ci8BsqPjF3IHyfLy+vXb XbuMiBeKIOCNRHADHaTXodIr6O35mVI3HRqSAV3mYZlUX8Nd7CkpcsMYotwEihUL MGnGV+g= =tGl3 -----END PGP SIGNATURE----- Merge tag 'sound-fix-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Small last-minute fixes for 4.13-rc1: a couple of PCM fixes for m68k, a cleanup work for legacy ISA msnd driver, and a few HD-audio new IDs and quirks" * tag 'sound-fix-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda - Add hdmi id for a Geminilake variant ALSA: hda/realtek - New codec device ID for ALC1220 ALSA: pcm: Simplify check for dma_mmap_coherent() availability ALSA: pcm: Protect call to dma_mmap_coherent() by check for HAS_DMA ALSA: msnd: Optimize / harden DSP and MIDI loops ALSA: hda/realtek - change the location for one of two front microphones ALSA: opl4: Move inline before return type
This commit is contained in:
commit
0a264b6db7
@ -238,10 +238,8 @@ static bool hw_support_mmap(struct snd_pcm_substream *substream)
|
|||||||
{
|
{
|
||||||
if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP))
|
if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP))
|
||||||
return false;
|
return false;
|
||||||
/* check architectures that return -EINVAL from dma_mmap_coherent() */
|
/* architecture supports dma_mmap_coherent()? */
|
||||||
/* FIXME: this should be some global flag */
|
#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA)
|
||||||
#if defined(CONFIG_C6X) || defined(CONFIG_FRV) || defined(CONFIG_MN10300) ||\
|
|
||||||
defined(CONFIG_PARISC) || defined(CONFIG_XTENSA)
|
|
||||||
if (!substream->ops->mmap &&
|
if (!substream->ops->mmap &&
|
||||||
substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV)
|
substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV)
|
||||||
return false;
|
return false;
|
||||||
@ -3502,7 +3500,7 @@ int snd_pcm_lib_default_mmap(struct snd_pcm_substream *substream,
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_GENERIC_ALLOCATOR */
|
#endif /* CONFIG_GENERIC_ALLOCATOR */
|
||||||
#ifndef CONFIG_X86 /* for avoiding warnings arch/x86/mm/pat.c */
|
#ifndef CONFIG_X86 /* for avoiding warnings arch/x86/mm/pat.c */
|
||||||
if (!substream->ops->page &&
|
if (IS_ENABLED(CONFIG_HAS_DMA) && !substream->ops->page &&
|
||||||
substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV)
|
substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV)
|
||||||
return dma_mmap_coherent(substream->dma_buffer.dev.dev,
|
return dma_mmap_coherent(substream->dma_buffer.dev.dev,
|
||||||
area,
|
area,
|
||||||
|
@ -29,7 +29,7 @@ MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
|
|||||||
MODULE_DESCRIPTION("OPL4 driver");
|
MODULE_DESCRIPTION("OPL4 driver");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|
||||||
static void inline snd_opl4_wait(struct snd_opl4 *opl4)
|
static inline void snd_opl4_wait(struct snd_opl4 *opl4)
|
||||||
{
|
{
|
||||||
int timeout = 10;
|
int timeout = 10;
|
||||||
while ((inb(opl4->fm_port) & OPL4_STATUS_BUSY) && --timeout > 0)
|
while ((inb(opl4->fm_port) & OPL4_STATUS_BUSY) && --timeout > 0)
|
||||||
|
@ -120,24 +120,24 @@ void snd_msndmidi_input_read(void *mpuv)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct snd_msndmidi *mpu = mpuv;
|
struct snd_msndmidi *mpu = mpuv;
|
||||||
void *pwMIDQData = mpu->dev->mappedbase + MIDQ_DATA_BUFF;
|
void *pwMIDQData = mpu->dev->mappedbase + MIDQ_DATA_BUFF;
|
||||||
|
u16 head, tail, size;
|
||||||
|
|
||||||
spin_lock_irqsave(&mpu->input_lock, flags);
|
spin_lock_irqsave(&mpu->input_lock, flags);
|
||||||
while (readw(mpu->dev->MIDQ + JQS_wTail) !=
|
head = readw(mpu->dev->MIDQ + JQS_wHead);
|
||||||
readw(mpu->dev->MIDQ + JQS_wHead)) {
|
tail = readw(mpu->dev->MIDQ + JQS_wTail);
|
||||||
u16 wTmp, val;
|
size = readw(mpu->dev->MIDQ + JQS_wSize);
|
||||||
val = readw(pwMIDQData + 2 * readw(mpu->dev->MIDQ + JQS_wHead));
|
if (head > size || tail > size)
|
||||||
|
goto out;
|
||||||
|
while (head != tail) {
|
||||||
|
unsigned char val = readw(pwMIDQData + 2 * head);
|
||||||
|
|
||||||
if (test_bit(MSNDMIDI_MODE_BIT_INPUT_TRIGGER,
|
if (test_bit(MSNDMIDI_MODE_BIT_INPUT_TRIGGER, &mpu->mode))
|
||||||
&mpu->mode))
|
snd_rawmidi_receive(mpu->substream_input, &val, 1);
|
||||||
snd_rawmidi_receive(mpu->substream_input,
|
if (++head > size)
|
||||||
(unsigned char *)&val, 1);
|
head = 0;
|
||||||
|
writew(head, mpu->dev->MIDQ + JQS_wHead);
|
||||||
wTmp = readw(mpu->dev->MIDQ + JQS_wHead) + 1;
|
|
||||||
if (wTmp > readw(mpu->dev->MIDQ + JQS_wSize))
|
|
||||||
writew(0, mpu->dev->MIDQ + JQS_wHead);
|
|
||||||
else
|
|
||||||
writew(wTmp, mpu->dev->MIDQ + JQS_wHead);
|
|
||||||
}
|
}
|
||||||
|
out:
|
||||||
spin_unlock_irqrestore(&mpu->input_lock, flags);
|
spin_unlock_irqrestore(&mpu->input_lock, flags);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(snd_msndmidi_input_read);
|
EXPORT_SYMBOL(snd_msndmidi_input_read);
|
||||||
|
@ -170,23 +170,24 @@ static irqreturn_t snd_msnd_interrupt(int irq, void *dev_id)
|
|||||||
{
|
{
|
||||||
struct snd_msnd *chip = dev_id;
|
struct snd_msnd *chip = dev_id;
|
||||||
void *pwDSPQData = chip->mappedbase + DSPQ_DATA_BUFF;
|
void *pwDSPQData = chip->mappedbase + DSPQ_DATA_BUFF;
|
||||||
|
u16 head, tail, size;
|
||||||
|
|
||||||
/* Send ack to DSP */
|
/* Send ack to DSP */
|
||||||
/* inb(chip->io + HP_RXL); */
|
/* inb(chip->io + HP_RXL); */
|
||||||
|
|
||||||
/* Evaluate queued DSP messages */
|
/* Evaluate queued DSP messages */
|
||||||
while (readw(chip->DSPQ + JQS_wTail) != readw(chip->DSPQ + JQS_wHead)) {
|
head = readw(chip->DSPQ + JQS_wHead);
|
||||||
u16 wTmp;
|
tail = readw(chip->DSPQ + JQS_wTail);
|
||||||
|
size = readw(chip->DSPQ + JQS_wSize);
|
||||||
snd_msnd_eval_dsp_msg(chip,
|
if (head > size || tail > size)
|
||||||
readw(pwDSPQData + 2 * readw(chip->DSPQ + JQS_wHead)));
|
goto out;
|
||||||
|
while (head != tail) {
|
||||||
wTmp = readw(chip->DSPQ + JQS_wHead) + 1;
|
snd_msnd_eval_dsp_msg(chip, readw(pwDSPQData + 2 * head));
|
||||||
if (wTmp > readw(chip->DSPQ + JQS_wSize))
|
if (++head > size)
|
||||||
writew(0, chip->DSPQ + JQS_wHead);
|
head = 0;
|
||||||
else
|
writew(head, chip->DSPQ + JQS_wHead);
|
||||||
writew(wTmp, chip->DSPQ + JQS_wHead);
|
|
||||||
}
|
}
|
||||||
|
out:
|
||||||
/* Send ack to DSP */
|
/* Send ack to DSP */
|
||||||
inb(chip->io + HP_RXL);
|
inb(chip->io + HP_RXL);
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
|
@ -53,9 +53,11 @@ MODULE_PARM_DESC(static_hdmi_pcm, "Don't restrict PCM parameters per ELD info");
|
|||||||
#define is_skylake(codec) ((codec)->core.vendor_id == 0x80862809)
|
#define is_skylake(codec) ((codec)->core.vendor_id == 0x80862809)
|
||||||
#define is_broxton(codec) ((codec)->core.vendor_id == 0x8086280a)
|
#define is_broxton(codec) ((codec)->core.vendor_id == 0x8086280a)
|
||||||
#define is_kabylake(codec) ((codec)->core.vendor_id == 0x8086280b)
|
#define is_kabylake(codec) ((codec)->core.vendor_id == 0x8086280b)
|
||||||
|
#define is_geminilake(codec) (((codec)->core.vendor_id == 0x8086280d) || \
|
||||||
|
((codec)->core.vendor_id == 0x80862800))
|
||||||
#define is_haswell_plus(codec) (is_haswell(codec) || is_broadwell(codec) \
|
#define is_haswell_plus(codec) (is_haswell(codec) || is_broadwell(codec) \
|
||||||
|| is_skylake(codec) || is_broxton(codec) \
|
|| is_skylake(codec) || is_broxton(codec) \
|
||||||
|| is_kabylake(codec))
|
|| is_kabylake(codec)) || is_geminilake(codec)
|
||||||
|
|
||||||
#define is_valleyview(codec) ((codec)->core.vendor_id == 0x80862882)
|
#define is_valleyview(codec) ((codec)->core.vendor_id == 0x80862882)
|
||||||
#define is_cherryview(codec) ((codec)->core.vendor_id == 0x80862883)
|
#define is_cherryview(codec) ((codec)->core.vendor_id == 0x80862883)
|
||||||
@ -3790,6 +3792,7 @@ HDA_CODEC_ENTRY(0x80862809, "Skylake HDMI", patch_i915_hsw_hdmi),
|
|||||||
HDA_CODEC_ENTRY(0x8086280a, "Broxton HDMI", patch_i915_hsw_hdmi),
|
HDA_CODEC_ENTRY(0x8086280a, "Broxton HDMI", patch_i915_hsw_hdmi),
|
||||||
HDA_CODEC_ENTRY(0x8086280b, "Kabylake HDMI", patch_i915_hsw_hdmi),
|
HDA_CODEC_ENTRY(0x8086280b, "Kabylake HDMI", patch_i915_hsw_hdmi),
|
||||||
HDA_CODEC_ENTRY(0x8086280d, "Geminilake HDMI", patch_i915_glk_hdmi),
|
HDA_CODEC_ENTRY(0x8086280d, "Geminilake HDMI", patch_i915_glk_hdmi),
|
||||||
|
HDA_CODEC_ENTRY(0x80862800, "Geminilake HDMI", patch_i915_glk_hdmi),
|
||||||
HDA_CODEC_ENTRY(0x80862880, "CedarTrail HDMI", patch_generic_hdmi),
|
HDA_CODEC_ENTRY(0x80862880, "CedarTrail HDMI", patch_generic_hdmi),
|
||||||
HDA_CODEC_ENTRY(0x80862882, "Valleyview2 HDMI", patch_i915_byt_hdmi),
|
HDA_CODEC_ENTRY(0x80862882, "Valleyview2 HDMI", patch_i915_byt_hdmi),
|
||||||
HDA_CODEC_ENTRY(0x80862883, "Braswell HDMI", patch_i915_byt_hdmi),
|
HDA_CODEC_ENTRY(0x80862883, "Braswell HDMI", patch_i915_byt_hdmi),
|
||||||
|
@ -379,6 +379,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
|
|||||||
break;
|
break;
|
||||||
case 0x10ec0899:
|
case 0x10ec0899:
|
||||||
case 0x10ec0900:
|
case 0x10ec0900:
|
||||||
|
case 0x10ec1168:
|
||||||
case 0x10ec1220:
|
case 0x10ec1220:
|
||||||
alc_update_coef_idx(codec, 0x7, 1<<1, 0);
|
alc_update_coef_idx(codec, 0x7, 1<<1, 0);
|
||||||
break;
|
break;
|
||||||
@ -5179,6 +5180,7 @@ enum {
|
|||||||
ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
|
ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
|
||||||
ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
|
ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
|
||||||
ALC233_FIXUP_LENOVO_MULTI_CODECS,
|
ALC233_FIXUP_LENOVO_MULTI_CODECS,
|
||||||
|
ALC294_FIXUP_LENOVO_MIC_LOCATION,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct hda_fixup alc269_fixups[] = {
|
static const struct hda_fixup alc269_fixups[] = {
|
||||||
@ -5962,6 +5964,18 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||||||
.type = HDA_FIXUP_FUNC,
|
.type = HDA_FIXUP_FUNC,
|
||||||
.v.func = alc233_alc662_fixup_lenovo_dual_codecs,
|
.v.func = alc233_alc662_fixup_lenovo_dual_codecs,
|
||||||
},
|
},
|
||||||
|
[ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
|
||||||
|
.type = HDA_FIXUP_PINS,
|
||||||
|
.v.pins = (const struct hda_pintbl[]) {
|
||||||
|
/* Change the mic location from front to right, otherwise there are
|
||||||
|
two front mics with the same name, pulseaudio can't handle them.
|
||||||
|
This is just a temporary workaround, after applying this fixup,
|
||||||
|
there will be one "Front Mic" and one "Mic" in this machine.
|
||||||
|
*/
|
||||||
|
{ 0x1a, 0x04a19040 },
|
||||||
|
{ }
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||||
@ -6143,6 +6157,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||||||
SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
|
SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
|
SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
|
SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
|
||||||
|
SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x3112, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
|
SND_PCI_QUIRK(0x17aa, 0x3112, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
|
SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
|
SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
|
||||||
@ -7801,6 +7816,7 @@ static const struct hda_device_id snd_hda_id_realtek[] = {
|
|||||||
HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
|
HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
|
||||||
HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
|
HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
|
||||||
HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
|
HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
|
||||||
|
HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
|
||||||
HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
|
HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
|
||||||
{} /* terminator */
|
{} /* terminator */
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user