Re: Patch for AC97 AD CODEC shared jacks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



At Tue, 19 Dec 2006 11:51:29 -0500,
Randy Cushman wrote:
> 
> Attached is the first of my split submissions.

Thanks!

> Apparently you are correct.  I compared the ALC650 datasheet with the 
> corresponding code in ac97_patch.c.  This analysis indicates that my 
> change would have broken support for this chipset.  Part of my confusion 
> stemmed from the names of the functions in question, which I find to be 
> counterintuitive.

Ah yes, the names are confusing.

> Since some of your comments suggest to me that changes that improve code 
> maintainability are sometimes preferable to changes that affect the 
> fewest lines of code, in the attached patch I have taken the liberty of 
> renaming functions to names that I find to be more meaningful.
> 
> I'll hold off on creating the remaining patches for now because my other 
> patches may need to be changed if this patch is not accepted.
> 
> Please let me know what you think.

Then change looks fine.  One minor request is not to put a space
between '!' and the rest in the new codes.  I used this style, but
apparently it's no major and kernel people tend to dislike it.


[BTW, I added Cc to alsa-devel ML again, supposing that you forgot
 it.]


Takashi


> 
> Randy Cushman
> 
> 
> (From "Re:  Patch for AD1985 AC97 CODEC")
> 
> Takashi Iwai wrote:
> > Hi,
> >
> > thanks for the patch.
> > For the ease of review, could you split your change to several
> > patches?  Please post one patch per mail, then.
> >
> > Anyway, a quick review through the patch is below.
> >
> > At Tue, 12 Dec 2006 19:31:33 -0500,
> > Randy Cushman wrote:
> >   
> >> Summary: fix microphone and line_in selection logic
> >>
> >> This patch fixes the Microphone and LINE_IN select logic for
> >> surround codecs with shared jacks.  This issue appears to apply
> >> to most, if not all AC'97 surround codecs.  The existing code
> >> can never utilize the shared jacks for Microphone and LINE_IN
> >> due to the reversed jack selection logic.  The patched code
> >> correctly selects the shared jack for input if the "Channel Mode"
> >> selector does not specify that the jack is to be used for output.
> >>
> >> Specifically, in "2ch" mode the Center/LFE jack is used for
> >> microphone input and the Surround jack is used for LINE_IN,
> >> in "4ch" mode the Center/LFE jack is used for microphone input
> >> and the Surround jack is used for output, and in "6ch" mode
> >> both jacks are used for output.
> >>
> >> Signed-off-by: Randy Cushman <rcushman_linux@xxxxxxxxxxxxx>
> >>     
> >
> > This hunk likely breaks other codec support.
> >
> > is_shared_linein() returns true if the line-in jack is shared with
> > surround output _and_ being used as the surround output.  Maybe the AD
> > codec support is wrongly implemented.
> >   
> (snip)
> > thanks,
> >
> > Takashi
> >
> >
> >   
> 
> [2 ac97_shared_1.patch <text/plain (7bit)>]
> Summary: fix microphone and line_in selection logic
> 
> This patch fixes the Microphone and LINE_IN select logic for
> Analog Devices surround codecs with shared jacks.  The existing
> code can never utilize the shared jacks for Microphone and LINE_IN
> due to the reversed jack selection logic.  The patched code
> correctly selects the shared jack for input if the "Channel Mode"
> selector does not specify that the jack is to be used for output.
> 
> Specifically, in "2ch" mode the Center/LFE jack is used for
> microphone input and the Surround jack is used for LINE_IN,
> in "4ch" mode the Center/LFE jack is used for microphone input
> and the Surround jack is used for output, and in "6ch" mode
> both jacks are used for output.
> 
> Signed-off-by: Randy Cushman <rcushman_linux@xxxxxxxxxxxxx>
> 
> 
> diff -r cdbbd773cd9e pci/ac97/ac97_patch.c
> --- a/pci/ac97/ac97_patch.c	Wed Dec 13 11:21:55 2006 +0000
> +++ b/pci/ac97/ac97_patch.c	Tue Dec 19 10:03:51 2006 -0500
> @@ -190,14 +190,28 @@ static inline int is_clfe_on(struct snd_
>  	return ac97->channel_mode >= 2;
>  }
>  
> +/* system has shared jacks with surround out enabled */
> +static inline int is_shared_surrout(struct snd_ac97 *ac97)
> +{
> +	return ! ac97->indep_surround && is_surround_on(ac97);
> +}
> +
> +/* system has shared jacks with center/lfe out enabled */
> +static inline int is_shared_clfeout(struct snd_ac97 *ac97)
> +{
> +	return ! ac97->indep_surround && is_clfe_on(ac97);
> +}
> +
> +/* system has shared jacks with line in enabled */
>  static inline int is_shared_linein(struct snd_ac97 *ac97)
>  {
> -	return ! ac97->indep_surround && is_surround_on(ac97);
> -}
> -
> +	return ! ac97->indep_surround && ! is_surround_on(ac97);
> +}
> +
> +/* system has shared jacks with mic in enabled */
>  static inline int is_shared_micin(struct snd_ac97 *ac97)
>  {
> -	return ! ac97->indep_surround && is_clfe_on(ac97);
> +	return ! ac97->indep_surround && ! is_clfe_on(ac97);
>  }
>  
>  
> @@ -2014,12 +2028,12 @@ static void alc650_update_jacks(struct s
>  {
>  	int shared;
>  	
> -	/* shared Line-In */
> -	shared = is_shared_linein(ac97);
> +	/* shared Line-In / Surround Out */
> +	shared = is_shared_surrout(ac97);
>  	snd_ac97_update_bits(ac97, AC97_ALC650_MULTICH, 1 << 9,
>  			     shared ? (1 << 9) : 0);
> -	/* update shared Mic */
> -	shared = is_shared_micin(ac97);
> +	/* update shared Mic In / Center/LFE Out */
> +	shared = is_shared_clfeout(ac97);
>  	/* disable/enable vref */
>  	snd_ac97_update_bits(ac97, AC97_ALC650_CLOCK, 1 << 12,
>  			     shared ? (1 << 12) : 0);
> @@ -2149,12 +2163,12 @@ static void alc655_update_jacks(struct s
>  {
>  	int shared;
>  	
> -	/* shared Line-In */
> -	shared = is_shared_linein(ac97);
> +	/* shared Line-In / Surround Out */
> +	shared = is_shared_surrout(ac97);
>  	ac97_update_bits_page(ac97, AC97_ALC650_MULTICH, 1 << 9,
>  			      shared ? (1 << 9) : 0, 0);
> -	/* update shared mic */
> -	shared = is_shared_micin(ac97);
> +	/* update shared Mic In / Center/LFE Out */
> +	shared = is_shared_clfeout(ac97);
>  	/* misc control; vrefout disable */
>  	snd_ac97_update_bits(ac97, AC97_ALC650_CLOCK, 1 << 12,
>  			     shared ? (1 << 12) : 0);
> @@ -2298,16 +2312,16 @@ static void alc850_update_jacks(struct s
>  {
>  	int shared;
>  	
> -	/* shared Line-In */
> -	shared = is_shared_linein(ac97);
> +	/* shared Line-In / Surround Out */
> +	shared = is_shared_surrout(ac97);
>  	/* SURR 1kOhm (bit4), Amp (bit5) */
>  	snd_ac97_update_bits(ac97, AC97_ALC850_MISC1, (1<<4)|(1<<5),
>  			     shared ? (1<<5) : (1<<4));
>  	/* LINE-IN = 0, SURROUND = 2 */
>  	snd_ac97_update_bits(ac97, AC97_ALC850_JACK_SELECT, 7 << 12,
>  			     shared ? (2<<12) : (0<<12));
> -	/* update shared mic */
> -	shared = is_shared_micin(ac97);
> +	/* update shared Mic In / Center/LFE Out */
> +	shared = is_shared_clfeout(ac97);
>  	/* Vref disable (bit12), 1kOhm (bit13) */
>  	snd_ac97_update_bits(ac97, AC97_ALC850_MISC1, (1<<12)|(1<<13),
>  			     shared ? (1<<12) : (1<<13));
> @@ -2380,9 +2394,9 @@ int patch_alc850(struct snd_ac97 *ac97)
>   */
>  static void cm9738_update_jacks(struct snd_ac97 *ac97)
>  {
> -	/* shared Line-In */
> +	/* shared Line-In / Surround Out */
>  	snd_ac97_update_bits(ac97, AC97_CM9738_VENDOR_CTRL, 1 << 10,
> -			     is_shared_linein(ac97) ? (1 << 10) : 0);
> +			     is_shared_surrout(ac97) ? (1 << 10) : 0);
>  }
>  
>  static const struct snd_kcontrol_new snd_ac97_cm9738_controls[] = {
> @@ -2464,12 +2478,12 @@ static const struct snd_kcontrol_new snd
>  
>  static void cm9739_update_jacks(struct snd_ac97 *ac97)
>  {
> -	/* shared Line-In */
> +	/* shared Line-In / Surround Out */
>  	snd_ac97_update_bits(ac97, AC97_CM9739_MULTI_CHAN, 1 << 10,
> -			     is_shared_linein(ac97) ? (1 << 10) : 0);
> -	/* shared Mic */
> +			     is_shared_surrout(ac97) ? (1 << 10) : 0);
> +	/* shared Mic In / Center/LFE Out **/
>  	snd_ac97_update_bits(ac97, AC97_CM9739_MULTI_CHAN, 0x3000,
> -			     is_shared_micin(ac97) ? 0x1000 : 0x2000);
> +			     is_shared_clfeout(ac97) ? 0x1000 : 0x2000);
>  }
>  
>  static const struct snd_kcontrol_new snd_ac97_cm9739_controls[] = {
> @@ -2581,8 +2595,8 @@ static void cm9761_update_jacks(struct s
>  
>  	val |= surr_on[ac97->spec.dev_flags][is_surround_on(ac97)];
>  	val |= clfe_on[ac97->spec.dev_flags][is_clfe_on(ac97)];
> -	val |= surr_shared[ac97->spec.dev_flags][is_shared_linein(ac97)];
> -	val |= clfe_shared[ac97->spec.dev_flags][is_shared_micin(ac97)];
> +	val |= surr_shared[ac97->spec.dev_flags][is_shared_surrout(ac97)];
> +	val |= clfe_shared[ac97->spec.dev_flags][is_shared_clfeout(ac97)];
>  
>  	snd_ac97_update_bits(ac97, AC97_CM9761_MULTI_CHAN, 0x3c88, val);
>  }
> @@ -2829,12 +2843,12 @@ int patch_vt1617a(struct snd_ac97 * ac97
>   */
>  static void it2646_update_jacks(struct snd_ac97 *ac97)
>  {
> -	/* shared Line-In */
> +	/* shared Line-In / Surround Out */
>  	snd_ac97_update_bits(ac97, 0x76, 1 << 9,
> -			     is_shared_linein(ac97) ? (1<<9) : 0);
> -	/* shared Mic */
> +			     is_shared_surrout(ac97) ? (1<<9) : 0);
> +	/* shared Mic / Center/LFE Out */
>  	snd_ac97_update_bits(ac97, 0x76, 1 << 10,
> -			     is_shared_micin(ac97) ? (1<<10) : 0);
> +			     is_shared_clfeout(ac97) ? (1<<10) : 0);
>  }
>  
>  static const struct snd_kcontrol_new snd_ac97_controls_it2646[] = {

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/alsa-devel

[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux