fu....@linaro.org wrote:
+       if (action) {
+               irq = platform_get_irq(pdev, 0);
+               if (irq < 0) {
+                       action = 0;
+                       dev_warn(dev, "unable to get ws0 interrupt.\n");
+               } else {
+                       if (devm_request_irq(dev, irq, sbsa_gwdt_interrupt, 0,
+                                            pdev->name, gwdt)) {
+                               action = 0;
+                               dev_warn(dev, "unable to request IRQ %d.\n",
+                                        irq);
+                       }
+               }
+               if (!action)
+                       dev_warn(dev, "falling back to signle stage mode.\n");
+       }
+
+       /*
+        * Get the frequency of system counter from the cp15 interface of ARM
+        * Generic timer. We don't need to check it, because if it returns "0",
+        * system would panic in very early stage.
+        */
+       gwdt->clk = arch_timer_get_cntfrq();
+       gwdt->refresh_base = rf_base;
+       gwdt->control_base = cf_base;

I think you need to ping the watchdog before enabling the interrupt, in case there is a pending interrupt. This just happened to me in testing, so I recommend this:

        /*
         * Get the frequency of system counter from the cp15 interface of ARM
         * Generic timer. We don't need to check it, because if it returns "0",
         * system would panic in very early stage.
         */
        gwdt->clk = arch_timer_get_cntfrq();
        gwdt->refresh_base = rf_base;
        gwdt->control_base = cf_base;

        if (action) {
                irq = platform_get_irq(pdev, 0);
                if (irq < 0) {
                        action = 0;
                        dev_warn(dev, "unable to get ws0 interrupt.\n");
                } else {
                        sbsa_gwdt_keepalive(&gwdt->wdd);
                        if (devm_request_irq(dev, irq, sbsa_gwdt_interrupt, 0,
                                             pdev->name, gwdt)) {
                                action = 0;
                                dev_warn(dev, "unable to request IRQ %d.\n",
                                         irq);
                        }
                }
                if (!action)
                        dev_warn(dev, "falling back to single stage mode.\n");
        }

In fact, I think you need to move the "if (action) {" block near the end of sbsa_gwdt_probe(). We don't want to enable the interrupt until the watchdog is fully initialized.

--
Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora
Forum, a Linux Foundation collaborative project.
--
To unsubscribe from this list: send the line "unsubscribe linux-doc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to