{
        int ret;
        struct mc13783_rtc *priv;
+       int rtcrst_pending;
 
        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
        if (!priv)
        priv->mc13783 = dev_get_drvdata(pdev->dev.parent);
        platform_set_drvdata(pdev, priv);
 
-       priv->valid = 1;
-
        mc13783_lock(priv->mc13783);
 
        ret = mc13783_irq_request(priv->mc13783, MC13783_IRQ_RTCRST,
        if (ret)
                goto err_reset_irq_request;
 
+       ret = mc13783_irq_status(priv->mc13783, MC13783_IRQ_RTCRST,
+                       NULL, &rtcrst_pending);
+       if (ret)
+               goto err_reset_irq_status;
+
+       priv->valid = !rtcrst_pending;
+
        ret = mc13783_irq_request_nounmask(priv->mc13783, MC13783_IRQ_1HZ,
                        mc13783_rtc_update_handler, DRIVER_NAME, priv);
        if (ret)
                goto err_update_irq_request;
 
-       mc13783_unlock(priv->mc13783);
-
        priv->rtc = rtc_device_register(pdev->name,
                        &pdev->dev, &mc13783_rtc_ops, THIS_MODULE);
-
        if (IS_ERR(priv->rtc)) {
                ret = PTR_ERR(priv->rtc);
 
-               mc13783_lock(priv->mc13783);
-
                mc13783_irq_free(priv->mc13783, MC13783_IRQ_1HZ, priv);
 err_update_irq_request:
 
+err_reset_irq_status:
+
                mc13783_irq_free(priv->mc13783, MC13783_IRQ_RTCRST, priv);
 err_reset_irq_request:
 
-               mc13783_unlock(priv->mc13783);
-
                platform_set_drvdata(pdev, NULL);
                kfree(priv);
        }
 
+       mc13783_unlock(priv->mc13783);
+
        return ret;
 }
 
 {
        struct mc13783_rtc *priv = platform_get_drvdata(pdev);
 
-       rtc_device_unregister(priv->rtc);
-
        mc13783_lock(priv->mc13783);
 
+       rtc_device_unregister(priv->rtc);
+
        mc13783_irq_free(priv->mc13783, MC13783_IRQ_1HZ, priv);
        mc13783_irq_free(priv->mc13783, MC13783_IRQ_RTCRST, priv);