"could not register clock provider: %s: %d\n",
                        pdev->name, r);
 
-       mtk_register_reset_controller(node, &clk_rst_desc);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
 
        return r;
 }
 
                        "could not register clock provider: %s: %d\n",
                        pdev->name, r);
 
-       mtk_register_reset_controller(node, &clk_rst_desc);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
 
        return r;
 }
 
                return r;
        }
 
-       mtk_register_reset_controller(node, &clk_rst_desc);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
 
        return 0;
 }
 
        if (r)
                return r;
 
-       mtk_register_reset_controller(node, &clk_rst_desc[0]);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[0]);
 
        return 0;
 }
        if (r)
                return r;
 
-       mtk_register_reset_controller(node, &clk_rst_desc[1]);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[1]);
 
        return 0;
 }
 
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
 
-       mtk_register_reset_controller(node, &clk_rst_desc[0]);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[0]);
 
        return r;
 }
                pr_err("%s(): could not register clock provider: %d\n",
                        __func__, r);
 
-       mtk_register_reset_controller(node, &clk_rst_desc[1]);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[1]);
 
        return r;
 }
 
                        "could not register clock provider: %s: %d\n",
                        pdev->name, r);
 
-       mtk_register_reset_controller(node, &clk_rst_desc);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
 
        return r;
 }
 
                        "could not register clock provider: %s: %d\n",
                        pdev->name, r);
 
-       mtk_register_reset_controller(node, &clk_rst_desc);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
 
        return r;
 }
                        "could not register clock provider: %s: %d\n",
                        pdev->name, r);
 
-       mtk_register_reset_controller(node, &clk_rst_desc);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
 
        return r;
 }
 
        if (r)
                return r;
 
-       mtk_register_reset_controller(node, &clk_rst_desc[0]);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[0]);
 
        return 0;
 }
 
        clk_prepare_enable(clk_data->hws[CLK_PERI_UART0_PD]->clk);
 
-       mtk_register_reset_controller(node, &clk_rst_desc[1]);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[1]);
 
        return 0;
 }
 
                        "could not register clock provider: %s: %d\n",
                        pdev->name, r);
 
-       mtk_register_reset_controller(node, &clk_rst_desc);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
 
        return r;
 }
 
                        "could not register clock provider: %s: %d\n",
                        pdev->name, r);
 
-       mtk_register_reset_controller(node, &clk_rst_desc);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
 
        return r;
 }
                        "could not register clock provider: %s: %d\n",
                        pdev->name, r);
 
-       mtk_register_reset_controller(node, &clk_rst_desc);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
 
        return r;
 }
 
                return r;
        }
 
-       mtk_register_reset_controller(node, &clk_rst_desc);
+       mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
 
        return r;
 }
 
        return 0;
 }
 
+int mtk_register_reset_controller_with_dev(struct device *dev,
+                                          const struct mtk_clk_rst_desc *desc)
+{
+       struct device_node *np = dev->of_node;
+       struct regmap *regmap;
+       const struct reset_control_ops *rcops = NULL;
+       struct mtk_clk_rst_data *data;
+       int ret;
+
+       if (!desc) {
+               dev_err(dev, "mtk clock reset desc is NULL\n");
+               return -EINVAL;
+       }
+
+       switch (desc->version) {
+       case MTK_RST_SIMPLE:
+               rcops = &mtk_reset_ops;
+               break;
+       case MTK_RST_SET_CLR:
+               rcops = &mtk_reset_ops_set_clr;
+               break;
+       default:
+               dev_err(dev, "Unknown reset version %d\n", desc->version);
+               return -EINVAL;
+       }
+
+       regmap = device_node_to_regmap(np);
+       if (IS_ERR(regmap)) {
+               dev_err(dev, "Cannot find regmap %pe\n", regmap);
+               return -EINVAL;
+       }
+
+       data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       data->desc = desc;
+       data->regmap = regmap;
+       data->rcdev.owner = THIS_MODULE;
+       data->rcdev.ops = rcops;
+       data->rcdev.of_node = np;
+       data->rcdev.dev = dev;
+
+       if (data->desc->rst_idx_map_nr > 0) {
+               data->rcdev.of_reset_n_cells = 1;
+               data->rcdev.nr_resets = desc->rst_idx_map_nr;
+               data->rcdev.of_xlate = reset_xlate;
+       } else {
+               data->rcdev.nr_resets = desc->rst_bank_nr * RST_NR_PER_BANK;
+       }
+
+       ret = devm_reset_controller_register(dev, &data->rcdev);
+       if (ret) {
+               dev_err(dev, "could not register reset controller: %d\n", ret);
+               return ret;
+       }
+
+       return 0;
+}
+
 MODULE_LICENSE("GPL");
 
 int mtk_register_reset_controller(struct device_node *np,
                                  const struct mtk_clk_rst_desc *desc);
 
+/**
+ * mtk_register_reset_controller - Register mediatek clock reset controller with device
+ * @np: Pointer to device.
+ * @desc: Constant pointer to description of clock reset.
+ *
+ * Return: 0 on success and errorno otherwise.
+ */
+int mtk_register_reset_controller_with_dev(struct device *dev,
+                                          const struct mtk_clk_rst_desc *desc);
+
 #endif /* __DRV_CLK_MTK_RESET_H */