Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b54c3835 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6:
  ALSA: hda - Fix mute control with some ALC262 models
  ALSA: snd_usb_caiaq: add support for Audio2DJ
  ALSA: pcm - Fix hwptr buffer-size overlap bug
  ALSA: pcm - Fix warnings in debug loggings
  ALSA: pcm - Add logging of hwptr updates and interrupt updates
  ASoC: tlv320aic3x: Enable PLL when not bypassed
  ALSA: hda - Restore GPIO1 properly at resume with AD1984A
  ALSA: ctxfi - Fix uninitialized error checks
  ALSA: hda - Use snprintf() to be safer
  ALSA: usb-audio - Volume control quirk for QuickCam E 3500
  ALSA: pcm - Fix regressions with VMware
parents 04fc0a40 57e4a5c4
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -101,6 +101,8 @@ card*/pcm*/xrun_debug
	  bit 0 = Enable XRUN/jiffies debug messages
	  bit 0 = Enable XRUN/jiffies debug messages
	  bit 1 = Show stack trace at XRUN / jiffies check
	  bit 1 = Show stack trace at XRUN / jiffies check
	  bit 2 = Enable additional jiffies check
	  bit 2 = Enable additional jiffies check
	  bit 3 = Log hwptr update at each period interrupt
	  bit 4 = Log hwptr update at each snd_pcm_update_hw_ptr()


	When the bit 0 is set, the driver will show the messages to
	When the bit 0 is set, the driver will show the messages to
	kernel log when an xrun is detected.  The debug message is
	kernel log when an xrun is detected.  The debug message is
@@ -117,6 +119,9 @@ card*/pcm*/xrun_debug
	buggy) hardware that doesn't give smooth pointer updates.
	buggy) hardware that doesn't give smooth pointer updates.
	This feature is enabled via the bit 2.
	This feature is enabled via the bit 2.


	Bits 3 and 4 are for logging the hwptr records.  Note that
	these will give flood of kernel messages.

card*/pcm*/sub*/info
card*/pcm*/sub*/info
	The general information of this PCM sub-stream.
	The general information of this PCM sub-stream.


+35 −1
Original line number Original line Diff line number Diff line
@@ -233,6 +233,18 @@ static int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *substream)
		xrun(substream);
		xrun(substream);
		return -EPIPE;
		return -EPIPE;
	}
	}
	if (xrun_debug(substream, 8)) {
		char name[16];
		pcm_debug_name(substream, name, sizeof(name));
		snd_printd("period_update: %s: pos=0x%x/0x%x/0x%x, "
			   "hwptr=0x%lx, hw_base=0x%lx, hw_intr=0x%lx\n",
			   name, (unsigned int)pos,
			   (unsigned int)runtime->period_size,
			   (unsigned int)runtime->buffer_size,
			   (unsigned long)old_hw_ptr,
			   (unsigned long)runtime->hw_ptr_base,
			   (unsigned long)runtime->hw_ptr_interrupt);
	}
	hw_base = runtime->hw_ptr_base;
	hw_base = runtime->hw_ptr_base;
	new_hw_ptr = hw_base + pos;
	new_hw_ptr = hw_base + pos;
	hw_ptr_interrupt = runtime->hw_ptr_interrupt + runtime->period_size;
	hw_ptr_interrupt = runtime->hw_ptr_interrupt + runtime->period_size;
@@ -244,6 +256,7 @@ static int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *substream)
			delta = new_hw_ptr - hw_ptr_interrupt;
			delta = new_hw_ptr - hw_ptr_interrupt;
	}
	}
	if (delta < 0) {
	if (delta < 0) {
		if (runtime->periods == 1 || new_hw_ptr < old_hw_ptr)
			delta += runtime->buffer_size;
			delta += runtime->buffer_size;
		if (delta < 0) {
		if (delta < 0) {
			hw_ptr_error(substream, 
			hw_ptr_error(substream, 
@@ -251,11 +264,19 @@ static int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *substream)
				     "(stream=%i, pos=%ld, intr_ptr=%ld)\n",
				     "(stream=%i, pos=%ld, intr_ptr=%ld)\n",
				     substream->stream, (long)pos,
				     substream->stream, (long)pos,
				     (long)hw_ptr_interrupt);
				     (long)hw_ptr_interrupt);
#if 1
			/* simply skipping the hwptr update seems more
			 * robust in some cases, e.g. on VMware with
			 * inaccurate timer source
			 */
			return 0; /* skip this update */
#else
			/* rebase to interrupt position */
			/* rebase to interrupt position */
			hw_base = new_hw_ptr = hw_ptr_interrupt;
			hw_base = new_hw_ptr = hw_ptr_interrupt;
			/* align hw_base to buffer_size */
			/* align hw_base to buffer_size */
			hw_base -= hw_base % runtime->buffer_size;
			hw_base -= hw_base % runtime->buffer_size;
			delta = 0;
			delta = 0;
#endif
		} else {
		} else {
			hw_base += runtime->buffer_size;
			hw_base += runtime->buffer_size;
			if (hw_base >= runtime->boundary)
			if (hw_base >= runtime->boundary)
@@ -344,6 +365,19 @@ int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream)
		xrun(substream);
		xrun(substream);
		return -EPIPE;
		return -EPIPE;
	}
	}
	if (xrun_debug(substream, 16)) {
		char name[16];
		pcm_debug_name(substream, name, sizeof(name));
		snd_printd("hw_update: %s: pos=0x%x/0x%x/0x%x, "
			   "hwptr=0x%lx, hw_base=0x%lx, hw_intr=0x%lx\n",
			   name, (unsigned int)pos,
			   (unsigned int)runtime->period_size,
			   (unsigned int)runtime->buffer_size,
			   (unsigned long)old_hw_ptr,
			   (unsigned long)runtime->hw_ptr_base,
			   (unsigned long)runtime->hw_ptr_interrupt);
	}

	hw_base = runtime->hw_ptr_base;
	hw_base = runtime->hw_ptr_base;
	new_hw_ptr = hw_base + pos;
	new_hw_ptr = hw_base + pos;


