Index: git/sound/soc/pxa/pxa2xx-pcm.c
===================================================================
--- git.orig/sound/soc/pxa/pxa2xx-pcm.c	2006-05-04 23:15:28.000000000 +0100
+++ git/sound/soc/pxa/pxa2xx-pcm.c	2006-05-04 23:15:35.000000000 +0100
@@ -380,7 +380,15 @@
 	DCMD(prtd->dma_ch) = 0;
 	*prtd->params->drcmr = prtd->dma_ch | DRCMR_MAPVLD;
 	DDADR(prtd->dma_ch) = prtd->dma_desc_array_phys;
+
+ 	/* FIXME: suspend/resume triggers should be used? */
+ 	if (runtime->status->state != SNDRV_PCM_STATE_RUNNING &&
+         (runtime->status->state != SNDRV_PCM_STATE_DRAINING ||
+ 		 runtime->trigger_master != NULL ||
+          runtime->trigger_master->stream != SNDRV_PCM_STREAM_PLAYBACK)) return 0;
+
 	DCSR(prtd->dma_ch) |= DCSR_RUN;	
+
 	return 0;
 }	
 
Index: git/sound/soc/soc-core.c
===================================================================
--- git.orig/sound/soc/soc-core.c	2006-05-04 23:15:28.000000000 +0100
+++ git/sound/soc/soc-core.c	2006-05-06 11:14:28.000000000 +0100
@@ -64,6 +64,7 @@
 	18, 18, 18, 18
 };
 
+#ifdef CONFIG_SND_AC97_BUS
 /* unregister ac97 codec */
 static int soc_ac97_dev_unregister(struct snd_soc_codec *codec)
 {
@@ -95,6 +96,7 @@
 	}
 	return 0;
 }
+#endif
 
 /* get rate format from rate */
 static inline int soc_get_rate_format(int rate)
@@ -260,9 +262,9 @@
 		
 			/* liam - still need to add tdm selection */
 			rtd->pcm_i->hw_runtime.hwfmt = rtd->pcm_c->hw_runtime.hwfmt = 
-				1 << (generic_ffs(hwfmt & SND_SOC_HWFMT_FORMAT_MASK) -1) | 
-				1 << (generic_ffs(hwfmt & SND_SOC_HWFMT_CLOCK_MASK) - 1) |
-				1 << (generic_ffs(hwfmt & SND_SOC_HWFMT_INV_MASK) - 1);
+				1 << (ffs(hwfmt & SND_SOC_HWFMT_FORMAT_MASK) -1) |
+				1 << (ffs(hwfmt & SND_SOC_HWFMT_CLOCK_MASK) - 1) |
+				1 << (ffs(hwfmt & SND_SOC_HWFMT_INV_MASK) - 1);
 				
 			/* calculate clocking */	
 			mclk = soc_get_mclk(rtd, rate, hwfmt);
@@ -294,31 +296,31 @@
 			if(c->hwflags & i->hwflags & SND_SOC_HW_BFS_DIV) {
 				/* i & c bfs dividers */
 				rtd->pcm_i->hw_runtime.hwbfs = rtd->pcm_c->hw_runtime.hwbfs = 
-					1 << (generic_fls(c->hwbfs & i->hwbfs));
+					1 << (fls(c->hwbfs & i->hwbfs));
 			} else if (c->hwflags & SND_SOC_HW_BFS_DIV) {
 				/* normalise bfs c & i */
 				cbfs = soc_bfs_div_to_mult(c->hwbfs, rate, mclk, 
 						rtd->pcm_c->hw_runtime.hwpcmfmt, word);
 				rtd->pcm_i->hw_runtime.hwbfs = 
-					1 << (generic_ffs(cbfs & i->hwbfs) - 1);
+					1 << (ffs(cbfs & i->hwbfs) - 1);
 				ibfs = soc_bfs_mult_to_div(i->hwbfs, rate, mclk, 
 						rtd->pcm_c->hw_runtime.hwpcmfmt, word);
 				rtd->pcm_c->hw_runtime.hwbfs = 
-					1 << (generic_fls(c->hwbfs & ibfs) - 1);
+					1 << (fls(c->hwbfs & ibfs) - 1);
 			} else if (i->hwflags & SND_SOC_HW_BFS_DIV) {
 				/* normalise bfs c & i */
 				cbfs = soc_bfs_mult_to_div(c->hwbfs, rate, mclk, 
 						rtd->pcm_c->hw_runtime.hwpcmfmt, word);
 				rtd->pcm_i->hw_runtime.hwbfs = 
-					1 << (generic_fls(cbfs & i->hwbfs) -1);
+					1 << (fls(cbfs & i->hwbfs) -1);
 				ibfs = soc_bfs_div_to_mult(i->hwbfs, rate, mclk, 
 						rtd->pcm_c->hw_runtime.hwpcmfmt, word);
 				rtd->pcm_c->hw_runtime.hwbfs = 
-					1 << (generic_ffs(c->hwbfs & ibfs) -1);
+					1 << (ffs(c->hwbfs & ibfs) -1);
 			} else {
 				/* i & c bfs rate multipliers */
 				rtd->pcm_i->hw_runtime.hwbfs = rtd->pcm_c->hw_runtime.hwbfs = 
-					1 << (generic_ffs(c->hwbfs & i->hwbfs));
+					1 << (ffs(c->hwbfs & i->hwbfs));
 			}
 
 			if(!rtd->pcm_i->hw_runtime.hwbfs || !rtd->pcm_c->hw_runtime.hwbfs) {
@@ -1088,7 +1090,7 @@
  */
 int snd_soc_get_rate(int hwpcmrate)
 {	
-	int rate = generic_ffs(hwpcmrate) - 1;
+	int rate = ffs(hwpcmrate) - 1;
 	
 	if (rate > ARRAY_SIZE(rates))
 		return 0;
@@ -1160,8 +1162,10 @@
 		return ret;
 	}
 	
+#ifdef CONFIG_SND_AC97_BUS
 	if(ac97)
 		soc_ac97_dev_register(codec);
+#endif
 	
 	snd_soc_dapm_sys_add(socdev->dev);
 	return ret;
@@ -1178,9 +1182,10 @@
 void snd_soc_free_pcms(struct snd_soc_device *socdev)
 {
 	struct snd_soc_codec *codec = socdev->codec;
-
+#ifdef CONFIG_SND_AC97_BUS
 	if(codec->ac97)
 		soc_ac97_dev_unregister(codec);
+#endif
 	if(codec->card)
 		snd_card_free(codec->card);
 }
