1 // SPDX-License-Identifier: GPL-2.0
3 #include <linux/device.h>
4 #include <linux/export.h>
7 static void devm_clk_release(struct device *dev, void *res)
9 clk_put(*(struct clk **)res);
12 struct clk *devm_clk_get(struct device *dev, const char *id)
14 struct clk **ptr, *clk;
16 ptr = devres_alloc(devm_clk_release, sizeof(*ptr), GFP_KERNEL);
18 return ERR_PTR(-ENOMEM);
20 clk = clk_get(dev, id);
30 EXPORT_SYMBOL(devm_clk_get);
32 struct clk_bulk_devres {
33 struct clk_bulk_data *clks;
37 static void devm_clk_bulk_release(struct device *dev, void *res)
39 struct clk_bulk_devres *devres = res;
41 clk_bulk_put(devres->num_clks, devres->clks);
44 int __must_check devm_clk_bulk_get(struct device *dev, int num_clks,
45 struct clk_bulk_data *clks)
47 struct clk_bulk_devres *devres;
50 devres = devres_alloc(devm_clk_bulk_release,
51 sizeof(*devres), GFP_KERNEL);
55 ret = clk_bulk_get(dev, num_clks, clks);
58 devres->num_clks = num_clks;
59 devres_add(dev, devres);
66 EXPORT_SYMBOL_GPL(devm_clk_bulk_get);
68 int __must_check devm_clk_bulk_get_all(struct device *dev,
69 struct clk_bulk_data **clks)
71 struct clk_bulk_devres *devres;
74 devres = devres_alloc(devm_clk_bulk_release,
75 sizeof(*devres), GFP_KERNEL);
79 ret = clk_bulk_get_all(dev, &devres->clks);
82 devres->num_clks = ret;
83 devres_add(dev, devres);
90 EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all);
92 static int devm_clk_match(struct device *dev, void *res, void *data)
102 void devm_clk_put(struct device *dev, struct clk *clk)
106 ret = devres_release(dev, devm_clk_release, devm_clk_match, clk);
110 EXPORT_SYMBOL(devm_clk_put);
112 struct clk *devm_get_clk_from_child(struct device *dev,
113 struct device_node *np, const char *con_id)
115 struct clk **ptr, *clk;
117 ptr = devres_alloc(devm_clk_release, sizeof(*ptr), GFP_KERNEL);
119 return ERR_PTR(-ENOMEM);
121 clk = of_clk_get_by_name(np, con_id);
124 devres_add(dev, ptr);
131 EXPORT_SYMBOL(devm_get_clk_from_child);