Commit 7ed88aa2 authored by Russell King's avatar Russell King Committed by Michael Turquette

clk: fix clk-gpio.c with optional clock= DT property

When the clock DT property is not given, of_clk_get_parent_count()
returns -ENOENT, which then tries to allocate -2 x 4 bytes of memory,
which of course fails, causing the whole driver to fail to create
the clock.

This causes the SolidRun platforms to fail probing the SDHCI1 interface
which is connected to the WiFi.

Fix this by detecting errno codes, skipping the allocation, and fixing
of_clk_gpio_gate_delayed_register_get() to handle a NULL parent_names
array.

Fixes: 80eeb1f0 ("clk: add gpio controlled clock multiplexer")
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: default avatarMichael Turquette <mturquette@baylibre.com>
parent 49dea76a
...@@ -264,8 +264,8 @@ static struct clk *of_clk_gpio_gate_delayed_register_get(const char *name, ...@@ -264,8 +264,8 @@ static struct clk *of_clk_gpio_gate_delayed_register_get(const char *name,
const char * const *parent_names, u8 num_parents, const char * const *parent_names, u8 num_parents,
unsigned gpio, bool active_low) unsigned gpio, bool active_low)
{ {
return clk_register_gpio_gate(NULL, name, parent_names[0], return clk_register_gpio_gate(NULL, name, parent_names ?
gpio, active_low, 0); parent_names[0] : NULL, gpio, active_low, 0);
} }
static struct clk *of_clk_gpio_mux_delayed_register_get(const char *name, static struct clk *of_clk_gpio_mux_delayed_register_get(const char *name,
...@@ -295,15 +295,19 @@ static void __init of_gpio_clk_setup(struct device_node *node, ...@@ -295,15 +295,19 @@ static void __init of_gpio_clk_setup(struct device_node *node,
if (!data) if (!data)
return; return;
parent_names = kcalloc(num_parents, sizeof(char *), GFP_KERNEL); if (num_parents) {
if (!parent_names) { parent_names = kcalloc(num_parents, sizeof(char *), GFP_KERNEL);
kfree(data); if (!parent_names) {
return; kfree(data);
return;
}
for (i = 0; i < num_parents; i++)
parent_names[i] = of_clk_get_parent_name(node, i);
} else {
parent_names = NULL;
} }
for (i = 0; i < num_parents; i++)
parent_names[i] = of_clk_get_parent_name(node, i);
data->num_parents = num_parents; data->num_parents = num_parents;
data->parent_names = parent_names; data->parent_names = parent_names;
data->node = node; data->node = node;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment