Thread (14 messages) 14 messages, 3 authors, 2016-02-28

[PATCH v12 4/4] Watchdog: introduce ARM SBSA watchdog driver

From: Fu Wei <hidden>
Date: 2016-02-28 14:01:58
Also in: linux-devicetree, linux-watchdog, lkml

Hi Timur,

On 27 February 2016 at 03:27, Timur Tabi [off-list ref] wrote:
fu.wei at linaro.org wrote:
quoted
+       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:
quoted
        /*
         * 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.
Good point! Thanks for your testing :-)

Will post v14 for this change.
--
Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora
Forum, a Linux Foundation collaborative project.


-- 
Best regards,

Fu Wei
Software Engineer
Red Hat Software (Beijing) Co.,Ltd.Shanghai Branch
Ph: +86 21 61221326(direct)
Ph: +86 186 2020 4684 (mobile)
Room 1512, Regus One Corporate Avenue,Level 15,
One Corporate Avenue,222 Hubin Road,Huangpu District,
Shanghai,China 200021
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help