Message ID | 20201210033617.79300-3-tzungbi@google.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | ASoC: rt1015p: delay 300ms for waiting calibration | expand |
On Thu, Dec 10, 2020 at 11:36:17AM +0800, Tzung-Bi Shih wrote: > + if (!rt1015p->calib_done) { > + msleep(300); > + rt1015p->calib_done = true; > + } Might we need to reset calib_done over suspend? If the device looses power I guess it forgets the calibration.
On Thu, Dec 10, 2020 at 11:42 PM Mark Brown <broonie@kernel.org> wrote: > > On Thu, Dec 10, 2020 at 11:36:17AM +0800, Tzung-Bi Shih wrote: > > > + if (!rt1015p->calib_done) { > > + msleep(300); > > + rt1015p->calib_done = true; > > + } > > Might we need to reset calib_done over suspend? If the device looses > power I guess it forgets the calibration. In our environment, the power VBAT and AVDD are still on even if the system suspends. In more low power mode, AVDD could probably lose. But agree with you, in general, suppose the device needs to calibrate again after suspend/resume is better.
On Fri, Dec 11, 2020 at 12:47:47AM +0800, Tzung-Bi Shih wrote: > On Thu, Dec 10, 2020 at 11:42 PM Mark Brown <broonie@kernel.org> wrote: > > Might we need to reset calib_done over suspend? If the device looses > > power I guess it forgets the calibration. > In our environment, the power VBAT and AVDD are still on even if the > system suspends. In more low power mode, AVDD could probably lose. > But agree with you, in general, suppose the device needs to calibrate > again after suspend/resume is better. Yeah, even on that system there might be a problem if the system goes into hibernate instead of suspend (especially if it hibernates due to running out of battery!).
diff --git a/sound/soc/codecs/rt1015p.c b/sound/soc/codecs/rt1015p.c index 397083ee5b37..bba638e1eb6a 100644 --- a/sound/soc/codecs/rt1015p.c +++ b/sound/soc/codecs/rt1015p.c @@ -4,6 +4,7 @@ // // Copyright 2020 The Linux Foundation. All rights reserved. +#include <linux/delay.h> #include <linux/device.h> #include <linux/err.h> #include <linux/gpio.h> @@ -19,6 +20,7 @@ struct rt1015p_priv { struct gpio_desc *sdb; + bool calib_done; }; static int rt1015p_sdb_event(struct snd_soc_dapm_widget *w, @@ -36,6 +38,11 @@ static int rt1015p_sdb_event(struct snd_soc_dapm_widget *w, case SND_SOC_DAPM_PRE_PMU: gpiod_set_value(rt1015p->sdb, 1); dev_dbg(component->dev, "set sdb to 1"); + + if (!rt1015p->calib_done) { + msleep(300); + rt1015p->calib_done = true; + } break; case SND_SOC_DAPM_POST_PMD: gpiod_set_value(rt1015p->sdb, 0);
RT1015p needs 300ms delay after SDB pulling high for internal calibration during the power on sequence. Delays 300ms right before data sends out to avoid data truncated. Signed-off-by: Tzung-Bi Shih <tzungbi@google.com> --- sound/soc/codecs/rt1015p.c | 7 +++++++ 1 file changed, 7 insertions(+)