Index: linux-2.6.15/sound/soc/pxa/corgi.c
===================================================================
--- linux-2.6.15.orig/sound/soc/pxa/corgi.c	2006-03-04 11:26:50.000000000 +0000
+++ linux-2.6.15/sound/soc/pxa/corgi.c	2006-03-04 11:29:39.000000000 +0000
@@ -39,62 +39,45 @@
 #include "../codecs/wm8731.h"
 #include "pxa2xx-pcm.h"
 
-#define CORGI_HP	0
-#define CORGI_MIC	1
-#define CORGI_LINE	2
-#define CORGI_HEADSET	3
-#define CORGI_SPK_AUTO	0
-#define CORGI_SPK_ON	1
-#define CORGI_SPK_OFF	2
-
-static struct workqueue_struct *corgi_hp_workq = NULL;
-static struct work_struct corgi_hp_event_work;
-static int corgi_hp_status = 0;
+#define CORGI_HP        0
+#define CORGI_MIC       1
+#define CORGI_LINE      2
+#define CORGI_HEADSET   3
+#define CORGI_HP_OFF    4
+#define CORGI_SPK_AUTO  0
+#define CORGI_SPK_ON    1
+#define CORGI_SPK_OFF   2
+
 static int corgi_jack_func = 0;
 static int corgi_spk_func = 0;
 
-static irqreturn_t corgi_hp_isr(int irq, void *dev_id, struct pt_regs *fp)
-{
-	/* Delay the event slightly to debounce */
-	queue_delayed_work(corgi_hp_workq, &corgi_hp_event_work, msecs_to_jiffies(500));
-
-	return IRQ_HANDLED;
-}
+#define READ_GPIO_BIT(x)    (GPLR(x) & GPIO_bit(x))
 
 static void corgi_ext_control(struct snd_soc_codec *codec)
 {
 	int spk = 0, mic = 0, line = 0, hp = 0;
 	
-	/* change the dpm status depending on the insertion */
-	if (corgi_hp_status == 1) {
-		
-		/* do we need to mute spk */
-		if(corgi_spk_func == CORGI_SPK_ON)
-			spk = 1;
-			
-		/* set up jack connection */
-		switch(corgi_jack_func) {
-		case CORGI_HP:
-			hp = 1;
-			break;
-		case CORGI_MIC:
-			mic = 1;
-			break;
-		case CORGI_LINE:
-			line = 1;
-			break;
-		case CORGI_HEADSET:
-			hp = 1;
-			mic = 1;
-			break;
-		}	
-	} else {
-
-		if(corgi_spk_func != CORGI_SPK_OFF)
-			spk = 1;
-	
+	/* set up jack connection */
+	switch(corgi_jack_func) {
+	case CORGI_HP:
+		hp = 1;
+		break;
+	case CORGI_MIC:
+		mic = 1;
+		break;
+	case CORGI_LINE:
+		line = 1;
+		break;
+	case CORGI_HEADSET:
+		hp = 1;
+		mic = 1;
+		break;
 	}
-	
+
+	if ((READ_GPIO_BIT(CORGI_GPIO_AK_INT) && (corgi_spk_func == CORGI_SPK_AUTO))
+			|| (corgi_spk_func == CORGI_SPK_ON))
+		spk = 1;
+
 	snd_soc_dpm_set_connection(codec, "Ext Spk", spk);
 	snd_soc_dpm_set_connection(codec, "Mic Jack", mic);
 	snd_soc_dpm_set_connection(codec, "Line Jack", line);
@@ -102,15 +85,12 @@
 	snd_soc_dpm_sync(codec);
 }
 
-#define READ_GPIO_BIT(x)    (GPLR(x) & GPIO_bit(x))
-
 static int corgi_startup(snd_pcm_substream_t *substream)
 {
 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
 	struct snd_soc_codec *codec = rtd->socdev->codec;
 
 	/* check the jack status at stream startup */	
-	corgi_hp_status = (READ_GPIO_BIT(CORGI_GPIO_AK_INT) != 0);
 	corgi_ext_control(codec);
 	return 0;
 }
@@ -119,16 +99,6 @@
 	.startup = corgi_startup,
 };
 
