Message ID | 20191016085845.11672-1-shumingf@realtek.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 8de6e755069fbfaefae67d3abff2b2e3d83db986 |
Headers | show |
Series | ASoC: rt1011: Read and apply r0 and temperature device property | expand |
On Wed, Oct 16, 2019 at 4:59 PM <shumingf@realtek.com> wrote: > > From: Shuming Fan <shumingf@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@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@chromium.org>
On Wed, Oct 16, 2019 at 04:58:45PM +0800, shumingf@realtek.com wrote: > +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); These are new DT bindings and need to be added to the binding document.
On Wed, Oct 16, 2019 at 7:29 PM Shuming [范書銘] <shumingf@realtek.com> wrote: > > > On Wed, Oct 16, 2019 at 04:58:45PM +0800, shumingf@realtek.com wrote: > > > > > +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); > > > > These are new DT bindings and need to be added to the binding document. > > Sure, could I send another patch for it? > > > ------Please consider the environment before printing this e-mail. Hi Shuming, Yes, you will need a patch before this one to add the binding documentation. Thanks!
On Wed, Oct 16, 2019 at 11:28:47AM +0000, Shuming [范書銘] wrote: > > These are new DT bindings and need to be added to the binding document. > Sure, could I send another patch for it? Yes, the DT bindings should go in a separate patch anyway.
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; };