Index: linux-2.6.15-rc2/include/sound/soc.h
===================================================================
--- linux-2.6.15-rc2.orig/include/sound/soc.h	2005-12-04 00:39:45.000000000 +0000
+++ linux-2.6.15-rc2/include/sound/soc.h	2005-12-04 00:39:48.000000000 +0000
@@ -47,10 +47,10 @@
 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .info = snd_soc_info_enum_double, \
   .get = snd_soc_get_enum_double, .put = snd_soc_put_enum_double, \
   .private_value = (unsigned long)&xenum }
-#define SOC_SINGLE_EXT(xname, xmask, xhandler_get, xhandler_put) \
-{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .info = snd_soc_info_volsw_ext, \
+#define SOC_SINGLE_BOOL_EXT(xname, xmask, xhandler_get, xhandler_put) \
+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .info = snd_soc_info_volsw_bool_ext, \
   .get = xhandler_get, .put = xhandler_put, \
-  .private_value =  mask }
+  .private_value =  xmask }
 #define SOC_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put) \
 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .info = snd_soc_info_enum_ext, \
   .get = xhandler_get, .put = xhandler_put, \
@@ -155,7 +155,7 @@
 int snd_soc_get_enum_double(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol);
 int snd_soc_put_enum_double(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol);
 int snd_soc_info_volsw(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo);
-int snd_soc_info_volsw_ext(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo);
+int snd_soc_info_volsw_bool_ext(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo);
 int snd_soc_get_volsw(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol);
 int snd_soc_put_volsw(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol);
 	
@@ -337,7 +337,7 @@
 
 /* SoC Device */
 struct snd_soc_platdev_data {
-	struct device *dev;
+	struct device *dev; /* Need to start using this */
 	struct snd_soc_machine *machine;
 	struct snd_soc_platform *platform;
 	struct snd_soc_codec *codec;
Index: linux-2.6.15-rc2/sound/soc/soc-core.c
===================================================================
--- linux-2.6.15-rc2.orig/sound/soc/soc-core.c	2005-12-04 00:39:45.000000000 +0000
+++ linux-2.6.15-rc2/sound/soc/soc-core.c	2005-12-04 00:39:48.000000000 +0000
@@ -536,6 +536,7 @@
 			((ret = platform->iface[i]->probe(pdev)) < 0))
 				goto iface_err;
 	}
+
 	return 0;
 
 iface_err:
@@ -610,6 +611,7 @@
 	pcm_c->codec = codec;
 	iface->card = codec->card;
 	iface->pcm_c = pcm_c;
+	iface->machine = codec->machine;
 	pcm->private_data = pcm_c;
 
 	soc_pcm_ops.mmap = codec->machine->platform->pcm_ops->mmap;
@@ -668,7 +670,7 @@
 		printk(KERN_ERR "soc: couldn't match any pcms for %s\n", codec->name);
 		return -ENODEV;
 	}
-	
+
 	return ret;
 
 }
@@ -801,14 +803,15 @@
 	return 0;
 }
 
-int snd_soc_info_volsw_ext(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+int snd_soc_info_volsw_bool_ext(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
 {
 	int mask = kcontrol->private_value;
 
-	uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
+	//SNDRV_CTL_ELEM_TYPE_INTEGER;
 	uinfo->count = 1;
 	uinfo->value.integer.min = 0;
-	uinfo->value.integer.max = mask;
+	uinfo->value.integer.max = 1;
 	return 0;
 }
 
@@ -881,7 +884,7 @@
 EXPORT_SYMBOL_GPL(snd_soc_get_enum_double);
 EXPORT_SYMBOL_GPL(snd_soc_put_enum_double);
 EXPORT_SYMBOL_GPL(snd_soc_info_volsw);
-EXPORT_SYMBOL_GPL(snd_soc_info_volsw_ext);
+EXPORT_SYMBOL_GPL(snd_soc_info_volsw_bool_ext);
 EXPORT_SYMBOL_GPL(snd_soc_get_volsw);
 EXPORT_SYMBOL_GPL(snd_soc_put_volsw);
 EXPORT_SYMBOL_GPL(snd_soc_update_bits);
Index: linux-2.6.15-rc2/sound/soc/soc-dpm.c
===================================================================
--- linux-2.6.15-rc2.orig/sound/soc/soc-dpm.c	2005-12-04 00:39:25.000000000 +0000
+++ linux-2.6.15-rc2/sound/soc/soc-dpm.c	2005-12-04 00:39:48.000000000 +0000
@@ -636,7 +636,8 @@
 
 static ssize_t dpm_status_show(struct device *dev, struct device_attribute *attr, char *buf)   \
 {
-	struct snd_soc_codec *codec = (struct snd_soc_codec*)dev->platform_data;
+	struct snd_soc_platdev_data *devdata = dev_get_drvdata(dev);
+	struct snd_soc_codec* codec = devdata->codec;
 	struct snd_soc_dpm_widget *w = NULL;
 	struct list_head *l = NULL;
 	int count = 0;
Index: linux-2.6.15-rc2/sound/soc/pxa/corgi.c
===================================================================
--- linux-2.6.15-rc2.orig/sound/soc/pxa/corgi.c	2005-12-04 00:39:45.000000000 +0000
+++ linux-2.6.15-rc2/sound/soc/pxa/corgi.c	2005-12-04 00:19:25.000000000 +0000
@@ -96,22 +96,6 @@
 	return 0;
 }
 
-static void corgi_mute_set(int val)
-{
-	if (val)
-		set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_L | CORGI_SCP_MUTE_R);
-	else
-		reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_L | CORGI_SCP_MUTE_R);
-}
-
-static void corgi_spk_set(int val)
-{
-	if (val)
-		set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_APM_ON);
-	else
-		reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_APM_ON);
-}
-
 //static void spite_mute_set(int val)
 //{
 //	if (val)