-static void corgi_hp_work(void *data)
-{
-	struct snd_soc_codec *codec = (struct snd_soc_codec *)data;
-	corgi_hp_status = (READ_GPIO_BIT(CORGI_GPIO_AK_INT) != 0);
-	
-	printk("HP Status: %d\n", corgi_hp_status);
-	corgikbd_report_hp(corgi_hp_status);
-	corgi_ext_control(codec);
-}
-
 static int corgi_get_jack(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
 	ucontrol->value.integer.value[0] = corgi_jack_func;
@@ -219,10 +189,10 @@
 	{NULL, NULL, NULL},
 };
 
-static const char* jack_function[] = {"Headphone", "Mic", "Line", "Headset"};
+static const char* jack_function[] = {"Headphone", "Mic", "Line", "Headset", "Off"};
 static const char* spk_function[] = {"Auto", "On", "Off"};
 static const struct soc_enum corgi_enum[] = {
-	SOC_ENUM_SINGLE_EXT(4, jack_function),
+	SOC_ENUM_SINGLE_EXT(5, jack_function),
 	SOC_ENUM_SINGLE_EXT(3, spk_function),
 };
 
@@ -256,8 +226,6 @@
 		snd_soc_dpm_connect_input(codec, intercon[i][0], intercon[i][1], intercon[i][2]);
 	}
 	
-	INIT_WORK(&corgi_hp_event_work, corgi_hp_work, codec);
-	corgi_hp_workq = create_singlethread_workqueue("corgihp");
 	snd_soc_dpm_sync(codec);
 	return 0;
 }
@@ -317,14 +285,6 @@
 		return -ENOMEM;
 	}
 
-	ret = request_irq(CORGI_IRQ_GPIO_AK_INT, corgi_hp_isr, SA_INTERRUPT, "Headphone Detect", corgi_snd_device);
-	if (ret < 0) {
-		printk(KERN_ERR "Could not register corgi headphone irq.\n");
-		platform_device_put(corgi_snd_device);		
-		return ret;
-	}
-	set_irq_type(CORGI_IRQ_GPIO_AK_INT, IRQT_BOTHEDGE);
-
 	platform_set_drvdata(corgi_snd_device, &corgi_snd_devdata);
 	corgi_snd_devdata.dev = &corgi_snd_device->dev;
 	ret = platform_device_add(corgi_snd_device);
@@ -337,9 +297,6 @@
 
 static void __exit corgi_exit(void) 
 {
-	free_irq(CORGI_IRQ_GPIO_AK_INT, corgi_snd_device);
-	if(corgi_hp_workq)
-		destroy_workqueue(corgi_hp_workq);
 	platform_device_unregister(corgi_snd_device);
 }
 
Index: linux-2.6.15/sound/soc/pxa/spitz.c
===================================================================
--- linux-2.6.15.orig/sound/soc/pxa/spitz.c	2006-03-04 11:26:50.000000000 +0000
+++ linux-2.6.15/sound/soc/pxa/spitz.c	2006-03-04 11:29:39.000000000 +0000
@@ -39,107 +39,77 @@
 #include "../codecs/wm8750.h"
 #include "pxa2xx-pcm.h"
 
-#define SPITZ_HP		0
-#define SPITZ_MIC		1
-#define SPITZ_LINE		2
-#define SPITZ_HEADSET	3
-#define SPITZ_SPK_AUTO	0
-#define SPITZ_SPK_ON	1
-#define SPITZ_SPK_OFF	2
+#define SPITZ_HP        0
+#define SPITZ_MIC       1
+#define SPITZ_LINE      2
+#define SPITZ_HEADSET   3
+#define SPITZ_HP_OFF    4
+#define SPITZ_SPK_AUTO  0
+#define SPITZ_SPK_ON    1
+#define SPITZ_SPK_OFF   2
 
