[GIT PULL] sound fixes for 4.6-rc5

2016-04-22 Thread Takashi Iwai
Linus,

please pull sound fixes for v4.6-rc5 from:

  git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git 
tags/sound-4.6-rc5

The topmost commit is 3194ed497939c6448005542e3ca4fa2386968fa0



sound fixes for 4.6-rc5

Again a relatively calm week without surprise: most of fixes are about
HD-audio, including fixes for Cirrus codec regression and a race over
regmap access.  Although both change are slightly unintuitive, the
risk of further breakage is quite low, I hope.

Other than that, all the rest are trivial.



Bastien Nocera (1):
  ALSA: hda/realtek - Add ALC3234 headset mode for Optiplex 9020m

Libin Yang (1):
  ALSA - hda: hdmi check NULL pointer in hdmi_set_chmap

Lu, Han (1):
  ALSA: hda - add PCI ID for Intel Broxton-T

Takashi Iwai (4):
  ALSA: hda - Don't trust the reported actual power state
  ALSA: hda - Keep powering up ADCs on Cirrus codecs
  ALSA: pcxhr: Fix missing mutex unlock
  ALSA: hda - Fix possible race on regmap bypass flip

---
 include/sound/hda_regmap.h|  2 ++
 sound/hda/hdac_device.c   | 10 --
 sound/hda/hdac_regmap.c   | 40 
 sound/pci/hda/hda_generic.c   |  6 --
 sound/pci/hda/hda_intel.c |  3 +++
 sound/pci/hda/patch_cirrus.c  | 14 ++
 sound/pci/hda/patch_hdmi.c|  2 ++
 sound/pci/hda/patch_realtek.c |  1 +
 sound/pci/pcxhr/pcxhr_core.c  |  1 +
 9 files changed, 59 insertions(+), 20 deletions(-)

diff --git a/include/sound/hda_regmap.h b/include/sound/hda_regmap.h
index 2767c55a641e..ca64f0f50b45 100644
--- a/include/sound/hda_regmap.h
+++ b/include/sound/hda_regmap.h
@@ -17,6 +17,8 @@ int snd_hdac_regmap_add_vendor_verb(struct hdac_device *codec,
unsigned int verb);
 int snd_hdac_regmap_read_raw(struct hdac_device *codec, unsigned int reg,
 unsigned int *val);