@@ -121,11 +105,26 @@
 //}
 
 
-#ifdef TODO
+int corgi_get_snd_scoop(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	unsigned short reg = kcontrol->private_value;
+	ucontrol->value.integer.value[0] = ((read_scoop_reg(&corgiscoop_device.dev, SCOOP_GPWR) & reg) != 0);
+	return 0;
+}
+
+int corgi_put_snd_scoop(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	unsigned short reg = kcontrol->private_value;
+
+	if (ucontrol->value.integer.value[0])
+		set_scoop_gpio(&corgiscoop_device.dev, reg);
+	else
+		reset_scoop_gpio(&corgiscoop_device.dev, reg);
+	return 0;
+}
+
+
 
-/*
- * need to change this for corgi 
- */
 
 /* example external dpm event callback */
 int external_amp_event(struct snd_soc_codec *codec, int event)
@@ -134,96 +133,77 @@
 }
 
 /* example machine dpm widgets */
-static const struct snd_soc_dpm_widget wm8753_dpm_widgets[] = {
+static const struct snd_soc_dpm_widget wm8731_dpm_widgets[] = {
 SND_SOC_DPM_HP("Headphone Jack"),
 SND_SOC_DPM_MIC("Mic1 Jack"),
 SND_SOC_DPM_AMP("Ext Amp", external_amp_event),
 };
 
-int corgi_get_volsw(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
-{
-	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
-	int mask = kcontrol->private_value;
-	
-	//ucontrol->value.integer.value[0] = corgi do something
-}
-
-int corgi_put_volsw(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
-{
-	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
-	int mask = kcontrol->private_value;
-	int val;
-	
-	val = (ucontrol->value.integer.value[0] & mask);
-	
-	/* do something with val */
-}
-
 /* example machine interconnections */
 static const char* intercon[][3] = {
 	
 	/* headphone connected to LOUT1, ROUT1 */
-	{"Headphone Jack", NULL, "LOUT1"},
-	{"Headphone Jack", NULL, "ROUT1"},
+	{"Headphone Jack", NULL, "LOUT"},
+	{"Headphone Jack", NULL, "RHPOUT"},
 	
 	/* ext speaker connected to LOUT2, ROUT2 via amp */
-	{"Ext Amp", NULL, "LOUT2"},
-	{"Ext Amp", NULL, "ROUT2"},
+	{"Ext Amp", NULL, "LHPOUT"},
+	{"Ext Amp", NULL, "ROUT"},
 	
 	/* mic is connected to mic1 - with bias */
-	{"MIC1", NULL, "Mic Bias"},
-	{"MIC1N", NULL, "Mic Bias"},
-	{"Mic Bias", NULL, "Mic1 Jack"},
+	{"MICIN", NULL, "Mic Bias"},
+	{"LLINEIN", NULL, "Mic Bias"},
 	{"Mic Bias", NULL, "Mic1 Jack"},
-	
-	{"ACIN", NULL, "ACOP"},
+
 	{NULL, NULL, NULL},
 };
 
 /* example unconnected codec pins */
-static const struct snd_soc_dpm_pin wm8753_mainstone_pins[] = {
-	{"RXP", 0},
-	{"RXN", 0},
-	{"MIC2", 0},
+static const struct snd_soc_dpm_pin wm8731_corgi_pins[] = {
+	{"RLINEIN", 0},
 };
 
+
 /* headphone detect support on my board */
-static const char * hp_pol[] = {"Headphone", "Speaker"};
-static const struct soc_enum wm8753_enum =
-	SOC_ENUM_SINGLE(WM8753_OUTCTL, 1, 2, hp_pol);
-
-static const snd_kcontrol_new_t wm8753_mainstone_controls[] = {
-	SOC_SINGLE("Headphone Detect Switch", WM8753_OUTCTL, 6, 1, 0),
-	SOC_ENUM("Headphone Detect Polarity", wm8753_enum),
-	SOC_SINGLE_EXT("corgi bark switch", 1, corgi_get_volsw, corgi_put_volsw);
+//static const char * hp_pol[] = {"Headphone", "Speaker"};
+//static const struct soc_enum wm8753_enum = SOC_ENUM_SINGLE(WM8753_OUTCTL, 1, 2, hp_pol);
+
+static const snd_kcontrol_new_t wm8731_corgi_controls[] = {
+//	SOC_SINGLE("Headphone Detect Switch", WM8753_OUTCTL, 6, 1, 0),
+//	SOC_ENUM("Headphone Detect Polarity", wm8753_enum),
+	SOC_SINGLE_BOOL_EXT("Left Mute Switch", CORGI_SCP_MUTE_L, corgi_get_snd_scoop, corgi_put_snd_scoop),
+	SOC_SINGLE_BOOL_EXT("Right Mute Switch", CORGI_SCP_MUTE_R, corgi_get_snd_scoop, corgi_put_snd_scoop),
+	SOC_SINGLE_BOOL_EXT("Speaker Mute Switch", CORGI_SCP_APM_ON, corgi_get_snd_scoop, corgi_put_snd_scoop),
+	SOC_SINGLE_BOOL_EXT("Mic Bias Switch", CORGI_SCP_MIC_BIAS, corgi_get_snd_scoop, corgi_put_snd_scoop),
 };
 
+
+
 /*
- * This is an example machine initialisation for a wm8753 connected to a 
- * Mainstone II. It is missing logic to detect hp/mic insertions and logic
- * to re-route the audio in such an event.
+ * Logic for a wm8731 as connected on a Sharp SL-C7x0 Device
  */
-
 static int corgi_wm8731_init(struct snd_soc_codec *codec)
 {
 	int i, err;
+
+	printk("Machine init code called\n");
 	
-	/* set up mainstone codec pins */
-	for (i = 0; i < ARRAY_SIZE(wm8753_mainstone_pins); i++)
-		snd_soc_dpm_set_connection(codec, &wm8753_mainstone_pins[i]);
-	
-	/* add mainstone specific controls */
-	for (i = 0; i < ARRAY_SIZE(wm8753_mainstone_controls); i++) {
-		if ((err = snd_ctl_add(codec->card, snd_soc_cnew(&wm8753_mainstone_controls[i],codec, NULL))) < 0)
+	/* Set up corgi codec pins */
+	for (i = 0; i < ARRAY_SIZE(wm8731_corgi_pins); i++)
+		snd_soc_dpm_set_connection(codec, &wm8731_corgi_pins[i]);
+
+	/* Add corgi specific controls */
+	for (i = 0; i < ARRAY_SIZE(wm8731_corgi_controls); i++) {
+		if ((err = snd_ctl_add(codec->card, snd_soc_cnew(&wm8731_corgi_controls[i],codec, NULL))) < 0)
 			return err;
 	}
 
-	/* add mainstone specific widgets */
-	for(i = 0; i < ARRAY_SIZE(wm8753_dpm_widgets); i++) {
-		snd_soc_dpm_new_control(codec, &wm8753_dpm_widgets[i]);
+	/* Add corgi specific widgets */
+	for(i = 0; i < ARRAY_SIZE(wm8731_dpm_widgets); i++) {
+		snd_soc_dpm_new_control(codec, &wm8731_dpm_widgets[i]);
 	}
 	
-	/* set up mainstone specific audio path interconnects */
+	/* Set up corgi specific audio path interconnects */
 	for(i = 0; intercon[i][0] != NULL; i++) {
 		snd_soc_dpm_connect_input(codec, intercon[i][0], intercon[i][1], intercon[i][2]);
 	}
@@ -231,14 +211,15 @@
 	snd_soc_dpm_sync(codec);
 	return 0;
 }
-#endif
+
+
 
 static struct snd_soc_machine_config codecs[] = {
 {
 	.name = "WM8731", 
 	.sname = "WM8731",
 	.iface = &pxa_i2s_interface,
-//	.init = corgi_wm8731_init, -- see above
+	.init = corgi_wm8731_init,
 },
 };
 
