2864 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Copyright (c) 2020, The Linux Foundation. All rights reserved.4 * Copyright (c) 2020, Martin Botka <martin.botka@somainline.org>5 * Copyright (c) 2020, Konrad Dybcio <konrad.dybcio@somainline.org>6 */7 8#include <linux/kernel.h>9#include <linux/bitops.h>10#include <linux/err.h>11#include <linux/platform_device.h>12#include <linux/property.h>13#include <linux/module.h>14#include <linux/of.h>15#include <linux/clk-provider.h>16#include <linux/regmap.h>17#include <linux/reset-controller.h>18#include <linux/clk.h>19 20 21#include <dt-bindings/clock/qcom,mmcc-sdm660.h>22 23#include "common.h"24#include "clk-regmap.h"25#include "clk-regmap-divider.h"26#include "clk-alpha-pll.h"27#include "clk-rcg.h"28#include "clk-branch.h"29#include "reset.h"30#include "gdsc.h"31 32enum {33 P_XO,34 P_DSI0PLL_BYTE,35 P_DSI0PLL,36 P_DSI1PLL_BYTE,37 P_DSI1PLL,38 P_GPLL0,39 P_GPLL0_DIV,40 P_MMPLL0,41 P_MMPLL10,42 P_MMPLL3,43 P_MMPLL4,44 P_MMPLL5,45 P_MMPLL6,46 P_MMPLL7,47 P_MMPLL8,48 P_SLEEP_CLK,49 P_DP_PHY_PLL_LINK_CLK,50 P_DP_PHY_PLL_VCO_DIV,51};52 53static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map[] = {54 { P_XO, 0 },55 { P_MMPLL0, 1 },56 { P_MMPLL4, 2 },57 { P_MMPLL7, 3 },58 { P_MMPLL8, 4 },59 { P_GPLL0, 5 },60 { P_GPLL0_DIV, 6 },61};62 63/* Voteable PLL */64static struct clk_alpha_pll mmpll0 = {65 .offset = 0xc000,66 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],67 .clkr = {68 .enable_reg = 0x1f0,69 .enable_mask = BIT(0),70 .hw.init = &(struct clk_init_data){71 .name = "mmpll0",72 .parent_data = &(const struct clk_parent_data){73 .fw_name = "xo",74 },75 .num_parents = 1,76 .ops = &clk_alpha_pll_ops,77 },78 },79};80 81static struct clk_alpha_pll mmpll6 = {82 .offset = 0xf0,83 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],84 .clkr = {85 .enable_reg = 0x1f0,86 .enable_mask = BIT(2),87 .hw.init = &(struct clk_init_data){88 .name = "mmpll6",89 .parent_data = &(const struct clk_parent_data){90 .fw_name = "xo",91 },92 .num_parents = 1,93 .ops = &clk_alpha_pll_ops,94 },95 },96};97 98/* APSS controlled PLLs */99static const struct pll_vco vco[] = {100 { 1000000000, 2000000000, 0 },101 { 750000000, 1500000000, 1 },102 { 500000000, 1000000000, 2 },103 { 250000000, 500000000, 3 },104};105 106static const struct pll_vco mmpll3_vco[] = {107 { 750000000, 1500000000, 1 },108};109 110static const struct alpha_pll_config mmpll10_config = {111 .l = 0x1e,112 .config_ctl_val = 0x00004289,113 .main_output_mask = 0x1,114};115 116static struct clk_alpha_pll mmpll10 = {117 .offset = 0x190,118 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],119 .clkr = {120 .hw.init = &(struct clk_init_data){121 .name = "mmpll10",122 .parent_data = &(const struct clk_parent_data){123 .fw_name = "xo",124 },125 .num_parents = 1,126 .ops = &clk_alpha_pll_ops,127 },128 },129};130 131static const struct alpha_pll_config mmpll3_config = {132 .l = 0x2e,133 .config_ctl_val = 0x4001055b,134 .vco_val = 0x1 << 20,135 .vco_mask = 0x3 << 20,136 .main_output_mask = 0x1,137};138 139static struct clk_alpha_pll mmpll3 = {140 .offset = 0x0,141 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],142 .vco_table = mmpll3_vco,143 .num_vco = ARRAY_SIZE(mmpll3_vco),144 .clkr = {145 .hw.init = &(struct clk_init_data){146 .name = "mmpll3",147 .parent_data = &(const struct clk_parent_data){148 .fw_name = "xo",149 },150 .num_parents = 1,151 .ops = &clk_alpha_pll_ops,152 },153 },154};155 156static const struct alpha_pll_config mmpll4_config = {157 .l = 0x28,158 .config_ctl_val = 0x4001055b,159 .vco_val = 0x2 << 20,160 .vco_mask = 0x3 << 20,161 .main_output_mask = 0x1,162};163 164static struct clk_alpha_pll mmpll4 = {165 .offset = 0x50,166 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],167 .vco_table = vco,168 .num_vco = ARRAY_SIZE(vco),169 .clkr = {170 .hw.init = &(struct clk_init_data){171 .name = "mmpll4",172 .parent_data = &(const struct clk_parent_data){173 .fw_name = "xo",174 },175 .num_parents = 1,176 .ops = &clk_alpha_pll_ops,177 },178 },179};180 181static const struct alpha_pll_config mmpll5_config = {182 .l = 0x2a,183 .config_ctl_val = 0x4001055b,184 .alpha_hi = 0xf8,185 .alpha_en_mask = BIT(24),186 .vco_val = 0x2 << 20,187 .vco_mask = 0x3 << 20,188 .main_output_mask = 0x1,189};190 191static struct clk_alpha_pll mmpll5 = {192 .offset = 0xa0,193 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],194 .vco_table = vco,195 .num_vco = ARRAY_SIZE(vco),196 .clkr = {197 .hw.init = &(struct clk_init_data){198 .name = "mmpll5",199 .parent_data = &(const struct clk_parent_data){200 .fw_name = "xo",201 },202 .num_parents = 1,203 .ops = &clk_alpha_pll_ops,204 },205 },206};207 208static const struct alpha_pll_config mmpll7_config = {209 .l = 0x32,210 .config_ctl_val = 0x4001055b,211 .vco_val = 0x2 << 20,212 .vco_mask = 0x3 << 20,213 .main_output_mask = 0x1,214};215 216static struct clk_alpha_pll mmpll7 = {217 .offset = 0x140,218 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],219 .vco_table = vco,220 .num_vco = ARRAY_SIZE(vco),221 .clkr = {222 .hw.init = &(struct clk_init_data){223 .name = "mmpll7",224 .parent_data = &(const struct clk_parent_data){225 .fw_name = "xo",226 },227 .num_parents = 1,228 .ops = &clk_alpha_pll_ops,229 },230 },231};232 233static const struct alpha_pll_config mmpll8_config = {234 .l = 0x30,235 .alpha_hi = 0x70,236 .alpha_en_mask = BIT(24),237 .config_ctl_val = 0x4001055b,238 .vco_val = 0x2 << 20,239 .vco_mask = 0x3 << 20,240 .main_output_mask = 0x1,241};242 243static struct clk_alpha_pll mmpll8 = {244 .offset = 0x1c0,245 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],246 .vco_table = vco,247 .num_vco = ARRAY_SIZE(vco),248 .clkr = {249 .hw.init = &(struct clk_init_data){250 .name = "mmpll8",251 .parent_data = &(const struct clk_parent_data){252 .fw_name = "xo",253 },254 .num_parents = 1,255 .ops = &clk_alpha_pll_ops,256 },257 },258};259 260static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div[] = {261 { .fw_name = "xo" },262 { .hw = &mmpll0.clkr.hw },263 { .hw = &mmpll4.clkr.hw },264 { .hw = &mmpll7.clkr.hw },265 { .hw = &mmpll8.clkr.hw },266 { .fw_name = "gpll0" },267 { .fw_name = "gpll0_div" },268};269 270static const struct parent_map mmcc_xo_dsibyte_map[] = {271 { P_XO, 0 },272 { P_DSI0PLL_BYTE, 1 },273 { P_DSI1PLL_BYTE, 2 },274};275 276static const struct clk_parent_data mmcc_xo_dsibyte[] = {277 { .fw_name = "xo" },278 { .fw_name = "dsi0pllbyte" },279 { .fw_name = "dsi1pllbyte" },280};281 282static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map[] = {283 { P_XO, 0 },284 { P_MMPLL0, 1 },285 { P_MMPLL4, 2 },286 { P_MMPLL7, 3 },287 { P_MMPLL10, 4 },288 { P_GPLL0, 5 },289 { P_GPLL0_DIV, 6 },290};291 292static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div[] = {293 { .fw_name = "xo" },294 { .hw = &mmpll0.clkr.hw },295 { .hw = &mmpll4.clkr.hw },296 { .hw = &mmpll7.clkr.hw },297 { .hw = &mmpll10.clkr.hw },298 { .fw_name = "gpll0" },299 { .fw_name = "gpll0_div" },300};301 302static const struct parent_map mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map[] = {303 { P_XO, 0 },304 { P_MMPLL4, 1 },305 { P_MMPLL7, 2 },306 { P_MMPLL10, 3 },307 { P_SLEEP_CLK, 4 },308 { P_GPLL0, 5 },309 { P_GPLL0_DIV, 6 },310};311 312static const struct clk_parent_data mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div[] = {313 { .fw_name = "xo" },314 { .hw = &mmpll4.clkr.hw },315 { .hw = &mmpll7.clkr.hw },316 { .hw = &mmpll10.clkr.hw },317 { .fw_name = "sleep_clk" },318 { .fw_name = "gpll0" },319 { .fw_name = "gpll0_div" },320};321 322static const struct parent_map mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map[] = {323 { P_XO, 0 },324 { P_MMPLL0, 1 },325 { P_MMPLL7, 2 },326 { P_MMPLL10, 3 },327 { P_SLEEP_CLK, 4 },328 { P_GPLL0, 5 },329 { P_GPLL0_DIV, 6 },330};331 332static const struct clk_parent_data mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div[] = {333 { .fw_name = "xo" },334 { .hw = &mmpll0.clkr.hw },335 { .hw = &mmpll7.clkr.hw },336 { .hw = &mmpll10.clkr.hw },337 { .fw_name = "sleep_clk" },338 { .fw_name = "gpll0" },339 { .fw_name = "gpll0_div" },340};341 342static const struct parent_map mmcc_xo_gpll0_gpll0_div_map[] = {343 { P_XO, 0 },344 { P_GPLL0, 5 },345 { P_GPLL0_DIV, 6 },346};347 348static const struct clk_parent_data mmcc_xo_gpll0_gpll0_div[] = {349 { .fw_name = "xo" },350 { .fw_name = "gpll0" },351 { .fw_name = "gpll0_div" },352};353 354static const struct parent_map mmcc_xo_dplink_dpvco_map[] = {355 { P_XO, 0 },356 { P_DP_PHY_PLL_LINK_CLK, 1 },357 { P_DP_PHY_PLL_VCO_DIV, 2 },358};359 360static const struct clk_parent_data mmcc_xo_dplink_dpvco[] = {361 { .fw_name = "xo" },362 { .fw_name = "dp_link_2x_clk_divsel_five" },363 { .fw_name = "dp_vco_divided_clk_src_mux" },364};365 366static const struct parent_map mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map[] = {367 { P_XO, 0 },368 { P_MMPLL0, 1 },369 { P_MMPLL5, 2 },370 { P_MMPLL7, 3 },371 { P_GPLL0, 5 },372 { P_GPLL0_DIV, 6 },373};374 375static const struct clk_parent_data mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div[] = {376 { .fw_name = "xo" },377 { .hw = &mmpll0.clkr.hw },378 { .hw = &mmpll5.clkr.hw },379 { .hw = &mmpll7.clkr.hw },380 { .fw_name = "gpll0" },381 { .fw_name = "gpll0_div" },382};383 384static const struct parent_map mmcc_xo_dsi0pll_dsi1pll_map[] = {385 { P_XO, 0 },386 { P_DSI0PLL, 1 },387 { P_DSI1PLL, 2 },388};389 390static const struct clk_parent_data mmcc_xo_dsi0pll_dsi1pll[] = {391 { .fw_name = "xo" },392 { .fw_name = "dsi0pll" },393 { .fw_name = "dsi1pll" },394};395 396static const struct parent_map mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map[] = {397 { P_XO, 0 },398 { P_MMPLL0, 1 },399 { P_MMPLL4, 2 },400 { P_MMPLL7, 3 },401 { P_MMPLL10, 4 },402 { P_MMPLL6, 5 },403 { P_GPLL0, 6 },404};405 406static const struct clk_parent_data mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0[] = {407 { .fw_name = "xo" },408 { .hw = &mmpll0.clkr.hw },409 { .hw = &mmpll4.clkr.hw },410 { .hw = &mmpll7.clkr.hw },411 { .hw = &mmpll10.clkr.hw },412 { .hw = &mmpll6.clkr.hw },413 { .fw_name = "gpll0" },414};415 416static const struct parent_map mmcc_xo_mmpll0_gpll0_gpll0_div_map[] = {417 { P_XO, 0 },418 { P_MMPLL0, 1 },419 { P_GPLL0, 5 },420 { P_GPLL0_DIV, 6 },421};422 423static const struct clk_parent_data mmcc_xo_mmpll0_gpll0_gpll0_div[] = {424 { .fw_name = "xo" },425 { .hw = &mmpll0.clkr.hw },426 { .fw_name = "gpll0" },427 { .fw_name = "gpll0_div" },428};429 430static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6_map[] = {431 { P_XO, 0 },432 { P_MMPLL0, 1 },433 { P_MMPLL4, 2 },434 { P_MMPLL7, 3 },435 { P_MMPLL10, 4 },436 { P_GPLL0, 5 },437 { P_MMPLL6, 6 },438};439 440static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6[] = {441 { .fw_name = "xo" },442 { .hw = &mmpll0.clkr.hw },443 { .hw = &mmpll4.clkr.hw },444 { .hw = &mmpll7.clkr.hw },445 { .hw = &mmpll10.clkr.hw },446 { .fw_name = "gpll0" },447 { .hw = &mmpll6.clkr.hw },448};449 450static const struct parent_map mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7_map[] = {451 { P_XO, 0 },452 { P_MMPLL0, 1 },453 { P_MMPLL8, 2 },454 { P_MMPLL3, 3 },455 { P_MMPLL6, 4 },456 { P_GPLL0, 5 },457 { P_MMPLL7, 6 },458};459 460static const struct clk_parent_data mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7[] = {461 { .fw_name = "xo" },462 { .hw = &mmpll0.clkr.hw },463 { .hw = &mmpll8.clkr.hw },464 { .hw = &mmpll3.clkr.hw },465 { .hw = &mmpll6.clkr.hw },466 { .fw_name = "gpll0" },467 { .hw = &mmpll7.clkr.hw },468};469 470static const struct freq_tbl ftbl_ahb_clk_src[] = {471 F(19200000, P_XO, 1, 0, 0),472 F(40000000, P_GPLL0_DIV, 7.5, 0, 0),473 F(80800000, P_MMPLL0, 10, 0, 0),474 { }475};476 477static struct clk_rcg2 ahb_clk_src = {478 .cmd_rcgr = 0x5000,479 .mnd_width = 0,480 .hid_width = 5,481 .parent_map = mmcc_xo_mmpll0_gpll0_gpll0_div_map,482 .freq_tbl = ftbl_ahb_clk_src,483 .clkr.hw.init = &(struct clk_init_data){484 .name = "ahb_clk_src",485 .parent_data = mmcc_xo_mmpll0_gpll0_gpll0_div,486 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_gpll0_gpll0_div),487 .ops = &clk_rcg2_ops,488 },489};490 491static struct clk_rcg2 byte0_clk_src = {492 .cmd_rcgr = 0x2120,493 .mnd_width = 0,494 .hid_width = 5,495 .parent_map = mmcc_xo_dsibyte_map,496 .clkr.hw.init = &(struct clk_init_data){497 .name = "byte0_clk_src",498 .parent_data = mmcc_xo_dsibyte,499 .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),500 .ops = &clk_byte2_ops,501 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,502 },503};504 505static struct clk_rcg2 byte1_clk_src = {506 .cmd_rcgr = 0x2140,507 .mnd_width = 0,508 .hid_width = 5,509 .parent_map = mmcc_xo_dsibyte_map,510 .clkr.hw.init = &(struct clk_init_data){511 .name = "byte1_clk_src",512 .parent_data = mmcc_xo_dsibyte,513 .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),514 .ops = &clk_byte2_ops,515 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,516 },517};518 519static const struct freq_tbl ftbl_camss_gp0_clk_src[] = {520 F(10000, P_XO, 16, 1, 120),521 F(24000, P_XO, 16, 1, 50),522 F(6000000, P_GPLL0_DIV, 10, 1, 5),523 F(12000000, P_GPLL0_DIV, 10, 2, 5),524 F(13043478, P_GPLL0_DIV, 1, 1, 23),525 F(24000000, P_GPLL0_DIV, 1, 2, 25),526 F(50000000, P_GPLL0_DIV, 6, 0, 0),527 F(100000000, P_GPLL0_DIV, 3, 0, 0),528 F(200000000, P_GPLL0, 3, 0, 0),529 { }530};531 532static struct clk_rcg2 camss_gp0_clk_src = {533 .cmd_rcgr = 0x3420,534 .mnd_width = 8,535 .hid_width = 5,536 .parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,537 .freq_tbl = ftbl_camss_gp0_clk_src,538 .clkr.hw.init = &(struct clk_init_data){539 .name = "camss_gp0_clk_src",540 .parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,541 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),542 .ops = &clk_rcg2_ops,543 },544};545 546static struct clk_rcg2 camss_gp1_clk_src = {547 .cmd_rcgr = 0x3450,548 .mnd_width = 8,549 .hid_width = 5,550 .parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,551 .freq_tbl = ftbl_camss_gp0_clk_src,552 .clkr.hw.init = &(struct clk_init_data){553 .name = "camss_gp1_clk_src",554 .parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,555 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),556 .ops = &clk_rcg2_ops,557 },558};559 560static const struct freq_tbl ftbl_cci_clk_src[] = {561 F(37500000, P_GPLL0_DIV, 8, 0, 0),562 F(50000000, P_GPLL0_DIV, 6, 0, 0),563 F(100000000, P_GPLL0, 6, 0, 0),564 { }565};566 567static struct clk_rcg2 cci_clk_src = {568 .cmd_rcgr = 0x3300,569 .mnd_width = 8,570 .hid_width = 5,571 .parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,572 .freq_tbl = ftbl_cci_clk_src,573 .clkr.hw.init = &(struct clk_init_data){574 .name = "cci_clk_src",575 .parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,576 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),577 .ops = &clk_rcg2_ops,578 },579};580 581static const struct freq_tbl ftbl_cpp_clk_src[] = {582 F(120000000, P_GPLL0, 5, 0, 0),583 F(256000000, P_MMPLL4, 3, 0, 0),584 F(384000000, P_MMPLL4, 2, 0, 0),585 F(480000000, P_MMPLL7, 2, 0, 0),586 F(540000000, P_MMPLL6, 2, 0, 0),587 F(576000000, P_MMPLL10, 1, 0, 0),588 { }589};590 591static struct clk_rcg2 cpp_clk_src = {592 .cmd_rcgr = 0x3640,593 .mnd_width = 0,594 .hid_width = 5,595 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6_map,596 .freq_tbl = ftbl_cpp_clk_src,597 .clkr.hw.init = &(struct clk_init_data){598 .name = "cpp_clk_src",599 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6,600 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6),601 .ops = &clk_rcg2_ops,602 },603};604 605static const struct freq_tbl ftbl_csi0_clk_src[] = {606 F(100000000, P_GPLL0_DIV, 3, 0, 0),607 F(200000000, P_GPLL0, 3, 0, 0),608 F(310000000, P_MMPLL8, 3, 0, 0),609 F(404000000, P_MMPLL0, 2, 0, 0),610 F(465000000, P_MMPLL8, 2, 0, 0),611 { }612};613 614static struct clk_rcg2 csi0_clk_src = {615 .cmd_rcgr = 0x3090,616 .mnd_width = 0,617 .hid_width = 5,618 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,619 .freq_tbl = ftbl_csi0_clk_src,620 .clkr.hw.init = &(struct clk_init_data){621 .name = "csi0_clk_src",622 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,623 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),624 .ops = &clk_rcg2_ops,625 },626};627 628static const struct freq_tbl ftbl_csi0phytimer_clk_src[] = {629 F(100000000, P_GPLL0_DIV, 3, 0, 0),630 F(200000000, P_GPLL0, 3, 0, 0),631 F(269333333, P_MMPLL0, 3, 0, 0),632 { }633};634 635static struct clk_rcg2 csi0phytimer_clk_src = {636 .cmd_rcgr = 0x3000,637 .mnd_width = 0,638 .hid_width = 5,639 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,640 .freq_tbl = ftbl_csi0phytimer_clk_src,641 .clkr.hw.init = &(struct clk_init_data){642 .name = "csi0phytimer_clk_src",643 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,644 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),645 .ops = &clk_rcg2_ops,646 },647};648 649static struct clk_rcg2 csi1_clk_src = {650 .cmd_rcgr = 0x3100,651 .mnd_width = 0,652 .hid_width = 5,653 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,654 .freq_tbl = ftbl_csi0_clk_src,655 .clkr.hw.init = &(struct clk_init_data){656 .name = "csi1_clk_src",657 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,658 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),659 .ops = &clk_rcg2_ops,660 },661};662 663static struct clk_rcg2 csi1phytimer_clk_src = {664 .cmd_rcgr = 0x3030,665 .mnd_width = 0,666 .hid_width = 5,667 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,668 .freq_tbl = ftbl_csi0phytimer_clk_src,669 .clkr.hw.init = &(struct clk_init_data){670 .name = "csi1phytimer_clk_src",671 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,672 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),673 .ops = &clk_rcg2_ops,674 },675};676 677static struct clk_rcg2 csi2_clk_src = {678 .cmd_rcgr = 0x3160,679 .mnd_width = 0,680 .hid_width = 5,681 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,682 .freq_tbl = ftbl_csi0_clk_src,683 .clkr.hw.init = &(struct clk_init_data){684 .name = "csi2_clk_src",685 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,686 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),687 .ops = &clk_rcg2_ops,688 },689};690 691static struct clk_rcg2 csi2phytimer_clk_src = {692 .cmd_rcgr = 0x3060,693 .mnd_width = 0,694 .hid_width = 5,695 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,696 .freq_tbl = ftbl_csi0phytimer_clk_src,697 .clkr.hw.init = &(struct clk_init_data){698 .name = "csi2phytimer_clk_src",699 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,700 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),701 .ops = &clk_rcg2_ops,702 },703};704 705static struct clk_rcg2 csi3_clk_src = {706 .cmd_rcgr = 0x31c0,707 .mnd_width = 0,708 .hid_width = 5,709 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,710 .freq_tbl = ftbl_csi0_clk_src,711 .clkr.hw.init = &(struct clk_init_data){712 .name = "csi3_clk_src",713 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,714 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),715 .ops = &clk_rcg2_ops,716 },717};718 719static const struct freq_tbl ftbl_csiphy_clk_src[] = {720 F(100000000, P_GPLL0_DIV, 3, 0, 0),721 F(200000000, P_GPLL0, 3, 0, 0),722 F(269333333, P_MMPLL0, 3, 0, 0),723 F(320000000, P_MMPLL7, 3, 0, 0),724 { }725};726 727static struct clk_rcg2 csiphy_clk_src = {728 .cmd_rcgr = 0x3800,729 .mnd_width = 0,730 .hid_width = 5,731 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,732 .freq_tbl = ftbl_csiphy_clk_src,733 .clkr.hw.init = &(struct clk_init_data){734 .name = "csiphy_clk_src",735 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,736 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),737 .ops = &clk_rcg2_ops,738 },739};740 741static const struct freq_tbl ftbl_dp_aux_clk_src[] = {742 F(19200000, P_XO, 1, 0, 0),743 { }744};745 746static struct clk_rcg2 dp_aux_clk_src = {747 .cmd_rcgr = 0x2260,748 .mnd_width = 0,749 .hid_width = 5,750 .parent_map = mmcc_xo_gpll0_gpll0_div_map,751 .freq_tbl = ftbl_dp_aux_clk_src,752 .clkr.hw.init = &(struct clk_init_data){753 .name = "dp_aux_clk_src",754 .parent_data = mmcc_xo_gpll0_gpll0_div,755 .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),756 .ops = &clk_rcg2_ops,757 },758};759 760static const struct freq_tbl ftbl_dp_crypto_clk_src[] = {761 F(101250000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),762 F(168750000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),763 F(337500000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),764 { }765};766 767static struct clk_rcg2 dp_crypto_clk_src = {768 .cmd_rcgr = 0x2220,769 .mnd_width = 8,770 .hid_width = 5,771 .parent_map = mmcc_xo_dplink_dpvco_map,772 .freq_tbl = ftbl_dp_crypto_clk_src,773 .clkr.hw.init = &(struct clk_init_data){774 .name = "dp_crypto_clk_src",775 .parent_data = mmcc_xo_dplink_dpvco,776 .num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),777 .ops = &clk_rcg2_ops,778 },779};780 781static const struct freq_tbl ftbl_dp_gtc_clk_src[] = {782 F(40000000, P_GPLL0_DIV, 7.5, 0, 0),783 F(60000000, P_GPLL0, 10, 0, 0),784 { }785};786 787static struct clk_rcg2 dp_gtc_clk_src = {788 .cmd_rcgr = 0x2280,789 .mnd_width = 0,790 .hid_width = 5,791 .parent_map = mmcc_xo_gpll0_gpll0_div_map,792 .freq_tbl = ftbl_dp_gtc_clk_src,793 .clkr.hw.init = &(struct clk_init_data){794 .name = "dp_gtc_clk_src",795 .parent_data = mmcc_xo_gpll0_gpll0_div,796 .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),797 .ops = &clk_rcg2_ops,798 },799};800 801static const struct freq_tbl ftbl_dp_link_clk_src[] = {802 F(162000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),803 F(270000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),804 F(540000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),805 { }806};807 808static struct clk_rcg2 dp_link_clk_src = {809 .cmd_rcgr = 0x2200,810 .mnd_width = 0,811 .hid_width = 5,812 .parent_map = mmcc_xo_dplink_dpvco_map,813 .freq_tbl = ftbl_dp_link_clk_src,814 .clkr.hw.init = &(struct clk_init_data){815 .name = "dp_link_clk_src",816 .parent_data = mmcc_xo_dplink_dpvco,817 .num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),818 .ops = &clk_rcg2_ops,819 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,820 },821};822 823static struct clk_rcg2 dp_pixel_clk_src = {824 .cmd_rcgr = 0x2240,825 .mnd_width = 16,826 .hid_width = 5,827 .parent_map = mmcc_xo_dplink_dpvco_map,828 .clkr.hw.init = &(struct clk_init_data){829 .name = "dp_pixel_clk_src",830 .parent_data = mmcc_xo_dplink_dpvco,831 .num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),832 .ops = &clk_dp_ops,833 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,834 },835};836 837static struct clk_rcg2 esc0_clk_src = {838 .cmd_rcgr = 0x2160,839 .mnd_width = 0,840 .hid_width = 5,841 .parent_map = mmcc_xo_dsibyte_map,842 .clkr.hw.init = &(struct clk_init_data){843 .name = "esc0_clk_src",844 .parent_data = mmcc_xo_dsibyte,845 .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),846 .ops = &clk_rcg2_ops,847 },848};849 850static struct clk_rcg2 esc1_clk_src = {851 .cmd_rcgr = 0x2180,852 .mnd_width = 0,853 .hid_width = 5,854 .parent_map = mmcc_xo_dsibyte_map,855 .clkr.hw.init = &(struct clk_init_data){856 .name = "esc1_clk_src",857 .parent_data = mmcc_xo_dsibyte,858 .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),859 .ops = &clk_rcg2_ops,860 },861};862 863static const struct freq_tbl ftbl_jpeg0_clk_src[] = {864 F(66666667, P_GPLL0_DIV, 4.5, 0, 0),865 F(133333333, P_GPLL0, 4.5, 0, 0),866 F(219428571, P_MMPLL4, 3.5, 0, 0),867 F(320000000, P_MMPLL7, 3, 0, 0),868 F(480000000, P_MMPLL7, 2, 0, 0),869 { }870};871 872static struct clk_rcg2 jpeg0_clk_src = {873 .cmd_rcgr = 0x3500,874 .mnd_width = 0,875 .hid_width = 5,876 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,877 .freq_tbl = ftbl_jpeg0_clk_src,878 .clkr.hw.init = &(struct clk_init_data){879 .name = "jpeg0_clk_src",880 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,881 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),882 .ops = &clk_rcg2_ops,883 },884};885 886static const struct freq_tbl ftbl_mclk0_clk_src[] = {887 F(4800000, P_XO, 4, 0, 0),888 F(6000000, P_GPLL0_DIV, 10, 1, 5),889 F(8000000, P_GPLL0_DIV, 1, 2, 75),890 F(9600000, P_XO, 2, 0, 0),891 F(16666667, P_GPLL0_DIV, 2, 1, 9),892 F(19200000, P_XO, 1, 0, 0),893 F(24000000, P_MMPLL10, 1, 1, 24),894 F(33333333, P_GPLL0_DIV, 1, 1, 9),895 F(48000000, P_GPLL0, 1, 2, 25),896 F(66666667, P_GPLL0, 1, 1, 9),897 { }898};899 900static struct clk_rcg2 mclk0_clk_src = {901 .cmd_rcgr = 0x3360,902 .mnd_width = 8,903 .hid_width = 5,904 .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,905 .freq_tbl = ftbl_mclk0_clk_src,906 .clkr.hw.init = &(struct clk_init_data){907 .name = "mclk0_clk_src",908 .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,909 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),910 .ops = &clk_rcg2_ops,911 },912};913 914static struct clk_rcg2 mclk1_clk_src = {915 .cmd_rcgr = 0x3390,916 .mnd_width = 8,917 .hid_width = 5,918 .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,919 .freq_tbl = ftbl_mclk0_clk_src,920 .clkr.hw.init = &(struct clk_init_data){921 .name = "mclk1_clk_src",922 .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,923 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),924 .ops = &clk_rcg2_ops,925 },926};927 928static struct clk_rcg2 mclk2_clk_src = {929 .cmd_rcgr = 0x33c0,930 .mnd_width = 8,931 .hid_width = 5,932 .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,933 .freq_tbl = ftbl_mclk0_clk_src,934 .clkr.hw.init = &(struct clk_init_data){935 .name = "mclk2_clk_src",936 .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,937 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),938 .ops = &clk_rcg2_ops,939 },940};941 942static struct clk_rcg2 mclk3_clk_src = {943 .cmd_rcgr = 0x33f0,944 .mnd_width = 8,945 .hid_width = 5,946 .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,947 .freq_tbl = ftbl_mclk0_clk_src,948 .clkr.hw.init = &(struct clk_init_data){949 .name = "mclk3_clk_src",950 .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,951 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),952 .ops = &clk_rcg2_ops,953 },954};955 956static const struct freq_tbl ftbl_mdp_clk_src[] = {957 F(100000000, P_GPLL0_DIV, 3, 0, 0),958 F(150000000, P_GPLL0_DIV, 2, 0, 0),959 F(171428571, P_GPLL0, 3.5, 0, 0),960 F(200000000, P_GPLL0, 3, 0, 0),961 F(275000000, P_MMPLL5, 3, 0, 0),962 F(300000000, P_GPLL0, 2, 0, 0),963 F(330000000, P_MMPLL5, 2.5, 0, 0),964 F(412500000, P_MMPLL5, 2, 0, 0),965 { }966};967 968static struct clk_rcg2 mdp_clk_src = {969 .cmd_rcgr = 0x2040,970 .mnd_width = 0,971 .hid_width = 5,972 .parent_map = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map,973 .freq_tbl = ftbl_mdp_clk_src,974 .clkr.hw.init = &(struct clk_init_data){975 .name = "mdp_clk_src",976 .parent_data = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div,977 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div),978 .ops = &clk_rcg2_ops,979 },980};981 982static struct clk_rcg2 pclk0_clk_src = {983 .cmd_rcgr = 0x2000,984 .mnd_width = 8,985 .hid_width = 5,986 .parent_map = mmcc_xo_dsi0pll_dsi1pll_map,987 .clkr.hw.init = &(struct clk_init_data){988 .name = "pclk0_clk_src",989 .parent_data = mmcc_xo_dsi0pll_dsi1pll,990 .num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),991 .ops = &clk_pixel_ops,992 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,993 },994};995 996static struct clk_rcg2 pclk1_clk_src = {997 .cmd_rcgr = 0x2020,998 .mnd_width = 8,999 .hid_width = 5,1000 .parent_map = mmcc_xo_dsi0pll_dsi1pll_map,1001 .clkr.hw.init = &(struct clk_init_data){1002 .name = "pclk1_clk_src",1003 .parent_data = mmcc_xo_dsi0pll_dsi1pll,1004 .num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),1005 .ops = &clk_pixel_ops,1006 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,1007 },1008};1009 1010static const struct freq_tbl ftbl_rot_clk_src[] = {1011 F(171428571, P_GPLL0, 3.5, 0, 0),1012 F(275000000, P_MMPLL5, 3, 0, 0),1013 F(300000000, P_GPLL0, 2, 0, 0),1014 F(330000000, P_MMPLL5, 2.5, 0, 0),1015 F(412500000, P_MMPLL5, 2, 0, 0),1016 { }1017};1018 1019static struct clk_rcg2 rot_clk_src = {1020 .cmd_rcgr = 0x21a0,1021 .mnd_width = 0,1022 .hid_width = 5,1023 .parent_map = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map,1024 .freq_tbl = ftbl_rot_clk_src,1025 .clkr.hw.init = &(struct clk_init_data){1026 .name = "rot_clk_src",1027 .parent_data = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div,1028 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div),1029 .ops = &clk_rcg2_ops,1030 },1031};1032 1033static const struct freq_tbl ftbl_vfe0_clk_src[] = {1034 F(120000000, P_GPLL0, 5, 0, 0),1035 F(200000000, P_GPLL0, 3, 0, 0),1036 F(256000000, P_MMPLL4, 3, 0, 0),1037 F(300000000, P_GPLL0, 2, 0, 0),1038 F(404000000, P_MMPLL0, 2, 0, 0),1039 F(480000000, P_MMPLL7, 2, 0, 0),1040 F(540000000, P_MMPLL6, 2, 0, 0),1041 F(576000000, P_MMPLL10, 1, 0, 0),1042 { }1043};1044 1045static struct clk_rcg2 vfe0_clk_src = {1046 .cmd_rcgr = 0x3600,1047 .mnd_width = 0,1048 .hid_width = 5,1049 .parent_map = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map,1050 .freq_tbl = ftbl_vfe0_clk_src,1051 .clkr.hw.init = &(struct clk_init_data){1052 .name = "vfe0_clk_src",1053 .parent_data = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0,1054 .num_parents = ARRAY_SIZE(mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0),1055 .ops = &clk_rcg2_ops,1056 },1057};1058 1059static struct clk_rcg2 vfe1_clk_src = {1060 .cmd_rcgr = 0x3620,1061 .mnd_width = 0,1062 .hid_width = 5,1063 .parent_map = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map,1064 .freq_tbl = ftbl_vfe0_clk_src,1065 .clkr.hw.init = &(struct clk_init_data){1066 .name = "vfe1_clk_src",1067 .parent_data = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0,1068 .num_parents = ARRAY_SIZE(mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0),1069 .ops = &clk_rcg2_ops,1070 },1071};1072 1073static const struct freq_tbl ftbl_video_core_clk_src[] = {1074 F(133333333, P_GPLL0, 4.5, 0, 0),1075 F(269333333, P_MMPLL0, 3, 0, 0),1076 F(320000000, P_MMPLL7, 3, 0, 0),1077 F(404000000, P_MMPLL0, 2, 0, 0),1078 F(441600000, P_MMPLL3, 2, 0, 0),1079 F(518400000, P_MMPLL3, 2, 0, 0),1080 { }1081};1082 1083static struct clk_rcg2 video_core_clk_src = {1084 .cmd_rcgr = 0x1000,1085 .mnd_width = 0,1086 .hid_width = 5,1087 .parent_map = mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7_map,1088 .freq_tbl = ftbl_video_core_clk_src,1089 .clkr.hw.init = &(struct clk_init_data){1090 .name = "video_core_clk_src",1091 .parent_data = mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7,1092 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7),1093 .ops = &clk_rcg2_ops,1094 .flags = CLK_IS_CRITICAL,1095 },1096};1097 1098static struct clk_rcg2 vsync_clk_src = {1099 .cmd_rcgr = 0x2080,1100 .mnd_width = 0,1101 .hid_width = 5,1102 .parent_map = mmcc_xo_gpll0_gpll0_div_map,1103 .freq_tbl = ftbl_dp_aux_clk_src,1104 .clkr.hw.init = &(struct clk_init_data){1105 .name = "vsync_clk_src",1106 .parent_data = mmcc_xo_gpll0_gpll0_div,1107 .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),1108 .ops = &clk_rcg2_ops,1109 },1110};1111 1112static struct clk_branch bimc_smmu_ahb_clk = {1113 .halt_reg = 0xe004,1114 .halt_check = BRANCH_VOTED,1115 .hwcg_reg = 0xe004,1116 .hwcg_bit = 1,1117 .clkr = {1118 .enable_reg = 0xe004,1119 .enable_mask = BIT(0),1120 .hw.init = &(struct clk_init_data){1121 .name = "bimc_smmu_ahb_clk",1122 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1123 .num_parents = 1,1124 .ops = &clk_branch2_ops,1125 },1126 },1127};1128 1129static struct clk_branch bimc_smmu_axi_clk = {1130 .halt_reg = 0xe008,1131 .halt_check = BRANCH_VOTED,1132 .hwcg_reg = 0xe008,1133 .hwcg_bit = 1,1134 .clkr = {1135 .enable_reg = 0xe008,1136 .enable_mask = BIT(0),1137 .hw.init = &(struct clk_init_data){1138 .name = "bimc_smmu_axi_clk",1139 .ops = &clk_branch2_ops,1140 },1141 },1142};1143 1144static struct clk_branch camss_ahb_clk = {1145 .halt_reg = 0x348c,1146 .halt_check = BRANCH_HALT,1147 .hwcg_reg = 0x348c,1148 .hwcg_bit = 1,1149 .clkr = {1150 .enable_reg = 0x348c,1151 .enable_mask = BIT(0),1152 .hw.init = &(struct clk_init_data){1153 .name = "camss_ahb_clk",1154 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1155 .num_parents = 1,1156 .ops = &clk_branch2_ops,1157 },1158 },1159};1160 1161static struct clk_branch camss_cci_ahb_clk = {1162 .halt_reg = 0x3348,1163 .halt_check = BRANCH_HALT,1164 .clkr = {1165 .enable_reg = 0x3348,1166 .enable_mask = BIT(0),1167 .hw.init = &(struct clk_init_data){1168 .name = "camss_cci_ahb_clk",1169 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1170 .num_parents = 1,1171 .flags = CLK_SET_RATE_PARENT,1172 .ops = &clk_branch2_ops,1173 },1174 },1175};1176 1177static struct clk_branch camss_cci_clk = {1178 .halt_reg = 0x3344,1179 .halt_check = BRANCH_HALT,1180 .clkr = {1181 .enable_reg = 0x3344,1182 .enable_mask = BIT(0),1183 .hw.init = &(struct clk_init_data){1184 .name = "camss_cci_clk",1185 .parent_hws = (const struct clk_hw *[]){ &cci_clk_src.clkr.hw },1186 .num_parents = 1,1187 .flags = CLK_SET_RATE_PARENT,1188 .ops = &clk_branch2_ops,1189 },1190 },1191};1192 1193static struct clk_branch camss_cpp_ahb_clk = {1194 .halt_reg = 0x36b4,1195 .halt_check = BRANCH_HALT,1196 .clkr = {1197 .enable_reg = 0x36b4,1198 .enable_mask = BIT(0),1199 .hw.init = &(struct clk_init_data){1200 .name = "camss_cpp_ahb_clk",1201 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1202 .num_parents = 1,1203 .ops = &clk_branch2_ops,1204 },1205 },1206};1207 1208static struct clk_branch camss_cpp_axi_clk = {1209 .halt_reg = 0x36c4,1210 .halt_check = BRANCH_HALT,1211 .clkr = {1212 .enable_reg = 0x36c4,1213 .enable_mask = BIT(0),1214 .hw.init = &(struct clk_init_data){1215 .name = "camss_cpp_axi_clk",1216 .ops = &clk_branch2_ops,1217 },1218 },1219};1220 1221static struct clk_branch camss_cpp_clk = {1222 .halt_reg = 0x36b0,1223 .halt_check = BRANCH_HALT,1224 .clkr = {1225 .enable_reg = 0x36b0,1226 .enable_mask = BIT(0),1227 .hw.init = &(struct clk_init_data){1228 .name = "camss_cpp_clk",1229 .parent_hws = (const struct clk_hw *[]){ &cpp_clk_src.clkr.hw },1230 .num_parents = 1,1231 .flags = CLK_SET_RATE_PARENT,1232 .ops = &clk_branch2_ops,1233 },1234 },1235};1236 1237static struct clk_branch camss_cpp_vbif_ahb_clk = {1238 .halt_reg = 0x36c8,1239 .halt_check = BRANCH_HALT,1240 .clkr = {1241 .enable_reg = 0x36c8,1242 .enable_mask = BIT(0),1243 .hw.init = &(struct clk_init_data){1244 .name = "camss_cpp_vbif_ahb_clk",1245 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1246 .num_parents = 1,1247 .ops = &clk_branch2_ops,1248 },1249 },1250};1251 1252static struct clk_branch camss_csi0_ahb_clk = {1253 .halt_reg = 0x30bc,1254 .halt_check = BRANCH_HALT,1255 .clkr = {1256 .enable_reg = 0x30bc,1257 .enable_mask = BIT(0),1258 .hw.init = &(struct clk_init_data){1259 .name = "camss_csi0_ahb_clk",1260 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1261 .num_parents = 1,1262 .ops = &clk_branch2_ops,1263 },1264 },1265};1266 1267static struct clk_branch camss_csi0_clk = {1268 .halt_reg = 0x30b4,1269 .halt_check = BRANCH_HALT,1270 .clkr = {1271 .enable_reg = 0x30b4,1272 .enable_mask = BIT(0),1273 .hw.init = &(struct clk_init_data){1274 .name = "camss_csi0_clk",1275 .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },1276 .num_parents = 1,1277 .flags = CLK_SET_RATE_PARENT,1278 .ops = &clk_branch2_ops,1279 },1280 },1281};1282 1283static struct clk_branch camss_csi0phytimer_clk = {1284 .halt_reg = 0x3024,1285 .halt_check = BRANCH_HALT,1286 .clkr = {1287 .enable_reg = 0x3024,1288 .enable_mask = BIT(0),1289 .hw.init = &(struct clk_init_data){1290 .name = "camss_csi0phytimer_clk",1291 .parent_hws = (const struct clk_hw *[]){ &csi0phytimer_clk_src.clkr.hw },1292 .num_parents = 1,1293 .flags = CLK_SET_RATE_PARENT,1294 .ops = &clk_branch2_ops,1295 },1296 },1297};1298 1299static struct clk_branch camss_csi0pix_clk = {1300 .halt_reg = 0x30e4,1301 .halt_check = BRANCH_HALT,1302 .clkr = {1303 .enable_reg = 0x30e4,1304 .enable_mask = BIT(0),1305 .hw.init = &(struct clk_init_data){1306 .name = "camss_csi0pix_clk",1307 .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },1308 .num_parents = 1,1309 .ops = &clk_branch2_ops,1310 },1311 },1312};1313 1314static struct clk_branch camss_csi0rdi_clk = {1315 .halt_reg = 0x30d4,1316 .halt_check = BRANCH_HALT,1317 .clkr = {1318 .enable_reg = 0x30d4,1319 .enable_mask = BIT(0),1320 .hw.init = &(struct clk_init_data){1321 .name = "camss_csi0rdi_clk",1322 .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },1323 .num_parents = 1,1324 .ops = &clk_branch2_ops,1325 },1326 },1327};1328 1329static struct clk_branch camss_csi1_ahb_clk = {1330 .halt_reg = 0x3128,1331 .halt_check = BRANCH_HALT,1332 .clkr = {1333 .enable_reg = 0x3128,1334 .enable_mask = BIT(0),1335 .hw.init = &(struct clk_init_data){1336 .name = "camss_csi1_ahb_clk",1337 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1338 .num_parents = 1,1339 .ops = &clk_branch2_ops,1340 },1341 },1342};1343 1344static struct clk_branch camss_csi1_clk = {1345 .halt_reg = 0x3124,1346 .halt_check = BRANCH_HALT,1347 .clkr = {1348 .enable_reg = 0x3124,1349 .enable_mask = BIT(0),1350 .hw.init = &(struct clk_init_data){1351 .name = "camss_csi1_clk",1352 .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },1353 .num_parents = 1,1354 .flags = CLK_SET_RATE_PARENT,1355 .ops = &clk_branch2_ops,1356 },1357 },1358};1359 1360static struct clk_branch camss_csi1phytimer_clk = {1361 .halt_reg = 0x3054,1362 .halt_check = BRANCH_HALT,1363 .clkr = {1364 .enable_reg = 0x3054,1365 .enable_mask = BIT(0),1366 .hw.init = &(struct clk_init_data){1367 .name = "camss_csi1phytimer_clk",1368 .parent_hws = (const struct clk_hw *[]){ &csi1phytimer_clk_src.clkr.hw },1369 .num_parents = 1,1370 .flags = CLK_SET_RATE_PARENT,1371 .ops = &clk_branch2_ops,1372 },1373 },1374};1375 1376static struct clk_branch camss_csi1pix_clk = {1377 .halt_reg = 0x3154,1378 .halt_check = BRANCH_HALT,1379 .clkr = {1380 .enable_reg = 0x3154,1381 .enable_mask = BIT(0),1382 .hw.init = &(struct clk_init_data){1383 .name = "camss_csi1pix_clk",1384 .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },1385 .num_parents = 1,1386 .ops = &clk_branch2_ops,1387 },1388 },1389};1390 1391static struct clk_branch camss_csi1rdi_clk = {1392 .halt_reg = 0x3144,1393 .halt_check = BRANCH_HALT,1394 .clkr = {1395 .enable_reg = 0x3144,1396 .enable_mask = BIT(0),1397 .hw.init = &(struct clk_init_data){1398 .name = "camss_csi1rdi_clk",1399 .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },1400 .num_parents = 1,1401 .ops = &clk_branch2_ops,1402 },1403 },1404};1405 1406static struct clk_branch camss_csi2_ahb_clk = {1407 .halt_reg = 0x3188,1408 .halt_check = BRANCH_HALT,1409 .clkr = {1410 .enable_reg = 0x3188,1411 .enable_mask = BIT(0),1412 .hw.init = &(struct clk_init_data){1413 .name = "camss_csi2_ahb_clk",1414 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1415 .num_parents = 1,1416 .ops = &clk_branch2_ops,1417 },1418 },1419};1420 1421static struct clk_branch camss_csi2_clk = {1422 .halt_reg = 0x3184,1423 .halt_check = BRANCH_HALT,1424 .clkr = {1425 .enable_reg = 0x3184,1426 .enable_mask = BIT(0),1427 .hw.init = &(struct clk_init_data){1428 .name = "camss_csi2_clk",1429 .parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },1430 .num_parents = 1,1431 .flags = CLK_SET_RATE_PARENT,1432 .ops = &clk_branch2_ops,1433 },1434 },1435};1436 1437static struct clk_branch camss_csi2phytimer_clk = {1438 .halt_reg = 0x3084,1439 .halt_check = BRANCH_HALT,1440 .clkr = {1441 .enable_reg = 0x3084,1442 .enable_mask = BIT(0),1443 .hw.init = &(struct clk_init_data){1444 .name = "camss_csi2phytimer_clk",1445 .parent_hws = (const struct clk_hw *[]){ &csi2phytimer_clk_src.clkr.hw },1446 .num_parents = 1,1447 .flags = CLK_SET_RATE_PARENT,1448 .ops = &clk_branch2_ops,1449 },1450 },1451};1452 1453static struct clk_branch camss_csi2pix_clk = {1454 .halt_reg = 0x31b4,1455 .halt_check = BRANCH_HALT,1456 .clkr = {1457 .enable_reg = 0x31b4,1458 .enable_mask = BIT(0),1459 .hw.init = &(struct clk_init_data){1460 .name = "camss_csi2pix_clk",1461 .parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },1462 .num_parents = 1,1463 .ops = &clk_branch2_ops,1464 },1465 },1466};1467 1468static struct clk_branch camss_csi2rdi_clk = {1469 .halt_reg = 0x31a4,1470 .halt_check = BRANCH_HALT,1471 .clkr = {1472 .enable_reg = 0x31a4,1473 .enable_mask = BIT(0),1474 .hw.init = &(struct clk_init_data){1475 .name = "camss_csi2rdi_clk",1476 .parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },1477 .num_parents = 1,1478 .ops = &clk_branch2_ops,1479 },1480 },1481};1482 1483static struct clk_branch camss_csi3_ahb_clk = {1484 .halt_reg = 0x31e8,1485 .halt_check = BRANCH_HALT,1486 .clkr = {1487 .enable_reg = 0x31e8,1488 .enable_mask = BIT(0),1489 .hw.init = &(struct clk_init_data){1490 .name = "camss_csi3_ahb_clk",1491 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1492 .num_parents = 1,1493 .ops = &clk_branch2_ops,1494 },1495 },1496};1497 1498static struct clk_branch camss_csi3_clk = {1499 .halt_reg = 0x31e4,1500 .halt_check = BRANCH_HALT,1501 .clkr = {1502 .enable_reg = 0x31e4,1503 .enable_mask = BIT(0),1504 .hw.init = &(struct clk_init_data){1505 .name = "camss_csi3_clk",1506 .parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },1507 .num_parents = 1,1508 .flags = CLK_SET_RATE_PARENT,1509 .ops = &clk_branch2_ops,1510 },1511 },1512};1513 1514static struct clk_branch camss_csi3pix_clk = {1515 .halt_reg = 0x3214,1516 .halt_check = BRANCH_HALT,1517 .clkr = {1518 .enable_reg = 0x3214,1519 .enable_mask = BIT(0),1520 .hw.init = &(struct clk_init_data){1521 .name = "camss_csi3pix_clk",1522 .parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },1523 .num_parents = 1,1524 .ops = &clk_branch2_ops,1525 },1526 },1527};1528 1529static struct clk_branch camss_csi3rdi_clk = {1530 .halt_reg = 0x3204,1531 .halt_check = BRANCH_HALT,1532 .clkr = {1533 .enable_reg = 0x3204,1534 .enable_mask = BIT(0),1535 .hw.init = &(struct clk_init_data){1536 .name = "camss_csi3rdi_clk",1537 .parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },1538 .num_parents = 1,1539 .ops = &clk_branch2_ops,1540 },1541 },1542};1543 1544static struct clk_branch camss_csi_vfe0_clk = {1545 .halt_reg = 0x3704,1546 .halt_check = BRANCH_HALT,1547 .clkr = {1548 .enable_reg = 0x3704,1549 .enable_mask = BIT(0),1550 .hw.init = &(struct clk_init_data){1551 .name = "camss_csi_vfe0_clk",1552 .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },1553 .num_parents = 1,1554 .ops = &clk_branch2_ops,1555 },1556 },1557};1558 1559static struct clk_branch camss_csi_vfe1_clk = {1560 .halt_reg = 0x3714,1561 .halt_check = BRANCH_HALT,1562 .clkr = {1563 .enable_reg = 0x3714,1564 .enable_mask = BIT(0),1565 .hw.init = &(struct clk_init_data){1566 .name = "camss_csi_vfe1_clk",1567 .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },1568 .num_parents = 1,1569 .ops = &clk_branch2_ops,1570 },1571 },1572};1573 1574static struct clk_branch camss_csiphy0_clk = {1575 .halt_reg = 0x3740,1576 .halt_check = BRANCH_HALT,1577 .clkr = {1578 .enable_reg = 0x3740,1579 .enable_mask = BIT(0),1580 .hw.init = &(struct clk_init_data){1581 .name = "camss_csiphy0_clk",1582 .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },1583 .num_parents = 1,1584 .flags = CLK_SET_RATE_PARENT,1585 .ops = &clk_branch2_ops,1586 },1587 },1588};1589 1590static struct clk_branch camss_csiphy1_clk = {1591 .halt_reg = 0x3744,1592 .halt_check = BRANCH_HALT,1593 .clkr = {1594 .enable_reg = 0x3744,1595 .enable_mask = BIT(0),1596 .hw.init = &(struct clk_init_data){1597 .name = "camss_csiphy1_clk",1598 .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },1599 .num_parents = 1,1600 .flags = CLK_SET_RATE_PARENT,1601 .ops = &clk_branch2_ops,1602 },1603 },1604};1605 1606static struct clk_branch camss_csiphy2_clk = {1607 .halt_reg = 0x3748,1608 .halt_check = BRANCH_HALT,1609 .clkr = {1610 .enable_reg = 0x3748,1611 .enable_mask = BIT(0),1612 .hw.init = &(struct clk_init_data){1613 .name = "camss_csiphy2_clk",1614 .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },1615 .num_parents = 1,1616 .flags = CLK_SET_RATE_PARENT,1617 .ops = &clk_branch2_ops,1618 },1619 },1620};1621 1622 1623static struct clk_branch camss_cphy_csid0_clk = {1624 .halt_reg = 0x3730,1625 .halt_check = BRANCH_HALT,1626 .clkr = {1627 .enable_reg = 0x3730,1628 .enable_mask = BIT(0),1629 .hw.init = &(struct clk_init_data){1630 .name = "camss_cphy_csid0_clk",1631 .parent_hws = (const struct clk_hw *[]){ &camss_csiphy0_clk.clkr.hw },1632 .num_parents = 1,1633 .flags = CLK_SET_RATE_PARENT,1634 .ops = &clk_branch2_ops,1635 },1636 },1637};1638 1639static struct clk_branch camss_cphy_csid1_clk = {1640 .halt_reg = 0x3734,1641 .halt_check = BRANCH_HALT,1642 .clkr = {1643 .enable_reg = 0x3734,1644 .enable_mask = BIT(0),1645 .hw.init = &(struct clk_init_data){1646 .name = "camss_cphy_csid1_clk",1647 .parent_hws = (const struct clk_hw *[]){ &camss_csiphy1_clk.clkr.hw },1648 .num_parents = 1,1649 .flags = CLK_SET_RATE_PARENT,1650 .ops = &clk_branch2_ops,1651 },1652 },1653};1654 1655static struct clk_branch camss_cphy_csid2_clk = {1656 .halt_reg = 0x3738,1657 .halt_check = BRANCH_HALT,1658 .clkr = {1659 .enable_reg = 0x3738,1660 .enable_mask = BIT(0),1661 .hw.init = &(struct clk_init_data){1662 .name = "camss_cphy_csid2_clk",1663 .parent_hws = (const struct clk_hw *[]){ &camss_csiphy2_clk.clkr.hw },1664 .num_parents = 1,1665 .flags = CLK_SET_RATE_PARENT,1666 .ops = &clk_branch2_ops,1667 },1668 },1669};1670 1671static struct clk_branch camss_cphy_csid3_clk = {1672 .halt_reg = 0x373c,1673 .halt_check = BRANCH_HALT,1674 .clkr = {1675 .enable_reg = 0x373c,1676 .enable_mask = BIT(0),1677 .hw.init = &(struct clk_init_data){1678 .name = "camss_cphy_csid3_clk",1679 .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },1680 .num_parents = 1,1681 .flags = CLK_SET_RATE_PARENT,1682 .ops = &clk_branch2_ops,1683 },1684 },1685};1686 1687static struct clk_branch camss_gp0_clk = {1688 .halt_reg = 0x3444,1689 .halt_check = BRANCH_HALT,1690 .clkr = {1691 .enable_reg = 0x3444,1692 .enable_mask = BIT(0),1693 .hw.init = &(struct clk_init_data){1694 .name = "camss_gp0_clk",1695 .parent_hws = (const struct clk_hw *[]){ &camss_gp0_clk_src.clkr.hw },1696 .num_parents = 1,1697 .flags = CLK_SET_RATE_PARENT,1698 .ops = &clk_branch2_ops,1699 },1700 },1701};1702 1703static struct clk_branch camss_gp1_clk = {1704 .halt_reg = 0x3474,1705 .halt_check = BRANCH_HALT,1706 .clkr = {1707 .enable_reg = 0x3474,1708 .enable_mask = BIT(0),1709 .hw.init = &(struct clk_init_data){1710 .name = "camss_gp1_clk",1711 .parent_hws = (const struct clk_hw *[]){ &camss_gp1_clk_src.clkr.hw },1712 .num_parents = 1,1713 .flags = CLK_SET_RATE_PARENT,1714 .ops = &clk_branch2_ops,1715 },1716 },1717};1718 1719static struct clk_branch camss_ispif_ahb_clk = {1720 .halt_reg = 0x3224,1721 .halt_check = BRANCH_HALT,1722 .clkr = {1723 .enable_reg = 0x3224,1724 .enable_mask = BIT(0),1725 .hw.init = &(struct clk_init_data){1726 .name = "camss_ispif_ahb_clk",1727 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1728 .num_parents = 1,1729 .ops = &clk_branch2_ops,1730 },1731 },1732};1733 1734static struct clk_branch camss_jpeg0_clk = {1735 .halt_reg = 0x35a8,1736 .halt_check = BRANCH_HALT,1737 .clkr = {1738 .enable_reg = 0x35a8,1739 .enable_mask = BIT(0),1740 .hw.init = &(struct clk_init_data){1741 .name = "camss_jpeg0_clk",1742 .parent_hws = (const struct clk_hw *[]){ &jpeg0_clk_src.clkr.hw },1743 .num_parents = 1,1744 .flags = CLK_SET_RATE_PARENT,1745 .ops = &clk_branch2_ops,1746 },1747 },1748};1749 1750static struct clk_branch camss_jpeg_ahb_clk = {1751 .halt_reg = 0x35b4,1752 .halt_check = BRANCH_HALT,1753 .clkr = {1754 .enable_reg = 0x35b4,1755 .enable_mask = BIT(0),1756 .hw.init = &(struct clk_init_data){1757 .name = "camss_jpeg_ahb_clk",1758 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1759 .num_parents = 1,1760 .ops = &clk_branch2_ops,1761 },1762 },1763};1764 1765static struct clk_branch camss_jpeg_axi_clk = {1766 .halt_reg = 0x35b8,1767 .halt_check = BRANCH_HALT,1768 .clkr = {1769 .enable_reg = 0x35b8,1770 .enable_mask = BIT(0),1771 .hw.init = &(struct clk_init_data){1772 .name = "camss_jpeg_axi_clk",1773 .ops = &clk_branch2_ops,1774 },1775 },1776};1777 1778static struct clk_branch throttle_camss_axi_clk = {1779 .halt_reg = 0x3c3c,1780 .halt_check = BRANCH_HALT,1781 .clkr = {1782 .enable_reg = 0x3c3c,1783 .enable_mask = BIT(0),1784 .hw.init = &(struct clk_init_data){1785 .name = "throttle_camss_axi_clk",1786 .ops = &clk_branch2_ops,1787 },1788 },1789};1790 1791static struct clk_branch camss_mclk0_clk = {1792 .halt_reg = 0x3384,1793 .halt_check = BRANCH_HALT,1794 .clkr = {1795 .enable_reg = 0x3384,1796 .enable_mask = BIT(0),1797 .hw.init = &(struct clk_init_data){1798 .name = "camss_mclk0_clk",1799 .parent_hws = (const struct clk_hw *[]){ &mclk0_clk_src.clkr.hw },1800 .num_parents = 1,1801 .flags = CLK_SET_RATE_PARENT,1802 .ops = &clk_branch2_ops,1803 },1804 },1805};1806 1807static struct clk_branch camss_mclk1_clk = {1808 .halt_reg = 0x33b4,1809 .halt_check = BRANCH_HALT,1810 .clkr = {1811 .enable_reg = 0x33b4,1812 .enable_mask = BIT(0),1813 .hw.init = &(struct clk_init_data){1814 .name = "camss_mclk1_clk",1815 .parent_hws = (const struct clk_hw *[]){ &mclk1_clk_src.clkr.hw },1816 .num_parents = 1,1817 .flags = CLK_SET_RATE_PARENT,1818 .ops = &clk_branch2_ops,1819 },1820 },1821};1822 1823static struct clk_branch camss_mclk2_clk = {1824 .halt_reg = 0x33e4,1825 .halt_check = BRANCH_HALT,1826 .clkr = {1827 .enable_reg = 0x33e4,1828 .enable_mask = BIT(0),1829 .hw.init = &(struct clk_init_data){1830 .name = "camss_mclk2_clk",1831 .parent_hws = (const struct clk_hw *[]){ &mclk2_clk_src.clkr.hw },1832 .num_parents = 1,1833 .flags = CLK_SET_RATE_PARENT,1834 .ops = &clk_branch2_ops,1835 },1836 },1837};1838 1839static struct clk_branch camss_mclk3_clk = {1840 .halt_reg = 0x3414,1841 .halt_check = BRANCH_HALT,1842 .clkr = {1843 .enable_reg = 0x3414,1844 .enable_mask = BIT(0),1845 .hw.init = &(struct clk_init_data){1846 .name = "camss_mclk3_clk",1847 .parent_hws = (const struct clk_hw *[]){ &mclk3_clk_src.clkr.hw },1848 .num_parents = 1,1849 .flags = CLK_SET_RATE_PARENT,1850 .ops = &clk_branch2_ops,1851 },1852 },1853};1854 1855static struct clk_branch camss_micro_ahb_clk = {1856 .halt_reg = 0x3494,1857 .halt_check = BRANCH_HALT,1858 .clkr = {1859 .enable_reg = 0x3494,1860 .enable_mask = BIT(0),1861 .hw.init = &(struct clk_init_data){1862 .name = "camss_micro_ahb_clk",1863 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1864 .num_parents = 1,1865 .ops = &clk_branch2_ops,1866 },1867 },1868};1869 1870static struct clk_branch camss_top_ahb_clk = {1871 .halt_reg = 0x3484,1872 .halt_check = BRANCH_HALT,1873 .clkr = {1874 .enable_reg = 0x3484,1875 .enable_mask = BIT(0),1876 .hw.init = &(struct clk_init_data){1877 .name = "camss_top_ahb_clk",1878 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1879 .num_parents = 1,1880 .ops = &clk_branch2_ops,1881 },1882 },1883};1884 1885static struct clk_branch camss_vfe0_ahb_clk = {1886 .halt_reg = 0x3668,1887 .halt_check = BRANCH_HALT,1888 .clkr = {1889 .enable_reg = 0x3668,1890 .enable_mask = BIT(0),1891 .hw.init = &(struct clk_init_data){1892 .name = "camss_vfe0_ahb_clk",1893 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1894 .num_parents = 1,1895 .ops = &clk_branch2_ops,1896 },1897 },1898};1899 1900static struct clk_branch camss_vfe0_clk = {1901 .halt_reg = 0x36a8,1902 .halt_check = BRANCH_HALT,1903 .clkr = {1904 .enable_reg = 0x36a8,1905 .enable_mask = BIT(0),1906 .hw.init = &(struct clk_init_data){1907 .name = "camss_vfe0_clk",1908 .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },1909 .num_parents = 1,1910 .flags = CLK_SET_RATE_PARENT,1911 .ops = &clk_branch2_ops,1912 },1913 },1914};1915 1916static struct clk_branch camss_vfe0_stream_clk = {1917 .halt_reg = 0x3720,1918 .halt_check = BRANCH_HALT,1919 .clkr = {1920 .enable_reg = 0x3720,1921 .enable_mask = BIT(0),1922 .hw.init = &(struct clk_init_data){1923 .name = "camss_vfe0_stream_clk",1924 .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },1925 .num_parents = 1,1926 .ops = &clk_branch2_ops,1927 },1928 },1929};1930 1931static struct clk_branch camss_vfe1_ahb_clk = {1932 .halt_reg = 0x3678,1933 .halt_check = BRANCH_HALT,1934 .clkr = {1935 .enable_reg = 0x3678,1936 .enable_mask = BIT(0),1937 .hw.init = &(struct clk_init_data){1938 .name = "camss_vfe1_ahb_clk",1939 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1940 .num_parents = 1,1941 .ops = &clk_branch2_ops,1942 },1943 },1944};1945 1946static struct clk_branch camss_vfe1_clk = {1947 .halt_reg = 0x36ac,1948 .halt_check = BRANCH_HALT,1949 .clkr = {1950 .enable_reg = 0x36ac,1951 .enable_mask = BIT(0),1952 .hw.init = &(struct clk_init_data){1953 .name = "camss_vfe1_clk",1954 .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },1955 .num_parents = 1,1956 .flags = CLK_SET_RATE_PARENT,1957 .ops = &clk_branch2_ops,1958 },1959 },1960};1961 1962static struct clk_branch camss_vfe1_stream_clk = {1963 .halt_reg = 0x3724,1964 .halt_check = BRANCH_HALT,1965 .clkr = {1966 .enable_reg = 0x3724,1967 .enable_mask = BIT(0),1968 .hw.init = &(struct clk_init_data){1969 .name = "camss_vfe1_stream_clk",1970 .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },1971 .num_parents = 1,1972 .ops = &clk_branch2_ops,1973 },1974 },1975};1976 1977static struct clk_branch camss_vfe_vbif_ahb_clk = {1978 .halt_reg = 0x36b8,1979 .halt_check = BRANCH_HALT,1980 .clkr = {1981 .enable_reg = 0x36b8,1982 .enable_mask = BIT(0),1983 .hw.init = &(struct clk_init_data){1984 .name = "camss_vfe_vbif_ahb_clk",1985 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },1986 .num_parents = 1,1987 .ops = &clk_branch2_ops,1988 },1989 },1990};1991 1992static struct clk_branch camss_vfe_vbif_axi_clk = {1993 .halt_reg = 0x36bc,1994 .halt_check = BRANCH_HALT,1995 .clkr = {1996 .enable_reg = 0x36bc,1997 .enable_mask = BIT(0),1998 .hw.init = &(struct clk_init_data){1999 .name = "camss_vfe_vbif_axi_clk",2000 .ops = &clk_branch2_ops,2001 },2002 },2003};2004 2005static struct clk_branch csiphy_ahb2crif_clk = {2006 .halt_reg = 0x374c,2007 .halt_check = BRANCH_HALT,2008 .hwcg_reg = 0x374c,2009 .hwcg_bit = 1,2010 .clkr = {2011 .enable_reg = 0x374c,2012 .enable_mask = BIT(0),2013 .hw.init = &(struct clk_init_data){2014 .name = "csiphy_ahb2crif_clk",2015 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },2016 .num_parents = 1,2017 .ops = &clk_branch2_ops,2018 },2019 },2020};2021 2022static struct clk_branch mdss_ahb_clk = {2023 .halt_reg = 0x2308,2024 .halt_check = BRANCH_HALT,2025 .hwcg_reg = 0x8a004,2026 .hwcg_bit = 1,2027 .clkr = {2028 .enable_reg = 0x2308,2029 .enable_mask = BIT(0),2030 .hw.init = &(struct clk_init_data){2031 .name = "mdss_ahb_clk",2032 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },2033 .flags = CLK_SET_RATE_PARENT,2034 .num_parents = 1,2035 .ops = &clk_branch2_ops,2036 },2037 },2038};2039 2040static const struct freq_tbl ftbl_axi_clk_src[] = {2041 F(75000000, P_GPLL0, 8, 0, 0),2042 F(171428571, P_GPLL0, 3.5, 0, 0),2043 F(240000000, P_GPLL0, 2.5, 0, 0),2044 F(323200000, P_MMPLL0, 2.5, 0, 0),2045 F(406000000, P_MMPLL0, 2, 0, 0),2046 { }2047};2048 2049/* RO to linux */2050static struct clk_rcg2 axi_clk_src = {2051 .cmd_rcgr = 0xd000,2052 .hid_width = 5,2053 .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,2054 .freq_tbl = ftbl_axi_clk_src,2055 .clkr.hw.init = &(struct clk_init_data){2056 .name = "axi_clk_src",2057 .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,2058 .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),2059 .ops = &clk_rcg2_ops,2060 },2061};2062 2063static struct clk_branch mdss_axi_clk = {2064 .halt_reg = 0x2310,2065 .halt_check = BRANCH_HALT,2066 .clkr = {2067 .enable_reg = 0x2310,2068 .enable_mask = BIT(0),2069 .hw.init = &(struct clk_init_data){2070 .name = "mdss_axi_clk",2071 .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },2072 .ops = &clk_branch2_ops,2073 },2074 },2075};2076 2077static struct clk_branch throttle_mdss_axi_clk = {2078 .halt_reg = 0x246c,2079 .halt_check = BRANCH_HALT,2080 .hwcg_reg = 0x246c,2081 .hwcg_bit = 1,2082 .clkr = {2083 .enable_reg = 0x246c,2084 .enable_mask = BIT(0),2085 .hw.init = &(struct clk_init_data){2086 .name = "throttle_mdss_axi_clk",2087 .ops = &clk_branch2_ops,2088 },2089 },2090};2091 2092static struct clk_branch mdss_byte0_clk = {2093 .halt_reg = 0x233c,2094 .halt_check = BRANCH_HALT,2095 .clkr = {2096 .enable_reg = 0x233c,2097 .enable_mask = BIT(0),2098 .hw.init = &(struct clk_init_data){2099 .name = "mdss_byte0_clk",2100 .parent_hws = (const struct clk_hw *[]){ &byte0_clk_src.clkr.hw },2101 .num_parents = 1,2102 .flags = CLK_SET_RATE_PARENT,2103 .ops = &clk_branch2_ops,2104 },2105 },2106};2107 2108static struct clk_regmap_div mdss_byte0_intf_div_clk = {2109 .reg = 0x237c,2110 .shift = 0,2111 .width = 2,2112 /*2113 * NOTE: Op does not work for div-3. Current assumption is that div-32114 * is not a recommended setting for this divider.2115 */2116 .clkr = {2117 .hw.init = &(struct clk_init_data){2118 .name = "mdss_byte0_intf_div_clk",2119 .parent_hws = (const struct clk_hw *[]){ &byte0_clk_src.clkr.hw },2120 .num_parents = 1,2121 .ops = &clk_regmap_div_ops,2122 .flags = CLK_GET_RATE_NOCACHE,2123 },2124 },2125};2126 2127static struct clk_branch mdss_byte0_intf_clk = {2128 .halt_reg = 0x2374,2129 .halt_check = BRANCH_HALT,2130 .clkr = {2131 .enable_reg = 0x2374,2132 .enable_mask = BIT(0),2133 .hw.init = &(struct clk_init_data){2134 .name = "mdss_byte0_intf_clk",2135 .parent_hws = (const struct clk_hw *[]){ &mdss_byte0_intf_div_clk.clkr.hw },2136 .num_parents = 1,2137 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,2138 .ops = &clk_branch2_ops,2139 },2140 },2141};2142 2143static struct clk_branch mdss_byte1_clk = {2144 .halt_reg = 0x2340,2145 .halt_check = BRANCH_HALT,2146 .clkr = {2147 .enable_reg = 0x2340,2148 .enable_mask = BIT(0),2149 .hw.init = &(struct clk_init_data){2150 .name = "mdss_byte1_clk",2151 .parent_hws = (const struct clk_hw *[]){ &byte1_clk_src.clkr.hw },2152 .num_parents = 1,2153 .flags = CLK_SET_RATE_PARENT,2154 .ops = &clk_branch2_ops,2155 },2156 },2157};2158 2159static struct clk_regmap_div mdss_byte1_intf_div_clk = {2160 .reg = 0x2380,2161 .shift = 0,2162 .width = 2,2163 /*2164 * NOTE: Op does not work for div-3. Current assumption is that div-32165 * is not a recommended setting for this divider.2166 */2167 .clkr = {2168 .hw.init = &(struct clk_init_data){2169 .name = "mdss_byte1_intf_div_clk",2170 .parent_hws = (const struct clk_hw *[]){ &byte1_clk_src.clkr.hw },2171 .num_parents = 1,2172 .ops = &clk_regmap_div_ops,2173 .flags = CLK_GET_RATE_NOCACHE,2174 },2175 },2176};2177 2178static struct clk_branch mdss_byte1_intf_clk = {2179 .halt_reg = 0x2378,2180 .halt_check = BRANCH_HALT,2181 .clkr = {2182 .enable_reg = 0x2378,2183 .enable_mask = BIT(0),2184 .hw.init = &(struct clk_init_data){2185 .name = "mdss_byte1_intf_clk",2186 .parent_hws = (const struct clk_hw *[]){ &mdss_byte1_intf_div_clk.clkr.hw },2187 .num_parents = 1,2188 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,2189 .ops = &clk_branch2_ops,2190 },2191 },2192};2193 2194static struct clk_branch mdss_dp_aux_clk = {2195 .halt_reg = 0x2364,2196 .halt_check = BRANCH_HALT,2197 .clkr = {2198 .enable_reg = 0x2364,2199 .enable_mask = BIT(0),2200 .hw.init = &(struct clk_init_data){2201 .name = "mdss_dp_aux_clk",2202 .parent_hws = (const struct clk_hw *[]){ &dp_aux_clk_src.clkr.hw },2203 .num_parents = 1,2204 .flags = CLK_SET_RATE_PARENT,2205 .ops = &clk_branch2_ops,2206 },2207 },2208};2209 2210static struct clk_branch mdss_dp_crypto_clk = {2211 .halt_reg = 0x235c,2212 .halt_check = BRANCH_HALT,2213 .clkr = {2214 .enable_reg = 0x235c,2215 .enable_mask = BIT(0),2216 .hw.init = &(struct clk_init_data){2217 .name = "mdss_dp_crypto_clk",2218 .parent_hws = (const struct clk_hw *[]){ &dp_crypto_clk_src.clkr.hw },2219 .num_parents = 1,2220 .flags = CLK_SET_RATE_PARENT,2221 .ops = &clk_branch2_ops,2222 },2223 },2224};2225 2226static struct clk_branch mdss_dp_gtc_clk = {2227 .halt_reg = 0x2368,2228 .halt_check = BRANCH_HALT,2229 .clkr = {2230 .enable_reg = 0x2368,2231 .enable_mask = BIT(0),2232 .hw.init = &(struct clk_init_data){2233 .name = "mdss_dp_gtc_clk",2234 .parent_hws = (const struct clk_hw *[]){ &dp_gtc_clk_src.clkr.hw },2235 .num_parents = 1,2236 .flags = CLK_SET_RATE_PARENT,2237 .ops = &clk_branch2_ops,2238 },2239 },2240};2241 2242static struct clk_branch mdss_dp_link_clk = {2243 .halt_reg = 0x2354,2244 .halt_check = BRANCH_HALT,2245 .clkr = {2246 .enable_reg = 0x2354,2247 .enable_mask = BIT(0),2248 .hw.init = &(struct clk_init_data){2249 .name = "mdss_dp_link_clk",2250 .parent_hws = (const struct clk_hw *[]){ &dp_link_clk_src.clkr.hw },2251 .num_parents = 1,2252 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,2253 .ops = &clk_branch2_ops,2254 },2255 },2256};2257 2258/* Reset state of MDSS_DP_LINK_INTF_DIV is 0x3 (div-4) */2259static struct clk_branch mdss_dp_link_intf_clk = {2260 .halt_reg = 0x2358,2261 .halt_check = BRANCH_HALT,2262 .clkr = {2263 .enable_reg = 0x2358,2264 .enable_mask = BIT(0),2265 .hw.init = &(struct clk_init_data){2266 .name = "mdss_dp_link_intf_clk",2267 .parent_hws = (const struct clk_hw *[]){ &dp_link_clk_src.clkr.hw },2268 .num_parents = 1,2269 .ops = &clk_branch2_ops,2270 },2271 },2272};2273 2274static struct clk_branch mdss_dp_pixel_clk = {2275 .halt_reg = 0x2360,2276 .halt_check = BRANCH_HALT,2277 .clkr = {2278 .enable_reg = 0x2360,2279 .enable_mask = BIT(0),2280 .hw.init = &(struct clk_init_data){2281 .name = "mdss_dp_pixel_clk",2282 .parent_hws = (const struct clk_hw *[]){ &dp_pixel_clk_src.clkr.hw },2283 .num_parents = 1,2284 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,2285 .ops = &clk_branch2_ops,2286 },2287 },2288};2289 2290static struct clk_branch mdss_esc0_clk = {2291 .halt_reg = 0x2344,2292 .halt_check = BRANCH_HALT,2293 .clkr = {2294 .enable_reg = 0x2344,2295 .enable_mask = BIT(0),2296 .hw.init = &(struct clk_init_data){2297 .name = "mdss_esc0_clk",2298 .parent_hws = (const struct clk_hw *[]){ &esc0_clk_src.clkr.hw },2299 .num_parents = 1,2300 .flags = CLK_SET_RATE_PARENT,2301 .ops = &clk_branch2_ops,2302 },2303 },2304};2305 2306static struct clk_branch mdss_esc1_clk = {2307 .halt_reg = 0x2348,2308 .halt_check = BRANCH_HALT,2309 .clkr = {2310 .enable_reg = 0x2348,2311 .enable_mask = BIT(0),2312 .hw.init = &(struct clk_init_data){2313 .name = "mdss_esc1_clk",2314 .parent_hws = (const struct clk_hw *[]){ &esc1_clk_src.clkr.hw },2315 .num_parents = 1,2316 .flags = CLK_SET_RATE_PARENT,2317 .ops = &clk_branch2_ops,2318 },2319 },2320};2321 2322static struct clk_branch mdss_hdmi_dp_ahb_clk = {2323 .halt_reg = 0x230c,2324 .halt_check = BRANCH_HALT,2325 .clkr = {2326 .enable_reg = 0x230c,2327 .enable_mask = BIT(0),2328 .hw.init = &(struct clk_init_data){2329 .name = "mdss_hdmi_dp_ahb_clk",2330 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },2331 .num_parents = 1,2332 .ops = &clk_branch2_ops,2333 },2334 },2335};2336 2337static struct clk_branch mdss_mdp_clk = {2338 .halt_reg = 0x231c,2339 .halt_check = BRANCH_HALT,2340 .clkr = {2341 .enable_reg = 0x231c,2342 .enable_mask = BIT(0),2343 .hw.init = &(struct clk_init_data){2344 .name = "mdss_mdp_clk",2345 .parent_hws = (const struct clk_hw *[]){ &mdp_clk_src.clkr.hw },2346 .num_parents = 1,2347 .flags = CLK_SET_RATE_PARENT,2348 .ops = &clk_branch2_ops,2349 },2350 },2351};2352 2353static struct clk_branch mdss_pclk0_clk = {2354 .halt_reg = 0x2314,2355 .halt_check = BRANCH_HALT,2356 .clkr = {2357 .enable_reg = 0x2314,2358 .enable_mask = BIT(0),2359 .hw.init = &(struct clk_init_data){2360 .name = "mdss_pclk0_clk",2361 .parent_hws = (const struct clk_hw *[]){ &pclk0_clk_src.clkr.hw },2362 .num_parents = 1,2363 .flags = CLK_SET_RATE_PARENT,2364 .ops = &clk_branch2_ops,2365 },2366 },2367};2368 2369static struct clk_branch mdss_pclk1_clk = {2370 .halt_reg = 0x2318,2371 .halt_check = BRANCH_HALT,2372 .clkr = {2373 .enable_reg = 0x2318,2374 .enable_mask = BIT(0),2375 .hw.init = &(struct clk_init_data){2376 .name = "mdss_pclk1_clk",2377 .parent_hws = (const struct clk_hw *[]){ &pclk1_clk_src.clkr.hw },2378 .num_parents = 1,2379 .flags = CLK_SET_RATE_PARENT,2380 .ops = &clk_branch2_ops,2381 },2382 },2383};2384 2385static struct clk_branch mdss_rot_clk = {2386 .halt_reg = 0x2350,2387 .halt_check = BRANCH_HALT,2388 .clkr = {2389 .enable_reg = 0x2350,2390 .enable_mask = BIT(0),2391 .hw.init = &(struct clk_init_data){2392 .name = "mdss_rot_clk",2393 .parent_hws = (const struct clk_hw *[]){ &rot_clk_src.clkr.hw },2394 .num_parents = 1,2395 .flags = CLK_SET_RATE_PARENT,2396 .ops = &clk_branch2_ops,2397 },2398 },2399};2400 2401static struct clk_branch mdss_vsync_clk = {2402 .halt_reg = 0x2328,2403 .halt_check = BRANCH_HALT,2404 .clkr = {2405 .enable_reg = 0x2328,2406 .enable_mask = BIT(0),2407 .hw.init = &(struct clk_init_data){2408 .name = "mdss_vsync_clk",2409 .parent_hws = (const struct clk_hw *[]){ &vsync_clk_src.clkr.hw },2410 .num_parents = 1,2411 .flags = CLK_SET_RATE_PARENT,2412 .ops = &clk_branch2_ops,2413 },2414 },2415};2416 2417static struct clk_branch mnoc_ahb_clk = {2418 .halt_reg = 0x5024,2419 .halt_check = BRANCH_VOTED,2420 .clkr = {2421 .enable_reg = 0x5024,2422 .enable_mask = BIT(0),2423 .hw.init = &(struct clk_init_data){2424 .name = "mnoc_ahb_clk",2425 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },2426 .num_parents = 1,2427 .flags = CLK_SET_RATE_PARENT,2428 .ops = &clk_branch2_ops,2429 },2430 },2431};2432 2433static struct clk_branch misc_ahb_clk = {2434 .halt_reg = 0x328,2435 .halt_check = BRANCH_HALT,2436 .hwcg_reg = 0x328,2437 .hwcg_bit = 1,2438 .clkr = {2439 .enable_reg = 0x328,2440 .enable_mask = BIT(0),2441 .hw.init = &(struct clk_init_data){2442 .name = "misc_ahb_clk",2443 /*2444 * Dependency to be enabled before the branch is2445 * enabled.2446 */2447 .parent_hws = (const struct clk_hw *[]){ &mnoc_ahb_clk.clkr.hw },2448 .num_parents = 1,2449 .ops = &clk_branch2_ops,2450 },2451 },2452};2453 2454static struct clk_branch misc_cxo_clk = {2455 .halt_reg = 0x324,2456 .halt_check = BRANCH_HALT,2457 .clkr = {2458 .enable_reg = 0x324,2459 .enable_mask = BIT(0),2460 .hw.init = &(struct clk_init_data){2461 .name = "misc_cxo_clk",2462 .parent_data = &(const struct clk_parent_data){2463 .fw_name = "xo",2464 },2465 .num_parents = 1,2466 .ops = &clk_branch2_ops,2467 },2468 },2469};2470 2471static struct clk_branch snoc_dvm_axi_clk = {2472 .halt_reg = 0xe040,2473 .halt_check = BRANCH_HALT,2474 .clkr = {2475 .enable_reg = 0xe040,2476 .enable_mask = BIT(0),2477 .hw.init = &(struct clk_init_data){2478 .name = "snoc_dvm_axi_clk",2479 .ops = &clk_branch2_ops,2480 },2481 },2482};2483 2484static struct clk_branch video_ahb_clk = {2485 .halt_reg = 0x1030,2486 .halt_check = BRANCH_HALT,2487 .hwcg_reg = 0x1030,2488 .hwcg_bit = 1,2489 .clkr = {2490 .enable_reg = 0x1030,2491 .enable_mask = BIT(0),2492 .hw.init = &(struct clk_init_data){2493 .name = "video_ahb_clk",2494 .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },2495 .num_parents = 1,2496 .ops = &clk_branch2_ops,2497 },2498 },2499};2500 2501static struct clk_branch video_axi_clk = {2502 .halt_reg = 0x1034,2503 .halt_check = BRANCH_HALT,2504 .clkr = {2505 .enable_reg = 0x1034,2506 .enable_mask = BIT(0),2507 .hw.init = &(struct clk_init_data){2508 .name = "video_axi_clk",2509 .ops = &clk_branch2_ops,2510 },2511 },2512};2513 2514static struct clk_branch throttle_video_axi_clk = {2515 .halt_reg = 0x118c,2516 .halt_check = BRANCH_HALT,2517 .hwcg_reg = 0x118c,2518 .hwcg_bit = 1,2519 .clkr = {2520 .enable_reg = 0x118c,2521 .enable_mask = BIT(0),2522 .hw.init = &(struct clk_init_data){2523 .name = "throttle_video_axi_clk",2524 .ops = &clk_branch2_ops,2525 },2526 },2527};2528 2529static struct clk_branch video_core_clk = {2530 .halt_reg = 0x1028,2531 .halt_check = BRANCH_HALT,2532 .clkr = {2533 .enable_reg = 0x1028,2534 .enable_mask = BIT(0),2535 .hw.init = &(struct clk_init_data){2536 .name = "video_core_clk",2537 .parent_hws = (const struct clk_hw *[]){ &video_core_clk_src.clkr.hw },2538 .num_parents = 1,2539 .flags = CLK_SET_RATE_PARENT,2540 .ops = &clk_branch2_ops,2541 },2542 },2543};2544 2545static struct clk_branch video_subcore0_clk = {2546 .halt_reg = 0x1048,2547 .halt_check = BRANCH_HALT,2548 .clkr = {2549 .enable_reg = 0x1048,2550 .enable_mask = BIT(0),2551 .hw.init = &(struct clk_init_data){2552 .name = "video_subcore0_clk",2553 .parent_hws = (const struct clk_hw *[]){ &video_core_clk_src.clkr.hw },2554 .num_parents = 1,2555 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,2556 .ops = &clk_branch2_ops,2557 },2558 },2559};2560 2561static struct gdsc venus_gdsc = {2562 .gdscr = 0x1024,2563 .cxcs = (unsigned int[]){ 0x1028, 0x1034, 0x1048 },2564 .cxc_count = 3,2565 .pd = {2566 .name = "venus",2567 },2568 .pwrsts = PWRSTS_OFF_ON,2569};2570 2571static struct gdsc venus_core0_gdsc = {2572 .gdscr = 0x1040,2573 .pd = {2574 .name = "venus_core0",2575 },2576 .parent = &venus_gdsc.pd,2577 .pwrsts = PWRSTS_OFF_ON,2578 .flags = HW_CTRL,2579};2580 2581static struct gdsc mdss_gdsc = {2582 .gdscr = 0x2304,2583 .pd = {2584 .name = "mdss",2585 },2586 .cxcs = (unsigned int []){ 0x2040 },2587 .cxc_count = 1,2588 .pwrsts = PWRSTS_OFF_ON,2589};2590 2591static struct gdsc camss_top_gdsc = {2592 .gdscr = 0x34a0,2593 .pd = {2594 .name = "camss_top",2595 },2596 .pwrsts = PWRSTS_OFF_ON,2597};2598 2599static struct gdsc camss_vfe0_gdsc = {2600 .gdscr = 0x3664,2601 .pd = {2602 .name = "camss_vfe0",2603 },2604 .parent = &camss_top_gdsc.pd,2605 .pwrsts = PWRSTS_OFF_ON,2606};2607 2608static struct gdsc camss_vfe1_gdsc = {2609 .gdscr = 0x3674,2610 .pd = {2611 .name = "camss_vfe1_gdsc",2612 },2613 .parent = &camss_top_gdsc.pd,2614 .pwrsts = PWRSTS_OFF_ON,2615};2616 2617static struct gdsc camss_cpp_gdsc = {2618 .gdscr = 0x36d4,2619 .pd = {2620 .name = "camss_cpp",2621 },2622 .parent = &camss_top_gdsc.pd,2623 .pwrsts = PWRSTS_OFF_ON,2624};2625 2626/* This GDSC seems to hang the whole multimedia subsystem.2627static struct gdsc bimc_smmu_gdsc = {2628 .gdscr = 0xe020,2629 .gds_hw_ctrl = 0xe024,2630 .pd = {2631 .name = "bimc_smmu",2632 },2633 .pwrsts = PWRSTS_OFF_ON,2634 .parent = &bimc_smmu_gdsc.pd,2635 .flags = HW_CTRL,2636};2637*/2638 2639static struct clk_regmap *mmcc_660_clocks[] = {2640 [AHB_CLK_SRC] = &ahb_clk_src.clkr,2641 [BYTE0_CLK_SRC] = &byte0_clk_src.clkr,2642 [BYTE1_CLK_SRC] = &byte1_clk_src.clkr,2643 [CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr,2644 [CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr,2645 [CCI_CLK_SRC] = &cci_clk_src.clkr,2646 [CPP_CLK_SRC] = &cpp_clk_src.clkr,2647 [CSI0_CLK_SRC] = &csi0_clk_src.clkr,2648 [CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,2649 [CSI1_CLK_SRC] = &csi1_clk_src.clkr,2650 [CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr,2651 [CSI2_CLK_SRC] = &csi2_clk_src.clkr,2652 [CSI2PHYTIMER_CLK_SRC] = &csi2phytimer_clk_src.clkr,2653 [CSI3_CLK_SRC] = &csi3_clk_src.clkr,2654 [CSIPHY_CLK_SRC] = &csiphy_clk_src.clkr,2655 [DP_AUX_CLK_SRC] = &dp_aux_clk_src.clkr,2656 [DP_CRYPTO_CLK_SRC] = &dp_crypto_clk_src.clkr,2657 [DP_GTC_CLK_SRC] = &dp_gtc_clk_src.clkr,2658 [DP_LINK_CLK_SRC] = &dp_link_clk_src.clkr,2659 [DP_PIXEL_CLK_SRC] = &dp_pixel_clk_src.clkr,2660 [ESC0_CLK_SRC] = &esc0_clk_src.clkr,2661 [ESC1_CLK_SRC] = &esc1_clk_src.clkr,2662 [JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr,2663 [MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,2664 [MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,2665 [MCLK2_CLK_SRC] = &mclk2_clk_src.clkr,2666 [MCLK3_CLK_SRC] = &mclk3_clk_src.clkr,2667 [MDP_CLK_SRC] = &mdp_clk_src.clkr,2668 [MMPLL0_PLL] = &mmpll0.clkr,2669 [MMPLL10_PLL] = &mmpll10.clkr,2670 [MMPLL3_PLL] = &mmpll3.clkr,2671 [MMPLL4_PLL] = &mmpll4.clkr,2672 [MMPLL5_PLL] = &mmpll5.clkr,2673 [MMPLL6_PLL] = &mmpll6.clkr,2674 [MMPLL7_PLL] = &mmpll7.clkr,2675 [MMPLL8_PLL] = &mmpll8.clkr,2676 [BIMC_SMMU_AHB_CLK] = &bimc_smmu_ahb_clk.clkr,2677 [BIMC_SMMU_AXI_CLK] = &bimc_smmu_axi_clk.clkr,2678 [CAMSS_AHB_CLK] = &camss_ahb_clk.clkr,2679 [CAMSS_CCI_AHB_CLK] = &camss_cci_ahb_clk.clkr,2680 [CAMSS_CCI_CLK] = &camss_cci_clk.clkr,2681 [CAMSS_CPHY_CSID0_CLK] = &camss_cphy_csid0_clk.clkr,2682 [CAMSS_CPHY_CSID1_CLK] = &camss_cphy_csid1_clk.clkr,2683 [CAMSS_CPHY_CSID2_CLK] = &camss_cphy_csid2_clk.clkr,2684 [CAMSS_CPHY_CSID3_CLK] = &camss_cphy_csid3_clk.clkr,2685 [CAMSS_CPP_AHB_CLK] = &camss_cpp_ahb_clk.clkr,2686 [CAMSS_CPP_AXI_CLK] = &camss_cpp_axi_clk.clkr,2687 [CAMSS_CPP_CLK] = &camss_cpp_clk.clkr,2688 [CAMSS_CPP_VBIF_AHB_CLK] = &camss_cpp_vbif_ahb_clk.clkr,2689 [CAMSS_CSI0_AHB_CLK] = &camss_csi0_ahb_clk.clkr,2690 [CAMSS_CSI0_CLK] = &camss_csi0_clk.clkr,2691 [CAMSS_CSI0PHYTIMER_CLK] = &camss_csi0phytimer_clk.clkr,2692 [CAMSS_CSI0PIX_CLK] = &camss_csi0pix_clk.clkr,2693 [CAMSS_CSI0RDI_CLK] = &camss_csi0rdi_clk.clkr,2694 [CAMSS_CSI1_AHB_CLK] = &camss_csi1_ahb_clk.clkr,2695 [CAMSS_CSI1_CLK] = &camss_csi1_clk.clkr,2696 [CAMSS_CSI1PHYTIMER_CLK] = &camss_csi1phytimer_clk.clkr,2697 [CAMSS_CSI1PIX_CLK] = &camss_csi1pix_clk.clkr,2698 [CAMSS_CSI1RDI_CLK] = &camss_csi1rdi_clk.clkr,2699 [CAMSS_CSI2_AHB_CLK] = &camss_csi2_ahb_clk.clkr,2700 [CAMSS_CSI2_CLK] = &camss_csi2_clk.clkr,2701 [CAMSS_CSI2PHYTIMER_CLK] = &camss_csi2phytimer_clk.clkr,2702 [CAMSS_CSI2PIX_CLK] = &camss_csi2pix_clk.clkr,2703 [CAMSS_CSI2RDI_CLK] = &camss_csi2rdi_clk.clkr,2704 [CAMSS_CSI3_AHB_CLK] = &camss_csi3_ahb_clk.clkr,2705 [CAMSS_CSI3_CLK] = &camss_csi3_clk.clkr,2706 [CAMSS_CSI3PIX_CLK] = &camss_csi3pix_clk.clkr,2707 [CAMSS_CSI3RDI_CLK] = &camss_csi3rdi_clk.clkr,2708 [CAMSS_CSI_VFE0_CLK] = &camss_csi_vfe0_clk.clkr,2709 [CAMSS_CSI_VFE1_CLK] = &camss_csi_vfe1_clk.clkr,2710 [CAMSS_CSIPHY0_CLK] = &camss_csiphy0_clk.clkr,2711 [CAMSS_CSIPHY1_CLK] = &camss_csiphy1_clk.clkr,2712 [CAMSS_CSIPHY2_CLK] = &camss_csiphy2_clk.clkr,2713 [CAMSS_GP0_CLK] = &camss_gp0_clk.clkr,2714 [CAMSS_GP1_CLK] = &camss_gp1_clk.clkr,2715 [CAMSS_ISPIF_AHB_CLK] = &camss_ispif_ahb_clk.clkr,2716 [CAMSS_JPEG0_CLK] = &camss_jpeg0_clk.clkr,2717 [CAMSS_JPEG_AHB_CLK] = &camss_jpeg_ahb_clk.clkr,2718 [CAMSS_JPEG_AXI_CLK] = &camss_jpeg_axi_clk.clkr,2719 [CAMSS_MCLK0_CLK] = &camss_mclk0_clk.clkr,2720 [CAMSS_MCLK1_CLK] = &camss_mclk1_clk.clkr,2721 [CAMSS_MCLK2_CLK] = &camss_mclk2_clk.clkr,2722 [CAMSS_MCLK3_CLK] = &camss_mclk3_clk.clkr,2723 [CAMSS_MICRO_AHB_CLK] = &camss_micro_ahb_clk.clkr,2724 [CAMSS_TOP_AHB_CLK] = &camss_top_ahb_clk.clkr,2725 [CAMSS_VFE0_AHB_CLK] = &camss_vfe0_ahb_clk.clkr,2726 [CAMSS_VFE0_CLK] = &camss_vfe0_clk.clkr,2727 [CAMSS_VFE0_STREAM_CLK] = &camss_vfe0_stream_clk.clkr,2728 [CAMSS_VFE1_AHB_CLK] = &camss_vfe1_ahb_clk.clkr,2729 [CAMSS_VFE1_CLK] = &camss_vfe1_clk.clkr,2730 [CAMSS_VFE1_STREAM_CLK] = &camss_vfe1_stream_clk.clkr,2731 [CAMSS_VFE_VBIF_AHB_CLK] = &camss_vfe_vbif_ahb_clk.clkr,2732 [CAMSS_VFE_VBIF_AXI_CLK] = &camss_vfe_vbif_axi_clk.clkr,2733 [CSIPHY_AHB2CRIF_CLK] = &csiphy_ahb2crif_clk.clkr,2734 [MDSS_AHB_CLK] = &mdss_ahb_clk.clkr,2735 [MDSS_AXI_CLK] = &mdss_axi_clk.clkr,2736 [MDSS_BYTE0_CLK] = &mdss_byte0_clk.clkr,2737 [MDSS_BYTE0_INTF_CLK] = &mdss_byte0_intf_clk.clkr,2738 [MDSS_BYTE0_INTF_DIV_CLK] = &mdss_byte0_intf_div_clk.clkr,2739 [MDSS_BYTE1_CLK] = &mdss_byte1_clk.clkr,2740 [MDSS_BYTE1_INTF_CLK] = &mdss_byte1_intf_clk.clkr,2741 [MDSS_DP_AUX_CLK] = &mdss_dp_aux_clk.clkr,2742 [MDSS_DP_CRYPTO_CLK] = &mdss_dp_crypto_clk.clkr,2743 [MDSS_DP_GTC_CLK] = &mdss_dp_gtc_clk.clkr,2744 [MDSS_DP_LINK_CLK] = &mdss_dp_link_clk.clkr,2745 [MDSS_DP_LINK_INTF_CLK] = &mdss_dp_link_intf_clk.clkr,2746 [MDSS_DP_PIXEL_CLK] = &mdss_dp_pixel_clk.clkr,2747 [MDSS_ESC0_CLK] = &mdss_esc0_clk.clkr,2748 [MDSS_ESC1_CLK] = &mdss_esc1_clk.clkr,2749 [MDSS_HDMI_DP_AHB_CLK] = &mdss_hdmi_dp_ahb_clk.clkr,2750 [MDSS_MDP_CLK] = &mdss_mdp_clk.clkr,2751 [MDSS_PCLK0_CLK] = &mdss_pclk0_clk.clkr,2752 [MDSS_PCLK1_CLK] = &mdss_pclk1_clk.clkr,2753 [MDSS_ROT_CLK] = &mdss_rot_clk.clkr,2754 [MDSS_VSYNC_CLK] = &mdss_vsync_clk.clkr,2755 [MISC_AHB_CLK] = &misc_ahb_clk.clkr,2756 [MISC_CXO_CLK] = &misc_cxo_clk.clkr,2757 [MNOC_AHB_CLK] = &mnoc_ahb_clk.clkr,2758 [SNOC_DVM_AXI_CLK] = &snoc_dvm_axi_clk.clkr,2759 [THROTTLE_CAMSS_AXI_CLK] = &throttle_camss_axi_clk.clkr,2760 [THROTTLE_MDSS_AXI_CLK] = &throttle_mdss_axi_clk.clkr,2761 [THROTTLE_VIDEO_AXI_CLK] = &throttle_video_axi_clk.clkr,2762 [VIDEO_AHB_CLK] = &video_ahb_clk.clkr,2763 [VIDEO_AXI_CLK] = &video_axi_clk.clkr,2764 [VIDEO_CORE_CLK] = &video_core_clk.clkr,2765 [VIDEO_SUBCORE0_CLK] = &video_subcore0_clk.clkr,2766 [PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,2767 [PCLK1_CLK_SRC] = &pclk1_clk_src.clkr,2768 [ROT_CLK_SRC] = &rot_clk_src.clkr,2769 [VFE0_CLK_SRC] = &vfe0_clk_src.clkr,2770 [VFE1_CLK_SRC] = &vfe1_clk_src.clkr,2771 [VIDEO_CORE_CLK_SRC] = &video_core_clk_src.clkr,2772 [VSYNC_CLK_SRC] = &vsync_clk_src.clkr,2773 [MDSS_BYTE1_INTF_DIV_CLK] = &mdss_byte1_intf_div_clk.clkr,2774 [AXI_CLK_SRC] = &axi_clk_src.clkr,2775};2776 2777static struct gdsc *mmcc_sdm660_gdscs[] = {2778 [VENUS_GDSC] = &venus_gdsc,2779 [VENUS_CORE0_GDSC] = &venus_core0_gdsc,2780 [MDSS_GDSC] = &mdss_gdsc,2781 [CAMSS_TOP_GDSC] = &camss_top_gdsc,2782 [CAMSS_VFE0_GDSC] = &camss_vfe0_gdsc,2783 [CAMSS_VFE1_GDSC] = &camss_vfe1_gdsc,2784 [CAMSS_CPP_GDSC] = &camss_cpp_gdsc,2785};2786 2787static const struct qcom_reset_map mmcc_660_resets[] = {2788 [CAMSS_MICRO_BCR] = { 0x3490 },2789};2790 2791static const struct regmap_config mmcc_660_regmap_config = {2792 .reg_bits = 32,2793 .reg_stride = 4,2794 .val_bits = 32,2795 .max_register = 0x40000,2796 .fast_io = true,2797};2798 2799static const struct qcom_cc_desc mmcc_660_desc = {2800 .config = &mmcc_660_regmap_config,2801 .clks = mmcc_660_clocks,2802 .num_clks = ARRAY_SIZE(mmcc_660_clocks),2803 .resets = mmcc_660_resets,2804 .num_resets = ARRAY_SIZE(mmcc_660_resets),2805 .gdscs = mmcc_sdm660_gdscs,2806 .num_gdscs = ARRAY_SIZE(mmcc_sdm660_gdscs),2807};2808 2809static const struct of_device_id mmcc_660_match_table[] = {2810 { .compatible = "qcom,mmcc-sdm660" },2811 { .compatible = "qcom,mmcc-sdm630", .data = (void *)1UL },2812 { }2813};2814MODULE_DEVICE_TABLE(of, mmcc_660_match_table);2815 2816static void sdm630_clock_override(void)2817{2818 /* SDM630 has only one DSI */2819 mmcc_660_desc.clks[BYTE1_CLK_SRC] = NULL;2820 mmcc_660_desc.clks[MDSS_BYTE1_CLK] = NULL;2821 mmcc_660_desc.clks[MDSS_BYTE1_INTF_DIV_CLK] = NULL;2822 mmcc_660_desc.clks[MDSS_BYTE1_INTF_CLK] = NULL;2823 mmcc_660_desc.clks[ESC1_CLK_SRC] = NULL;2824 mmcc_660_desc.clks[MDSS_ESC1_CLK] = NULL;2825 mmcc_660_desc.clks[PCLK1_CLK_SRC] = NULL;2826 mmcc_660_desc.clks[MDSS_PCLK1_CLK] = NULL;2827}2828 2829static int mmcc_660_probe(struct platform_device *pdev)2830{2831 struct regmap *regmap;2832 bool is_sdm630;2833 2834 is_sdm630 = !!device_get_match_data(&pdev->dev);2835 2836 regmap = qcom_cc_map(pdev, &mmcc_660_desc);2837 if (IS_ERR(regmap))2838 return PTR_ERR(regmap);2839 2840 if (is_sdm630)2841 sdm630_clock_override();2842 2843 clk_alpha_pll_configure(&mmpll3, regmap, &mmpll3_config);2844 clk_alpha_pll_configure(&mmpll4, regmap, &mmpll4_config);2845 clk_alpha_pll_configure(&mmpll5, regmap, &mmpll5_config);2846 clk_alpha_pll_configure(&mmpll7, regmap, &mmpll7_config);2847 clk_alpha_pll_configure(&mmpll8, regmap, &mmpll8_config);2848 clk_alpha_pll_configure(&mmpll10, regmap, &mmpll10_config);2849 2850 return qcom_cc_really_probe(&pdev->dev, &mmcc_660_desc, regmap);2851}2852 2853static struct platform_driver mmcc_660_driver = {2854 .probe = mmcc_660_probe,2855 .driver = {2856 .name = "mmcc-sdm660",2857 .of_match_table = mmcc_660_match_table,2858 },2859};2860module_platform_driver(mmcc_660_driver);2861 2862MODULE_DESCRIPTION("Qualcomm SDM630/SDM660 MMCC driver");2863MODULE_LICENSE("GPL v2");2864