@@ -53,29 +53,46 @@ void mtk_free_clk_data(struct clk_onecell_data *clk_data)
53
53
kfree (clk_data );
54
54
}
55
55
56
- void mtk_clk_register_fixed_clks (const struct mtk_fixed_clk * clks ,
57
- int num , struct clk_onecell_data * clk_data )
56
+ int mtk_clk_register_fixed_clks (const struct mtk_fixed_clk * clks , int num ,
57
+ struct clk_onecell_data * clk_data )
58
58
{
59
59
int i ;
60
60
struct clk * clk ;
61
61
62
+ if (!clk_data )
63
+ return - ENOMEM ;
64
+
62
65
for (i = 0 ; i < num ; i ++ ) {
63
66
const struct mtk_fixed_clk * rc = & clks [i ];
64
67
65
- if (clk_data && !IS_ERR_OR_NULL (clk_data -> clks [rc -> id ]))
68
+ if (!IS_ERR_OR_NULL (clk_data -> clks [rc -> id ]))
66
69
continue ;
67
70
68
71
clk = clk_register_fixed_rate (NULL , rc -> name , rc -> parent , 0 ,
69
72
rc -> rate );
70
73
71
74
if (IS_ERR (clk )) {
72
75
pr_err ("Failed to register clk %s: %pe\n" , rc -> name , clk );
73
- continue ;
76
+ goto err ;
74
77
}
75
78
76
- if (clk_data )
77
- clk_data -> clks [rc -> id ] = clk ;
79
+ clk_data -> clks [rc -> id ] = clk ;
78
80
}
81
+
82
+ return 0 ;
83
+
84
+ err :
85
+ while (-- i >= 0 ) {
86
+ const struct mtk_fixed_clk * rc = & clks [i ];
87
+
88
+ if (IS_ERR_OR_NULL (clk_data -> clks [rc -> id ]))
89
+ continue ;
90
+
91
+ clk_unregister_fixed_rate (clk_data -> clks [rc -> id ]);
92
+ clk_data -> clks [rc -> id ] = ERR_PTR (- ENOENT );
93
+ }
94
+
95
+ return PTR_ERR (clk );
79
96
}
80
97
EXPORT_SYMBOL_GPL (mtk_clk_register_fixed_clks );
81
98
@@ -99,29 +116,46 @@ void mtk_clk_unregister_fixed_clks(const struct mtk_fixed_clk *clks, int num,
99
116
}
100
117
EXPORT_SYMBOL_GPL (mtk_clk_unregister_fixed_clks );
101
118
102
- void mtk_clk_register_factors (const struct mtk_fixed_factor * clks ,
103
- int num , struct clk_onecell_data * clk_data )
119
+ int mtk_clk_register_factors (const struct mtk_fixed_factor * clks , int num ,
120
+ struct clk_onecell_data * clk_data )
104
121
{
105
122
int i ;
106
123
struct clk * clk ;
107
124
125
+ if (!clk_data )
126
+ return - ENOMEM ;
127
+
108
128
for (i = 0 ; i < num ; i ++ ) {
109
129
const struct mtk_fixed_factor * ff = & clks [i ];
110
130
111
- if (clk_data && !IS_ERR_OR_NULL (clk_data -> clks [ff -> id ]))
131
+ if (!IS_ERR_OR_NULL (clk_data -> clks [ff -> id ]))
112
132
continue ;
113
133
114
134
clk = clk_register_fixed_factor (NULL , ff -> name , ff -> parent_name ,
115
135
CLK_SET_RATE_PARENT , ff -> mult , ff -> div );
116
136
117
137
if (IS_ERR (clk )) {
118
138
pr_err ("Failed to register clk %s: %pe\n" , ff -> name , clk );
119
- continue ;
139
+ goto err ;
120
140
}
121
141
122
- if (clk_data )
123
- clk_data -> clks [ff -> id ] = clk ;
142
+ clk_data -> clks [ff -> id ] = clk ;
143
+ }
144
+
145
+ return 0 ;
146
+
147
+ err :
148
+ while (-- i >= 0 ) {
149
+ const struct mtk_fixed_factor * ff = & clks [i ];
150
+
151
+ if (IS_ERR_OR_NULL (clk_data -> clks [ff -> id ]))
152
+ continue ;
153
+
154
+ clk_unregister_fixed_factor (clk_data -> clks [ff -> id ]);
155
+ clk_data -> clks [ff -> id ] = ERR_PTR (- ENOENT );
124
156
}
157
+
158
+ return PTR_ERR (clk );
125
159
}
126
160
EXPORT_SYMBOL_GPL (mtk_clk_register_factors );
127
161
@@ -258,13 +292,16 @@ static void mtk_clk_unregister_composite(struct clk *clk)
258
292
kfree (mux );
259
293
}
260
294
261
- void mtk_clk_register_composites (const struct mtk_composite * mcs ,
262
- int num , void __iomem * base , spinlock_t * lock ,
263
- struct clk_onecell_data * clk_data )
295
+ int mtk_clk_register_composites (const struct mtk_composite * mcs , int num ,
296
+ void __iomem * base , spinlock_t * lock ,
297
+ struct clk_onecell_data * clk_data )
264
298
{
265
299
struct clk * clk ;
266
300
int i ;
267
301
302
+ if (!clk_data )
303
+ return - ENOMEM ;
304
+
268
305
for (i = 0 ; i < num ; i ++ ) {
269
306
const struct mtk_composite * mc = & mcs [i ];
270
307
@@ -275,12 +312,26 @@ void mtk_clk_register_composites(const struct mtk_composite *mcs,
275
312
276
313
if (IS_ERR (clk )) {
277
314
pr_err ("Failed to register clk %s: %pe\n" , mc -> name , clk );
278
- continue ;
315
+ goto err ;
279
316
}
280
317
281
- if (clk_data )
282
- clk_data -> clks [mc -> id ] = clk ;
318
+ clk_data -> clks [mc -> id ] = clk ;
319
+ }
320
+
321
+ return 0 ;
322
+
323
+ err :
324
+ while (-- i >= 0 ) {
325
+ const struct mtk_composite * mc = & mcs [i ];
326
+
327
+ if (IS_ERR_OR_NULL (clk_data -> clks [mcs -> id ]))
328
+ continue ;
329
+
330
+ mtk_clk_unregister_composite (clk_data -> clks [mc -> id ]);
331
+ clk_data -> clks [mc -> id ] = ERR_PTR (- ENOENT );
283
332
}
333
+
334
+ return PTR_ERR (clk );
284
335
}
285
336
EXPORT_SYMBOL_GPL (mtk_clk_register_composites );
286
337
@@ -304,17 +355,20 @@ void mtk_clk_unregister_composites(const struct mtk_composite *mcs, int num,
304
355
}
305
356
EXPORT_SYMBOL_GPL (mtk_clk_unregister_composites );
306
357
307
- void mtk_clk_register_dividers (const struct mtk_clk_divider * mcds ,
308
- int num , void __iomem * base , spinlock_t * lock ,
309
- struct clk_onecell_data * clk_data )
358
+ int mtk_clk_register_dividers (const struct mtk_clk_divider * mcds , int num ,
359
+ void __iomem * base , spinlock_t * lock ,
360
+ struct clk_onecell_data * clk_data )
310
361
{
311
362
struct clk * clk ;
312
363
int i ;
313
364
365
+ if (!clk_data )
366
+ return - ENOMEM ;
367
+
314
368
for (i = 0 ; i < num ; i ++ ) {
315
369
const struct mtk_clk_divider * mcd = & mcds [i ];
316
370
317
- if (clk_data && !IS_ERR_OR_NULL (clk_data -> clks [mcd -> id ]))
371
+ if (!IS_ERR_OR_NULL (clk_data -> clks [mcd -> id ]))
318
372
continue ;
319
373
320
374
clk = clk_register_divider (NULL , mcd -> name , mcd -> parent_name ,
@@ -323,12 +377,26 @@ void mtk_clk_register_dividers(const struct mtk_clk_divider *mcds,
323
377
324
378
if (IS_ERR (clk )) {
325
379
pr_err ("Failed to register clk %s: %pe\n" , mcd -> name , clk );
326
- continue ;
380
+ goto err ;
327
381
}
328
382
329
- if (clk_data )
330
- clk_data -> clks [mcd -> id ] = clk ;
383
+ clk_data -> clks [mcd -> id ] = clk ;
384
+ }
385
+
386
+ return 0 ;
387
+
388
+ err :
389
+ while (-- i >= 0 ) {
390
+ const struct mtk_clk_divider * mcd = & mcds [i ];
391
+
392
+ if (IS_ERR_OR_NULL (clk_data -> clks [mcd -> id ]))
393
+ continue ;
394
+
395
+ mtk_clk_unregister_composite (clk_data -> clks [mcd -> id ]);
396
+ clk_data -> clks [mcd -> id ] = ERR_PTR (- ENOENT );
331
397
}
398
+
399
+ return PTR_ERR (clk );
332
400
}
333
401
334
402
void mtk_clk_unregister_dividers (const struct mtk_clk_divider * mcds , int num ,
0 commit comments