]>
git.ipfire.org Git - thirdparty/kernel/stable.git/blob - drivers/clk/clk-devres.c
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
*devm_clk_get_optional(struct device
*dev
, const char *id
)
34 struct clk
*clk
= devm_clk_get(dev
, id
);
36 if (clk
== ERR_PTR(-ENOENT
))
41 EXPORT_SYMBOL(devm_clk_get_optional
);
43 struct clk_bulk_devres
{
44 struct clk_bulk_data
*clks
;
48 static void devm_clk_bulk_release(struct device
*dev
, void *res
)
50 struct clk_bulk_devres
*devres
= res
;
52 clk_bulk_put(devres
->num_clks
, devres
->clks
);
55 int __must_check
devm_clk_bulk_get(struct device
*dev
, int num_clks
,
56 struct clk_bulk_data
*clks
)
58 struct clk_bulk_devres
*devres
;
61 devres
= devres_alloc(devm_clk_bulk_release
,
62 sizeof(*devres
), GFP_KERNEL
);
66 ret
= clk_bulk_get(dev
, num_clks
, clks
);
69 devres
->num_clks
= num_clks
;
70 devres_add(dev
, devres
);
77 EXPORT_SYMBOL_GPL(devm_clk_bulk_get
);
79 int __must_check
devm_clk_bulk_get_all(struct device
*dev
,
80 struct clk_bulk_data
**clks
)
82 struct clk_bulk_devres
*devres
;
85 devres
= devres_alloc(devm_clk_bulk_release
,
86 sizeof(*devres
), GFP_KERNEL
);
90 ret
= clk_bulk_get_all(dev
, &devres
->clks
);
93 devres
->num_clks
= ret
;
94 devres_add(dev
, devres
);
101 EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all
);
103 static int devm_clk_match(struct device
*dev
, void *res
, void *data
)
105 struct clk
**c
= res
;
113 void devm_clk_put(struct device
*dev
, struct clk
*clk
)
117 ret
= devres_release(dev
, devm_clk_release
, devm_clk_match
, clk
);
121 EXPORT_SYMBOL(devm_clk_put
);
123 struct clk
*devm_get_clk_from_child(struct device
*dev
,
124 struct device_node
*np
, const char *con_id
)
126 struct clk
**ptr
, *clk
;
128 ptr
= devres_alloc(devm_clk_release
, sizeof(*ptr
), GFP_KERNEL
);
130 return ERR_PTR(-ENOMEM
);
132 clk
= of_clk_get_by_name(np
, con_id
);
135 devres_add(dev
, ptr
);
142 EXPORT_SYMBOL(devm_get_clk_from_child
);