On Thu 05 Sep 14:00 PDT 2019, Jorge Ramirez-Ortiz wrote: > diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c [..] > +static inline int qcom_get_enable(struct watchdog_device *wdd) > +{ > + int enable = QCOM_WDT_ENABLE; > + > + if (wdd->info->options & WDIOF_PRETIMEOUT) > + enable |= QCOM_WDT_ENABLE_IRQ; Looking at downstream they conditionally write 3 to WDT_EN during initialization, but during suspend/resume they just set it to back to 1. So I don't think you should touch BIT(1) (which name doesn't match downstream or the register documentation) > + > + return enable; > +} > + > +static irqreturn_t qcom_wdt_isr(int irq, void *arg) > +{ > + struct watchdog_device *wdd = arg; > + > + watchdog_notify_pretimeout(wdd); > + > + return IRQ_HANDLED; > +} > + > static int qcom_wdt_start(struct watchdog_device *wdd) > { > struct qcom_wdt *wdt = to_qcom_wdt(wdd); > + unsigned int bark = wdd->timeout; > + > + if (wdd->pretimeout) > + bark = bark - wdd->pretimeout; As Guenter points out, writing wdd->timeout - wdt->pretimeout to WDT_BARK_TIME unconditionally should do the trick. > > writel(0, wdt_addr(wdt, WDT_EN)); > writel(1, wdt_addr(wdt, WDT_RST)); > - writel(wdd->timeout * wdt->rate, wdt_addr(wdt, WDT_BARK_TIME)); > + writel(bark * wdt->rate, wdt_addr(wdt, WDT_BARK_TIME)); > writel(wdd->timeout * wdt->rate, wdt_addr(wdt, WDT_BITE_TIME)); > - writel(1, wdt_addr(wdt, WDT_EN)); > + writel(qcom_get_enable(wdd), wdt_addr(wdt, WDT_EN)); > return 0; > } [..] > @@ -204,7 +248,17 @@ static int qcom_wdt_probe(struct platform_device *pdev) > return -EINVAL; > } > > - wdt->wdd.info = &qcom_wdt_info; > + irq = platform_get_irq(pdev, 0); > + if (irq > 0) { > + if (devm_request_irq(dev, irq, qcom_wdt_isr, > + IRQF_TRIGGER_RISING, "wdt_bark", > + &wdt->wdd)) A failure here means that a irq was specified in DT (platform_get_irq() returned > 0) but you failed to acquire request it, you should fail your probe() when this happens. > + irq = 0; > + } else if (irq == -EPROBE_DEFER) > + return -EPROBE_DEFER; Some {} around this block please. Regards, Bjorn > + > + wdt->wdd.info = irq > 0 ? &qcom_wdt_pt_info : &qcom_wdt_info; > + wdt->wdd.pretimeout = irq > 0 ? 1 : 0; > wdt->wdd.ops = &qcom_wdt_ops; > wdt->wdd.min_timeout = 1; > wdt->wdd.max_timeout = 0x10000000U / wdt->rate; > -- > 2.23.0 >