All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lee Jones <lee.jones@linaro.org>
To: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Cc: alsa-devel@alsa-project.org, broonie@kernel.org,
	lgirdwood@gmail.org, sameo@linux.intel.com,
	patches@opensource.wolfsonmicro.com
Subject: Re: [PATCH 3/3] ASoC: wm5102: Add controls to allow shaping of ultrasonic response
Date: Tue, 17 Jun 2014 20:22:44 +0100	[thread overview]
Message-ID: <20140617192244.GT29841@lee--X1> (raw)
In-Reply-To: <1402058000-5357-3-git-send-email-ckeepax@opensource.wolfsonmicro.com>

On Fri, 06 Jun 2014, Charles Keepax wrote:

> Add controls to allow custom shaping of the ultrasonic response. This
> custom shaping can be turned on/off at runtime, although, it should be
> noted that settings will not affect a currently open audio stream,
> they will be applied when the next audio stream is started.
> 
> Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
> ---
>  include/linux/mfd/arizona/core.h |    3 ++

For the MFD changes:
  Acked-by: Lee Jones <lee.jones@linaro.org>

>  sound/soc/codecs/arizona.c       |   34 +++++++++++++++++++++
>  sound/soc/codecs/wm5102.c        |   62 ++++++++++++++++++++++++++++++++++++++
>  3 files changed, 99 insertions(+), 0 deletions(-)
> 
> diff --git a/include/linux/mfd/arizona/core.h b/include/linux/mfd/arizona/core.h
> index 11783b5..5592651 100644
> --- a/include/linux/mfd/arizona/core.h
> +++ b/include/linux/mfd/arizona/core.h
> @@ -113,6 +113,9 @@ struct arizona {
>  
>  	int tdm_width[ARIZONA_MAX_AIF];
>  	int tdm_slots[ARIZONA_MAX_AIF];
> +
> +	uint16_t dac_comp_coeff;
> +	uint8_t dac_comp_enabled;
>  };
>  
>  int arizona_clk32k_enable(struct arizona *arizona);
> diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c
> index e77f61c..41b56ee 100644
> --- a/sound/soc/codecs/arizona.c
> +++ b/sound/soc/codecs/arizona.c
> @@ -1127,6 +1127,31 @@ static int arizona_startup(struct snd_pcm_substream *substream,
>  					  constraint);
>  }
>  
> +static void arizona_wm5102_set_dac_comp(struct snd_soc_codec *codec,
> +					unsigned int rate)
> +{
> +	struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
> +	struct arizona *arizona = priv->arizona;
> +	struct reg_default dac_comp[] = {
> +		{ 0x80, 0x3 },
> +		{ ARIZONA_DAC_COMP_1, 0 },
> +		{ ARIZONA_DAC_COMP_2, 0 },
> +		{ 0x80, 0x0 },
> +	};
> +
> +	mutex_lock(&codec->mutex);
> +
> +	dac_comp[1].def = arizona->dac_comp_coeff;
> +	if (rate >= 176400)
> +		dac_comp[2].def = arizona->dac_comp_enabled;
> +
> +	mutex_unlock(&codec->mutex);
> +
> +	regmap_multi_reg_write(arizona->regmap,
> +			       dac_comp,
> +			       ARRAY_SIZE(dac_comp));
> +}
> +
>  static int arizona_hw_params_rate(struct snd_pcm_substream *substream,
>  				  struct snd_pcm_hw_params *params,
>  				  struct snd_soc_dai *dai)
> @@ -1153,6 +1178,15 @@ static int arizona_hw_params_rate(struct snd_pcm_substream *substream,
>  
>  	switch (dai_priv->clk) {
>  	case ARIZONA_CLK_SYSCLK:
> +		switch (priv->arizona->type) {
> +		case WM5102:
> +			arizona_wm5102_set_dac_comp(codec,
> +						    params_rate(params));
> +			break;
> +		default:
> +			break;
> +		}
> +
>  		snd_soc_update_bits(codec, ARIZONA_SAMPLE_RATE_1,
>  				    ARIZONA_SAMPLE_RATE_1_MASK, sr_val);
>  		if (base)
> diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c
> index 289b64d..a40ea4d 100644
> --- a/sound/soc/codecs/wm5102.c
> +++ b/sound/soc/codecs/wm5102.c
> @@ -612,6 +612,62 @@ static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w,
>  	return 0;
>  }
>  
> +static int wm5102_out_comp_coeff_get(struct snd_kcontrol *kcontrol,
> +				     struct snd_ctl_elem_value *ucontrol)
> +{
> +	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
> +	struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
> +	uint16_t data;
> +
> +	mutex_lock(&codec->mutex);
> +	data = cpu_to_be16(arizona->dac_comp_coeff);
> +	memcpy(ucontrol->value.bytes.data, &data, sizeof(data));
> +	mutex_unlock(&codec->mutex);
> +
> +	return 0;
> +}
> +
> +static int wm5102_out_comp_coeff_put(struct snd_kcontrol *kcontrol,
> +				     struct snd_ctl_elem_value *ucontrol)
> +{
> +	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
> +	struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
> +
> +	mutex_lock(&codec->mutex);
> +	memcpy(&arizona->dac_comp_coeff, ucontrol->value.bytes.data,
> +	       sizeof(arizona->dac_comp_coeff));
> +	arizona->dac_comp_coeff = be16_to_cpu(arizona->dac_comp_coeff);
> +	mutex_unlock(&codec->mutex);
> +
> +	return 0;
> +}
> +
> +static int wm5102_out_comp_switch_get(struct snd_kcontrol *kcontrol,
> +				      struct snd_ctl_elem_value *ucontrol)
> +{
> +	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
> +	struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
> +
> +	mutex_lock(&codec->mutex);
> +	ucontrol->value.integer.value[0] = arizona->dac_comp_enabled;
> +	mutex_unlock(&codec->mutex);
> +
> +	return 0;
> +}
> +
> +static int wm5102_out_comp_switch_put(struct snd_kcontrol *kcontrol,
> +				      struct snd_ctl_elem_value *ucontrol)
> +{
> +	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
> +	struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
> +
> +	mutex_lock(&codec->mutex);
> +	arizona->dac_comp_enabled = ucontrol->value.integer.value[0];
> +	mutex_unlock(&codec->mutex);
> +
> +	return 0;
> +}
> +
>  static const char *wm5102_osr_text[] = {
>  	"Low power", "Normal", "High performance",
>  };
> @@ -843,6 +899,12 @@ SOC_SINGLE_TLV("Noise Gate Threshold Volume", ARIZONA_NOISE_GATE_CONTROL,
>  	       ARIZONA_NGATE_THR_SHIFT, 7, 1, ng_tlv),
>  SOC_ENUM("Noise Gate Hold", arizona_ng_hold),
>  
> +SND_SOC_BYTES_EXT("Output Compensation Coefficient", 0, 1,
> +		  wm5102_out_comp_coeff_get, wm5102_out_comp_coeff_put),
> +
> +SOC_SINGLE_EXT("Output Compensation Switch", 0, 0, 1, 0,
> +	       wm5102_out_comp_switch_get, wm5102_out_comp_switch_put),
> +
>  WM5102_NG_SRC("HPOUT1L", ARIZONA_NOISE_GATE_SELECT_1L),
>  WM5102_NG_SRC("HPOUT1R", ARIZONA_NOISE_GATE_SELECT_1R),
>  WM5102_NG_SRC("HPOUT2L", ARIZONA_NOISE_GATE_SELECT_2L),

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

  reply	other threads:[~2014-06-17 19:22 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-06 12:33 [PATCH 1/3] ASoC: Add SND_SOC_BYTES_EXT control type Charles Keepax
2014-06-06 12:33 ` [PATCH 2/3] mfd: wm5102: Mark additional registers as volatile Charles Keepax
2014-06-06 13:07   ` Charles Keepax
2014-06-06 12:33 ` [PATCH 3/3] ASoC: wm5102: Add controls to allow shaping of ultrasonic response Charles Keepax
2014-06-17 19:22   ` Lee Jones [this message]
2014-06-06 12:48 ` [PATCH 1/3] ASoC: Add SND_SOC_BYTES_EXT control type Lars-Peter Clausen
2014-06-06 12:53   ` Charles Keepax

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140617192244.GT29841@lee--X1 \
    --to=lee.jones@linaro.org \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@kernel.org \
    --cc=ckeepax@opensource.wolfsonmicro.com \
    --cc=lgirdwood@gmail.org \
    --cc=patches@opensource.wolfsonmicro.com \
    --cc=sameo@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.