linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Takashi Iwai <tiwai@suse.de>
To: Peter Rosin <peda@lysator.liu.se>
Cc: alsa-devel@alsa-project.org, Peter Rosin <peda@axentia.se>,
	Rob Herring <robh+dt@kernel.org>, Pawel Moll <pawel.moll@arm.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Ian Campbell <ijc+devicetree@hellion.org.uk>,
	Kumar Gala <galak@codeaurora.org>,
	Jaroslav Kysela <perex@perex.cz>,
	Liam Girdwood <lgirdwood@gmail.com>,
	Mark Brown <broonie@kernel.org>,
	Clemens Ladisch <clemens@ladisch.de>,
	Lars-Peter Clausen <lars@metafoo.de>,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 1/7] ALSA: pcm: Add snd_interval_ranges() and snd_pcm_hw_constraint_ranges()
Date: Wed, 28 Jan 2015 18:19:00 +0100	[thread overview]
Message-ID: <s5htwzax1q3.wl-tiwai@suse.de> (raw)
In-Reply-To: <1422454572-7847-2-git-send-email-peda@lysator.liu.se>

At Wed, 28 Jan 2015 15:16:06 +0100,
Peter Rosin wrote:
> 
> From: Peter Rosin <peda@axentia.se>
> 
> Add helper functions to allow drivers to specify several disjoint
> ranges for a variable. In particular, there is a codec (PCM512x) that
> has a hole in its supported range of rates, due to PLL and divider
> restrictions.
> 
> This is like snd_pcm_hw_constraint_list(), but for ranges instead of
> points.
> 
> Signed-off-by: Peter Rosin <peda@axentia.se>
> Reviewed-by: Lars-Peter Clausen <lars@metafoo.de>

Mark, feel free to take my ack if you carry this with other patches
through your tree.
  Reviewed-by: Takashi Iwai <tiwai@suse.de>


thanks,

Takashi

