struct device_node *node;
        struct clk *clk;
        struct of_phandle_args clkspec;
+       char buf[64];
+       char *ptr;
+       char *tags[2];
+       int i;
+       int num_args;
+       int ret;
+       static bool clkctrl_nodes_missing;
+       static bool has_clkctrl_data;
 
        for (c = oclks; c->node_name != NULL; c++) {
-               node = of_find_node_by_name(NULL, c->node_name);
+               strcpy(buf, c->node_name);
+               ptr = buf;
+               for (i = 0; i < 2; i++)
+                       tags[i] = NULL;
+               num_args = 0;
+               while (*ptr) {
+                       if (*ptr == ':') {
+                               if (num_args >= 2) {
+                                       pr_warn("Bad number of tags on %s\n",
+                                               c->node_name);
+                                       return;
+                               }
+                               tags[num_args++] = ptr + 1;
+                               *ptr = 0;
+                       }
+                       ptr++;
+               }
+
+               if (num_args && clkctrl_nodes_missing)
+                       continue;
+
+               node = of_find_node_by_name(NULL, buf);
+               if (num_args)
+                       node = of_find_node_by_name(node, "clk");
                clkspec.np = node;
+               clkspec.args_count = num_args;
+               for (i = 0; i < num_args; i++) {
+                       ret = kstrtoint(tags[i], i ? 10 : 16, clkspec.args + i);
+                       if (ret) {
+                               pr_warn("Bad tag in %s at %d: %s\n",
+                                       c->node_name, i, tags[i]);
+                               return;
+                       }
+               }
                clk = of_clk_get_from_provider(&clkspec);
 
                if (!IS_ERR(clk)) {
                        c->lk.clk = clk;
                        clkdev_add(&c->lk);
                } else {
-                       pr_warn("failed to lookup clock node %s\n",
-                               c->node_name);
+                       if (num_args && !has_clkctrl_data) {
+                               if (of_find_compatible_node(NULL, NULL,
+                                                           "ti,clkctrl")) {
+                                       has_clkctrl_data = true;
+                               } else {
+                                       clkctrl_nodes_missing = true;
+
+                                       pr_warn("missing clkctrl nodes, please update your dts.\n");
+                                       continue;
+                               }
+                       }
+
+                       pr_warn("failed to lookup clock node %s, ret=%ld\n",
+                               c->node_name, PTR_ERR(clk));
                }
        }
 }