]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
.34 patches
authorGreg Kroah-Hartman <gregkh@suse.de>
Mon, 23 Aug 2010 17:23:54 +0000 (10:23 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 23 Aug 2010 17:23:54 +0000 (10:23 -0700)
queue-2.6.34/alsa-emu10k1-delay-the-pcm-interrupts-add-pcm_irq_delay-parameter.patch [new file with mode: 0644]
queue-2.6.34/alsa-hda-add-quirk-for-dell-vostro-1220.patch [new file with mode: 0644]
queue-2.6.34/alsa-hda-fix-missing-stream-for-second-adc-on-realtek-alc260-hda-codec.patch [new file with mode: 0644]
queue-2.6.34/alsa-riptide-fix-detection-load-of-firmware-files.patch [new file with mode: 0644]
queue-2.6.34/asoc-fix-inverted-mute-controls-for-wm8580.patch [new file with mode: 0644]
queue-2.6.34/asoc-register-cache-should-be-1-byte-aligned-for-1-byte-long-register.patch [new file with mode: 0644]
queue-2.6.34/asoc-remove-dsp-mode-support-for-wm8776.patch [new file with mode: 0644]
queue-2.6.34/memstick-fix-hangs-on-unexpected-device-removal-in-mspro_blk.patch [new file with mode: 0644]
queue-2.6.34/memstick-init-sysfs-attributes.patch [new file with mode: 0644]
queue-2.6.34/regulator-default-gpio-controlled-wm8994-regulators-to-disabled.patch [new file with mode: 0644]

diff --git a/queue-2.6.34/alsa-emu10k1-delay-the-pcm-interrupts-add-pcm_irq_delay-parameter.patch b/queue-2.6.34/alsa-emu10k1-delay-the-pcm-interrupts-add-pcm_irq_delay-parameter.patch
new file mode 100644 (file)
index 0000000..da11ebc
--- /dev/null
@@ -0,0 +1,164 @@
+From 56385a12d9bb9e173751f74b6c430742018cafc0 Mon Sep 17 00:00:00 2001
+From: Jaroslav Kysela <perex@perex.cz>
+Date: Wed, 18 Aug 2010 14:08:17 +0200
+Subject: ALSA: emu10k1 - delay the PCM interrupts (add pcm_irq_delay parameter)
+
+From: Jaroslav Kysela <perex@perex.cz>
+
+commit 56385a12d9bb9e173751f74b6c430742018cafc0 upstream.
+
+With some hardware combinations, the PCM interrupts are acknowledged
+before the period boundary from the emu10k1 chip. The midlevel PCM code
+gets confused and the playback stream is interrupted.
+
+It seems that the interrupt processing shift by 2 samples is enough
+to fix this issue. This default value does not harm other,
+non-affected hardware.
+
+More information: Kernel bugzilla bug#16300
+
+[A copmile warning fixed by tiwai]
+
+Signed-off-by: Jaroslav Kysela <perex@perex.cz>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ include/sound/emu10k1.h     |    1 +
+ sound/core/pcm_native.c     |    4 ++++
+ sound/pci/emu10k1/emu10k1.c |    4 ++++
+ sound/pci/emu10k1/emupcm.c  |   30 ++++++++++++++++++++++++++----
+ sound/pci/emu10k1/memory.c  |    4 +++-
+ 5 files changed, 38 insertions(+), 5 deletions(-)
+
+--- a/include/sound/emu10k1.h
++++ b/include/sound/emu10k1.h
+@@ -1707,6 +1707,7 @@ struct snd_emu10k1 {
+       unsigned int card_type;                 /* EMU10K1_CARD_* */
+       unsigned int ecard_ctrl;                /* ecard control bits */
+       unsigned long dma_mask;                 /* PCI DMA mask */
++      unsigned int delay_pcm_irq;             /* in samples */
+       int max_cache_pages;                    /* max memory size / PAGE_SIZE */
+       struct snd_dma_buffer silent_page;      /* silent page */
+       struct snd_dma_buffer ptb_pages;        /* page table pages */
+--- a/sound/core/pcm_native.c
++++ b/sound/core/pcm_native.c
+@@ -979,6 +979,10 @@ static int snd_pcm_do_pause(struct snd_p
+ {
+       if (substream->runtime->trigger_master != substream)
+               return 0;
++      /* some drivers might use hw_ptr to recover from the pause -
++         update the hw_ptr now */
++      if (push)
++              snd_pcm_update_hw_ptr(substream);
+       /* The jiffies check in snd_pcm_update_hw_ptr*() is done by
+        * a delta betwen the current jiffies, this gives a large enough
+        * delta, effectively to skip the check once.
+--- a/sound/pci/emu10k1/emu10k1.c
++++ b/sound/pci/emu10k1/emu10k1.c
+@@ -52,6 +52,7 @@ static int max_synth_voices[SNDRV_CARDS]
+ static int max_buffer_size[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 128};
+ static int enable_ir[SNDRV_CARDS];
+ static uint subsystem[SNDRV_CARDS]; /* Force card subsystem model */
++static uint delay_pcm_irq[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2};
+ module_param_array(index, int, NULL, 0444);
+ MODULE_PARM_DESC(index, "Index value for the EMU10K1 soundcard.");
+@@ -73,6 +74,8 @@ module_param_array(enable_ir, bool, NULL
+ MODULE_PARM_DESC(enable_ir, "Enable IR.");
+ module_param_array(subsystem, uint, NULL, 0444);
+ MODULE_PARM_DESC(subsystem, "Force card subsystem model.");
++module_param_array(delay_pcm_irq, uint, NULL, 0444);
++MODULE_PARM_DESC(delay_pcm_irq, "Delay PCM interrupt by specified number of samples (default 0).");
+ /*
+  * Class 0401: 1102:0008 (rev 00) Subsystem: 1102:1001 -> Audigy2 Value  Model:SB0400
+  */
+@@ -127,6 +130,7 @@ static int __devinit snd_card_emu10k1_pr
+                                     &emu)) < 0)
+               goto error;
+       card->private_data = emu;
++      emu->delay_pcm_irq = delay_pcm_irq[dev] & 0x1f;
+       if ((err = snd_emu10k1_pcm(emu, 0, NULL)) < 0)
+               goto error;
+       if ((err = snd_emu10k1_pcm_mic(emu, 1, NULL)) < 0)
+--- a/sound/pci/emu10k1/emupcm.c
++++ b/sound/pci/emu10k1/emupcm.c
+@@ -332,7 +332,7 @@ static void snd_emu10k1_pcm_init_voice(s
+               evoice->epcm->ccca_start_addr = start_addr + ccis;
+               if (extra) {
+                       start_addr += ccis;
+-                      end_addr += ccis;
++                      end_addr += ccis + emu->delay_pcm_irq;
+               }
+               if (stereo && !extra) {
+                       snd_emu10k1_ptr_write(emu, CPF, voice, CPF_STEREO_MASK);
+@@ -360,7 +360,9 @@ static void snd_emu10k1_pcm_init_voice(s
+       /* Assumption that PT is already 0 so no harm overwriting */
+       snd_emu10k1_ptr_write(emu, PTRX, voice, (send_amount[0] << 8) | send_amount[1]);
+       snd_emu10k1_ptr_write(emu, DSL, voice, end_addr | (send_amount[3] << 24));
+-      snd_emu10k1_ptr_write(emu, PSST, voice, start_addr | (send_amount[2] << 24));
++      snd_emu10k1_ptr_write(emu, PSST, voice,
++                      (start_addr + (extra ? emu->delay_pcm_irq : 0)) |
++                      (send_amount[2] << 24));
+       if (emu->card_capabilities->emu_model)
+               pitch_target = PITCH_48000; /* Disable interpolators on emu1010 card */
+       else 
+@@ -732,6 +734,23 @@ static void snd_emu10k1_playback_stop_vo
+       snd_emu10k1_ptr_write(emu, IP, voice, 0);
+ }
++static inline void snd_emu10k1_playback_mangle_extra(struct snd_emu10k1 *emu,
++              struct snd_emu10k1_pcm *epcm,
++              struct snd_pcm_substream *substream,
++              struct snd_pcm_runtime *runtime)
++{
++      unsigned int ptr, period_pos;
++
++      /* try to sychronize the current position for the interrupt
++         source voice */
++      period_pos = runtime->status->hw_ptr - runtime->hw_ptr_interrupt;
++      period_pos %= runtime->period_size;
++      ptr = snd_emu10k1_ptr_read(emu, CCCA, epcm->extra->number);
++      ptr &= ~0x00ffffff;
++      ptr |= epcm->ccca_start_addr + period_pos;
++      snd_emu10k1_ptr_write(emu, CCCA, epcm->extra->number, ptr);
++}
++
+ static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream,
+                                       int cmd)
+ {
+@@ -753,6 +772,8 @@ static int snd_emu10k1_playback_trigger(
+               /* follow thru */
+       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+       case SNDRV_PCM_TRIGGER_RESUME:
++              if (cmd == SNDRV_PCM_TRIGGER_PAUSE_RELEASE)
++                      snd_emu10k1_playback_mangle_extra(emu, epcm, substream, runtime);
+               mix = &emu->pcm_mixer[substream->number];
+               snd_emu10k1_playback_prepare_voice(emu, epcm->voices[0], 1, 0, mix);
+               snd_emu10k1_playback_prepare_voice(emu, epcm->voices[1], 0, 0, mix);
+@@ -869,8 +890,9 @@ static snd_pcm_uframes_t snd_emu10k1_pla
+ #endif
+       /*
+       printk(KERN_DEBUG
+-             "ptr = 0x%x, buffer_size = 0x%x, period_size = 0x%x\n",
+-             ptr, runtime->buffer_size, runtime->period_size);
++             "ptr = 0x%lx, buffer_size = 0x%lx, period_size = 0x%lx\n",
++             (long)ptr, (long)runtime->buffer_size,
++             (long)runtime->period_size);
+       */
+       return ptr;
+ }
+--- a/sound/pci/emu10k1/memory.c
++++ b/sound/pci/emu10k1/memory.c
+@@ -310,8 +310,10 @@ snd_emu10k1_alloc_pages(struct snd_emu10
+       if (snd_BUG_ON(!hdr))
+               return NULL;
++      idx = runtime->period_size >= runtime->buffer_size ?
++                                      (emu->delay_pcm_irq * 2) : 0;
+       mutex_lock(&hdr->block_mutex);
+-      blk = search_empty(emu, runtime->dma_bytes);
++      blk = search_empty(emu, runtime->dma_bytes + idx);
+       if (blk == NULL) {
+               mutex_unlock(&hdr->block_mutex);
+               return NULL;
diff --git a/queue-2.6.34/alsa-hda-add-quirk-for-dell-vostro-1220.patch b/queue-2.6.34/alsa-hda-add-quirk-for-dell-vostro-1220.patch
new file mode 100644 (file)
index 0000000..961469c
--- /dev/null
@@ -0,0 +1,31 @@
+From c3e68fad88143fd1fe8fe640207fb19c0f087dbc Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Mon, 16 Aug 2010 10:15:57 +0200
+Subject: ALSA: hda - Add quirk for Dell Vostro 1220
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit c3e68fad88143fd1fe8fe640207fb19c0f087dbc upstream.
+
+model=dell-vostro is needed for Dell Vostro 1220 with Coexnat 5067.
+
+Reference: Novell bnc#631066
+       https://bugzilla.novell.com/show_bug.cgi?id=631066
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/pci/hda/patch_conexant.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/sound/pci/hda/patch_conexant.c
++++ b/sound/pci/hda/patch_conexant.c
+@@ -2843,6 +2843,7 @@ static struct snd_pci_quirk cxt5066_cfg_
+       SND_PCI_QUIRK(0x1028, 0x02f5, "Dell",
+                     CXT5066_DELL_LAPTOP),
+       SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5),
++      SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTO),
+       SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO),
+       SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD),
+       SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5),
diff --git a/queue-2.6.34/alsa-hda-fix-missing-stream-for-second-adc-on-realtek-alc260-hda-codec.patch b/queue-2.6.34/alsa-hda-fix-missing-stream-for-second-adc-on-realtek-alc260-hda-codec.patch
new file mode 100644 (file)
index 0000000..fed9b27
--- /dev/null
@@ -0,0 +1,34 @@
+From 53bacfbbb2ddd981287b58a511c8b8f5df179886 Mon Sep 17 00:00:00 2001
+From: Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
+Date: Sun, 8 Aug 2010 00:17:05 +0930
+Subject: ALSA: hda - Fix missing stream for second ADC on Realtek ALC260 HDA codec
+
+From: Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
+
+commit 53bacfbbb2ddd981287b58a511c8b8f5df179886 upstream.
+
+I discovered tonight that ALSA no longer sets up a stream for the second ADC
+provided by the Realtek ALC260 HDA codec.  At some point alc_build_pcms()
+started using stream_analog_alt_capture when constructing the second ADC
+stream, but patch_alc260() was never updated accordingly.  I have no idea
+when this regression occurred.  The trivial patch to patch_alc260() given
+below fixes the problem as far as I can tell.  The patch is against 2.6.35.
+
+Signed-off-by: Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ 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
+@@ -6757,6 +6757,7 @@ static int patch_alc260(struct hda_codec
+       spec->stream_analog_playback = &alc260_pcm_analog_playback;
+       spec->stream_analog_capture = &alc260_pcm_analog_capture;
++      spec->stream_analog_alt_capture = &alc260_pcm_analog_capture;
+       spec->stream_digital_playback = &alc260_pcm_digital_playback;
+       spec->stream_digital_capture = &alc260_pcm_digital_capture;
diff --git a/queue-2.6.34/alsa-riptide-fix-detection-load-of-firmware-files.patch b/queue-2.6.34/alsa-riptide-fix-detection-load-of-firmware-files.patch
new file mode 100644 (file)
index 0000000..cfa8717
--- /dev/null
@@ -0,0 +1,46 @@
+From a5ba6beb839cfa288960c92cd2668a2601c24dda Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Mon, 16 Aug 2010 08:08:48 +0200
+Subject: ALSA: riptide - Fix detection / load of firmware files
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit a5ba6beb839cfa288960c92cd2668a2601c24dda upstream.
+
+The detection and loading of firmeware on riptide driver has been broken
+due to rewrite of some codes, checking the presense wrongly.
+This patch fixes the logic again.
+
+Reference: kernel bug 16596
+       https://bugzilla.kernel.org/show_bug.cgi?id=16596
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/pci/riptide/riptide.c |   11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+--- a/sound/pci/riptide/riptide.c
++++ b/sound/pci/riptide/riptide.c
+@@ -1224,15 +1224,14 @@ static int try_to_load_firmware(struct c
+                   firmware.firmware.ASIC, firmware.firmware.CODEC,
+                   firmware.firmware.AUXDSP, firmware.firmware.PROG);
++      if (!chip)
++              return 1;
++
+       for (i = 0; i < FIRMWARE_VERSIONS; i++) {
+               if (!memcmp(&firmware_versions[i], &firmware, sizeof(firmware)))
+-                      break;
+-      }
+-      if (i >= FIRMWARE_VERSIONS)
+-              return 0; /* no match */
++                      return 1; /* OK */
+-      if (!chip)
+-              return 1; /* OK */
++      }
+       snd_printdd("Writing Firmware\n");
+       if (!chip->fw_entry) {
diff --git a/queue-2.6.34/asoc-fix-inverted-mute-controls-for-wm8580.patch b/queue-2.6.34/asoc-fix-inverted-mute-controls-for-wm8580.patch
new file mode 100644 (file)
index 0000000..b2ddafe
--- /dev/null
@@ -0,0 +1,32 @@
+From 4f0ed9a51bc8ef16c2589112fdb110479e4b0df1 Mon Sep 17 00:00:00 2001
+From: Mark Brown <broonie@opensource.wolfsonmicro.com>
+Date: Fri, 6 Aug 2010 17:57:12 +0100
+Subject: ASoC: Fix inverted mute controls for WM8580
+
+From: Mark Brown <broonie@opensource.wolfsonmicro.com>
+
+commit 4f0ed9a51bc8ef16c2589112fdb110479e4b0df1 upstream.
+
+Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
+Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/soc/codecs/wm8580.c |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/sound/soc/codecs/wm8580.c
++++ b/sound/soc/codecs/wm8580.c
+@@ -269,9 +269,9 @@ SOC_DOUBLE("DAC2 Invert Switch", WM8580_
+ SOC_DOUBLE("DAC3 Invert Switch", WM8580_DAC_CONTROL4,  4, 5, 1, 0),
+ SOC_SINGLE("DAC ZC Switch", WM8580_DAC_CONTROL5, 5, 1, 0),
+-SOC_SINGLE("DAC1 Switch", WM8580_DAC_CONTROL5, 0, 1, 0),
+-SOC_SINGLE("DAC2 Switch", WM8580_DAC_CONTROL5, 1, 1, 0),
+-SOC_SINGLE("DAC3 Switch", WM8580_DAC_CONTROL5, 2, 1, 0),
++SOC_SINGLE("DAC1 Switch", WM8580_DAC_CONTROL5, 0, 1, 1),
++SOC_SINGLE("DAC2 Switch", WM8580_DAC_CONTROL5, 1, 1, 1),
++SOC_SINGLE("DAC3 Switch", WM8580_DAC_CONTROL5, 2, 1, 1),
+ SOC_DOUBLE("ADC Mute Switch", WM8580_ADC_CONTROL1, 0, 1, 1, 0),
+ SOC_SINGLE("ADC High-Pass Filter Switch", WM8580_ADC_CONTROL1, 4, 1, 0),
diff --git a/queue-2.6.34/asoc-register-cache-should-be-1-byte-aligned-for-1-byte-long-register.patch b/queue-2.6.34/asoc-register-cache-should-be-1-byte-aligned-for-1-byte-long-register.patch
new file mode 100644 (file)
index 0000000..4f8d1f4
--- /dev/null
@@ -0,0 +1,39 @@
+From ac770267a7cd85a747b6111db46f66d1515e7cd7 Mon Sep 17 00:00:00 2001
+From: Cliff Cai <cliff.cai@analog.com>
+Date: Sat, 7 Aug 2010 11:16:27 -0400
+Subject: ASoC: register cache should be 1 byte aligned for 1 byte long register
+
+From: Cliff Cai <cliff.cai@analog.com>
+
+commit ac770267a7cd85a747b6111db46f66d1515e7cd7 upstream.
+
+Signed-off-by: Cliff Cai <cliff.cai@analog.com>
+Signed-off-by: Mike Frysinger <vapier@gentoo.org>
+Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
+Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/soc/soc-cache.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/sound/soc/soc-cache.c
++++ b/sound/soc/soc-cache.c
+@@ -296,7 +296,7 @@ static unsigned int snd_soc_16_8_read_i2
+ static unsigned int snd_soc_16_8_read(struct snd_soc_codec *codec,
+                                    unsigned int reg)
+ {
+-      u16 *cache = codec->reg_cache;
++      u8 *cache = codec->reg_cache;
+       reg &= 0xff;
+       if (reg >= codec->reg_cache_size)
+@@ -307,7 +307,7 @@ static unsigned int snd_soc_16_8_read(st
+ static int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg,
+                            unsigned int value)
+ {
+-      u16 *cache = codec->reg_cache;
++      u8 *cache = codec->reg_cache;
+       u8 data[3];
+       int ret;
diff --git a/queue-2.6.34/asoc-remove-dsp-mode-support-for-wm8776.patch b/queue-2.6.34/asoc-remove-dsp-mode-support-for-wm8776.patch
new file mode 100644 (file)
index 0000000..d64274f
--- /dev/null
@@ -0,0 +1,35 @@
+From b2c1e07b81a126e5846dfc3d36f559d861df59f4 Mon Sep 17 00:00:00 2001
+From: Mark Brown <broonie@opensource.wolfsonmicro.com>
+Date: Mon, 16 Aug 2010 11:46:57 +0100
+Subject: ASoC: Remove DSP mode support for WM8776
+
+From: Mark Brown <broonie@opensource.wolfsonmicro.com>
+
+commit b2c1e07b81a126e5846dfc3d36f559d861df59f4 upstream.
+
+This is not supported by current hardware revisions.
+
+Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
+Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/soc/codecs/wm8776.c |    7 -------
+ 1 file changed, 7 deletions(-)
+
+--- a/sound/soc/codecs/wm8776.c
++++ b/sound/soc/codecs/wm8776.c
+@@ -178,13 +178,6 @@ static int wm8776_set_fmt(struct snd_soc
+       case SND_SOC_DAIFMT_LEFT_J:
+               iface |= 0x0001;
+               break;
+-              /* FIXME: CHECK A/B */
+-      case SND_SOC_DAIFMT_DSP_A:
+-              iface |= 0x0003;
+-              break;
+-      case SND_SOC_DAIFMT_DSP_B:
+-              iface |= 0x0007;
+-              break;
+       default:
+               return -EINVAL;
+       }
diff --git a/queue-2.6.34/memstick-fix-hangs-on-unexpected-device-removal-in-mspro_blk.patch b/queue-2.6.34/memstick-fix-hangs-on-unexpected-device-removal-in-mspro_blk.patch
new file mode 100644 (file)
index 0000000..8ac2536
--- /dev/null
@@ -0,0 +1,42 @@
+From d862b13bc8cbab9692fbe0ef44c40d0488b81af1 Mon Sep 17 00:00:00 2001
+From: Maxim Levitsky <maximlevitsky@gmail.com>
+Date: Wed, 11 Aug 2010 14:17:52 -0700
+Subject: memstick: fix hangs on unexpected device removal in mspro_blk
+
+From: Maxim Levitsky <maximlevitsky@gmail.com>
+
+commit d862b13bc8cbab9692fbe0ef44c40d0488b81af1 upstream.
+
+mspro_block_remove() is called from detect thread that first calls the
+mspro_block_stop(), which stops the request queue.  If we call
+del_gendisk() with the queue stopped we get a deadlock.
+
+Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com>
+Cc: Alex Dubov <oakad@yahoo.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/memstick/core/mspro_block.c |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+--- a/drivers/memstick/core/mspro_block.c
++++ b/drivers/memstick/core/mspro_block.c
+@@ -1331,13 +1331,14 @@ static void mspro_block_remove(struct me
+       struct mspro_block_data *msb = memstick_get_drvdata(card);
+       unsigned long flags;
+-      del_gendisk(msb->disk);
+-      dev_dbg(&card->dev, "mspro block remove\n");
+       spin_lock_irqsave(&msb->q_lock, flags);
+       msb->eject = 1;
+       blk_start_queue(msb->queue);
+       spin_unlock_irqrestore(&msb->q_lock, flags);
++      del_gendisk(msb->disk);
++      dev_dbg(&card->dev, "mspro block remove\n");
++
+       blk_cleanup_queue(msb->queue);
+       msb->queue = NULL;
diff --git a/queue-2.6.34/memstick-init-sysfs-attributes.patch b/queue-2.6.34/memstick-init-sysfs-attributes.patch
new file mode 100644 (file)
index 0000000..636368d
--- /dev/null
@@ -0,0 +1,31 @@
+From 21fd0495ea61d53e0ebe575330e343ce4e6d2a61 Mon Sep 17 00:00:00 2001
+From: Maxim Levitsky <maximlevitsky@gmail.com>
+Date: Wed, 11 Aug 2010 14:17:52 -0700
+Subject: memstick: init sysfs attributes
+
+From: Maxim Levitsky <maximlevitsky@gmail.com>
+
+commit 21fd0495ea61d53e0ebe575330e343ce4e6d2a61 upstream.
+
+Otherwise lockdep complains.
+
+Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com>
+Cc: Alex Dubov <oakad@yahoo.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/memstick/core/mspro_block.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/memstick/core/mspro_block.c
++++ b/drivers/memstick/core/mspro_block.c
+@@ -1040,6 +1040,7 @@ static int mspro_block_read_attributes(s
+                       snprintf(s_attr->name, sizeof(s_attr->name),
+                                "attr_x%02x", attr->entries[cnt].id);
++              sysfs_attr_init(&s_attr->dev_attr.attr);
+               s_attr->dev_attr.attr.name = s_attr->name;
+               s_attr->dev_attr.attr.mode = S_IRUGO;
+               s_attr->dev_attr.show = mspro_block_attr_show(s_attr->id);
diff --git a/queue-2.6.34/regulator-default-gpio-controlled-wm8994-regulators-to-disabled.patch b/queue-2.6.34/regulator-default-gpio-controlled-wm8994-regulators-to-disabled.patch
new file mode 100644 (file)
index 0000000..4c87756
--- /dev/null
@@ -0,0 +1,46 @@
+From c4604e49c1a5832a58789a22eba7ca982933e1be Mon Sep 17 00:00:00 2001
+From: Joonyoung Shim <jy0922.shim@samsung.com>
+Date: Fri, 6 Aug 2010 15:48:24 +0100
+Subject: regulator: Default GPIO controlled WM8994 regulators to disabled
+
+From: Joonyoung Shim <jy0922.shim@samsung.com>
+
+commit c4604e49c1a5832a58789a22eba7ca982933e1be upstream.
+
+This ensures that if the GPIO was not enabled prior to the driver
+starting the regulator API will insert the required powerup ramp
+delay when it enables the regulator.  The gpiolib API does not
+provide this information.
+
+[Rewrote changelog to describe the actual change -- broonie.]
+
+Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
+Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
+Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/regulator/wm8994-regulator.c |    5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+--- a/drivers/regulator/wm8994-regulator.c
++++ b/drivers/regulator/wm8994-regulator.c
+@@ -219,8 +219,6 @@ static __devinit int wm8994_ldo_probe(st
+       ldo->wm8994 = wm8994;
+-      ldo->is_enabled = true;
+-
+       if (pdata->ldo[id].enable && gpio_is_valid(pdata->ldo[id].enable)) {
+               ldo->enable = pdata->ldo[id].enable;
+@@ -237,7 +235,8 @@ static __devinit int wm8994_ldo_probe(st
+                               ret);
+                       goto err_gpio;
+               }
+-      }
++      } else
++              ldo->is_enabled = true;
+       ldo->regulator = regulator_register(&wm8994_ldo_desc[id], &pdev->dev,
+                                            pdata->ldo[id].init_data, ldo);