diff options
author | Tero Kristo <t-kristo@ti.com> | 2015-02-23 14:06:08 -0500 |
---|---|---|
committer | Tero Kristo <t-kristo@ti.com> | 2015-03-24 14:23:36 -0400 |
commit | c807dbedb5e5adbd4e1e2d07574d230df924a5a7 (patch) | |
tree | a1479d6552f50ed68c66a25cc4860b8f68c21bfa | |
parent | c517d838eb7d07bbe9507871fab3931deccff539 (diff) |
clk: ti: fix ti_clk_get_reg_addr error handling
There is a case where NULL can be a valid return value for
ti_clk_get_reg_addr, specifically the case where both the provider index
and register offsets are zero. In this case, the current error checking
against a NULL pointer will fail. Thus, change the API to return a
ERR_PTR value in an error case, and change all the users of this API to
check against IS_ERR instead.
Signed-off-by: Tero Kristo <t-kristo@ti.com>
Acked-by: Michael Turquette <mturquette@linaro.org>
-rw-r--r-- | drivers/clk/ti/apll.c | 5 | ||||
-rw-r--r-- | drivers/clk/ti/autoidle.c | 2 | ||||
-rw-r--r-- | drivers/clk/ti/clk.c | 7 | ||||
-rw-r--r-- | drivers/clk/ti/divider.c | 4 | ||||
-rw-r--r-- | drivers/clk/ti/dpll.c | 6 | ||||
-rw-r--r-- | drivers/clk/ti/gate.c | 4 | ||||
-rw-r--r-- | drivers/clk/ti/interface.c | 2 | ||||
-rw-r--r-- | drivers/clk/ti/mux.c | 4 |
8 files changed, 18 insertions, 16 deletions
diff --git a/drivers/clk/ti/apll.c b/drivers/clk/ti/apll.c index 72d97279eae1..49baf3831546 100644 --- a/drivers/clk/ti/apll.c +++ b/drivers/clk/ti/apll.c | |||
@@ -203,7 +203,7 @@ static void __init of_dra7_apll_setup(struct device_node *node) | |||
203 | ad->control_reg = ti_clk_get_reg_addr(node, 0); | 203 | ad->control_reg = ti_clk_get_reg_addr(node, 0); |
204 | ad->idlest_reg = ti_clk_get_reg_addr(node, 1); | 204 | ad->idlest_reg = ti_clk_get_reg_addr(node, 1); |
205 | 205 | ||
206 | if (!ad->control_reg || !ad->idlest_reg) | 206 | if (IS_ERR(ad->control_reg) || IS_ERR(ad->idlest_reg)) |
207 | goto cleanup; | 207 | goto cleanup; |
208 | 208 | ||
209 | ad->idlest_mask = 0x1; | 209 | ad->idlest_mask = 0x1; |
@@ -384,7 +384,8 @@ static void __init of_omap2_apll_setup(struct device_node *node) | |||
384 | ad->autoidle_reg = ti_clk_get_reg_addr(node, 1); | 384 | ad->autoidle_reg = ti_clk_get_reg_addr(node, 1); |
385 | ad->idlest_reg = ti_clk_get_reg_addr(node, 2); | 385 | ad->idlest_reg = ti_clk_get_reg_addr(node, 2); |
386 | 386 | ||
387 | if (!ad->control_reg || !ad->autoidle_reg || !ad->idlest_reg) | 387 | if (IS_ERR(ad->control_reg) || IS_ERR(ad->autoidle_reg) || |
388 | IS_ERR(ad->idlest_reg)) | ||
388 | goto cleanup; | 389 | goto cleanup; |
389 | 390 | ||
390 | clk = clk_register(NULL, &clk_hw->hw); | 391 | clk = clk_register(NULL, &clk_hw->hw); |
diff --git a/drivers/clk/ti/autoidle.c b/drivers/clk/ti/autoidle.c index 8912ff80af34..e75c64c9e81c 100644 --- a/drivers/clk/ti/autoidle.c +++ b/drivers/clk/ti/autoidle.c | |||
@@ -119,7 +119,7 @@ int __init of_ti_clk_autoidle_setup(struct device_node *node) | |||
119 | clk->name = node->name; | 119 | clk->name = node->name; |
120 | clk->reg = ti_clk_get_reg_addr(node, 0); | 120 | clk->reg = ti_clk_get_reg_addr(node, 0); |
121 | 121 | ||
122 | if (!clk->reg) { | 122 | if (IS_ERR(clk->reg)) { |
123 | kfree(clk); | 123 | kfree(clk); |
124 | return -EINVAL; | 124 | return -EINVAL; |
125 | } | 125 | } |
diff --git a/drivers/clk/ti/clk.c b/drivers/clk/ti/clk.c index e22b95646e09..0ebe5c51062b 100644 --- a/drivers/clk/ti/clk.c +++ b/drivers/clk/ti/clk.c | |||
@@ -103,7 +103,8 @@ int __init ti_clk_retry_init(struct device_node *node, struct clk_hw *hw, | |||
103 | * @index: register index from the clock node | 103 | * @index: register index from the clock node |
104 | * | 104 | * |
105 | * Builds clock register address from device tree information. This | 105 | * Builds clock register address from device tree information. This |
106 | * is a struct of type clk_omap_reg. | 106 | * is a struct of type clk_omap_reg. Returns a pointer to the register |
107 | * address, or a pointer error value in failure. | ||
107 | */ | 108 | */ |
108 | void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index) | 109 | void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index) |
109 | { | 110 | { |
@@ -121,14 +122,14 @@ void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index) | |||
121 | 122 | ||
122 | if (i == CLK_MAX_MEMMAPS) { | 123 | if (i == CLK_MAX_MEMMAPS) { |
123 | pr_err("clk-provider not found for %s!\n", node->name); | 124 | pr_err("clk-provider not found for %s!\n", node->name); |
124 | return NULL; | 125 | return ERR_PTR(-ENOENT); |
125 | } | 126 | } |
126 | 127 | ||
127 | reg->index = i; | 128 | reg->index = i; |
128 | 129 | ||
129 | if (of_property_read_u32_index(node, "reg", index, &val)) { | 130 | if (of_property_read_u32_index(node, "reg", index, &val)) { |
130 | pr_err("%s must have reg[%d]!\n", node->name, index); | 131 | pr_err("%s must have reg[%d]!\n", node->name, index); |
131 | return NULL; | 132 | return ERR_PTR(-EINVAL); |
132 | } | 133 | } |
133 | 134 | ||
134 | reg->offset = val; | 135 | reg->offset = val; |
diff --git a/drivers/clk/ti/divider.c b/drivers/clk/ti/divider.c index 6211893c0980..ff5f117950a9 100644 --- a/drivers/clk/ti/divider.c +++ b/drivers/clk/ti/divider.c | |||
@@ -530,8 +530,8 @@ static int __init ti_clk_divider_populate(struct device_node *node, | |||
530 | u32 val; | 530 | u32 val; |
531 | 531 | ||
532 | *reg = ti_clk_get_reg_addr(node, 0); | 532 | *reg = ti_clk_get_reg_addr(node, 0); |
533 | if (!*reg) | 533 | if (IS_ERR(*reg)) |
534 | return -EINVAL; | 534 | return PTR_ERR(*reg); |
535 | 535 | ||
536 | if (!of_property_read_u32(node, "ti,bit-shift", &val)) | 536 | if (!of_property_read_u32(node, "ti,bit-shift", &val)) |
537 | *shift = val; | 537 | *shift = val; |
diff --git a/drivers/clk/ti/dpll.c b/drivers/clk/ti/dpll.c index 81dc4698dc41..11478a501c30 100644 --- a/drivers/clk/ti/dpll.c +++ b/drivers/clk/ti/dpll.c | |||
@@ -390,18 +390,18 @@ static void __init of_ti_dpll_setup(struct device_node *node, | |||
390 | #endif | 390 | #endif |
391 | } else { | 391 | } else { |
392 | dd->idlest_reg = ti_clk_get_reg_addr(node, 1); | 392 | dd->idlest_reg = ti_clk_get_reg_addr(node, 1); |
393 | if (!dd->idlest_reg) | 393 | if (IS_ERR(dd->idlest_reg)) |
394 | goto cleanup; | 394 | goto cleanup; |
395 | 395 | ||
396 | dd->mult_div1_reg = ti_clk_get_reg_addr(node, 2); | 396 | dd->mult_div1_reg = ti_clk_get_reg_addr(node, 2); |
397 | } | 397 | } |
398 | 398 | ||
399 | if (!dd->control_reg || !dd->mult_div1_reg) | 399 | if (IS_ERR(dd->control_reg) || IS_ERR(dd->mult_div1_reg)) |
400 | goto cleanup; | 400 | goto cleanup; |
401 | 401 | ||
402 | if (dd->autoidle_mask) { | 402 | if (dd->autoidle_mask) { |
403 | dd->autoidle_reg = ti_clk_get_reg_addr(node, 3); | 403 | dd->autoidle_reg = ti_clk_get_reg_addr(node, 3); |
404 | if (!dd->autoidle_reg) | 404 | if (IS_ERR(dd->autoidle_reg)) |
405 | goto cleanup; | 405 | goto cleanup; |
406 | } | 406 | } |
407 | 407 | ||
diff --git a/drivers/clk/ti/gate.c b/drivers/clk/ti/gate.c index d493307b73f4..0c6fdfcd5f93 100644 --- a/drivers/clk/ti/gate.c +++ b/drivers/clk/ti/gate.c | |||
@@ -225,7 +225,7 @@ static void __init _of_ti_gate_clk_setup(struct device_node *node, | |||
225 | 225 | ||
226 | if (ops != &omap_gate_clkdm_clk_ops) { | 226 | if (ops != &omap_gate_clkdm_clk_ops) { |
227 | reg = ti_clk_get_reg_addr(node, 0); | 227 | reg = ti_clk_get_reg_addr(node, 0); |
228 | if (!reg) | 228 | if (IS_ERR(reg)) |
229 | return; | 229 | return; |
230 | 230 | ||
231 | if (!of_property_read_u32(node, "ti,bit-shift", &val)) | 231 | if (!of_property_read_u32(node, "ti,bit-shift", &val)) |
@@ -264,7 +264,7 @@ _of_ti_composite_gate_clk_setup(struct device_node *node, | |||
264 | return; | 264 | return; |
265 | 265 | ||
266 | gate->enable_reg = ti_clk_get_reg_addr(node, 0); | 266 | gate->enable_reg = ti_clk_get_reg_addr(node, 0); |
267 | if (!gate->enable_reg) | 267 | if (IS_ERR(gate->enable_reg)) |
268 | goto cleanup; | 268 | goto cleanup; |
269 | 269 | ||
270 | of_property_read_u32(node, "ti,bit-shift", &val); | 270 | of_property_read_u32(node, "ti,bit-shift", &val); |
diff --git a/drivers/clk/ti/interface.c b/drivers/clk/ti/interface.c index 265d91f071c5..c76230d8dd04 100644 --- a/drivers/clk/ti/interface.c +++ b/drivers/clk/ti/interface.c | |||
@@ -111,7 +111,7 @@ static void __init _of_ti_interface_clk_setup(struct device_node *node, | |||
111 | u32 val; | 111 | u32 val; |
112 | 112 | ||
113 | reg = ti_clk_get_reg_addr(node, 0); | 113 | reg = ti_clk_get_reg_addr(node, 0); |
114 | if (!reg) | 114 | if (IS_ERR(reg)) |
115 | return; | 115 | return; |
116 | 116 | ||
117 | if (!of_property_read_u32(node, "ti,bit-shift", &val)) | 117 | if (!of_property_read_u32(node, "ti,bit-shift", &val)) |
diff --git a/drivers/clk/ti/mux.c b/drivers/clk/ti/mux.c index 728e253606bc..5cdeed538b08 100644 --- a/drivers/clk/ti/mux.c +++ b/drivers/clk/ti/mux.c | |||
@@ -210,7 +210,7 @@ static void of_mux_clk_setup(struct device_node *node) | |||
210 | 210 | ||
211 | reg = ti_clk_get_reg_addr(node, 0); | 211 | reg = ti_clk_get_reg_addr(node, 0); |
212 | 212 | ||
213 | if (!reg) | 213 | if (IS_ERR(reg)) |
214 | goto cleanup; | 214 | goto cleanup; |
215 | 215 | ||
216 | of_property_read_u32(node, "ti,bit-shift", &shift); | 216 | of_property_read_u32(node, "ti,bit-shift", &shift); |
@@ -283,7 +283,7 @@ static void __init of_ti_composite_mux_clk_setup(struct device_node *node) | |||
283 | 283 | ||
284 | mux->reg = ti_clk_get_reg_addr(node, 0); | 284 | mux->reg = ti_clk_get_reg_addr(node, 0); |
285 | 285 | ||
286 | if (!mux->reg) | 286 | if (IS_ERR(mux->reg)) |
287 | goto cleanup; | 287 | goto cleanup; |
288 | 288 | ||
289 | if (!of_property_read_u32(node, "ti,bit-shift", &val)) | 289 | if (!of_property_read_u32(node, "ti,bit-shift", &val)) |