static int snvs_rtc_read_time(struct device *dev, struct rtc_time *tm)
 {
        struct snvs_rtc_data *data = dev_get_drvdata(dev);
-       unsigned long time = rtc_read_lp_counter(data);
+       unsigned long time;
+       int ret;
+
+       if (data->clk) {
+               ret = clk_enable(data->clk);
+               if (ret)
+                       return ret;
+       }
 
+       time = rtc_read_lp_counter(data);
        rtc_time64_to_tm(time, tm);
 
+       if (data->clk)
+               clk_disable(data->clk);
+
        return 0;
 }
 
        unsigned long time = rtc_tm_to_time64(tm);
        int ret;
 
+       if (data->clk) {
+               ret = clk_enable(data->clk);
+               if (ret)
+                       return ret;
+       }
+
        /* Disable RTC first */
        ret = snvs_rtc_enable(data, false);
        if (ret)
        /* Enable RTC again */
        ret = snvs_rtc_enable(data, true);
 
+       if (data->clk)
+               clk_disable(data->clk);
+
        return ret;
 }
 
 {
        struct snvs_rtc_data *data = dev_get_drvdata(dev);
        u32 lptar, lpsr;
+       int ret;
+
+       if (data->clk) {
+               ret = clk_enable(data->clk);
+               if (ret)
+                       return ret;
+       }
 
        regmap_read(data->regmap, data->offset + SNVS_LPTAR, &lptar);
        rtc_time64_to_tm(lptar, &alrm->time);
        regmap_read(data->regmap, data->offset + SNVS_LPSR, &lpsr);
        alrm->pending = (lpsr & SNVS_LPSR_LPTA) ? 1 : 0;
 
+       if (data->clk)
+               clk_disable(data->clk);
+
        return 0;
 }
 
 static int snvs_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
 {
        struct snvs_rtc_data *data = dev_get_drvdata(dev);
+       int ret;
+
+       if (data->clk) {
+               ret = clk_enable(data->clk);
+               if (ret)
+                       return ret;
+       }
 
        regmap_update_bits(data->regmap, data->offset + SNVS_LPCR,
                           (SNVS_LPCR_LPTA_EN | SNVS_LPCR_LPWUI_EN),
                           enable ? (SNVS_LPCR_LPTA_EN | SNVS_LPCR_LPWUI_EN) : 0);
 
-       return rtc_write_sync_lp(data);
+       ret = rtc_write_sync_lp(data);
+
+       if (data->clk)
+               clk_disable(data->clk);
+
+       return ret;
 }
 
 static int snvs_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
        unsigned long time = rtc_tm_to_time64(&alrm->time);
        int ret;
 
+       if (data->clk) {
+               ret = clk_enable(data->clk);
+               if (ret)
+                       return ret;
+       }
+
        regmap_update_bits(data->regmap, data->offset + SNVS_LPCR, SNVS_LPCR_LPTA_EN, 0);
        ret = rtc_write_sync_lp(data);
        if (ret)
        /* Clear alarm interrupt status bit */
        regmap_write(data->regmap, data->offset + SNVS_LPSR, SNVS_LPSR_LPTA);
 
+       if (data->clk)
+               clk_disable(data->clk);
+
        return snvs_rtc_alarm_irq_enable(dev, alrm->enabled);
 }