diff options
Diffstat (limited to 'drivers/clk/clk-gpio.c')
-rw-r--r-- | drivers/clk/clk-gpio.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/drivers/clk/clk-gpio.c b/drivers/clk/clk-gpio.c index 10819e248414..335322dc403f 100644 --- a/drivers/clk/clk-gpio.c +++ b/drivers/clk/clk-gpio.c | |||
@@ -209,6 +209,8 @@ EXPORT_SYMBOL_GPL(clk_register_gpio_mux); | |||
209 | 209 | ||
210 | struct clk_gpio_delayed_register_data { | 210 | struct clk_gpio_delayed_register_data { |
211 | const char *gpio_name; | 211 | const char *gpio_name; |
212 | int num_parents; | ||
213 | const char **parent_names; | ||
212 | struct device_node *node; | 214 | struct device_node *node; |
213 | struct mutex lock; | 215 | struct mutex lock; |
214 | struct clk *clk; | 216 | struct clk *clk; |
@@ -222,8 +224,6 @@ static struct clk *of_clk_gpio_delayed_register_get( | |||
222 | { | 224 | { |
223 | struct clk_gpio_delayed_register_data *data = _data; | 225 | struct clk_gpio_delayed_register_data *data = _data; |
224 | struct clk *clk; | 226 | struct clk *clk; |
225 | const char **parent_names; | ||
226 | int i, num_parents; | ||
227 | int gpio; | 227 | int gpio; |
228 | enum of_gpio_flags of_flags; | 228 | enum of_gpio_flags of_flags; |
229 | 229 | ||
@@ -248,26 +248,14 @@ static struct clk *of_clk_gpio_delayed_register_get( | |||
248 | return ERR_PTR(gpio); | 248 | return ERR_PTR(gpio); |
249 | } | 249 | } |
250 | 250 | ||
251 | num_parents = of_clk_get_parent_count(data->node); | 251 | clk = data->clk_register_get(data->node->name, data->parent_names, |
252 | 252 | data->num_parents, gpio, of_flags & OF_GPIO_ACTIVE_LOW); | |
253 | parent_names = kcalloc(num_parents, sizeof(char *), GFP_KERNEL); | ||
254 | if (!parent_names) { | ||
255 | clk = ERR_PTR(-ENOMEM); | ||
256 | goto out; | ||
257 | } | ||
258 | |||
259 | for (i = 0; i < num_parents; i++) | ||
260 | parent_names[i] = of_clk_get_parent_name(data->node, i); | ||
261 | |||
262 | clk = data->clk_register_get(data->node->name, parent_names, | ||
263 | num_parents, gpio, of_flags & OF_GPIO_ACTIVE_LOW); | ||
264 | if (IS_ERR(clk)) | 253 | if (IS_ERR(clk)) |
265 | goto out; | 254 | goto out; |
266 | 255 | ||
267 | data->clk = clk; | 256 | data->clk = clk; |
268 | out: | 257 | out: |
269 | mutex_unlock(&data->lock); | 258 | mutex_unlock(&data->lock); |
270 | kfree(parent_names); | ||
271 | 259 | ||
272 | return clk; | 260 | return clk; |
273 | } | 261 | } |
@@ -296,11 +284,24 @@ static void __init of_gpio_clk_setup(struct device_node *node, | |||
296 | unsigned gpio, bool active_low)) | 284 | unsigned gpio, bool active_low)) |
297 | { | 285 | { |
298 | struct clk_gpio_delayed_register_data *data; | 286 | struct clk_gpio_delayed_register_data *data; |
287 | const char **parent_names; | ||
288 | int i, num_parents; | ||
299 | 289 | ||
300 | data = kzalloc(sizeof(*data), GFP_KERNEL); | 290 | data = kzalloc(sizeof(*data), GFP_KERNEL); |
301 | if (!data) | 291 | if (!data) |
302 | return; | 292 | return; |
303 | 293 | ||
294 | num_parents = of_clk_get_parent_count(node); | ||
295 | |||
296 | parent_names = kcalloc(num_parents, sizeof(char *), GFP_KERNEL); | ||
297 | if (!parent_names) | ||
298 | return; | ||
299 | |||
300 | for (i = 0; i < num_parents; i++) | ||
301 | parent_names[i] = of_clk_get_parent_name(node, i); | ||
302 | |||
303 | data->num_parents = num_parents; | ||
304 | data->parent_names = parent_names; | ||
304 | data->node = node; | 305 | data->node = node; |
305 | data->gpio_name = gpio_name; | 306 | data->gpio_name = gpio_name; |
306 | data->clk_register_get = clk_register_get; | 307 | data->clk_register_get = clk_register_get; |