diff options
Diffstat (limited to 'sound')
| -rw-r--r-- | sound/pci/es1968.c | 9 | ||||
| -rw-r--r-- | sound/pci/fm801.c | 9 | ||||
| -rw-r--r-- | sound/pci/hda/hda_codec.c | 13 | ||||
| -rw-r--r-- | sound/pci/hda/hda_codec.h | 1 | ||||
| -rw-r--r-- | sound/pci/hda/hda_intel.c | 39 | ||||
| -rw-r--r-- | sound/pci/hda/patch_cirrus.c | 1 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 2 | ||||
| -rw-r--r-- | sound/soc/codecs/arizona.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/cs4271.c | 11 | ||||
| -rw-r--r-- | sound/soc/codecs/cs42l52.c | 3 | ||||
| -rw-r--r-- | sound/soc/codecs/wm5102.c | 552 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8978.c | 2 | ||||
| -rw-r--r-- | sound/soc/kirkwood/kirkwood-dma.c | 3 | ||||
| -rw-r--r-- | sound/soc/kirkwood/kirkwood-i2s.c | 72 | ||||
| -rw-r--r-- | sound/soc/mxs/mxs-saif.c | 17 | ||||
| -rw-r--r-- | sound/soc/samsung/Kconfig | 2 | ||||
| -rw-r--r-- | sound/soc/samsung/bells.c | 2 | ||||
| -rw-r--r-- | sound/soc/soc-core.c | 5 | ||||
| -rw-r--r-- | sound/soc/soc-dapm.c | 2 | ||||
| -rw-r--r-- | sound/usb/card.c | 6 | ||||
| -rw-r--r-- | sound/usb/midi.c | 8 | ||||
| -rw-r--r-- | sound/usb/pcm.c | 2 | 
22 files changed, 674 insertions, 91 deletions
diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c index 50169bcfd90..7266020c16c 100644 --- a/sound/pci/es1968.c +++ b/sound/pci/es1968.c @@ -2581,9 +2581,14 @@ static u8 snd_es1968_tea575x_get_pins(struct snd_tea575x *tea)  	struct es1968 *chip = tea->private_data;  	unsigned long io = chip->io_port + GPIO_DATA;  	u16 val = inw(io); +	u8 ret; -	return  (val & STR_DATA) ? TEA575X_DATA : 0 | -		(val & STR_MOST) ? TEA575X_MOST : 0; +	ret = 0; +	if (val & STR_DATA) +		ret |= TEA575X_DATA; +	if (val & STR_MOST) +		ret |= TEA575X_MOST; +	return ret;  }  static void snd_es1968_tea575x_set_direction(struct snd_tea575x *tea, bool output) diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c index cc2e91d1553..c5806f89be1 100644 --- a/sound/pci/fm801.c +++ b/sound/pci/fm801.c @@ -767,9 +767,14 @@ static u8 snd_fm801_tea575x_get_pins(struct snd_tea575x *tea)  	struct fm801 *chip = tea->private_data;  	unsigned short reg = inw(FM801_REG(chip, GPIO_CTRL));  	struct snd_fm801_tea575x_gpio gpio = *get_tea575x_gpio(chip); +	u8 ret; -	return  (reg & FM801_GPIO_GP(gpio.data)) ? TEA575X_DATA : 0 | -		(reg & FM801_GPIO_GP(gpio.most)) ? TEA575X_MOST : 0; +	ret = 0; +	if (reg & FM801_GPIO_GP(gpio.data)) +		ret |= TEA575X_DATA; +	if (reg & FM801_GPIO_GP(gpio.most)) +		ret |= TEA575X_MOST; +	return ret;  }  static void snd_fm801_tea575x_set_direction(struct snd_tea575x *tea, bool output) diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 70d4848b5cd..d010de12335 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -95,6 +95,7 @@ int snd_hda_delete_codec_preset(struct hda_codec_preset_list *preset)  EXPORT_SYMBOL_HDA(snd_hda_delete_codec_preset);  #ifdef CONFIG_PM +#define codec_in_pm(codec)	((codec)->in_pm)  static void hda_power_work(struct work_struct *work);  static void hda_keep_power_on(struct hda_codec *codec);  #define hda_codec_is_power_on(codec)	((codec)->power_on) @@ -104,6 +105,7 @@ static inline void hda_call_pm_notify(struct hda_bus *bus, bool power_up)  		bus->ops.pm_notify(bus, power_up);  }  #else +#define codec_in_pm(codec)	0  static inline void hda_keep_power_on(struct hda_codec *codec) {}  #define hda_codec_is_power_on(codec)	1  #define hda_call_pm_notify(bus, state) {} @@ -228,7 +230,7 @@ static int codec_exec_verb(struct hda_codec *codec, unsigned int cmd,  	}  	mutex_unlock(&bus->cmd_mutex);  	snd_hda_power_down(codec); -	if (res && *res == -1 && bus->rirb_error) { +	if (!codec_in_pm(codec) && res && *res == -1 && bus->rirb_error) {  		if (bus->response_reset) {  			snd_printd("hda_codec: resetting BUS due to "  				   "fatal communication error\n"); @@ -238,7 +240,7 @@ static int codec_exec_verb(struct hda_codec *codec, unsigned int cmd,  		goto again;  	}  	/* clear reset-flag when the communication gets recovered */ -	if (!err) +	if (!err || codec_in_pm(codec))  		bus->response_reset = 0;  	return err;  } @@ -3616,6 +3618,8 @@ static unsigned int hda_call_codec_suspend(struct hda_codec *codec, bool in_wq)  {  	unsigned int state; +	codec->in_pm = 1; +  	if (codec->patch_ops.suspend)  		codec->patch_ops.suspend(codec);  	hda_cleanup_all_streams(codec); @@ -3630,6 +3634,7 @@ static unsigned int hda_call_codec_suspend(struct hda_codec *codec, bool in_wq)  	codec->power_transition = 0;  	codec->power_jiffies = jiffies;  	spin_unlock(&codec->power_lock); +	codec->in_pm = 0;  	return state;  } @@ -3638,6 +3643,8 @@ static unsigned int hda_call_codec_suspend(struct hda_codec *codec, bool in_wq)   */  static void hda_call_codec_resume(struct hda_codec *codec)  { +	codec->in_pm = 1; +  	/* set as if powered on for avoiding re-entering the resume  	 * in the resume / power-save sequence  	 */ @@ -3656,6 +3663,8 @@ static void hda_call_codec_resume(struct hda_codec *codec)  		snd_hda_codec_resume_cache(codec);  	}  	snd_hda_jack_report_sync(codec); + +	codec->in_pm = 0;  	snd_hda_power_down(codec); /* flag down before returning */  }  #endif /* CONFIG_PM */ diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 507fe8a917b..4f4e545c0f4 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h @@ -869,6 +869,7 @@ struct hda_codec {  	unsigned int power_on :1;	/* current (global) power-state */  	unsigned int d3_stop_clk:1;	/* support D3 operation without BCLK */  	unsigned int pm_down_notified:1; /* PM notified to controller */ +	unsigned int in_pm:1;		/* suspend/resume being performed */  	int power_transition;	/* power-state in transition */  	int power_count;	/* current (global) power refcount */  	struct delayed_work power_work; /* delayed task for powerdown */ diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index cd2dbaf1be7..f9d870e554d 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -556,6 +556,12 @@ enum {  #define AZX_DCAPS_ALIGN_BUFSIZE	(1 << 22)	/* buffer size alignment */  #define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23)	/* BDLE in 4k boundary */  #define AZX_DCAPS_COUNT_LPIB_DELAY  (1 << 25)	/* Take LPIB as delay */ +#define AZX_DCAPS_PM_RUNTIME	(1 << 26)	/* runtime PM support */ + +/* quirks for Intel PCH */ +#define AZX_DCAPS_INTEL_PCH \ +	(AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_BUFSIZE | \ +	 AZX_DCAPS_COUNT_LPIB_DELAY | AZX_DCAPS_PM_RUNTIME)  /* quirks for ATI SB / AMD Hudson */  #define AZX_DCAPS_PRESET_ATI_SB \ @@ -2433,6 +2439,9 @@ static void azx_power_notify(struct hda_bus *bus, bool power_up)  {  	struct azx *chip = bus->private_data; +	if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME)) +		return; +  	if (power_up)  		pm_runtime_get_sync(&chip->pci->dev);  	else @@ -2548,7 +2557,8 @@ static int azx_runtime_suspend(struct device *dev)  	struct snd_card *card = dev_get_drvdata(dev);  	struct azx *chip = card->private_data; -	if (!power_save_controller) +	if (!power_save_controller || +	    !(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))  		return -EAGAIN;  	azx_stop_chip(chip); @@ -3429,39 +3439,30 @@ static void __devexit azx_remove(struct pci_dev *pci)  static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {  	/* CPT */  	{ PCI_DEVICE(0x8086, 0x1c20), -	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | -	  AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, +	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },  	/* PBG */  	{ PCI_DEVICE(0x8086, 0x1d20), -	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | -	  AZX_DCAPS_BUFSIZE}, +	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },  	/* Panther Point */  	{ PCI_DEVICE(0x8086, 0x1e20), -	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | -	  AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, +	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },  	/* Lynx Point */  	{ PCI_DEVICE(0x8086, 0x8c20), -	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | -	  AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, +	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },  	/* Lynx Point-LP */  	{ PCI_DEVICE(0x8086, 0x9c20), -	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | -	  AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, +	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },  	/* Lynx Point-LP */  	{ PCI_DEVICE(0x8086, 0x9c21), -	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | -	  AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, +	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },  	/* Haswell */  	{ PCI_DEVICE(0x8086, 0x0c0c), -	  .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | -	  AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, +	  .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH },  	{ PCI_DEVICE(0x8086, 0x0d0c), -	  .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | -	  AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, +	  .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH },  	/* 5 Series/3400 */  	{ PCI_DEVICE(0x8086, 0x3b56), -	  .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | -	  AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, +	  .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH },  	/* SCH */  	{ PCI_DEVICE(0x8086, 0x811b),  	  .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index d5f3a26d608..3bcb6717235 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c @@ -466,6 +466,7 @@ static int parse_output(struct hda_codec *codec)  		memcpy(cfg->speaker_pins, cfg->line_out_pins,  		       sizeof(cfg->speaker_pins));  		cfg->line_outs = 0; +		memset(cfg->line_out_pins, 0, sizeof(cfg->line_out_pins));  	}  	return 0; diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index c0ce3b1f04b..ad68d223f8a 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -5407,6 +5407,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {  	SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),  	SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),  	SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 5,1", ALC885_FIXUP_MACPRO_GPIO), +	SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),  	SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),  	SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),  	SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF), @@ -7064,6 +7065,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = {  	{ .id = 0x10ec0282, .name = "ALC282", .patch = patch_alc269 },  	{ .id = 0x10ec0283, .name = "ALC283", .patch = patch_alc269 },  	{ .id = 0x10ec0290, .name = "ALC290", .patch = patch_alc269 }, +	{ .id = 0x10ec0292, .name = "ALC292", .patch = patch_alc269 },  	{ .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",  	  .patch = patch_alc861 },  	{ .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd }, diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c index c03b65af305..054967d8bac 100644 --- a/sound/soc/codecs/arizona.c +++ b/sound/soc/codecs/arizona.c @@ -268,7 +268,7 @@ EXPORT_SYMBOL_GPL(arizona_out_ev);  static unsigned int arizona_sysclk_48k_rates[] = {  	6144000,  	12288000, -	22579200, +	24576000,  	49152000,  	73728000,  	98304000, @@ -278,7 +278,7 @@ static unsigned int arizona_sysclk_48k_rates[] = {  static unsigned int arizona_sysclk_44k1_rates[] = {  	5644800,  	11289600, -	24576000, +	22579200,  	45158400,  	67737600,  	90316800, diff --git a/sound/soc/codecs/cs4271.c b/sound/soc/codecs/cs4271.c index f994af34f55..e3f0a7f3131 100644 --- a/sound/soc/codecs/cs4271.c +++ b/sound/soc/codecs/cs4271.c @@ -485,7 +485,7 @@ static int cs4271_probe(struct snd_soc_codec *codec)  		gpio_nreset = cs4271plat->gpio_nreset;  	if (gpio_nreset >= 0) -		if (gpio_request(gpio_nreset, "CS4271 Reset")) +		if (devm_gpio_request(codec->dev, gpio_nreset, "CS4271 Reset"))  			gpio_nreset = -EINVAL;  	if (gpio_nreset >= 0) {  		/* Reset codec */ @@ -535,15 +535,10 @@ static int cs4271_probe(struct snd_soc_codec *codec)  static int cs4271_remove(struct snd_soc_codec *codec)  {  	struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); -	int gpio_nreset; -	gpio_nreset = cs4271->gpio_nreset; - -	if (gpio_is_valid(gpio_nreset)) { +	if (gpio_is_valid(cs4271->gpio_nreset))  		/* Set codec to the reset state */ -		gpio_set_value(gpio_nreset, 0); -		gpio_free(gpio_nreset); -	} +		gpio_set_value(cs4271->gpio_nreset, 0);  	return 0;  }; diff --git a/sound/soc/codecs/cs42l52.c b/sound/soc/codecs/cs42l52.c index 4d8db3685e9..97a81051e88 100644 --- a/sound/soc/codecs/cs42l52.c +++ b/sound/soc/codecs/cs42l52.c @@ -773,7 +773,6 @@ static int cs42l52_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)  {  	struct snd_soc_codec *codec = codec_dai->codec;  	struct cs42l52_private *cs42l52 = snd_soc_codec_get_drvdata(codec); -	int ret = 0;  	u8 iface = 0;  	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -822,7 +821,7 @@ static int cs42l52_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)  	case SND_SOC_DAIFMT_NB_IF:  		break;  	default: -		ret = -EINVAL; +		return -EINVAL;  	}  	cs42l52->config.format = iface;  	snd_soc_write(codec, CS42L52_IFACE_CTL1, cs42l52->config.format); diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c index 1722b586bdb..7394e73fa43 100644 --- a/sound/soc/codecs/wm5102.c +++ b/sound/soc/codecs/wm5102.c @@ -42,6 +42,556 @@ static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);  static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);  static DECLARE_TLV_DB_SCALE(noise_tlv, 0, 600, 0); +static const struct reg_default wm5102_sysclk_reva_patch[] = { +	{ 0x3000, 0x2225 }, +	{ 0x3001, 0x3a03 }, +	{ 0x3002, 0x0225 }, +	{ 0x3003, 0x0801 }, +	{ 0x3004, 0x6249 }, +	{ 0x3005, 0x0c04 }, +	{ 0x3006, 0x0225 }, +	{ 0x3007, 0x5901 }, +	{ 0x3008, 0xe249 }, +	{ 0x3009, 0x030d }, +	{ 0x300a, 0x0249 }, +	{ 0x300b, 0x2c01 }, +	{ 0x300c, 0xe249 }, +	{ 0x300d, 0x4342 }, +	{ 0x300e, 0xe249 }, +	{ 0x300f, 0x73c0 }, +	{ 0x3010, 0x4249 }, +	{ 0x3011, 0x0c00 }, +	{ 0x3012, 0x0225 }, +	{ 0x3013, 0x1f01 }, +	{ 0x3014, 0x0225 }, +	{ 0x3015, 0x1e01 }, +	{ 0x3016, 0x0225 }, +	{ 0x3017, 0xfa00 }, +	{ 0x3018, 0x0000 }, +	{ 0x3019, 0xf000 }, +	{ 0x301a, 0x0000 }, +	{ 0x301b, 0xf000 }, +	{ 0x301c, 0x0000 }, +	{ 0x301d, 0xf000 }, +	{ 0x301e, 0x0000 }, +	{ 0x301f, 0xf000 }, +	{ 0x3020, 0x0000 }, +	{ 0x3021, 0xf000 }, +	{ 0x3022, 0x0000 }, +	{ 0x3023, 0xf000 }, +	{ 0x3024, 0x0000 }, +	{ 0x3025, 0xf000 }, +	{ 0x3026, 0x0000 }, +	{ 0x3027, 0xf000 }, +	{ 0x3028, 0x0000 }, +	{ 0x3029, 0xf000 }, +	{ 0x302a, 0x0000 }, +	{ 0x302b, 0xf000 }, +	{ 0x302c, 0x0000 }, +	{ 0x302d, 0xf000 }, +	{ 0x302e, 0x0000 }, +	{ 0x302f, 0xf000 }, +	{ 0x3030, 0x0225 }, +	{ 0x3031, 0x1a01 }, +	{ 0x3032, 0x0225 }, +	{ 0x3033, 0x1e00 }, +	{ 0x3034, 0x0225 }, +	{ 0x3035, 0x1f00 }, +	{ 0x3036, 0x6225 }, +	{ 0x3037, 0xf800 }, +	{ 0x3038, 0x0000 }, +	{ 0x3039, 0xf000 }, +	{ 0x303a, 0x0000 }, +	{ 0x303b, 0xf000 }, +	{ 0x303c, 0x0000 }, +	{ 0x303d, 0xf000 }, +	{ 0x303e, 0x0000 }, +	{ 0x303f, 0xf000 }, +	{ 0x3040, 0x2226 }, +	{ 0x3041, 0x3a03 }, +	{ 0x3042, 0x0226 }, +	{ 0x3043, 0x0801 }, +	{ 0x3044, 0x6249 }, +	{ 0x3045, 0x0c06 }, +	{ 0x3046, 0x0226 }, +	{ 0x3047, 0x5901 }, +	{ 0x3048, 0xe249 }, +	{ 0x3049, 0x030d }, +	{ 0x304a, 0x0249 }, +	{ 0x304b, 0x2c01 }, +	{ 0x304c, 0xe249 }, +	{ 0x304d, 0x4342 }, +	{ 0x304e, 0xe249 }, +	{ 0x304f, 0x73c0 }, +	{ 0x3050, 0x4249 }, +	{ 0x3051, 0x0c00 }, +	{ 0x3052, 0x0226 }, +	{ 0x3053, 0x1f01 }, +	{ 0x3054, 0x0226 }, +	{ 0x3055, 0x1e01 }, +	{ 0x3056, 0x0226 }, +	{ 0x3057, 0xfa00 }, +	{ 0x3058, 0x0000 }, +	{ 0x3059, 0xf000 }, +	{ 0x305a, 0x0000 }, +	{ 0x305b, 0xf000 }, +	{ 0x305c, 0x0000 }, +	{ 0x305d, 0xf000 }, +	{ 0x305e, 0x0000 }, +	{ 0x305f, 0xf000 }, +	{ 0x3060, 0x0000 }, +	{ 0x3061, 0xf000 }, +	{ 0x3062, 0x0000 }, +	{ 0x3063, 0xf000 }, +	{ 0x3064, 0x0000 }, +	{ 0x3065, 0xf000 }, +	{ 0x3066, 0x0000 }, +	{ 0x3067, 0xf000 }, +	{ 0x3068, 0x0000 }, +	{ 0x3069, 0xf000 }, +	{ 0x306a, 0x0000 }, +	{ 0x306b, 0xf000 }, +	{ 0x306c, 0x0000 }, +	{ 0x306d, 0xf000 }, +	{ 0x306e, 0x0000 }, +	{ 0x306f, 0xf000 }, +	{ 0x3070, 0x0226 }, +	{ 0x3071, 0x1a01 }, +	{ 0x3072, 0x0226 }, +	{ 0x3073, 0x1e00 }, +	{ 0x3074, 0x0226 }, +	{ 0x3075, 0x1f00 }, +	{ 0x3076, 0x6226 }, +	{ 0x3077, 0xf800 }, +	{ 0x3078, 0x0000 }, +	{ 0x3079, 0xf000 }, +	{ 0x307a, 0x0000 }, +	{ 0x307b, 0xf000 }, +	{ 0x307c, 0x0000 }, +	{ 0x307d, 0xf000 }, +	{ 0x307e, 0x0000 }, +	{ 0x307f, 0xf000 }, +	{ 0x3080, 0x2227 }, +	{ 0x3081, 0x3a03 }, +	{ 0x3082, 0x0227 }, +	{ 0x3083, 0x0801 }, +	{ 0x3084, 0x6255 }, +	{ 0x3085, 0x0c04 }, +	{ 0x3086, 0x0227 }, +	{ 0x3087, 0x5901 }, +	{ 0x3088, 0xe255 }, +	{ 0x3089, 0x030d }, +	{ 0x308a, 0x0255 }, +	{ 0x308b, 0x2c01 }, +	{ 0x308c, 0xe255 }, +	{ 0x308d, 0x4342 }, +	{ 0x308e, 0xe255 }, +	{ 0x308f, 0x73c0 }, +	{ 0x3090, 0x4255 }, +	{ 0x3091, 0x0c00 }, +	{ 0x3092, 0x0227 }, +	{ 0x3093, 0x1f01 }, +	{ 0x3094, 0x0227 }, +	{ 0x3095, 0x1e01 }, +	{ 0x3096, 0x0227 }, +	{ 0x3097, 0xfa00 }, +	{ 0x3098, 0x0000 }, +	{ 0x3099, 0xf000 }, +	{ 0x309a, 0x0000 }, +	{ 0x309b, 0xf000 }, +	{ 0x309c, 0x0000 }, +	{ 0x309d, 0xf000 }, +	{ 0x309e, 0x0000 }, +	{ 0x309f, 0xf000 }, +	{ 0x30a0, 0x0000 }, +	{ 0x30a1, 0xf000 }, +	{ 0x30a2, 0x0000 }, +	{ 0x30a3, 0xf000 }, +	{ 0x30a4, 0x0000 }, +	{ 0x30a5, 0xf000 }, +	{ 0x30a6, 0x0000 }, +	{ 0x30a7, 0xf000 }, +	{ 0x30a8, 0x0000 }, +	{ 0x30a9, 0xf000 }, +	{ 0x30aa, 0x0000 }, +	{ 0x30ab, 0xf000 }, +	{ 0x30ac, 0x0000 }, +	{ 0x30ad, 0xf000 }, +	{ 0x30ae, 0x0000 }, +	{ 0x30af, 0xf000 }, +	{ 0x30b0, 0x0227 }, +	{ 0x30b1, 0x1a01 }, +	{ 0x30b2, 0x0227 }, +	{ 0x30b3, 0x1e00 }, +	{ 0x30b4, 0x0227 }, +	{ 0x30b5, 0x1f00 }, +	{ 0x30b6, 0x6227 }, +	{ 0x30b7, 0xf800 }, +	{ 0x30b8, 0x0000 }, +	{ 0x30b9, 0xf000 }, +	{ 0x30ba, 0x0000 }, +	{ 0x30bb, 0xf000 }, +	{ 0x30bc, 0x0000 }, +	{ 0x30bd, 0xf000 }, +	{ 0x30be, 0x0000 }, +	{ 0x30bf, 0xf000 }, +	{ 0x30c0, 0x2228 }, +	{ 0x30c1, 0x3a03 }, +	{ 0x30c2, 0x0228 }, +	{ 0x30c3, 0x0801 }, +	{ 0x30c4, 0x6255 }, +	{ 0x30c5, 0x0c06 }, +	{ 0x30c6, 0x0228 }, +	{ 0x30c7, 0x5901 }, +	{ 0x30c8, 0xe255 }, +	{ 0x30c9, 0x030d }, +	{ 0x30ca, 0x0255 }, +	{ 0x30cb, 0x2c01 }, +	{ 0x30cc, 0xe255 }, +	{ 0x30cd, 0x4342 }, +	{ 0x30ce, 0xe255 }, +	{ 0x30cf, 0x73c0 }, +	{ 0x30d0, 0x4255 }, +	{ 0x30d1, 0x0c00 }, +	{ 0x30d2, 0x0228 }, +	{ 0x30d3, 0x1f01 }, +	{ 0x30d4, 0x0228 }, +	{ 0x30d5, 0x1e01 }, +	{ 0x30d6, 0x0228 }, +	{ 0x30d7, 0xfa00 }, +	{ 0x30d8, 0x0000 }, +	{ 0x30d9, 0xf000 }, +	{ 0x30da, 0x0000 }, +	{ 0x30db, 0xf000 }, +	{ 0x30dc, 0x0000 }, +	{ 0x30dd, 0xf000 }, +	{ 0x30de, 0x0000 }, +	{ 0x30df, 0xf000 }, +	{ 0x30e0, 0x0000 }, +	{ 0x30e1, 0xf000 }, +	{ 0x30e2, 0x0000 }, +	{ 0x30e3, 0xf000 }, +	{ 0x30e4, 0x0000 }, +	{ 0x30e5, 0xf000 }, +	{ 0x30e6, 0x0000 }, +	{ 0x30e7, 0xf000 }, +	{ 0x30e8, 0x0000 }, +	{ 0x30e9, 0xf000 }, +	{ 0x30ea, 0x0000 }, +	{ 0x30eb, 0xf000 }, +	{ 0x30ec, 0x0000 }, +	{ 0x30ed, 0xf000 }, +	{ 0x30ee, 0x0000 }, +	{ 0x30ef, 0xf000 }, +	{ 0x30f0, 0x0228 }, +	{ 0x30f1, 0x1a01 }, +	{ 0x30f2, 0x0228 }, +	{ 0x30f3, 0x1e00 }, +	{ 0x30f4, 0x0228 }, +	{ 0x30f5, 0x1f00 }, +	{ 0x30f6, 0x6228 }, +	{ 0x30f7, 0xf800 }, +	{ 0x30f8, 0x0000 }, +	{ 0x30f9, 0xf000 }, +	{ 0x30fa, 0x0000 }, +	{ 0x30fb, 0xf000 }, +	{ 0x30fc, 0x0000 }, +	{ 0x30fd, 0xf000 }, +	{ 0x30fe, 0x0000 }, +	{ 0x30ff, 0xf000 }, +	{ 0x3100, 0x222b }, +	{ 0x3101, 0x3a03 }, +	{ 0x3102, 0x222b }, +	{ 0x3103, 0x5803 }, +	{ 0x3104, 0xe26f }, +	{ 0x3105, 0x030d }, +	{ 0x3106, 0x626f }, +	{ 0x3107, 0x2c01 }, +	{ 0x3108, 0xe26f }, +	{ 0x3109, 0x4342 }, +	{ 0x310a, 0xe26f }, +	{ 0x310b, 0x73c0 }, +	{ 0x310c, 0x026f }, +	{ 0x310d, 0x0c00 }, +	{ 0x310e, 0x022b }, +	{ 0x310f, 0x1f01 }, +	{ 0x3110, 0x022b }, +	{ 0x3111, 0x1e01 }, +	{ 0x3112, 0x022b }, +	{ 0x3113, 0xfa00 }, +	{ 0x3114, 0x0000 }, +	{ 0x3115, 0xf000 }, +	{ 0x3116, 0x0000 }, +	{ 0x3117, 0xf000 }, +	{ 0x3118, 0x0000 }, +	{ 0x3119, 0xf000 }, +	{ 0x311a, 0x0000 }, +	{ 0x311b, 0xf000 }, +	{ 0x311c, 0x0000 }, +	{ 0x311d, 0xf000 }, +	{ 0x311e, 0x0000 }, +	{ 0x311f, 0xf000 }, +	{ 0x3120, 0x022b }, +	{ 0x3121, 0x0a01 }, +	{ 0x3122, 0x022b }, +	{ 0x3123, 0x1e00 }, +	{ 0x3124, 0x022b }, +	{ 0x3125, 0x1f00 }, +	{ 0x3126, 0x622b }, +	{ 0x3127, 0xf800 }, +	{ 0x3128, 0x0000 }, +	{ 0x3129, 0xf000 }, +	{ 0x312a, 0x0000 }, +	{ 0x312b, 0xf000 }, +	{ 0x312c, 0x0000 }, +	{ 0x312d, 0xf000 }, +	{ 0x312e, 0x0000 }, +	{ 0x312f, 0xf000 }, +	{ 0x3130, 0x0000 }, +	{ 0x3131, 0xf000 }, +	{ 0x3132, 0x0000 }, +	{ 0x3133, 0xf000 }, +	{ 0x3134, 0x0000 }, +	{ 0x3135, 0xf000 }, +	{ 0x3136, 0x0000 }, +	{ 0x3137, 0xf000 }, +	{ 0x3138, 0x0000 }, +	{ 0x3139, 0xf000 }, +	{ 0x313a, 0x0000 }, +	{ 0x313b, 0xf000 }, +	{ 0x313c, 0x0000 }, +	{ 0x313d, 0xf000 }, +	{ 0x313e, 0x0000 }, +	{ 0x313f, 0xf000 }, +	{ 0x3140, 0x0000 }, +	{ 0x3141, 0xf000 }, +	{ 0x3142, 0x0000 }, +	{ 0x3143, 0xf000 }, +	{ 0x3144, 0x0000 }, +	{ 0x3145, 0xf000 }, +	{ 0x3146, 0x0000 }, +	{ 0x3147, 0xf000 }, +	{ 0x3148, 0x0000 }, +	{ 0x3149, 0xf000 }, +	{ 0x314a, 0x0000 }, +	{ 0x314b, 0xf000 }, +	{ 0x314c, 0x0000 }, +	{ 0x314d, 0xf000 }, +	{ 0x314e, 0x0000 }, +	{ 0x314f, 0xf000 }, +	{ 0x3150, 0x0000 }, +	{ 0x3151, 0xf000 }, +	{ 0x3152, 0x0000 }, +	{ 0x3153, 0xf000 }, +	{ 0x3154, 0x0000 }, +	{ 0x3155, 0xf000 }, +	{ 0x3156, 0x0000 }, +	{ 0x3157, 0xf000 }, +	{ 0x3158, 0x0000 }, +	{ 0x3159, 0xf000 }, +	{ 0x315a, 0x0000 }, +	{ 0x315b, 0xf000 }, +	{ 0x315c, 0x0000 }, +	{ 0x315d, 0xf000 }, +	{ 0x315e, 0x0000 }, +	{ 0x315f, 0xf000 }, +	{ 0x3160, 0x0000 }, +	{ 0x3161, 0xf000 }, +	{ 0x3162, 0x0000 }, +	{ 0x3163, 0xf000 }, +	{ 0x3164, 0x0000 }, +	{ 0x3165, 0xf000 }, +	{ 0x3166, 0x0000 }, +	{ 0x3167, 0xf000 }, +	{ 0x3168, 0x0000 }, +	{ 0x3169, 0xf000 }, +	{ 0x316a, 0x0000 }, +	{ 0x316b, 0xf000 }, +	{ 0x316c, 0x0000 }, +	{ 0x316d, 0xf000 }, +	{ 0x316e, 0x0000 }, +	{ 0x316f, 0xf000 }, +	{ 0x3170, 0x0000 }, +	{ 0x3171, 0xf000 }, +	{ 0x3172, 0x0000 }, +	{ 0x3173, 0xf000 }, +	{ 0x3174, 0x0000 }, +	{ 0x3175, 0xf000 }, +	{ 0x3176, 0x0000 }, +	{ 0x3177, 0xf000 }, +	{ 0x3178, 0x0000 }, +	{ 0x3179, 0xf000 }, +	{ 0x317a, 0x0000 }, +	{ 0x317b, 0xf000 }, +	{ 0x317c, 0x0000 }, +	{ 0x317d, 0xf000 }, +	{ 0x317e, 0x0000 }, +	{ 0x317f, 0xf000 }, +	{ 0x3180, 0x2001 }, +	{ 0x3181, 0xf101 }, +	{ 0x3182, 0x0000 }, +	{ 0x3183, 0xf000 }, +	{ 0x3184, 0x0000 }, +	{ 0x3185, 0xf000 }, +	{ 0x3186, 0x0000 }, +	{ 0x3187, 0xf000 }, +	{ 0x3188, 0x0000 }, +	{ 0x3189, 0xf000 }, +	{ 0x318a, 0x0000 }, +	{ 0x318b, 0xf000 }, +	{ 0x318c, 0x0000 }, +	{ 0x318d, 0xf000 }, +	{ 0x318e, 0x0000 }, +	{ 0x318f, 0xf000 }, +	{ 0x3190, 0x0000 }, +	{ 0x3191, 0xf000 }, +	{ 0x3192, 0x0000 }, +	{ 0x3193, 0xf000 }, +	{ 0x3194, 0x0000 }, +	{ 0x3195, 0xf000 }, +	{ 0x3196, 0x0000 }, +	{ 0x3197, 0xf000 }, +	{ 0x3198, 0x0000 }, +	{ 0x3199, 0xf000 }, +	{ 0x319a, 0x0000 }, +	{ 0x319b, 0xf000 }, +	{ 0x319c, 0x0000 }, +	{ 0x319d, 0xf000 }, +	{ 0x319e, 0x0000 }, +	{ 0x319f, 0xf000 }, +	{ 0x31a0, 0x0000 }, +	{ 0x31a1, 0xf000 }, +	{ 0x31a2, 0x0000 }, +	{ 0x31a3, 0xf000 }, +	{ 0x31a4, 0x0000 }, +	{ 0x31a5, 0xf000 }, +	{ 0x31a6, 0x0000 }, +	{ 0x31a7, 0xf000 }, +	{ 0x31a8, 0x0000 }, +	{ 0x31a9, 0xf000 }, +	{ 0x31aa, 0x0000 }, +	{ 0x31ab, 0xf000 }, +	{ 0x31ac, 0x0000 }, +	{ 0x31ad, 0xf000 }, +	{ 0x31ae, 0x0000 }, +	{ 0x31af, 0xf000 }, +	{ 0x31b0, 0x0000 }, +	{ 0x31b1, 0xf000 }, +	{ 0x31b2, 0x0000 }, +	{ 0x31b3, 0xf000 }, +	{ 0x31b4, 0x0000 }, +	{ 0x31b5, 0xf000 }, +	{ 0x31b6, 0x0000 }, +	{ 0x31b7, 0xf000 }, +	{ 0x31b8, 0x0000 }, +	{ 0x31b9, 0xf000 }, +	{ 0x31ba, 0x0000 }, +	{ 0x31bb, 0xf000 }, +	{ 0x31bc, 0x0000 }, +	{ 0x31bd, 0xf000 }, +	{ 0x31be, 0x0000 }, +	{ 0x31bf, 0xf000 }, +	{ 0x31c0, 0x0000 }, +	{ 0x31c1, 0xf000 }, +	{ 0x31c2, 0x0000 }, +	{ 0x31c3, 0xf000 }, +	{ 0x31c4, 0x0000 }, +	{ 0x31c5, 0xf000 }, +	{ 0x31c6, 0x0000 }, +	{ 0x31c7, 0xf000 }, +	{ 0x31c8, 0x0000 }, +	{ 0x31c9, 0xf000 }, +	{ 0x31ca, 0x0000 }, +	{ 0x31cb, 0xf000 }, +	{ 0x31cc, 0x0000 }, +	{ 0x31cd, 0xf000 }, +	{ 0x31ce, 0x0000 }, +	{ 0x31cf, 0xf000 }, +	{ 0x31d0, 0x0000 }, +	{ 0x31d1, 0xf000 }, +	{ 0x31d2, 0x0000 }, +	{ 0x31d3, 0xf000 }, +	{ 0x31d4, 0x0000 }, +	{ 0x31d5, 0xf000 }, +	{ 0x31d6, 0x0000 }, +	{ 0x31d7, 0xf000 }, +	{ 0x31d8, 0x0000 }, +	{ 0x31d9, 0xf000 }, +	{ 0x31da, 0x0000 }, +	{ 0x31db, 0xf000 }, +	{ 0x31dc, 0x0000 }, +	{ 0x31dd, 0xf000 }, +	{ 0x31de, 0x0000 }, +	{ 0x31df, 0xf000 }, +	{ 0x31e0, 0x0000 }, +	{ 0x31e1, 0xf000 }, +	{ 0x31e2, 0x0000 }, +	{ 0x31e3, 0xf000 }, +	{ 0x31e4, 0x0000 }, +	{ 0x31e5, 0xf000 }, +	{ 0x31e6, 0x0000 }, +	{ 0x31e7, 0xf000 }, +	{ 0x31e8, 0x0000 }, +	{ 0x31e9, 0xf000 }, +	{ 0x31ea, 0x0000 }, +	{ 0x31eb, 0xf000 }, +	{ 0x31ec, 0x0000 }, +	{ 0x31ed, 0xf000 }, +	{ 0x31ee, 0x0000 }, +	{ 0x31ef, 0xf000 }, +	{ 0x31f0, 0x0000 }, +	{ 0x31f1, 0xf000 }, +	{ 0x31f2, 0x0000 }, +	{ 0x31f3, 0xf000 }, +	{ 0x31f4, 0x0000 }, +	{ 0x31f5, 0xf000 }, +	{ 0x31f6, 0x0000 }, +	{ 0x31f7, 0xf000 }, +	{ 0x31f8, 0x0000 }, +	{ 0x31f9, 0xf000 }, +	{ 0x31fa, 0x0000 }, +	{ 0x31fb, 0xf000 }, +	{ 0x31fc, 0x0000 }, +	{ 0x31fd, 0xf000 }, +	{ 0x31fe, 0x0000 }, +	{ 0x31ff, 0xf000 }, +	{ 0x024d, 0xff50 }, +	{ 0x0252, 0xff50 }, +	{ 0x0259, 0x0112 }, +	{ 0x025e, 0x0112 }, +}; + +static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w, +			    struct snd_kcontrol *kcontrol, int event) +{ +	struct snd_soc_codec *codec = w->codec; +	struct arizona *arizona = dev_get_drvdata(codec->dev); +	struct regmap *regmap = codec->control_data; +	const struct reg_default *patch = NULL; +	int i, patch_size; + +	switch (arizona->rev) { +	case 0: +		patch = wm5102_sysclk_reva_patch; +		patch_size = ARRAY_SIZE(wm5102_sysclk_reva_patch); +		break; +	} + +	switch (event) { +	case SND_SOC_DAPM_POST_PMU: +		if (patch) +			for (i = 0; i < patch_size; i++) +				regmap_write(regmap, patch[i].reg, +					     patch[i].def); +		break; + +	default: +		break; +	} + +	return 0; +} +  static const struct snd_kcontrol_new wm5102_snd_controls[] = {  SOC_SINGLE("IN1 High Performance Switch", ARIZONA_IN1L_CONTROL,  	   ARIZONA_IN1_OSR_SHIFT, 1, 0), @@ -297,7 +847,7 @@ static const struct snd_kcontrol_new wm5102_aec_loopback_mux =  static const struct snd_soc_dapm_widget wm5102_dapm_widgets[] = {  SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT, -		    0, NULL, 0), +		    0, wm5102_sysclk_ev, SND_SOC_DAPM_POST_PMU),  SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1,  		    ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0),  SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK, diff --git a/sound/soc/codecs/wm8978.c b/sound/soc/codecs/wm8978.c index 5421fd9fbcb..4c0a8e49613 100644 --- a/sound/soc/codecs/wm8978.c +++ b/sound/soc/codecs/wm8978.c @@ -782,7 +782,7 @@ static int wm8978_hw_params(struct snd_pcm_substream *substream,  		wm8978->mclk_idx = -1;  		f_sel = wm8978->f_mclk;  	} else { -		if (!wm8978->f_pllout) { +		if (!wm8978->f_opclk) {  			/* We only enter here, if OPCLK is not used */  			int ret = wm8978_configure_pll(codec);  			if (ret < 0) diff --git a/sound/soc/kirkwood/kirkwood-dma.c b/sound/soc/kirkwood/kirkwood-dma.c index b9f16598324..2ba08148655 100644 --- a/sound/soc/kirkwood/kirkwood-dma.c +++ b/sound/soc/kirkwood/kirkwood-dma.c @@ -71,7 +71,6 @@ static irqreturn_t kirkwood_dma_irq(int irq, void *dev_id)  		printk(KERN_WARNING "%s: got err interrupt 0x%lx\n",  				__func__, cause);  		writel(cause, priv->io + KIRKWOOD_ERR_CAUSE); -		return IRQ_HANDLED;  	}  	/* we've enabled only bytes interrupts ... */ @@ -178,7 +177,7 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream)  	}  	dram = mv_mbus_dram_info(); -	addr = virt_to_phys(substream->dma_buffer.area); +	addr = substream->dma_buffer.addr;  	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {  		prdata->play_stream = substream;  		kirkwood_dma_conf_mbus_windows(priv->io, diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c index 542538d10ab..1d5db484d2d 100644 --- a/sound/soc/kirkwood/kirkwood-i2s.c +++ b/sound/soc/kirkwood/kirkwood-i2s.c @@ -95,7 +95,7 @@ static inline void kirkwood_set_dco(void __iomem *io, unsigned long rate)  	do {  		cpu_relax();  		value = readl(io + KIRKWOOD_DCO_SPCR_STATUS); -		value &= KIRKWOOD_DCO_SPCR_STATUS; +		value &= KIRKWOOD_DCO_SPCR_STATUS_DCO_LOCK;  	} while (value == 0);  } @@ -180,67 +180,72 @@ static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream,  				int cmd, struct snd_soc_dai *dai)  {  	struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai); -	unsigned long value; +	uint32_t ctl, value; -	/* -	 * specs says KIRKWOOD_PLAYCTL must be read 2 times before -	 * changing it. So read 1 time here and 1 later. -	 */ -	value = readl(priv->io + KIRKWOOD_PLAYCTL); +	ctl = readl(priv->io + KIRKWOOD_PLAYCTL); +	if (ctl & KIRKWOOD_PLAYCTL_PAUSE) { +		unsigned timeout = 5000; +		/* +		 * The Armada510 spec says that if we enter pause mode, the +		 * busy bit must be read back as clear _twice_.  Make sure +		 * we respect that otherwise we get DMA underruns. +		 */ +		do { +			value = ctl; +			ctl = readl(priv->io + KIRKWOOD_PLAYCTL); +			if (!((ctl | value) & KIRKWOOD_PLAYCTL_PLAY_BUSY)) +				break; +			udelay(1); +		} while (timeout--); + +		if ((ctl | value) & KIRKWOOD_PLAYCTL_PLAY_BUSY) +			dev_notice(dai->dev, "timed out waiting for busy to deassert: %08x\n", +				   ctl); +	}  	switch (cmd) {  	case SNDRV_PCM_TRIGGER_START: -		/* stop audio, enable interrupts */ -		value = readl(priv->io + KIRKWOOD_PLAYCTL); -		value |= KIRKWOOD_PLAYCTL_PAUSE; -		writel(value, priv->io + KIRKWOOD_PLAYCTL); -  		value = readl(priv->io + KIRKWOOD_INT_MASK);  		value |= KIRKWOOD_INT_CAUSE_PLAY_BYTES;  		writel(value, priv->io + KIRKWOOD_INT_MASK);  		/* configure audio & enable i2s playback */ -		value = readl(priv->io + KIRKWOOD_PLAYCTL); -		value &= ~KIRKWOOD_PLAYCTL_BURST_MASK; -		value &= ~(KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE +		ctl &= ~KIRKWOOD_PLAYCTL_BURST_MASK; +		ctl &= ~(KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE  				| KIRKWOOD_PLAYCTL_SPDIF_EN);  		if (priv->burst == 32) -			value |= KIRKWOOD_PLAYCTL_BURST_32; +			ctl |= KIRKWOOD_PLAYCTL_BURST_32;  		else -			value |= KIRKWOOD_PLAYCTL_BURST_128; -		value |= KIRKWOOD_PLAYCTL_I2S_EN; -		writel(value, priv->io + KIRKWOOD_PLAYCTL); +			ctl |= KIRKWOOD_PLAYCTL_BURST_128; +		ctl |= KIRKWOOD_PLAYCTL_I2S_EN; +		writel(ctl, priv->io + KIRKWOOD_PLAYCTL);  		break;  	case SNDRV_PCM_TRIGGER_STOP:  		/* stop audio, disable interrupts */ -		value = readl(priv->io + KIRKWOOD_PLAYCTL); -		value |= KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE; -		writel(value, priv->io + KIRKWOOD_PLAYCTL); +		ctl |= KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE; +		writel(ctl, priv->io + KIRKWOOD_PLAYCTL);  		value = readl(priv->io + KIRKWOOD_INT_MASK);  		value &= ~KIRKWOOD_INT_CAUSE_PLAY_BYTES;  		writel(value, priv->io + KIRKWOOD_INT_MASK);  		/* disable all playbacks */ -		value = readl(priv->io + KIRKWOOD_PLAYCTL); -		value &= ~(KIRKWOOD_PLAYCTL_I2S_EN | KIRKWOOD_PLAYCTL_SPDIF_EN); -		writel(value, priv->io + KIRKWOOD_PLAYCTL); +		ctl &= ~(KIRKWOOD_PLAYCTL_I2S_EN | KIRKWOOD_PLAYCTL_SPDIF_EN); +		writel(ctl, priv->io + KIRKWOOD_PLAYCTL);  		break;  	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:  	case SNDRV_PCM_TRIGGER_SUSPEND: -		value = readl(priv->io + KIRKWOOD_PLAYCTL); -		value |= KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE; -		writel(value, priv->io + KIRKWOOD_PLAYCTL); +		ctl |= KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE; +		writel(ctl, priv->io + KIRKWOOD_PLAYCTL);  		break;  	case SNDRV_PCM_TRIGGER_RESUME:  	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: -		value = readl(priv->io + KIRKWOOD_PLAYCTL); -		value &= ~(KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE); -		writel(value, priv->io + KIRKWOOD_PLAYCTL); +		ctl &= ~(KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE); +		writel(ctl, priv->io + KIRKWOOD_PLAYCTL);  		break;  	default: @@ -260,11 +265,6 @@ static int kirkwood_i2s_rec_trigger(struct snd_pcm_substream *substream,  	switch (cmd) {  	case SNDRV_PCM_TRIGGER_START: -		/* stop audio, enable interrupts */ -		value = readl(priv->io + KIRKWOOD_RECCTL); -		value |= KIRKWOOD_RECCTL_PAUSE; -		writel(value, priv->io + KIRKWOOD_RECCTL); -  		value = readl(priv->io + KIRKWOOD_INT_MASK);  		value |= KIRKWOOD_INT_CAUSE_REC_BYTES;  		writel(value, priv->io + KIRKWOOD_INT_MASK); diff --git a/sound/soc/mxs/mxs-saif.c b/sound/soc/mxs/mxs-saif.c index aa037b292f3..c294fbb523f 100644 --- a/sound/soc/mxs/mxs-saif.c +++ b/sound/soc/mxs/mxs-saif.c @@ -523,16 +523,24 @@ static int mxs_saif_trigger(struct snd_pcm_substream *substream, int cmd,  		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {  			/* -			 * write a data to saif data register to trigger -			 * the transfer +			 * write data to saif data register to trigger +			 * the transfer. +			 * For 24-bit format the 32-bit FIFO register stores +			 * only one channel, so we need to write twice. +			 * This is also safe for the other non 24-bit formats.  			 */  			__raw_writel(0, saif->base + SAIF_DATA); +			__raw_writel(0, saif->base + SAIF_DATA);  		} else {  			/* -			 * read a data from saif data register to trigger -			 * the receive +			 * read data from saif data register to trigger +			 * the receive. +			 * For 24-bit format the 32-bit FIFO register stores +			 * only one channel, so we need to read twice. +			 * This is also safe for the other non 24-bit formats.  			 */  			__raw_readl(saif->base + SAIF_DATA); +			__raw_readl(saif->base + SAIF_DATA);  		}  		master_saif->ongoing = 1; @@ -812,3 +820,4 @@ module_platform_driver(mxs_saif_driver);  MODULE_AUTHOR("Freescale Semiconductor, Inc.");  MODULE_DESCRIPTION("MXS ASoC SAIF driver");  MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:mxs-saif"); diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig index e7b83179aca..3c7c3a59ed3 100644 --- a/sound/soc/samsung/Kconfig +++ b/sound/soc/samsung/Kconfig @@ -207,6 +207,8 @@ config SND_SOC_BELLS  	select SND_SOC_WM5102  	select SND_SOC_WM5110  	select SND_SOC_WM9081 +	select SND_SOC_WM0010 +	select SND_SOC_WM1250_EV1  config SND_SOC_LOWLAND  	tristate "Audio support for Wolfson Lowland" diff --git a/sound/soc/samsung/bells.c b/sound/soc/samsung/bells.c index b0d46d63d55..a2ca1567b9e 100644 --- a/sound/soc/samsung/bells.c +++ b/sound/soc/samsung/bells.c @@ -212,7 +212,7 @@ static struct snd_soc_dai_link bells_dai_wm5102[] = {  	{  		.name = "Sub",  		.stream_name = "Sub", -		.cpu_dai_name = "wm5110-aif3", +		.cpu_dai_name = "wm5102-aif3",  		.codec_dai_name = "wm9081-hifi",  		.codec_name = "wm9081.1-006c",  		.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index d1198627fc4..10d21be383f 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -2786,8 +2786,9 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,  	val = (ucontrol->value.integer.value[0] + min) & mask;  	val = val << shift; -	if (snd_soc_update_bits_locked(codec, reg, val_mask, val)) -			return err; +	err = snd_soc_update_bits_locked(codec, reg, val_mask, val); +	if (err < 0) +		return err;  	if (snd_soc_volsw_is_stereo(mc)) {  		val_mask = mask << rshift; diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index d0a4be38dc0..6e35bcae02d 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c @@ -3745,7 +3745,7 @@ void snd_soc_dapm_shutdown(struct snd_soc_card *card)  {  	struct snd_soc_codec *codec; -	list_for_each_entry(codec, &card->codec_dev_list, list) { +	list_for_each_entry(codec, &card->codec_dev_list, card_list) {  		soc_dapm_shutdown_codec(&codec->dapm);  		if (codec->dapm.bias_level == SND_SOC_BIAS_STANDBY)  			snd_soc_dapm_set_bias_level(&codec->dapm, diff --git a/sound/usb/card.c b/sound/usb/card.c index 282f0fc9fed..dbf7999d18b 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c @@ -559,9 +559,11 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,  		return;  	card = chip->card; -	mutex_lock(®ister_mutex);  	down_write(&chip->shutdown_rwsem);  	chip->shutdown = 1; +	up_write(&chip->shutdown_rwsem); + +	mutex_lock(®ister_mutex);  	chip->num_interfaces--;  	if (chip->num_interfaces <= 0) {  		snd_card_disconnect(card); @@ -582,11 +584,9 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,  			snd_usb_mixer_disconnect(p);  		}  		usb_chip[chip->index] = NULL; -		up_write(&chip->shutdown_rwsem);  		mutex_unlock(®ister_mutex);  		snd_card_free_when_closed(card);  	} else { -		up_write(&chip->shutdown_rwsem);  		mutex_unlock(®ister_mutex);  	}  } diff --git a/sound/usb/midi.c b/sound/usb/midi.c index c83f6143c0e..eeefbce3873 100644 --- a/sound/usb/midi.c +++ b/sound/usb/midi.c @@ -148,6 +148,7 @@ struct snd_usb_midi_out_endpoint {  		struct snd_usb_midi_out_endpoint* ep;  		struct snd_rawmidi_substream *substream;  		int active; +		bool autopm_reference;  		uint8_t cable;		/* cable number << 4 */  		uint8_t state;  #define STATE_UNKNOWN	0 @@ -1076,7 +1077,8 @@ static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream)  		return -ENXIO;  	}  	err = usb_autopm_get_interface(umidi->iface); -	if (err < 0) +	port->autopm_reference = err >= 0; +	if (err < 0 && err != -EACCES)  		return -EIO;  	substream->runtime->private_data = port;  	port->state = STATE_UNKNOWN; @@ -1087,9 +1089,11 @@ static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream)  static int snd_usbmidi_output_close(struct snd_rawmidi_substream *substream)  {  	struct snd_usb_midi* umidi = substream->rmidi->private_data; +	struct usbmidi_out_port *port = substream->runtime->private_data;  	substream_open(substream, 0); -	usb_autopm_put_interface(umidi->iface); +	if (port->autopm_reference) +		usb_autopm_put_interface(umidi->iface);  	return 0;  } diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index 5c12a3fe8c3..ef6fa24fc47 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -459,7 +459,7 @@ static int configure_endpoint(struct snd_usb_substream *subs)  		return ret;  	if (subs->sync_endpoint) -		ret = snd_usb_endpoint_set_params(subs->data_endpoint, +		ret = snd_usb_endpoint_set_params(subs->sync_endpoint,  						  subs->pcm_format,  						  subs->channels,  						  subs->period_bytes,  |