RE: [PATCH] rtc: pcf2127: clear the flag TSF1 before enabling interrupt generation

From: Biwen Li (OSS)
Date: Tue Dec 01 2020 - 21:15:53 EST


>
> Hi,
>
> On 01/12/2020 16:47:46+0800, Biwen Li wrote:
> > From: Biwen Li <biwen.li@xxxxxxx>
> >
> > - clear the flag TSF1 before enabling interrupt generation
> > - properly set flag WD_CD for rtc chips(pcf2129, pca2129)
> >
>
> This change has to be a separate patch.
Sure, np. Will separate the patch in v2.
>
> > Signed-off-by: Biwen Li <biwen.li@xxxxxxx>
> > ---
> > drivers/rtc/rtc-pcf2127.c | 21 ++++++++++++++++++++-
> > 1 file changed, 20 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c
> > index 07a5630ec841..0a45e2512258 100644
> > --- a/drivers/rtc/rtc-pcf2127.c
> > +++ b/drivers/rtc/rtc-pcf2127.c
> > @@ -601,6 +601,10 @@ static int pcf2127_probe(struct device *dev, struct
> regmap *regmap,
> > * Watchdog timer enabled and reset pin /RST activated when timed out.
> > * Select 1Hz clock source for watchdog timer.
> > * Note: Countdown timer disabled and not available.
> > + * For pca2129, pcf2129, only bit[7] is for Symbol WD_CD
> > + * of register watchdg_tim_ctl. The bit[6] is labeled
> > + * as T. Bits labeled as T must always be written with
> > + * logic 0.
> > */
> > ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_WD_CTL,
> > PCF2127_BIT_WD_CTL_CD1 |
> > @@ -608,7 +612,7 @@ static int pcf2127_probe(struct device *dev, struct
> regmap *regmap,
> > PCF2127_BIT_WD_CTL_TF1 |
> > PCF2127_BIT_WD_CTL_TF0,
> > PCF2127_BIT_WD_CTL_CD1 |
> > - PCF2127_BIT_WD_CTL_CD0 |
> > + has_nvmem ? (PCF2127_BIT_WD_CTL_CD0) : (0) |
>
> I don't like that because has_nvmem has nothing to do with
> PCF2127_BIT_WD_CTL_CD0 and nothing guarantees that we won't ever get an
> RTC without RST but with NVRAM and that willprobbly be overlooked.
Okay, got it. Will correct it in v2.
>
> > PCF2127_BIT_WD_CTL_TF1);
> > if (ret) {
> > dev_err(dev, "%s: watchdog config (wd_ctl) failed\n", __func__); @@
> > -659,6 +663,21 @@ static int pcf2127_probe(struct device *dev, struct
> regmap *regmap,
> > return ret;
> > }
> >
> > + /*
> > + * Clear TSF1 field of ctrl1 register to clear interrupt
> > + * before enabling interrupt generation when
> > + * timestamp flag set. Unless the flag TSF1 won't
> > + * be cleared and the interrupt(INT pin) is
> > + * triggered continueously.
> > + */
> > + ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL1,
> > + PCF2127_BIT_CTRL1_TSF1,
> > + 0);
> > + if (ret) {
> > + dev_err(dev, "%s: control and status register 1 (ctrl1) failed, ret =
> 0x%x\n",
> > + __func__, ret);
> > + return ret;
> > + }
>
> Doing that means ignoring timestamps taken while the system is offline.
> It also doesn't fully solve the issue because you are not clearing TSF2 here and
> also it never gets cleared by the driver later on so I guess you will get the
> interrupt storm once a timestamp is taken.
Okay, got it. Thanks. Will clear TSF2 flag in v2.
>
>
> --
> Alexandre Belloni, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com