+6 −8
Original line number Original line Diff line number Diff line
@@ -242,13 +242,12 @@ static int get_amixer_rsc(struct amixer_mgr *mgr,


	/* Allocate mem for amixer resource */
	/* Allocate mem for amixer resource */
	amixer = kzalloc(sizeof(*amixer), GFP_KERNEL);
	amixer = kzalloc(sizeof(*amixer), GFP_KERNEL);
	if (NULL == amixer) {
	if (!amixer)
		err = -ENOMEM;
		return -ENOMEM;
		return err;
	}


	/* Check whether there are sufficient
	/* Check whether there are sufficient
	 * amixer resources to meet request. */
	 * amixer resources to meet request. */
	err = 0;
	spin_lock_irqsave(&mgr->mgr_lock, flags);
	spin_lock_irqsave(&mgr->mgr_lock, flags);
	for (i = 0; i < desc->msr; i++) {
	for (i = 0; i < desc->msr; i++) {
		err = mgr_get_resource(&mgr->mgr, 1, &idx);
		err = mgr_get_resource(&mgr->mgr, 1, &idx);
@@ -397,12 +396,11 @@ static int get_sum_rsc(struct sum_mgr *mgr,


	/* Allocate mem for sum resource */
	/* Allocate mem for sum resource */
	sum = kzalloc(sizeof(*sum), GFP_KERNEL);
	sum = kzalloc(sizeof(*sum), GFP_KERNEL);
	if (NULL == sum) {
	if (!sum)
		err = -ENOMEM;
		return -ENOMEM;
		return err;
	}


	/* Check whether there are sufficient sum resources to meet request. */
	/* Check whether there are sufficient sum resources to meet request. */
	err = 0;
	spin_lock_irqsave(&mgr->mgr_lock, flags);
	spin_lock_irqsave(&mgr->mgr_lock, flags);
	for (i = 0; i < desc->msr; i++) {
	for (i = 0; i < desc->msr; i++) {
		err = mgr_get_resource(&mgr->mgr, 1, &idx);
		err = mgr_get_resource(&mgr->mgr, 1, &idx);
+3 −4
Original line number Original line Diff line number Diff line
@@ -724,12 +724,11 @@ static int get_srcimp_rsc(struct srcimp_mgr *mgr,


	/* Allocate mem for SRCIMP resource */
	/* Allocate mem for SRCIMP resource */
	srcimp = kzalloc(sizeof(*srcimp), GFP_KERNEL);
	srcimp = kzalloc(sizeof(*srcimp), GFP_KERNEL);
	if (NULL == srcimp) {
	if (!srcimp)
		err = -ENOMEM;
		return -ENOMEM;
		return err;
	}


	/* Check whether there are sufficient SRCIMP resources. */
	/* Check whether there are sufficient SRCIMP resources. */
	err = 0;
	spin_lock_irqsave(&mgr->mgr_lock, flags);
	spin_lock_irqsave(&mgr->mgr_lock, flags);
	for (i = 0; i < desc->msr; i++) {
	for (i = 0; i < desc->msr; i++) {
		err = mgr_get_resource(&mgr->mgr, 1, &idx);
		err = mgr_get_resource(&mgr->mgr, 1, &idx);
+1 −1
Original line number Original line Diff line number Diff line
@@ -3754,7 +3754,7 @@ static int ad1884a_mobile_master_sw_put(struct snd_kcontrol *kcontrol,
	int mute = (!ucontrol->value.integer.value[0] &&
	int mute = (!ucontrol->value.integer.value[0] &&
		    !ucontrol->value.integer.value[1]);
		    !ucontrol->value.integer.value[1]);
	/* toggle GPIO1 according to the mute state */
	/* toggle GPIO1 according to the mute state */
	snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
	snd_hda_codec_write_cache(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
			    mute ? 0x02 : 0x0);
			    mute ? 0x02 : 0x0);
	return ret;
	return ret;
}
}
Loading