[alsa-devel] [PATCH] ASoC: rt1011: Read and apply r0 and temperature device property

Cheng-yi Chiang cychiang at chromium.org
Wed Oct 16 12:49:23 CEST 2019


On Wed, Oct 16, 2019 at 4:59 PM <shumingf at realtek.com> wrote:
>
> From: Shuming Fan <shumingf at realtek.com>
>
> Typically, the r0 (calibration data) and temperature were measured in the factory.
> This information is written into the non-volatile area
> where keeps data whether factory reset or OS update.
> In Chromium OS case, the coreboot will read the info from VPD and create
> the device property for each rt1011.
>
> Signed-off-by: Shuming Fan <shumingf at realtek.com>
> ---
>  sound/soc/codecs/rt1011.c | 41 ++++++++++++++++++++++++++++++++++++++-
>  sound/soc/codecs/rt1011.h |  1 +
>  2 files changed, 41 insertions(+), 1 deletion(-)
>
> diff --git a/sound/soc/codecs/rt1011.c b/sound/soc/codecs/rt1011.c
> index b927e61b32df..ad049cfddcb0 100644
> --- a/sound/soc/codecs/rt1011.c
> +++ b/sound/soc/codecs/rt1011.c
> @@ -2328,8 +2328,12 @@ static void rt1011_calibration_work(struct work_struct *work)
>         struct rt1011_priv *rt1011 =
>                 container_of(work, struct rt1011_priv, cali_work);
>         struct snd_soc_component *component = rt1011->component;
> +       unsigned int r0_integer, r0_factor, format;
>
> -       rt1011_calibrate(rt1011, 1);
> +       if (rt1011->r0_calib)
> +               rt1011_calibrate(rt1011, 0);
> +       else
> +               rt1011_calibrate(rt1011, 1);
>
>         /*
>          * This flag should reset after booting.
> @@ -2340,6 +2344,39 @@ static void rt1011_calibration_work(struct work_struct *work)
>
>         /* initial */
>         rt1011_reg_init(component);
> +
> +       /* Apply temperature and calibration data from device property */
> +       if (rt1011->temperature_calib) {
> +               snd_soc_component_update_bits(component,
> +                       RT1011_STP_INITIAL_RESISTANCE_TEMP, 0x3ff,
> +                       (rt1011->temperature_calib << 2));
> +       }
> +
> +       if (rt1011->r0_calib) {
> +               rt1011->r0_reg = rt1011->r0_calib;
> +
> +               format = 2147483648U; /* 2^24 * 128 */
> +               r0_integer = format / rt1011->r0_reg / 128;
> +               r0_factor = ((format / rt1011->r0_reg * 100) / 128)
> +                                               - (r0_integer * 100);
> +               dev_info(component->dev,        "DP r0 resistance about %d.%02d ohm, reg=0x%X\n",
> +                       r0_integer, r0_factor, rt1011->r0_reg);
> +
> +               rt1011_r0_load(rt1011);
> +       }
> +}
> +
> +static int rt1011_parse_dp(struct rt1011_priv *rt1011, struct device *dev)
> +{
> +       device_property_read_u32(dev, "realtek,temperature_calib",
> +               &rt1011->temperature_calib);
> +       device_property_read_u32(dev, "realtek,r0_calib",
> +               &rt1011->r0_calib);
> +
> +       dev_dbg(dev, "%s: r0_calib: 0x%x, temperture_calib: 0x%x",
> +               __func__, rt1011->r0_calib, rt1011->temperature_calib);
> +
> +       return 0;
>  }
>
>  static int rt1011_i2c_probe(struct i2c_client *i2c,
> @@ -2356,6 +2393,8 @@ static int rt1011_i2c_probe(struct i2c_client *i2c,
>
>         i2c_set_clientdata(i2c, rt1011);
>
> +       rt1011_parse_dp(rt1011, &i2c->dev);
> +
>         rt1011->regmap = devm_regmap_init_i2c(i2c, &rt1011_regmap);
>         if (IS_ERR(rt1011->regmap)) {
>                 ret = PTR_ERR(rt1011->regmap);
> diff --git a/sound/soc/codecs/rt1011.h b/sound/soc/codecs/rt1011.h
> index 3f7dea1191ad..68fadc15fa8c 100644
> --- a/sound/soc/codecs/rt1011.h
> +++ b/sound/soc/codecs/rt1011.h
> @@ -690,6 +690,7 @@ struct rt1011_priv {
>
>         int bq_drc_set;
>         unsigned int r0_reg, cali_done;
> +       unsigned int r0_calib, temperature_calib;
>         int recv_spk_mode;
>  };
>
> --
> 2.23.0
>
FYI, the relevant coreboot patch series is at
https://review.coreboot.org/c/coreboot/+/36031
I have tested it with coreboot changes.

Tested-By: Cheng-Yi Chiang <cychiang at chromium.org>


More information about the Alsa-devel mailing list