+int snd_hdac_regmap_read_raw_uncached(struct hdac_device *codec,
+ unsigned int reg, unsigned int *val);
 int snd_hdac_regmap_write_raw(struct hdac_device *codec, unsigned int reg,
  unsigned int val);
 int snd_hdac_regmap_update_raw(struct hdac_device *codec, unsigned int reg,
diff --git a/sound/hda/hdac_device.c b/sound/hda/hdac_device.c
index d1a4d6973330..03c9872c31cf 100644
--- a/sound/hda/hdac_device.c
+++ b/sound/hda/hdac_device.c
@@ -299,13 +299,11 @@ EXPORT_SYMBOL_GPL(_snd_hdac_read_parm);
 int snd_hdac_read_parm_uncached(struct hdac_device *codec, hda_nid_t nid,
int parm)
 {
-   int val;
+   unsigned int cmd, val;
 
-   if (codec->regmap)
-   regcache_cache_bypass(codec->regmap, true);
-   val = snd_hdac_read_parm(codec, nid, parm);
-   if (codec->regmap)
-   regcache_cache_bypass(codec->regmap, false);
+   cmd = snd_hdac_regmap_encode_verb(nid, AC_VERB_PARAMETERS) | parm;
+   if (snd_hdac_regmap_read_raw_uncached(codec, cmd, ) < 0)
+   return -1;
return val;
 }
 EXPORT_SYMBOL_GPL(snd_hdac_read_parm_uncached);
diff --git a/sound/hda/hdac_regmap.c b/sound/hda/hdac_regmap.c
index bdbcd6b75ff6..87041ddd29cb 100644
--- a/sound/hda/hdac_regmap.c
+++ b/sound/hda/hdac_regmap.c
@@ -453,14 +453,30 @@ int snd_hdac_regmap_write_raw(struct hdac_device *codec, 
unsigned int reg,
 EXPORT_SYMBOL_GPL(snd_hdac_regmap_write_raw);
 
 static int reg_raw_read(struct hdac_device *codec, unsigned int reg,
-   unsigned int *val)
+   unsigned int *val, bool uncached)
 {
-   if (!codec->regmap)
+   if (uncached || !codec->regmap)
return hda_reg_read(codec, reg, val);
else
return regmap_read(codec->regmap, reg, val);
 }
 
+static int __snd_hdac_regmap_read_raw(struct hdac_device *codec,
+ unsigned int reg, unsigned int *val,
+ bool uncached)
+{
+   int err;
+
+   err = reg_raw_read(codec, reg, val, uncached);
+   if (err == -EAGAIN) {
+   err = snd_hdac_power_up_pm(codec);
+   if (!err)
+   err = reg_raw_read(codec, reg, val, uncached);
+   snd_hdac_power_down_pm(codec);
+   }
+   return err;
+}
+
 /**
  * snd_hdac_regmap_read_raw - read a pseudo register with power mgmt
  * @codec: the codec object
@@ -472,19 +488,19 @@ static int reg_raw_read(struct hdac_device *codec, 
unsigned int reg,
 int snd_hdac_regmap_read_raw(struct hdac_device *codec, unsigned int reg,
 unsigned int *val)
 {
-   int err;
-
-   err = reg_raw_read(codec, reg, val);
-   if (err == -EAGAIN) {
-   err = snd_hdac_power_up_pm(codec);
-   if (!err)
-   err = reg_raw_read(codec, 

[GIT PULL] sound fixes for 4.6-rc5

2016-04-22 Thread Takashi Iwai
Linus,

please pull sound fixes for v4.6-rc5 from:

  git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git 
tags/sound-4.6-rc5

The topmost commit is 3194ed497939c6448005542e3ca4fa2386968fa0



sound fixes for 4.6-rc5

Again a relatively calm week without surprise: most of fixes are about
HD-audio, including fixes for Cirrus codec regression and a race over
regmap access.  Although both change are slightly unintuitive, the
risk of further breakage is quite low, I hope.

Other than that, all the rest are trivial.



Bastien Nocera (1):
  ALSA: hda/realtek - Add ALC3234 headset mode for Optiplex 9020m

Libin Yang (1):
  ALSA - hda: hdmi check NULL pointer in hdmi_set_chmap

Lu, Han (1):
  ALSA: hda - add PCI ID for Intel Broxton-T

Takashi Iwai (4):
  ALSA: hda - Don't trust the reported actual power state
  ALSA: hda - Keep powering up ADCs on Cirrus codecs
  ALSA: pcxhr: Fix missing mutex unlock
  ALSA: hda - Fix possible race on regmap bypass flip

---
 include/sound/hda_regmap.h|  2 ++
 sound/hda/hdac_device.c   | 10 --
 sound/hda/hdac_regmap.c   | 40 
 sound/pci/hda/hda_generic.c   |  6 --
 sound/pci/hda/hda_intel.c |  3 +++
 sound/pci/hda/patch_cirrus.c  | 14 ++
 sound/pci/hda/patch_hdmi.c|  2 ++
 sound/pci/hda/patch_realtek.c |  1 +
 sound/pci/pcxhr/pcxhr_core.c  |  1 +
 9 files changed, 59 insertions(+), 20 deletions(-)

diff --git a/include/sound/hda_regmap.h b/include/sound/hda_regmap.h
index 2767c55a641e..ca64f0f50b45 100644
--- a/include/sound/hda_regmap.h
+++ b/include/sound/hda_regmap.h
@@ -17,6 +17,8 @@ int snd_hdac_regmap_add_vendor_verb(struct hdac_device *codec,
unsigned int verb);
 int snd_hdac_regmap_read_raw(struct hdac_device *codec, unsigned int reg,
 unsigned int *val);
+int snd_hdac_regmap_read_raw_uncached(struct hdac_device *codec,
+ unsigned int reg, unsigned int *val);
 int snd_hdac_regmap_write_raw(struct hdac_device *codec, unsigned int reg,
  unsigned int val);
 int snd_hdac_regmap_update_raw(struct hdac_device *codec, unsigned int reg,
diff --git a/sound/hda/hdac_device.c b/sound/hda/hdac_device.c
index d1a4d6973330..03c9872c31cf 100644
--- a/sound/hda/hdac_device.c
+++ b/sound/hda/hdac_device.c
@@ -299,13 +299,11 @@ EXPORT_SYMBOL_GPL(_snd_hdac_read_parm);
 int snd_hdac_read_parm_uncached(struct hdac_device *codec, hda_nid_t nid,
int parm)
 {
-   int val;
+   unsigned int cmd, val;
 
-   if (codec->regmap)
-   regcache_cache_bypass(codec->regmap, true);
-   val = snd_hdac_read_parm(codec, nid, parm);
-   if (codec->regmap)
-   regcache_cache_bypass(codec->regmap, false);
+   cmd = snd_hdac_regmap_encode_verb(nid, AC_VERB_PARAMETERS) | parm;
+   if (snd_hdac_regmap_read_raw_uncached(codec, cmd, ) < 0)
+   return -1;
return val;
 }
 EXPORT_SYMBOL_GPL(snd_hdac_read_parm_uncached);
diff --git a/sound/hda/hdac_regmap.c b/sound/hda/hdac_regmap.c
index bdbcd6b75ff6..87041ddd29cb 100644
--- a/sound/hda/hdac_regmap.c
+++ b/sound/hda/hdac_regmap.c
@@ -453,14 +453,30 @@ int snd_hdac_regmap_write_raw(struct hdac_device *codec, 
unsigned int reg,
 EXPORT_SYMBOL_GPL(snd_hdac_regmap_write_raw);
 
 static int reg_raw_read(struct hdac_device *codec, unsigned int reg,
-   unsigned int *val)
+   unsigned int *val, bool uncached)
 {
-   if (!codec->regmap)
+   if (uncached || !codec->regmap)
return hda_reg_read(codec, reg, val);
else
return regmap_read(codec->regmap, reg, val);
 }
 
+static int __snd_hdac_regmap_read_raw(struct hdac_device *codec,
+ unsigned int reg, unsigned int *val,
+ bool uncached)
+{
+   int err;
+
+   err = reg_raw_read(codec, reg, val, uncached);
+   if (err == -EAGAIN) {
+   err = snd_hdac_power_up_pm(codec);
+   if (!err)
+   err = reg_raw_read(codec, reg, val, uncached);
+   snd_hdac_power_down_pm(codec);
+   }
+   return err;
+}
+
 /**
  * snd_hdac_regmap_read_raw - read a pseudo register with power mgmt
  * @codec: the codec object
@@ -472,19 +488,19 @@ static int reg_raw_read(struct hdac_device *codec, 
unsigned int reg,
 int snd_hdac_regmap_read_raw(struct hdac_device *codec, unsigned int reg,
 unsigned int *val)
 {
-   int err;
-
-   err = reg_raw_read(codec, reg, val);
-   if (err == -EAGAIN) {
-   err = snd_hdac_power_up_pm(codec);
-   if (!err)
-   err = reg_raw_read(codec,