diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index c9aaea0..cce2944 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -513,9 +513,11 @@ static int soc_pcm_hw_params(snd_pcm_sub
 			codec->dpm_event(codec, SNDRV_CTL_POWER_D1);
 		snd_soc_dpm_codec_event(codec, SNDRV_CTL_POWER_D0);
 		if(substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-			snd_soc_dpm_stream_event(codec, &rtd->pcm_c->playback, SND_SOC_DPM_STREAM_START);
+			snd_soc_dpm_stream_event(codec, rtd->pcm_c->playback.sname, 
+				SND_SOC_DPM_STREAM_START);
 		else
-			snd_soc_dpm_stream_event(codec, &rtd->pcm_c->capture, SND_SOC_DPM_STREAM_START);
+			snd_soc_dpm_stream_event(codec, rtd->pcm_c->capture.sname, 
+				SND_SOC_DPM_STREAM_START);
 		
 		if(codec->dpm_event)
 			codec->dpm_event(codec, SNDRV_CTL_POWER_D0);
@@ -523,10 +525,11 @@ static int soc_pcm_hw_params(snd_pcm_sub
 		codec->dpm_state = SNDRV_CTL_POWER_D0;
 	} else {
 		if(substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-			snd_soc_dpm_stream_event(codec, &rtd->pcm_c->playback, SND_SOC_DPM_STREAM_START);
+			snd_soc_dpm_stream_event(codec, rtd->pcm_c->playback.sname, 
+				SND_SOC_DPM_STREAM_START);
 		else
-			snd_soc_dpm_stream_event(codec, &rtd->pcm_c->capture, SND_SOC_DPM_STREAM_START);
-		
+			snd_soc_dpm_stream_event(codec, rtd->pcm_c->capture.sname, 
+				SND_SOC_DPM_STREAM_START);
 	}
 out:
 	up(&soc_pcm_sem);
@@ -574,18 +577,22 @@ static int soc_pcm_hw_free(snd_pcm_subst
 		snd_soc_dpm_codec_event(codec, SNDRV_CTL_POWER_D3hot);
 		
 		if(substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-			snd_soc_dpm_stream_event(codec, &rtd->pcm_c->playback, SND_SOC_DPM_STREAM_STOP);
+			snd_soc_dpm_stream_event(codec, rtd->pcm_c->playback.sname, 
+				SND_SOC_DPM_STREAM_STOP);
 		else
-			snd_soc_dpm_stream_event(codec, &rtd->pcm_c->capture, SND_SOC_DPM_STREAM_STOP);
+			snd_soc_dpm_stream_event(codec, rtd->pcm_c->capture.sname, 
+				SND_SOC_DPM_STREAM_STOP);
 	
 		if(codec->dpm_event)
 			codec->dpm_event(codec, SNDRV_CTL_POWER_D3hot);
 		codec->dpm_state = SNDRV_CTL_POWER_D3hot;
 	} else {
 		if(substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-			snd_soc_dpm_stream_event(codec, &rtd->pcm_c->playback, SND_SOC_DPM_STREAM_STOP);
+			snd_soc_dpm_stream_event(codec, rtd->pcm_c->playback.sname, 
+				SND_SOC_DPM_STREAM_STOP);
 		else
-			snd_soc_dpm_stream_event(codec, &rtd->pcm_c->capture, SND_SOC_DPM_STREAM_STOP);
+			snd_soc_dpm_stream_event(codec, rtd->pcm_c->capture.sname, 
+				SND_SOC_DPM_STREAM_STOP);
 	}
 	
 out:
@@ -665,8 +672,6 @@ static int soc_suspend(struct platform_d
 		if(stream != NULL)
 			snd_soc_dpm_stream_event(codec, stream, SND_SOC_DPM_STREAM_SUSPEND);
 	}
-	codec->suspend_streams = codec->active_streams;
-	codec->active_streams = 0;
 	
 	if (codec_dev->suspend)
 		codec_dev->suspend(pdev, state);
@@ -699,10 +704,10 @@ static int soc_resume(struct platform_de
 			snd_soc_dpm_stream_event(codec, stream, SND_SOC_DPM_STREAM_RESUME);
 		stream = codec->pcms[i].capture.sname;
 		if(stream != NULL)
-			snd_soc_dpm_stream_event(codec, stream, SND_SOC_DPM_STREAM_RESUME);
+			snd_soc_dpm_stream_event(codec, stream, SND_SOC_DPM_STREAM_RESUME);	
 	}
 	
-	if(codec->suspend_streams) {
+	if(codec->active) {
 		snd_soc_dpm_codec_event(codec, SNDRV_CTL_POWER_D0);
 		snd_soc_dpm_codec_mute(codec, 0);
 	}
diff --git a/sound/soc/soc-dpm.c b/sound/soc/soc-dpm.c
index 7bf9307..8f016da 100644
--- a/sound/soc/soc-dpm.c
+++ b/sound/soc/soc-dpm.c
@@ -49,7 +49,8 @@
 #include <sound/initval.h>
 
 /* debug */
-#if 0
+#define DAPM_DEBUG 0
+#if DAPM_DEBUG
 #define dump_dapm(codec, action) dbg_dump_dapm(codec, action)
 #define dbg(format, arg...) printk(format, ## arg)
 #else
@@ -597,6 +598,7 @@ static int dpm_power_widgets(struct snd_
 	return 0;
 }
 
+#if DAPM_DEBUG
 static void dbg_dump_dapm(struct snd_soc_codec* codec, const char *action)
 {
 	struct snd_soc_dpm_widget *w = NULL;
@@ -619,6 +621,7 @@ static void dbg_dump_dapm(struct snd_soc
 		}
 	}
 }
+#endif
 
 
 static int dpm_mux_update_power(struct snd_soc_dpm_widget *widget, 
@@ -903,11 +906,10 @@ int snd_soc_dpm_new_control(struct snd_s
 
 /* stream event notification */
 int snd_soc_dpm_stream_event(struct snd_soc_codec *codec, 
-	struct snd_soc_pcm_stream *pcm_stream, int event)
+	char *stream, int event)
 {
 	struct snd_soc_dpm_widget *w;
 	struct list_head *l = NULL;
-	char *stream = pcm_stream->sname;
 	
 	list_for_each(l, &codec->dpm_widgets)
 	{
@@ -919,19 +921,21 @@ int snd_soc_dpm_stream_event(struct snd_
 		if (strstr(w->sname, stream)) {
 			switch(event) {
 			case SND_SOC_DPM_STREAM_START:
-				pcm_stream->active = w->active = 1;
+				codec->active ++;
+				w->active = 1;
 				break;
 			case SND_SOC_DPM_STREAM_STOP:
-				pcm_stream->active = w->active = 0;
+				codec->active --;
+				w->active = 0;
 				break;
 			case SND_SOC_DPM_STREAM_SUSPEND:
 				if (w->active)
-					pcm_stream->active = w->suspend = 1;	
+					w->suspend = 1;	
 				w->active = 0;
 				break;
 			case SND_SOC_DPM_STREAM_RESUME:
 				if(w->suspend) {
-					pcm_stream->active = w->active = 1;
+					w->active = 1;
 					w->suspend = 0;
 				}
 				break;
@@ -971,29 +975,18 @@ int snd_soc_dpm_codec_event(struct snd_s
 {
 	struct snd_soc_dpm_widget *w;
 	struct list_head *l = NULL;	
-	int pm = 0, active = 0;
+	int pm = 0;
 
-	if(event == SNDRV_CTL_POWER_D0) {
-		if(codec->active_streams)
-			return 0;
+	if(event == SNDRV_CTL_POWER_D0)
 		pm = 1;
-		active = 1;
-	
-	} else if(event == SNDRV_CTL_POWER_D3hot){
-		if(!codec->active_streams)
-			return 0;
+	else if(event == SNDRV_CTL_POWER_D3hot)
 		pm = 0;
-		active = -1;
-	}
 		
 	list_for_each(l, &codec->dpm_widgets)
 	{
-		int tpm = pm;
 		w = list_entry(l, struct snd_soc_dpm_widget, list);
-		if(w->id == snd_soc_dpm_vref || w->id == snd_soc_dpm_clock) {
-			codec->active_streams += active;
-			dpm_update_bits(w, tpm);
-		}
+		if(w->id == snd_soc_dpm_vref || w->id == snd_soc_dpm_clock)
+			dpm_update_bits(w, pm);
 	}
 	
 	dump_dapm(codec, __FUNCTION__);
diff --git a/include/sound/soc.h b/include/sound/soc.h
index 7d89cf4..ff47225 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -21,7 +21,7 @@
 #include <sound/control.h>
 #include <sound/ac97_codec.h>
 
-#define SND_SOC_VERSION "0.10rc2"
+#define SND_SOC_VERSION "0.10rc3"
 
 /*
  * Convenience kcontrol builders
@@ -311,10 +311,9 @@ struct snd_soc_codec {
 	
 	/* runtime */
 	snd_card_t *card;
-	ac97_t *ac97;
+	ac97_t *ac97; // liam - future remove 
 	void *private_data;
-	int active_streams;
-	int suspend_streams;
+	unsigned int active;
 	int pcm_devs;
 	int dpm_state;
 	int suspend_dpm_state;
diff --git a/include/sound/soc-dpm.h b/include/sound/soc-dpm.h
index 3b0696e..bbde6de 100644
--- a/include/sound/soc-dpm.h
+++ b/include/sound/soc-dpm.h
@@ -124,8 +124,7 @@ int snd_soc_dpm_new_control(struct snd_s
 int snd_soc_dpm_connect_input(struct snd_soc_codec *codec, const char *target_name, 
 	const char *control_name, const char *src_name);
 int snd_soc_dpm_sync(struct snd_soc_codec *codec);
-int snd_soc_dpm_stream_event(struct snd_soc_codec *codec, 
-	struct snd_soc_pcm_stream *pcm_stream, int event);
+int snd_soc_dpm_stream_event(struct snd_soc_codec *codec, char *stream, int event);
 int snd_soc_dpm_codec_event(struct snd_soc_codec *codec, int event);
 void snd_soc_dpm_sys_remove(struct device *dev);
 int snd_soc_dpm_sys_add(struct device *dev);

