aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTero Kristo <t-kristo@ti.com>2015-02-23 14:06:08 -0500
committerTero Kristo <t-kristo@ti.com>2015-03-24 14:23:36 -0400
commitc807dbedb5e5adbd4e1e2d07574d230df924a5a7 (patch)
treea1479d6552f50ed68c66a25cc4860b8f68c21bfa
parentc517d838eb7d07bbe9507871fab3931deccff539 (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.c5
-rw-r--r--drivers/clk/ti/autoidle.c2
-rw-r--r--drivers/clk/ti/clk.c7
-rw-r--r--drivers/clk/ti/divider.c4
-rw-r--r--drivers/clk/ti/dpll.c6
-rw-r--r--drivers/clk/ti/gate.c4
-rw-r--r--drivers/clk/ti/interface.c2
-rw-r--r--drivers/clk/ti/mux.c4
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 */
108void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index) 109void __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))