Index: linux-2.6.15-rc2/include/sound/soc.h
===================================================================
--- linux-2.6.15-rc2.orig/include/sound/soc.h	2005-12-04 15:55:34.000000000 +0000
+++ linux-2.6.15-rc2/include/sound/soc.h	2005-12-04 20:24:55.000000000 +0000
@@ -111,6 +111,7 @@
 #define snd_soc_read(codec, reg) codec->read(codec, reg)
 #define snd_soc_write(codec, reg, value) codec->write(codec, reg, value)
 
+struct snd_soc_device;
 struct snd_soc_pcm_stream;
 struct snd_soc_ops;
 struct snd_soc_hw_mode;
@@ -118,9 +119,7 @@
 struct snd_soc_pcm_codec;
 struct snd_soc_pcm_interface;
 struct snd_soc_codec;
-struct snd_soc_platform;
 struct snd_soc_machine_config;
-struct snd_soc_machine;
 struct soc_enum;
 	
 typedef int (*hw_write_t)(void *,const char* ,int);
@@ -129,9 +128,9 @@
 extern struct bus_type soc_bus_type; /* FIXME - remove me */
 
 /* pcm <-> interface connect */
-void snd_soc_free_pcms(struct snd_soc_codec *codec);
-int snd_soc_register_pcms(struct snd_soc_codec* codec);
-int snd_soc_register_card(struct snd_soc_codec *codec);
+void snd_soc_free_pcms(struct snd_soc_device *socdev);
+int snd_soc_register_pcms(struct snd_soc_device *socdev);
+int snd_soc_register_card(struct snd_soc_device *socdev);
 
 /* set runtime hw params */
 int snd_soc_set_runtime_hw(snd_pcm_substream_t *substream, 
@@ -243,7 +242,7 @@
 	struct snd_soc_ops ops;
 	snd_pcm_runtime_t *runtime;
 	snd_card_t *card;
-	struct snd_soc_machine* machine; /* FIXME - remove me */
+	struct snd_soc_device *socdev;
 	unsigned char active:1;
 	
 	/* private data */
@@ -262,9 +261,8 @@
 	/* runtime */
 	snd_card_t *card;
 	ac97_t *ac97;
-	struct platform_device *pdev; /* FIXME - remove me */
+
 	void *private_data;
-	struct snd_soc_machine *machine; /* FIXME - remove me */
 	int active_streams;
 	int pcm_devs;
 	int dpm_state;
@@ -292,7 +290,6 @@
 	int (*resume)(struct platform_device *pdev);
 };
 
-
 /* SoC platform interface */
 struct snd_soc_platform {
 	char *name;
@@ -329,13 +326,11 @@
 	struct snd_soc_ops *ops;
 	struct snd_soc_machine_config *config;
 	int nconfigs;
-	
-	struct snd_soc_platform* platform; /* FIXME - remove me */
 };
 
 /* SoC Device */