-static struct workqueue_struct *spitz_hp_workq = NULL;
-static struct work_struct spitz_hp_event_work;
 static int spitz_jack_func = 0;
 static int spitz_spk_func = 0;
-static int spitz_hp_status = 0;
 static int ld2ro = 0; /* left DAC to R mixer status - for headset */
 
-static irqreturn_t spitz_hp_isr(int irq, void *dev_id, struct pt_regs *fp)
-{
-	/* Delay the event slightly to debounce */
-	queue_delayed_work(spitz_hp_workq, &spitz_hp_event_work, msecs_to_jiffies(500));
-
-	return IRQ_HANDLED;
-}
-
 #define READ_GPIO_BIT(x)    (GPLR(x) & GPIO_bit(x))
 
 static void spitz_ext_control(struct snd_soc_codec *codec)
 {
-	int new_ld2ro = codec->read(codec, WM8750_ROUTM1);
-	
-	/* change the dpm status depending on the insertion */
-	if (spitz_hp_status == 1) {
-		
-		/* do we need to mute spk */
-		if(spitz_spk_func != SPITZ_SPK_ON)
-			snd_soc_dpm_set_connection(codec, "Ext Spk", 0);
-		else
-			snd_soc_dpm_set_connection(codec, "Ext Spk", 1);
-			
-		/* set up jack connection */
-		switch(spitz_jack_func) {
-		case SPITZ_HP:
-			/* enable and unmute hp jack, disable mic bias */
-			codec->write(codec, WM8750_ROUTM1, ld2ro | new_ld2ro);
-			snd_soc_dpm_set_connection(codec, "Headset Headphone Jack", 0);
-			snd_soc_dpm_set_connection(codec, "Mic Jack", 0);
-			snd_soc_dpm_set_connection(codec, "Line Jack", 0);
-			snd_soc_dpm_set_connection(codec, "Headphone Jack", 1);
-			set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L);
-			set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R);
-			break;
-		case SPITZ_MIC:
-			/* enable mic jack and bias, mute hp */
-			codec->write(codec, WM8750_ROUTM1, ld2ro | new_ld2ro);
-			snd_soc_dpm_set_connection(codec, "Headphone Jack", 0);
-			snd_soc_dpm_set_connection(codec, "Headset Headphone Jack", 0);
-			snd_soc_dpm_set_connection(codec, "Line Jack", 0);
-			snd_soc_dpm_set_connection(codec, "Mic Jack", 1);
-			reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L);
-			reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R);
-			break;
-		case SPITZ_LINE:
-			/* enable line jack, disable mic bias and mute hp */
-			codec->write(codec, WM8750_ROUTM1, ld2ro | new_ld2ro);
-			snd_soc_dpm_set_connection(codec, "Headphone Jack", 0);
-			snd_soc_dpm_set_connection(codec, "Headset Headphone Jack", 0);
-			snd_soc_dpm_set_connection(codec, "Mic Jack", 0);
-			snd_soc_dpm_set_connection(codec, "Line Jack", 1);
-			reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L);
-			reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R);
-			break;
-		case SPITZ_HEADSET:
-			
-			/* route LDAC audio into R mixer */
-			ld2ro = codec->read(codec, WM8750_ROUTM1);
-			codec->write(codec, WM8750_ROUTM1, ld2ro | 0x100);
-			ld2ro &= 0x100;
-			
-			/* enable and unmute headset jack enable mic bias, mute L hp */
-			snd_soc_dpm_set_connection(codec, "Headphone Jack", 0);
-			snd_soc_dpm_set_connection(codec, "Mic Jack", 1);
-			snd_soc_dpm_set_connection(codec, "Line Jack", 0);
-			snd_soc_dpm_set_connection(codec, "Headset Headphone Jack", 1);
-			reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L);
-			set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R);
-			break;
-		}	
-	} else {
-		/* jack removed, so revert to spk if enabled */
-		codec->write(codec, WM8750_ROUTM1, ld2ro | new_ld2ro);
-		snd_soc_dpm_set_connection(codec, "Headphone Jack", 0);
+	if ((spitz_spk_func == SPITZ_SPK_ON) || ((spitz_spk_func == SPITZ_SPK_AUTO)
+			&& READ_GPIO_BIT(SPITZ_GPIO_AK_INT)))
+		snd_soc_dpm_set_connection(codec, "Ext Spk", 1);
+	else
+		snd_soc_dpm_set_connection(codec, "Ext Spk", 0);
+
+	/* set up jack connection */
+	switch(spitz_jack_func) {
+	case SPITZ_HP:
+		/* enable and unmute hp jack, disable mic bias */
 		snd_soc_dpm_set_connection(codec, "Headset Headphone Jack", 0);
 		snd_soc_dpm_set_connection(codec, "Mic Jack", 0);
 		snd_soc_dpm_set_connection(codec, "Line Jack", 0);
-		// liam reset_scoop_gpio(&spitzscoop2_device.dev, SPITZ_SCP2_MIC_BIAS);
+		snd_soc_dpm_set_connection(codec, "Headphone Jack", 1);
+		set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L);
+		set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R);
+		break;
+	case SPITZ_MIC:
+		/* enable mic jack and bias, mute hp */
+		snd_soc_dpm_set_connection(codec, "Headphone Jack", 0);
+		snd_soc_dpm_set_connection(codec, "Headset Headphone Jack", 0);
+		snd_soc_dpm_set_connection(codec, "Line Jack", 0);
+		snd_soc_dpm_set_connection(codec, "Mic Jack", 1);
+		reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L);
+		reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R);
+		break;
+	case SPITZ_LINE:
+		/* enable line jack, disable mic bias and mute hp */
+		snd_soc_dpm_set_connection(codec, "Headphone Jack", 0);
+		snd_soc_dpm_set_connection(codec, "Headset Headphone Jack", 0);
+		snd_soc_dpm_set_connection(codec, "Mic Jack", 0);
+		snd_soc_dpm_set_connection(codec, "Line Jack", 1);
 		reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L);
 		reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R);
