diff options
| author | Paul Mackerras <paulus@samba.org> | 2008-09-10 11:36:13 +1000 | 
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2008-09-10 11:36:13 +1000 | 
| commit | 7e392f8c29ee045c6a29d50193d2fb10712eceb0 (patch) | |
| tree | c84097fe644c50c82f087ab7fa2d75167b8c0e16 /sound | |
| parent | 7713fef06517d216f96ee7c8ad750e72bc08d38f (diff) | |
| parent | 93811d94f7e9bcfeed7d6ba75ea5d9c80a70ab95 (diff) | |
| download | kernel_samsung_tuna-7e392f8c29ee045c6a29d50193d2fb10712eceb0.zip kernel_samsung_tuna-7e392f8c29ee045c6a29d50193d2fb10712eceb0.tar.gz kernel_samsung_tuna-7e392f8c29ee045c6a29d50193d2fb10712eceb0.tar.bz2  | |
Merge branch 'linux-2.6'
Diffstat (limited to 'sound')
| -rw-r--r-- | sound/Kconfig | 4 | ||||
| -rw-r--r-- | sound/mips/au1x00.c | 1 | ||||
| -rw-r--r-- | sound/pci/ca0106/ca0106_main.c | 5 | ||||
| -rw-r--r-- | sound/pci/hda/hda_intel.c | 9 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 30 | ||||
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 5 | ||||
| -rw-r--r-- | sound/pci/oxygen/hifier.c | 4 | ||||
| -rw-r--r-- | sound/pci/oxygen/oxygen.c | 4 | ||||
| -rw-r--r-- | sound/pci/oxygen/oxygen_mixer.c | 5 | ||||
| -rw-r--r-- | sound/soc/at91/eti_b1_wm8731.c | 1 | ||||
| -rw-r--r-- | sound/soc/codecs/ak4535.c | 11 | ||||
| -rw-r--r-- | sound/soc/codecs/tlv320aic3x.c | 11 | ||||
| -rw-r--r-- | sound/soc/codecs/uda1380.c | 9 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8510.c | 9 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8731.c | 11 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8750.c | 10 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8753.c | 12 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8990.c | 11 | ||||
| -rw-r--r-- | sound/soc/codecs/wm9712.c | 1 | ||||
| -rw-r--r-- | sound/soc/omap/n810.c | 18 | ||||
| -rw-r--r-- | sound/soc/pxa/pxa2xx-i2s.c | 40 | 
21 files changed, 159 insertions, 52 deletions
diff --git a/sound/Kconfig b/sound/Kconfig index a37bee0..8ebf512 100644 --- a/sound/Kconfig +++ b/sound/Kconfig @@ -91,6 +91,9 @@ endif # SOUND_PRIME  endif # !M68K +endif # SOUND + +# AC97_BUS is used from both sound and ucb1400  config AC97_BUS  	tristate  	help @@ -99,4 +102,3 @@ config AC97_BUS  	  sound although they're sharing the AC97 bus. Concerned drivers  	  should "select" this. -endif # SOUND diff --git a/sound/mips/au1x00.c b/sound/mips/au1x00.c index ee0741f..fbef38a 100644 --- a/sound/mips/au1x00.c +++ b/sound/mips/au1x00.c @@ -38,7 +38,6 @@  #include <linux/interrupt.h>  #include <linux/init.h>  #include <linux/slab.h> -#include <linux/version.h>  #include <sound/core.h>  #include <sound/initval.h>  #include <sound/pcm.h> diff --git a/sound/pci/ca0106/ca0106_main.c b/sound/pci/ca0106/ca0106_main.c index 2f8b28a..6abe8a3 100644 --- a/sound/pci/ca0106/ca0106_main.c +++ b/sound/pci/ca0106/ca0106_main.c @@ -249,11 +249,12 @@ static struct snd_ca0106_details ca0106_chip_details[] = {  	   .name   = "MSI K8N Diamond MB [SB0438]",  	   .gpio_type = 2,  	   .i2c_adc = 1 } , -	 /* Another MSI K8N Diamond MB, which has apprently a different SSID */ +	 /* MSI K8N Diamond PLUS MB */  	 { .serial = 0x10091102,  	   .name   = "MSI K8N Diamond MB",  	   .gpio_type = 2, -	   .i2c_adc = 1 } , +	   .i2c_adc = 1, +	   .spi_dac = 2 },  	 /* Shuttle XPC SD31P which has an onboard Creative Labs  	  * Sound Blaster Live! 24-bit EAX  	  * high-definition 7.1 audio processor". diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index a73d6ca..1c53e33 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -278,6 +278,9 @@ enum {  /* Defines for Nvidia HDA support */  #define NVIDIA_HDA_TRANSREG_ADDR      0x4e  #define NVIDIA_HDA_ENABLE_COHBITS     0x0f +#define NVIDIA_HDA_ISTRM_COH          0x4d +#define NVIDIA_HDA_OSTRM_COH          0x4c +#define NVIDIA_HDA_ENABLE_COHBIT      0x01  /* Defines for Intel SCH HDA snoop control */  #define INTEL_SCH_HDA_DEVC      0x78 @@ -900,6 +903,12 @@ static void azx_init_pci(struct azx *chip)  		update_pci_byte(chip->pci,  				NVIDIA_HDA_TRANSREG_ADDR,  				0x0f, NVIDIA_HDA_ENABLE_COHBITS); +		update_pci_byte(chip->pci, +				NVIDIA_HDA_ISTRM_COH, +				0x01, NVIDIA_HDA_ENABLE_COHBIT); +		update_pci_byte(chip->pci, +				NVIDIA_HDA_OSTRM_COH, +				0x01, NVIDIA_HDA_ENABLE_COHBIT);  		break;  	case AZX_DRIVER_SCH:  		pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop); diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index b80e725..6602516 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -952,7 +952,7 @@ do_sku:  					    tmp | 0x2010);  			break;  		case 0x10ec0888: -			alc888_coef_init(codec); +			/*alc888_coef_init(codec);*/ /* called in alc_init() */  			break;  		case 0x10ec0267:  		case 0x10ec0268: @@ -2439,6 +2439,8 @@ static int alc_init(struct hda_codec *codec)  	unsigned int i;  	alc_fix_pll(codec); +	if (codec->vendor_id == 0x10ec0888) +		alc888_coef_init(codec);  	for (i = 0; i < spec->num_init_verbs; i++)  		snd_hda_sequence_write(codec, spec->init_verbs[i]); @@ -6195,7 +6197,6 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = {  	SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),  	SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),  	SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG), -	SND_PCI_QUIRK(0x106b, 0x00a0, "Apple iMac 24''", ALC885_IMAC24),  	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),  	SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8  */  	SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG), @@ -8426,8 +8427,6 @@ static int patch_alc883(struct hda_codec *codec)  	codec->patch_ops = alc_patch_ops;  	if (board_config == ALC883_AUTO)  		spec->init_hook = alc883_auto_init; -	else if (codec->vendor_id == 0x10ec0888) -		spec->init_hook = alc888_coef_init;  #ifdef CONFIG_SND_HDA_POWER_SAVE  	if (!spec->loopback.amplist) @@ -14067,6 +14066,13 @@ static struct hda_verb alc662_auto_init_verbs[] = {  	{ }  }; +/* additional verbs for ALC663 */ +static struct hda_verb alc663_auto_init_verbs[] = { +	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, +	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, +	{ } +}; +  static struct hda_verb alc663_m51va_init_verbs[] = {  	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},  	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, @@ -14595,6 +14601,14 @@ static int alc662_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,  	if (!pin)  		return 0; +	if (pin == 0x17) { +		/* ALC663 has a mono output pin on 0x17 */ +		sprintf(name, "%s Playback Switch", pfx); +		err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, +				  HDA_COMPOSE_AMP_VAL(pin, 2, 0, HDA_OUTPUT)); +		return err; +	} +  	if (alc880_is_fixed_pin(pin)) {  		nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));                  /* printk("DAC nid=%x\n",nid); */ @@ -14765,6 +14779,14 @@ static int alc662_parse_auto_config(struct hda_codec *codec)  	spec->input_mux = &spec->private_imux;  	spec->init_verbs[spec->num_init_verbs++] = alc662_auto_init_verbs; +	if (codec->vendor_id == 0x10ec0663) +		spec->init_verbs[spec->num_init_verbs++] = +			alc663_auto_init_verbs; + +	err = alc_auto_add_mic_boost(codec); +	if (err < 0) +		return err; +  	spec->mixers[spec->num_mixers] = alc662_capture_mixer;  	spec->num_mixers++;  	return 1; diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 7fdafcb..ad994fc 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -560,8 +560,9 @@ static struct hda_verb dell_eq_core_init[] = {  };  static struct hda_verb dell_m6_core_init[] = { -	/* set master volume and direct control */ -	{ 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, +	/* set master volume to max value without distortion +	 * and direct control */ +	{ 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec},  	/* setup audio connections */  	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},  	{ 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01}, diff --git a/sound/pci/oxygen/hifier.c b/sound/pci/oxygen/hifier.c index 7442460..dad393a 100644 --- a/sound/pci/oxygen/hifier.c +++ b/sound/pci/oxygen/hifier.c @@ -17,6 +17,7 @@   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   */ +#include <linux/delay.h>  #include <linux/pci.h>  #include <sound/control.h>  #include <sound/core.h> @@ -107,6 +108,9 @@ static void set_ak4396_params(struct oxygen *chip,  	else  		value |= AK4396_DFS_QUAD;  	data->ak4396_ctl2 = value; + +	msleep(1); /* wait for the new MCLK to become stable */ +  	ak4396_write(chip, AK4396_CONTROL_1, AK4396_DIF_24_MSB);  	ak4396_write(chip, AK4396_CONTROL_2, value);  	ak4396_write(chip, AK4396_CONTROL_1, AK4396_DIF_24_MSB | AK4396_RSTN); diff --git a/sound/pci/oxygen/oxygen.c b/sound/pci/oxygen/oxygen.c index 7c8ae31..c5829d3 100644 --- a/sound/pci/oxygen/oxygen.c +++ b/sound/pci/oxygen/oxygen.c @@ -28,6 +28,7 @@   * GPIO 1 -> DFS1 of AK5385   */ +#include <linux/delay.h>  #include <linux/mutex.h>  #include <linux/pci.h>  #include <sound/ac97_codec.h> @@ -213,6 +214,9 @@ static void set_ak4396_params(struct oxygen *chip,  	else  		value |= AK4396_DFS_QUAD;  	data->ak4396_ctl2 = value; + +	msleep(1); /* wait for the new MCLK to become stable */ +  	for (i = 0; i < 4; ++i) {  		ak4396_write(chip, i,  			     AK4396_CONTROL_1, AK4396_DIF_24_MSB); diff --git a/sound/pci/oxygen/oxygen_mixer.c b/sound/pci/oxygen/oxygen_mixer.c index 6facac5..05eb899 100644 --- a/sound/pci/oxygen/oxygen_mixer.c +++ b/sound/pci/oxygen/oxygen_mixer.c @@ -512,9 +512,12 @@ static int ac97_switch_get(struct snd_kcontrol *ctl,  static void mute_ac97_ctl(struct oxygen *chip, unsigned int control)  { -	unsigned int priv_idx = chip->controls[control]->private_value & 0xff; +	unsigned int priv_idx;  	u16 value; +	if (!chip->controls[control]) +		return; +	priv_idx = chip->controls[control]->private_value & 0xff;  	value = oxygen_read_ac97(chip, 0, priv_idx);  	if (!(value & 0x8000)) {  		oxygen_write_ac97(chip, 0, priv_idx, value | 0x8000); diff --git a/sound/soc/at91/eti_b1_wm8731.c b/sound/soc/at91/eti_b1_wm8731.c index b081e83..b81d6b2 100644 --- a/sound/soc/at91/eti_b1_wm8731.c +++ b/sound/soc/at91/eti_b1_wm8731.c @@ -22,7 +22,6 @@  #include <linux/module.h>  #include <linux/moduleparam.h> -#include <linux/version.h>  #include <linux/kernel.h>  #include <linux/clk.h>  #include <linux/timer.h> diff --git a/sound/soc/codecs/ak4535.c b/sound/soc/codecs/ak4535.c index b26003c..7da9f46 100644 --- a/sound/soc/codecs/ak4535.c +++ b/sound/soc/codecs/ak4535.c @@ -562,10 +562,9 @@ static int ak4535_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	client_template.addr = addr;  	i2c = kmemdup(&client_template, sizeof(client_template), GFP_KERNEL); -	if (i2c == NULL) { -		kfree(codec); +	if (i2c == NULL)  		return -ENOMEM; -	} +  	i2c_set_clientdata(i2c, codec);  	codec->control_data = i2c; @@ -583,7 +582,6 @@ static int ak4535_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	return ret;  err: -	kfree(codec);  	kfree(i2c);  	return ret;  } @@ -660,6 +658,11 @@ static int ak4535_probe(struct platform_device *pdev)  #else  	/* Add other interfaces here */  #endif + +	if (ret != 0) { +		kfree(codec->private_data); +		kfree(codec); +	}  	return ret;  } diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index b1dce5f..5f9abb1 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c @@ -1199,10 +1199,9 @@ static int aic3x_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	client_template.addr = addr;  	i2c = kmemdup(&client_template, sizeof(client_template), GFP_KERNEL); -	if (i2c == NULL) { -		kfree(codec); +	if (i2c == NULL)  		return -ENOMEM; -	} +  	i2c_set_clientdata(i2c, codec);  	codec->control_data = i2c; @@ -1221,7 +1220,6 @@ static int aic3x_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	return ret;  err: -	kfree(codec);  	kfree(i2c);  	return ret;  } @@ -1302,6 +1300,11 @@ static int aic3x_probe(struct platform_device *pdev)  #else  	/* Add other interfaces here */  #endif + +	if (ret != 0) { +		kfree(codec->private_data); +		kfree(codec); +	}  	return ret;  } diff --git a/sound/soc/codecs/uda1380.c b/sound/soc/codecs/uda1380.c index a52d6d9..807318f 100644 --- a/sound/soc/codecs/uda1380.c +++ b/sound/soc/codecs/uda1380.c @@ -729,10 +729,9 @@ static int uda1380_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	client_template.addr = addr;  	i2c = kmemdup(&client_template, sizeof(client_template), GFP_KERNEL); -	if (i2c == NULL) { -		kfree(codec); +	if (i2c == NULL)  		return -ENOMEM; -	} +  	i2c_set_clientdata(i2c, codec);  	codec->control_data = i2c; @@ -750,7 +749,6 @@ static int uda1380_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	return ret;  err: -	kfree(codec);  	kfree(i2c);  	return ret;  } @@ -817,6 +815,9 @@ static int uda1380_probe(struct platform_device *pdev)  #else  	/* Add other interfaces here */  #endif + +	if (ret != 0) +		kfree(codec);  	return ret;  } diff --git a/sound/soc/codecs/wm8510.c b/sound/soc/codecs/wm8510.c index 67325fd..3d998e6 100644 --- a/sound/soc/codecs/wm8510.c +++ b/sound/soc/codecs/wm8510.c @@ -693,10 +693,9 @@ static int wm8510_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	client_template.addr = addr;  	i2c = kmemdup(&client_template, sizeof(client_template), GFP_KERNEL); -	if (i2c == NULL) { -		kfree(codec); +	if (i2c == NULL)  		return -ENOMEM; -	} +  	i2c_set_clientdata(i2c, codec);  	codec->control_data = i2c; @@ -714,7 +713,6 @@ static int wm8510_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	return ret;  err: -	kfree(codec);  	kfree(i2c);  	return ret;  } @@ -782,6 +780,9 @@ static int wm8510_probe(struct platform_device *pdev)  #else  	/* Add other interfaces here */  #endif + +	if (ret != 0) +		kfree(codec);  	return ret;  } diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c index 369d39c..9402fca 100644 --- a/sound/soc/codecs/wm8731.c +++ b/sound/soc/codecs/wm8731.c @@ -596,10 +596,9 @@ static int wm8731_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	client_template.addr = addr;  	i2c = kmemdup(&client_template, sizeof(client_template), GFP_KERNEL); -	if (i2c == NULL) { -		kfree(codec); +	if (i2c == NULL)  		return -ENOMEM; -	} +  	i2c_set_clientdata(i2c, codec);  	codec->control_data = i2c; @@ -617,7 +616,6 @@ static int wm8731_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	return ret;  err: -	kfree(codec);  	kfree(i2c);  	return ret;  } @@ -693,6 +691,11 @@ static int wm8731_probe(struct platform_device *pdev)  #else  	/* Add other interfaces here */  #endif + +	if (ret != 0) { +		kfree(codec->private_data); +		kfree(codec); +	}  	return ret;  } diff --git a/sound/soc/codecs/wm8750.c b/sound/soc/codecs/wm8750.c index c6a8edf..dd1f554 100644 --- a/sound/soc/codecs/wm8750.c +++ b/sound/soc/codecs/wm8750.c @@ -869,10 +869,9 @@ static int wm8750_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	client_template.addr = addr;  	i2c = kmemdup(&client_template, sizeof(client_template), GFP_KERNEL); -	if (i2c == NULL) { -		kfree(codec); +	if (i2c == NULL)  		return -ENOMEM; -	} +  	i2c_set_clientdata(i2c, codec);  	codec->control_data = i2c; @@ -890,7 +889,6 @@ static int wm8750_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	return ret;  err: -	kfree(codec);  	kfree(i2c);  	return ret;  } @@ -966,6 +964,10 @@ static int wm8750_probe(struct platform_device *pdev)  		/* Add other interfaces here */  #endif +	if (ret != 0) { +		kfree(codec->private_data); +		kfree(codec); +	}  	return ret;  } diff --git a/sound/soc/codecs/wm8753.c b/sound/soc/codecs/wm8753.c index 8604809..5761164 100644 --- a/sound/soc/codecs/wm8753.c +++ b/sound/soc/codecs/wm8753.c @@ -34,7 +34,6 @@  #include <linux/module.h>  #include <linux/moduleparam.h> -#include <linux/version.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/delay.h> @@ -1661,10 +1660,9 @@ static int wm8753_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	client_template.addr = addr;  	i2c =  kmemdup(&client_template, sizeof(client_template), GFP_KERNEL); -	if (!i2c) { -		kfree(codec); +	if (!i2c)  		return -ENOMEM; -	} +  	i2c_set_clientdata(i2c, codec);  	codec->control_data = i2c; @@ -1683,7 +1681,6 @@ static int wm8753_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	return ret;  err: -	kfree(codec);  	kfree(i2c);  	return ret;  } @@ -1760,6 +1757,11 @@ static int wm8753_probe(struct platform_device *pdev)  #else  		/* Add other interfaces here */  #endif + +	if (ret != 0) { +		kfree(codec->private_data); +		kfree(codec); +	}  	return ret;  } diff --git a/sound/soc/codecs/wm8990.c b/sound/soc/codecs/wm8990.c index e44153f..dd995ef 100644 --- a/sound/soc/codecs/wm8990.c +++ b/sound/soc/codecs/wm8990.c @@ -1500,10 +1500,9 @@ static int wm8990_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	client_template.addr = addr;  	i2c =  kmemdup(&client_template, sizeof(client_template), GFP_KERNEL); -	if (i2c == NULL) { -		kfree(codec); +	if (i2c == NULL)  		return -ENOMEM; -	} +  	i2c_set_clientdata(i2c, codec);  	codec->control_data = i2c; @@ -1521,7 +1520,6 @@ static int wm8990_codec_probe(struct i2c_adapter *adap, int addr, int kind)  	return ret;  err: -	kfree(codec);  	kfree(i2c);  	return ret;  } @@ -1595,6 +1593,11 @@ static int wm8990_probe(struct platform_device *pdev)  #else  		/* Add other interfaces here */  #endif + +	if (ret != 0) { +		kfree(codec->private_data); +		kfree(codec); +	}  	return ret;  } diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c index 1fb7f9a..2f1c91b 100644 --- a/sound/soc/codecs/wm9712.c +++ b/sound/soc/codecs/wm9712.c @@ -13,7 +13,6 @@  #include <linux/init.h>  #include <linux/module.h> -#include <linux/version.h>  #include <linux/kernel.h>  #include <linux/device.h>  #include <sound/core.h> diff --git a/sound/soc/omap/n810.c b/sound/soc/omap/n810.c index 7694621..87d0ed0 100644 --- a/sound/soc/omap/n810.c +++ b/sound/soc/omap/n810.c @@ -329,12 +329,14 @@ static int __init n810_soc_init(void)  	sys_clkout2_src = clk_get(dev, "sys_clkout2_src");  	if (IS_ERR(sys_clkout2_src)) {  		dev_err(dev, "Could not get sys_clkout2_src clock\n"); -		return -ENODEV; +		err = PTR_ERR(sys_clkout2_src); +		goto err2;  	}  	sys_clkout2 = clk_get(dev, "sys_clkout2");  	if (IS_ERR(sys_clkout2)) {  		dev_err(dev, "Could not get sys_clkout2\n"); -		goto err1; +		err = PTR_ERR(sys_clkout2); +		goto err3;  	}  	/*  	 * Configure 12 MHz output on SYS_CLKOUT2. Therefore we must use @@ -343,7 +345,8 @@ static int __init n810_soc_init(void)  	func96m_clk = clk_get(dev, "func_96m_ck");  	if (IS_ERR(func96m_clk)) {  		dev_err(dev, "Could not get func 96M clock\n"); -		goto err2; +		err = PTR_ERR(func96m_clk); +		goto err4;  	}  	clk_set_parent(sys_clkout2_src, func96m_clk);  	clk_set_rate(sys_clkout2, 12000000); @@ -356,20 +359,25 @@ static int __init n810_soc_init(void)  	gpio_direction_output(N810_SPEAKER_AMP_GPIO, 0);  	return 0; -err2: +err4:  	clk_put(sys_clkout2); +err3: +	clk_put(sys_clkout2_src); +err2:  	platform_device_del(n810_snd_device);  err1:  	platform_device_put(n810_snd_device);  	return err; -  }  static void __exit n810_soc_exit(void)  {  	gpio_free(N810_SPEAKER_AMP_GPIO);  	gpio_free(N810_HEADSET_AMP_GPIO); +	clk_put(sys_clkout2_src); +	clk_put(sys_clkout2); +	clk_put(func96m_clk);  	platform_device_unregister(n810_snd_device);  } diff --git a/sound/soc/pxa/pxa2xx-i2s.c b/sound/soc/pxa/pxa2xx-i2s.c index 8548818..c796b18 100644 --- a/sound/soc/pxa/pxa2xx-i2s.c +++ b/sound/soc/pxa/pxa2xx-i2s.c @@ -16,6 +16,7 @@  #include <linux/device.h>  #include <linux/delay.h>  #include <linux/clk.h> +#include <linux/platform_device.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/initval.h> @@ -81,7 +82,6 @@ static int pxa2xx_i2s_startup(struct snd_pcm_substream *substream)  	struct snd_soc_pcm_runtime *rtd = substream->private_data;  	struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; -	clk_i2s = clk_get(NULL, "I2SCLK");  	if (IS_ERR(clk_i2s))  		return PTR_ERR(clk_i2s); @@ -152,6 +152,7 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream,  	pxa_gpio_mode(gpio_bus[pxa_i2s.master].tx);  	pxa_gpio_mode(gpio_bus[pxa_i2s.master].frm);  	pxa_gpio_mode(gpio_bus[pxa_i2s.master].clk); +	BUG_ON(IS_ERR(clk_i2s));  	clk_enable(clk_i2s);  	pxa_i2s_wait(); @@ -317,6 +318,43 @@ struct snd_soc_dai pxa_i2s_dai = {  EXPORT_SYMBOL_GPL(pxa_i2s_dai); +static int pxa2xx_i2s_probe(struct platform_device *dev) +{ +	clk_i2s = clk_get(&dev->dev, "I2SCLK"); +	return IS_ERR(clk_i2s) ? PTR_ERR(clk_i2s) : 0; +} + +static int __devexit pxa2xx_i2s_remove(struct platform_device *dev) +{ +	clk_put(clk_i2s); +	clk_i2s = ERR_PTR(-ENOENT); +	return 0; +} + +static struct platform_driver pxa2xx_i2s_driver = { +	.probe = pxa2xx_i2s_probe, +	.remove = __devexit_p(pxa2xx_i2s_remove), + +	.driver = { +		.name = "pxa2xx-i2s", +		.owner = THIS_MODULE, +	}, +}; + +static int __init pxa2xx_i2s_init(void) +{ +	clk_i2s = ERR_PTR(-ENOENT); +	return platform_driver_register(&pxa2xx_i2s_driver); +} + +static void __exit pxa2xx_i2s_exit(void) +{ +	platform_driver_unregister(&pxa2xx_i2s_driver); +} + +module_init(pxa2xx_i2s_init); +module_exit(pxa2xx_i2s_exit); +  /* Module information */  MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");  MODULE_DESCRIPTION("pxa2xx I2S SoC Interface");  | 