-struct snd_soc_platdev_data {
-	struct device *dev; /* Need to start using this */
+struct snd_soc_device {
+	struct device *dev;
 	struct snd_soc_machine *machine;
 	struct snd_soc_platform *platform;
 	struct snd_soc_codec *codec;
Index: linux-2.6.15-rc2/sound/soc/codecs/wm8731.c
===================================================================
--- linux-2.6.15-rc2.orig/sound/soc/codecs/wm8731.c	2005-12-04 16:38:53.000000000 +0000
+++ linux-2.6.15-rc2/sound/soc/codecs/wm8731.c	2005-12-04 20:24:07.000000000 +0000
@@ -406,8 +406,8 @@
 };
 static int wm8731_suspend(struct platform_device *pdev, pm_message_t state)
 {
-	struct snd_soc_platdev_data *devdata = platform_get_drvdata(pdev);
-	struct snd_soc_codec* codec = devdata->codec;
+	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+	struct snd_soc_codec* codec = socdev->codec;
 
 	wm8731_dpm_event(codec, SNDRV_CTL_POWER_D3cold);
 	return 0;
@@ -415,8 +415,8 @@
 
 static int wm8731_resume(struct platform_device *pdev)
 {
-	struct snd_soc_platdev_data *devdata = platform_get_drvdata(pdev);
-	struct snd_soc_codec* codec = devdata->codec;
+	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+	struct snd_soc_codec* codec = socdev->codec;
 	int i;
 	u8 data[2];
 	u16 *cache = codec->reg_cache;
@@ -436,8 +436,9 @@
  * initialise the WM8731 driver
  * register the mixer and dsp interfaces with the kernel 
  */
-static int wm8731_init(struct snd_soc_codec* codec)
+static int wm8731_init(struct snd_soc_device* socdev)
 {
+	struct snd_soc_codec* codec = socdev->codec;
 	int reg, ret = 0;
 
 	codec->name = "WM8731";
@@ -458,7 +459,7 @@
 	wm8731_dpm_event(codec, SNDRV_CTL_POWER_D2);
 
 	/* register pcms */
-	if((ret = snd_soc_register_pcms(codec)) < 0) {
+	if((ret = snd_soc_register_pcms(socdev)) < 0) {
 		wm8731_dpm_event(codec, SNDRV_CTL_POWER_D3cold);
 		kfree(codec->reg_cache);
 		return ret;
@@ -476,7 +477,7 @@
 
 	wm8731_add_controls(codec);
 	wm8731_add_widgets(codec);
-	snd_soc_register_card(codec);
+	snd_soc_register_card(socdev);
 
 	/* wait for caps to finish charging - liam make this timer in the core */
 	ssleep(1);
@@ -506,13 +507,13 @@
 
 /* If the i2c layer weren't so broken, we could pass this kind of data
    around */
-static struct platform_device *wm8731_device;
+static struct snd_soc_device *wm8731_socdev;
 
 static int corgi_codec_probe(struct i2c_adapter *adap, int addr, int kind)
 {
-	struct snd_soc_platdev_data *devdata = platform_get_drvdata(wm8731_device);
-	struct wm8731_setup_data *setup = devdata->codec_data;
-	struct snd_soc_codec* codec = devdata->codec;
+	struct snd_soc_device *socdev = wm8731_socdev;
+	struct wm8731_setup_data *setup = socdev->codec_data;
+	struct snd_soc_codec* codec = socdev->codec;
 	struct i2c_client *i2c;
 	int ret;
 
@@ -538,7 +539,7 @@
 		return ret;
 	}
 
-	wm8731_init(codec);
+	wm8731_init(socdev);
 
 	return 0;
 }
@@ -578,8 +579,8 @@
 
 static int wm8731_probe(struct platform_device *pdev)
 {
-	struct snd_soc_platdev_data *devdata = platform_get_drvdata(pdev);
-	struct wm8731_setup_data *setup = devdata->codec_data;
+	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+	struct wm8731_setup_data *setup = socdev->codec_data;
 	struct snd_soc_codec* codec;
 	int ret = 0;
 
@@ -588,14 +589,12 @@
 	if ((codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL)) == NULL)
 		return -ENOMEM;
 
-	devdata->codec = codec;
+	socdev->codec = codec;
 	codec->longname = "Corgi Audio Codec";
-	codec->pdev = pdev;
-	codec->machine = devdata->machine;
 	INIT_LIST_HEAD(&codec->dpm_widgets);
 	INIT_LIST_HEAD(&codec->dpm_paths);
 
-	wm8731_device = pdev;
+	wm8731_socdev = socdev;
 
 	if (setup->i2c_address) {
 		normal_i2c[0] = setup->i2c_address;
@@ -614,13 +613,13 @@
 /* power down chip */
 static int wm8731_remove(struct platform_device *pdev)
 {
-	struct snd_soc_platdev_data *devdata = platform_get_drvdata(pdev);
-	struct snd_soc_codec* codec = devdata->codec;
+	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+	struct snd_soc_codec* codec = socdev->codec;
 
 	if (codec->control_data)
 		wm8731_dpm_event(codec, SNDRV_CTL_POWER_D3cold);
 
-	snd_soc_free_pcms(codec);
+	snd_soc_free_pcms(socdev);
 	i2c_del_driver(&wm8731_i2c_driver);
 	kfree(codec);
 
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:40:21.000000000 +0000
+++ linux-2.6.15-rc2/sound/soc/pxa/corgi.c	2005-12-04 18:54:09.000000000 +0000
@@ -59,8 +59,6 @@
 #define warn(format, arg...) printk(KERN_WARNING PFX ": " format "\n" , ## arg)
 
 
-static struct snd_soc_machine corgi;
-
 static int corgi_startup(snd_pcm_substream_t *substream)
 {
 	return 0;
@@ -230,7 +228,6 @@
 	.suspend = corgi_suspend,
 	.resume = corgi_resume,
 	.ops = &corgi_ops,
-	.platform = &pxa2xx_soc_platform,
 	.config = codecs,
 	.nconfigs = ARRAY_SIZE(codecs),
 };
@@ -239,7 +236,7 @@
 	.i2c_address = 0x1b,
 };
 
-static struct snd_soc_platdev_data corgi_snd_devdata = {
+static struct snd_soc_device corgi_snd_devdata = {
 	.machine = &snd_soc_machine_corgi,
 	.platform = &pxa2xx_soc_platform,
 	.codec_dev = &soc_codec_dev_wm8731,
@@ -252,13 +249,12 @@
 {
 	int ret;
 
-	pxa_i2s_interface.machine = &corgi;
-
 	corgi_snd_device = platform_device_alloc("soc-audio", -1);
 	if (!corgi_snd_device)
 		return -ENOMEM;
 
 	platform_set_drvdata(corgi_snd_device, &corgi_snd_devdata);
+	corgi_snd_devdata.dev = &corgi_snd_device->dev;
 	ret = platform_device_add(corgi_snd_device);
 
 	if (ret)
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 16:49:05.000000000 +0000
+++ linux-2.6.15-rc2/sound/soc/soc-core.c	2005-12-04 20:22:30.000000000 +0000
@@ -149,10 +149,11 @@
 static int soc_pcm_open(snd_pcm_substream_t *substream)
 {
 	struct snd_soc_pcm_codec *pcm_c = substream->private_data;
-	struct snd_soc_pcm_interface *pcm_i = pcm_c->pcm_i;
 	snd_pcm_runtime_t *runtime = substream->runtime;
-	struct snd_soc_machine *machine = pcm_i->machine; 
-	struct snd_soc_platform *platform = machine->platform;
+	struct snd_soc_pcm_interface *pcm_i = pcm_c->pcm_i;
+	struct snd_soc_device *socdev = pcm_i->socdev;
+	struct snd_soc_machine *machine = socdev->machine; 
+	struct snd_soc_platform *platform = socdev->platform;
 	int ret = 0;
 
 	/* Check that the codec and SoC audio interface's are compatible */
@@ -246,8 +247,9 @@
 {
 	struct snd_soc_pcm_codec *pcm_c = substream->private_data;
 	struct snd_soc_pcm_interface *pcm_i = pcm_c->pcm_i;
-	struct snd_soc_machine *machine = pcm_i->machine; 
-	struct snd_soc_platform *platform = machine->platform;
+	struct snd_soc_device *socdev = pcm_i->socdev;
+	struct snd_soc_machine *machine = socdev->machine; 
+	struct snd_soc_platform *platform = socdev->platform;
 
 	if(pcm_i->ops.shutdown)
 		pcm_i->ops.shutdown(substream);
@@ -270,8 +272,8 @@
 {
 	struct snd_soc_pcm_codec *pcm_c = substream->private_data;
 	struct snd_soc_pcm_interface *pcm_i = pcm_c->pcm_i;
-	struct snd_soc_machine *machine = pcm_i->machine; 
-	struct snd_soc_platform *platform = machine->platform;
+	struct snd_soc_device *socdev = pcm_i->socdev;
+	struct snd_soc_platform *platform = socdev->platform;
 	int ret = 0;
 	
 	if(platform->pcm_ops->prepare)
@@ -293,8 +295,8 @@
 {
 	struct snd_soc_pcm_codec *pcm_c = substream->private_data;
 	struct snd_soc_pcm_interface *pcm_i = pcm_c->pcm_i;
-	struct snd_soc_machine *machine = pcm_i->machine; 
-	struct snd_soc_platform *platform = machine->platform;
+	struct snd_soc_device *socdev = pcm_i->socdev;
+	struct snd_soc_platform *platform = socdev->platform;
 	int ret = 0;
 
 	if(pcm_c->ops.trigger)
@@ -320,9 +322,9 @@
 {
 	struct snd_soc_pcm_codec *pcm_c = substream->private_data;
 	struct snd_soc_pcm_interface *pcm_i = pcm_c->pcm_i;
-	struct snd_soc_codec *codec = (struct snd_soc_codec*)pcm_i->card->private_data;
-	struct snd_soc_machine *machine = pcm_i->machine; 
-	struct snd_soc_platform *platform = machine->platform;
+	struct snd_soc_device *socdev = pcm_i->socdev;
+	struct snd_soc_platform *platform = socdev->platform;
+	struct snd_soc_codec *codec = socdev->codec;
 	int ret = 0;
 
 	/* prepare hw non AC97 only */
@@ -389,9 +391,9 @@
 {
 	struct snd_soc_pcm_codec *pcm_c = substream->private_data;
 	struct snd_soc_pcm_interface *pcm_i = pcm_c->pcm_i;
-	struct snd_soc_codec *codec = (struct snd_soc_codec*)pcm_i->card->private_data;
-	struct snd_soc_machine *machine = pcm_i->machine; 
-	struct snd_soc_platform *platform = machine->platform;
+	struct snd_soc_device *socdev = pcm_i->socdev;
+	struct snd_soc_platform *platform = socdev->platform;
+	struct snd_soc_codec *codec = socdev->codec;
 
 	if(pcm_c->ops.hw_free)
 		pcm_c->ops.hw_free(substream);
@@ -463,10 +465,10 @@
  */
 static int soc_suspend(struct platform_device *pdev, pm_message_t state)
 {
-	struct snd_soc_platdev_data *devdata = platform_get_drvdata(pdev);
-	struct snd_soc_machine *machine = devdata->machine;
-	struct snd_soc_platform *platform = devdata->platform;
-	struct snd_soc_codec_device* codec_dev = devdata->codec_dev;
+	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+	struct snd_soc_machine *machine = socdev->machine;
+	struct snd_soc_platform *platform = socdev->platform;
+	struct snd_soc_codec_device* codec_dev = socdev->codec_dev;
 	int i;
 	
 	for(i = 0; i < machine->nconfigs; i++) {
@@ -488,10 +490,10 @@
 
 static int soc_resume(struct platform_device *pdev)
 {
-	struct snd_soc_platdev_data *devdata = platform_get_drvdata(pdev);
-	struct snd_soc_machine *machine = devdata->machine;
-	struct snd_soc_platform *platform = devdata->platform;
-	struct snd_soc_codec_device* codec_dev = devdata->codec_dev;
+	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+	struct snd_soc_machine *machine = socdev->machine;
+	struct snd_soc_platform *platform = socdev->platform;
+	struct snd_soc_codec_device* codec_dev = socdev->codec_dev;
 	int i;
 	
 	if (machine->resume)
@@ -519,10 +521,10 @@
 static int soc_probe(struct platform_device *pdev)
 {
 	int ret = 0, i;
-	struct snd_soc_platdev_data *devdata = platform_get_drvdata(pdev);
-	struct snd_soc_machine *machine = devdata->machine;
-	struct snd_soc_platform *platform = devdata->platform;
-	struct snd_soc_codec_device* codec_dev = devdata->codec_dev;
+	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+	struct snd_soc_machine *machine = socdev->machine;
+	struct snd_soc_platform *platform = socdev->platform;
+	struct snd_soc_codec_device* codec_dev = socdev->codec_dev;
 
 	if (machine->probe && ((ret = machine->probe(pdev)) < 0))
 		return ret;
@@ -544,7 +546,7 @@
 iface_err:
 	for (; i > 0; --i) {
 		struct snd_soc_pcm_interface  *iface = machine->config[i].iface;
-		if (iface->remove)
+		if (iface->remove) 
 			iface->remove(pdev);
 	}
 	
@@ -563,10 +565,10 @@
 static int soc_remove(struct platform_device *pdev)
 {
 	int i;
-	struct snd_soc_platdev_data *devdata = platform_get_drvdata(pdev);
-	struct snd_soc_machine *machine = devdata->machine;
-	struct snd_soc_platform *platform = devdata->platform;
-	struct snd_soc_codec_device* codec_dev = devdata->codec_dev;
+	struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+	struct snd_soc_machine *machine = socdev->machine;
+	struct snd_soc_platform *platform = socdev->platform;
+	struct snd_soc_codec_device* codec_dev = socdev->codec_dev;
 
 	for (i = 0; i < machine->nconfigs; i++) {
 		struct snd_soc_pcm_interface  *iface = machine->config[i].iface;
@@ -596,10 +598,11 @@
 	.resume		= soc_resume,
 };
 
-static int soc_create_pcm(struct snd_soc_codec *codec, 
+static int soc_create_pcm(struct snd_soc_device *socdev, 
 	struct snd_soc_pcm_codec *pcm_c, struct snd_soc_pcm_interface *iface, 
 	int num)
 {
+	struct snd_soc_codec *codec = socdev->codec;
 	snd_pcm_t *pcm;
 	char new_name[32];
 	int ret = 0;
@@ -615,12 +618,12 @@
 	pcm_c->codec = codec;
 	iface->card = codec->card;
 	iface->pcm_c = pcm_c;
-	iface->machine = codec->machine;
+	iface->socdev = socdev;
 	pcm->private_data = pcm_c;
 
-	soc_pcm_ops.mmap = codec->machine->platform->pcm_ops->mmap;
-	soc_pcm_ops.pointer = codec->machine->platform->pcm_ops->pointer;
-	soc_pcm_ops.ioctl = codec->machine->platform->pcm_ops->ioctl;
+	soc_pcm_ops.mmap = socdev->platform->pcm_ops->mmap;
+	soc_pcm_ops.pointer = socdev->platform->pcm_ops->pointer;
+	soc_pcm_ops.ioctl = socdev->platform->pcm_ops->ioctl;
 
 	if (pcm_c->nplayback)
 		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &soc_pcm_ops);
@@ -628,25 +631,26 @@
 	if (pcm_c->ncapture)
 		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &soc_pcm_ops);
 
-	if((ret = codec->machine->platform->pcm_new(codec->card, pcm_c, pcm)) < 0) {
+	if((ret = socdev->platform->pcm_new(codec->card, pcm_c, pcm)) < 0) {
 		printk(KERN_ERR "soc: platform pcm constructor failed\n");
 		return ret;
 	}
 
-	pcm->private_free = codec->machine->platform->pcm_free;
+	pcm->private_free = socdev->platform->pcm_free;
 	printk(KERN_INFO "soc: %s <-> %s mapping ok\n", pcm_c->name, iface->name);
 	return ret;
 }
 
-static int soc_match_pcms(struct snd_soc_codec *codec)
+static int soc_match_pcms(struct snd_soc_device *socdev)
 {
-	struct snd_soc_machine *machine = codec->machine;
+	struct snd_soc_codec *codec = socdev->codec;
+	struct snd_soc_machine *machine = socdev->machine;
 	int n = 0, i, j;
 
 	for(i = 0; i < machine->nconfigs; i++) {
 		for(j = 0; j < codec->npcms; j++) {
 			if(!strcmp(codec->pcms[j].name, machine->config[i].sname)) {
-				soc_create_pcm(codec, &codec->pcms[j], machine->config[i].iface, n);
+				soc_create_pcm(socdev, &codec->pcms[j], machine->config[i].iface, n);
 				n++;
 			}
 		}			
@@ -655,8 +659,9 @@
 	return n;
 }
 
-int snd_soc_register_pcms(struct snd_soc_codec *codec)
+int snd_soc_register_pcms(struct snd_soc_device *socdev)
 {
+	struct snd_soc_codec *codec = socdev->codec;
 	int ret = 0;
 
 	/* register a sound card */
@@ -666,11 +671,11 @@
 		return -ENODEV;
 	}
 
-	codec->card->dev = &codec->pdev->dev;
+	codec->card->dev = socdev->dev;
 	codec->card->private_data = codec;
 	strncpy(codec->card->driver, codec->name, sizeof(codec->card->driver));
 	
-	if(soc_match_pcms(codec) == 0){
+	if(soc_match_pcms(socdev) == 0){
 		printk(KERN_ERR "soc: couldn't match any pcms for %s\n", codec->name);
 		return -ENODEV;
 	}
@@ -679,13 +684,14 @@
 
 }
 
-int snd_soc_register_card(struct snd_soc_codec *codec)
+int snd_soc_register_card(struct snd_soc_device *socdev)
 {
+	struct snd_soc_codec *codec = socdev->codec;
 	int ret = 0, i;
 	
 	for(i = 0; i < codec->npcms; i++) {
-		if(codec->machine->config[i].init)
-			codec->machine->config[i].init(codec);
+		if(socdev->machine->config[i].init)
+			socdev->machine->config[i].init(codec);
 	}
 	snprintf(codec->card->shortname, sizeof(codec->card->shortname),
 		 "%s", codec->name);
@@ -697,13 +703,15 @@
 		return ret;
 	}
 	
-	snd_soc_dpm_sys_add(&codec->pdev->dev);
+	snd_soc_dpm_sys_add(socdev->dev);
 	return ret;
 }
 
-void snd_soc_free_pcms(struct snd_soc_codec *codec)
+void snd_soc_free_pcms(struct snd_soc_device *socdev)
 {
-	snd_soc_dpm_sys_remove(&codec->pdev->dev);
+	struct snd_soc_codec *codec = socdev->codec;
+
+	snd_soc_dpm_sys_remove(socdev->dev);
 	soc_free_dpm_widgets(codec);
 	snd_card_free(codec->card);
 }
@@ -809,10 +817,7 @@
 
 int snd_soc_info_volsw_bool_ext(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
 {
-	int mask = kcontrol->private_value;
-
 	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
-	//SNDRV_CTL_ELEM_TYPE_INTEGER;
 	uinfo->count = 1;
 	uinfo->value.integer.min = 0;
 	uinfo->value.integer.max = 1;
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:48.000000000 +0000
+++ linux-2.6.15-rc2/sound/soc/soc-dpm.c	2005-12-04 17:05:19.000000000 +0000
@@ -636,7 +636,7 @@
 
 static ssize_t dpm_status_show(struct device *dev, struct device_attribute *attr, char *buf)   \
 {
-	struct snd_soc_platdev_data *devdata = dev_get_drvdata(dev);
+	struct snd_soc_device *devdata = dev_get_drvdata(dev);
 	struct snd_soc_codec* codec = devdata->codec;
 	struct snd_soc_dpm_widget *w = NULL;
 	struct list_head *l = NULL;
