--- /dev/null
+From 2ded3e5b61d61d0bc90bebb8004db6184c7db6eb Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Thu, 28 Nov 2013 11:05:28 +0100
+Subject: ALSA: hda - Check leaf nodes to find aamix amps
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 2ded3e5b61d61d0bc90bebb8004db6184c7db6eb upstream.
+
+The current generic parser assumes blindly that the volume and mute
+amps are found in the aamix node itself. But on some codecs,
+typically Analog Devices ones, the aamix amps are separately
+implemented in each leaf node of the aamix node, and the current
+driver can't establish the correct amp controls. This is a regression
+compared with the previous static quirks.
+
+This patch extends the search for the amps to the leaf nodes for
+allowing the aamix controls again on such codecs.
+In this implementation, I didn't code to loop through the whole paths,
+since usually one depth should suffice, and we can't search too
+deeply, as it may result in the conflicting control assignments.
+
+Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=65641
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/pci/hda/hda_generic.c | 57 ++++++++++++++++++++++++++++++++++----------
+ 1 file changed, 45 insertions(+), 12 deletions(-)
+
+--- a/sound/pci/hda/hda_generic.c
++++ b/sound/pci/hda/hda_generic.c
+@@ -2747,6 +2747,42 @@ static int add_loopback_list(struct hda_
+ return 0;
+ }
+
++/* return true if either a volume or a mute amp is found for the given
++ * aamix path; the amp has to be either in the mixer node or its direct leaf
++ */
++static bool look_for_mix_leaf_ctls(struct hda_codec *codec, hda_nid_t mix_nid,
++ hda_nid_t pin, unsigned int *mix_val,
++ unsigned int *mute_val)
++{
++ int idx, num_conns;
++ const hda_nid_t *list;
++ hda_nid_t nid;
++
++ idx = snd_hda_get_conn_index(codec, mix_nid, pin, true);
++ if (idx < 0)
++ return false;
++
++ *mix_val = *mute_val = 0;
++ if (nid_has_volume(codec, mix_nid, HDA_INPUT))
++ *mix_val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
++ if (nid_has_mute(codec, mix_nid, HDA_INPUT))
++ *mute_val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
++ if (*mix_val && *mute_val)
++ return true;
++
++ /* check leaf node */
++ num_conns = snd_hda_get_conn_list(codec, mix_nid, &list);
++ if (num_conns < idx)
++ return false;
++ nid = list[idx];
++ if (!*mix_val && nid_has_volume(codec, nid, HDA_OUTPUT))
++ *mix_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
++ if (!*mute_val && nid_has_mute(codec, nid, HDA_OUTPUT))
++ *mute_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
++
++ return *mix_val || *mute_val;
++}
++
+ /* create input playback/capture controls for the given pin */
+ static int new_analog_input(struct hda_codec *codec, int input_idx,
+ hda_nid_t pin, const char *ctlname, int ctlidx,
+@@ -2754,12 +2790,11 @@ static int new_analog_input(struct hda_c
+ {
+ struct hda_gen_spec *spec = codec->spec;
+ struct nid_path *path;
+- unsigned int val;
++ unsigned int mix_val, mute_val;
+ int err, idx;
+
+- if (!nid_has_volume(codec, mix_nid, HDA_INPUT) &&
+- !nid_has_mute(codec, mix_nid, HDA_INPUT))
+- return 0; /* no need for analog loopback */
++ if (!look_for_mix_leaf_ctls(codec, mix_nid, pin, &mix_val, &mute_val))
++ return 0;
+
+ path = snd_hda_add_new_path(codec, pin, mix_nid, 0);
+ if (!path)
+@@ -2768,20 +2803,18 @@ static int new_analog_input(struct hda_c
+ spec->loopback_paths[input_idx] = snd_hda_get_path_idx(codec, path);
+
+ idx = path->idx[path->depth - 1];
+- if (nid_has_volume(codec, mix_nid, HDA_INPUT)) {
+- val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
+- err = __add_pb_vol_ctrl(spec, HDA_CTL_WIDGET_VOL, ctlname, ctlidx, val);
++ if (mix_val) {
++ err = __add_pb_vol_ctrl(spec, HDA_CTL_WIDGET_VOL, ctlname, ctlidx, mix_val);
+ if (err < 0)
+ return err;
+- path->ctls[NID_PATH_VOL_CTL] = val;
++ path->ctls[NID_PATH_VOL_CTL] = mix_val;
+ }
+
+- if (nid_has_mute(codec, mix_nid, HDA_INPUT)) {
+- val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
+- err = __add_pb_sw_ctrl(spec, HDA_CTL_WIDGET_MUTE, ctlname, ctlidx, val);
++ if (mute_val) {
++ err = __add_pb_sw_ctrl(spec, HDA_CTL_WIDGET_MUTE, ctlname, ctlidx, mute_val);
+ if (err < 0)
+ return err;
+- path->ctls[NID_PATH_MUTE_CTL] = val;
++ path->ctls[NID_PATH_MUTE_CTL] = mute_val;
+ }
+
+ path->active = true;
--- /dev/null
+From ced4cefc75fdb8be95eaee325ad0f6b2fc0a484b Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Tue, 26 Nov 2013 08:33:45 +0100
+Subject: ALSA: hda - Create Headhpone Mic Jack Mode when really needed
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit ced4cefc75fdb8be95eaee325ad0f6b2fc0a484b upstream.
+
+When a headphone jack is configurable as input, the generic parser
+tries to make it retaskable as Headphone Mic. The switching can be
+done smoothly if Capture Source control exists (i.e. there is another
+input source). Or when user explicitly enables the creation of jack
+mode controls, "Headhpone Mic Jack Mode" will be created accordingly.
+
+However, if the headphone mic is the only input source, we have to
+create "Headphone Mic Jack Mode" control because there is no capture
+source selection. Otherwise, the generic parser assumes that the
+input is constantly enabled, thus the headphone is permanently set
+as input. This situation happens on the old MacBook Airs where no
+input is supported properly, for example.
+
+This patch fixes the problem: now "Headphone Mic Jack Mode" is created
+when such an input selection isn't possible.
+
+Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=65681
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/pci/hda/hda_generic.c | 20 ++++++++++++--------
+ 1 file changed, 12 insertions(+), 8 deletions(-)
+
+--- a/sound/pci/hda/hda_generic.c
++++ b/sound/pci/hda/hda_generic.c
+@@ -2445,12 +2445,8 @@ static int create_out_jack_modes(struct
+
+ for (i = 0; i < num_pins; i++) {
+ hda_nid_t pin = pins[i];
+- if (pin == spec->hp_mic_pin) {
+- int ret = create_hp_mic_jack_mode(codec, pin);
+- if (ret < 0)
+- return ret;
++ if (pin == spec->hp_mic_pin)
+ continue;
+- }
+ if (get_out_jack_num_items(codec, pin) > 1) {
+ struct snd_kcontrol_new *knew;
+ char name[44];
+@@ -2723,9 +2719,6 @@ static int create_hp_mic_jack_mode(struc
+ struct hda_gen_spec *spec = codec->spec;
+ struct snd_kcontrol_new *knew;
+
+- if (get_out_jack_num_items(codec, pin) <= 1 &&
+- get_in_jack_num_items(codec, pin) <= 1)
+- return 0; /* no need */
+ knew = snd_hda_gen_add_kctl(spec, "Headphone Mic Jack Mode",
+ &hp_mic_jack_mode_enum);
+ if (!knew)
+@@ -4287,6 +4280,17 @@ int snd_hda_gen_parse_auto_config(struct
+ if (err < 0)
+ return err;
+
++ /* create "Headphone Mic Jack Mode" if no input selection is
++ * available (or user specifies add_jack_modes hint)
++ */
++ if (spec->hp_mic_pin &&
++ (spec->auto_mic || spec->input_mux.num_items == 1 ||
++ spec->add_jack_modes)) {
++ err = create_hp_mic_jack_mode(codec, spec->hp_mic_pin);
++ if (err < 0)
++ return err;
++ }
++
+ if (spec->add_jack_modes) {
+ if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
+ err = create_out_jack_modes(codec, cfg->line_outs,
--- /dev/null
+From 16c0cefe8951b2c4b824fd06011ac1b359b1ab3b Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Tue, 26 Nov 2013 08:44:26 +0100
+Subject: ALSA: hda - Fix hp-mic mode without VREF bits
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 16c0cefe8951b2c4b824fd06011ac1b359b1ab3b upstream.
+
+When the hp mic pin has no VREF bits, the driver forgot to set PIN_IN
+bit. Spotted during debugging old MacBook Airs.
+
+Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=65681
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/pci/hda/hda_generic.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/sound/pci/hda/hda_generic.c
++++ b/sound/pci/hda/hda_generic.c
+@@ -2703,7 +2703,7 @@ static int hp_mic_jack_mode_put(struct s
+ val &= ~(AC_PINCTL_VREFEN | PIN_HP);
+ val |= get_vref_idx(vref_caps, idx) | PIN_IN;
+ } else
+- val = snd_hda_get_default_vref(codec, nid);
++ val = snd_hda_get_default_vref(codec, nid) | PIN_IN;
+ }
+ snd_hda_set_pin_ctl_cache(codec, nid, val);
+ call_hp_automute(codec, NULL);
--- /dev/null
+From 1f0bbf03cb829162ec8e6d03c98aaaed88c6f534 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Thu, 28 Nov 2013 15:21:21 +0100
+Subject: ALSA: hda - Initialize missing bass speaker pin for ASUS AIO ET2700
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 1f0bbf03cb829162ec8e6d03c98aaaed88c6f534 upstream.
+
+Add a fixup entry for the missing bass speaker pin 0x16 on ASUS ET2700
+AiO desktop. The channel map will be added in the next patch, so that
+this can be backported easily to stable kernels.
+
+Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=65961
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/pci/hda/patch_realtek.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -1765,6 +1765,7 @@ enum {
+ ALC889_FIXUP_IMAC91_VREF,
+ ALC882_FIXUP_INV_DMIC,
+ ALC882_FIXUP_NO_PRIMARY_HP,
++ ALC887_FIXUP_ASUS_BASS,
+ };
+
+ static void alc889_fixup_coef(struct hda_codec *codec,
+@@ -2086,6 +2087,13 @@ static const struct hda_fixup alc882_fix
+ .type = HDA_FIXUP_FUNC,
+ .v.func = alc882_fixup_no_primary_hp,
+ },
++ [ALC887_FIXUP_ASUS_BASS] = {
++ .type = HDA_FIXUP_PINS,
++ .v.pins = (const struct hda_pintbl[]) {
++ {0x16, 0x99130130}, /* bass speaker */
++ {}
++ },
++ },
+ };
+
+ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
+@@ -2119,6 +2127,7 @@ static const struct snd_pci_quirk alc882
+ SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
+ SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
+ SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
++ SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
+ SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
+ SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
+ SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
--- /dev/null
+From ba4c4d0a9021ab034554d532a98133d668b87599 Mon Sep 17 00:00:00 2001
+From: Kailang Yang <kailang@realtek.com>
+Date: Tue, 26 Nov 2013 15:17:50 +0800
+Subject: ALSA: hda/realtek - Add support of ALC231 codec
+
+From: Kailang Yang <kailang@realtek.com>
+
+commit ba4c4d0a9021ab034554d532a98133d668b87599 upstream.
+
+It's compatible with ALC269.
+
+Signed-off-by: Kailang Yang <kailang@realtek.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/pci/hda/patch_realtek.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -4552,6 +4552,7 @@ static int patch_alc680(struct hda_codec
+ */
+ 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 = 0x10ec0255, .name = "ALC255", .patch = patch_alc269 },
+ { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
--- /dev/null
+From 9ad54547cf6f4410eba83bb95dfd2a0966718d6d Mon Sep 17 00:00:00 2001
+From: Kailang Yang <kailang@realtek.com>
+Date: Tue, 26 Nov 2013 15:41:40 +0800
+Subject: ALSA: hda/realtek - Set pcbeep amp for ALC668
+
+From: Kailang Yang <kailang@realtek.com>
+
+commit 9ad54547cf6f4410eba83bb95dfd2a0966718d6d upstream.
+
+Set the missing pcbeep default amp for ALC668.
+
+Signed-off-by: Kailang Yang <kailang@realtek.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/pci/hda/patch_realtek.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -4494,6 +4494,7 @@ static int patch_alc662(struct hda_codec
+ case 0x10ec0272:
+ case 0x10ec0663:
+ case 0x10ec0665:
++ case 0x10ec0668:
+ set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
+ break;
+ case 0x10ec0273:
--- /dev/null
+From 0fc0287c9ed1ffd3706f8b4d9b314aa102ef1245 Mon Sep 17 00:00:00 2001
+From: Peter Zijlstra <peterz@infradead.org>
+Date: Tue, 26 Nov 2013 15:03:41 +0100
+Subject: cpuset: Fix memory allocator deadlock
+
+From: Peter Zijlstra <peterz@infradead.org>
+
+commit 0fc0287c9ed1ffd3706f8b4d9b314aa102ef1245 upstream.
+
+Juri hit the below lockdep report:
+
+[ 4.303391] ======================================================
+[ 4.303392] [ INFO: SOFTIRQ-safe -> SOFTIRQ-unsafe lock order detected ]
+[ 4.303394] 3.12.0-dl-peterz+ #144 Not tainted
+[ 4.303395] ------------------------------------------------------
+[ 4.303397] kworker/u4:3/689 [HC0[0]:SC0[0]:HE0:SE1] is trying to acquire:
+[ 4.303399] (&p->mems_allowed_seq){+.+...}, at: [<ffffffff8114e63c>] new_slab+0x6c/0x290
+[ 4.303417]
+[ 4.303417] and this task is already holding:
+[ 4.303418] (&(&q->__queue_lock)->rlock){..-...}, at: [<ffffffff812d2dfb>] blk_execute_rq_nowait+0x5b/0x100
+[ 4.303431] which would create a new lock dependency:
+[ 4.303432] (&(&q->__queue_lock)->rlock){..-...} -> (&p->mems_allowed_seq){+.+...}
+[ 4.303436]
+
+[ 4.303898] the dependencies between the lock to be acquired and SOFTIRQ-irq-unsafe lock:
+[ 4.303918] -> (&p->mems_allowed_seq){+.+...} ops: 2762 {
+[ 4.303922] HARDIRQ-ON-W at:
+[ 4.303923] [<ffffffff8108ab9a>] __lock_acquire+0x65a/0x1ff0
+[ 4.303926] [<ffffffff8108cbe3>] lock_acquire+0x93/0x140
+[ 4.303929] [<ffffffff81063dd6>] kthreadd+0x86/0x180
+[ 4.303931] [<ffffffff816ded6c>] ret_from_fork+0x7c/0xb0
+[ 4.303933] SOFTIRQ-ON-W at:
+[ 4.303933] [<ffffffff8108abcc>] __lock_acquire+0x68c/0x1ff0
+[ 4.303935] [<ffffffff8108cbe3>] lock_acquire+0x93/0x140
+[ 4.303940] [<ffffffff81063dd6>] kthreadd+0x86/0x180
+[ 4.303955] [<ffffffff816ded6c>] ret_from_fork+0x7c/0xb0
+[ 4.303959] INITIAL USE at:
+[ 4.303960] [<ffffffff8108a884>] __lock_acquire+0x344/0x1ff0
+[ 4.303963] [<ffffffff8108cbe3>] lock_acquire+0x93/0x140
+[ 4.303966] [<ffffffff81063dd6>] kthreadd+0x86/0x180
+[ 4.303969] [<ffffffff816ded6c>] ret_from_fork+0x7c/0xb0
+[ 4.303972] }
+
+Which reports that we take mems_allowed_seq with interrupts enabled. A
+little digging found that this can only be from
+cpuset_change_task_nodemask().
+
+This is an actual deadlock because an interrupt doing an allocation will
+hit get_mems_allowed()->...->__read_seqcount_begin(), which will spin
+forever waiting for the write side to complete.
+
+Cc: John Stultz <john.stultz@linaro.org>
+Cc: Mel Gorman <mgorman@suse.de>
+Reported-by: Juri Lelli <juri.lelli@gmail.com>
+Signed-off-by: Peter Zijlstra <peterz@infradead.org>
+Tested-by: Juri Lelli <juri.lelli@gmail.com>
+Acked-by: Li Zefan <lizefan@huawei.com>
+Acked-by: Mel Gorman <mgorman@suse.de>
+Signed-off-by: Tejun Heo <tj@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/cpuset.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+--- a/kernel/cpuset.c
++++ b/kernel/cpuset.c
+@@ -984,8 +984,10 @@ static void cpuset_change_task_nodemask(
+ need_loop = task_has_mempolicy(tsk) ||
+ !nodes_intersects(*newmems, tsk->mems_allowed);
+
+- if (need_loop)
++ if (need_loop) {
++ local_irq_disable();
+ write_seqcount_begin(&tsk->mems_allowed_seq);
++ }
+
+ nodes_or(tsk->mems_allowed, tsk->mems_allowed, *newmems);
+ mpol_rebind_task(tsk, newmems, MPOL_REBIND_STEP1);
+@@ -993,8 +995,10 @@ static void cpuset_change_task_nodemask(
+ mpol_rebind_task(tsk, newmems, MPOL_REBIND_STEP2);
+ tsk->mems_allowed = *newmems;
+
+- if (need_loop)
++ if (need_loop) {
+ write_seqcount_end(&tsk->mems_allowed_seq);
++ local_irq_enable();
++ }
+
+ task_unlock(tsk);
+ }
--- /dev/null
+From a72b8859fd3941cc1d2940d5c43026d2c6fb959e Mon Sep 17 00:00:00 2001
+From: Robert Richter <robert.richter@linaro.org>
+Date: Thu, 10 Oct 2013 18:23:38 +0200
+Subject: edac, highbank: Fix interrupt setup of mem and l2 controller
+
+From: Robert Richter <robert.richter@linaro.org>
+
+commit a72b8859fd3941cc1d2940d5c43026d2c6fb959e upstream.
+
+Register and enable interrupts after the edac registration. Otherwise
+incomming ecc error interrupts lead to crashes during device setup.
+
+Fixing this in drivers for mc and l2.
+
+Signed-off-by: Robert Richter <robert.richter@linaro.org>
+Acked-by: Rob Herring <rob.herring@calxeda.com>
+Signed-off-by: Robert Richter <rric@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/edac/highbank_l2_edac.c | 18 ++++++++++--------
+ drivers/edac/highbank_mc_edac.c | 18 ++++++++++--------
+ 2 files changed, 20 insertions(+), 16 deletions(-)
+
+--- a/drivers/edac/highbank_l2_edac.c
++++ b/drivers/edac/highbank_l2_edac.c
+@@ -90,28 +90,30 @@ static int highbank_l2_err_probe(struct
+ goto err;
+ }
+
++ dci->mod_name = dev_name(&pdev->dev);
++ dci->dev_name = dev_name(&pdev->dev);
++
++ if (edac_device_add_device(dci))
++ goto err;
++
+ drvdata->db_irq = platform_get_irq(pdev, 0);
+ res = devm_request_irq(&pdev->dev, drvdata->db_irq,
+ highbank_l2_err_handler,
+ 0, dev_name(&pdev->dev), dci);
+ if (res < 0)
+- goto err;
++ goto err2;
+
+ drvdata->sb_irq = platform_get_irq(pdev, 1);
+ res = devm_request_irq(&pdev->dev, drvdata->sb_irq,
+ highbank_l2_err_handler,
+ 0, dev_name(&pdev->dev), dci);
+ if (res < 0)
+- goto err;
+-
+- dci->mod_name = dev_name(&pdev->dev);
+- dci->dev_name = dev_name(&pdev->dev);
+-
+- if (edac_device_add_device(dci))
+- goto err;
++ goto err2;
+
+ devres_close_group(&pdev->dev, NULL);
+ return 0;
++err2:
++ edac_device_del_device(&pdev->dev);
+ err:
+ devres_release_group(&pdev->dev, NULL);
+ edac_device_free_ctl_info(dci);
+--- a/drivers/edac/highbank_mc_edac.c
++++ b/drivers/edac/highbank_mc_edac.c
+@@ -189,14 +189,6 @@ static int highbank_mc_probe(struct plat
+ goto err;
+ }
+
+- irq = platform_get_irq(pdev, 0);
+- res = devm_request_irq(&pdev->dev, irq, highbank_mc_err_handler,
+- 0, dev_name(&pdev->dev), mci);
+- if (res < 0) {
+- dev_err(&pdev->dev, "Unable to request irq %d\n", irq);
+- goto err;
+- }
+-
+ mci->mtype_cap = MEM_FLAG_DDR3;
+ mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
+ mci->edac_cap = EDAC_FLAG_SECDED;
+@@ -217,10 +209,20 @@ static int highbank_mc_probe(struct plat
+ if (res < 0)
+ goto err;
+
++ irq = platform_get_irq(pdev, 0);
++ res = devm_request_irq(&pdev->dev, irq, highbank_mc_err_handler,
++ 0, dev_name(&pdev->dev), mci);
++ if (res < 0) {
++ dev_err(&pdev->dev, "Unable to request irq %d\n", irq);
++ goto err2;
++ }
++
+ highbank_mc_create_debugfs_nodes(mci);
+
+ devres_close_group(&pdev->dev, NULL);
+ return 0;
++err2:
++ edac_mc_del_mc(&pdev->dev);
+ err:
+ devres_release_group(&pdev->dev, NULL);
+ edac_mc_free(mci);
--- /dev/null
+From 80897aa787ecd58eabb29deab7cbec9249c9b7e6 Mon Sep 17 00:00:00 2001
+From: David Herrmann <dh.herrmann@gmail.com>
+Date: Tue, 26 Nov 2013 13:58:18 +0100
+Subject: HID: uhid: fix leak for 64/32 UHID_CREATE
+
+From: David Herrmann <dh.herrmann@gmail.com>
+
+commit 80897aa787ecd58eabb29deab7cbec9249c9b7e6 upstream.
+
+UHID allows short writes so user-space can omit unused fields. We
+automatically set them to 0 in the kernel. However, the 64/32 bit
+compat-handler didn't do that in the UHID_CREATE fallback. This will
+reveal random kernel heap data (of random size, even) to user-space.
+
+Fixes: befde0226a59 ('HID: uhid: make creating devices work on 64/32 systems')
+
+Reported-by: Ben Hutchings <ben@decadent.org.uk>
+Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/hid/uhid.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/hid/uhid.c
++++ b/drivers/hid/uhid.c
+@@ -312,7 +312,7 @@ static int uhid_event_from_user(const ch
+ */
+ struct uhid_create_req_compat *compat;
+
+- compat = kmalloc(sizeof(*compat), GFP_KERNEL);
++ compat = kzalloc(sizeof(*compat), GFP_KERNEL);
+ if (!compat)
+ return -ENOMEM;
+
--- /dev/null
+From 0ee005c7dc2803125275e24598f0fb37775a6af3 Mon Sep 17 00:00:00 2001
+From: Frank Zago <frank@zago.net>
+Date: Wed, 13 Nov 2013 22:53:00 +0000
+Subject: iio:accel:kxsd9 fix missing mutex unlock
+
+From: Frank Zago <frank@zago.net>
+
+commit 0ee005c7dc2803125275e24598f0fb37775a6af3 upstream.
+
+This will leave a lock held after reading from the device, preventing
+any further reads.
+
+Signed-off-by: Frank Zago <frank@zago.net>
+Signed-off-by: Jonathan Cameron <jic23@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/iio/accel/kxsd9.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+--- a/drivers/iio/accel/kxsd9.c
++++ b/drivers/iio/accel/kxsd9.c
+@@ -112,9 +112,10 @@ static int kxsd9_read(struct iio_dev *in
+ mutex_lock(&st->buf_lock);
+ st->tx[0] = KXSD9_READ(address);
+ ret = spi_sync_transfer(st->us, xfers, ARRAY_SIZE(xfers));
+- if (ret)
+- return ret;
+- return (((u16)(st->rx[0])) << 8) | (st->rx[1] & 0xF0);
++ if (!ret)
++ ret = (((u16)(st->rx[0])) << 8) | (st->rx[1] & 0xF0);
++ mutex_unlock(&st->buf_lock);
++ return ret;
+ }
+
+ static IIO_CONST_ATTR(accel_scale_available,
--- /dev/null
+From 02e5f5c0a0f726e66e3d8506ea1691e344277969 Mon Sep 17 00:00:00 2001
+From: NeilBrown <neilb@suse.de>
+Date: Thu, 14 Nov 2013 15:16:15 +1100
+Subject: md: fix calculation of stacking limits on level change.
+
+From: NeilBrown <neilb@suse.de>
+
+commit 02e5f5c0a0f726e66e3d8506ea1691e344277969 upstream.
+
+The various ->run routines of md personalities assume that the 'queue'
+has been initialised by the blk_set_stacking_limits() call in
+md_alloc().
+
+However when the level is changed (by level_store()) the ->run routine
+for the new level is called for an array which has already had the
+stacking limits modified. This can result in incorrect final
+settings.
+
+So call blk_set_stacking_limits() before ->run in level_store().
+
+A specific consequence of this bug is that it causes
+discard_granularity to be set incorrectly when reshaping a RAID4 to a
+RAID0.
+
+This is suitable for any -stable kernel since 3.3 in which
+blk_set_stacking_limits() was introduced.
+
+Reported-and-tested-by: "Baldysiak, Pawel" <pawel.baldysiak@intel.com>
+Signed-off-by: NeilBrown <neilb@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/md/md.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/md/md.c
++++ b/drivers/md/md.c
+@@ -3619,6 +3619,7 @@ level_store(struct mddev *mddev, const c
+ mddev->in_sync = 1;
+ del_timer_sync(&mddev->safemode_timer);
+ }
++ blk_set_stacking_limits(&mddev->queue->limits);
+ pers->run(mddev);
+ set_bit(MD_CHANGE_DEVS, &mddev->flags);
+ mddev_resume(mddev);
--- /dev/null
+From ec67ad82814bee92251fd963bf01c7a173856555 Mon Sep 17 00:00:00 2001
+From: Michael Neuling <mikey@neuling.org>
+Date: Mon, 25 Nov 2013 11:12:20 +1100
+Subject: powerpc/signals: Improved mark VSX not saved with small contexts fix
+
+From: Michael Neuling <mikey@neuling.org>
+
+commit ec67ad82814bee92251fd963bf01c7a173856555 upstream.
+
+In a recent patch:
+ commit c13f20ac48328b05cd3b8c19e31ed6c132b44b42
+ Author: Michael Neuling <mikey@neuling.org>
+ powerpc/signals: Mark VSX not saved with small contexts
+
+We fixed an issue but an improved solution was later discussed after the patch
+was merged.
+
+Firstly, this patch doesn't handle the 64bit signals case, which could also hit
+this issue (but has never been reported).
+
+Secondly, the original patch isn't clear what MSR VSX should be set to. The
+new approach below always clears the MSR VSX bit (to indicate no VSX is in the
+context) and sets it only in the specific case where VSX is available (ie. when
+VSX has been used and the signal context passed has space to provide the
+state).
+
+This reverts the original patch and replaces it with the improved solution. It
+also adds a 64 bit version.
+
+Signed-off-by: Michael Neuling <mikey@neuling.org>
+Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/powerpc/kernel/signal_32.c | 16 +++++++---------
+ arch/powerpc/kernel/signal_64.c | 6 ++++++
+ 2 files changed, 13 insertions(+), 9 deletions(-)
+
+--- a/arch/powerpc/kernel/signal_32.c
++++ b/arch/powerpc/kernel/signal_32.c
+@@ -442,6 +442,12 @@ static int save_user_regs(struct pt_regs
+ #endif /* CONFIG_ALTIVEC */
+ if (copy_fpr_to_user(&frame->mc_fregs, current))
+ return 1;
++
++ /*
++ * Clear the MSR VSX bit to indicate there is no valid state attached
++ * to this context, except in the specific case below where we set it.
++ */
++ msr &= ~MSR_VSX;
+ #ifdef CONFIG_VSX
+ /*
+ * Copy VSR 0-31 upper half from thread_struct to local
+@@ -454,15 +460,7 @@ static int save_user_regs(struct pt_regs
+ if (copy_vsx_to_user(&frame->mc_vsregs, current))
+ return 1;
+ msr |= MSR_VSX;
+- } else if (!ctx_has_vsx_region)
+- /*
+- * With a small context structure we can't hold the VSX
+- * registers, hence clear the MSR value to indicate the state
+- * was not saved.
+- */
+- msr &= ~MSR_VSX;
+-
+-
++ }
+ #endif /* CONFIG_VSX */
+ #ifdef CONFIG_SPE
+ /* save spe registers */
+--- a/arch/powerpc/kernel/signal_64.c
++++ b/arch/powerpc/kernel/signal_64.c
+@@ -121,6 +121,12 @@ static long setup_sigcontext(struct sigc
+ flush_fp_to_thread(current);
+ /* copy fpr regs and fpscr */
+ err |= copy_fpr_to_user(&sc->fp_regs, current);
++
++ /*
++ * Clear the MSR VSX bit to indicate there is no valid state attached
++ * to this context, except in the specific case below where we set it.
++ */
++ msr &= ~MSR_VSX;
+ #ifdef CONFIG_VSX
+ /*
+ * Copy VSX low doubleword to local buffer for formatting,
--- /dev/null
+From 97b6ff6be9da7675aab339334fda996d6c5077d9 Mon Sep 17 00:00:00 2001
+From: Jerome Glisse <jglisse@redhat.com>
+Date: Tue, 12 Nov 2013 10:51:16 -0500
+Subject: radeon: workaround pinning failure on low ram gpu
+
+From: Jerome Glisse <jglisse@redhat.com>
+
+commit 97b6ff6be9da7675aab339334fda996d6c5077d9 upstream.
+
+GPU with low amount of ram can fails at pinning new framebuffer before
+unpinning old one. On such failure, retry with unpinning old one before
+pinning new one allowing to work around the issue. This is somewhat
+ugly but only affect those old GPU we care about.
+
+Signed-off-by: Jerome Glisse <jglisse@redhat.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/radeon/radeon_legacy_crtc.c | 28 ++++++++++++++++++++++++++++
+ 1 file changed, 28 insertions(+)
+
+--- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
++++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
+@@ -422,6 +422,7 @@ int radeon_crtc_do_set_base(struct drm_c
+ /* Pin framebuffer & get tilling informations */
+ obj = radeon_fb->obj;
+ rbo = gem_to_radeon_bo(obj);
++retry:
+ r = radeon_bo_reserve(rbo, false);
+ if (unlikely(r != 0))
+ return r;
+@@ -430,6 +431,33 @@ int radeon_crtc_do_set_base(struct drm_c
+ &base);
+ if (unlikely(r != 0)) {
+ radeon_bo_unreserve(rbo);
++
++ /* On old GPU like RN50 with little vram pining can fails because
++ * current fb is taking all space needed. So instead of unpining
++ * the old buffer after pining the new one, first unpin old one
++ * and then retry pining new one.
++ *
++ * As only master can set mode only master can pin and it is
++ * unlikely the master client will race with itself especialy
++ * on those old gpu with single crtc.
++ *
++ * We don't shutdown the display controller because new buffer
++ * will end up in same spot.
++ */
++ if (!atomic && fb && fb != crtc->fb) {
++ struct radeon_bo *old_rbo;
++ unsigned long nsize, osize;
++
++ old_rbo = gem_to_radeon_bo(to_radeon_framebuffer(fb)->obj);
++ osize = radeon_bo_size(old_rbo);
++ nsize = radeon_bo_size(rbo);
++ if (nsize <= osize && !radeon_bo_reserve(old_rbo, false)) {
++ radeon_bo_unpin(old_rbo);
++ radeon_bo_unreserve(old_rbo);
++ fb = NULL;
++ goto retry;
++ }
++ }
+ return -EINVAL;
+ }
+ radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL);
--- /dev/null
+From 71a86ef055f569b93bc6901f007bdf447dbf515f Mon Sep 17 00:00:00 2001
+From: Heiko Carstens <heiko.carstens@de.ibm.com>
+Date: Thu, 21 Nov 2013 16:22:17 +0100
+Subject: s390/uaccess: add missing page table walk range check
+
+From: Heiko Carstens <heiko.carstens@de.ibm.com>
+
+commit 71a86ef055f569b93bc6901f007bdf447dbf515f upstream.
+
+When translating a user space address, the address must be checked against
+the ASCE limit of the process. If the address is larger than the maximum
+address that is reachable with the ASCE, an ASCE type exception must be
+generated.
+
+The current code simply ignored the higher order bits. This resulted in an
+address wrap around in user space instead of an exception in user space.
+
+Reviewed-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
+Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
+Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/s390/lib/uaccess_pt.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/arch/s390/lib/uaccess_pt.c
++++ b/arch/s390/lib/uaccess_pt.c
+@@ -78,11 +78,14 @@ static size_t copy_in_kernel(size_t coun
+ * contains the (negative) exception code.
+ */
+ #ifdef CONFIG_64BIT
++
+ static unsigned long follow_table(struct mm_struct *mm,
+ unsigned long address, int write)
+ {
+ unsigned long *table = (unsigned long *)__pa(mm->pgd);
+
++ if (unlikely(address > mm->context.asce_limit - 1))
++ return -0x38UL;
+ switch (mm->context.asce_bits & _ASCE_TYPE_MASK) {
+ case _ASCE_TYPE_REGION1:
+ table = table + ((address >> 53) & 0x7ff);
drm-radeon-si-fix-define-for-mc_seq_train_wakeup_cntl.patch
drm-radeon-activate-uvd-clocks-before-sending-the-destroy-msg.patch
drm-radeon-don-t-share-pplls-on-dce4.1.patch
+radeon-workaround-pinning-failure-on-low-ram-gpu.patch
+edac-highbank-fix-interrupt-setup-of-mem-and-l2-controller.patch
+setfacl-removes-part-of-acl-when-setting-posix-acls-to-samba.patch
+md-fix-calculation-of-stacking-limits-on-level-change.patch
+hid-uhid-fix-leak-for-64-32-uhid_create.patch
+powerpc-signals-improved-mark-vsx-not-saved-with-small-contexts-fix.patch
+iio-accel-kxsd9-fix-missing-mutex-unlock.patch
+s390-uaccess-add-missing-page-table-walk-range-check.patch
+workqueue-fix-ordered-workqueues-in-numa-setups.patch
+cpuset-fix-memory-allocator-deadlock.patch
+alsa-hda-realtek-set-pcbeep-amp-for-alc668.patch
+alsa-hda-realtek-add-support-of-alc231-codec.patch
+alsa-hda-fix-hp-mic-mode-without-vref-bits.patch
+alsa-hda-create-headhpone-mic-jack-mode-when-really-needed.patch
+alsa-hda-initialize-missing-bass-speaker-pin-for-asus-aio-et2700.patch
+alsa-hda-check-leaf-nodes-to-find-aamix-amps.patch
--- /dev/null
+From b1d93356427be6f050dc55c86eb019d173700af6 Mon Sep 17 00:00:00 2001
+From: Steve French <smfrench@gmail.com>
+Date: Fri, 15 Nov 2013 20:41:32 -0600
+Subject: setfacl removes part of ACL when setting POSIX ACLs to Samba
+
+From: Steve French <smfrench@gmail.com>
+
+commit b1d93356427be6f050dc55c86eb019d173700af6 upstream.
+
+setfacl over cifs mounts can remove the default ACL when setting the
+(non-default part of) the ACL and vice versa (we were leaving at 0
+rather than setting to -1 the count field for the unaffected
+half of the ACL. For example notice the setfacl removed
+the default ACL in this sequence:
+
+steven@steven-GA-970A-DS3:~/cifs-2.6$ getfacl /mnt/test-dir ; setfacl
+-m default:user:test:rwx,user:test:rwx /mnt/test-dir
+getfacl: Removing leading '/' from absolute path names
+user::rwx
+group::r-x
+other::r-x
+default:user::rwx
+default:user:test:rwx
+default:group::r-x
+default:mask::rwx
+default:other::r-x
+
+steven@steven-GA-970A-DS3:~/cifs-2.6$ getfacl /mnt/test-dir
+getfacl: Removing leading '/' from absolute path names
+user::rwx
+user:test:rwx
+group::r-x
+mask::rwx
+other::r-x
+
+Signed-off-by: Steve French <smfrench@gmail.com>
+Acked-by: Jeremy Allison <jra@samba.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/cifs/cifssmb.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+--- a/fs/cifs/cifssmb.c
++++ b/fs/cifs/cifssmb.c
+@@ -3306,11 +3306,13 @@ static __u16 ACL_to_cifs_posix(char *par
+ return 0;
+ }
+ cifs_acl->version = cpu_to_le16(1);
+- if (acl_type == ACL_TYPE_ACCESS)
++ if (acl_type == ACL_TYPE_ACCESS) {
+ cifs_acl->access_entry_count = cpu_to_le16(count);
+- else if (acl_type == ACL_TYPE_DEFAULT)
++ cifs_acl->default_entry_count = __constant_cpu_to_le16(0xFFFF);
++ } else if (acl_type == ACL_TYPE_DEFAULT) {
+ cifs_acl->default_entry_count = cpu_to_le16(count);
+- else {
++ cifs_acl->access_entry_count = __constant_cpu_to_le16(0xFFFF);
++ } else {
+ cifs_dbg(FYI, "unknown ACL type %d\n", acl_type);
+ return 0;
+ }
--- /dev/null
+From 8a2b75384444488fc4f2cbb9f0921b6a0794838f Mon Sep 17 00:00:00 2001
+From: Tejun Heo <tj@kernel.org>
+Date: Thu, 5 Sep 2013 12:30:04 -0400
+Subject: workqueue: fix ordered workqueues in NUMA setups
+
+From: Tejun Heo <tj@kernel.org>
+
+commit 8a2b75384444488fc4f2cbb9f0921b6a0794838f upstream.
+
+An ordered workqueue implements execution ordering by using single
+pool_workqueue with max_active == 1. On a given pool_workqueue, work
+items are processed in FIFO order and limiting max_active to 1
+enforces the queued work items to be processed one by one.
+
+Unfortunately, 4c16bd327c ("workqueue: implement NUMA affinity for
+unbound workqueues") accidentally broke this guarantee by applying
+NUMA affinity to ordered workqueues too. On NUMA setups, an ordered
+workqueue would end up with separate pool_workqueues for different
+nodes. Each pool_workqueue still limits max_active to 1 but multiple
+work items may be executed concurrently and out of order depending on
+which node they are queued to.
+
+Fix it by using dedicated ordered_wq_attrs[] when creating ordered
+workqueues. The new attrs match the unbound ones except that no_numa
+is always set thus forcing all NUMA nodes to share the default
+pool_workqueue.
+
+While at it, add sanity check in workqueue creation path which
+verifies that an ordered workqueues has only the default
+pool_workqueue.
+
+Signed-off-by: Tejun Heo <tj@kernel.org>
+Reported-by: Libin <huawei.libin@huawei.com>
+Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/workqueue.c | 24 ++++++++++++++++++++++--
+ 1 file changed, 22 insertions(+), 2 deletions(-)
+
+--- a/kernel/workqueue.c
++++ b/kernel/workqueue.c
+@@ -295,6 +295,9 @@ static DEFINE_HASHTABLE(unbound_pool_has
+ /* I: attributes used when instantiating standard unbound pools on demand */
+ static struct workqueue_attrs *unbound_std_wq_attrs[NR_STD_WORKER_POOLS];
+
++/* I: attributes used when instantiating ordered pools on demand */
++static struct workqueue_attrs *ordered_wq_attrs[NR_STD_WORKER_POOLS];
++
+ struct workqueue_struct *system_wq __read_mostly;
+ EXPORT_SYMBOL(system_wq);
+ struct workqueue_struct *system_highpri_wq __read_mostly;
+@@ -4059,7 +4062,7 @@ out_unlock:
+ static int alloc_and_link_pwqs(struct workqueue_struct *wq)
+ {
+ bool highpri = wq->flags & WQ_HIGHPRI;
+- int cpu;
++ int cpu, ret;
+
+ if (!(wq->flags & WQ_UNBOUND)) {
+ wq->cpu_pwqs = alloc_percpu(struct pool_workqueue);
+@@ -4079,6 +4082,13 @@ static int alloc_and_link_pwqs(struct wo
+ mutex_unlock(&wq->mutex);
+ }
+ return 0;
++ } else if (wq->flags & __WQ_ORDERED) {
++ ret = apply_workqueue_attrs(wq, ordered_wq_attrs[highpri]);
++ /* there should only be single pwq for ordering guarantee */
++ WARN(!ret && (wq->pwqs.next != &wq->dfl_pwq->pwqs_node ||
++ wq->pwqs.prev != &wq->dfl_pwq->pwqs_node),
++ "ordering guarantee broken for workqueue %s\n", wq->name);
++ return ret;
+ } else {
+ return apply_workqueue_attrs(wq, unbound_std_wq_attrs[highpri]);
+ }
+@@ -4990,13 +5000,23 @@ static int __init init_workqueues(void)
+ }
+ }
+
+- /* create default unbound wq attrs */
++ /* create default unbound and ordered wq attrs */
+ for (i = 0; i < NR_STD_WORKER_POOLS; i++) {
+ struct workqueue_attrs *attrs;
+
+ BUG_ON(!(attrs = alloc_workqueue_attrs(GFP_KERNEL)));
+ attrs->nice = std_nice[i];
+ unbound_std_wq_attrs[i] = attrs;
++
++ /*
++ * An ordered wq should have only one pwq as ordering is
++ * guaranteed by max_active which is enforced by pwqs.
++ * Turn off NUMA so that dfl_pwq is used for all nodes.
++ */
++ BUG_ON(!(attrs = alloc_workqueue_attrs(GFP_KERNEL)));
++ attrs->nice = std_nice[i];
++ attrs->no_numa = true;
++ ordered_wq_attrs[i] = attrs;
+ }
+
+ system_wq = alloc_workqueue("events", 0, 0);