@@ -64,18 +64,32 @@ const struct clk_ops clk_fixed_factor_ops = {
64
64
};
65
65
EXPORT_SYMBOL_GPL (clk_fixed_factor_ops );
66
66
67
+ static void devm_clk_hw_register_fixed_factor_release (struct device * dev , void * res )
68
+ {
69
+ clk_hw_unregister_fixed_factor (& ((struct clk_fixed_factor * )res )-> hw );
70
+ }
71
+
67
72
static struct clk_hw *
68
73
__clk_hw_register_fixed_factor (struct device * dev , struct device_node * np ,
69
74
const char * name , const char * parent_name , int index ,
70
- unsigned long flags , unsigned int mult , unsigned int div )
75
+ unsigned long flags , unsigned int mult , unsigned int div ,
76
+ bool devm )
71
77
{
72
78
struct clk_fixed_factor * fix ;
73
79
struct clk_init_data init = { };
74
80
struct clk_parent_data pdata = { .index = index };
75
81
struct clk_hw * hw ;
76
82
int ret ;
77
83
78
- fix = kmalloc (sizeof (* fix ), GFP_KERNEL );
84
+ /* You can't use devm without a dev */
85
+ if (devm && !dev )
86
+ return ERR_PTR (- EINVAL );
87
+
88
+ if (devm )
89
+ fix = devres_alloc (devm_clk_hw_register_fixed_factor_release ,
90
+ sizeof (* fix ), GFP_KERNEL );
91
+ else
92
+ fix = kmalloc (sizeof (* fix ), GFP_KERNEL );
79
93
if (!fix )
80
94
return ERR_PTR (- ENOMEM );
81
95
@@ -99,9 +113,13 @@ __clk_hw_register_fixed_factor(struct device *dev, struct device_node *np,
99
113
else
100
114
ret = of_clk_hw_register (np , hw );
101
115
if (ret ) {
102
- kfree (fix );
116
+ if (devm )
117
+ devres_free (fix );
118
+ else
119
+ kfree (fix );
103
120
hw = ERR_PTR (ret );
104
- }
121
+ } else if (devm )
122
+ devres_add (dev , fix );
105
123
106
124
return hw ;
107
125
}
@@ -111,7 +129,7 @@ struct clk_hw *clk_hw_register_fixed_factor(struct device *dev,
111
129
unsigned int mult , unsigned int div )
112
130
{
113
131
return __clk_hw_register_fixed_factor (dev , NULL , name , parent_name , -1 ,
114
- flags , mult , div );
132
+ flags , mult , div , false );
115
133
}
116
134
EXPORT_SYMBOL_GPL (clk_hw_register_fixed_factor );
117
135
@@ -153,6 +171,15 @@ void clk_hw_unregister_fixed_factor(struct clk_hw *hw)
153
171
}
154
172
EXPORT_SYMBOL_GPL (clk_hw_unregister_fixed_factor );
155
173
174
+ struct clk_hw * devm_clk_hw_register_fixed_factor (struct device * dev ,
175
+ const char * name , const char * parent_name , unsigned long flags ,
176
+ unsigned int mult , unsigned int div )
177
+ {
178
+ return __clk_hw_register_fixed_factor (dev , NULL , name , parent_name , -1 ,
179
+ flags , mult , div , true);
180
+ }
181
+ EXPORT_SYMBOL_GPL (devm_clk_hw_register_fixed_factor );
182
+
156
183
#ifdef CONFIG_OF
157
184
static const struct of_device_id set_rate_parent_matches [] = {
158
185
{ .compatible = "allwinner,sun4i-a10-pll3-2x-clk" },
@@ -185,7 +212,7 @@ static struct clk_hw *_of_fixed_factor_clk_setup(struct device_node *node)
185
212
flags |= CLK_SET_RATE_PARENT ;
186
213
187
214
hw = __clk_hw_register_fixed_factor (NULL , node , clk_name , NULL , 0 ,
188
- flags , mult , div );
215
+ flags , mult , div , false );
189
216
if (IS_ERR (hw )) {
190
217
/*
191
218
* Clear OF_POPULATED flag so that clock registration can be
0 commit comments