Commit 20e471fd authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'sound-fix-3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
 "Here are a few fixes that have landed after the previous pull request.
  All are driver specific fixes including:

   - error/int value fixes in OXFW,
   - Intel Skylake HD-audio HDMI codec support,
   - Additional HD-audio Realtek codecs and AD1986A codec fixes/quirks,
   - a few more DSD support and a quirk for Arcam rPAC in usb-audio,
   - a typo fix for Scarlett 6i6,
   - fixes for new ASIHPI firmware,
   - ASoC Exynos7 cleanups,
   - Intel ACPI support, and
   - a fix for PCM512 register cache sync"

* tag 'sound-fix-3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (24 commits)
  ALSA: usb-audio: extend KEF X300A FU 10 tweak to Arcam rPAC
  ALSA: hda/realtek - New codec support for ALC298
  ALSA: asihpi: update to HPI version 4.14
  ALSA: asihpi: increase tuner pad cache size
  ALSA: asihpi: relax firmware version check
  ALSA: usb-audio: Fix Scarlett 6i6 initialization typo
  ALSA: hda - Add quirk for Packard Bell EasyNote MX65
  ALSA: usb-audio: add native DSD support for Matrix Audio DACs
  ALSA: hda/realtek - New codec support for ALC256
  ALSA: hda/realtek - Add new Dell desktop for ALC3234 headset mode
  ASoC: Intel: fix possible acpi enumeration panic
  ALSA: hda/hdmi - apply Haswell fix-ups to Skylake display codec
  ASoC: Intel: fix return value check in sst_acpi_probe()
  ALSA: hda - Make add_stereo_mix_input flag tristate
  ALSA: hda - Create capture source ctls when stereo mix input is added
  ALSA: hda - Fix typos in snd_hda_get_int_hint() kerneldoc comments
  ALSA: hda - add codec ID for Skylake display audio codec
  ALSA: oxfw: some signedness bugs
  ALSA: oxfw: fix detect_loud_models() return value
  ASoC: rt5677: add REGMAP_I2C and REGMAP_IRQ dependency
  ...
