OSDN Git Service

rtc: ds3232: fix call trace when rtc->ops_lock is used as NULL
authorQianyu Gong <qianyu.gong@nxp.com>
Thu, 21 Apr 2016 06:55:40 +0000 (14:55 +0800)
committerAlexandre Belloni <alexandre.belloni@free-electrons.com>
Fri, 20 May 2016 10:33:51 +0000 (12:33 +0200)
The rtc->ops_lock would be accessed in ds3232_irq() without being
initialized as rtc_device_register() is called too late.

So move devm_rtc_device_register() just before registering irq handler
to initialize rtc->ops_lock earlier.

Signed-off-by: Gong Qianyu <Qianyu.Gong@nxp.com>
Reviewed-by: Akinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
drivers/rtc/rtc-ds3232.c

index 7edc889..04fbd7f 100644 (file)
@@ -369,6 +369,11 @@ static int ds3232_probe(struct device *dev, struct regmap *regmap, int irq,
        if (ret)
                return ret;
 
+       ds3232->rtc = devm_rtc_device_register(dev, name, &ds3232_rtc_ops,
+                                               THIS_MODULE);
+       if (IS_ERR(ds3232->rtc))
+               return PTR_ERR(ds3232->rtc);
+
        if (ds3232->irq > 0) {
                ret = devm_request_threaded_irq(dev, ds3232->irq, NULL,
                                                ds3232_irq,
@@ -380,10 +385,8 @@ static int ds3232_probe(struct device *dev, struct regmap *regmap, int irq,
                } else
                        device_init_wakeup(dev, 1);
        }
-       ds3232->rtc = devm_rtc_device_register(dev, name, &ds3232_rtc_ops,
-                                               THIS_MODULE);
 
-       return PTR_ERR_OR_ZERO(ds3232->rtc);
+       return 0;
 }
 
 #ifdef CONFIG_PM_SLEEP