[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