parents ed55635e d70a1b98
...@@ -19,7 +19,7 @@ static int hw_rule_rate(struct snd_pcm_hw_params *params, ...@@ -19,7 +19,7 @@ static int hw_rule_rate(struct snd_pcm_hw_params *params,
.min = UINT_MAX, .max = 0, .integer = 1 .min = UINT_MAX, .max = 0, .integer = 1
}; };
struct snd_oxfw_stream_formation formation; struct snd_oxfw_stream_formation formation;
unsigned int i, err; int i, err;
for (i = 0; i < SND_OXFW_STREAM_FORMAT_ENTRIES; i++) { for (i = 0; i < SND_OXFW_STREAM_FORMAT_ENTRIES; i++) {
if (formats[i] == NULL) if (formats[i] == NULL)
...@@ -47,7 +47,7 @@ static int hw_rule_channels(struct snd_pcm_hw_params *params, ...@@ -47,7 +47,7 @@ static int hw_rule_channels(struct snd_pcm_hw_params *params,
const struct snd_interval *r = const struct snd_interval *r =
hw_param_interval_c(params, SNDRV_PCM_HW_PARAM_RATE); hw_param_interval_c(params, SNDRV_PCM_HW_PARAM_RATE);
struct snd_oxfw_stream_formation formation; struct snd_oxfw_stream_formation formation;
unsigned int i, j, err; int i, j, err;
unsigned int count, list[SND_OXFW_STREAM_FORMAT_ENTRIES] = {0}; unsigned int count, list[SND_OXFW_STREAM_FORMAT_ENTRIES] = {0};
count = 0; count = 0;
...@@ -80,7 +80,7 @@ static int hw_rule_channels(struct snd_pcm_hw_params *params, ...@@ -80,7 +80,7 @@ static int hw_rule_channels(struct snd_pcm_hw_params *params,
static void limit_channels_and_rates(struct snd_pcm_hardware *hw, u8 **formats) static void limit_channels_and_rates(struct snd_pcm_hardware *hw, u8 **formats)
{ {
struct snd_oxfw_stream_formation formation; struct snd_oxfw_stream_formation formation;
unsigned int i, err; int i, err;
hw->channels_min = UINT_MAX; hw->channels_min = UINT_MAX;
hw->channels_max = 0; hw->channels_max = 0;
......
...@@ -15,7 +15,7 @@ static void proc_read_formation(struct snd_info_entry *entry, ...@@ -15,7 +15,7 @@ static void proc_read_formation(struct snd_info_entry *entry,
struct snd_oxfw_stream_formation formation, curr; struct snd_oxfw_stream_formation formation, curr;
u8 *format; u8 *format;
char flag; char flag;
unsigned int i, err; int i, err;
/* Show input. */ /* Show input. */
err = snd_oxfw_stream_get_current_formation(oxfw, err = snd_oxfw_stream_get_current_formation(oxfw,
......
...@@ -61,7 +61,8 @@ static int set_stream_format(struct snd_oxfw *oxfw, struct amdtp_stream *s, ...@@ -61,7 +61,8 @@ static int set_stream_format(struct snd_oxfw *oxfw, struct amdtp_stream *s,
u8 **formats; u8 **formats;
struct snd_oxfw_stream_formation formation; struct snd_oxfw_stream_formation formation;
enum avc_general_plug_dir dir; enum avc_general_plug_dir dir;
unsigned int i, err, len; unsigned int len;
int i, err;
if (s == &oxfw->tx_stream) { if (s == &oxfw->tx_stream) {
formats = oxfw->tx_stream_formats; formats = oxfw->tx_stream_formats;
......
...@@ -43,7 +43,7 @@ static bool detect_loud_models(struct fw_unit *unit) ...@@ -43,7 +43,7 @@ static bool detect_loud_models(struct fw_unit *unit)
err = fw_csr_string(unit->directory, CSR_MODEL, err = fw_csr_string(unit->directory, CSR_MODEL,
model, sizeof(model)); model, sizeof(model));
if (err < 0) if (err < 0)
return err; return false;
for (i = 0; i < ARRAY_SIZE(models); i++) { for (i = 0; i < ARRAY_SIZE(models); i++) {
if (strcmp(models[i], model) == 0) if (strcmp(models[i], model) == 0)
......
...@@ -1367,9 +1367,9 @@ struct hpi_control_cache_single { ...@@ -1367,9 +1367,9 @@ struct hpi_control_cache_single {
struct hpi_control_cache_pad { struct hpi_control_cache_pad {
struct hpi_control_cache_info i; struct hpi_control_cache_info i;
u32 field_valid_flags; u32 field_valid_flags;
u8 c_channel[8]; u8 c_channel[40];
u8 c_artist[40]; u8 c_artist[100];
u8 c_title[40]; u8 c_title[100];
u8 c_comment[200]; u8 c_comment[200];
u32 pTY; u32 pTY;
u32 pI; u32 pI;
......
...@@ -11,13 +11,13 @@ Production releases have even minor version. ...@@ -11,13 +11,13 @@ Production releases have even minor version.
/* Use single digits for versions less that 10 to avoid octal. */ /* Use single digits for versions less that 10 to avoid octal. */
/* *** HPI_VER is the only edit required to update version *** */ /* *** HPI_VER is the only edit required to update version *** */
/** HPI version */ /** HPI version */
#define HPI_VER HPI_VERSION_CONSTRUCTOR(4, 10, 1) #define HPI_VER HPI_VERSION_CONSTRUCTOR(4, 14, 3)
/** HPI version string in dotted decimal format */ /** HPI version string in dotted decimal format */
#define HPI_VER_STRING "4.10.01" #define HPI_VER_STRING "4.14.03"
/** Library version as documented in hpi-api-versions.txt */ /** Library version as documented in hpi-api-versions.txt */
#define HPI_LIB_VER HPI_VERSION_CONSTRUCTOR(10, 2, 0) #define HPI_LIB_VER HPI_VERSION_CONSTRUCTOR(10, 4, 0)
/** Construct hpi version number from major, minor, release numbers */ /** Construct hpi version number from major, minor, release numbers */
#define HPI_VERSION_CONSTRUCTOR(maj, min, r) ((maj << 16) + (min << 8) + r) #define HPI_VERSION_CONSTRUCTOR(maj, min, r) ((maj << 16) + (min << 8) + r)
......
/***********************************************************************/ /***********************************************************************
/**
AudioScience HPI driver AudioScience HPI driver
Copyright (C) 1997-2011 AudioScience Inc. <support@audioscience.com> Functions for reading DSP code using hotplug firmware loader
Copyright (C) 1997-2014 AudioScience Inc. <support@audioscience.com>
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as it under the terms of version 2 of the GNU General Public License as
...@@ -17,11 +18,7 @@ ...@@ -17,11 +18,7 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\file ***********************************************************************/
Functions for reading DSP code using
hotplug firmware loader from individual dsp code files
*/
/***********************************************************************/
#define SOURCEFILE_NAME "hpidspcd.c" #define SOURCEFILE_NAME "hpidspcd.c"
#include "hpidspcd.h" #include "hpidspcd.h"
#include "hpidebug.h" #include "hpidebug.h"
...@@ -68,17 +65,18 @@ short hpi_dsp_code_open(u32 adapter, void *os_data, struct dsp_code *dsp_code, ...@@ -68,17 +65,18 @@ short hpi_dsp_code_open(u32 adapter, void *os_data, struct dsp_code *dsp_code,
goto error2; goto error2;
} }
if ((header.version >> 9) != (HPI_VER >> 9)) { if (HPI_VER_MAJOR(header.version) != HPI_VER_MAJOR(HPI_VER)) {
/* Consider even and subsequent odd minor versions to be compatible */ /* Major version change probably means Host-DSP protocol change */
dev_err(&dev->dev, "Incompatible firmware version DSP image %X != Driver %X\n", dev_err(&dev->dev,
"Incompatible firmware version DSP image %X != Driver %X\n",
header.version, HPI_VER); header.version, HPI_VER);
goto error2; goto error2;
} }
if (header.version != HPI_VER) { if (header.version != HPI_VER) {
dev_info(&dev->dev, dev_warn(&dev->dev,
"Firmware: release version mismatch DSP image %X != Driver %X\n", "Firmware version mismatch: DSP image %X != Driver %X\n",
header.version, HPI_VER); header.version, HPI_VER);
} }
HPI_DEBUG_LOG(DEBUG, "dsp code %s opened\n", fw_name); HPI_DEBUG_LOG(DEBUG, "dsp code %s opened\n", fw_name);
......
...@@ -3218,12 +3218,13 @@ static int create_input_ctls(struct hda_codec *codec) ...@@ -3218,12 +3218,13 @@ static int create_input_ctls(struct hda_codec *codec)
} }
/* add stereo mix when explicitly enabled via hint */ /* add stereo mix when explicitly enabled via hint */
if (mixer && spec->add_stereo_mix_input && if (mixer && spec->add_stereo_mix_input == HDA_HINT_STEREO_MIX_ENABLE) {
snd_hda_get_bool_hint(codec, "add_stereo_mix_input") > 0) {
err = parse_capture_source(codec, mixer, CFG_IDX_MIX, num_adcs, err = parse_capture_source(codec, mixer, CFG_IDX_MIX, num_adcs,
"Stereo Mix", 0); "Stereo Mix", 0);
if (err < 0) if (err < 0)
return err; return err;
else
spec->suppress_auto_mic = 1;
} }
return 0; return 0;
...@@ -4542,9 +4543,8 @@ int snd_hda_gen_parse_auto_config(struct hda_codec *codec, ...@@ -4542,9 +4543,8 @@ int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
/* add stereo mix if available and not enabled yet */ /* add stereo mix if available and not enabled yet */
if (!spec->auto_mic && spec->mixer_nid && if (!spec->auto_mic && spec->mixer_nid &&
spec->add_stereo_mix_input && spec->add_stereo_mix_input == HDA_HINT_STEREO_MIX_AUTO &&
spec->input_mux.num_items > 1 && spec->input_mux.num_items > 1) {
snd_hda_get_bool_hint(codec, "add_stereo_mix_input") < 0) {
err = parse_capture_source(codec, spec->mixer_nid, err = parse_capture_source(codec, spec->mixer_nid,
CFG_IDX_MIX, spec->num_all_adcs, CFG_IDX_MIX, spec->num_all_adcs,
"Stereo Mix", 0); "Stereo Mix", 0);
......
...@@ -222,7 +222,7 @@ struct hda_gen_spec { ...@@ -222,7 +222,7 @@ struct hda_gen_spec {
unsigned int vmaster_mute_enum:1; /* add vmaster mute mode enum */ unsigned int vmaster_mute_enum:1; /* add vmaster mute mode enum */
unsigned int indep_hp:1; /* independent HP supported */ unsigned int indep_hp:1; /* independent HP supported */
unsigned int prefer_hp_amp:1; /* enable HP amp for speaker if any */ unsigned int prefer_hp_amp:1; /* enable HP amp for speaker if any */
unsigned int add_stereo_mix_input:1; /* add aamix as a capture src */ unsigned int add_stereo_mix_input:2; /* add aamix as a capture src */
unsigned int add_jack_modes:1; /* add i/o jack mode enum ctls */ unsigned int add_jack_modes:1; /* add i/o jack mode enum ctls */
unsigned int power_down_unused:1; /* power down unused widgets */ unsigned int power_down_unused:1; /* power down unused widgets */
unsigned int dac_min_mute:1; /* minimal = mute for DACs */ unsigned int dac_min_mute:1; /* minimal = mute for DACs */
...@@ -291,6 +291,13 @@ struct hda_gen_spec { ...@@ -291,6 +291,13 @@ struct hda_gen_spec {
struct hda_jack_callback *cb); struct hda_jack_callback *cb);
}; };
/* values for add_stereo_mix_input flag */
enum {
HDA_HINT_STEREO_MIX_DISABLE, /* No stereo mix input */
HDA_HINT_STEREO_MIX_ENABLE, /* Add stereo mix input */
HDA_HINT_STEREO_MIX_AUTO, /* Add only if auto-mic is disabled */
};
int snd_hda_gen_spec_init(struct hda_gen_spec *spec); int snd_hda_gen_spec_init(struct hda_gen_spec *spec);
int snd_hda_gen_init(struct hda_codec *codec); int snd_hda_gen_init(struct hda_codec *codec);
......
...@@ -468,7 +468,7 @@ int snd_hda_get_bool_hint(struct hda_codec *codec, const char *key) ...@@ -468,7 +468,7 @@ int snd_hda_get_bool_hint(struct hda_codec *codec, const char *key)
EXPORT_SYMBOL_GPL(snd_hda_get_bool_hint); EXPORT_SYMBOL_GPL(snd_hda_get_bool_hint);
/** /**
* snd_hda_get_bool_hint - Get a boolean hint value * snd_hda_get_int_hint - Get an integer hint value
* @codec: the HDA codec * @codec: the HDA codec
* @key: the hint key string * @key: the hint key string
* @valp: pointer to store a value * @valp: pointer to store a value
......
...@@ -195,7 +195,8 @@ static int ad198x_parse_auto_config(struct hda_codec *codec, bool indep_hp) ...@@ -195,7 +195,8 @@ static int ad198x_parse_auto_config(struct hda_codec *codec, bool indep_hp)
codec->no_sticky_stream = 1; codec->no_sticky_stream = 1;
spec->gen.indep_hp = indep_hp; spec->gen.indep_hp = indep_hp;
spec->gen.add_stereo_mix_input = 1; if (!spec->gen.add_stereo_mix_input)
spec->gen.add_stereo_mix_input = HDA_HINT_STEREO_MIX_AUTO;
err = snd_hda_parse_pin_defcfg(codec, cfg, NULL, 0); err = snd_hda_parse_pin_defcfg(codec, cfg, NULL, 0);
if (err < 0) if (err < 0)
...@@ -256,6 +257,18 @@ static void ad1986a_fixup_eapd(struct hda_codec *codec, ...@@ -256,6 +257,18 @@ static void ad1986a_fixup_eapd(struct hda_codec *codec,
} }
} }
/* enable stereo-mix input for avoiding regression on KDE (bko#88251) */
static void ad1986a_fixup_eapd_mix_in(struct hda_codec *codec,
const struct hda_fixup *fix, int action)
{
struct ad198x_spec *spec = codec->spec;
if (action == HDA_FIXUP_ACT_PRE_PROBE) {
ad1986a_fixup_eapd(codec, fix, action);
spec->gen.add_stereo_mix_input = HDA_HINT_STEREO_MIX_ENABLE;
}
}
enum { enum {
AD1986A_FIXUP_INV_JACK_DETECT, AD1986A_FIXUP_INV_JACK_DETECT,
AD1986A_FIXUP_ULTRA, AD1986A_FIXUP_ULTRA,
...@@ -264,6 +277,8 @@ enum { ...@@ -264,6 +277,8 @@ enum {
AD1986A_FIXUP_LAPTOP, AD1986A_FIXUP_LAPTOP,
AD1986A_FIXUP_LAPTOP_IMIC, AD1986A_FIXUP_LAPTOP_IMIC,
AD1986A_FIXUP_EAPD, AD1986A_FIXUP_EAPD,
AD1986A_FIXUP_EAPD_MIX_IN,
AD1986A_FIXUP_EASYNOTE,
}; };
static const struct hda_fixup ad1986a_fixups[] = { static const struct hda_fixup ad1986a_fixups[] = {
...@@ -328,6 +343,30 @@ static const struct hda_fixup ad1986a_fixups[] = { ...@@ -328,6 +343,30 @@ static const struct hda_fixup ad1986a_fixups[] = {
.type = HDA_FIXUP_FUNC, .type = HDA_FIXUP_FUNC,
.v.func = ad1986a_fixup_eapd, .v.func = ad1986a_fixup_eapd,
}, },
[AD1986A_FIXUP_EAPD_MIX_IN] = {
.type = HDA_FIXUP_FUNC,
.v.func = ad1986a_fixup_eapd_mix_in,
},
[AD1986A_FIXUP_EASYNOTE] = {
.type = HDA_FIXUP_PINS,
.v.pins = (const struct hda_pintbl[]) {
{ 0x1a, 0x0421402f }, /* headphone */
{ 0x1b, 0x90170110 }, /* speaker */
{ 0x1c, 0x411111f0 }, /* N/A */
{ 0x1d, 0x90a70130 }, /* int mic */
{ 0x1e, 0x411111f0 }, /* N/A */
{ 0x1f, 0x04a19040 }, /* mic */
{ 0x20, 0x411111f0 }, /* N/A */
{ 0x21, 0x411111f0 }, /* N/A */
{ 0x22, 0x411111f0 }, /* N/A */
{ 0x23, 0x411111f0 }, /* N/A */
{ 0x24, 0x411111f0 }, /* N/A */
{ 0x25, 0x411111f0 }, /* N/A */
{}
},
.chained = true,
.chain_id = AD1986A_FIXUP_EAPD_MIX_IN,
},
}; };
static const struct snd_pci_quirk ad1986a_fixup_tbl[] = { static const struct snd_pci_quirk ad1986a_fixup_tbl[] = {
...@@ -341,6 +380,7 @@ static const struct snd_pci_quirk ad1986a_fixup_tbl[] = { ...@@ -341,6 +380,7 @@ static const struct snd_pci_quirk ad1986a_fixup_tbl[] = {
SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_FIXUP_LAPTOP), SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_FIXUP_LAPTOP),
SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc000, "Samsung", AD1986A_FIXUP_SAMSUNG), SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc000, "Samsung", AD1986A_FIXUP_SAMSUNG),
SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_FIXUP_ULTRA), SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_FIXUP_ULTRA),
SND_PCI_QUIRK(0x1631, 0xc022, "PackardBell EasyNote MX65", AD1986A_FIXUP_EASYNOTE),
SND_PCI_QUIRK(0x17aa, 0x2066, "Lenovo N100", AD1986A_FIXUP_INV_JACK_DETECT), SND_PCI_QUIRK(0x17aa, 0x2066, "Lenovo N100", AD1986A_FIXUP_INV_JACK_DETECT),
SND_PCI_QUIRK(0x17aa, 0x1011, "Lenovo M55", AD1986A_FIXUP_3STACK), SND_PCI_QUIRK(0x17aa, 0x1011, "Lenovo M55", AD1986A_FIXUP_3STACK),
SND_PCI_QUIRK(0x17aa, 0x1017, "Lenovo A60", AD1986A_FIXUP_3STACK), SND_PCI_QUIRK(0x17aa, 0x1017, "Lenovo A60", AD1986A_FIXUP_3STACK),
......
...@@ -855,14 +855,14 @@ static int patch_conexant_auto(struct hda_codec *codec) ...@@ -855,14 +855,14 @@ static int patch_conexant_auto(struct hda_codec *codec)
case 0x14f15045: case 0x14f15045:
codec->single_adc_amp = 1; codec->single_adc_amp = 1;
spec->gen.mixer_nid = 0x17; spec->gen.mixer_nid = 0x17;
spec->gen.add_stereo_mix_input = 1; spec->gen.add_stereo_mix_input = HDA_HINT_STEREO_MIX_AUTO;
snd_hda_pick_fixup(codec, cxt5045_fixup_models, snd_hda_pick_fixup(codec, cxt5045_fixup_models,
cxt5045_fixups, cxt_fixups); cxt5045_fixups, cxt_fixups);
break; break;
case 0x14f15047: case 0x14f15047:
codec->pin_amp_workaround = 1; codec->pin_amp_workaround = 1;
spec->gen.mixer_nid = 0x19; spec->gen.mixer_nid = 0x19;
spec->gen.add_stereo_mix_input = 1; spec->gen.add_stereo_mix_input = HDA_HINT_STEREO_MIX_AUTO;
snd_hda_pick_fixup(codec, cxt5047_fixup_models, snd_hda_pick_fixup(codec, cxt5047_fixup_models,
cxt5047_fixups, cxt_fixups); cxt5047_fixups, cxt_fixups);
break; break;
......
...@@ -47,7 +47,9 @@ MODULE_PARM_DESC(static_hdmi_pcm, "Don't restrict PCM parameters per ELD info"); ...@@ -47,7 +47,9 @@ MODULE_PARM_DESC(static_hdmi_pcm, "Don't restrict PCM parameters per ELD info");
#define is_haswell(codec) ((codec)->vendor_id == 0x80862807) #define is_haswell(codec) ((codec)->vendor_id == 0x80862807)
#define is_broadwell(codec) ((codec)->vendor_id == 0x80862808) #define is_broadwell(codec) ((codec)->vendor_id == 0x80862808)
#define is_haswell_plus(codec) (is_haswell(codec) || is_broadwell(codec)) #define is_skylake(codec) ((codec)->vendor_id == 0x80862809)
#define is_haswell_plus(codec) (is_haswell(codec) || is_broadwell(codec) \
|| is_skylake(codec))
#define is_valleyview(codec) ((codec)->vendor_id == 0x80862882) #define is_valleyview(codec) ((codec)->vendor_id == 0x80862882)
#define is_cherryview(codec) ((codec)->vendor_id == 0x80862883) #define is_cherryview(codec) ((codec)->vendor_id == 0x80862883)
...@@ -3365,6 +3367,7 @@ static const struct hda_codec_preset snd_hda_preset_hdmi[] = { ...@@ -3365,6 +3367,7 @@ static const struct hda_codec_preset snd_hda_preset_hdmi[] = {
{ .id = 0x80862806, .name = "PantherPoint HDMI", .patch = patch_generic_hdmi }, { .id = 0x80862806, .name = "PantherPoint HDMI", .patch = patch_generic_hdmi },
{ .id = 0x80862807, .name = "Haswell HDMI", .patch = patch_generic_hdmi }, { .id = 0x80862807, .name = "Haswell HDMI", .patch = patch_generic_hdmi },
{ .id = 0x80862808, .name = "Broadwell HDMI", .patch = patch_generic_hdmi }, { .id = 0x80862808, .name = "Broadwell HDMI", .patch = patch_generic_hdmi },
{ .id = 0x80862809, .name = "Skylake HDMI", .patch = patch_generic_hdmi },
{ .id = 0x80862880, .name = "CedarTrail HDMI", .patch = patch_generic_hdmi }, { .id = 0x80862880, .name = "CedarTrail HDMI", .patch = patch_generic_hdmi },
{ .id = 0x80862882, .name = "Valleyview2 HDMI", .patch = patch_generic_hdmi }, { .id = 0x80862882, .name = "Valleyview2 HDMI", .patch = patch_generic_hdmi },
{ .id = 0x80862883, .name = "Braswell HDMI", .patch = patch_generic_hdmi }, { .id = 0x80862883, .name = "Braswell HDMI", .patch = patch_generic_hdmi },
...@@ -3425,6 +3428,7 @@ MODULE_ALIAS("snd-hda-codec-id:80862805"); ...@@ -3425,6 +3428,7 @@ MODULE_ALIAS("snd-hda-codec-id:80862805");
MODULE_ALIAS("snd-hda-codec-id:80862806"); MODULE_ALIAS("snd-hda-codec-id:80862806");
MODULE_ALIAS("snd-hda-codec-id:80862807"); MODULE_ALIAS("snd-hda-codec-id:80862807");
MODULE_ALIAS("snd-hda-codec-id:80862808"); MODULE_ALIAS("snd-hda-codec-id:80862808");
MODULE_ALIAS("snd-hda-codec-id:80862809");
MODULE_ALIAS("snd-hda-codec-id:80862880"); MODULE_ALIAS("snd-hda-codec-id:80862880");
MODULE_ALIAS("snd-hda-codec-id:80862882"); MODULE_ALIAS("snd-hda-codec-id:80862882");
MODULE_ALIAS("snd-hda-codec-id:80862883"); MODULE_ALIAS("snd-hda-codec-id:80862883");
......
...@@ -321,10 +321,12 @@ static void alc_fill_eapd_coef(struct hda_codec *codec) ...@@ -321,10 +321,12 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
break; break;
case 0x10ec0233: case 0x10ec0233:
case 0x10ec0255: case 0x10ec0255:
case 0x10ec0256:
case 0x10ec0282: case 0x10ec0282:
case 0x10ec0283: case 0x10ec0283:
case 0x10ec0286: case 0x10ec0286:
case 0x10ec0288: case 0x10ec0288:
case 0x10ec0298:
alc_update_coef_idx(codec, 0x10, 1<<9, 0); alc_update_coef_idx(codec, 0x10, 1<<9, 0);
break; break;
case 0x10ec0285: case 0x10ec0285:
...@@ -2659,7 +2661,9 @@ enum { ...@@ -2659,7 +2661,9 @@ enum {
ALC269_TYPE_ALC284, ALC269_TYPE_ALC284,
ALC269_TYPE_ALC285, ALC269_TYPE_ALC285,
ALC269_TYPE_ALC286, ALC269_TYPE_ALC286,
ALC269_TYPE_ALC298,
ALC269_TYPE_ALC255, ALC269_TYPE_ALC255,
ALC269_TYPE_ALC256,
}; };
/* /*
...@@ -2686,7 +2690,9 @@ static int alc269_parse_auto_config(struct hda_codec *codec) ...@@ -2686,7 +2690,9 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
case ALC269_TYPE_ALC282: case ALC269_TYPE_ALC282:
case ALC269_TYPE_ALC283: case ALC269_TYPE_ALC283:
case ALC269_TYPE_ALC286: case ALC269_TYPE_ALC286:
case ALC269_TYPE_ALC298:
case ALC269_TYPE_ALC255: case ALC269_TYPE_ALC255:
case ALC269_TYPE_ALC256:
ssids = alc269_ssids; ssids = alc269_ssids;
break; break;
default: default:
...@@ -4829,6 +4835,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { ...@@ -4829,6 +4835,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK), SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_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, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
...@@ -5417,9 +5424,15 @@ static int patch_alc269(struct hda_codec *codec) ...@@ -5417,9 +5424,15 @@ static int patch_alc269(struct hda_codec *codec)
spec->codec_variant = ALC269_TYPE_ALC286; spec->codec_variant = ALC269_TYPE_ALC286;
spec->shutup = alc286_shutup; spec->shutup = alc286_shutup;
break; break;
case 0x10ec0298:
spec->codec_variant = ALC269_TYPE_ALC298;
break;
case 0x10ec0255: case 0x10ec0255:
spec->codec_variant = ALC269_TYPE_ALC255; spec->codec_variant = ALC269_TYPE_ALC255;
break; break;
case 0x10ec0256:
spec->codec_variant = ALC269_TYPE_ALC256;
break;
} }
if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) { if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
...@@ -6341,6 +6354,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = { ...@@ -6341,6 +6354,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = {
{ .id = 0x10ec0233, .name = "ALC233", .patch = patch_alc269 }, { .id = 0x10ec0233, .name = "ALC233", .patch = patch_alc269 },
{ .id = 0x10ec0235, .name = "ALC233", .patch = patch_alc269 }, { .id = 0x10ec0235, .name = "ALC233", .patch = patch_alc269 },
{ .id = 0x10ec0255, .name = "ALC255", .patch = patch_alc269 }, { .id = 0x10ec0255, .name = "ALC255", .patch = patch_alc269 },
{ .id = 0x10ec0256, .name = "ALC256", .patch = patch_alc269 },
{ .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 }, { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
{ .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 }, { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
{ .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 }, { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
...@@ -6360,6 +6374,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = { ...@@ -6360,6 +6374,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = {
{ .id = 0x10ec0290, .name = "ALC290", .patch = patch_alc269 }, { .id = 0x10ec0290, .name = "ALC290", .patch = patch_alc269 },
{ .id = 0x10ec0292, .name = "ALC292", .patch = patch_alc269 }, { .id = 0x10ec0292, .name = "ALC292", .patch = patch_alc269 },
{ .id = 0x10ec0293, .name = "ALC293", .patch = patch_alc269 }, { .id = 0x10ec0293, .name = "ALC293", .patch = patch_alc269 },
{ .id = 0x10ec0298, .name = "ALC298", .patch = patch_alc269 },
{ .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660", { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
.patch = patch_alc861 }, .patch = patch_alc861 },
{ .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd }, { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
......
...@@ -137,7 +137,7 @@ static struct via_spec *via_new_spec(struct hda_codec *codec) ...@@ -137,7 +137,7 @@ static struct via_spec *via_new_spec(struct hda_codec *codec)
spec->gen.indep_hp = 1; spec->gen.indep_hp = 1;
spec->gen.keep_eapd_on = 1; spec->gen.keep_eapd_on = 1;
spec->gen.pcm_playback_hook = via_playback_pcm_hook; spec->gen.pcm_playback_hook = via_playback_pcm_hook;
spec->gen.add_stereo_mix_input = 1; spec->gen.add_stereo_mix_input = HDA_HINT_STEREO_MIX_AUTO;
return spec; return spec;
} }
......
...@@ -267,7 +267,7 @@ static void atmel_ssc_shutdown(struct snd_pcm_substream *substream, ...@@ -267,7 +267,7 @@ static void atmel_ssc_shutdown(struct snd_pcm_substream *substream,
if (!ssc_p->dir_mask) { if (!ssc_p->dir_mask) {
if (ssc_p->initialized) { if (ssc_p->initialized) {
/* Shutdown the SSC clock. */ /* Shutdown the SSC clock. */
pr_debug("atmel_ssc_dau: Stopping clock\n"); pr_debug("atmel_ssc_dai: Stopping clock\n");
clk_disable(ssc_p->ssc->clk); clk_disable(ssc_p->ssc->clk);
free_irq(ssc_p->ssc->irq, ssc_p); free_irq(ssc_p->ssc->irq, ssc_p);
......
...@@ -520,6 +520,8 @@ config SND_SOC_RT5670 ...@@ -520,6 +520,8 @@ config SND_SOC_RT5670
config SND_SOC_RT5677 config SND_SOC_RT5677
tristate tristate
select REGMAP_I2C
select REGMAP_IRQ
config SND_SOC_RT5677_SPI config SND_SOC_RT5677_SPI
tristate tristate
......
...@@ -24,8 +24,13 @@ static int pcm512x_i2c_probe(struct i2c_client *i2c, ...@@ -24,8 +24,13 @@ static int pcm512x_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct regmap *regmap; struct regmap *regmap;
struct regmap_config config = pcm512x_regmap;
regmap = devm_regmap_init_i2c(i2c, &pcm512x_regmap); /* msb needs to be set to enable auto-increment of addresses */
config.read_flag_mask = 0x80;
config.write_flag_mask = 0x80;
regmap = devm_regmap_init_i2c(i2c, &config);
if (IS_ERR(regmap)) if (IS_ERR(regmap))
return PTR_ERR(regmap); return PTR_ERR(regmap);
......
...@@ -2209,6 +2209,10 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec) ...@@ -2209,6 +2209,10 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec)
int gpio_state, jack_type = 0; int gpio_state, jack_type = 0;
unsigned int val; unsigned int val;
if (!gpio_is_valid(rt5645->pdata.hp_det_gpio)) {
dev_err(codec->dev, "invalid gpio\n");
return -EINVAL;
}
gpio_state = gpio_get_value(rt5645->pdata.hp_det_gpio); gpio_state = gpio_get_value(rt5645->pdata.hp_det_gpio);
dev_dbg(codec->dev, "gpio = %d(%d)\n", rt5645->pdata.hp_det_gpio, dev_dbg(codec->dev, "gpio = %d(%d)\n", rt5645->pdata.hp_det_gpio,
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
#include "sst.h" #include "sst.h"
struct sst_machines { struct sst_machines {
char codec_id[32]; char *codec_id;
char board[32]; char board[32];
char machine[32]; char machine[32];
void (*machine_quirk)(void); void (*machine_quirk)(void);
...@@ -277,16 +277,16 @@ int sst_acpi_probe(struct platform_device *pdev) ...@@ -277,16 +277,16 @@ int sst_acpi_probe(struct platform_device *pdev)
dev_dbg(dev, "ACPI device id: %x\n", dev_id); dev_dbg(dev, "ACPI device id: %x\n", dev_id);
plat_dev = platform_device_register_data(dev, mach->pdata->platform, -1, NULL, 0); plat_dev = platform_device_register_data(dev, mach->pdata->platform, -1, NULL, 0);
if (plat_dev == NULL) { if (IS_ERR(plat_dev)) {
dev_err(dev, "Failed to create machine device: %s\n", mach->pdata->platform); dev_err(dev, "Failed to create machine device: %s\n", mach->pdata->platform);
return -ENODEV; return PTR_ERR(plat_dev);
} }
/* Create platform device for sst machine driver */ /* Create platform device for sst machine driver */
mdev = platform_device_register_data(dev, mach->machine, -1, NULL, 0); mdev = platform_device_register_data(dev, mach->machine, -1, NULL, 0);
if (mdev == NULL) { if (IS_ERR(mdev)) {
dev_err(dev, "Failed to create machine device: %s\n", mach->machine); dev_err(dev, "Failed to create machine device: %s\n", mach->machine);
return -ENODEV; return PTR_ERR(mdev);
} }
ret = sst_alloc_drv_context(&ctx, dev, dev_id); ret = sst_alloc_drv_context(&ctx, dev, dev_id);
......
...@@ -1261,6 +1261,8 @@ static int samsung_i2s_probe(struct platform_device *pdev) ...@@ -1261,6 +1261,8 @@ static int samsung_i2s_probe(struct platform_device *pdev)
ret = -ENOMEM; ret = -ENOMEM;
goto err; goto err;
} }
sec_dai->variant_regs = pri_dai->variant_regs;
sec_dai->dma_playback.dma_addr = regs_base + I2STXDS; sec_dai->dma_playback.dma_addr = regs_base + I2STXDS;
sec_dai->dma_playback.ch_name = "tx-sec"; sec_dai->dma_playback.ch_name = "tx-sec";
......
...@@ -333,8 +333,11 @@ static struct usbmix_name_map gamecom780_map[] = { ...@@ -333,8 +333,11 @@ static struct usbmix_name_map gamecom780_map[] = {
{} {}
}; };
static const struct usbmix_name_map kef_x300a_map[] = { /* some (all?) SCMS USB3318 devices are affected by a firmware lock up
{ 10, NULL }, /* firmware locks up (?) when we try to access this FU */ * when anything attempts to access FU 10 (control)
*/
static const struct usbmix_name_map scms_usb3318_map[] = {
{ 10, NULL },
{ 0 } { 0 }
}; };
...@@ -434,8 +437,14 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = { ...@@ -434,8 +437,14 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = {
.map = ebox44_map, .map = ebox44_map,
}, },
{ {
/* KEF X300A */
.id = USB_ID(0x27ac, 0x1000), .id = USB_ID(0x27ac, 0x1000),
.map = kef_x300a_map, .map = scms_usb3318_map,
},
{
/* Arcam rPAC */
.id = USB_ID(0x25c4, 0x0003),
.map = scms_usb3318_map,
}, },
{ 0 } /* terminator */ { 0 } /* terminator */
}; };
......
...@@ -655,7 +655,7 @@ static struct scarlett_device_info s6i6_info = { ...@@ -655,7 +655,7 @@ static struct scarlett_device_info s6i6_info = {
.names = NULL .names = NULL
}, },
.num_controls = 0, .num_controls = 9,
.controls = { .controls = {
{ .num = 0, .type = SCARLETT_OUTPUTS, .name = "Monitor" }, { .num = 0, .type = SCARLETT_OUTPUTS, .name = "Monitor" },
{ .num = 1, .type = SCARLETT_OUTPUTS, .name = "Headphone" }, { .num = 1, .type = SCARLETT_OUTPUTS, .name = "Headphone" },
......
...@@ -1245,8 +1245,9 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip, ...@@ -1245,8 +1245,9 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
/* XMOS based USB DACs */ /* XMOS based USB DACs */
switch (chip->usb_id) { switch (chip->usb_id) {
/* iFi Audio micro/nano iDSD */ case USB_ID(0x20b1, 0x3008): /* iFi Audio micro/nano iDSD */
case USB_ID(0x20b1, 0x3008): case USB_ID(0x20b1, 0x2008): /* Matrix Audio X-Sabre */
case USB_ID(0x20b1, 0x300a): /* Matrix Audio Mini-i Pro */
if (fp->altsetting == 2) if (fp->altsetting == 2)
return SNDRV_PCM_FMTBIT_DSD_U32_BE; return SNDRV_PCM_FMTBIT_DSD_U32_BE;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment