return 0;
 }
 
+static int dispc_init_hw(struct dispc_device *dispc)
+{
+       struct device *dev = dispc->dev;
+       int ret;
+
+       ret = pm_runtime_set_active(dev);
+       if (ret) {
+               dev_err(dev, "Failed to set DSS PM to active\n");
+               return ret;
+       }
+
+       ret = clk_prepare_enable(dispc->fclk);
+       if (ret) {
+               dev_err(dev, "Failed to enable DSS fclk\n");
+               goto err_runtime_suspend;
+       }
+
+       ret = dispc_softreset(dispc);
+       if (ret)
+               goto err_clk_disable;
+
+       clk_disable_unprepare(dispc->fclk);
+       ret = pm_runtime_set_suspended(dev);
+       if (ret) {
+               dev_err(dev, "Failed to set DSS PM to suspended\n");
+               return ret;
+       }
+
+       return 0;
+
+err_clk_disable:
+       clk_disable_unprepare(dispc->fclk);
+
+err_runtime_suspend:
+       ret = pm_runtime_set_suspended(dev);
+       if (ret) {
+               dev_err(dev, "Failed to set DSS PM to suspended\n");
+               return ret;
+       }
+
+       return ret;
+}
+
 int dispc_init(struct tidss_device *tidss)
 {
        struct device *dev = tidss->dev;
        of_property_read_u32(dispc->dev->of_node, "max-memory-bandwidth",
                             &dispc->memory_bandwidth_limit);
 
-       r = dispc_softreset(dispc);
+       r = dispc_init_hw(dispc);
        if (r)
                return r;