struct omap_clkctrl_provider {
        void __iomem *base;
        struct list_head clocks;
+       char *clkdm_name;
 };
 
 struct omap_clkctrl_clk {
        .enable         = _omap4_clkctrl_clk_enable,
        .disable        = _omap4_clkctrl_clk_disable,
        .is_enabled     = _omap4_clkctrl_clk_is_enabled,
+       .init           = omap2_init_clk_clkdm,
 };
 
 static struct clk_hw *_ti_omap4_clkctrl_xlate(struct of_phandle_args *clkspec,
 
        provider->base = of_iomap(node, 0);
 
+       provider->clkdm_name = kmalloc(strlen(node->parent->name) + 3,
+                                      GFP_KERNEL);
+       if (!provider->clkdm_name) {
+               kfree(provider);
+               return;
+       }
+
+       /*
+        * Create default clkdm name, replace _cm from end of parent node
+        * name with _clkdm
+        */
+       strcpy(provider->clkdm_name, node->parent->name);
+       provider->clkdm_name[strlen(provider->clkdm_name) - 2] = 0;
+       strcat(provider->clkdm_name, "clkdm");
+
        INIT_LIST_HEAD(&provider->clocks);
 
        /* Generate clocks */
                if (reg_data->flags & CLKF_NO_IDLEST)
                        hw->flags |= NO_IDLEST;
 
+               if (reg_data->clkdm_name)
+                       hw->clkdm_name = reg_data->clkdm_name;
+               else
+                       hw->clkdm_name = provider->clkdm_name;
+
                init.parent_names = ®_data->parent;
                init.num_parents = 1;
                init.flags = 0;