> ---
>  include/sound/pcm.h  |   12 +++++++
>  sound/core/pcm_lib.c |   85 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 97 insertions(+)
> 
> diff --git a/include/sound/pcm.h b/include/sound/pcm.h
> index 1e7f74acc2ec..04fc037e0555 100644
> --- a/include/sound/pcm.h
> +++ b/include/sound/pcm.h
> @@ -275,6 +275,12 @@ struct snd_pcm_hw_constraint_list {
>  	unsigned int mask;
>  };
>  
> +struct snd_pcm_hw_constraint_ranges {
> +	unsigned int count;
> +	const struct snd_interval *ranges;
> +	unsigned int mask;
> +};
> +
>  struct snd_pcm_hwptr_log;
>  
>  struct snd_pcm_runtime {
> @@ -910,6 +916,8 @@ void snd_interval_mulkdiv(const struct snd_interval *a, unsigned int k,
>  			  const struct snd_interval *b, struct snd_interval *c);
>  int snd_interval_list(struct snd_interval *i, unsigned int count,
>  		      const unsigned int *list, unsigned int mask);
> +int snd_interval_ranges(struct snd_interval *i, unsigned int count,
> +			const struct snd_interval *list, unsigned int mask);
>  int snd_interval_ratnum(struct snd_interval *i,
>  			unsigned int rats_count, struct snd_ratnum *rats,
>  			unsigned int *nump, unsigned int *denp);
> @@ -934,6 +942,10 @@ int snd_pcm_hw_constraint_list(struct snd_pcm_runtime *runtime,
>  			       unsigned int cond,
>  			       snd_pcm_hw_param_t var,
>  			       const struct snd_pcm_hw_constraint_list *l);
> +int snd_pcm_hw_constraint_ranges(struct snd_pcm_runtime *runtime,
> +				 unsigned int cond,
> +				 snd_pcm_hw_param_t var,
> +				 const struct snd_pcm_hw_constraint_ranges *r);
>  int snd_pcm_hw_constraint_ratnums(struct snd_pcm_runtime *runtime, 
>  				  unsigned int cond,
>  				  snd_pcm_hw_param_t var,
> diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
> index ec9e7866177f..446c00bd908b 100644
> --- a/sound/core/pcm_lib.c
> +++ b/sound/core/pcm_lib.c
> @@ -1015,6 +1015,60 @@ int snd_interval_list(struct snd_interval *i, unsigned int count,
>  
>  EXPORT_SYMBOL(snd_interval_list);
>  
> +/**
> + * snd_interval_ranges - refine the interval value from the list of ranges
> + * @i: the interval value to refine
> + * @count: the number of elements in the list of ranges
> + * @ranges: the ranges list
> + * @mask: the bit-mask to evaluate
> + *
> + * Refines the interval value from the list of ranges.
> + * When mask is non-zero, only the elements corresponding to bit 1 are
> + * evaluated.
> + *
> + * Return: Positive if the value is changed, zero if it's not changed, or a
> + * negative error code.
> + */
> +int snd_interval_ranges(struct snd_interval *i, unsigned int count,
> +			const struct snd_interval *ranges, unsigned int mask)
> +{
> +	unsigned int k;
> +	struct snd_interval range_union;
> +	struct snd_interval range;
> +
> +	if (!count) {
> +		snd_interval_none(i);
> +		return -EINVAL;
> +	}
> +	snd_interval_any(&range_union);
> +	range_union.min = UINT_MAX;
> +	range_union.max = 0;
> +	for (k = 0; k < count; k++) {
> +		if (mask && !(mask & (1 << k)))
> +			continue;
> +		snd_interval_copy(&range, &ranges[k]);
> +		if (snd_interval_refine(&range, i) < 0)
> +			continue;
> +		if (snd_interval_empty(&range))
> +			continue;
> +
> +		if (range.min < range_union.min) {
> +			range_union.min = range.min;
> +			range_union.openmin = 1;
> +		}
> +		if (range.min == range_union.min && !range.openmin)
> +			range_union.openmin = 0;
> +		if (range.max > range_union.max) {
> +			range_union.max = range.max;
> +			range_union.openmax = 1;
> +		}
> +		if (range.max == range_union.max && !range.openmax)
> +			range_union.openmax = 0;
> +	}
> +	return snd_interval_refine(i, &range_union);
> +}
> +EXPORT_SYMBOL(snd_interval_ranges);
> +
>  static int snd_interval_step(struct snd_interval *i, unsigned int step)
>  {
>  	unsigned int n;
> @@ -1221,6 +1275,37 @@ int snd_pcm_hw_constraint_list(struct snd_pcm_runtime *runtime,
>  
>  EXPORT_SYMBOL(snd_pcm_hw_constraint_list);
>  
> +static int snd_pcm_hw_rule_ranges(struct snd_pcm_hw_params *params,
> +				  struct snd_pcm_hw_rule *rule)
> +{
> +	struct snd_pcm_hw_constraint_ranges *r = rule->private;
> +	return snd_interval_ranges(hw_param_interval(params, rule->var),
> +				   r->count, r->ranges, r->mask);
> +}
> +
> +
> +/**
> + * snd_pcm_hw_constraint_ranges - apply list of range constraints to a parameter
> + * @runtime: PCM runtime instance
> + * @cond: condition bits
> + * @var: hw_params variable to apply the list of range constraints
> + * @r: ranges
> + *
> + * Apply the list of range constraints to an interval parameter.
> + *
> + * Return: Zero if successful, or a negative error code on failure.
> + */
> +int snd_pcm_hw_constraint_ranges(struct snd_pcm_runtime *runtime,
> +				 unsigned int cond,
> +				 snd_pcm_hw_param_t var,
> +				 const struct snd_pcm_hw_constraint_ranges *r)
> +{
> +	return snd_pcm_hw_rule_add(runtime, cond, var,
> +				   snd_pcm_hw_rule_ranges, (void *)r,
> +				   var, -1);
> +}
> +EXPORT_SYMBOL(snd_pcm_hw_constraint_ranges);
> +
>  static int snd_pcm_hw_rule_ratnums(struct snd_pcm_hw_params *params,
>  				   struct snd_pcm_hw_rule *rule)
>  {
> -- 
> 1.7.10.4
> 

  reply	other threads:[~2015-01-28 21:35 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-28 14:16 [PATCH v2 0/7] ASoC: pcm512x: Clock master modes Peter Rosin
2015-01-28 14:16 ` [PATCH v2 1/7] ALSA: pcm: Add snd_interval_ranges() and snd_pcm_hw_constraint_ranges() Peter Rosin
2015-01-28 17:19   ` Takashi Iwai [this message]
2015-01-28 14:16 ` [PATCH v2 2/7] ASoC: pcm512x: Fix spelling of register field names Peter Rosin
2015-01-28 14:16 ` [PATCH v2 3/7] ASoC: pcm512x: Change register default to match actual content after reset Peter Rosin
2015-01-28 19:12   ` Mark Brown
2015-01-28 20:42     ` Peter Rosin
2015-01-28 14:16 ` [PATCH v2 4/7] ASoC: pcm512x: Support mastering BCLK/LRCLK without using the PLL Peter Rosin
2015-01-28 14:16 ` [PATCH v2 5/7] ASoC: pcm512x: Support mastering BCLK/LRCLK " Peter Rosin
2015-01-28 19:14   ` Mark Brown
2015-01-28 14:16 ` [PATCH v2 6/7] ASoC: pcm512x: Avoid the PLL for the DAC clock, if possible Peter Rosin
2015-01-28 14:16 ` [PATCH v2 7/7] ASoC: pcm512x: Support SND_SOC_DAIFMT_CBM_CFS Peter Rosin
2015-01-28 19:29 ` [PATCH v2 0/7] ASoC: pcm512x: Clock master modes Mark Brown

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=s5htwzax1q3.wl-tiwai@suse.de \
    --to=tiwai@suse.de \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@kernel.org \
    --cc=clemens@ladisch.de \
    --cc=devicetree@vger.kernel.org \
    --cc=galak@codeaurora.org \
    --cc=ijc+devicetree@hellion.org.uk \
    --cc=lars@metafoo.de \
    --cc=lgirdwood@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=pawel.moll@arm.com \
    --cc=peda@axentia.se \
    --cc=peda@lysator.liu.se \
    --cc=perex@perex.cz \
    --cc=robh+dt@kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).