#include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
 #include <linux/slab.h>
 #include <linux/sys_soc.h>
 
        platform_set_drvdata(pdev, fuse);
        fuse->dev = &pdev->dev;
 
+       pm_runtime_enable(&pdev->dev);
+
        if (fuse->soc->probe) {
                err = fuse->soc->probe(fuse);
                if (err < 0)
 restore:
        fuse->clk = NULL;
        fuse->base = base;
+       pm_runtime_disable(&pdev->dev);
        return err;
 }
 
+static int __maybe_unused tegra_fuse_runtime_resume(struct device *dev)
+{
+       int err;
+
+       err = clk_prepare_enable(fuse->clk);
+       if (err < 0) {
+               dev_err(dev, "failed to enable FUSE clock: %d\n", err);
+               return err;
+       }
+
+       return 0;
+}
+
+static int __maybe_unused tegra_fuse_runtime_suspend(struct device *dev)
+{
+       clk_disable_unprepare(fuse->clk);
+
+       return 0;
+}
+
+static const struct dev_pm_ops tegra_fuse_pm = {
+       SET_RUNTIME_PM_OPS(tegra_fuse_runtime_suspend, tegra_fuse_runtime_resume,
+                          NULL)
+};
+
 static struct platform_driver tegra_fuse_driver = {
        .driver = {
                .name = "tegra-fuse",
                .of_match_table = tegra_fuse_match,
+               .pm = &tegra_fuse_pm,
                .suppress_bind_attrs = true,
        },
        .probe = tegra_fuse_probe,
 
 #include <linux/kobject.h>
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
 #include <linux/random.h>
 
 #include <soc/tegra/fuse.h>
        u32 value = 0;
        int err;
 
+       err = pm_runtime_resume_and_get(fuse->dev);
+       if (err)
+               return err;
+
        mutex_lock(&fuse->apbdma.lock);
 
        fuse->apbdma.config.src_addr = fuse->phys + FUSE_BEGIN + offset;
 
        reinit_completion(&fuse->apbdma.wait);
 
-       clk_prepare_enable(fuse->clk);
-
        dmaengine_submit(dma_desc);
        dma_async_issue_pending(fuse->apbdma.chan);
        time_left = wait_for_completion_timeout(&fuse->apbdma.wait,
        else
                value = *fuse->apbdma.virt;
 
-       clk_disable_unprepare(fuse->clk);
-
 out:
        mutex_unlock(&fuse->apbdma.lock);
+       pm_runtime_put(fuse->dev);
        return value;
 }
 
 
 #include <linux/of_device.h>
 #include <linux/of_address.h>
 #include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
 #include <linux/random.h>
 
 #include <soc/tegra/fuse.h>
        u32 value;
        int err;
 
-       err = clk_prepare_enable(fuse->clk);
-       if (err < 0) {
-               dev_err(fuse->dev, "failed to enable FUSE clock: %d\n", err);
+       err = pm_runtime_resume_and_get(fuse->dev);
+       if (err)
                return 0;
-       }
 
        value = readl_relaxed(fuse->base + FUSE_BEGIN + offset);
 
-       clk_disable_unprepare(fuse->clk);
+       pm_runtime_put(fuse->dev);
 
        return value;
 }