summaryrefslogblamecommitdiff
path: root/drivers/clk/meson/meson8b.c
blob: e4b474c5f86ce37664200209d7765d36b9542248 (plain) (tree)
1
2
3
4
5
6
7
8
9
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
                                   



                                            

                                              

   
                      
                               
                       
                             
                             

                                   
                         
 
                    
                       
                             

                     
 


                                                         

                                          
                              

  















                                                               




                          


                           
                                                  
                                             




                                                 









                                                 




                                                  










                                                 
                                           
                                        
                                             



                                                                
                  
                                 


          









                                                  


                                                         







                                                             




























                                                                               




















                                                                
                                                 
                                             




                                                    






                                                    
                                      

                                     




                                                     









                                                    
                                               

                                                                     
          
                                           

                                                                
                                          

                                                         
                  
                                 


          
                                                      






                                                  
                                            
                                               


                                                         













                                                      
                                               


                                                         





                                                
                                             




                                                    









                                                    









                                                    
                                              
          
                                           
                                      
                                          



                                                                
                  
                                 


          








                                                  
                                               


                                                         




                                             
                                                        


                                           
                                        
                                             


                                                         



                                 







                                               


                                                         




                                                        


                                           
                                        
                                             


                                                         



                                 







                                               


                                                         




                                                        


                                           
                                        
                                             


                                                         



                                 







                                               


                                                         




                                                        


                                           
                                        
                                             


                                                         



                                 







                                               


                                                         




                                                        


                                           
                                        
                                             


                                                         



                                 







                                               


                                                         



                                 








                                                  


                                                         



                                 
                                              















                                                  




                                                 
          
                                           
                                    
                                           


                                                         



                                 







                                               


                                                         





                                              















                                                  
          
                                           
                                    
                                           


                                                         



                                 







                                               


                                                         





                                              















                                                  
          
                                           
                                    
                                           


                                                         



                                 







                                               


                                                         




                                             
                                              






                                                 

                                           
                                              




                                                                           




                                                         
                                 


          
                                                 




                                              

                                           
                                                  


                                                         
                                 


          
                                          



                                               

                                           
                                            


                                                         
                                 
                                         
          

  
                                               






                                                
                                           


                                                                            
                  





                                                    
                                                      


                                           
                                      
                                             


                                                         




                                             
                                                      


                                           
                                      
                                             


                                                         





                                                       







                                


                           
                                                  


                                                 
                            




                                                
                                               


                                                         




                                             
                                                       
                                                      



                                                
                                                     


                                            
                                           

                                                                            


                                                                             
                   




                                                         
                                 



                                             
                                            






                                                
                                           


                                                                            
                  

                                               

                                                    


          










                                                          





                                                                            
                  














                                                   


                                                         












                                                  


                                                         




                                             





                                                       


                                                         









                                                       


                                                         









                                                       


                                                         









                                                       


                                                         









                                                       


                                                         









                                                       


                                                         









                                                       


                                                         



                                 

                                                     



                                                
                                       

                                           
                                      
                                           








                                                         



                                 
                                                 





                                                 
                                      
                                               


                                                         













                                                   








                                                         












                                                    


                                                         















                                                     








                                                         












                                                 


                                                         













                                                    








                                                         












                                                     


                                                         




                                             







                                                    
                                            







                                                         







                                                   
                                           





                                                                            
                                                         
                                                   
                  











                                                  
                                            


                                                         












                                                    
                                               


                                                         












                                                     
                                               


                                                         












                                               
                                           
                                                                    



                                                         












                                                      
                                               


                                                         




                                             







                                                             









                                                
                                           

                                                                       
                                                                        









                                               
                                            


                                                         




                                             






                                               
                                            







                                                         

                                                   
                                           



                                           
                                            
                                                         
                                           
                  










                                                        
                                                         
                                           
                  






                                                       
                                           



                                           
                                            


                                                         










                                                        
                                                         
                                           
                  






                                                       
                                           



                                           
                                            


                                                         










                                                        
                                                         
                                           
                  






                                                       
                                           



                                           
                                            


                                                         










                                                         
                                                         
                                           
                  






                                                        
                                           



                                           
                                            


                                                         












                                                 
                                           

                                                                       
                                                                        









                                                    
                                            


                                                         




                                             






                                                 
                                            







                                                         






                                                    
                                            
                                                         
                                                
                  










                                                         
                                                         
                                                
                  











                                                        
                                            


                                                         










                                                         
                                                         
                                                
                  











                                                        
                                            


                                                         










                                                         
                                                         
                                                
                  











                                                        
                                            


                                                         










                                                          
                                                         
                                                
                  











                                                         
                                            


                                                         




                                             





                                                                 









                                                 
                                           

                                                                           










                                               
                                            


                                                         












                                                 
                                           

                                                                           










                                               
                                            


                                                         












                                                 
                                           

                                                                           










                                               
                                            


                                                         












                                                      
                                           

                                                                           










                                                  
                                            


                                                         




                                             





                                                                  









                                                 
                                           

                                                                            










                                               
                                            


                                                         












                                                  
                                           

                                                                            










                                               
                                            


                                                         













                                                 
                                           
                                                          



                                                                
                  












                                                  
                                               


                                                         











                                               
                                            


                                                         




                                             

                                                                     




                                                                      
   







                                                                      













                                                                  

                                                                        


















                                                                              


                                                         












                                               


                                                         
                                 
                                                                 












                                                    

                                                                        


















                                                                              


                                                         












                                               


                                                         
                                 
                                                                 











                                              



                                                         




                                             






                                                                
































                                                                       

                                                                    



                                           



                                                                
                  













                                                  


                                                         




                                             




                                                            

  




                                                              










                                              

                                                                      












                                               

                                                                        












                                               










                                                                               












                                               


                                                         
                                 
                                                                 











                                              

                                                                      












                                               

                                                                        












                                               










                                                                               












                                               


                                                         
                                 
                                                                 


          
  
                                                                





                                                                      








                                              



                                                         
                                 
                                             


          






                                                         











                                               

                                                                   













                                                   


                                                         












                                               


                                                         














                                                   


                                                         












                                               


                                                         














                                               



                                                         














                                                    

                                                                   













                                                    


                                                         












                                                


                                                         














                                               

                                                                   













                                                   


                                                         












                                               


                                                         














                                                  

                                                                   













                                                   


                                                         












                                                 


                                                         















                                                                  


                                                         




                                             
                                                                        



                                                              














                                                       

                                                                        












                                                   


                                                         












                                               


                                                         




                                             
                                                                        



                                                                  














                                                           

                                                                            












                                                      


                                                         












                                                  


                                                         




                                             








                                              



                                                         








                                                                              


                                                        
























                                                           













































                                                                   












                                                                        






                                                        

























































































































































































































































































































































































































































































































































































































































                                                                       

  
                                                         













































































                                     
                              
                              


                       


                           
                           
                         



                                   
                             




                           


                               
                               
                              
                             

                              





                                  









                                   
                         






                                     
                              



















                                      






                            

                             








                            















                                 


                               


                                   
                          
                                 

  


                                            
                        

                                            


                                             

                                                           


                                             

                                       


                                             

                                        


                                             

                                        


                                             

                                        


                                             

                                        


                                             

                                        


                                             

                                          


                                             

                                          


                                             

                                                            


                                             

                                                


                                        

                                                         


                                            

                                                        


                                            

                                                      


                                            

                                                     


                                            







                                                                       
                                                   
                               





                                                     


                                            

                                                                 
 



















                                                                         

                                 
                               






                                                                       
                                  



                             

                                                                             


                              

                                                                             





                                   
                                                              









                                                        

  














                                                 
                                                                   
                                                                              

                                       
                                      

                                      

                           
 


                                               
                          

                                                                            
         
 




                                                  
                           








                                                                            





                                                             

                                                                       
           
                                                          
                                           
                                     

                                 
                                                              



                               
                                                                 
 













                                                                           
                                                                    

                                                                            

 

                                                           
                                                          



                                                            
                                                           

 

                                                             
                                                            

 
                                                         
                                        
                                                           
                                         
                                                             
                                          
// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (c) 2015 Endless Mobile, Inc.
 * Author: Carlo Caione <carlo@endlessm.com>
 *
 * Copyright (c) 2016 BayLibre, Inc.
 * Michael Turquette <mturquette@baylibre.com>
 */

#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/init.h>
#include <linux/mfd/syscon.h>
#include <linux/of_address.h>
#include <linux/reset-controller.h>
#include <linux/slab.h>
#include <linux/regmap.h>

#include "meson8b.h"
#include "clk-regmap.h"
#include "meson-clkc-utils.h"
#include "clk-pll.h"
#include "clk-mpll.h"

#include <dt-bindings/clock/meson8b-clkc.h>
#include <dt-bindings/reset/amlogic,meson8b-clkc-reset.h>

struct meson8b_clk_reset {
	struct reset_controller_dev reset;
	struct regmap *regmap;
};

static const struct pll_params_table sys_pll_params_table[] = {
	PLL_PARAMS(50, 1),
	PLL_PARAMS(51, 1),
	PLL_PARAMS(52, 1),
	PLL_PARAMS(53, 1),
	PLL_PARAMS(54, 1),
	PLL_PARAMS(55, 1),
	PLL_PARAMS(56, 1),
	PLL_PARAMS(57, 1),
	PLL_PARAMS(58, 1),
	PLL_PARAMS(59, 1),
	PLL_PARAMS(60, 1),
	PLL_PARAMS(61, 1),
	PLL_PARAMS(62, 1),
	PLL_PARAMS(63, 1),
	PLL_PARAMS(64, 1),
	PLL_PARAMS(65, 1),
	PLL_PARAMS(66, 1),
	PLL_PARAMS(67, 1),
	PLL_PARAMS(68, 1),
	PLL_PARAMS(84, 1),
	{ /* sentinel */ },
};

static struct clk_regmap meson8b_fixed_pll_dco = {
	.data = &(struct meson_clk_pll_data){
		.en = {
			.reg_off = HHI_MPLL_CNTL,
			.shift   = 30,
			.width   = 1,
		},
		.m = {
			.reg_off = HHI_MPLL_CNTL,
			.shift   = 0,
			.width   = 9,
		},
		.n = {
			.reg_off = HHI_MPLL_CNTL,
			.shift   = 9,
			.width   = 5,
		},
		.frac = {
			.reg_off = HHI_MPLL_CNTL2,
			.shift   = 0,
			.width   = 12,
		},
		.l = {
			.reg_off = HHI_MPLL_CNTL,
			.shift   = 31,
			.width   = 1,
		},
		.rst = {
			.reg_off = HHI_MPLL_CNTL,
			.shift   = 29,
			.width   = 1,
		},
	},
	.hw.init = &(struct clk_init_data){
		.name = "fixed_pll_dco",
		.ops = &meson_clk_pll_ro_ops,
		.parent_data = &(const struct clk_parent_data) {
			.fw_name = "xtal",
			.name = "xtal",
			.index = -1,
		},
		.num_parents = 1,
	},
};

static struct clk_regmap meson8b_fixed_pll = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_MPLL_CNTL,
		.shift = 16,
		.width = 2,
		.flags = CLK_DIVIDER_POWER_OF_TWO,
	},
	.hw.init = &(struct clk_init_data){
		.name = "fixed_pll",
		.ops = &clk_regmap_divider_ro_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_fixed_pll_dco.hw
		},
		.num_parents = 1,
		/*
		 * This clock won't ever change at runtime so
		 * CLK_SET_RATE_PARENT is not required
		 */
	},
};

static struct clk_fixed_factor hdmi_pll_dco_in = {
	.mult = 2,
	.div = 1,
	.hw.init = &(struct clk_init_data){
		.name = "hdmi_pll_dco_in",
		.ops = &clk_fixed_factor_ops,
		.parent_data = &(const struct clk_parent_data) {
			.fw_name = "xtal",
			.index = -1,
		},
		.num_parents = 1,
	},
};

/*
 * Taken from the vendor driver for the 2970/2975MHz (both only differ in the
 * FRAC part in HHI_VID_PLL_CNTL2) where these values are identical for Meson8,
 * Meson8b and Meson8m2. This doubles the input (or output - it's not clear
 * which one but the result is the same) clock. The vendor driver additionally
 * has the following comment about: "optimise HPLL VCO 2.97GHz performance".
 */
static const struct reg_sequence meson8b_hdmi_pll_init_regs[] = {
	{ .reg = HHI_VID_PLL_CNTL2,	.def = 0x69c84000 },
	{ .reg = HHI_VID_PLL_CNTL3,	.def = 0x8a46c023 },
	{ .reg = HHI_VID_PLL_CNTL4,	.def = 0x4123b100 },
	{ .reg = HHI_VID_PLL_CNTL5,	.def = 0x00012385 },
	{ .reg = HHI_VID2_PLL_CNTL2,	.def = 0x0430a800 },
};

static const struct pll_params_table hdmi_pll_params_table[] = {
	PLL_PARAMS(40, 1),
	PLL_PARAMS(42, 1),
	PLL_PARAMS(44, 1),
	PLL_PARAMS(45, 1),
	PLL_PARAMS(49, 1),
	PLL_PARAMS(52, 1),
	PLL_PARAMS(54, 1),
	PLL_PARAMS(56, 1),
	PLL_PARAMS(59, 1),
	PLL_PARAMS(60, 1),
	PLL_PARAMS(61, 1),
	PLL_PARAMS(62, 1),
	PLL_PARAMS(64, 1),
	PLL_PARAMS(66, 1),
	PLL_PARAMS(68, 1),
	PLL_PARAMS(71, 1),
	PLL_PARAMS(82, 1),
	{ /* sentinel */ }
};

static struct clk_regmap meson8b_hdmi_pll_dco = {
	.data = &(struct meson_clk_pll_data){
		.en = {
			.reg_off = HHI_VID_PLL_CNTL,
			.shift   = 30,
			.width   = 1,
		},
		.m = {
			.reg_off = HHI_VID_PLL_CNTL,
			.shift   = 0,
			.width   = 9,
		},
		.n = {
			.reg_off = HHI_VID_PLL_CNTL,
			.shift   = 10,
			.width   = 5,
		},
		.frac = {
			.reg_off = HHI_VID_PLL_CNTL2,
			.shift   = 0,
			.width   = 12,
		},
		.l = {
			.reg_off = HHI_VID_PLL_CNTL,
			.shift   = 31,
			.width   = 1,
		},
		.rst = {
			.reg_off = HHI_VID_PLL_CNTL,
			.shift   = 29,
			.width   = 1,
		},
		.table = hdmi_pll_params_table,
		.init_regs = meson8b_hdmi_pll_init_regs,
		.init_count = ARRAY_SIZE(meson8b_hdmi_pll_init_regs),
	},
	.hw.init = &(struct clk_init_data){
		/* sometimes also called "HPLL" or "HPLL PLL" */
		.name = "hdmi_pll_dco",
		.ops = &meson_clk_pll_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&hdmi_pll_dco_in.hw
		},
		.num_parents = 1,
	},
};

static struct clk_regmap meson8b_hdmi_pll_lvds_out = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_VID_PLL_CNTL,
		.shift = 16,
		.width = 2,
		.flags = CLK_DIVIDER_POWER_OF_TWO,
	},
	.hw.init = &(struct clk_init_data){
		.name = "hdmi_pll_lvds_out",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_hdmi_pll_dco.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_hdmi_pll_hdmi_out = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_VID_PLL_CNTL,
		.shift = 18,
		.width = 2,
		.flags = CLK_DIVIDER_POWER_OF_TWO,
	},
	.hw.init = &(struct clk_init_data){
		.name = "hdmi_pll_hdmi_out",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_hdmi_pll_dco.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_sys_pll_dco = {
	.data = &(struct meson_clk_pll_data){
		.en = {
			.reg_off = HHI_SYS_PLL_CNTL,
			.shift   = 30,
			.width   = 1,
		},
		.m = {
			.reg_off = HHI_SYS_PLL_CNTL,
			.shift   = 0,
			.width   = 9,
		},
		.n = {
			.reg_off = HHI_SYS_PLL_CNTL,
			.shift   = 9,
			.width   = 5,
		},
		.l = {
			.reg_off = HHI_SYS_PLL_CNTL,
			.shift   = 31,
			.width   = 1,
		},
		.rst = {
			.reg_off = HHI_SYS_PLL_CNTL,
			.shift   = 29,
			.width   = 1,
		},
		.table = sys_pll_params_table,
	},
	.hw.init = &(struct clk_init_data){
		.name = "sys_pll_dco",
		.ops = &meson_clk_pll_ops,
		.parent_data = &(const struct clk_parent_data) {
			.fw_name = "xtal",
			.name = "xtal",
			.index = -1,
		},
		.num_parents = 1,
	},
};

static struct clk_regmap meson8b_sys_pll = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_SYS_PLL_CNTL,
		.shift = 16,
		.width = 2,
		.flags = CLK_DIVIDER_POWER_OF_TWO,
	},
	.hw.init = &(struct clk_init_data){
		.name = "sys_pll",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_sys_pll_dco.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_fixed_factor meson8b_fclk_div2_div = {
	.mult = 1,
	.div = 2,
	.hw.init = &(struct clk_init_data){
		.name = "fclk_div2_div",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_fixed_pll.hw
		},
		.num_parents = 1,
	},
};

static struct clk_regmap meson8b_fclk_div2 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_MPLL_CNTL6,
		.bit_idx = 27,
	},
	.hw.init = &(struct clk_init_data){
		.name = "fclk_div2",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_fclk_div2_div.hw
		},
		.num_parents = 1,
	},
};

static struct clk_fixed_factor meson8b_fclk_div3_div = {
	.mult = 1,
	.div = 3,
	.hw.init = &(struct clk_init_data){
		.name = "fclk_div3_div",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_fixed_pll.hw
		},
		.num_parents = 1,
	},
};

static struct clk_regmap meson8b_fclk_div3 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_MPLL_CNTL6,
		.bit_idx = 28,
	},
	.hw.init = &(struct clk_init_data){
		.name = "fclk_div3",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_fclk_div3_div.hw
		},
		.num_parents = 1,
	},
};

static struct clk_fixed_factor meson8b_fclk_div4_div = {
	.mult = 1,
	.div = 4,
	.hw.init = &(struct clk_init_data){
		.name = "fclk_div4_div",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_fixed_pll.hw
		},
		.num_parents = 1,
	},
};

static struct clk_regmap meson8b_fclk_div4 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_MPLL_CNTL6,
		.bit_idx = 29,
	},
	.hw.init = &(struct clk_init_data){
		.name = "fclk_div4",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_fclk_div4_div.hw
		},
		.num_parents = 1,
	},
};

static struct clk_fixed_factor meson8b_fclk_div5_div = {
	.mult = 1,
	.div = 5,
	.hw.init = &(struct clk_init_data){
		.name = "fclk_div5_div",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_fixed_pll.hw
		},
		.num_parents = 1,
	},
};

static struct clk_regmap meson8b_fclk_div5 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_MPLL_CNTL6,
		.bit_idx = 30,
	},
	.hw.init = &(struct clk_init_data){
		.name = "fclk_div5",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_fclk_div5_div.hw
		},
		.num_parents = 1,
	},
};

static struct clk_fixed_factor meson8b_fclk_div7_div = {
	.mult = 1,
	.div = 7,
	.hw.init = &(struct clk_init_data){
		.name = "fclk_div7_div",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_fixed_pll.hw
		},
		.num_parents = 1,
	},
};

static struct clk_regmap meson8b_fclk_div7 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_MPLL_CNTL6,
		.bit_idx = 31,
	},
	.hw.init = &(struct clk_init_data){
		.name = "fclk_div7",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_fclk_div7_div.hw
		},
		.num_parents = 1,
	},
};

static struct clk_regmap meson8b_mpll_prediv = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_MPLL_CNTL5,
		.shift = 12,
		.width = 1,
	},
	.hw.init = &(struct clk_init_data){
		.name = "mpll_prediv",
		.ops = &clk_regmap_divider_ro_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_fixed_pll.hw
		},
		.num_parents = 1,
	},
};

static struct clk_regmap meson8b_mpll0_div = {
	.data = &(struct meson_clk_mpll_data){
		.sdm = {
			.reg_off = HHI_MPLL_CNTL7,
			.shift   = 0,
			.width   = 14,
		},
		.sdm_en = {
			.reg_off = HHI_MPLL_CNTL7,
			.shift   = 15,
			.width   = 1,
		},
		.n2 = {
			.reg_off = HHI_MPLL_CNTL7,
			.shift   = 16,
			.width   = 9,
		},
		.ssen = {
			.reg_off = HHI_MPLL_CNTL,
			.shift   = 25,
			.width   = 1,
		},
	},
	.hw.init = &(struct clk_init_data){
		.name = "mpll0_div",
		.ops = &meson_clk_mpll_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_mpll_prediv.hw
		},
		.num_parents = 1,
	},
};

static struct clk_regmap meson8b_mpll0 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_MPLL_CNTL7,
		.bit_idx = 14,
	},
	.hw.init = &(struct clk_init_data){
		.name = "mpll0",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_mpll0_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_mpll1_div = {
	.data = &(struct meson_clk_mpll_data){
		.sdm = {
			.reg_off = HHI_MPLL_CNTL8,
			.shift   = 0,
			.width   = 14,
		},
		.sdm_en = {
			.reg_off = HHI_MPLL_CNTL8,
			.shift   = 15,
			.width   = 1,
		},
		.n2 = {
			.reg_off = HHI_MPLL_CNTL8,
			.shift   = 16,
			.width   = 9,
		},
	},
	.hw.init = &(struct clk_init_data){
		.name = "mpll1_div",
		.ops = &meson_clk_mpll_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_mpll_prediv.hw
		},
		.num_parents = 1,
	},
};

static struct clk_regmap meson8b_mpll1 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_MPLL_CNTL8,
		.bit_idx = 14,
	},
	.hw.init = &(struct clk_init_data){
		.name = "mpll1",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_mpll1_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_mpll2_div = {
	.data = &(struct meson_clk_mpll_data){
		.sdm = {
			.reg_off = HHI_MPLL_CNTL9,
			.shift   = 0,
			.width   = 14,
		},
		.sdm_en = {
			.reg_off = HHI_MPLL_CNTL9,
			.shift   = 15,
			.width   = 1,
		},
		.n2 = {
			.reg_off = HHI_MPLL_CNTL9,
			.shift   = 16,
			.width   = 9,
		},
	},
	.hw.init = &(struct clk_init_data){
		.name = "mpll2_div",
		.ops = &meson_clk_mpll_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_mpll_prediv.hw
		},
		.num_parents = 1,
	},
};

static struct clk_regmap meson8b_mpll2 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_MPLL_CNTL9,
		.bit_idx = 14,
	},
	.hw.init = &(struct clk_init_data){
		.name = "mpll2",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_mpll2_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static u32 mux_table_clk81[]	= { 6, 5, 7 };
static struct clk_regmap meson8b_mpeg_clk_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_MPEG_CLK_CNTL,
		.mask = 0x7,
		.shift = 12,
		.table = mux_table_clk81,
	},
	.hw.init = &(struct clk_init_data){
		.name = "mpeg_clk_sel",
		.ops = &clk_regmap_mux_ro_ops,
		/*
		 * FIXME bits 14:12 selects from 8 possible parents:
		 * xtal, 1'b0 (wtf), fclk_div7, mpll_clkout1, mpll_clkout2,
		 * fclk_div4, fclk_div3, fclk_div5
		 */
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_fclk_div3.hw,
			&meson8b_fclk_div4.hw,
			&meson8b_fclk_div5.hw,
		},
		.num_parents = 3,
	},
};

static struct clk_regmap meson8b_mpeg_clk_div = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_MPEG_CLK_CNTL,
		.shift = 0,
		.width = 7,
	},
	.hw.init = &(struct clk_init_data){
		.name = "mpeg_clk_div",
		.ops = &clk_regmap_divider_ro_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_mpeg_clk_sel.hw
		},
		.num_parents = 1,
	},
};

static struct clk_regmap meson8b_clk81 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_MPEG_CLK_CNTL,
		.bit_idx = 7,
	},
	.hw.init = &(struct clk_init_data){
		.name = "clk81",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_mpeg_clk_div.hw
		},
		.num_parents = 1,
		.flags = CLK_IS_CRITICAL,
	},
};

static struct clk_regmap meson8b_cpu_in_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_SYS_CPU_CLK_CNTL0,
		.mask = 0x1,
		.shift = 0,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cpu_in_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_data = (const struct clk_parent_data[]) {
			{ .fw_name = "xtal", .name = "xtal", .index = -1, },
			{ .hw = &meson8b_sys_pll.hw, },
		},
		.num_parents = 2,
		.flags = (CLK_SET_RATE_PARENT |
			  CLK_SET_RATE_NO_REPARENT),
	},
};

static struct clk_fixed_factor meson8b_cpu_in_div2 = {
	.mult = 1,
	.div = 2,
	.hw.init = &(struct clk_init_data){
		.name = "cpu_in_div2",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cpu_in_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_fixed_factor meson8b_cpu_in_div3 = {
	.mult = 1,
	.div = 3,
	.hw.init = &(struct clk_init_data){
		.name = "cpu_in_div3",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cpu_in_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static const struct clk_div_table cpu_scale_table[] = {
	{ .val = 1, .div = 4 },
	{ .val = 2, .div = 6 },
	{ .val = 3, .div = 8 },
	{ .val = 4, .div = 10 },
	{ .val = 5, .div = 12 },
	{ .val = 6, .div = 14 },
	{ .val = 7, .div = 16 },
	{ .val = 8, .div = 18 },
	{ /* sentinel */ },
};

static struct clk_regmap meson8b_cpu_scale_div = {
	.data = &(struct clk_regmap_div_data){
		.offset =  HHI_SYS_CPU_CLK_CNTL1,
		.shift = 20,
		.width = 10,
		.table = cpu_scale_table,
		.flags = CLK_DIVIDER_ALLOW_ZERO,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cpu_scale_div",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cpu_in_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static u32 mux_table_cpu_scale_out_sel[] = { 0, 1, 3 };
static struct clk_regmap meson8b_cpu_scale_out_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_SYS_CPU_CLK_CNTL0,
		.mask = 0x3,
		.shift = 2,
		.table = mux_table_cpu_scale_out_sel,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cpu_scale_out_sel",
		.ops = &clk_regmap_mux_ops,
		/*
		 * NOTE: We are skipping the parent with value 0x2 (which is
		 * meson8b_cpu_in_div3) because it results in a duty cycle of
		 * 33% which makes the system unstable and can result in a
		 * lockup of the whole system.
		 */
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cpu_in_sel.hw,
			&meson8b_cpu_in_div2.hw,
			&meson8b_cpu_scale_div.hw,
		},
		.num_parents = 3,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_cpu_clk = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_SYS_CPU_CLK_CNTL0,
		.mask = 0x1,
		.shift = 7,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cpu_clk",
		.ops = &clk_regmap_mux_ops,
		.parent_data = (const struct clk_parent_data[]) {
			{ .fw_name = "xtal", .name = "xtal", .index = -1, },
			{ .hw = &meson8b_cpu_scale_out_sel.hw, },
		},
		.num_parents = 2,
		.flags = (CLK_SET_RATE_PARENT |
			  CLK_SET_RATE_NO_REPARENT |
			  CLK_IS_CRITICAL),
	},
};

static struct clk_regmap meson8b_nand_clk_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_NAND_CLK_CNTL,
		.mask = 0x7,
		.shift = 9,
		.flags = CLK_MUX_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "nand_clk_sel",
		.ops = &clk_regmap_mux_ops,
		/* FIXME all other parents are unknown: */
		.parent_data = (const struct clk_parent_data[]) {
			{ .hw = &meson8b_fclk_div4.hw, },
			{ .hw = &meson8b_fclk_div3.hw, },
			{ .hw = &meson8b_fclk_div5.hw, },
			{ .hw = &meson8b_fclk_div7.hw, },
			{ .fw_name = "xtal", .name = "xtal", .index = -1, },
		},
		.num_parents = 5,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_nand_clk_div = {
	.data = &(struct clk_regmap_div_data){
		.offset =  HHI_NAND_CLK_CNTL,
		.shift = 0,
		.width = 7,
		.flags = CLK_DIVIDER_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "nand_clk_div",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_nand_clk_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_nand_clk_gate = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_NAND_CLK_CNTL,
		.bit_idx = 8,
	},
	.hw.init = &(struct clk_init_data){
		.name = "nand_clk_gate",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_nand_clk_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_fixed_factor meson8b_cpu_clk_div2 = {
	.mult = 1,
	.div = 2,
	.hw.init = &(struct clk_init_data){
		.name = "cpu_clk_div2",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cpu_clk.hw
		},
		.num_parents = 1,
	},
};

static struct clk_fixed_factor meson8b_cpu_clk_div3 = {
	.mult = 1,
	.div = 3,
	.hw.init = &(struct clk_init_data){
		.name = "cpu_clk_div3",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cpu_clk.hw
		},
		.num_parents = 1,
	},
};

static struct clk_fixed_factor meson8b_cpu_clk_div4 = {
	.mult = 1,
	.div = 4,
	.hw.init = &(struct clk_init_data){
		.name = "cpu_clk_div4",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cpu_clk.hw
		},
		.num_parents = 1,
	},
};

static struct clk_fixed_factor meson8b_cpu_clk_div5 = {
	.mult = 1,
	.div = 5,
	.hw.init = &(struct clk_init_data){
		.name = "cpu_clk_div5",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cpu_clk.hw
		},
		.num_parents = 1,
	},
};

static struct clk_fixed_factor meson8b_cpu_clk_div6 = {
	.mult = 1,
	.div = 6,
	.hw.init = &(struct clk_init_data){
		.name = "cpu_clk_div6",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cpu_clk.hw
		},
		.num_parents = 1,
	},
};

static struct clk_fixed_factor meson8b_cpu_clk_div7 = {
	.mult = 1,
	.div = 7,
	.hw.init = &(struct clk_init_data){
		.name = "cpu_clk_div7",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cpu_clk.hw
		},
		.num_parents = 1,
	},
};

static struct clk_fixed_factor meson8b_cpu_clk_div8 = {
	.mult = 1,
	.div = 8,
	.hw.init = &(struct clk_init_data){
		.name = "cpu_clk_div8",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cpu_clk.hw
		},
		.num_parents = 1,
	},
};

static u32 mux_table_apb[] = { 1, 2, 3, 4, 5, 6, 7 };
static struct clk_regmap meson8b_apb_clk_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_SYS_CPU_CLK_CNTL1,
		.mask = 0x7,
		.shift = 3,
		.table = mux_table_apb,
	},
	.hw.init = &(struct clk_init_data){
		.name = "apb_clk_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cpu_clk_div2.hw,
			&meson8b_cpu_clk_div3.hw,
			&meson8b_cpu_clk_div4.hw,
			&meson8b_cpu_clk_div5.hw,
			&meson8b_cpu_clk_div6.hw,
			&meson8b_cpu_clk_div7.hw,
			&meson8b_cpu_clk_div8.hw,
		},
		.num_parents = 7,
	},
};

static struct clk_regmap meson8b_apb_clk_gate = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_SYS_CPU_CLK_CNTL1,
		.bit_idx = 16,
		.flags = CLK_GATE_SET_TO_DISABLE,
	},
	.hw.init = &(struct clk_init_data){
		.name = "apb_clk_dis",
		.ops = &clk_regmap_gate_ro_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_apb_clk_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_periph_clk_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_SYS_CPU_CLK_CNTL1,
		.mask = 0x7,
		.shift = 6,
	},
	.hw.init = &(struct clk_init_data){
		.name = "periph_clk_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cpu_clk_div2.hw,
			&meson8b_cpu_clk_div3.hw,
			&meson8b_cpu_clk_div4.hw,
			&meson8b_cpu_clk_div5.hw,
			&meson8b_cpu_clk_div6.hw,
			&meson8b_cpu_clk_div7.hw,
			&meson8b_cpu_clk_div8.hw,
		},
		.num_parents = 7,
	},
};

static struct clk_regmap meson8b_periph_clk_gate = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_SYS_CPU_CLK_CNTL1,
		.bit_idx = 17,
		.flags = CLK_GATE_SET_TO_DISABLE,
	},
	.hw.init = &(struct clk_init_data){
		.name = "periph_clk_dis",
		.ops = &clk_regmap_gate_ro_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_periph_clk_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static u32 mux_table_axi[] = { 1, 2, 3, 4, 5, 6, 7 };
static struct clk_regmap meson8b_axi_clk_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_SYS_CPU_CLK_CNTL1,
		.mask = 0x7,
		.shift = 9,
		.table = mux_table_axi,
	},
	.hw.init = &(struct clk_init_data){
		.name = "axi_clk_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cpu_clk_div2.hw,
			&meson8b_cpu_clk_div3.hw,
			&meson8b_cpu_clk_div4.hw,
			&meson8b_cpu_clk_div5.hw,
			&meson8b_cpu_clk_div6.hw,
			&meson8b_cpu_clk_div7.hw,
			&meson8b_cpu_clk_div8.hw,
		},
		.num_parents = 7,
	},
};

static struct clk_regmap meson8b_axi_clk_gate = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_SYS_CPU_CLK_CNTL1,
		.bit_idx = 18,
		.flags = CLK_GATE_SET_TO_DISABLE,
	},
	.hw.init = &(struct clk_init_data){
		.name = "axi_clk_dis",
		.ops = &clk_regmap_gate_ro_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_axi_clk_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_l2_dram_clk_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_SYS_CPU_CLK_CNTL1,
		.mask = 0x7,
		.shift = 12,
	},
	.hw.init = &(struct clk_init_data){
		.name = "l2_dram_clk_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cpu_clk_div2.hw,
			&meson8b_cpu_clk_div3.hw,
			&meson8b_cpu_clk_div4.hw,
			&meson8b_cpu_clk_div5.hw,
			&meson8b_cpu_clk_div6.hw,
			&meson8b_cpu_clk_div7.hw,
			&meson8b_cpu_clk_div8.hw,
		},
		.num_parents = 7,
	},
};

static struct clk_regmap meson8b_l2_dram_clk_gate = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_SYS_CPU_CLK_CNTL1,
		.bit_idx = 19,
		.flags = CLK_GATE_SET_TO_DISABLE,
	},
	.hw.init = &(struct clk_init_data){
		.name = "l2_dram_clk_dis",
		.ops = &clk_regmap_gate_ro_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_l2_dram_clk_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

/* also called LVDS_CLK_EN */
static struct clk_regmap meson8b_vid_pll_lvds_en = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VID_DIVIDER_CNTL,
		.bit_idx = 11,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vid_pll_lvds_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_hdmi_pll_lvds_out.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vid_pll_in_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VID_DIVIDER_CNTL,
		.mask = 0x1,
		.shift = 15,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vid_pll_in_sel",
		.ops = &clk_regmap_mux_ops,
		/*
		 * TODO: depending on the SoC there is also a second parent:
		 * Meson8: unknown
		 * Meson8b: hdmi_pll_dco
		 * Meson8m2: vid2_pll
		 */
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vid_pll_lvds_en.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vid_pll_in_en = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VID_DIVIDER_CNTL,
		.bit_idx = 16,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vid_pll_in_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vid_pll_in_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vid_pll_pre_div = {
	.data = &(struct clk_regmap_div_data){
		.offset =  HHI_VID_DIVIDER_CNTL,
		.shift = 4,
		.width = 3,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vid_pll_pre_div",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vid_pll_in_en.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vid_pll_post_div = {
	.data = &(struct clk_regmap_div_data){
		.offset =  HHI_VID_DIVIDER_CNTL,
		.shift = 12,
		.width = 3,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vid_pll_post_div",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vid_pll_pre_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vid_pll = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VID_DIVIDER_CNTL,
		.mask = 0x3,
		.shift = 8,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vid_pll",
		.ops = &clk_regmap_mux_ops,
		/* TODO: parent 0x2 is vid_pll_pre_div_mult7_div2 */
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vid_pll_pre_div.hw,
			&meson8b_vid_pll_post_div.hw,
		},
		.num_parents = 2,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vid_pll_final_div = {
	.data = &(struct clk_regmap_div_data){
		.offset =  HHI_VID_CLK_DIV,
		.shift = 0,
		.width = 8,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vid_pll_final_div",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vid_pll.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static const struct clk_hw *meson8b_vclk_mux_parent_hws[] = {
	&meson8b_vid_pll_final_div.hw,
	&meson8b_fclk_div4.hw,
	&meson8b_fclk_div3.hw,
	&meson8b_fclk_div5.hw,
	&meson8b_vid_pll_final_div.hw,
	&meson8b_fclk_div7.hw,
	&meson8b_mpll1.hw,
};

static struct clk_regmap meson8b_vclk_in_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VID_CLK_CNTL,
		.mask = 0x7,
		.shift = 16,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk_in_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_vclk_mux_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_vclk_mux_parent_hws),
		.flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
	},
};

static struct clk_regmap meson8b_vclk_in_en = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VID_CLK_DIV,
		.bit_idx = 16,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk_in_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk_in_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vclk_en = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VID_CLK_CNTL,
		.bit_idx = 19,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk_in_en.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vclk_div1_gate = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VID_CLK_CNTL,
		.bit_idx = 0,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk_div1_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk_en.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_fixed_factor meson8b_vclk_div2_div = {
	.mult = 1,
	.div = 2,
	.hw.init = &(struct clk_init_data){
		.name = "vclk_div2",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk_en.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	}
};

static struct clk_regmap meson8b_vclk_div2_div_gate = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VID_CLK_CNTL,
		.bit_idx = 1,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk_div2_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk_div2_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_fixed_factor meson8b_vclk_div4_div = {
	.mult = 1,
	.div = 4,
	.hw.init = &(struct clk_init_data){
		.name = "vclk_div4",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk_en.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	}
};

static struct clk_regmap meson8b_vclk_div4_div_gate = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VID_CLK_CNTL,
		.bit_idx = 2,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk_div4_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk_div4_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_fixed_factor meson8b_vclk_div6_div = {
	.mult = 1,
	.div = 6,
	.hw.init = &(struct clk_init_data){
		.name = "vclk_div6",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk_en.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	}
};

static struct clk_regmap meson8b_vclk_div6_div_gate = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VID_CLK_CNTL,
		.bit_idx = 3,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk_div6_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk_div6_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_fixed_factor meson8b_vclk_div12_div = {
	.mult = 1,
	.div = 12,
	.hw.init = &(struct clk_init_data){
		.name = "vclk_div12",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk_en.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	}
};

static struct clk_regmap meson8b_vclk_div12_div_gate = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VID_CLK_CNTL,
		.bit_idx = 4,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk_div12_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk_div12_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vclk2_in_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VIID_CLK_CNTL,
		.mask = 0x7,
		.shift = 16,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk2_in_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_vclk_mux_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_vclk_mux_parent_hws),
		.flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
	},
};

static struct clk_regmap meson8b_vclk2_clk_in_en = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VIID_CLK_DIV,
		.bit_idx = 16,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk2_in_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk2_in_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vclk2_clk_en = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VIID_CLK_DIV,
		.bit_idx = 19,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk2_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk2_clk_in_en.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vclk2_div1_gate = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VIID_CLK_DIV,
		.bit_idx = 0,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk2_div1_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk2_clk_en.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_fixed_factor meson8b_vclk2_div2_div = {
	.mult = 1,
	.div = 2,
	.hw.init = &(struct clk_init_data){
		.name = "vclk2_div2",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk2_clk_en.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	}
};

static struct clk_regmap meson8b_vclk2_div2_div_gate = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VIID_CLK_DIV,
		.bit_idx = 1,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk2_div2_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk2_div2_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_fixed_factor meson8b_vclk2_div4_div = {
	.mult = 1,
	.div = 4,
	.hw.init = &(struct clk_init_data){
		.name = "vclk2_div4",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk2_clk_en.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	}
};

static struct clk_regmap meson8b_vclk2_div4_div_gate = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VIID_CLK_DIV,
		.bit_idx = 2,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk2_div4_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk2_div4_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_fixed_factor meson8b_vclk2_div6_div = {
	.mult = 1,
	.div = 6,
	.hw.init = &(struct clk_init_data){
		.name = "vclk2_div6",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk2_clk_en.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	}
};

static struct clk_regmap meson8b_vclk2_div6_div_gate = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VIID_CLK_DIV,
		.bit_idx = 3,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk2_div6_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk2_div6_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_fixed_factor meson8b_vclk2_div12_div = {
	.mult = 1,
	.div = 12,
	.hw.init = &(struct clk_init_data){
		.name = "vclk2_div12",
		.ops = &clk_fixed_factor_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk2_clk_en.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	}
};

static struct clk_regmap meson8b_vclk2_div12_div_gate = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VIID_CLK_DIV,
		.bit_idx = 4,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vclk2_div12_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vclk2_div12_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static const struct clk_hw *meson8b_vclk_enc_mux_parent_hws[] = {
	&meson8b_vclk_div1_gate.hw,
	&meson8b_vclk_div2_div_gate.hw,
	&meson8b_vclk_div4_div_gate.hw,
	&meson8b_vclk_div6_div_gate.hw,
	&meson8b_vclk_div12_div_gate.hw,
};

static struct clk_regmap meson8b_cts_enct_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VID_CLK_DIV,
		.mask = 0xf,
		.shift = 20,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cts_enct_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_vclk_enc_mux_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_vclk_enc_mux_parent_hws),
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_cts_enct = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VID_CLK_CNTL2,
		.bit_idx = 1,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cts_enct",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cts_enct_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_cts_encp_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VID_CLK_DIV,
		.mask = 0xf,
		.shift = 24,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cts_encp_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_vclk_enc_mux_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_vclk_enc_mux_parent_hws),
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_cts_encp = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VID_CLK_CNTL2,
		.bit_idx = 2,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cts_encp",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cts_encp_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_cts_enci_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VID_CLK_DIV,
		.mask = 0xf,
		.shift = 28,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cts_enci_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_vclk_enc_mux_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_vclk_enc_mux_parent_hws),
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_cts_enci = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VID_CLK_CNTL2,
		.bit_idx = 0,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cts_enci",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cts_enci_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_hdmi_tx_pixel_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_HDMI_CLK_CNTL,
		.mask = 0xf,
		.shift = 16,
	},
	.hw.init = &(struct clk_init_data){
		.name = "hdmi_tx_pixel_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_vclk_enc_mux_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_vclk_enc_mux_parent_hws),
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_hdmi_tx_pixel = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VID_CLK_CNTL2,
		.bit_idx = 5,
	},
	.hw.init = &(struct clk_init_data){
		.name = "hdmi_tx_pixel",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_hdmi_tx_pixel_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static const struct clk_hw *meson8b_vclk2_enc_mux_parent_hws[] = {
	&meson8b_vclk2_div1_gate.hw,
	&meson8b_vclk2_div2_div_gate.hw,
	&meson8b_vclk2_div4_div_gate.hw,
	&meson8b_vclk2_div6_div_gate.hw,
	&meson8b_vclk2_div12_div_gate.hw,
};

static struct clk_regmap meson8b_cts_encl_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VIID_CLK_DIV,
		.mask = 0xf,
		.shift = 12,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cts_encl_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_vclk2_enc_mux_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_vclk2_enc_mux_parent_hws),
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_cts_encl = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VID_CLK_CNTL2,
		.bit_idx = 3,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cts_encl",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cts_encl_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_cts_vdac0_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VIID_CLK_DIV,
		.mask = 0xf,
		.shift = 28,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cts_vdac0_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_vclk2_enc_mux_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_vclk2_enc_mux_parent_hws),
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_cts_vdac0 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VID_CLK_CNTL2,
		.bit_idx = 4,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cts_vdac0",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cts_vdac0_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_hdmi_sys_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_HDMI_CLK_CNTL,
		.mask = 0x3,
		.shift = 9,
		.flags = CLK_MUX_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "hdmi_sys_sel",
		.ops = &clk_regmap_mux_ops,
		/* FIXME: all other parents are unknown */
		.parent_data = &(const struct clk_parent_data) {
			.fw_name = "xtal",
			.name = "xtal",
			.index = -1,
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_NO_REPARENT,
	},
};

static struct clk_regmap meson8b_hdmi_sys_div = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_HDMI_CLK_CNTL,
		.shift = 0,
		.width = 7,
	},
	.hw.init = &(struct clk_init_data){
		.name = "hdmi_sys_div",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_hdmi_sys_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_hdmi_sys = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_HDMI_CLK_CNTL,
		.bit_idx = 8,
	},
	.hw.init = &(struct clk_init_data) {
		.name = "hdmi_sys",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_hdmi_sys_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

/*
 * The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
 * muxed by a glitch-free switch on Meson8b and Meson8m2. The CCF can
 * actually manage this glitch-free mux because it does top-to-bottom
 * updates the each clock tree and switches to the "inactive" one when
 * CLK_SET_RATE_GATE is set.
 * Meson8 only has mali_0 and no glitch-free mux.
 */
static const struct clk_parent_data meson8b_mali_0_1_parent_data[] = {
	{ .fw_name = "xtal", .name = "xtal", .index = -1, },
	{ .hw = &meson8b_mpll2.hw, },
	{ .hw = &meson8b_mpll1.hw, },
	{ .hw = &meson8b_fclk_div7.hw, },
	{ .hw = &meson8b_fclk_div4.hw, },
	{ .hw = &meson8b_fclk_div3.hw, },
	{ .hw = &meson8b_fclk_div5.hw, },
};

static u32 meson8b_mali_0_1_mux_table[] = { 0, 2, 3, 4, 5, 6, 7 };

static struct clk_regmap meson8b_mali_0_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_MALI_CLK_CNTL,
		.mask = 0x7,
		.shift = 9,
		.table = meson8b_mali_0_1_mux_table,
	},
	.hw.init = &(struct clk_init_data){
		.name = "mali_0_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_data = meson8b_mali_0_1_parent_data,
		.num_parents = ARRAY_SIZE(meson8b_mali_0_1_parent_data),
		/*
		 * Don't propagate rate changes up because the only changeable
		 * parents are mpll1 and mpll2 but we need those for audio and
		 * RGMII (Ethernet). We don't want to change the audio or
		 * Ethernet clocks when setting the GPU frequency.
		 */
		.flags = 0,
	},
};

static struct clk_regmap meson8b_mali_0_div = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_MALI_CLK_CNTL,
		.shift = 0,
		.width = 7,
	},
	.hw.init = &(struct clk_init_data){
		.name = "mali_0_div",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_mali_0_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_mali_0 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_MALI_CLK_CNTL,
		.bit_idx = 8,
	},
	.hw.init = &(struct clk_init_data){
		.name = "mali_0",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_mali_0_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_mali_1_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_MALI_CLK_CNTL,
		.mask = 0x7,
		.shift = 25,
		.table = meson8b_mali_0_1_mux_table,
	},
	.hw.init = &(struct clk_init_data){
		.name = "mali_1_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_data = meson8b_mali_0_1_parent_data,
		.num_parents = ARRAY_SIZE(meson8b_mali_0_1_parent_data),
		/*
		 * Don't propagate rate changes up because the only changeable
		 * parents are mpll1 and mpll2 but we need those for audio and
		 * RGMII (Ethernet). We don't want to change the audio or
		 * Ethernet clocks when setting the GPU frequency.
		 */
		.flags = 0,
	},
};

static struct clk_regmap meson8b_mali_1_div = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_MALI_CLK_CNTL,
		.shift = 16,
		.width = 7,
	},
	.hw.init = &(struct clk_init_data){
		.name = "mali_1_div",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_mali_1_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_mali_1 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_MALI_CLK_CNTL,
		.bit_idx = 24,
	},
	.hw.init = &(struct clk_init_data){
		.name = "mali_1",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_mali_1_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_mali = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_MALI_CLK_CNTL,
		.mask = 1,
		.shift = 31,
	},
	.hw.init = &(struct clk_init_data){
		.name = "mali",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_mali_0.hw,
			&meson8b_mali_1.hw,
		},
		.num_parents = 2,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static const struct reg_sequence meson8m2_gp_pll_init_regs[] = {
	{ .reg = HHI_GP_PLL_CNTL2,	.def = 0x59c88000 },
	{ .reg = HHI_GP_PLL_CNTL3,	.def = 0xca463823 },
	{ .reg = HHI_GP_PLL_CNTL4,	.def = 0x0286a027 },
	{ .reg = HHI_GP_PLL_CNTL5,	.def = 0x00003000 },
};

static const struct pll_params_table meson8m2_gp_pll_params_table[] = {
	PLL_PARAMS(182, 3),
	{ /* sentinel */ },
};

static struct clk_regmap meson8m2_gp_pll_dco = {
	.data = &(struct meson_clk_pll_data){
		.en = {
			.reg_off = HHI_GP_PLL_CNTL,
			.shift   = 30,
			.width   = 1,
		},
		.m = {
			.reg_off = HHI_GP_PLL_CNTL,
			.shift   = 0,
			.width   = 9,
		},
		.n = {
			.reg_off = HHI_GP_PLL_CNTL,
			.shift   = 9,
			.width   = 5,
		},
		.l = {
			.reg_off = HHI_GP_PLL_CNTL,
			.shift   = 31,
			.width   = 1,
		},
		.rst = {
			.reg_off = HHI_GP_PLL_CNTL,
			.shift   = 29,
			.width   = 1,
		},
		.table = meson8m2_gp_pll_params_table,
		.init_regs = meson8m2_gp_pll_init_regs,
		.init_count = ARRAY_SIZE(meson8m2_gp_pll_init_regs),
	},
	.hw.init = &(struct clk_init_data){
		.name = "gp_pll_dco",
		.ops = &meson_clk_pll_ops,
		.parent_data = &(const struct clk_parent_data) {
			.fw_name = "xtal",
			.name = "xtal",
			.index = -1,
		},
		.num_parents = 1,
	},
};

static struct clk_regmap meson8m2_gp_pll = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_GP_PLL_CNTL,
		.shift = 16,
		.width = 2,
		.flags = CLK_DIVIDER_POWER_OF_TWO,
	},
	.hw.init = &(struct clk_init_data){
		.name = "gp_pll",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8m2_gp_pll_dco.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static const struct clk_hw *meson8b_vpu_0_1_parent_hws[] = {
	&meson8b_fclk_div4.hw,
	&meson8b_fclk_div3.hw,
	&meson8b_fclk_div5.hw,
	&meson8b_fclk_div7.hw,
};

static const struct clk_hw *mmeson8m2_vpu_0_1_parent_hws[] = {
	&meson8b_fclk_div4.hw,
	&meson8b_fclk_div3.hw,
	&meson8b_fclk_div5.hw,
	&meson8m2_gp_pll.hw,
};

static struct clk_regmap meson8b_vpu_0_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VPU_CLK_CNTL,
		.mask = 0x3,
		.shift = 9,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vpu_0_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_vpu_0_1_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_vpu_0_1_parent_hws),
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8m2_vpu_0_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VPU_CLK_CNTL,
		.mask = 0x3,
		.shift = 9,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vpu_0_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = mmeson8m2_vpu_0_1_parent_hws,
		.num_parents = ARRAY_SIZE(mmeson8m2_vpu_0_1_parent_hws),
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vpu_0_div = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_VPU_CLK_CNTL,
		.shift = 0,
		.width = 7,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vpu_0_div",
		.ops = &clk_regmap_divider_ops,
		.parent_data = &(const struct clk_parent_data) {
			/*
			 * Note:
			 * meson8b and meson8m2 have different vpu_0_sels (with
			 * different struct clk_hw). We fallback to the global
			 * naming string mechanism so vpu_0_div picks up the
			 * appropriate one.
			 */
			.name = "vpu_0_sel",
			.index = -1,
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vpu_0 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VPU_CLK_CNTL,
		.bit_idx = 8,
	},
	.hw.init = &(struct clk_init_data) {
		.name = "vpu_0",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vpu_0_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vpu_1_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VPU_CLK_CNTL,
		.mask = 0x3,
		.shift = 25,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vpu_1_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_vpu_0_1_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_vpu_0_1_parent_hws),
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8m2_vpu_1_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VPU_CLK_CNTL,
		.mask = 0x3,
		.shift = 25,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vpu_1_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = mmeson8m2_vpu_0_1_parent_hws,
		.num_parents = ARRAY_SIZE(mmeson8m2_vpu_0_1_parent_hws),
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vpu_1_div = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_VPU_CLK_CNTL,
		.shift = 16,
		.width = 7,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vpu_1_div",
		.ops = &clk_regmap_divider_ops,
		.parent_data = &(const struct clk_parent_data) {
			/*
			 * Note:
			 * meson8b and meson8m2 have different vpu_1_sels (with
			 * different struct clk_hw). We fallback to the global
			 * naming string mechanism so vpu_1_div picks up the
			 * appropriate one.
			 */
			.name = "vpu_1_sel",
			.index = -1,
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vpu_1 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VPU_CLK_CNTL,
		.bit_idx = 24,
	},
	.hw.init = &(struct clk_init_data) {
		.name = "vpu_1",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vpu_1_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
	},
};

/*
 * The VPU clock has two identical clock trees (vpu_0 and vpu_1)
 * muxed by a glitch-free switch on Meson8b and Meson8m2. The CCF can
 * actually manage this glitch-free mux because it does top-to-bottom
 * updates the each clock tree and switches to the "inactive" one when
 * CLK_SET_RATE_GATE is set.
 * Meson8 only has vpu_0 and no glitch-free mux.
 */
static struct clk_regmap meson8b_vpu = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VPU_CLK_CNTL,
		.mask = 1,
		.shift = 31,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vpu",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vpu_0.hw,
			&meson8b_vpu_1.hw,
		},
		.num_parents = 2,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static const struct clk_hw *meson8b_vdec_parent_hws[] = {
	&meson8b_fclk_div4.hw,
	&meson8b_fclk_div3.hw,
	&meson8b_fclk_div5.hw,
	&meson8b_fclk_div7.hw,
	&meson8b_mpll2.hw,
	&meson8b_mpll1.hw,
};

static struct clk_regmap meson8b_vdec_1_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VDEC_CLK_CNTL,
		.mask = 0x3,
		.shift = 9,
		.flags = CLK_MUX_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vdec_1_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_vdec_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_vdec_parent_hws),
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vdec_1_1_div = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_VDEC_CLK_CNTL,
		.shift = 0,
		.width = 7,
		.flags = CLK_DIVIDER_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vdec_1_1_div",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vdec_1_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vdec_1_1 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VDEC_CLK_CNTL,
		.bit_idx = 8,
	},
	.hw.init = &(struct clk_init_data) {
		.name = "vdec_1_1",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vdec_1_1_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vdec_1_2_div = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_VDEC3_CLK_CNTL,
		.shift = 0,
		.width = 7,
		.flags = CLK_DIVIDER_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vdec_1_2_div",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vdec_1_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vdec_1_2 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VDEC3_CLK_CNTL,
		.bit_idx = 8,
	},
	.hw.init = &(struct clk_init_data) {
		.name = "vdec_1_2",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vdec_1_2_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vdec_1 = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VDEC3_CLK_CNTL,
		.mask = 0x1,
		.shift = 15,
		.flags = CLK_MUX_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vdec_1",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vdec_1_1.hw,
			&meson8b_vdec_1_2.hw,
		},
		.num_parents = 2,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vdec_hcodec_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VDEC_CLK_CNTL,
		.mask = 0x3,
		.shift = 25,
		.flags = CLK_MUX_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vdec_hcodec_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_vdec_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_vdec_parent_hws),
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vdec_hcodec_div = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_VDEC_CLK_CNTL,
		.shift = 16,
		.width = 7,
		.flags = CLK_DIVIDER_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vdec_hcodec_div",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vdec_hcodec_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vdec_hcodec = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VDEC_CLK_CNTL,
		.bit_idx = 24,
	},
	.hw.init = &(struct clk_init_data) {
		.name = "vdec_hcodec",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vdec_hcodec_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vdec_2_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VDEC2_CLK_CNTL,
		.mask = 0x3,
		.shift = 9,
		.flags = CLK_MUX_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vdec_2_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_vdec_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_vdec_parent_hws),
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vdec_2_div = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_VDEC2_CLK_CNTL,
		.shift = 0,
		.width = 7,
		.flags = CLK_DIVIDER_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vdec_2_div",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vdec_2_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vdec_2 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VDEC2_CLK_CNTL,
		.bit_idx = 8,
	},
	.hw.init = &(struct clk_init_data) {
		.name = "vdec_2",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vdec_2_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vdec_hevc_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VDEC2_CLK_CNTL,
		.mask = 0x3,
		.shift = 25,
		.flags = CLK_MUX_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vdec_hevc_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_vdec_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_vdec_parent_hws),
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vdec_hevc_div = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_VDEC2_CLK_CNTL,
		.shift = 16,
		.width = 7,
		.flags = CLK_DIVIDER_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vdec_hevc_div",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vdec_hevc_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vdec_hevc_en = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_VDEC2_CLK_CNTL,
		.bit_idx = 24,
	},
	.hw.init = &(struct clk_init_data) {
		.name = "vdec_hevc_en",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vdec_hevc_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_vdec_hevc = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_VDEC2_CLK_CNTL,
		.mask = 0x1,
		.shift = 31,
		.flags = CLK_MUX_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "vdec_hevc",
		.ops = &clk_regmap_mux_ops,
		/* TODO: The second parent is currently unknown */
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_vdec_hevc_en.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

/* TODO: the clock at index 0 is "DDR_PLL" which we don't support yet */
static const struct clk_hw *meson8b_cts_amclk_parent_hws[] = {
	&meson8b_mpll0.hw,
	&meson8b_mpll1.hw,
	&meson8b_mpll2.hw
};

static u32 meson8b_cts_amclk_mux_table[] = { 1, 2, 3 };

static struct clk_regmap meson8b_cts_amclk_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_AUD_CLK_CNTL,
		.mask = 0x3,
		.shift = 9,
		.table = meson8b_cts_amclk_mux_table,
		.flags = CLK_MUX_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cts_amclk_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_cts_amclk_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_cts_amclk_parent_hws),
	},
};

static struct clk_regmap meson8b_cts_amclk_div = {
	.data = &(struct clk_regmap_div_data) {
		.offset = HHI_AUD_CLK_CNTL,
		.shift = 0,
		.width = 8,
		.flags = CLK_DIVIDER_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cts_amclk_div",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cts_amclk_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_cts_amclk = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_AUD_CLK_CNTL,
		.bit_idx = 8,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cts_amclk",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cts_amclk_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

/* TODO: the clock at index 0 is "DDR_PLL" which we don't support yet */
static const struct clk_hw *meson8b_cts_mclk_i958_parent_hws[] = {
	&meson8b_mpll0.hw,
	&meson8b_mpll1.hw,
	&meson8b_mpll2.hw
};

static u32 meson8b_cts_mclk_i958_mux_table[] = { 1, 2, 3 };

static struct clk_regmap meson8b_cts_mclk_i958_sel = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_AUD_CLK_CNTL2,
		.mask = 0x3,
		.shift = 25,
		.table = meson8b_cts_mclk_i958_mux_table,
		.flags = CLK_MUX_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data) {
		.name = "cts_mclk_i958_sel",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = meson8b_cts_mclk_i958_parent_hws,
		.num_parents = ARRAY_SIZE(meson8b_cts_mclk_i958_parent_hws),
	},
};

static struct clk_regmap meson8b_cts_mclk_i958_div = {
	.data = &(struct clk_regmap_div_data){
		.offset = HHI_AUD_CLK_CNTL2,
		.shift = 16,
		.width = 8,
		.flags = CLK_DIVIDER_ROUND_CLOSEST,
	},
	.hw.init = &(struct clk_init_data) {
		.name = "cts_mclk_i958_div",
		.ops = &clk_regmap_divider_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cts_mclk_i958_sel.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_cts_mclk_i958 = {
	.data = &(struct clk_regmap_gate_data){
		.offset = HHI_AUD_CLK_CNTL2,
		.bit_idx = 24,
	},
	.hw.init = &(struct clk_init_data){
		.name = "cts_mclk_i958",
		.ops = &clk_regmap_gate_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cts_mclk_i958_div.hw
		},
		.num_parents = 1,
		.flags = CLK_SET_RATE_PARENT,
	},
};

static struct clk_regmap meson8b_cts_i958 = {
	.data = &(struct clk_regmap_mux_data){
		.offset = HHI_AUD_CLK_CNTL2,
		.mask = 0x1,
		.shift = 27,
		},
	.hw.init = &(struct clk_init_data){
		.name = "cts_i958",
		.ops = &clk_regmap_mux_ops,
		.parent_hws = (const struct clk_hw *[]) {
			&meson8b_cts_amclk.hw,
			&meson8b_cts_mclk_i958.hw
		},
		.num_parents = 2,
		/*
		 * The parent is specific to origin of the audio data. Let the
		 * consumer choose the appropriate parent.
		 */
		.flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
	},
};

#define MESON_GATE(_name, _reg, _bit) \
	MESON_PCLK(_name, _reg, _bit, &meson8b_clk81.hw)

/* Everything Else (EE) domain gates */

static MESON_GATE(meson8b_ddr, HHI_GCLK_MPEG0, 0);
static MESON_GATE(meson8b_dos, HHI_GCLK_MPEG0, 1);
static MESON_GATE(meson8b_isa, HHI_GCLK_MPEG0, 5);
static MESON_GATE(meson8b_pl301, HHI_GCLK_MPEG0, 6);
static MESON_GATE(meson8b_periphs, HHI_GCLK_MPEG0, 7);
static MESON_GATE(meson8b_spicc, HHI_GCLK_MPEG0, 8);
static MESON_GATE(meson8b_i2c, HHI_GCLK_MPEG0, 9);
static MESON_GATE(meson8b_sar_adc, HHI_GCLK_MPEG0, 10);
static MESON_GATE(meson8b_smart_card, HHI_GCLK_MPEG0, 11);
static MESON_GATE(meson8b_rng0, HHI_GCLK_MPEG0, 12);
static MESON_GATE(meson8b_uart0, HHI_GCLK_MPEG0, 13);
static MESON_GATE(meson8b_sdhc, HHI_GCLK_MPEG0, 14);
static MESON_GATE(meson8b_stream, HHI_GCLK_MPEG0, 15);
static MESON_GATE(meson8b_async_fifo, HHI_GCLK_MPEG0, 16);
static MESON_GATE(meson8b_sdio, HHI_GCLK_MPEG0, 17);
static MESON_GATE(meson8b_abuf, HHI_GCLK_MPEG0, 18);
static MESON_GATE(meson8b_hiu_iface, HHI_GCLK_MPEG0, 19);
static MESON_GATE(meson8b_assist_misc, HHI_GCLK_MPEG0, 23);
static MESON_GATE(meson8b_spi, HHI_GCLK_MPEG0, 30);

static MESON_GATE(meson8b_i2s_spdif, HHI_GCLK_MPEG1, 2);
static MESON_GATE(meson8b_eth, HHI_GCLK_MPEG1, 3);
static MESON_GATE(meson8b_demux, HHI_GCLK_MPEG1, 4);
static MESON_GATE(meson8b_blkmv, HHI_GCLK_MPEG1, 14);
static MESON_GATE(meson8b_aiu, HHI_GCLK_MPEG1, 15);
static MESON_GATE(meson8b_uart1, HHI_GCLK_MPEG1, 16);
static MESON_GATE(meson8b_g2d, HHI_GCLK_MPEG1, 20);
static MESON_GATE(meson8b_usb0, HHI_GCLK_MPEG1, 21);
static MESON_GATE(meson8b_usb1, HHI_GCLK_MPEG1, 22);
static MESON_GATE(meson8b_reset, HHI_GCLK_MPEG1, 23);
static MESON_GATE(meson8b_nand, HHI_GCLK_MPEG1, 24);
static MESON_GATE(meson8b_dos_parser, HHI_GCLK_MPEG1, 25);
static MESON_GATE(meson8b_usb, HHI_GCLK_MPEG1, 26);
static MESON_GATE(meson8b_vdin1, HHI_GCLK_MPEG1, 28);
static MESON_GATE(meson8b_ahb_arb0, HHI_GCLK_MPEG1, 29);
static MESON_GATE(meson8b_efuse, HHI_GCLK_MPEG1, 30);
static MESON_GATE(meson8b_boot_rom, HHI_GCLK_MPEG1, 31);

static MESON_GATE(meson8b_ahb_data_bus, HHI_GCLK_MPEG2, 1);
static MESON_GATE(meson8b_ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
static MESON_GATE(meson8b_hdmi_intr_sync, HHI_GCLK_MPEG2, 3);
static MESON_GATE(meson8b_hdmi_pclk, HHI_GCLK_MPEG2, 4);
static MESON_GATE(meson8b_usb1_ddr_bridge, HHI_GCLK_MPEG2, 8);
static MESON_GATE(meson8b_usb0_ddr_bridge, HHI_GCLK_MPEG2, 9);
static MESON_GATE(meson8b_mmc_pclk, HHI_GCLK_MPEG2, 11);
static MESON_GATE(meson8b_dvin, HHI_GCLK_MPEG2, 12);
static MESON_GATE(meson8b_uart2, HHI_GCLK_MPEG2, 15);
static MESON_GATE(meson8b_sana, HHI_GCLK_MPEG2, 22);
static MESON_GATE(meson8b_vpu_intr, HHI_GCLK_MPEG2, 25);
static MESON_GATE(meson8b_sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26);
static MESON_GATE(meson8b_clk81_a9, HHI_GCLK_MPEG2, 29);

static MESON_GATE(meson8b_vclk2_venci0, HHI_GCLK_OTHER, 1);
static MESON_GATE(meson8b_vclk2_venci1, HHI_GCLK_OTHER, 2);
static MESON_GATE(meson8b_vclk2_vencp0, HHI_GCLK_OTHER, 3);
static MESON_GATE(meson8b_vclk2_vencp1, HHI_GCLK_OTHER, 4);
static MESON_GATE(meson8b_gclk_venci_int, HHI_GCLK_OTHER, 8);
static MESON_GATE(meson8b_gclk_vencp_int, HHI_GCLK_OTHER, 9);
static MESON_GATE(meson8b_dac_clk, HHI_GCLK_OTHER, 10);
static MESON_GATE(meson8b_aoclk_gate, HHI_GCLK_OTHER, 14);
static MESON_GATE(meson8b_iec958_gate, HHI_GCLK_OTHER, 16);
static MESON_GATE(meson8b_enc480p, HHI_GCLK_OTHER, 20);
static MESON_GATE(meson8b_rng1, HHI_GCLK_OTHER, 21);
static MESON_GATE(meson8b_gclk_vencl_int, HHI_GCLK_OTHER, 22);
static MESON_GATE(meson8b_vclk2_venclmcc, HHI_GCLK_OTHER, 24);
static MESON_GATE(meson8b_vclk2_vencl, HHI_GCLK_OTHER, 25);
static MESON_GATE(meson8b_vclk2_other, HHI_GCLK_OTHER, 26);
static MESON_GATE(meson8b_edp, HHI_GCLK_OTHER, 31);

/* AIU gates */
#define MESON_AIU_GLUE_GATE(_name, _reg, _bit) \
	MESON_PCLK(_name, _reg, _bit, &meson8b_aiu_glue.hw)

static MESON_PCLK(meson8b_aiu_glue, HHI_GCLK_MPEG1, 6, &meson8b_aiu.hw);
static MESON_AIU_GLUE_GATE(meson8b_iec958, HHI_GCLK_MPEG1, 7);
static MESON_AIU_GLUE_GATE(meson8b_i2s_out, HHI_GCLK_MPEG1, 8);
static MESON_AIU_GLUE_GATE(meson8b_amclk, HHI_GCLK_MPEG1, 9);
static MESON_AIU_GLUE_GATE(meson8b_aififo2, HHI_GCLK_MPEG1, 10);
static MESON_AIU_GLUE_GATE(meson8b_mixer, HHI_GCLK_MPEG1, 11);
static MESON_AIU_GLUE_GATE(meson8b_mixer_iface, HHI_GCLK_MPEG1, 12);
static MESON_AIU_GLUE_GATE(meson8b_adc, HHI_GCLK_MPEG1, 13);

/* Always On (AO) domain gates */

static MESON_GATE(meson8b_ao_media_cpu, HHI_GCLK_AO, 0);
static MESON_GATE(meson8b_ao_ahb_sram, HHI_GCLK_AO, 1);
static MESON_GATE(meson8b_ao_ahb_bus, HHI_GCLK_AO, 2);
static MESON_GATE(meson8b_ao_iface, HHI_GCLK_AO, 3);

static struct clk_hw *meson8_hw_clks[] = {
	[CLKID_PLL_FIXED] = &meson8b_fixed_pll.hw,
	[CLKID_PLL_VID] = &meson8b_vid_pll.hw,
	[CLKID_PLL_SYS] = &meson8b_sys_pll.hw,
	[CLKID_FCLK_DIV2] = &meson8b_fclk_div2.hw,
	[CLKID_FCLK_DIV3] = &meson8b_fclk_div3.hw,
	[CLKID_FCLK_DIV4] = &meson8b_fclk_div4.hw,
	[CLKID_FCLK_DIV5] = &meson8b_fclk_div5.hw,
	[CLKID_FCLK_DIV7] = &meson8b_fclk_div7.hw,
	[CLKID_CPUCLK] = &meson8b_cpu_clk.hw,
	[CLKID_MPEG_SEL] = &meson8b_mpeg_clk_sel.hw,
	[CLKID_MPEG_DIV] = &meson8b_mpeg_clk_div.hw,
	[CLKID_CLK81] = &meson8b_clk81.hw,
	[CLKID_DDR]		    = &meson8b_ddr.hw,
	[CLKID_DOS]		    = &meson8b_dos.hw,
	[CLKID_ISA]		    = &meson8b_isa.hw,
	[CLKID_PL301]		    = &meson8b_pl301.hw,
	[CLKID_PERIPHS]		    = &meson8b_periphs.hw,
	[CLKID_SPICC]		    = &meson8b_spicc.hw,
	[CLKID_I2C]		    = &meson8b_i2c.hw,
	[CLKID_SAR_ADC]		    = &meson8b_sar_adc.hw,
	[CLKID_SMART_CARD]	    = &meson8b_smart_card.hw,
	[CLKID_RNG0]		    = &meson8b_rng0.hw,
	[CLKID_UART0]		    = &meson8b_uart0.hw,
	[CLKID_SDHC]		    = &meson8b_sdhc.hw,
	[CLKID_STREAM]		    = &meson8b_stream.hw,
	[CLKID_ASYNC_FIFO]	    = &meson8b_async_fifo.hw,
	[CLKID_SDIO]		    = &meson8b_sdio.hw,
	[CLKID_ABUF]		    = &meson8b_abuf.hw,
	[CLKID_HIU_IFACE]	    = &meson8b_hiu_iface.hw,
	[CLKID_ASSIST_MISC]	    = &meson8b_assist_misc.hw,
	[CLKID_SPI]		    = &meson8b_spi.hw,
	[CLKID_I2S_SPDIF]	    = &meson8b_i2s_spdif.hw,
	[CLKID_ETH]		    = &meson8b_eth.hw,
	[CLKID_DEMUX]		    = &meson8b_demux.hw,
	[CLKID_AIU_GLUE]	    = &meson8b_aiu_glue.hw,
	[CLKID_IEC958]		    = &meson8b_iec958.hw,
	[CLKID_I2S_OUT]		    = &meson8b_i2s_out.hw,
	[CLKID_AMCLK]		    = &meson8b_amclk.hw,
	[CLKID_AIFIFO2]		    = &meson8b_aififo2.hw,
	[CLKID_MIXER]		    = &meson8b_mixer.hw,
	[CLKID_MIXER_IFACE]	    = &meson8b_mixer_iface.hw,
	[CLKID_ADC]		    = &meson8b_adc.hw,
	[CLKID_BLKMV]		    = &meson8b_blkmv.hw,
	[CLKID_AIU]		    = &meson8b_aiu.hw,
	[CLKID_UART1]		    = &meson8b_uart1.hw,
	[CLKID_G2D]		    = &meson8b_g2d.hw,
	[CLKID_USB0]		    = &meson8b_usb0.hw,
	[CLKID_USB1]		    = &meson8b_usb1.hw,
	[CLKID_RESET]		    = &meson8b_reset.hw,
	[CLKID_NAND]		    = &meson8b_nand.hw,
	[CLKID_DOS_PARSER]	    = &meson8b_dos_parser.hw,
	[CLKID_USB]		    = &meson8b_usb.hw,
	[CLKID_VDIN1]		    = &meson8b_vdin1.hw,
	[CLKID_AHB_ARB0]	    = &meson8b_ahb_arb0.hw,
	[CLKID_EFUSE]		    = &meson8b_efuse.hw,
	[CLKID_BOOT_ROM]	    = &meson8b_boot_rom.hw,
	[CLKID_AHB_DATA_BUS]	    = &meson8b_ahb_data_bus.hw,
	[CLKID_AHB_CTRL_BUS]	    = &meson8b_ahb_ctrl_bus.hw,
	[CLKID_HDMI_INTR_SYNC]	    = &meson8b_hdmi_intr_sync.hw,
	[CLKID_HDMI_PCLK]	    = &meson8b_hdmi_pclk.hw,
	[CLKID_USB1_DDR_BRIDGE]	    = &meson8b_usb1_ddr_bridge.hw,
	[CLKID_USB0_DDR_BRIDGE]	    = &meson8b_usb0_ddr_bridge.hw,
	[CLKID_MMC_PCLK]	    = &meson8b_mmc_pclk.hw,
	[CLKID_DVIN]		    = &meson8b_dvin.hw,
	[CLKID_UART2]		    = &meson8b_uart2.hw,
	[CLKID_SANA]		    = &meson8b_sana.hw,
	[CLKID_VPU_INTR]	    = &meson8b_vpu_intr.hw,
	[CLKID_SEC_AHB_AHB3_BRIDGE] = &meson8b_sec_ahb_ahb3_bridge.hw,
	[CLKID_CLK81_A9]	    = &meson8b_clk81_a9.hw,
	[CLKID_VCLK2_VENCI0]	    = &meson8b_vclk2_venci0.hw,
	[CLKID_VCLK2_VENCI1]	    = &meson8b_vclk2_venci1.hw,
	[CLKID_VCLK2_VENCP0]	    = &meson8b_vclk2_vencp0.hw,
	[CLKID_VCLK2_VENCP1]	    = &meson8b_vclk2_vencp1.hw,
	[CLKID_GCLK_VENCI_INT]	    = &meson8b_gclk_venci_int.hw,
	[CLKID_GCLK_VENCP_INT]	    = &meson8b_gclk_vencp_int.hw,
	[CLKID_DAC_CLK]		    = &meson8b_dac_clk.hw,
	[CLKID_AOCLK_GATE]	    = &meson8b_aoclk_gate.hw,
	[CLKID_IEC958_GATE]	    = &meson8b_iec958_gate.hw,
	[CLKID_ENC480P]		    = &meson8b_enc480p.hw,
	[CLKID_RNG1]		    = &meson8b_rng1.hw,
	[CLKID_GCLK_VENCL_INT]	    = &meson8b_gclk_vencl_int.hw,
	[CLKID_VCLK2_VENCLMCC]	    = &meson8b_vclk2_venclmcc.hw,
	[CLKID_VCLK2_VENCL]	    = &meson8b_vclk2_vencl.hw,
	[CLKID_VCLK2_OTHER]	    = &meson8b_vclk2_other.hw,
	[CLKID_EDP]		    = &meson8b_edp.hw,
	[CLKID_AO_MEDIA_CPU]	    = &meson8b_ao_media_cpu.hw,
	[CLKID_AO_AHB_SRAM]	    = &meson8b_ao_ahb_sram.hw,
	[CLKID_AO_AHB_BUS]	    = &meson8b_ao_ahb_bus.hw,
	[CLKID_AO_IFACE]	    = &meson8b_ao_iface.hw,
	[CLKID_MPLL0]		    = &meson8b_mpll0.hw,
	[CLKID_MPLL1]		    = &meson8b_mpll1.hw,
	[CLKID_MPLL2]		    = &meson8b_mpll2.hw,
	[CLKID_MPLL0_DIV]	    = &meson8b_mpll0_div.hw,
	[CLKID_MPLL1_DIV]	    = &meson8b_mpll1_div.hw,
	[CLKID_MPLL2_DIV]	    = &meson8b_mpll2_div.hw,
	[CLKID_CPU_IN_SEL]	    = &meson8b_cpu_in_sel.hw,
	[CLKID_CPU_IN_DIV2]	    = &meson8b_cpu_in_div2.hw,
	[CLKID_CPU_IN_DIV3]	    = &meson8b_cpu_in_div3.hw,
	[CLKID_CPU_SCALE_DIV]	    = &meson8b_cpu_scale_div.hw,
	[CLKID_CPU_SCALE_OUT_SEL]   = &meson8b_cpu_scale_out_sel.hw,
	[CLKID_MPLL_PREDIV]	    = &meson8b_mpll_prediv.hw,
	[CLKID_FCLK_DIV2_DIV]	    = &meson8b_fclk_div2_div.hw,
	[CLKID_FCLK_DIV3_DIV]	    = &meson8b_fclk_div3_div.hw,
	[CLKID_FCLK_DIV4_DIV]	    = &meson8b_fclk_div4_div.hw,
	[CLKID_FCLK_DIV5_DIV]	    = &meson8b_fclk_div5_div.hw,
	[CLKID_FCLK_DIV7_DIV]	    = &meson8b_fclk_div7_div.hw,
	[CLKID_NAND_SEL]	    = &meson8b_nand_clk_sel.hw,
	[CLKID_NAND_DIV]	    = &meson8b_nand_clk_div.hw,
	[CLKID_NAND_CLK]	    = &meson8b_nand_clk_gate.hw,
	[CLKID_PLL_FIXED_DCO]	    = &meson8b_fixed_pll_dco.hw,
	[CLKID_HDMI_PLL_DCO]	    = &meson8b_hdmi_pll_dco.hw,
	[CLKID_PLL_SYS_DCO]	    = &meson8b_sys_pll_dco.hw,
	[CLKID_CPU_CLK_DIV2]	    = &meson8b_cpu_clk_div2.hw,
	[CLKID_CPU_CLK_DIV3]	    = &meson8b_cpu_clk_div3.hw,
	[CLKID_CPU_CLK_DIV4]	    = &meson8b_cpu_clk_div4.hw,
	[CLKID_CPU_CLK_DIV5]	    = &meson8b_cpu_clk_div5.hw,
	[CLKID_CPU_CLK_DIV6]	    = &meson8b_cpu_clk_div6.hw,
	[CLKID_CPU_CLK_DIV7]	    = &meson8b_cpu_clk_div7.hw,
	[CLKID_CPU_CLK_DIV8]	    = &meson8b_cpu_clk_div8.hw,
	[CLKID_APB_SEL]		    = &meson8b_apb_clk_sel.hw,
	[CLKID_APB]		    = &meson8b_apb_clk_gate.hw,
	[CLKID_PERIPH_SEL]	    = &meson8b_periph_clk_sel.hw,
	[CLKID_PERIPH]		    = &meson8b_periph_clk_gate.hw,
	[CLKID_AXI_SEL]		    = &meson8b_axi_clk_sel.hw,
	[CLKID_AXI]		    = &meson8b_axi_clk_gate.hw,
	[CLKID_L2_DRAM_SEL]	    = &meson8b_l2_dram_clk_sel.hw,
	[CLKID_L2_DRAM]		    = &meson8b_l2_dram_clk_gate.hw,
	[CLKID_HDMI_PLL_LVDS_OUT]   = &meson8b_hdmi_pll_lvds_out.hw,
	[CLKID_HDMI_PLL_HDMI_OUT]   = &meson8b_hdmi_pll_hdmi_out.hw,
	[CLKID_VID_PLL_IN_SEL]	    = &meson8b_vid_pll_in_sel.hw,
	[CLKID_VID_PLL_IN_EN]	    = &meson8b_vid_pll_in_en.hw,
	[CLKID_VID_PLL_PRE_DIV]	    = &meson8b_vid_pll_pre_div.hw,
	[CLKID_VID_PLL_POST_DIV]    = &meson8b_vid_pll_post_div.hw,
	[CLKID_VID_PLL_FINAL_DIV]   = &meson8b_vid_pll_final_div.hw,
	[CLKID_VCLK_IN_SEL]	    = &meson8b_vclk_in_sel.hw,
	[CLKID_VCLK_IN_EN]	    = &meson8b_vclk_in_en.hw,
	[CLKID_VCLK_EN]		    = &meson8b_vclk_en.hw,
	[CLKID_VCLK_DIV1]	    = &meson8b_vclk_div1_gate.hw,
	[CLKID_VCLK_DIV2_DIV]	    = &meson8b_vclk_div2_div.hw,
	[CLKID_VCLK_DIV2]	    = &meson8b_vclk_div2_div_gate.hw,
	[CLKID_VCLK_DIV4_DIV]	    = &meson8b_vclk_div4_div.hw,
	[CLKID_VCLK_DIV4]	    = &meson8b_vclk_div4_div_gate.hw,
	[CLKID_VCLK_DIV6_DIV]	    = &meson8b_vclk_div6_div.hw,
	[CLKID_VCLK_DIV6]	    = &meson8b_vclk_div6_div_gate.hw,
	[CLKID_VCLK_DIV12_DIV]	    = &meson8b_vclk_div12_div.hw,
	[CLKID_VCLK_DIV12]	    = &meson8b_vclk_div12_div_gate.hw,
	[CLKID_VCLK2_IN_SEL]	    = &meson8b_vclk2_in_sel.hw,
	[CLKID_VCLK2_IN_EN]	    = &meson8b_vclk2_clk_in_en.hw,
	[CLKID_VCLK2_EN]	    = &meson8b_vclk2_clk_en.hw,
	[CLKID_VCLK2_DIV1]	    = &meson8b_vclk2_div1_gate.hw,
	[CLKID_VCLK2_DIV2_DIV]	    = &meson8b_vclk2_div2_div.hw,
	[CLKID_VCLK2_DIV2]	    = &meson8b_vclk2_div2_div_gate.hw,
	[CLKID_VCLK2_DIV4_DIV]	    = &meson8b_vclk2_div4_div.hw,
	[CLKID_VCLK2_DIV4]	    = &meson8b_vclk2_div4_div_gate.hw,
	[CLKID_VCLK2_DIV6_DIV]	    = &meson8b_vclk2_div6_div.hw,
	[CLKID_VCLK2_DIV6]	    = &meson8b_vclk2_div6_div_gate.hw,
	[CLKID_VCLK2_DIV12_DIV]	    = &meson8b_vclk2_div12_div.hw,
	[CLKID_VCLK2_DIV12]	    = &meson8b_vclk2_div12_div_gate.hw,
	[CLKID_CTS_ENCT_SEL]	    = &meson8b_cts_enct_sel.hw,
	[CLKID_CTS_ENCT]	    = &meson8b_cts_enct.hw,
	[CLKID_CTS_ENCP_SEL]	    = &meson8b_cts_encp_sel.hw,
	[CLKID_CTS_ENCP]	    = &meson8b_cts_encp.hw,
	[CLKID_CTS_ENCI_SEL]	    = &meson8b_cts_enci_sel.hw,
	[CLKID_CTS_ENCI]	    = &meson8b_cts_enci.hw,
	[CLKID_HDMI_TX_PIXEL_SEL]   = &meson8b_hdmi_tx_pixel_sel.hw,
	[CLKID_HDMI_TX_PIXEL]	    = &meson8b_hdmi_tx_pixel.hw,
	[CLKID_CTS_ENCL_SEL]	    = &meson8b_cts_encl_sel.hw,
	[CLKID_CTS_ENCL]	    = &meson8b_cts_encl.hw,
	[CLKID_CTS_VDAC0_SEL]	    = &meson8b_cts_vdac0_sel.hw,
	[CLKID_CTS_VDAC0]	    = &meson8b_cts_vdac0.hw,
	[CLKID_HDMI_SYS_SEL]	    = &meson8b_hdmi_sys_sel.hw,
	[CLKID_HDMI_SYS_DIV]	    = &meson8b_hdmi_sys_div.hw,
	[CLKID_HDMI_SYS]	    = &meson8b_hdmi_sys.hw,
	[CLKID_MALI_0_SEL]	    = &meson8b_mali_0_sel.hw,
	[CLKID_MALI_0_DIV]	    = &meson8b_mali_0_div.hw,
	[CLKID_MALI]		    = &meson8b_mali_0.hw,
	[CLKID_VPU_0_SEL]	    = &meson8b_vpu_0_sel.hw,
	[CLKID_VPU_0_DIV]	    = &meson8b_vpu_0_div.hw,
	[CLKID_VPU]		    = &meson8b_vpu_0.hw,
	[CLKID_VDEC_1_SEL]	    = &meson8b_vdec_1_sel.hw,
	[CLKID_VDEC_1_1_DIV]	    = &meson8b_vdec_1_1_div.hw,
	[CLKID_VDEC_1]		    = &meson8b_vdec_1_1.hw,
	[CLKID_VDEC_HCODEC_SEL]	    = &meson8b_vdec_hcodec_sel.hw,
	[CLKID_VDEC_HCODEC_DIV]	    = &meson8b_vdec_hcodec_div.hw,
	[CLKID_VDEC_HCODEC]	    = &meson8b_vdec_hcodec.hw,
	[CLKID_VDEC_2_SEL]	    = &meson8b_vdec_2_sel.hw,
	[CLKID_VDEC_2_DIV]	    = &meson8b_vdec_2_div.hw,
	[CLKID_VDEC_2]		    = &meson8b_vdec_2.hw,
	[CLKID_VDEC_HEVC_SEL]	    = &meson8b_vdec_hevc_sel.hw,
	[CLKID_VDEC_HEVC_DIV]	    = &meson8b_vdec_hevc_div.hw,
	[CLKID_VDEC_HEVC_EN]	    = &meson8b_vdec_hevc_en.hw,
	[CLKID_VDEC_HEVC]	    = &meson8b_vdec_hevc.hw,
	[CLKID_CTS_AMCLK_SEL]	    = &meson8b_cts_amclk_sel.hw,
	[CLKID_CTS_AMCLK_DIV]	    = &meson8b_cts_amclk_div.hw,
	[CLKID_CTS_AMCLK]	    = &meson8b_cts_amclk.hw,
	[CLKID_CTS_MCLK_I958_SEL]   = &meson8b_cts_mclk_i958_sel.hw,
	[CLKID_CTS_MCLK_I958_DIV]   = &meson8b_cts_mclk_i958_div.hw,
	[CLKID_CTS_MCLK_I958]	    = &meson8b_cts_mclk_i958.hw,
	[CLKID_CTS_I958]	    = &meson8b_cts_i958.hw,
	[CLKID_VID_PLL_LVDS_EN]	    = &meson8b_vid_pll_lvds_en.hw,
	[CLKID_HDMI_PLL_DCO_IN]	    = &hdmi_pll_dco_in.hw,
};

static struct clk_hw *meson8b_hw_clks[] = {
	[CLKID_PLL_FIXED] = &meson8b_fixed_pll.hw,
	[CLKID_PLL_VID] = &meson8b_vid_pll.hw,
	[CLKID_PLL_SYS] = &meson8b_sys_pll.hw,
	[CLKID_FCLK_DIV2] = &meson8b_fclk_div2.hw,
	[CLKID_FCLK_DIV3] = &meson8b_fclk_div3.hw,
	[CLKID_FCLK_DIV4] = &meson8b_fclk_div4.hw,
	[CLKID_FCLK_DIV5] = &meson8b_fclk_div5.hw,
	[CLKID_FCLK_DIV7] = &meson8b_fclk_div7.hw,
	[CLKID_CPUCLK] = &meson8b_cpu_clk.hw,
	[CLKID_MPEG_SEL] = &meson8b_mpeg_clk_sel.hw,
	[CLKID_MPEG_DIV] = &meson8b_mpeg_clk_div.hw,
	[CLKID_CLK81] = &meson8b_clk81.hw,
	[CLKID_DDR]		    = &meson8b_ddr.hw,
	[CLKID_DOS]		    = &meson8b_dos.hw,
	[CLKID_ISA]		    = &meson8b_isa.hw,
	[CLKID_PL301]		    = &meson8b_pl301.hw,
	[CLKID_PERIPHS]		    = &meson8b_periphs.hw,
	[CLKID_SPICC]		    = &meson8b_spicc.hw,
	[CLKID_I2C]		    = &meson8b_i2c.hw,
	[CLKID_SAR_ADC]		    = &meson8b_sar_adc.hw,
	[CLKID_SMART_CARD]	    = &meson8b_smart_card.hw,
	[CLKID_RNG0]		    = &meson8b_rng0.hw,
	[CLKID_UART0]		    = &meson8b_uart0.hw,
	[CLKID_SDHC]		    = &meson8b_sdhc.hw,
	[CLKID_STREAM]		    = &meson8b_stream.hw,
	[CLKID_ASYNC_FIFO]	    = &meson8b_async_fifo.hw,
	[CLKID_SDIO]		    = &meson8b_sdio.hw,
	[CLKID_ABUF]		    = &meson8b_abuf.hw,
	[CLKID_HIU_IFACE]	    = &meson8b_hiu_iface.hw,
	[CLKID_ASSIST_MISC]	    = &meson8b_assist_misc.hw,
	[CLKID_SPI]		    = &meson8b_spi.hw,
	[CLKID_I2S_SPDIF]	    = &meson8b_i2s_spdif.hw,
	[CLKID_ETH]		    = &meson8b_eth.hw,
	[CLKID_DEMUX]		    = &meson8b_demux.hw,
	[CLKID_AIU_GLUE]	    = &meson8b_aiu_glue.hw,
	[CLKID_IEC958]		    = &meson8b_iec958.hw,
	[CLKID_I2S_OUT]		    = &meson8b_i2s_out.hw,
	[CLKID_AMCLK]		    = &meson8b_amclk.hw,
	[CLKID_AIFIFO2]		    = &meson8b_aififo2.hw,
	[CLKID_MIXER]		    = &meson8b_mixer.hw,
	[CLKID_MIXER_IFACE]	    = &meson8b_mixer_iface.hw,
	[CLKID_ADC]		    = &meson8b_adc.hw,
	[CLKID_BLKMV]		    = &meson8b_blkmv.hw,
	[CLKID_AIU]		    = &meson8b_aiu.hw,
	[CLKID_UART1]		    = &meson8b_uart1.hw,
	[CLKID_G2D]		    = &meson8b_g2d.hw,
	[CLKID_USB0]		    = &meson8b_usb0.hw,
	[CLKID_USB1]		    = &meson8b_usb1.hw,
	[CLKID_RESET]		    = &meson8b_reset.hw,
	[CLKID_NAND]		    = &meson8b_nand.hw,
	[CLKID_DOS_PARSER]	    = &meson8b_dos_parser.hw,
	[CLKID_USB]		    = &meson8b_usb.hw,
	[CLKID_VDIN1]		    = &meson8b_vdin1.hw,
	[CLKID_AHB_ARB0]	    = &meson8b_ahb_arb0.hw,
	[CLKID_EFUSE]		    = &meson8b_efuse.hw,
	[CLKID_BOOT_ROM]	    = &meson8b_boot_rom.hw,
	[CLKID_AHB_DATA_BUS]	    = &meson8b_ahb_data_bus.hw,
	[CLKID_AHB_CTRL_BUS]	    = &meson8b_ahb_ctrl_bus.hw,
	[CLKID_HDMI_INTR_SYNC]	    = &meson8b_hdmi_intr_sync.hw,
	[CLKID_HDMI_PCLK]	    = &meson8b_hdmi_pclk.hw,
	[CLKID_USB1_DDR_BRIDGE]	    = &meson8b_usb1_ddr_bridge.hw,
	[CLKID_USB0_DDR_BRIDGE]	    = &meson8b_usb0_ddr_bridge.hw,
	[CLKID_MMC_PCLK]	    = &meson8b_mmc_pclk.hw,
	[CLKID_DVIN]		    = &meson8b_dvin.hw,
	[CLKID_UART2]		    = &meson8b_uart2.hw,
	[CLKID_SANA]		    = &meson8b_sana.hw,
	[CLKID_VPU_INTR]	    = &meson8b_vpu_intr.hw,
	[CLKID_SEC_AHB_AHB3_BRIDGE] = &meson8b_sec_ahb_ahb3_bridge.hw,
	[CLKID_CLK81_A9]	    = &meson8b_clk81_a9.hw,
	[CLKID_VCLK2_VENCI0]	    = &meson8b_vclk2_venci0.hw,
	[CLKID_VCLK2_VENCI1]	    = &meson8b_vclk2_venci1.hw,
	[CLKID_VCLK2_VENCP0]	    = &meson8b_vclk2_vencp0.hw,
	[CLKID_VCLK2_VENCP1]	    = &meson8b_vclk2_vencp1.hw,
	[CLKID_GCLK_VENCI_INT]	    = &meson8b_gclk_venci_int.hw,
	[CLKID_GCLK_VENCP_INT]	    = &meson8b_gclk_vencp_int.hw,
	[CLKID_DAC_CLK]		    = &meson8b_dac_clk.hw,
	[CLKID_AOCLK_GATE]	    = &meson8b_aoclk_gate.hw,
	[CLKID_IEC958_GATE]	    = &meson8b_iec958_gate.hw,
	[CLKID_ENC480P]		    = &meson8b_enc480p.hw,
	[CLKID_RNG1]		    = &meson8b_rng1.hw,
	[CLKID_GCLK_VENCL_INT]	    = &meson8b_gclk_vencl_int.hw,
	[CLKID_VCLK2_VENCLMCC]	    = &meson8b_vclk2_venclmcc.hw,
	[CLKID_VCLK2_VENCL]	    = &meson8b_vclk2_vencl.hw,
	[CLKID_VCLK2_OTHER]	    = &meson8b_vclk2_other.hw,
	[CLKID_EDP]		    = &meson8b_edp.hw,
	[CLKID_AO_MEDIA_CPU]	    = &meson8b_ao_media_cpu.hw,
	[CLKID_AO_AHB_SRAM]	    = &meson8b_ao_ahb_sram.hw,
	[CLKID_AO_AHB_BUS]	    = &meson8b_ao_ahb_bus.hw,
	[CLKID_AO_IFACE]	    = &meson8b_ao_iface.hw,
	[CLKID_MPLL0]		    = &meson8b_mpll0.hw,
	[CLKID_MPLL1]		    = &meson8b_mpll1.hw,
	[CLKID_MPLL2]		    = &meson8b_mpll2.hw,
	[CLKID_MPLL0_DIV]	    = &meson8b_mpll0_div.hw,
	[CLKID_MPLL1_DIV]	    = &meson8b_mpll1_div.hw,
	[CLKID_MPLL2_DIV]	    = &meson8b_mpll2_div.hw,
	[CLKID_CPU_IN_SEL]	    = &meson8b_cpu_in_sel.hw,
	[CLKID_CPU_IN_DIV2]	    = &meson8b_cpu_in_div2.hw,
	[CLKID_CPU_IN_DIV3]	    = &meson8b_cpu_in_div3.hw,
	[CLKID_CPU_SCALE_DIV]	    = &meson8b_cpu_scale_div.hw,
	[CLKID_CPU_SCALE_OUT_SEL]   = &meson8b_cpu_scale_out_sel.hw,
	[CLKID_MPLL_PREDIV]	    = &meson8b_mpll_prediv.hw,
	[CLKID_FCLK_DIV2_DIV]	    = &meson8b_fclk_div2_div.hw,
	[CLKID_FCLK_DIV3_DIV]	    = &meson8b_fclk_div3_div.hw,
	[CLKID_FCLK_DIV4_DIV]	    = &meson8b_fclk_div4_div.hw,
	[CLKID_FCLK_DIV5_DIV]	    = &meson8b_fclk_div5_div.hw,
	[CLKID_FCLK_DIV7_DIV]	    = &meson8b_fclk_div7_div.hw,
	[CLKID_NAND_SEL]	    = &meson8b_nand_clk_sel.hw,
	[CLKID_NAND_DIV]	    = &meson8b_nand_clk_div.hw,
	[CLKID_NAND_CLK]	    = &meson8b_nand_clk_gate.hw,
	[CLKID_PLL_FIXED_DCO]	    = &meson8b_fixed_pll_dco.hw,
	[CLKID_HDMI_PLL_DCO]	    = &meson8b_hdmi_pll_dco.hw,
	[CLKID_PLL_SYS_DCO]	    = &meson8b_sys_pll_dco.hw,
	[CLKID_CPU_CLK_DIV2]	    = &meson8b_cpu_clk_div2.hw,
	[CLKID_CPU_CLK_DIV3]	    = &meson8b_cpu_clk_div3.hw,
	[CLKID_CPU_CLK_DIV4]	    = &meson8b_cpu_clk_div4.hw,
	[CLKID_CPU_CLK_DIV5]	    = &meson8b_cpu_clk_div5.hw,
	[CLKID_CPU_CLK_DIV6]	    = &meson8b_cpu_clk_div6.hw,
	[CLKID_CPU_CLK_DIV7]	    = &meson8b_cpu_clk_div7.hw,
	[CLKID_CPU_CLK_DIV8]	    = &meson8b_cpu_clk_div8.hw,
	[CLKID_APB_SEL]		    = &meson8b_apb_clk_sel.hw,
	[CLKID_APB]		    = &meson8b_apb_clk_gate.hw,
	[CLKID_PERIPH_SEL]	    = &meson8b_periph_clk_sel.hw,
	[CLKID_PERIPH]		    = &meson8b_periph_clk_gate.hw,
	[CLKID_AXI_SEL]		    = &meson8b_axi_clk_sel.hw,
	[CLKID_AXI]		    = &meson8b_axi_clk_gate.hw,
	[CLKID_L2_DRAM_SEL]	    = &meson8b_l2_dram_clk_sel.hw,
	[CLKID_L2_DRAM]		    = &meson8b_l2_dram_clk_gate.hw,
	[CLKID_HDMI_PLL_LVDS_OUT]   = &meson8b_hdmi_pll_lvds_out.hw,
	[CLKID_HDMI_PLL_HDMI_OUT]   = &meson8b_hdmi_pll_hdmi_out.hw,
	[CLKID_VID_PLL_IN_SEL]	    = &meson8b_vid_pll_in_sel.hw,
	[CLKID_VID_PLL_IN_EN]	    = &meson8b_vid_pll_in_en.hw,
	[CLKID_VID_PLL_PRE_DIV]	    = &meson8b_vid_pll_pre_div.hw,
	[CLKID_VID_PLL_POST_DIV]    = &meson8b_vid_pll_post_div.hw,
	[CLKID_VID_PLL_FINAL_DIV]   = &meson8b_vid_pll_final_div.hw,
	[CLKID_VCLK_IN_SEL]	    = &meson8b_vclk_in_sel.hw,
	[CLKID_VCLK_IN_EN]	    = &meson8b_vclk_in_en.hw,
	[CLKID_VCLK_EN]		    = &meson8b_vclk_en.hw,
	[CLKID_VCLK_DIV1]	    = &meson8b_vclk_div1_gate.hw,
	[CLKID_VCLK_DIV2_DIV]	    = &meson8b_vclk_div2_div.hw,
	[CLKID_VCLK_DIV2]	    = &meson8b_vclk_div2_div_gate.hw,
	[CLKID_VCLK_DIV4_DIV]	    = &meson8b_vclk_div4_div.hw,
	[CLKID_VCLK_DIV4]	    = &meson8b_vclk_div4_div_gate.hw,
	[CLKID_VCLK_DIV6_DIV]	    = &meson8b_vclk_div6_div.hw,
	[CLKID_VCLK_DIV6]	    = &meson8b_vclk_div6_div_gate.hw,
	[CLKID_VCLK_DIV12_DIV]	    = &meson8b_vclk_div12_div.hw,
	[CLKID_VCLK_DIV12]	    = &meson8b_vclk_div12_div_gate.hw,
	[CLKID_VCLK2_IN_SEL]	    = &meson8b_vclk2_in_sel.hw,
	[CLKID_VCLK2_IN_EN]	    = &meson8b_vclk2_clk_in_en.hw,
	[CLKID_VCLK2_EN]	    = &meson8b_vclk2_clk_en.hw,
	[CLKID_VCLK2_DIV1]	    = &meson8b_vclk2_div1_gate.hw,
	[CLKID_VCLK2_DIV2_DIV]	    = &meson8b_vclk2_div2_div.hw,
	[CLKID_VCLK2_DIV2]	    = &meson8b_vclk2_div2_div_gate.hw,
	[CLKID_VCLK2_DIV4_DIV]	    = &meson8b_vclk2_div4_div.hw,
	[CLKID_VCLK2_DIV4]	    = &meson8b_vclk2_div4_div_gate.hw,
	[CLKID_VCLK2_DIV6_DIV]	    = &meson8b_vclk2_div6_div.hw,
	[CLKID_VCLK2_DIV6]	    = &meson8b_vclk2_div6_div_gate.hw,
	[CLKID_VCLK2_DIV12_DIV]	    = &meson8b_vclk2_div12_div.hw,
	[CLKID_VCLK2_DIV12]	    = &meson8b_vclk2_div12_div_gate.hw,
	[CLKID_CTS_ENCT_SEL]	    = &meson8b_cts_enct_sel.hw,
	[CLKID_CTS_ENCT]	    = &meson8b_cts_enct.hw,
	[CLKID_CTS_ENCP_SEL]	    = &meson8b_cts_encp_sel.hw,
	[CLKID_CTS_ENCP]	    = &meson8b_cts_encp.hw,
	[CLKID_CTS_ENCI_SEL]	    = &meson8b_cts_enci_sel.hw,
	[CLKID_CTS_ENCI]	    = &meson8b_cts_enci.hw,
	[CLKID_HDMI_TX_PIXEL_SEL]   = &meson8b_hdmi_tx_pixel_sel.hw,
	[CLKID_HDMI_TX_PIXEL]	    = &meson8b_hdmi_tx_pixel.hw,
	[CLKID_CTS_ENCL_SEL]	    = &meson8b_cts_encl_sel.hw,
	[CLKID_CTS_ENCL]	    = &meson8b_cts_encl.hw,
	[CLKID_CTS_VDAC0_SEL]	    = &meson8b_cts_vdac0_sel.hw,
	[CLKID_CTS_VDAC0]	    = &meson8b_cts_vdac0.hw,
	[CLKID_HDMI_SYS_SEL]	    = &meson8b_hdmi_sys_sel.hw,
	[CLKID_HDMI_SYS_DIV]	    = &meson8b_hdmi_sys_div.hw,
	[CLKID_HDMI_SYS]	    = &meson8b_hdmi_sys.hw,
	[CLKID_MALI_0_SEL]	    = &meson8b_mali_0_sel.hw,
	[CLKID_MALI_0_DIV]	    = &meson8b_mali_0_div.hw,
	[CLKID_MALI_0]		    = &meson8b_mali_0.hw,
	[CLKID_MALI_1_SEL]	    = &meson8b_mali_1_sel.hw,
	[CLKID_MALI_1_DIV]	    = &meson8b_mali_1_div.hw,
	[CLKID_MALI_1]		    = &meson8b_mali_1.hw,
	[CLKID_MALI]		    = &meson8b_mali.hw,
	[CLKID_VPU_0_SEL]	    = &meson8b_vpu_0_sel.hw,
	[CLKID_VPU_0_DIV]	    = &meson8b_vpu_0_div.hw,
	[CLKID_VPU_0]		    = &meson8b_vpu_0.hw,
	[CLKID_VPU_1_SEL]	    = &meson8b_vpu_1_sel.hw,
	[CLKID_VPU_1_DIV]	    = &meson8b_vpu_1_div.hw,
	[CLKID_VPU_1]		    = &meson8b_vpu_1.hw,
	[CLKID_VPU]		    = &meson8b_vpu.hw,
	[CLKID_VDEC_1_SEL]	    = &meson8b_vdec_1_sel.hw,
	[CLKID_VDEC_1_1_DIV]	    = &meson8b_vdec_1_1_div.hw,
	[CLKID_VDEC_1_1]	    = &meson8b_vdec_1_1.hw,
	[CLKID_VDEC_1_2_DIV]	    = &meson8b_vdec_1_2_div.hw,
	[CLKID_VDEC_1_2]	    = &meson8b_vdec_1_2.hw,
	[CLKID_VDEC_1]		    = &meson8b_vdec_1.hw,
	[CLKID_VDEC_HCODEC_SEL]	    = &meson8b_vdec_hcodec_sel.hw,
	[CLKID_VDEC_HCODEC_DIV]	    = &meson8b_vdec_hcodec_div.hw,
	[CLKID_VDEC_HCODEC]	    = &meson8b_vdec_hcodec.hw,
	[CLKID_VDEC_2_SEL]	    = &meson8b_vdec_2_sel.hw,
	[CLKID_VDEC_2_DIV]	    = &meson8b_vdec_2_div.hw,
	[CLKID_VDEC_2]		    = &meson8b_vdec_2.hw,
	[CLKID_VDEC_HEVC_SEL]	    = &meson8b_vdec_hevc_sel.hw,
	[CLKID_VDEC_HEVC_DIV]	    = &meson8b_vdec_hevc_div.hw,
	[CLKID_VDEC_HEVC_EN]	    = &meson8b_vdec_hevc_en.hw,
	[CLKID_VDEC_HEVC]	    = &meson8b_vdec_hevc.hw,
	[CLKID_CTS_AMCLK_SEL]	    = &meson8b_cts_amclk_sel.hw,
	[CLKID_CTS_AMCLK_DIV]	    = &meson8b_cts_amclk_div.hw,
	[CLKID_CTS_AMCLK]	    = &meson8b_cts_amclk.hw,
	[CLKID_CTS_MCLK_I958_SEL]   = &meson8b_cts_mclk_i958_sel.hw,
	[CLKID_CTS_MCLK_I958_DIV]   = &meson8b_cts_mclk_i958_div.hw,
	[CLKID_CTS_MCLK_I958]	    = &meson8b_cts_mclk_i958.hw,
	[CLKID_CTS_I958]	    = &meson8b_cts_i958.hw,
	[CLKID_VID_PLL_LVDS_EN]	    = &meson8b_vid_pll_lvds_en.hw,
	[CLKID_HDMI_PLL_DCO_IN]	    = &hdmi_pll_dco_in.hw,
};

static struct clk_hw *meson8m2_hw_clks[] = {
	[CLKID_PLL_FIXED] = &meson8b_fixed_pll.hw,
	[CLKID_PLL_VID] = &meson8b_vid_pll.hw,
	[CLKID_PLL_SYS] = &meson8b_sys_pll.hw,
	[CLKID_FCLK_DIV2] = &meson8b_fclk_div2.hw,
	[CLKID_FCLK_DIV3] = &meson8b_fclk_div3.hw,
	[CLKID_FCLK_DIV4] = &meson8b_fclk_div4.hw,
	[CLKID_FCLK_DIV5] = &meson8b_fclk_div5.hw,
	[CLKID_FCLK_DIV7] = &meson8b_fclk_div7.hw,
	[CLKID_CPUCLK] = &meson8b_cpu_clk.hw,
	[CLKID_MPEG_SEL] = &meson8b_mpeg_clk_sel.hw,
	[CLKID_MPEG_DIV] = &meson8b_mpeg_clk_div.hw,
	[CLKID_CLK81] = &meson8b_clk81.hw,
	[CLKID_DDR]		    = &meson8b_ddr.hw,
	[CLKID_DOS]		    = &meson8b_dos.hw,
	[CLKID_ISA]		    = &meson8b_isa.hw,
	[CLKID_PL301]		    = &meson8b_pl301.hw,
	[CLKID_PERIPHS]		    = &meson8b_periphs.hw,
	[CLKID_SPICC]		    = &meson8b_spicc.hw,
	[CLKID_I2C]		    = &meson8b_i2c.hw,
	[CLKID_SAR_ADC]		    = &meson8b_sar_adc.hw,
	[CLKID_SMART_CARD]	    = &meson8b_smart_card.hw,
	[CLKID_RNG0]		    = &meson8b_rng0.hw,
	[CLKID_UART0]		    = &meson8b_uart0.hw,
	[CLKID_SDHC]		    = &meson8b_sdhc.hw,
	[CLKID_STREAM]		    = &meson8b_stream.hw,
	[CLKID_ASYNC_FIFO]	    = &meson8b_async_fifo.hw,
	[CLKID_SDIO]		    = &meson8b_sdio.hw,
	[CLKID_ABUF]		    = &meson8b_abuf.hw,
	[CLKID_HIU_IFACE]	    = &meson8b_hiu_iface.hw,
	[CLKID_ASSIST_MISC]	    = &meson8b_assist_misc.hw,
	[CLKID_SPI]		    = &meson8b_spi.hw,
	[CLKID_I2S_SPDIF]	    = &meson8b_i2s_spdif.hw,
	[CLKID_ETH]		    = &meson8b_eth.hw,
	[CLKID_DEMUX]		    = &meson8b_demux.hw,
	[CLKID_AIU_GLUE]	    = &meson8b_aiu_glue.hw,
	[CLKID_IEC958]		    = &meson8b_iec958.hw,
	[CLKID_I2S_OUT]		    = &meson8b_i2s_out.hw,
	[CLKID_AMCLK]		    = &meson8b_amclk.hw,
	[CLKID_AIFIFO2]		    = &meson8b_aififo2.hw,
	[CLKID_MIXER]		    = &meson8b_mixer.hw,
	[CLKID_MIXER_IFACE]	    = &meson8b_mixer_iface.hw,
	[CLKID_ADC]		    = &meson8b_adc.hw,
	[CLKID_BLKMV]		    = &meson8b_blkmv.hw,
	[CLKID_AIU]		    = &meson8b_aiu.hw,
	[CLKID_UART1]		    = &meson8b_uart1.hw,
	[CLKID_G2D]		    = &meson8b_g2d.hw,
	[CLKID_USB0]		    = &meson8b_usb0.hw,
	[CLKID_USB1]		    = &meson8b_usb1.hw,
	[CLKID_RESET]		    = &meson8b_reset.hw,
	[CLKID_NAND]		    = &meson8b_nand.hw,
	[CLKID_DOS_PARSER]	    = &meson8b_dos_parser.hw,
	[CLKID_USB]		    = &meson8b_usb.hw,
	[CLKID_VDIN1]		    = &meson8b_vdin1.hw,
	[CLKID_AHB_ARB0]	    = &meson8b_ahb_arb0.hw,
	[CLKID_EFUSE]		    = &meson8b_efuse.hw,
	[CLKID_BOOT_ROM]	    = &meson8b_boot_rom.hw,
	[CLKID_AHB_DATA_BUS]	    = &meson8b_ahb_data_bus.hw,
	[CLKID_AHB_CTRL_BUS]	    = &meson8b_ahb_ctrl_bus.hw,
	[CLKID_HDMI_INTR_SYNC]	    = &meson8b_hdmi_intr_sync.hw,
	[CLKID_HDMI_PCLK]	    = &meson8b_hdmi_pclk.hw,
	[CLKID_USB1_DDR_BRIDGE]	    = &meson8b_usb1_ddr_bridge.hw,
	[CLKID_USB0_DDR_BRIDGE]	    = &meson8b_usb0_ddr_bridge.hw,
	[CLKID_MMC_PCLK]	    = &meson8b_mmc_pclk.hw,
	[CLKID_DVIN]		    = &meson8b_dvin.hw,
	[CLKID_UART2]		    = &meson8b_uart2.hw,
	[CLKID_SANA]		    = &meson8b_sana.hw,
	[CLKID_VPU_INTR]	    = &meson8b_vpu_intr.hw,
	[CLKID_SEC_AHB_AHB3_BRIDGE] = &meson8b_sec_ahb_ahb3_bridge.hw,
	[CLKID_CLK81_A9]	    = &meson8b_clk81_a9.hw,
	[CLKID_VCLK2_VENCI0]	    = &meson8b_vclk2_venci0.hw,
	[CLKID_VCLK2_VENCI1]	    = &meson8b_vclk2_venci1.hw,
	[CLKID_VCLK2_VENCP0]	    = &meson8b_vclk2_vencp0.hw,
	[CLKID_VCLK2_VENCP1]	    = &meson8b_vclk2_vencp1.hw,
	[CLKID_GCLK_VENCI_INT]	    = &meson8b_gclk_venci_int.hw,
	[CLKID_GCLK_VENCP_INT]	    = &meson8b_gclk_vencp_int.hw,
	[CLKID_DAC_CLK]		    = &meson8b_dac_clk.hw,
	[CLKID_AOCLK_GATE]	    = &meson8b_aoclk_gate.hw,
	[CLKID_IEC958_GATE]	    = &meson8b_iec958_gate.hw,
	[CLKID_ENC480P]		    = &meson8b_enc480p.hw,
	[CLKID_RNG1]		    = &meson8b_rng1.hw,
	[CLKID_GCLK_VENCL_INT]	    = &meson8b_gclk_vencl_int.hw,
	[CLKID_VCLK2_VENCLMCC]	    = &meson8b_vclk2_venclmcc.hw,
	[CLKID_VCLK2_VENCL]	    = &meson8b_vclk2_vencl.hw,
	[CLKID_VCLK2_OTHER]	    = &meson8b_vclk2_other.hw,
	[CLKID_EDP]		    = &meson8b_edp.hw,
	[CLKID_AO_MEDIA_CPU]	    = &meson8b_ao_media_cpu.hw,
	[CLKID_AO_AHB_SRAM]	    = &meson8b_ao_ahb_sram.hw,
	[CLKID_AO_AHB_BUS]	    = &meson8b_ao_ahb_bus.hw,
	[CLKID_AO_IFACE]	    = &meson8b_ao_iface.hw,
	[CLKID_MPLL0]		    = &meson8b_mpll0.hw,
	[CLKID_MPLL1]		    = &meson8b_mpll1.hw,
	[CLKID_MPLL2]		    = &meson8b_mpll2.hw,
	[CLKID_MPLL0_DIV]	    = &meson8b_mpll0_div.hw,
	[CLKID_MPLL1_DIV]	    = &meson8b_mpll1_div.hw,
	[CLKID_MPLL2_DIV]	    = &meson8b_mpll2_div.hw,
	[CLKID_CPU_IN_SEL]	    = &meson8b_cpu_in_sel.hw,
	[CLKID_CPU_IN_DIV2]	    = &meson8b_cpu_in_div2.hw,
	[CLKID_CPU_IN_DIV3]	    = &meson8b_cpu_in_div3.hw,
	[CLKID_CPU_SCALE_DIV]	    = &meson8b_cpu_scale_div.hw,
	[CLKID_CPU_SCALE_OUT_SEL]   = &meson8b_cpu_scale_out_sel.hw,
	[CLKID_MPLL_PREDIV]	    = &meson8b_mpll_prediv.hw,
	[CLKID_FCLK_DIV2_DIV]	    = &meson8b_fclk_div2_div.hw,
	[CLKID_FCLK_DIV3_DIV]	    = &meson8b_fclk_div3_div.hw,
	[CLKID_FCLK_DIV4_DIV]	    = &meson8b_fclk_div4_div.hw,
	[CLKID_FCLK_DIV5_DIV]	    = &meson8b_fclk_div5_div.hw,
	[CLKID_FCLK_DIV7_DIV]	    = &meson8b_fclk_div7_div.hw,
	[CLKID_NAND_SEL]	    = &meson8b_nand_clk_sel.hw,
	[CLKID_NAND_DIV]	    = &meson8b_nand_clk_div.hw,
	[CLKID_NAND_CLK]	    = &meson8b_nand_clk_gate.hw,
	[CLKID_PLL_FIXED_DCO]	    = &meson8b_fixed_pll_dco.hw,
	[CLKID_HDMI_PLL_DCO]	    = &meson8b_hdmi_pll_dco.hw,
	[CLKID_PLL_SYS_DCO]	    = &meson8b_sys_pll_dco.hw,
	[CLKID_CPU_CLK_DIV2]	    = &meson8b_cpu_clk_div2.hw,
	[CLKID_CPU_CLK_DIV3]	    = &meson8b_cpu_clk_div3.hw,
	[CLKID_CPU_CLK_DIV4]	    = &meson8b_cpu_clk_div4.hw,
	[CLKID_CPU_CLK_DIV5]	    = &meson8b_cpu_clk_div5.hw,
	[CLKID_CPU_CLK_DIV6]	    = &meson8b_cpu_clk_div6.hw,
	[CLKID_CPU_CLK_DIV7]	    = &meson8b_cpu_clk_div7.hw,
	[CLKID_CPU_CLK_DIV8]	    = &meson8b_cpu_clk_div8.hw,
	[CLKID_APB_SEL]		    = &meson8b_apb_clk_sel.hw,
	[CLKID_APB]		    = &meson8b_apb_clk_gate.hw,
	[CLKID_PERIPH_SEL]	    = &meson8b_periph_clk_sel.hw,
	[CLKID_PERIPH]		    = &meson8b_periph_clk_gate.hw,
	[CLKID_AXI_SEL]		    = &meson8b_axi_clk_sel.hw,
	[CLKID_AXI]		    = &meson8b_axi_clk_gate.hw,
	[CLKID_L2_DRAM_SEL]	    = &meson8b_l2_dram_clk_sel.hw,
	[CLKID_L2_DRAM]		    = &meson8b_l2_dram_clk_gate.hw,
	[CLKID_HDMI_PLL_LVDS_OUT]   = &meson8b_hdmi_pll_lvds_out.hw,
	[CLKID_HDMI_PLL_HDMI_OUT]   = &meson8b_hdmi_pll_hdmi_out.hw,
	[CLKID_VID_PLL_IN_SEL]	    = &meson8b_vid_pll_in_sel.hw,
	[CLKID_VID_PLL_IN_EN]	    = &meson8b_vid_pll_in_en.hw,
	[CLKID_VID_PLL_PRE_DIV]	    = &meson8b_vid_pll_pre_div.hw,
	[CLKID_VID_PLL_POST_DIV]    = &meson8b_vid_pll_post_div.hw,
	[CLKID_VID_PLL_FINAL_DIV]   = &meson8b_vid_pll_final_div.hw,
	[CLKID_VCLK_IN_SEL]	    = &meson8b_vclk_in_sel.hw,
	[CLKID_VCLK_IN_EN]	    = &meson8b_vclk_in_en.hw,
	[CLKID_VCLK_EN]		    = &meson8b_vclk_en.hw,
	[CLKID_VCLK_DIV1]	    = &meson8b_vclk_div1_gate.hw,
	[CLKID_VCLK_DIV2_DIV]	    = &meson8b_vclk_div2_div.hw,
	[CLKID_VCLK_DIV2]	    = &meson8b_vclk_div2_div_gate.hw,
	[CLKID_VCLK_DIV4_DIV]	    = &meson8b_vclk_div4_div.hw,
	[CLKID_VCLK_DIV4]	    = &meson8b_vclk_div4_div_gate.hw,
	[CLKID_VCLK_DIV6_DIV]	    = &meson8b_vclk_div6_div.hw,
	[CLKID_VCLK_DIV6]	    = &meson8b_vclk_div6_div_gate.hw,
	[CLKID_VCLK_DIV12_DIV]	    = &meson8b_vclk_div12_div.hw,
	[CLKID_VCLK_DIV12]	    = &meson8b_vclk_div12_div_gate.hw,
	[CLKID_VCLK2_IN_SEL]	    = &meson8b_vclk2_in_sel.hw,
	[CLKID_VCLK2_IN_EN]	    = &meson8b_vclk2_clk_in_en.hw,
	[CLKID_VCLK2_EN]	    = &meson8b_vclk2_clk_en.hw,
	[CLKID_VCLK2_DIV1]	    = &meson8b_vclk2_div1_gate.hw,
	[CLKID_VCLK2_DIV2_DIV]	    = &meson8b_vclk2_div2_div.hw,
	[CLKID_VCLK2_DIV2]	    = &meson8b_vclk2_div2_div_gate.hw,
	[CLKID_VCLK2_DIV4_DIV]	    = &meson8b_vclk2_div4_div.hw,
	[CLKID_VCLK2_DIV4]	    = &meson8b_vclk2_div4_div_gate.hw,
	[CLKID_VCLK2_DIV6_DIV]	    = &meson8b_vclk2_div6_div.hw,
	[CLKID_VCLK2_DIV6]	    = &meson8b_vclk2_div6_div_gate.hw,
	[CLKID_VCLK2_DIV12_DIV]	    = &meson8b_vclk2_div12_div.hw,
	[CLKID_VCLK2_DIV12]	    = &meson8b_vclk2_div12_div_gate.hw,
	[CLKID_CTS_ENCT_SEL]	    = &meson8b_cts_enct_sel.hw,
	[CLKID_CTS_ENCT]	    = &meson8b_cts_enct.hw,
	[CLKID_CTS_ENCP_SEL]	    = &meson8b_cts_encp_sel.hw,
	[CLKID_CTS_ENCP]	    = &meson8b_cts_encp.hw,
	[CLKID_CTS_ENCI_SEL]	    = &meson8b_cts_enci_sel.hw,
	[CLKID_CTS_ENCI]	    = &meson8b_cts_enci.hw,
	[CLKID_HDMI_TX_PIXEL_SEL]   = &meson8b_hdmi_tx_pixel_sel.hw,
	[CLKID_HDMI_TX_PIXEL]	    = &meson8b_hdmi_tx_pixel.hw,
	[CLKID_CTS_ENCL_SEL]	    = &meson8b_cts_encl_sel.hw,
	[CLKID_CTS_ENCL]	    = &meson8b_cts_encl.hw,
	[CLKID_CTS_VDAC0_SEL]	    = &meson8b_cts_vdac0_sel.hw,
	[CLKID_CTS_VDAC0]	    = &meson8b_cts_vdac0.hw,
	[CLKID_HDMI_SYS_SEL]	    = &meson8b_hdmi_sys_sel.hw,
	[CLKID_HDMI_SYS_DIV]	    = &meson8b_hdmi_sys_div.hw,
	[CLKID_HDMI_SYS]	    = &meson8b_hdmi_sys.hw,
	[CLKID_MALI_0_SEL]	    = &meson8b_mali_0_sel.hw,
	[CLKID_MALI_0_DIV]	    = &meson8b_mali_0_div.hw,
	[CLKID_MALI_0]		    = &meson8b_mali_0.hw,
	[CLKID_MALI_1_SEL]	    = &meson8b_mali_1_sel.hw,
	[CLKID_MALI_1_DIV]	    = &meson8b_mali_1_div.hw,
	[CLKID_MALI_1]		    = &meson8b_mali_1.hw,
	[CLKID_MALI]		    = &meson8b_mali.hw,
	[CLKID_GP_PLL_DCO]	    = &meson8m2_gp_pll_dco.hw,
	[CLKID_GP_PLL]		    = &meson8m2_gp_pll.hw,
	[CLKID_VPU_0_SEL]	    = &meson8m2_vpu_0_sel.hw,
	[CLKID_VPU_0_DIV]	    = &meson8b_vpu_0_div.hw,
	[CLKID_VPU_0]		    = &meson8b_vpu_0.hw,
	[CLKID_VPU_1_SEL]	    = &meson8m2_vpu_1_sel.hw,
	[CLKID_VPU_1_DIV]	    = &meson8b_vpu_1_div.hw,
	[CLKID_VPU_1]		    = &meson8b_vpu_1.hw,
	[CLKID_VPU]		    = &meson8b_vpu.hw,
	[CLKID_VDEC_1_SEL]	    = &meson8b_vdec_1_sel.hw,
	[CLKID_VDEC_1_1_DIV]	    = &meson8b_vdec_1_1_div.hw,
	[CLKID_VDEC_1_1]	    = &meson8b_vdec_1_1.hw,
	[CLKID_VDEC_1_2_DIV]	    = &meson8b_vdec_1_2_div.hw,
	[CLKID_VDEC_1_2]	    = &meson8b_vdec_1_2.hw,
	[CLKID_VDEC_1]		    = &meson8b_vdec_1.hw,
	[CLKID_VDEC_HCODEC_SEL]	    = &meson8b_vdec_hcodec_sel.hw,
	[CLKID_VDEC_HCODEC_DIV]	    = &meson8b_vdec_hcodec_div.hw,
	[CLKID_VDEC_HCODEC]	    = &meson8b_vdec_hcodec.hw,
	[CLKID_VDEC_2_SEL]	    = &meson8b_vdec_2_sel.hw,
	[CLKID_VDEC_2_DIV]	    = &meson8b_vdec_2_div.hw,
	[CLKID_VDEC_2]		    = &meson8b_vdec_2.hw,
	[CLKID_VDEC_HEVC_SEL]	    = &meson8b_vdec_hevc_sel.hw,
	[CLKID_VDEC_HEVC_DIV]	    = &meson8b_vdec_hevc_div.hw,
	[CLKID_VDEC_HEVC_EN]	    = &meson8b_vdec_hevc_en.hw,
	[CLKID_VDEC_HEVC]	    = &meson8b_vdec_hevc.hw,
	[CLKID_CTS_AMCLK_SEL]	    = &meson8b_cts_amclk_sel.hw,
	[CLKID_CTS_AMCLK_DIV]	    = &meson8b_cts_amclk_div.hw,
	[CLKID_CTS_AMCLK]	    = &meson8b_cts_amclk.hw,
	[CLKID_CTS_MCLK_I958_SEL]   = &meson8b_cts_mclk_i958_sel.hw,
	[CLKID_CTS_MCLK_I958_DIV]   = &meson8b_cts_mclk_i958_div.hw,
	[CLKID_CTS_MCLK_I958]	    = &meson8b_cts_mclk_i958.hw,
	[CLKID_CTS_I958]	    = &meson8b_cts_i958.hw,
	[CLKID_VID_PLL_LVDS_EN]	    = &meson8b_vid_pll_lvds_en.hw,
	[CLKID_HDMI_PLL_DCO_IN]	    = &hdmi_pll_dco_in.hw,
};

static struct clk_regmap *const meson8b_clk_regmaps[] = {
	&meson8b_clk81,
	&meson8b_ddr,
	&meson8b_dos,
	&meson8b_isa,
	&meson8b_pl301,
	&meson8b_periphs,
	&meson8b_spicc,
	&meson8b_i2c,
	&meson8b_sar_adc,
	&meson8b_smart_card,
	&meson8b_rng0,
	&meson8b_uart0,
	&meson8b_sdhc,
	&meson8b_stream,
	&meson8b_async_fifo,
	&meson8b_sdio,
	&meson8b_abuf,
	&meson8b_hiu_iface,
	&meson8b_assist_misc,
	&meson8b_spi,
	&meson8b_i2s_spdif,
	&meson8b_eth,
	&meson8b_demux,
	&meson8b_aiu_glue,
	&meson8b_iec958,
	&meson8b_i2s_out,
	&meson8b_amclk,
	&meson8b_aififo2,
	&meson8b_mixer,
	&meson8b_mixer_iface,
	&meson8b_adc,
	&meson8b_blkmv,
	&meson8b_aiu,
	&meson8b_uart1,
	&meson8b_g2d,
	&meson8b_usb0,
	&meson8b_usb1,
	&meson8b_reset,
	&meson8b_nand,
	&meson8b_dos_parser,
	&meson8b_usb,
	&meson8b_vdin1,
	&meson8b_ahb_arb0,
	&meson8b_efuse,
	&meson8b_boot_rom,
	&meson8b_ahb_data_bus,
	&meson8b_ahb_ctrl_bus,
	&meson8b_hdmi_intr_sync,
	&meson8b_hdmi_pclk,
	&meson8b_usb1_ddr_bridge,
	&meson8b_usb0_ddr_bridge,
	&meson8b_mmc_pclk,
	&meson8b_dvin,
	&meson8b_uart2,
	&meson8b_sana,
	&meson8b_vpu_intr,
	&meson8b_sec_ahb_ahb3_bridge,
	&meson8b_clk81_a9,
	&meson8b_vclk2_venci0,
	&meson8b_vclk2_venci1,
	&meson8b_vclk2_vencp0,
	&meson8b_vclk2_vencp1,
	&meson8b_gclk_venci_int,
	&meson8b_gclk_vencp_int,
	&meson8b_dac_clk,
	&meson8b_aoclk_gate,
	&meson8b_iec958_gate,
	&meson8b_enc480p,
	&meson8b_rng1,
	&meson8b_gclk_vencl_int,
	&meson8b_vclk2_venclmcc,
	&meson8b_vclk2_vencl,
	&meson8b_vclk2_other,
	&meson8b_edp,
	&meson8b_ao_media_cpu,
	&meson8b_ao_ahb_sram,
	&meson8b_ao_ahb_bus,
	&meson8b_ao_iface,
	&meson8b_mpeg_clk_div,
	&meson8b_mpeg_clk_sel,
	&meson8b_mpll0,
	&meson8b_mpll1,
	&meson8b_mpll2,
	&meson8b_mpll0_div,
	&meson8b_mpll1_div,
	&meson8b_mpll2_div,
	&meson8b_fixed_pll,
	&meson8b_sys_pll,
	&meson8b_cpu_in_sel,
	&meson8b_cpu_scale_div,
	&meson8b_cpu_scale_out_sel,
	&meson8b_cpu_clk,
	&meson8b_mpll_prediv,
	&meson8b_fclk_div2,
	&meson8b_fclk_div3,
	&meson8b_fclk_div4,
	&meson8b_fclk_div5,
	&meson8b_fclk_div7,
	&meson8b_nand_clk_sel,
	&meson8b_nand_clk_div,
	&meson8b_nand_clk_gate,
	&meson8b_fixed_pll_dco,
	&meson8b_hdmi_pll_dco,
	&meson8b_sys_pll_dco,
	&meson8b_apb_clk_sel,
	&meson8b_apb_clk_gate,
	&meson8b_periph_clk_sel,
	&meson8b_periph_clk_gate,
	&meson8b_axi_clk_sel,
	&meson8b_axi_clk_gate,
	&meson8b_l2_dram_clk_sel,
	&meson8b_l2_dram_clk_gate,
	&meson8b_hdmi_pll_lvds_out,
	&meson8b_hdmi_pll_hdmi_out,
	&meson8b_vid_pll_in_sel,
	&meson8b_vid_pll_in_en,
	&meson8b_vid_pll_pre_div,
	&meson8b_vid_pll_post_div,
	&meson8b_vid_pll,
	&meson8b_vid_pll_final_div,
	&meson8b_vclk_in_sel,
	&meson8b_vclk_in_en,
	&meson8b_vclk_en,
	&meson8b_vclk_div1_gate,
	&meson8b_vclk_div2_div_gate,
	&meson8b_vclk_div4_div_gate,
	&meson8b_vclk_div6_div_gate,
	&meson8b_vclk_div12_div_gate,
	&meson8b_vclk2_in_sel,
	&meson8b_vclk2_clk_in_en,
	&meson8b_vclk2_clk_en,
	&meson8b_vclk2_div1_gate,
	&meson8b_vclk2_div2_div_gate,
	&meson8b_vclk2_div4_div_gate,
	&meson8b_vclk2_div6_div_gate,
	&meson8b_vclk2_div12_div_gate,
	&meson8b_cts_enct_sel,
	&meson8b_cts_enct,
	&meson8b_cts_encp_sel,
	&meson8b_cts_encp,
	&meson8b_cts_enci_sel,
	&meson8b_cts_enci,
	&meson8b_hdmi_tx_pixel_sel,
	&meson8b_hdmi_tx_pixel,
	&meson8b_cts_encl_sel,
	&meson8b_cts_encl,
	&meson8b_cts_vdac0_sel,
	&meson8b_cts_vdac0,
	&meson8b_hdmi_sys_sel,
	&meson8b_hdmi_sys_div,
	&meson8b_hdmi_sys,
	&meson8b_mali_0_sel,
	&meson8b_mali_0_div,
	&meson8b_mali_0,
	&meson8b_mali_1_sel,
	&meson8b_mali_1_div,
	&meson8b_mali_1,
	&meson8b_mali,
	&meson8m2_gp_pll_dco,
	&meson8m2_gp_pll,
	&meson8b_vpu_0_sel,
	&meson8m2_vpu_0_sel,
	&meson8b_vpu_0_div,
	&meson8b_vpu_0,
	&meson8b_vpu_1_sel,
	&meson8m2_vpu_1_sel,
	&meson8b_vpu_1_div,
	&meson8b_vpu_1,
	&meson8b_vpu,
	&meson8b_vdec_1_sel,
	&meson8b_vdec_1_1_div,
	&meson8b_vdec_1_1,
	&meson8b_vdec_1_2_div,
	&meson8b_vdec_1_2,
	&meson8b_vdec_1,
	&meson8b_vdec_hcodec_sel,
	&meson8b_vdec_hcodec_div,
	&meson8b_vdec_hcodec,
	&meson8b_vdec_2_sel,
	&meson8b_vdec_2_div,
	&meson8b_vdec_2,
	&meson8b_vdec_hevc_sel,
	&meson8b_vdec_hevc_div,
	&meson8b_vdec_hevc_en,
	&meson8b_vdec_hevc,
	&meson8b_cts_amclk,
	&meson8b_cts_amclk_sel,
	&meson8b_cts_amclk_div,
	&meson8b_cts_mclk_i958_sel,
	&meson8b_cts_mclk_i958_div,
	&meson8b_cts_mclk_i958,
	&meson8b_cts_i958,
	&meson8b_vid_pll_lvds_en,
};

static const struct meson8b_clk_reset_line {
	u32 reg;
	u8 bit_idx;
	bool active_low;
} meson8b_clk_reset_bits[] = {
	[CLKC_RESET_L2_CACHE_SOFT_RESET] = {
		.reg = HHI_SYS_CPU_CLK_CNTL0,
		.bit_idx = 30,
		.active_low = false,
	},
	[CLKC_RESET_AXI_64_TO_128_BRIDGE_A5_SOFT_RESET] = {
		.reg = HHI_SYS_CPU_CLK_CNTL0,
		.bit_idx = 29,
		.active_low = false,
	},
	[CLKC_RESET_SCU_SOFT_RESET] = {
		.reg = HHI_SYS_CPU_CLK_CNTL0,
		.bit_idx = 28,
		.active_low = false,
	},
	[CLKC_RESET_CPU3_SOFT_RESET] = {
		.reg = HHI_SYS_CPU_CLK_CNTL0,
		.bit_idx = 27,
		.active_low = false,
	},
	[CLKC_RESET_CPU2_SOFT_RESET] = {
		.reg = HHI_SYS_CPU_CLK_CNTL0,
		.bit_idx = 26,
		.active_low = false,
	},
	[CLKC_RESET_CPU1_SOFT_RESET] = {
		.reg = HHI_SYS_CPU_CLK_CNTL0,
		.bit_idx = 25,
		.active_low = false,
	},
	[CLKC_RESET_CPU0_SOFT_RESET] = {
		.reg = HHI_SYS_CPU_CLK_CNTL0,
		.bit_idx = 24,
		.active_low = false,
	},
	[CLKC_RESET_A5_GLOBAL_RESET] = {
		.reg = HHI_SYS_CPU_CLK_CNTL0,
		.bit_idx = 18,
		.active_low = false,
	},
	[CLKC_RESET_A5_AXI_SOFT_RESET] = {
		.reg = HHI_SYS_CPU_CLK_CNTL0,
		.bit_idx = 17,
		.active_low = false,
	},
	[CLKC_RESET_A5_ABP_SOFT_RESET] = {
		.reg = HHI_SYS_CPU_CLK_CNTL0,
		.bit_idx = 16,
		.active_low = false,
	},
	[CLKC_RESET_AXI_64_TO_128_BRIDGE_MMC_SOFT_RESET] = {
		.reg = HHI_SYS_CPU_CLK_CNTL1,
		.bit_idx = 30,
		.active_low = false,
	},
	[CLKC_RESET_VID_CLK_CNTL_SOFT_RESET] = {
		.reg = HHI_VID_CLK_CNTL,
		.bit_idx = 15,
		.active_low = false,
	},
	[CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_POST] = {
		.reg = HHI_VID_DIVIDER_CNTL,
		.bit_idx = 7,
		.active_low = false,
	},
	[CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_PRE] = {
		.reg = HHI_VID_DIVIDER_CNTL,
		.bit_idx = 3,
		.active_low = false,
	},
	[CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_POST] = {
		.reg = HHI_VID_DIVIDER_CNTL,
		.bit_idx = 1,
		.active_low = true,
	},
	[CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_PRE] = {
		.reg = HHI_VID_DIVIDER_CNTL,
		.bit_idx = 0,
		.active_low = true,
	},
};

static int meson8b_clk_reset_update(struct reset_controller_dev *rcdev,
				    unsigned long id, bool assert)
{
	struct meson8b_clk_reset *meson8b_clk_reset =
		container_of(rcdev, struct meson8b_clk_reset, reset);
	const struct meson8b_clk_reset_line *reset;
	unsigned int value = 0;

	if (id >= ARRAY_SIZE(meson8b_clk_reset_bits))
		return -EINVAL;

	reset = &meson8b_clk_reset_bits[id];

	if (assert != reset->active_low)
		value = BIT(reset->bit_idx);

	regmap_update_bits(meson8b_clk_reset->regmap, reset->reg,
			   BIT(reset->bit_idx), value);

	return 0;
}

static int meson8b_clk_reset_assert(struct reset_controller_dev *rcdev,
				     unsigned long id)
{
	return meson8b_clk_reset_update(rcdev, id, true);
}

static int meson8b_clk_reset_deassert(struct reset_controller_dev *rcdev,
				       unsigned long id)
{
	return meson8b_clk_reset_update(rcdev, id, false);
}

static const struct reset_control_ops meson8b_clk_reset_ops = {
	.assert = meson8b_clk_reset_assert,
	.deassert = meson8b_clk_reset_deassert,
};

struct meson8b_nb_data {
	struct notifier_block nb;
	struct clk_hw *cpu_clk;
};

static int meson8b_cpu_clk_notifier_cb(struct notifier_block *nb,
				       unsigned long event, void *data)
{
	struct meson8b_nb_data *nb_data =
		container_of(nb, struct meson8b_nb_data, nb);
	struct clk_hw *parent_clk;
	int ret;

	switch (event) {
	case PRE_RATE_CHANGE:
		/* xtal */
		parent_clk = clk_hw_get_parent_by_index(nb_data->cpu_clk, 0);
		break;

	case POST_RATE_CHANGE:
		/* cpu_scale_out_sel */
		parent_clk = clk_hw_get_parent_by_index(nb_data->cpu_clk, 1);
		break;

	default:
		return NOTIFY_DONE;
	}

	ret = clk_hw_set_parent(nb_data->cpu_clk, parent_clk);
	if (ret)
		return notifier_from_errno(ret);

	udelay(100);

	return NOTIFY_OK;
}

static struct meson8b_nb_data meson8b_cpu_nb_data = {
	.nb.notifier_call = meson8b_cpu_clk_notifier_cb,
};

static struct meson_clk_hw_data meson8_clks = {
	.hws = meson8_hw_clks,
	.num = ARRAY_SIZE(meson8_hw_clks),
};

static struct meson_clk_hw_data meson8b_clks = {
	.hws = meson8b_hw_clks,
	.num = ARRAY_SIZE(meson8b_hw_clks),
};

static struct meson_clk_hw_data meson8m2_clks = {
	.hws = meson8m2_hw_clks,
	.num = ARRAY_SIZE(meson8m2_hw_clks),
};

static void __init meson8b_clkc_init_common(struct device_node *np,
					    struct meson_clk_hw_data *hw_clks)
{
	struct meson8b_clk_reset *rstc;
	struct device_node *parent_np;
	const char *notifier_clk_name;
	struct clk *notifier_clk;
	struct regmap *map;
	int i, ret;

	parent_np = of_get_parent(np);
	map = syscon_node_to_regmap(parent_np);
	of_node_put(parent_np);
	if (IS_ERR(map)) {
		pr_err("failed to get HHI regmap - Trying obsolete regs\n");
		return;
	}

	rstc = kzalloc(sizeof(*rstc), GFP_KERNEL);
	if (!rstc)
		return;

	/* Reset Controller */
	rstc->regmap = map;
	rstc->reset.ops = &meson8b_clk_reset_ops;
	rstc->reset.nr_resets = ARRAY_SIZE(meson8b_clk_reset_bits);
	rstc->reset.of_node = np;
	ret = reset_controller_register(&rstc->reset);
	if (ret) {
		pr_err("%s: Failed to register clkc reset controller: %d\n",
		       __func__, ret);
		return;
	}

	/* Populate regmap for the regmap backed clocks */
	for (i = 0; i < ARRAY_SIZE(meson8b_clk_regmaps); i++)
		meson8b_clk_regmaps[i]->map = map;

	/*
	 * register all clks and start with the first used ID (which is
	 * CLKID_PLL_FIXED)
	 */
	for (i = CLKID_PLL_FIXED; i < hw_clks->num; i++) {
		/* array might be sparse */
		if (!hw_clks->hws[i])
			continue;

		ret = of_clk_hw_register(np, hw_clks->hws[i]);
		if (ret)
			return;
	}

	meson8b_cpu_nb_data.cpu_clk = hw_clks->hws[CLKID_CPUCLK];

	/*
	 * FIXME we shouldn't program the muxes in notifier handlers. The
	 * tricky programming sequence will be handled by the forthcoming
	 * coordinated clock rates mechanism once that feature is released.
	 */
	notifier_clk_name = clk_hw_get_name(&meson8b_cpu_scale_out_sel.hw);
	notifier_clk = __clk_lookup(notifier_clk_name);
	ret = clk_notifier_register(notifier_clk, &meson8b_cpu_nb_data.nb);
	if (ret) {
		pr_err("%s: failed to register the CPU clock notifier\n",
		       __func__);
		return;
	}

	ret = of_clk_add_hw_provider(np, meson_clk_hw_get, hw_clks);
	if (ret)
		pr_err("%s: failed to register clock provider\n", __func__);
}

static void __init meson8_clkc_init(struct device_node *np)
{
	return meson8b_clkc_init_common(np, &meson8_clks);
}

static void __init meson8b_clkc_init(struct device_node *np)
{
	return meson8b_clkc_init_common(np, &meson8b_clks);
}

static void __init meson8m2_clkc_init(struct device_node *np)
{
	return meson8b_clkc_init_common(np, &meson8m2_clks);
}

CLK_OF_DECLARE_DRIVER(meson8_clkc, "amlogic,meson8-clkc",
		      meson8_clkc_init);
CLK_OF_DECLARE_DRIVER(meson8b_clkc, "amlogic,meson8b-clkc",
		      meson8b_clkc_init);
CLK_OF_DECLARE_DRIVER(meson8m2_clkc, "amlogic,meson8m2-clkc",
		      meson8m2_clkc_init);