+		break;
+	case SPITZ_HEADSET:
+		/* enable and unmute headset jack enable mic bias, mute L hp */
+		snd_soc_dpm_set_connection(codec, "Headphone Jack", 0);
+		snd_soc_dpm_set_connection(codec, "Mic Jack", 1);
+		snd_soc_dpm_set_connection(codec, "Line Jack", 0);
+		snd_soc_dpm_set_connection(codec, "Headset Headphone Jack", 1);
+		reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L);
+		set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R);
+		break;
+	case SPITZ_HP_OFF:
 
-		if(spitz_spk_func != SPITZ_SPK_OFF)
-			snd_soc_dpm_set_connection(codec, "Ext Spk", 1);
-		else
-			snd_soc_dpm_set_connection(codec, "Ext Spk", 0);
+		/* jack removed, everything off */
+		snd_soc_dpm_set_connection(codec, "Headphone Jack", 0);
+		snd_soc_dpm_set_connection(codec, "Headset Headphone Jack", 0);
+		snd_soc_dpm_set_connection(codec, "Mic Jack", 0);
+		snd_soc_dpm_set_connection(codec, "Line Jack", 0);
+		reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L);
+		reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R);
+		break;
 	}
 	snd_soc_dpm_sync(codec);
 }
@@ -150,7 +120,6 @@
 	struct snd_soc_codec *codec = rtd->socdev->codec;
 
 	/* check the jack status at stream startup */	
-	spitz_hp_status = (READ_GPIO_BIT(SPITZ_GPIO_AK_INT) != 0);
 	ld2ro = codec->read(codec, WM8750_ROUTM1);
 	spitz_ext_control(codec);
 	return 0;
