Commit e8936f69 authored by Sascha Hauer's avatar Sascha Hauer Committed by Mark Brown

ASoC: fsl_micfil: simplify clock setting

The reference manual has this for calculating the micfil internal clock
divider:

         MICFIL Clock rate
clkdiv = -----------------
         8 * OSR * outrate

(with OSR == Oversampling Rate, outrate == output sample rate)

The driver first sets the MICFIL Clock rate to (outrate * 1024) and then
calculates back the clkdiv value from the above calculation.

Simplify this by using a fixed clkdiv value of 8 and set the MICFIL
Clock rate to (outrate * clkdiv * OSR * 8).

While at it drop disabling the clock before setting its rate. The MICFIL
module is disabled when the rate is changed and it is also resetted
before it is started again, so I doubt it's necessary to disable the
clock.
Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
Acked-by: default avatarShengjiu Wang <shengjiu.wang@gmail.com>
Link: https://lore.kernel.org/r/20220414162249.3934543-16-s.hauer@pengutronix.deSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent be6aeee2
...@@ -110,19 +110,6 @@ static const struct snd_kcontrol_new fsl_micfil_snd_controls[] = { ...@@ -110,19 +110,6 @@ static const struct snd_kcontrol_new fsl_micfil_snd_controls[] = {
snd_soc_get_enum_double, snd_soc_put_enum_double), snd_soc_get_enum_double, snd_soc_put_enum_double),
}; };
static inline int get_clk_div(struct fsl_micfil *micfil,
unsigned int rate)
{
long mclk_rate;
int clk_div;
mclk_rate = clk_get_rate(micfil->mclk);
clk_div = mclk_rate / (rate * MICFIL_OSR_DEFAULT * 8);
return clk_div;
}
/* The SRES is a self-negated bit which provides the CPU with the /* The SRES is a self-negated bit which provides the CPU with the
* capability to initialize the PDM Interface module through the * capability to initialize the PDM Interface module through the
* slave-bus interface. This bit always reads as zero, and this * slave-bus interface. This bit always reads as zero, and this
...@@ -146,24 +133,6 @@ static int fsl_micfil_reset(struct device *dev) ...@@ -146,24 +133,6 @@ static int fsl_micfil_reset(struct device *dev)
return 0; return 0;
} }
static int fsl_micfil_set_mclk_rate(struct fsl_micfil *micfil,
unsigned int freq)
{
struct device *dev = &micfil->pdev->dev;
int ret;
clk_disable_unprepare(micfil->mclk);
ret = clk_set_rate(micfil->mclk, freq * 1024);
if (ret)
dev_warn(dev, "failed to set rate (%u): %d\n",
freq * 1024, ret);
clk_prepare_enable(micfil->mclk);
return ret;
}
static int fsl_micfil_startup(struct snd_pcm_substream *substream, static int fsl_micfil_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai) struct snd_soc_dai *dai)
{ {
...@@ -237,13 +206,12 @@ static int fsl_micfil_trigger(struct snd_pcm_substream *substream, int cmd, ...@@ -237,13 +206,12 @@ static int fsl_micfil_trigger(struct snd_pcm_substream *substream, int cmd,
static int fsl_set_clock_params(struct device *dev, unsigned int rate) static int fsl_set_clock_params(struct device *dev, unsigned int rate)
{ {
struct fsl_micfil *micfil = dev_get_drvdata(dev); struct fsl_micfil *micfil = dev_get_drvdata(dev);
int clk_div; int clk_div = 8;
int ret; int ret;
ret = fsl_micfil_set_mclk_rate(micfil, rate); ret = clk_set_rate(micfil->mclk, rate * clk_div * MICFIL_OSR_DEFAULT * 8);
if (ret < 0) if (ret)
dev_err(dev, "failed to set mclk[%lu] to rate %u\n", return ret;
clk_get_rate(micfil->mclk), rate);
/* set CICOSR */ /* set CICOSR */
ret = regmap_update_bits(micfil->regmap, REG_MICFIL_CTRL2, ret = regmap_update_bits(micfil->regmap, REG_MICFIL_CTRL2,
...@@ -252,11 +220,6 @@ static int fsl_set_clock_params(struct device *dev, unsigned int rate) ...@@ -252,11 +220,6 @@ static int fsl_set_clock_params(struct device *dev, unsigned int rate)
if (ret) if (ret)
return ret; return ret;
/* set CLK_DIV */
clk_div = get_clk_div(micfil, rate);
if (clk_div < 0)
ret = -EINVAL;
ret = regmap_update_bits(micfil->regmap, REG_MICFIL_CTRL2, ret = regmap_update_bits(micfil->regmap, REG_MICFIL_CTRL2,
MICFIL_CTRL2_CLKDIV, MICFIL_CTRL2_CLKDIV,
FIELD_PREP(MICFIL_CTRL2_CLKDIV, clk_div)); FIELD_PREP(MICFIL_CTRL2_CLKDIV, clk_div));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment