Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: at91: clk-main: add support for parent_data/parent_hw

Add support for parent_data and parent_hw in main oscillator clock drivers.
With this parent-child relations are described with pointers rather
than strings making registration a bit faster.

All the SoC based drivers that rely on clk-main were adapted
to the new API change. The switch itself for SoCs will be done
in subsequent patches.

Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Link: https://lore.kernel.org/r/20230615093227.576102-2-claudiu.beznea@microchip.com

+52 -37
+2 -2
drivers/clk/at91/at91rm9200.c
··· 108 108 109 109 bypass = of_property_read_bool(np, "atmel,osc-bypass"); 110 110 111 - hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, 111 + hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, NULL, 112 112 bypass); 113 113 if (IS_ERR(hw)) 114 114 goto err_free; 115 115 116 - hw = at91_clk_register_rm9200_main(regmap, "mainck", "main_osc"); 116 + hw = at91_clk_register_rm9200_main(regmap, "mainck", "main_osc", NULL); 117 117 if (IS_ERR(hw)) 118 118 goto err_free; 119 119
+2 -2
drivers/clk/at91/at91sam9260.c
··· 363 363 364 364 bypass = of_property_read_bool(np, "atmel,osc-bypass"); 365 365 366 - hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, 366 + hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, NULL, 367 367 bypass); 368 368 if (IS_ERR(hw)) 369 369 goto err_free; 370 370 371 - hw = at91_clk_register_rm9200_main(regmap, "mainck", "main_osc"); 371 + hw = at91_clk_register_rm9200_main(regmap, "mainck", "main_osc", NULL); 372 372 if (IS_ERR(hw)) 373 373 goto err_free; 374 374
+2 -2
drivers/clk/at91/at91sam9g45.c
··· 123 123 124 124 bypass = of_property_read_bool(np, "atmel,osc-bypass"); 125 125 126 - hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, 126 + hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, NULL, 127 127 bypass); 128 128 if (IS_ERR(hw)) 129 129 goto err_free; 130 130 131 - hw = at91_clk_register_rm9200_main(regmap, "mainck", "main_osc"); 131 + hw = at91_clk_register_rm9200_main(regmap, "mainck", "main_osc", NULL); 132 132 if (IS_ERR(hw)) 133 133 goto err_free; 134 134
+2 -2
drivers/clk/at91/at91sam9n12.c
··· 147 147 148 148 bypass = of_property_read_bool(np, "atmel,osc-bypass"); 149 149 150 - hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, 150 + hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, NULL, 151 151 bypass); 152 152 if (IS_ERR(hw)) 153 153 goto err_free; 154 154 155 155 parent_names[0] = "main_rc_osc"; 156 156 parent_names[1] = "main_osc"; 157 - hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, 2); 157 + hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, NULL, 2); 158 158 if (IS_ERR(hw)) 159 159 goto err_free; 160 160
+1 -1
drivers/clk/at91/at91sam9rl.c
··· 95 95 if (!at91sam9rl_pmc) 96 96 return; 97 97 98 - hw = at91_clk_register_rm9200_main(regmap, "mainck", mainxtal_name); 98 + hw = at91_clk_register_rm9200_main(regmap, "mainck", mainxtal_name, NULL); 99 99 if (IS_ERR(hw)) 100 100 goto err_free; 101 101
+2 -2
drivers/clk/at91/at91sam9x5.c
··· 169 169 170 170 bypass = of_property_read_bool(np, "atmel,osc-bypass"); 171 171 172 - hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, 172 + hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, NULL, 173 173 bypass); 174 174 if (IS_ERR(hw)) 175 175 goto err_free; 176 176 177 177 parent_names[0] = "main_rc_osc"; 178 178 parent_names[1] = "main_osc"; 179 - hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, 2); 179 + hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, NULL, 2); 180 180 if (IS_ERR(hw)) 181 181 goto err_free; 182 182
+22 -10
drivers/clk/at91/clk-main.c
··· 152 152 at91_clk_register_main_osc(struct regmap *regmap, 153 153 const char *name, 154 154 const char *parent_name, 155 + struct clk_parent_data *parent_data, 155 156 bool bypass) 156 157 { 157 158 struct clk_main_osc *osc; 158 - struct clk_init_data init; 159 + struct clk_init_data init = {}; 159 160 struct clk_hw *hw; 160 161 int ret; 161 162 162 - if (!name || !parent_name) 163 + if (!name || !(parent_name || parent_data)) 163 164 return ERR_PTR(-EINVAL); 164 165 165 166 osc = kzalloc(sizeof(*osc), GFP_KERNEL); ··· 169 168 170 169 init.name = name; 171 170 init.ops = &main_osc_ops; 172 - init.parent_names = &parent_name; 171 + if (parent_data) 172 + init.parent_data = (const struct clk_parent_data *)parent_data; 173 + else 174 + init.parent_names = &parent_name; 173 175 init.num_parents = 1; 174 176 init.flags = CLK_IGNORE_UNUSED; 175 177 ··· 401 397 struct clk_hw * __init 402 398 at91_clk_register_rm9200_main(struct regmap *regmap, 403 399 const char *name, 404 - const char *parent_name) 400 + const char *parent_name, 401 + struct clk_hw *parent_hw) 405 402 { 406 403 struct clk_rm9200_main *clkmain; 407 - struct clk_init_data init; 404 + struct clk_init_data init = {}; 408 405 struct clk_hw *hw; 409 406 int ret; 410 407 411 408 if (!name) 412 409 return ERR_PTR(-EINVAL); 413 410 414 - if (!parent_name) 411 + if (!(parent_name || parent_hw)) 415 412 return ERR_PTR(-EINVAL); 416 413 417 414 clkmain = kzalloc(sizeof(*clkmain), GFP_KERNEL); ··· 421 416 422 417 init.name = name; 423 418 init.ops = &rm9200_main_ops; 424 - init.parent_names = &parent_name; 419 + if (parent_hw) 420 + init.parent_hws = (const struct clk_hw **)&parent_hw; 421 + else 422 + init.parent_names = &parent_name; 425 423 init.num_parents = 1; 426 424 init.flags = 0; 427 425 ··· 551 543 at91_clk_register_sam9x5_main(struct regmap *regmap, 552 544 const char *name, 553 545 const char **parent_names, 546 + struct clk_hw **parent_hws, 554 547 int num_parents) 555 548 { 556 549 struct clk_sam9x5_main *clkmain; 557 - struct clk_init_data init; 550 + struct clk_init_data init = {}; 558 551 unsigned int status; 559 552 struct clk_hw *hw; 560 553 int ret; ··· 563 554 if (!name) 564 555 return ERR_PTR(-EINVAL); 565 556 566 - if (!parent_names || !num_parents) 557 + if (!(parent_hws || parent_names) || !num_parents) 567 558 return ERR_PTR(-EINVAL); 568 559 569 560 clkmain = kzalloc(sizeof(*clkmain), GFP_KERNEL); ··· 572 563 573 564 init.name = name; 574 565 init.ops = &sam9x5_main_ops; 575 - init.parent_names = parent_names; 566 + if (parent_hws) 567 + init.parent_hws = (const struct clk_hw **)parent_hws; 568 + else 569 + init.parent_names = parent_names; 576 570 init.num_parents = num_parents; 577 571 init.flags = CLK_SET_PARENT_GATE; 578 572
+3 -3
drivers/clk/at91/dt-compat.c
··· 269 269 if (IS_ERR(regmap)) 270 270 return; 271 271 272 - hw = at91_clk_register_main_osc(regmap, name, parent_name, bypass); 272 + hw = at91_clk_register_main_osc(regmap, name, parent_name, NULL, bypass); 273 273 if (IS_ERR(hw)) 274 274 return; 275 275 ··· 323 323 if (IS_ERR(regmap)) 324 324 return; 325 325 326 - hw = at91_clk_register_rm9200_main(regmap, name, parent_name); 326 + hw = at91_clk_register_rm9200_main(regmap, name, parent_name, NULL); 327 327 if (IS_ERR(hw)) 328 328 return; 329 329 ··· 354 354 355 355 of_property_read_string(np, "clock-output-names", &name); 356 356 357 - hw = at91_clk_register_sam9x5_main(regmap, name, parent_names, 357 + hw = at91_clk_register_sam9x5_main(regmap, name, parent_names, NULL, 358 358 num_parents); 359 359 if (IS_ERR(hw)) 360 360 return;
+6 -3
drivers/clk/at91/pmc.h
··· 161 161 u32 frequency, u32 accuracy); 162 162 struct clk_hw * __init 163 163 at91_clk_register_main_osc(struct regmap *regmap, const char *name, 164 - const char *parent_name, bool bypass); 164 + const char *parent_name, 165 + struct clk_parent_data *parent_data, bool bypass); 165 166 struct clk_hw * __init 166 167 at91_clk_register_rm9200_main(struct regmap *regmap, 167 168 const char *name, 168 - const char *parent_name); 169 + const char *parent_name, 170 + struct clk_hw *parent_hw); 169 171 struct clk_hw * __init 170 172 at91_clk_register_sam9x5_main(struct regmap *regmap, const char *name, 171 - const char **parent_names, int num_parents); 173 + const char **parent_names, 174 + struct clk_hw **parent_hws, int num_parents); 172 175 173 176 struct clk_hw * __init 174 177 at91_clk_register_master_pres(struct regmap *regmap, const char *name,
+2 -2
drivers/clk/at91/sam9x60.c
··· 219 219 if (IS_ERR(hw)) 220 220 goto err_free; 221 221 222 - hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, 0); 222 + hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, NULL, 0); 223 223 if (IS_ERR(hw)) 224 224 goto err_free; 225 225 main_osc_hw = hw; 226 226 227 227 parent_names[0] = "main_rc_osc"; 228 228 parent_names[1] = "main_osc"; 229 - hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, 2); 229 + hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, NULL, 2); 230 230 if (IS_ERR(hw)) 231 231 goto err_free; 232 232
+2 -2
drivers/clk/at91/sama5d2.c
··· 202 202 203 203 bypass = of_property_read_bool(np, "atmel,osc-bypass"); 204 204 205 - hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, 205 + hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, NULL, 206 206 bypass); 207 207 if (IS_ERR(hw)) 208 208 goto err_free; 209 209 210 210 parent_names[0] = "main_rc_osc"; 211 211 parent_names[1] = "main_osc"; 212 - hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, 2); 212 + hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, NULL, 2); 213 213 if (IS_ERR(hw)) 214 214 goto err_free; 215 215
+2 -2
drivers/clk/at91/sama5d3.c
··· 150 150 151 151 bypass = of_property_read_bool(np, "atmel,osc-bypass"); 152 152 153 - hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, 153 + hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, NULL, 154 154 bypass); 155 155 if (IS_ERR(hw)) 156 156 goto err_free; 157 157 158 158 parent_names[0] = "main_rc_osc"; 159 159 parent_names[1] = "main_osc"; 160 - hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, 2); 160 + hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, NULL, 2); 161 161 if (IS_ERR(hw)) 162 162 goto err_free; 163 163
+2 -2
drivers/clk/at91/sama5d4.c
··· 165 165 166 166 bypass = of_property_read_bool(np, "atmel,osc-bypass"); 167 167 168 - hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, 168 + hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, NULL, 169 169 bypass); 170 170 if (IS_ERR(hw)) 171 171 goto err_free; 172 172 173 173 parent_names[0] = "main_rc_osc"; 174 174 parent_names[1] = "main_osc"; 175 - hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, 2); 175 + hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, NULL, 2); 176 176 if (IS_ERR(hw)) 177 177 goto err_free; 178 178
+2 -2
drivers/clk/at91/sama7g5.c
··· 936 936 937 937 bypass = of_property_read_bool(np, "atmel,osc-bypass"); 938 938 939 - hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, 939 + hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name, NULL, 940 940 bypass); 941 941 if (IS_ERR(hw)) 942 942 goto err_free; 943 943 944 944 parent_names[0] = "main_rc_osc"; 945 945 parent_names[1] = "main_osc"; 946 - hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, 2); 946 + hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, NULL, 2); 947 947 if (IS_ERR(hw)) 948 948 goto err_free; 949 949