@@ -160,16 +129,6 @@
 	.startup = spitz_startup,
 };
 
-static void spitz_hp_work(void *data)
-{
-	struct snd_soc_codec *codec = (struct snd_soc_codec *)data;
-	
-	spitz_hp_status = (READ_GPIO_BIT(SPITZ_GPIO_AK_INT) != 0);
-	printk("HP Status: %d\n", spitz_hp_status);
-	spitzkbd_report_hp(spitz_hp_status);
-	spitz_ext_control(codec);
-}
-
 static int spitz_get_jack(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
 	ucontrol->value.integer.value[0] = spitz_jack_func;
@@ -251,10 +210,10 @@
 	{NULL, NULL, NULL},
 };
 
-static const char* jack_function[] = {"Headphone", "Mic", "Line", "Headset"};
+static const char* jack_function[] = {"Headphone", "Mic", "Line", "Headset", "Off"};
 static const char* spk_function[] = {"Auto", "On", "Off"};
 static const struct soc_enum spitz_enum[] = {
-	SOC_ENUM_SINGLE_EXT(4, jack_function),
+	SOC_ENUM_SINGLE_EXT(5, jack_function),
 	SOC_ENUM_SINGLE_EXT(3, spk_function),
 };
 
@@ -294,8 +253,6 @@
 		snd_soc_dpm_connect_input(codec, intercon[i][0], intercon[i][1], intercon[i][2]);
 	}
 	
-	INIT_WORK(&spitz_hp_event_work, spitz_hp_work, codec);
-	spitz_hp_workq = create_singlethread_workqueue("spitzhp");
 	snd_soc_dpm_sync(codec);
 	return 0;
 }
@@ -355,14 +312,6 @@
 		return -ENOMEM;
 	}
 
-	ret = request_irq(SPITZ_IRQ_GPIO_AK_INT, spitz_hp_isr, SA_INTERRUPT, "Headphone Detect", spitz_snd_device);
-	if (ret < 0) {
-		printk(KERN_ERR "Could not register spitz headphone irq.\n");
-		platform_device_put(spitz_snd_device);		
-		return ret;
-	}
-	set_irq_type(SPITZ_IRQ_GPIO_AK_INT, IRQT_BOTHEDGE);
-
 	platform_set_drvdata(spitz_snd_device, &spitz_snd_devdata);
 	spitz_snd_devdata.dev = &spitz_snd_device->dev;
 	ret = platform_device_add(spitz_snd_device);
@@ -375,9 +324,6 @@
 
 static void __exit spitz_exit(void) 
 {
-	free_irq(SPITZ_IRQ_GPIO_AK_INT, spitz_snd_device);
-	if(spitz_hp_workq)
-		destroy_workqueue(spitz_hp_workq);
 	platform_device_unregister(spitz_snd_device);
 }
 
Index: linux-2.6.15/sound/soc/codecs/wm8731.c
===================================================================
--- linux-2.6.15.orig/sound/soc/codecs/wm8731.c	2006-03-04 11:26:50.000000000 +0000
+++ linux-2.6.15/sound/soc/codecs/wm8731.c	2006-03-04 11:29:39.000000000 +0000
@@ -97,7 +97,7 @@
 		SND_SOC_HW_BFS_DIV, SND_SOC_FS(128), SND_SOC_FSBD(1) | SND_SOC_FSBD(2) | SND_SOC_FSBD(4)},
 	
 	/* codec frame and clock slave modes */	
-	{WM8731_HWFMT, SND_SOC_HWTDM_LRDW(0,0), WM8731_PCM_FORMATS, 
+	{WM8731_HWFMT | SND_SOC_HWFMT_CBS_CFS, SND_SOC_HWTDM_LRDW(0,0), WM8731_PCM_FORMATS,
 		WM8731_RATES, WM8731_DIR, SND_SOC_HW_BFS_DIV, SND_SOC_FS_ALL, SND_SOC_FSBD_ALL},
 };
 

