@@ -231,6 +231,112 @@ static int sysc_get_clocks(struct sysc *ddata)
231
231
return 0 ;
232
232
}
233
233
234
+ static int sysc_enable_main_clocks (struct sysc * ddata )
235
+ {
236
+ struct clk * clock ;
237
+ int i , error ;
238
+
239
+ if (!ddata -> clocks )
240
+ return 0 ;
241
+
242
+ for (i = 0 ; i < SYSC_OPTFCK0 ; i ++ ) {
243
+ clock = ddata -> clocks [i ];
244
+
245
+ /* Main clocks may not have ick */
246
+ if (IS_ERR_OR_NULL (clock ))
247
+ continue ;
248
+
249
+ error = clk_enable (clock );
250
+ if (error )
251
+ goto err_disable ;
252
+ }
253
+
254
+ return 0 ;
255
+
256
+ err_disable :
257
+ for (i -- ; i >= 0 ; i -- ) {
258
+ clock = ddata -> clocks [i ];
259
+
260
+ /* Main clocks may not have ick */
261
+ if (IS_ERR_OR_NULL (clock ))
262
+ continue ;
263
+
264
+ clk_disable (clock );
265
+ }
266
+
267
+ return error ;
268
+ }
269
+
270
+ static void sysc_disable_main_clocks (struct sysc * ddata )
271
+ {
272
+ struct clk * clock ;
273
+ int i ;
274
+
275
+ if (!ddata -> clocks )
276
+ return ;
277
+
278
+ for (i = 0 ; i < SYSC_OPTFCK0 ; i ++ ) {
279
+ clock = ddata -> clocks [i ];
280
+ if (IS_ERR_OR_NULL (clock ))
281
+ continue ;
282
+
283
+ clk_disable (clock );
284
+ }
285
+ }
286
+
287
+ static int sysc_enable_opt_clocks (struct sysc * ddata )
288
+ {
289
+ struct clk * clock ;
290
+ int i , error ;
291
+
292
+ if (!ddata -> clocks )
293
+ return 0 ;
294
+
295
+ for (i = SYSC_OPTFCK0 ; i < SYSC_MAX_CLOCKS ; i ++ ) {
296
+ clock = ddata -> clocks [i ];
297
+
298
+ /* Assume no holes for opt clocks */
299
+ if (IS_ERR_OR_NULL (clock ))
300
+ return 0 ;
301
+
302
+ error = clk_enable (clock );
303
+ if (error )
304
+ goto err_disable ;
305
+ }
306
+
307
+ return 0 ;
308
+
309
+ err_disable :
310
+ for (i -- ; i >= 0 ; i -- ) {
311
+ clock = ddata -> clocks [i ];
312
+ if (IS_ERR_OR_NULL (clock ))
313
+ continue ;
314
+
315
+ clk_disable (clock );
316
+ }
317
+
318
+ return error ;
319
+ }
320
+
321
+ static void sysc_disable_opt_clocks (struct sysc * ddata )
322
+ {
323
+ struct clk * clock ;
324
+ int i ;
325
+
326
+ if (!ddata -> clocks )
327
+ return ;
328
+
329
+ for (i = SYSC_OPTFCK0 ; i < SYSC_MAX_CLOCKS ; i ++ ) {
330
+ clock = ddata -> clocks [i ];
331
+
332
+ /* Assume no holes for opt clocks */
333
+ if (IS_ERR_OR_NULL (clock ))
334
+ return ;
335
+
336
+ clk_disable (clock );
337
+ }
338
+ }
339
+
234
340
/**
235
341
* sysc_init_resets - reset module on init
236
342
* @ddata: device driver data
@@ -667,7 +773,7 @@ static int __maybe_unused sysc_runtime_resume_legacy(struct device *dev,
667
773
static int __maybe_unused sysc_runtime_suspend (struct device * dev )
668
774
{
669
775
struct sysc * ddata ;
670
- int error = 0 , i ;
776
+ int error = 0 ;
671
777
672
778
ddata = dev_get_drvdata (dev );
673
779
@@ -682,15 +788,10 @@ static int __maybe_unused sysc_runtime_suspend(struct device *dev)
682
788
return error ;
683
789
}
684
790
685
- for (i = 0 ; i < ddata -> nr_clocks ; i ++ ) {
686
- if (IS_ERR_OR_NULL (ddata -> clocks [i ]))
687
- continue ;
791
+ sysc_disable_main_clocks (ddata );
688
792
689
- if (i >= SYSC_OPTFCK0 && !sysc_opt_clks_needed (ddata ))
690
- break ;
691
-
692
- clk_disable (ddata -> clocks [i ]);
693
- }
793
+ if (sysc_opt_clks_needed (ddata ))
794
+ sysc_disable_opt_clocks (ddata );
694
795
695
796
ddata -> enabled = false;
696
797
@@ -700,7 +801,7 @@ static int __maybe_unused sysc_runtime_suspend(struct device *dev)
700
801
static int __maybe_unused sysc_runtime_resume (struct device * dev )
701
802
{
702
803
struct sysc * ddata ;
703
- int error = 0 , i ;
804
+ int error = 0 ;
704
805
705
806
ddata = dev_get_drvdata (dev );
706
807
@@ -715,20 +816,24 @@ static int __maybe_unused sysc_runtime_resume(struct device *dev)
715
816
return error ;
716
817
}
717
818
718
- for (i = 0 ; i < ddata -> nr_clocks ; i ++ ) {
719
- if (IS_ERR_OR_NULL (ddata -> clocks [i ]))
720
- continue ;
721
-
722
- if (i >= SYSC_OPTFCK0 && !sysc_opt_clks_needed (ddata ))
723
- break ;
724
-
725
- error = clk_enable (ddata -> clocks [i ]);
819
+ if (sysc_opt_clks_needed (ddata )) {
820
+ error = sysc_enable_opt_clocks (ddata );
726
821
if (error )
727
822
return error ;
728
823
}
729
824
825
+ error = sysc_enable_main_clocks (ddata );
826
+ if (error )
827
+ goto err_main_clocks ;
828
+
730
829
ddata -> enabled = true;
731
830
831
+ return 0 ;
832
+
833
+ err_main_clocks :
834
+ if (sysc_opt_clks_needed (ddata ))
835
+ sysc_disable_opt_clocks (ddata );
836
+
732
837
return error ;
733
838
}
734
839
0 commit comments