1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2018-2020, Arm Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. 4*91f16700Schasinglulu * 5*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 6*91f16700Schasinglulu */ 7*91f16700Schasinglulu 8*91f16700Schasinglulu /* 9*91f16700Schasinglulu * ZynqMP system level PM-API functions for clock control. 10*91f16700Schasinglulu */ 11*91f16700Schasinglulu 12*91f16700Schasinglulu #include <stdbool.h> 13*91f16700Schasinglulu #include <string.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu #include <arch_helpers.h> 16*91f16700Schasinglulu #include <lib/mmio.h> 17*91f16700Schasinglulu #include <plat/common/platform.h> 18*91f16700Schasinglulu 19*91f16700Schasinglulu #include "pm_api_clock.h" 20*91f16700Schasinglulu #include "pm_client.h" 21*91f16700Schasinglulu #include "pm_common.h" 22*91f16700Schasinglulu #include "pm_ipi.h" 23*91f16700Schasinglulu #include "zynqmp_pm_api_sys.h" 24*91f16700Schasinglulu 25*91f16700Schasinglulu #define CLK_NODE_MAX (6U) 26*91f16700Schasinglulu 27*91f16700Schasinglulu #define CLK_PARENTS_ID_LEN (16U) 28*91f16700Schasinglulu #define CLK_TOPOLOGY_NODE_OFFSET (16U) 29*91f16700Schasinglulu #define CLK_TOPOLOGY_PAYLOAD_LEN (12U) 30*91f16700Schasinglulu #define CLK_PARENTS_PAYLOAD_LEN (12U) 31*91f16700Schasinglulu #define CLK_TYPE_SHIFT (2U) 32*91f16700Schasinglulu #define CLK_CLKFLAGS_SHIFT (8U) 33*91f16700Schasinglulu #define CLK_TYPEFLAGS_SHIFT (24U) 34*91f16700Schasinglulu #define CLK_TYPEFLAGS2_SHIFT (4U) 35*91f16700Schasinglulu #define CLK_TYPEFLAGS_BITS_MASK (0xFFU) 36*91f16700Schasinglulu #define CLK_TYPEFLAGS2_BITS_MASK (0x0F00U) 37*91f16700Schasinglulu #define CLK_TYPEFLAGS_BITS (8U) 38*91f16700Schasinglulu 39*91f16700Schasinglulu #define CLK_EXTERNAL_PARENT (PARENT_CLK_EXTERNAL << CLK_PARENTS_ID_LEN) 40*91f16700Schasinglulu 41*91f16700Schasinglulu #define NA_MULT (0U) 42*91f16700Schasinglulu #define NA_DIV (0U) 43*91f16700Schasinglulu #define NA_SHIFT (0U) 44*91f16700Schasinglulu #define NA_WIDTH (0U) 45*91f16700Schasinglulu #define NA_CLK_FLAGS (0U) 46*91f16700Schasinglulu #define NA_TYPE_FLAGS (0U) 47*91f16700Schasinglulu 48*91f16700Schasinglulu /* PLL nodes related definitions */ 49*91f16700Schasinglulu #define PLL_PRESRC_MUX_SHIFT (20U) 50*91f16700Schasinglulu #define PLL_PRESRC_MUX_WIDTH (3U) 51*91f16700Schasinglulu #define PLL_POSTSRC_MUX_SHIFT (24U) 52*91f16700Schasinglulu #define PLL_POSTSRC_MUX_WIDTH (3U) 53*91f16700Schasinglulu #define PLL_DIV2_MUX_SHIFT (16U) 54*91f16700Schasinglulu #define PLL_DIV2_MUX_WIDTH (1U) 55*91f16700Schasinglulu #define PLL_BYPASS_MUX_SHIFT (3U) 56*91f16700Schasinglulu #define PLL_BYPASS_MUX_WIDTH (1U) 57*91f16700Schasinglulu 58*91f16700Schasinglulu /* Peripheral nodes related definitions */ 59*91f16700Schasinglulu /* Peripheral Clocks */ 60*91f16700Schasinglulu #define PERIPH_MUX_SHIFT (0U) 61*91f16700Schasinglulu #define PERIPH_MUX_WIDTH (3U) 62*91f16700Schasinglulu #define PERIPH_DIV1_SHIFT (8U) 63*91f16700Schasinglulu #define PERIPH_DIV1_WIDTH (6U) 64*91f16700Schasinglulu #define PERIPH_DIV2_SHIFT (16U) 65*91f16700Schasinglulu #define PERIPH_DIV2_WIDTH (6U) 66*91f16700Schasinglulu #define PERIPH_GATE_SHIFT (24U) 67*91f16700Schasinglulu #define PERIPH_GATE_WIDTH (1U) 68*91f16700Schasinglulu 69*91f16700Schasinglulu #define USB_GATE_SHIFT (25U) 70*91f16700Schasinglulu 71*91f16700Schasinglulu /* External clock related definitions */ 72*91f16700Schasinglulu 73*91f16700Schasinglulu #define EXT_CLK_MIO_DATA(mio) \ 74*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_MIO##mio)] = { \ 75*91f16700Schasinglulu .name = "mio_clk_"#mio, \ 76*91f16700Schasinglulu } 77*91f16700Schasinglulu 78*91f16700Schasinglulu #define EXT_CLK_INDEX(n) (n - CLK_MAX_OUTPUT_CLK) 79*91f16700Schasinglulu 80*91f16700Schasinglulu /* Clock control related definitions */ 81*91f16700Schasinglulu #define BIT_MASK(x, y) (((1U << (y)) - 1) << (x)) 82*91f16700Schasinglulu 83*91f16700Schasinglulu #define ISPLL(id) (id == CLK_APLL_INT || \ 84*91f16700Schasinglulu id == CLK_DPLL_INT || \ 85*91f16700Schasinglulu id == CLK_VPLL_INT || \ 86*91f16700Schasinglulu id == CLK_IOPLL_INT || \ 87*91f16700Schasinglulu id == CLK_RPLL_INT) 88*91f16700Schasinglulu 89*91f16700Schasinglulu 90*91f16700Schasinglulu #define PLLCTRL_BP_MASK BIT(3) 91*91f16700Schasinglulu #define PLLCTRL_RESET_MASK (1U) 92*91f16700Schasinglulu #define PLL_FRAC_OFFSET (8U) 93*91f16700Schasinglulu #define PLL_FRAC_MODE (1U) 94*91f16700Schasinglulu #define PLL_INT_MODE (0U) 95*91f16700Schasinglulu #define PLL_FRAC_MODE_MASK (0x80000000U) 96*91f16700Schasinglulu #define PLL_FRAC_MODE_SHIFT (31U) 97*91f16700Schasinglulu #define PLL_FRAC_DATA_MASK (0xFFFFU) 98*91f16700Schasinglulu #define PLL_FRAC_DATA_SHIFT (0U) 99*91f16700Schasinglulu #define PLL_FBDIV_MASK (0x7F00U) 100*91f16700Schasinglulu #define PLL_FBDIV_WIDTH (7U) 101*91f16700Schasinglulu #define PLL_FBDIV_SHIFT (8U) 102*91f16700Schasinglulu 103*91f16700Schasinglulu #define CLK_PLL_RESET_ASSERT (1U) 104*91f16700Schasinglulu #define CLK_PLL_RESET_RELEASE (2U) 105*91f16700Schasinglulu #define CLK_PLL_RESET_PULSE (CLK_PLL_RESET_ASSERT | CLK_PLL_RESET_RELEASE) 106*91f16700Schasinglulu 107*91f16700Schasinglulu /* Common topology definitions */ 108*91f16700Schasinglulu #define GENERIC_MUX \ 109*91f16700Schasinglulu { \ 110*91f16700Schasinglulu .type = TYPE_MUX, \ 111*91f16700Schasinglulu .offset = PERIPH_MUX_SHIFT, \ 112*91f16700Schasinglulu .width = PERIPH_MUX_WIDTH, \ 113*91f16700Schasinglulu .clkflags = CLK_SET_RATE_NO_REPARENT | \ 114*91f16700Schasinglulu CLK_IS_BASIC, \ 115*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, \ 116*91f16700Schasinglulu .mult = NA_MULT, \ 117*91f16700Schasinglulu .div = NA_DIV, \ 118*91f16700Schasinglulu } 119*91f16700Schasinglulu 120*91f16700Schasinglulu #define IGNORE_UNUSED_MUX \ 121*91f16700Schasinglulu { \ 122*91f16700Schasinglulu .type = TYPE_MUX, \ 123*91f16700Schasinglulu .offset = PERIPH_MUX_SHIFT, \ 124*91f16700Schasinglulu .width = PERIPH_MUX_WIDTH, \ 125*91f16700Schasinglulu .clkflags = CLK_IGNORE_UNUSED | \ 126*91f16700Schasinglulu CLK_SET_RATE_NO_REPARENT | \ 127*91f16700Schasinglulu CLK_IS_BASIC, \ 128*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, \ 129*91f16700Schasinglulu .mult = NA_MULT, \ 130*91f16700Schasinglulu .div = NA_DIV, \ 131*91f16700Schasinglulu } 132*91f16700Schasinglulu 133*91f16700Schasinglulu #define GENERIC_DIV1 \ 134*91f16700Schasinglulu { \ 135*91f16700Schasinglulu .type = TYPE_DIV1, \ 136*91f16700Schasinglulu .offset = PERIPH_DIV1_SHIFT, \ 137*91f16700Schasinglulu .width = PERIPH_DIV1_WIDTH, \ 138*91f16700Schasinglulu .clkflags = CLK_SET_RATE_NO_REPARENT | \ 139*91f16700Schasinglulu CLK_IS_BASIC, \ 140*91f16700Schasinglulu .typeflags = CLK_DIVIDER_ONE_BASED | \ 141*91f16700Schasinglulu CLK_DIVIDER_ALLOW_ZERO, \ 142*91f16700Schasinglulu .mult = NA_MULT, \ 143*91f16700Schasinglulu .div = NA_DIV, \ 144*91f16700Schasinglulu } 145*91f16700Schasinglulu 146*91f16700Schasinglulu #define GENERIC_DIV2 \ 147*91f16700Schasinglulu { \ 148*91f16700Schasinglulu .type = TYPE_DIV2, \ 149*91f16700Schasinglulu .offset = PERIPH_DIV2_SHIFT, \ 150*91f16700Schasinglulu .width = PERIPH_DIV2_WIDTH, \ 151*91f16700Schasinglulu .clkflags = CLK_SET_RATE_NO_REPARENT | \ 152*91f16700Schasinglulu CLK_SET_RATE_PARENT | \ 153*91f16700Schasinglulu CLK_IS_BASIC, \ 154*91f16700Schasinglulu .typeflags = CLK_DIVIDER_ONE_BASED | \ 155*91f16700Schasinglulu CLK_DIVIDER_ALLOW_ZERO, \ 156*91f16700Schasinglulu .mult = NA_MULT, \ 157*91f16700Schasinglulu .div = NA_DIV, \ 158*91f16700Schasinglulu } 159*91f16700Schasinglulu 160*91f16700Schasinglulu #define IGNORE_UNUSED_DIV(id) \ 161*91f16700Schasinglulu { \ 162*91f16700Schasinglulu .type = TYPE_DIV##id, \ 163*91f16700Schasinglulu .offset = PERIPH_DIV##id##_SHIFT, \ 164*91f16700Schasinglulu .width = PERIPH_DIV##id##_WIDTH, \ 165*91f16700Schasinglulu .clkflags = CLK_IGNORE_UNUSED | \ 166*91f16700Schasinglulu CLK_SET_RATE_NO_REPARENT | \ 167*91f16700Schasinglulu CLK_IS_BASIC, \ 168*91f16700Schasinglulu .typeflags = CLK_DIVIDER_ONE_BASED | \ 169*91f16700Schasinglulu CLK_DIVIDER_ALLOW_ZERO, \ 170*91f16700Schasinglulu .mult = NA_MULT, \ 171*91f16700Schasinglulu .div = NA_DIV, \ 172*91f16700Schasinglulu } 173*91f16700Schasinglulu 174*91f16700Schasinglulu #define GENERIC_GATE \ 175*91f16700Schasinglulu { \ 176*91f16700Schasinglulu .type = TYPE_GATE, \ 177*91f16700Schasinglulu .offset = PERIPH_GATE_SHIFT, \ 178*91f16700Schasinglulu .width = PERIPH_GATE_WIDTH, \ 179*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | \ 180*91f16700Schasinglulu CLK_SET_RATE_GATE | \ 181*91f16700Schasinglulu CLK_IS_BASIC, \ 182*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, \ 183*91f16700Schasinglulu .mult = NA_MULT, \ 184*91f16700Schasinglulu .div = NA_DIV, \ 185*91f16700Schasinglulu } 186*91f16700Schasinglulu 187*91f16700Schasinglulu #define IGNORE_UNUSED_GATE \ 188*91f16700Schasinglulu { \ 189*91f16700Schasinglulu .type = TYPE_GATE, \ 190*91f16700Schasinglulu .offset = PERIPH_GATE_SHIFT, \ 191*91f16700Schasinglulu .width = PERIPH_GATE_WIDTH, \ 192*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | \ 193*91f16700Schasinglulu CLK_IGNORE_UNUSED | \ 194*91f16700Schasinglulu CLK_IS_BASIC, \ 195*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, \ 196*91f16700Schasinglulu .mult = NA_MULT, \ 197*91f16700Schasinglulu .div = NA_DIV, \ 198*91f16700Schasinglulu } 199*91f16700Schasinglulu 200*91f16700Schasinglulu /** 201*91f16700Schasinglulu * struct pm_clock_node - Clock topology node information. 202*91f16700Schasinglulu * @type: Topology type (mux/div1/div2/gate/pll/fixed factor). 203*91f16700Schasinglulu * @offset: Offset in control register. 204*91f16700Schasinglulu * @width: Width of the specific type in control register. 205*91f16700Schasinglulu * @clkflags: Clk specific flags. 206*91f16700Schasinglulu * @typeflags: Type specific flags. 207*91f16700Schasinglulu * @mult: Multiplier for fixed factor. 208*91f16700Schasinglulu * @div: Divisor for fixed factor. 209*91f16700Schasinglulu * 210*91f16700Schasinglulu */ 211*91f16700Schasinglulu struct pm_clock_node { 212*91f16700Schasinglulu uint16_t clkflags; 213*91f16700Schasinglulu uint16_t typeflags; 214*91f16700Schasinglulu uint8_t type; 215*91f16700Schasinglulu uint8_t offset; 216*91f16700Schasinglulu uint8_t width; 217*91f16700Schasinglulu uint8_t mult:4; 218*91f16700Schasinglulu uint8_t div:4; 219*91f16700Schasinglulu }; 220*91f16700Schasinglulu 221*91f16700Schasinglulu /** 222*91f16700Schasinglulu * struct pm_clock - Clock structure. 223*91f16700Schasinglulu * @name: Clock name. 224*91f16700Schasinglulu * @num_nodes: number of nodes. 225*91f16700Schasinglulu * @control_reg: Control register address. 226*91f16700Schasinglulu * @status_reg: Status register address. 227*91f16700Schasinglulu * @parents: Parents for first clock node. Lower byte indicates parent 228*91f16700Schasinglulu * clock id and upper byte indicate flags for that id. 229*91f16700Schasinglulu * @nodes: Clock nodes. 230*91f16700Schasinglulu * 231*91f16700Schasinglulu */ 232*91f16700Schasinglulu struct pm_clock { 233*91f16700Schasinglulu char name[CLK_NAME_LEN]; 234*91f16700Schasinglulu uint8_t num_nodes; 235*91f16700Schasinglulu uint32_t control_reg; 236*91f16700Schasinglulu uint32_t status_reg; 237*91f16700Schasinglulu int32_t (*parents)[]; 238*91f16700Schasinglulu struct pm_clock_node(*nodes)[]; 239*91f16700Schasinglulu }; 240*91f16700Schasinglulu 241*91f16700Schasinglulu /** 242*91f16700Schasinglulu * struct pm_ext_clock - Clock structure. 243*91f16700Schasinglulu * @name: Clock name. 244*91f16700Schasinglulu * 245*91f16700Schasinglulu */ 246*91f16700Schasinglulu struct pm_ext_clock { 247*91f16700Schasinglulu char name[CLK_NAME_LEN]; 248*91f16700Schasinglulu }; 249*91f16700Schasinglulu 250*91f16700Schasinglulu /* PLL Clocks */ 251*91f16700Schasinglulu static struct pm_clock_node generic_pll_nodes[] = { 252*91f16700Schasinglulu { 253*91f16700Schasinglulu .type = TYPE_PLL, 254*91f16700Schasinglulu .offset = NA_SHIFT, 255*91f16700Schasinglulu .width = NA_WIDTH, 256*91f16700Schasinglulu .clkflags = CLK_SET_RATE_NO_REPARENT, 257*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 258*91f16700Schasinglulu .mult = NA_MULT, 259*91f16700Schasinglulu .div = NA_DIV, 260*91f16700Schasinglulu }, 261*91f16700Schasinglulu }; 262*91f16700Schasinglulu 263*91f16700Schasinglulu static struct pm_clock_node ignore_unused_pll_nodes[] = { 264*91f16700Schasinglulu { 265*91f16700Schasinglulu .type = TYPE_PLL, 266*91f16700Schasinglulu .offset = NA_SHIFT, 267*91f16700Schasinglulu .width = NA_WIDTH, 268*91f16700Schasinglulu .clkflags = CLK_IGNORE_UNUSED | CLK_SET_RATE_NO_REPARENT, 269*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 270*91f16700Schasinglulu .mult = NA_MULT, 271*91f16700Schasinglulu .div = NA_DIV, 272*91f16700Schasinglulu }, 273*91f16700Schasinglulu }; 274*91f16700Schasinglulu 275*91f16700Schasinglulu static struct pm_clock_node generic_pll_pre_src_nodes[] = { 276*91f16700Schasinglulu { 277*91f16700Schasinglulu .type = TYPE_MUX, 278*91f16700Schasinglulu .offset = PLL_PRESRC_MUX_SHIFT, 279*91f16700Schasinglulu .width = PLL_PRESRC_MUX_WIDTH, 280*91f16700Schasinglulu .clkflags = CLK_IS_BASIC, 281*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 282*91f16700Schasinglulu .mult = NA_MULT, 283*91f16700Schasinglulu .div = NA_DIV, 284*91f16700Schasinglulu }, 285*91f16700Schasinglulu }; 286*91f16700Schasinglulu 287*91f16700Schasinglulu static struct pm_clock_node generic_pll_half_nodes[] = { 288*91f16700Schasinglulu { 289*91f16700Schasinglulu .type = TYPE_FIXEDFACTOR, 290*91f16700Schasinglulu .offset = NA_SHIFT, 291*91f16700Schasinglulu .width = NA_WIDTH, 292*91f16700Schasinglulu .clkflags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT, 293*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 294*91f16700Schasinglulu .mult = 1, 295*91f16700Schasinglulu .div = 2, 296*91f16700Schasinglulu }, 297*91f16700Schasinglulu }; 298*91f16700Schasinglulu 299*91f16700Schasinglulu static struct pm_clock_node generic_pll_int_nodes[] = { 300*91f16700Schasinglulu { 301*91f16700Schasinglulu .type = TYPE_MUX, 302*91f16700Schasinglulu .offset = PLL_DIV2_MUX_SHIFT, 303*91f16700Schasinglulu .width = PLL_DIV2_MUX_WIDTH, 304*91f16700Schasinglulu .clkflags = CLK_SET_RATE_NO_REPARENT | 305*91f16700Schasinglulu CLK_SET_RATE_PARENT | 306*91f16700Schasinglulu CLK_IS_BASIC, 307*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 308*91f16700Schasinglulu .mult = NA_MULT, 309*91f16700Schasinglulu .div = NA_DIV, 310*91f16700Schasinglulu }, 311*91f16700Schasinglulu }; 312*91f16700Schasinglulu 313*91f16700Schasinglulu static struct pm_clock_node generic_pll_post_src_nodes[] = { 314*91f16700Schasinglulu { 315*91f16700Schasinglulu .type = TYPE_MUX, 316*91f16700Schasinglulu .offset = PLL_POSTSRC_MUX_SHIFT, 317*91f16700Schasinglulu .width = PLL_POSTSRC_MUX_WIDTH, 318*91f16700Schasinglulu .clkflags = CLK_IS_BASIC, 319*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 320*91f16700Schasinglulu .mult = NA_MULT, 321*91f16700Schasinglulu .div = NA_DIV, 322*91f16700Schasinglulu }, 323*91f16700Schasinglulu }; 324*91f16700Schasinglulu 325*91f16700Schasinglulu static struct pm_clock_node generic_pll_system_nodes[] = { 326*91f16700Schasinglulu { 327*91f16700Schasinglulu .type = TYPE_MUX, 328*91f16700Schasinglulu .offset = PLL_BYPASS_MUX_SHIFT, 329*91f16700Schasinglulu .width = PLL_BYPASS_MUX_WIDTH, 330*91f16700Schasinglulu .clkflags = CLK_SET_RATE_NO_REPARENT | 331*91f16700Schasinglulu CLK_SET_RATE_PARENT | 332*91f16700Schasinglulu CLK_IS_BASIC, 333*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 334*91f16700Schasinglulu .mult = NA_MULT, 335*91f16700Schasinglulu .div = NA_DIV, 336*91f16700Schasinglulu }, 337*91f16700Schasinglulu }; 338*91f16700Schasinglulu 339*91f16700Schasinglulu static struct pm_clock_node acpu_nodes[] = { 340*91f16700Schasinglulu { 341*91f16700Schasinglulu .type = TYPE_MUX, 342*91f16700Schasinglulu .offset = PERIPH_MUX_SHIFT, 343*91f16700Schasinglulu .width = PERIPH_MUX_WIDTH, 344*91f16700Schasinglulu .clkflags = CLK_SET_RATE_NO_REPARENT | CLK_IS_BASIC, 345*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 346*91f16700Schasinglulu .mult = NA_MULT, 347*91f16700Schasinglulu .div = NA_DIV, 348*91f16700Schasinglulu }, 349*91f16700Schasinglulu { 350*91f16700Schasinglulu .type = TYPE_DIV1, 351*91f16700Schasinglulu .offset = PERIPH_DIV1_SHIFT, 352*91f16700Schasinglulu .width = PERIPH_DIV1_WIDTH, 353*91f16700Schasinglulu .clkflags = CLK_IS_BASIC, 354*91f16700Schasinglulu .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, 355*91f16700Schasinglulu .mult = NA_MULT, 356*91f16700Schasinglulu .div = NA_DIV, 357*91f16700Schasinglulu }, 358*91f16700Schasinglulu }; 359*91f16700Schasinglulu 360*91f16700Schasinglulu static struct pm_clock_node generic_mux_div_nodes[] = { 361*91f16700Schasinglulu GENERIC_MUX, 362*91f16700Schasinglulu GENERIC_DIV1, 363*91f16700Schasinglulu }; 364*91f16700Schasinglulu 365*91f16700Schasinglulu static struct pm_clock_node generic_mux_div_gate_nodes[] = { 366*91f16700Schasinglulu GENERIC_MUX, 367*91f16700Schasinglulu GENERIC_DIV1, 368*91f16700Schasinglulu GENERIC_GATE, 369*91f16700Schasinglulu }; 370*91f16700Schasinglulu 371*91f16700Schasinglulu static struct pm_clock_node generic_mux_div_unused_gate_nodes[] = { 372*91f16700Schasinglulu GENERIC_MUX, 373*91f16700Schasinglulu GENERIC_DIV1, 374*91f16700Schasinglulu IGNORE_UNUSED_GATE, 375*91f16700Schasinglulu }; 376*91f16700Schasinglulu 377*91f16700Schasinglulu static struct pm_clock_node generic_mux_div_div_gate_nodes[] = { 378*91f16700Schasinglulu GENERIC_MUX, 379*91f16700Schasinglulu GENERIC_DIV1, 380*91f16700Schasinglulu GENERIC_DIV2, 381*91f16700Schasinglulu GENERIC_GATE, 382*91f16700Schasinglulu }; 383*91f16700Schasinglulu 384*91f16700Schasinglulu static struct pm_clock_node dp_audio_video_ref_nodes[] = { 385*91f16700Schasinglulu { 386*91f16700Schasinglulu .type = TYPE_MUX, 387*91f16700Schasinglulu .offset = PERIPH_MUX_SHIFT, 388*91f16700Schasinglulu .width = PERIPH_MUX_WIDTH, 389*91f16700Schasinglulu .clkflags = CLK_SET_RATE_NO_REPARENT | 390*91f16700Schasinglulu CLK_SET_RATE_PARENT | CLK_IS_BASIC, 391*91f16700Schasinglulu .typeflags = CLK_FRAC, 392*91f16700Schasinglulu .mult = NA_MULT, 393*91f16700Schasinglulu .div = NA_DIV, 394*91f16700Schasinglulu }, 395*91f16700Schasinglulu { 396*91f16700Schasinglulu .type = TYPE_DIV1, 397*91f16700Schasinglulu .offset = PERIPH_DIV1_SHIFT, 398*91f16700Schasinglulu .width = PERIPH_DIV1_WIDTH, 399*91f16700Schasinglulu .clkflags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT | 400*91f16700Schasinglulu CLK_IS_BASIC, 401*91f16700Schasinglulu .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO | 402*91f16700Schasinglulu CLK_FRAC, 403*91f16700Schasinglulu .mult = NA_MULT, 404*91f16700Schasinglulu .div = NA_DIV, 405*91f16700Schasinglulu }, 406*91f16700Schasinglulu { 407*91f16700Schasinglulu .type = TYPE_DIV2, 408*91f16700Schasinglulu .offset = PERIPH_DIV2_SHIFT, 409*91f16700Schasinglulu .width = PERIPH_DIV2_WIDTH, 410*91f16700Schasinglulu .clkflags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT | 411*91f16700Schasinglulu CLK_IS_BASIC, 412*91f16700Schasinglulu .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO | 413*91f16700Schasinglulu CLK_FRAC, 414*91f16700Schasinglulu .mult = NA_MULT, 415*91f16700Schasinglulu .div = NA_DIV, 416*91f16700Schasinglulu }, 417*91f16700Schasinglulu { 418*91f16700Schasinglulu .type = TYPE_GATE, 419*91f16700Schasinglulu .offset = PERIPH_GATE_SHIFT, 420*91f16700Schasinglulu .width = PERIPH_GATE_WIDTH, 421*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | 422*91f16700Schasinglulu CLK_SET_RATE_GATE | 423*91f16700Schasinglulu CLK_IS_BASIC, 424*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 425*91f16700Schasinglulu .mult = NA_MULT, 426*91f16700Schasinglulu .div = NA_DIV, 427*91f16700Schasinglulu }, 428*91f16700Schasinglulu }; 429*91f16700Schasinglulu 430*91f16700Schasinglulu static struct pm_clock_node usb_nodes[] = { 431*91f16700Schasinglulu GENERIC_MUX, 432*91f16700Schasinglulu GENERIC_DIV1, 433*91f16700Schasinglulu GENERIC_DIV2, 434*91f16700Schasinglulu { 435*91f16700Schasinglulu .type = TYPE_GATE, 436*91f16700Schasinglulu .offset = USB_GATE_SHIFT, 437*91f16700Schasinglulu .width = PERIPH_GATE_WIDTH, 438*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC | 439*91f16700Schasinglulu CLK_SET_RATE_GATE, 440*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 441*91f16700Schasinglulu .mult = NA_MULT, 442*91f16700Schasinglulu .div = NA_DIV, 443*91f16700Schasinglulu }, 444*91f16700Schasinglulu }; 445*91f16700Schasinglulu 446*91f16700Schasinglulu static struct pm_clock_node generic_domain_crossing_nodes[] = { 447*91f16700Schasinglulu { 448*91f16700Schasinglulu .type = TYPE_DIV1, 449*91f16700Schasinglulu .offset = 8, 450*91f16700Schasinglulu .width = 6, 451*91f16700Schasinglulu .clkflags = CLK_IS_BASIC, 452*91f16700Schasinglulu .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, 453*91f16700Schasinglulu .mult = NA_MULT, 454*91f16700Schasinglulu .div = NA_DIV, 455*91f16700Schasinglulu }, 456*91f16700Schasinglulu }; 457*91f16700Schasinglulu 458*91f16700Schasinglulu static struct pm_clock_node rpll_to_fpd_nodes[] = { 459*91f16700Schasinglulu { 460*91f16700Schasinglulu .type = TYPE_DIV1, 461*91f16700Schasinglulu .offset = 8, 462*91f16700Schasinglulu .width = 6, 463*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC, 464*91f16700Schasinglulu .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, 465*91f16700Schasinglulu .mult = NA_MULT, 466*91f16700Schasinglulu .div = NA_DIV, 467*91f16700Schasinglulu }, 468*91f16700Schasinglulu }; 469*91f16700Schasinglulu 470*91f16700Schasinglulu static struct pm_clock_node acpu_half_nodes[] = { 471*91f16700Schasinglulu { 472*91f16700Schasinglulu .type = TYPE_FIXEDFACTOR, 473*91f16700Schasinglulu .offset = 0, 474*91f16700Schasinglulu .width = 1, 475*91f16700Schasinglulu .clkflags = 0, 476*91f16700Schasinglulu .typeflags = 0, 477*91f16700Schasinglulu .mult = 1, 478*91f16700Schasinglulu .div = 2, 479*91f16700Schasinglulu }, 480*91f16700Schasinglulu { 481*91f16700Schasinglulu .type = TYPE_GATE, 482*91f16700Schasinglulu .offset = 25, 483*91f16700Schasinglulu .width = PERIPH_GATE_WIDTH, 484*91f16700Schasinglulu .clkflags = CLK_IGNORE_UNUSED | 485*91f16700Schasinglulu CLK_SET_RATE_PARENT | 486*91f16700Schasinglulu CLK_IS_BASIC, 487*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 488*91f16700Schasinglulu .mult = NA_MULT, 489*91f16700Schasinglulu .div = NA_DIV, 490*91f16700Schasinglulu }, 491*91f16700Schasinglulu }; 492*91f16700Schasinglulu 493*91f16700Schasinglulu static struct pm_clock_node acpu_full_nodes[] = { 494*91f16700Schasinglulu { 495*91f16700Schasinglulu .type = TYPE_GATE, 496*91f16700Schasinglulu .offset = 24, 497*91f16700Schasinglulu .width = PERIPH_GATE_WIDTH, 498*91f16700Schasinglulu .clkflags = CLK_IGNORE_UNUSED | 499*91f16700Schasinglulu CLK_SET_RATE_PARENT | 500*91f16700Schasinglulu CLK_IS_BASIC, 501*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 502*91f16700Schasinglulu .mult = NA_MULT, 503*91f16700Schasinglulu .div = NA_DIV, 504*91f16700Schasinglulu }, 505*91f16700Schasinglulu }; 506*91f16700Schasinglulu 507*91f16700Schasinglulu static struct pm_clock_node wdt_nodes[] = { 508*91f16700Schasinglulu { 509*91f16700Schasinglulu .type = TYPE_MUX, 510*91f16700Schasinglulu .offset = 0, 511*91f16700Schasinglulu .width = 1, 512*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | 513*91f16700Schasinglulu CLK_SET_RATE_NO_REPARENT | 514*91f16700Schasinglulu CLK_IS_BASIC, 515*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 516*91f16700Schasinglulu .mult = NA_MULT, 517*91f16700Schasinglulu .div = NA_DIV, 518*91f16700Schasinglulu }, 519*91f16700Schasinglulu }; 520*91f16700Schasinglulu 521*91f16700Schasinglulu static struct pm_clock_node ddr_nodes[] = { 522*91f16700Schasinglulu GENERIC_MUX, 523*91f16700Schasinglulu { 524*91f16700Schasinglulu .type = TYPE_DIV1, 525*91f16700Schasinglulu .offset = 8, 526*91f16700Schasinglulu .width = 6, 527*91f16700Schasinglulu .clkflags = CLK_IS_BASIC | CLK_IS_CRITICAL, 528*91f16700Schasinglulu .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, 529*91f16700Schasinglulu .mult = NA_MULT, 530*91f16700Schasinglulu .div = NA_DIV, 531*91f16700Schasinglulu }, 532*91f16700Schasinglulu }; 533*91f16700Schasinglulu 534*91f16700Schasinglulu static struct pm_clock_node pl_nodes[] = { 535*91f16700Schasinglulu GENERIC_MUX, 536*91f16700Schasinglulu { 537*91f16700Schasinglulu .type = TYPE_DIV1, 538*91f16700Schasinglulu .offset = PERIPH_DIV1_SHIFT, 539*91f16700Schasinglulu .width = PERIPH_DIV1_WIDTH, 540*91f16700Schasinglulu .clkflags = CLK_IS_BASIC, 541*91f16700Schasinglulu .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, 542*91f16700Schasinglulu .mult = NA_MULT, 543*91f16700Schasinglulu .div = NA_DIV, 544*91f16700Schasinglulu }, 545*91f16700Schasinglulu { 546*91f16700Schasinglulu .type = TYPE_DIV2, 547*91f16700Schasinglulu .offset = PERIPH_DIV2_SHIFT, 548*91f16700Schasinglulu .width = PERIPH_DIV2_WIDTH, 549*91f16700Schasinglulu .clkflags = CLK_IS_BASIC | CLK_SET_RATE_PARENT, 550*91f16700Schasinglulu .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, 551*91f16700Schasinglulu .mult = NA_MULT, 552*91f16700Schasinglulu .div = NA_DIV, 553*91f16700Schasinglulu }, 554*91f16700Schasinglulu { 555*91f16700Schasinglulu .type = TYPE_GATE, 556*91f16700Schasinglulu .offset = PERIPH_GATE_SHIFT, 557*91f16700Schasinglulu .width = PERIPH_GATE_WIDTH, 558*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC, 559*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 560*91f16700Schasinglulu .mult = NA_MULT, 561*91f16700Schasinglulu .div = NA_DIV, 562*91f16700Schasinglulu }, 563*91f16700Schasinglulu }; 564*91f16700Schasinglulu 565*91f16700Schasinglulu static struct pm_clock_node gpu_pp0_nodes[] = { 566*91f16700Schasinglulu { 567*91f16700Schasinglulu .type = TYPE_GATE, 568*91f16700Schasinglulu .offset = 25, 569*91f16700Schasinglulu .width = PERIPH_GATE_WIDTH, 570*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC, 571*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 572*91f16700Schasinglulu .mult = NA_MULT, 573*91f16700Schasinglulu .div = NA_DIV, 574*91f16700Schasinglulu }, 575*91f16700Schasinglulu }; 576*91f16700Schasinglulu 577*91f16700Schasinglulu static struct pm_clock_node gpu_pp1_nodes[] = { 578*91f16700Schasinglulu { 579*91f16700Schasinglulu .type = TYPE_GATE, 580*91f16700Schasinglulu .offset = 26, 581*91f16700Schasinglulu .width = PERIPH_GATE_WIDTH, 582*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC, 583*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 584*91f16700Schasinglulu .mult = NA_MULT, 585*91f16700Schasinglulu .div = NA_DIV, 586*91f16700Schasinglulu }, 587*91f16700Schasinglulu }; 588*91f16700Schasinglulu 589*91f16700Schasinglulu static struct pm_clock_node gem_ref_ungated_nodes[] = { 590*91f16700Schasinglulu GENERIC_MUX, 591*91f16700Schasinglulu { 592*91f16700Schasinglulu .type = TYPE_DIV1, 593*91f16700Schasinglulu .offset = 8, 594*91f16700Schasinglulu .width = 6, 595*91f16700Schasinglulu .clkflags = CLK_SET_RATE_NO_REPARENT | CLK_IS_BASIC, 596*91f16700Schasinglulu .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, 597*91f16700Schasinglulu .mult = NA_MULT, 598*91f16700Schasinglulu .div = NA_DIV, 599*91f16700Schasinglulu }, 600*91f16700Schasinglulu { 601*91f16700Schasinglulu .type = TYPE_DIV2, 602*91f16700Schasinglulu .offset = 16, 603*91f16700Schasinglulu .width = 6, 604*91f16700Schasinglulu .clkflags = CLK_SET_RATE_NO_REPARENT | CLK_IS_BASIC | 605*91f16700Schasinglulu CLK_SET_RATE_PARENT, 606*91f16700Schasinglulu .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, 607*91f16700Schasinglulu .mult = NA_MULT, 608*91f16700Schasinglulu .div = NA_DIV, 609*91f16700Schasinglulu }, 610*91f16700Schasinglulu }; 611*91f16700Schasinglulu 612*91f16700Schasinglulu static struct pm_clock_node gem0_ref_nodes[] = { 613*91f16700Schasinglulu { 614*91f16700Schasinglulu .type = TYPE_MUX, 615*91f16700Schasinglulu .offset = 1, 616*91f16700Schasinglulu .width = 1, 617*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | 618*91f16700Schasinglulu CLK_SET_RATE_NO_REPARENT | 619*91f16700Schasinglulu CLK_IS_BASIC, 620*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 621*91f16700Schasinglulu .mult = NA_MULT, 622*91f16700Schasinglulu .div = NA_DIV, 623*91f16700Schasinglulu }, 624*91f16700Schasinglulu }; 625*91f16700Schasinglulu 626*91f16700Schasinglulu static struct pm_clock_node gem1_ref_nodes[] = { 627*91f16700Schasinglulu { 628*91f16700Schasinglulu .type = TYPE_MUX, 629*91f16700Schasinglulu .offset = 6, 630*91f16700Schasinglulu .width = 1, 631*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | 632*91f16700Schasinglulu CLK_SET_RATE_NO_REPARENT | 633*91f16700Schasinglulu CLK_IS_BASIC, 634*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 635*91f16700Schasinglulu .mult = NA_MULT, 636*91f16700Schasinglulu .div = NA_DIV, 637*91f16700Schasinglulu }, 638*91f16700Schasinglulu }; 639*91f16700Schasinglulu 640*91f16700Schasinglulu static struct pm_clock_node gem2_ref_nodes[] = { 641*91f16700Schasinglulu { 642*91f16700Schasinglulu .type = TYPE_MUX, 643*91f16700Schasinglulu .offset = 11, 644*91f16700Schasinglulu .width = 1, 645*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | 646*91f16700Schasinglulu CLK_SET_RATE_NO_REPARENT | 647*91f16700Schasinglulu CLK_IS_BASIC, 648*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 649*91f16700Schasinglulu .mult = NA_MULT, 650*91f16700Schasinglulu .div = NA_DIV, 651*91f16700Schasinglulu }, 652*91f16700Schasinglulu }; 653*91f16700Schasinglulu 654*91f16700Schasinglulu static struct pm_clock_node gem3_ref_nodes[] = { 655*91f16700Schasinglulu { 656*91f16700Schasinglulu .type = TYPE_MUX, 657*91f16700Schasinglulu .offset = 16, 658*91f16700Schasinglulu .width = 1, 659*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | 660*91f16700Schasinglulu CLK_SET_RATE_NO_REPARENT | 661*91f16700Schasinglulu CLK_IS_BASIC, 662*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 663*91f16700Schasinglulu .mult = NA_MULT, 664*91f16700Schasinglulu .div = NA_DIV, 665*91f16700Schasinglulu }, 666*91f16700Schasinglulu }; 667*91f16700Schasinglulu 668*91f16700Schasinglulu static struct pm_clock_node gem_tx_nodes[] = { 669*91f16700Schasinglulu { 670*91f16700Schasinglulu .type = TYPE_GATE, 671*91f16700Schasinglulu .offset = 25, 672*91f16700Schasinglulu .width = PERIPH_GATE_WIDTH, 673*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC, 674*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 675*91f16700Schasinglulu .mult = NA_MULT, 676*91f16700Schasinglulu .div = NA_DIV, 677*91f16700Schasinglulu }, 678*91f16700Schasinglulu }; 679*91f16700Schasinglulu 680*91f16700Schasinglulu static struct pm_clock_node gem_rx_nodes[] = { 681*91f16700Schasinglulu { 682*91f16700Schasinglulu .type = TYPE_GATE, 683*91f16700Schasinglulu .offset = 26, 684*91f16700Schasinglulu .width = PERIPH_GATE_WIDTH, 685*91f16700Schasinglulu .clkflags = CLK_IS_BASIC, 686*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 687*91f16700Schasinglulu .mult = NA_MULT, 688*91f16700Schasinglulu .div = NA_DIV, 689*91f16700Schasinglulu }, 690*91f16700Schasinglulu }; 691*91f16700Schasinglulu 692*91f16700Schasinglulu static struct pm_clock_node gem_tsu_nodes[] = { 693*91f16700Schasinglulu { 694*91f16700Schasinglulu .type = TYPE_MUX, 695*91f16700Schasinglulu .offset = 20, 696*91f16700Schasinglulu .width = 2, 697*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | 698*91f16700Schasinglulu CLK_SET_RATE_NO_REPARENT | 699*91f16700Schasinglulu CLK_IS_BASIC, 700*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 701*91f16700Schasinglulu .mult = NA_MULT, 702*91f16700Schasinglulu .div = NA_DIV, 703*91f16700Schasinglulu }, 704*91f16700Schasinglulu }; 705*91f16700Schasinglulu 706*91f16700Schasinglulu static struct pm_clock_node can0_mio_nodes[] = { 707*91f16700Schasinglulu { 708*91f16700Schasinglulu .type = TYPE_MUX, 709*91f16700Schasinglulu .offset = 0, 710*91f16700Schasinglulu .width = 7, 711*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | 712*91f16700Schasinglulu CLK_SET_RATE_NO_REPARENT | 713*91f16700Schasinglulu CLK_IS_BASIC, 714*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 715*91f16700Schasinglulu .mult = NA_MULT, 716*91f16700Schasinglulu .div = NA_DIV, 717*91f16700Schasinglulu }, 718*91f16700Schasinglulu }; 719*91f16700Schasinglulu 720*91f16700Schasinglulu static struct pm_clock_node can1_mio_nodes[] = { 721*91f16700Schasinglulu { 722*91f16700Schasinglulu .type = TYPE_MUX, 723*91f16700Schasinglulu .offset = 15, 724*91f16700Schasinglulu .width = 1, 725*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | 726*91f16700Schasinglulu CLK_SET_RATE_NO_REPARENT | 727*91f16700Schasinglulu CLK_IS_BASIC, 728*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 729*91f16700Schasinglulu .mult = NA_MULT, 730*91f16700Schasinglulu .div = NA_DIV, 731*91f16700Schasinglulu }, 732*91f16700Schasinglulu }; 733*91f16700Schasinglulu 734*91f16700Schasinglulu static struct pm_clock_node can0_nodes[] = { 735*91f16700Schasinglulu { 736*91f16700Schasinglulu .type = TYPE_MUX, 737*91f16700Schasinglulu .offset = 7, 738*91f16700Schasinglulu .width = 1, 739*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | 740*91f16700Schasinglulu CLK_SET_RATE_NO_REPARENT | 741*91f16700Schasinglulu CLK_IS_BASIC, 742*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 743*91f16700Schasinglulu .mult = NA_MULT, 744*91f16700Schasinglulu .div = NA_DIV, 745*91f16700Schasinglulu }, 746*91f16700Schasinglulu }; 747*91f16700Schasinglulu 748*91f16700Schasinglulu static struct pm_clock_node can1_nodes[] = { 749*91f16700Schasinglulu { 750*91f16700Schasinglulu .type = TYPE_MUX, 751*91f16700Schasinglulu .offset = 22, 752*91f16700Schasinglulu .width = 1, 753*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | 754*91f16700Schasinglulu CLK_SET_RATE_NO_REPARENT | 755*91f16700Schasinglulu CLK_IS_BASIC, 756*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 757*91f16700Schasinglulu .mult = NA_MULT, 758*91f16700Schasinglulu .div = NA_DIV, 759*91f16700Schasinglulu }, 760*91f16700Schasinglulu }; 761*91f16700Schasinglulu 762*91f16700Schasinglulu static struct pm_clock_node cpu_r5_core_nodes[] = { 763*91f16700Schasinglulu { 764*91f16700Schasinglulu .type = TYPE_GATE, 765*91f16700Schasinglulu .offset = 25, 766*91f16700Schasinglulu .width = PERIPH_GATE_WIDTH, 767*91f16700Schasinglulu .clkflags = CLK_IGNORE_UNUSED | 768*91f16700Schasinglulu CLK_IS_BASIC, 769*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 770*91f16700Schasinglulu .mult = NA_MULT, 771*91f16700Schasinglulu .div = NA_DIV, 772*91f16700Schasinglulu }, 773*91f16700Schasinglulu }; 774*91f16700Schasinglulu 775*91f16700Schasinglulu static struct pm_clock_node dll_ref_nodes[] = { 776*91f16700Schasinglulu { 777*91f16700Schasinglulu .type = TYPE_MUX, 778*91f16700Schasinglulu .offset = 0, 779*91f16700Schasinglulu .width = 3, 780*91f16700Schasinglulu .clkflags = CLK_SET_RATE_PARENT | 781*91f16700Schasinglulu CLK_SET_RATE_NO_REPARENT | 782*91f16700Schasinglulu CLK_IS_BASIC, 783*91f16700Schasinglulu .typeflags = NA_TYPE_FLAGS, 784*91f16700Schasinglulu .mult = NA_MULT, 785*91f16700Schasinglulu .div = NA_DIV, 786*91f16700Schasinglulu }, 787*91f16700Schasinglulu }; 788*91f16700Schasinglulu 789*91f16700Schasinglulu static struct pm_clock_node timestamp_ref_nodes[] = { 790*91f16700Schasinglulu GENERIC_MUX, 791*91f16700Schasinglulu { 792*91f16700Schasinglulu .type = TYPE_DIV1, 793*91f16700Schasinglulu .offset = 8, 794*91f16700Schasinglulu .width = 6, 795*91f16700Schasinglulu .clkflags = CLK_IS_BASIC, 796*91f16700Schasinglulu .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, 797*91f16700Schasinglulu .mult = NA_MULT, 798*91f16700Schasinglulu .div = NA_DIV, 799*91f16700Schasinglulu }, 800*91f16700Schasinglulu IGNORE_UNUSED_GATE, 801*91f16700Schasinglulu }; 802*91f16700Schasinglulu 803*91f16700Schasinglulu static int32_t can_mio_parents[] = { 804*91f16700Schasinglulu EXT_CLK_MIO0, EXT_CLK_MIO1, EXT_CLK_MIO2, EXT_CLK_MIO3, 805*91f16700Schasinglulu EXT_CLK_MIO4, EXT_CLK_MIO5, EXT_CLK_MIO6, EXT_CLK_MIO7, 806*91f16700Schasinglulu EXT_CLK_MIO8, EXT_CLK_MIO9, EXT_CLK_MIO10, EXT_CLK_MIO11, 807*91f16700Schasinglulu EXT_CLK_MIO12, EXT_CLK_MIO13, EXT_CLK_MIO14, EXT_CLK_MIO15, 808*91f16700Schasinglulu EXT_CLK_MIO16, EXT_CLK_MIO17, EXT_CLK_MIO18, EXT_CLK_MIO19, 809*91f16700Schasinglulu EXT_CLK_MIO20, EXT_CLK_MIO21, EXT_CLK_MIO22, EXT_CLK_MIO23, 810*91f16700Schasinglulu EXT_CLK_MIO24, EXT_CLK_MIO25, EXT_CLK_MIO26, EXT_CLK_MIO27, 811*91f16700Schasinglulu EXT_CLK_MIO28, EXT_CLK_MIO29, EXT_CLK_MIO30, EXT_CLK_MIO31, 812*91f16700Schasinglulu EXT_CLK_MIO32, EXT_CLK_MIO33, EXT_CLK_MIO34, EXT_CLK_MIO35, 813*91f16700Schasinglulu EXT_CLK_MIO36, EXT_CLK_MIO37, EXT_CLK_MIO38, EXT_CLK_MIO39, 814*91f16700Schasinglulu EXT_CLK_MIO40, EXT_CLK_MIO41, EXT_CLK_MIO42, EXT_CLK_MIO43, 815*91f16700Schasinglulu EXT_CLK_MIO44, EXT_CLK_MIO45, EXT_CLK_MIO46, EXT_CLK_MIO47, 816*91f16700Schasinglulu EXT_CLK_MIO48, EXT_CLK_MIO49, EXT_CLK_MIO50, EXT_CLK_MIO51, 817*91f16700Schasinglulu EXT_CLK_MIO52, EXT_CLK_MIO53, EXT_CLK_MIO54, EXT_CLK_MIO55, 818*91f16700Schasinglulu EXT_CLK_MIO56, EXT_CLK_MIO57, EXT_CLK_MIO58, EXT_CLK_MIO59, 819*91f16700Schasinglulu EXT_CLK_MIO60, EXT_CLK_MIO61, EXT_CLK_MIO62, EXT_CLK_MIO63, 820*91f16700Schasinglulu EXT_CLK_MIO64, EXT_CLK_MIO65, EXT_CLK_MIO66, EXT_CLK_MIO67, 821*91f16700Schasinglulu EXT_CLK_MIO68, EXT_CLK_MIO69, EXT_CLK_MIO70, EXT_CLK_MIO71, 822*91f16700Schasinglulu EXT_CLK_MIO72, EXT_CLK_MIO73, EXT_CLK_MIO74, EXT_CLK_MIO75, 823*91f16700Schasinglulu EXT_CLK_MIO76, EXT_CLK_MIO77, CLK_NA_PARENT 824*91f16700Schasinglulu }; 825*91f16700Schasinglulu 826*91f16700Schasinglulu /* Clock array containing clock informaton */ 827*91f16700Schasinglulu static struct pm_clock clocks[] = { 828*91f16700Schasinglulu [CLK_APLL_INT] = { 829*91f16700Schasinglulu .name = "apll_int", 830*91f16700Schasinglulu .control_reg = CRF_APB_APLL_CTRL, 831*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 832*91f16700Schasinglulu .parents = &((int32_t []) {CLK_APLL_PRE_SRC, CLK_NA_PARENT}), 833*91f16700Schasinglulu .nodes = &ignore_unused_pll_nodes, 834*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(ignore_unused_pll_nodes), 835*91f16700Schasinglulu }, 836*91f16700Schasinglulu [CLK_APLL_PRE_SRC] = { 837*91f16700Schasinglulu .name = "apll_pre_src", 838*91f16700Schasinglulu .control_reg = CRF_APB_APLL_CTRL, 839*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 840*91f16700Schasinglulu .parents = &((int32_t []) { 841*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 842*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 843*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 844*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 845*91f16700Schasinglulu EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT, 846*91f16700Schasinglulu EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT, 847*91f16700Schasinglulu EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT, 848*91f16700Schasinglulu EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT, 849*91f16700Schasinglulu CLK_NA_PARENT 850*91f16700Schasinglulu }), 851*91f16700Schasinglulu .nodes = &generic_pll_pre_src_nodes, 852*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_pre_src_nodes), 853*91f16700Schasinglulu }, 854*91f16700Schasinglulu [CLK_APLL_HALF] = { 855*91f16700Schasinglulu .name = "apll_half", 856*91f16700Schasinglulu .control_reg = CRF_APB_APLL_CTRL, 857*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 858*91f16700Schasinglulu .parents = &((int32_t []) {CLK_APLL_INT, CLK_NA_PARENT}), 859*91f16700Schasinglulu .nodes = &generic_pll_half_nodes, 860*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_half_nodes), 861*91f16700Schasinglulu }, 862*91f16700Schasinglulu [CLK_APLL_INT_MUX] = { 863*91f16700Schasinglulu .name = "apll_int_mux", 864*91f16700Schasinglulu .control_reg = CRF_APB_APLL_CTRL, 865*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 866*91f16700Schasinglulu .parents = &((int32_t []) { 867*91f16700Schasinglulu CLK_APLL_INT, 868*91f16700Schasinglulu CLK_APLL_HALF, 869*91f16700Schasinglulu CLK_NA_PARENT 870*91f16700Schasinglulu }), 871*91f16700Schasinglulu .nodes = &generic_pll_int_nodes, 872*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_int_nodes), 873*91f16700Schasinglulu }, 874*91f16700Schasinglulu [CLK_APLL_POST_SRC] = { 875*91f16700Schasinglulu .name = "apll_post_src", 876*91f16700Schasinglulu .control_reg = CRF_APB_APLL_CTRL, 877*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 878*91f16700Schasinglulu .parents = &((int32_t []) { 879*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 880*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 881*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 882*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 883*91f16700Schasinglulu EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT, 884*91f16700Schasinglulu EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT, 885*91f16700Schasinglulu EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT, 886*91f16700Schasinglulu EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT, 887*91f16700Schasinglulu CLK_NA_PARENT 888*91f16700Schasinglulu }), 889*91f16700Schasinglulu .nodes = &generic_pll_post_src_nodes, 890*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_post_src_nodes), 891*91f16700Schasinglulu }, 892*91f16700Schasinglulu [CLK_APLL] = { 893*91f16700Schasinglulu .name = "apll", 894*91f16700Schasinglulu .control_reg = CRF_APB_APLL_CTRL, 895*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 896*91f16700Schasinglulu .parents = &((int32_t []) { 897*91f16700Schasinglulu CLK_APLL_INT_MUX, 898*91f16700Schasinglulu CLK_APLL_POST_SRC, 899*91f16700Schasinglulu CLK_NA_PARENT 900*91f16700Schasinglulu }), 901*91f16700Schasinglulu .nodes = &generic_pll_system_nodes, 902*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_system_nodes), 903*91f16700Schasinglulu }, 904*91f16700Schasinglulu [CLK_DPLL_INT] = { 905*91f16700Schasinglulu .name = "dpll_int", 906*91f16700Schasinglulu .control_reg = CRF_APB_DPLL_CTRL, 907*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 908*91f16700Schasinglulu .parents = &((int32_t []) {CLK_DPLL_PRE_SRC, CLK_NA_PARENT}), 909*91f16700Schasinglulu .nodes = &generic_pll_nodes, 910*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_nodes), 911*91f16700Schasinglulu }, 912*91f16700Schasinglulu [CLK_DPLL_PRE_SRC] = { 913*91f16700Schasinglulu .name = "dpll_pre_src", 914*91f16700Schasinglulu .control_reg = CRF_APB_DPLL_CTRL, 915*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 916*91f16700Schasinglulu .parents = &((int32_t []) { 917*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 918*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 919*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 920*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 921*91f16700Schasinglulu EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT, 922*91f16700Schasinglulu EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT, 923*91f16700Schasinglulu EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT, 924*91f16700Schasinglulu EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT, 925*91f16700Schasinglulu CLK_NA_PARENT 926*91f16700Schasinglulu }), 927*91f16700Schasinglulu .nodes = &generic_pll_pre_src_nodes, 928*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_pre_src_nodes), 929*91f16700Schasinglulu }, 930*91f16700Schasinglulu [CLK_DPLL_HALF] = { 931*91f16700Schasinglulu .name = "dpll_half", 932*91f16700Schasinglulu .control_reg = CRF_APB_DPLL_CTRL, 933*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 934*91f16700Schasinglulu .parents = &((int32_t []) {CLK_DPLL_INT, CLK_NA_PARENT}), 935*91f16700Schasinglulu .nodes = &generic_pll_half_nodes, 936*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_half_nodes), 937*91f16700Schasinglulu }, 938*91f16700Schasinglulu [CLK_DPLL_INT_MUX] = { 939*91f16700Schasinglulu .name = "dpll_int_mux", 940*91f16700Schasinglulu .control_reg = CRF_APB_DPLL_CTRL, 941*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 942*91f16700Schasinglulu .parents = &((int32_t []) { 943*91f16700Schasinglulu CLK_DPLL_INT, 944*91f16700Schasinglulu CLK_DPLL_HALF, 945*91f16700Schasinglulu CLK_NA_PARENT 946*91f16700Schasinglulu }), 947*91f16700Schasinglulu .nodes = &generic_pll_int_nodes, 948*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_int_nodes), 949*91f16700Schasinglulu }, 950*91f16700Schasinglulu [CLK_DPLL_POST_SRC] = { 951*91f16700Schasinglulu .name = "dpll_post_src", 952*91f16700Schasinglulu .control_reg = CRF_APB_DPLL_CTRL, 953*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 954*91f16700Schasinglulu .parents = &((int32_t []) { 955*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 956*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 957*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 958*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 959*91f16700Schasinglulu EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT, 960*91f16700Schasinglulu EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT, 961*91f16700Schasinglulu EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT, 962*91f16700Schasinglulu EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT, 963*91f16700Schasinglulu CLK_NA_PARENT 964*91f16700Schasinglulu }), 965*91f16700Schasinglulu .nodes = &generic_pll_post_src_nodes, 966*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_post_src_nodes), 967*91f16700Schasinglulu }, 968*91f16700Schasinglulu [CLK_DPLL] = { 969*91f16700Schasinglulu .name = "dpll", 970*91f16700Schasinglulu .control_reg = CRF_APB_DPLL_CTRL, 971*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 972*91f16700Schasinglulu .parents = &((int32_t []) { 973*91f16700Schasinglulu CLK_DPLL_INT_MUX, 974*91f16700Schasinglulu CLK_DPLL_POST_SRC, 975*91f16700Schasinglulu CLK_NA_PARENT 976*91f16700Schasinglulu }), 977*91f16700Schasinglulu .nodes = &generic_pll_system_nodes, 978*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_system_nodes), 979*91f16700Schasinglulu }, 980*91f16700Schasinglulu [CLK_VPLL_INT] = { 981*91f16700Schasinglulu .name = "vpll_int", 982*91f16700Schasinglulu .control_reg = CRF_APB_VPLL_CTRL, 983*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 984*91f16700Schasinglulu .parents = &((int32_t []) {CLK_VPLL_PRE_SRC, CLK_NA_PARENT}), 985*91f16700Schasinglulu .nodes = &ignore_unused_pll_nodes, 986*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(ignore_unused_pll_nodes), 987*91f16700Schasinglulu }, 988*91f16700Schasinglulu [CLK_VPLL_PRE_SRC] = { 989*91f16700Schasinglulu .name = "vpll_pre_src", 990*91f16700Schasinglulu .control_reg = CRF_APB_VPLL_CTRL, 991*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 992*91f16700Schasinglulu .parents = &((int32_t []) { 993*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 994*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 995*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 996*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 997*91f16700Schasinglulu EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT, 998*91f16700Schasinglulu EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT, 999*91f16700Schasinglulu EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT, 1000*91f16700Schasinglulu EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT, 1001*91f16700Schasinglulu CLK_NA_PARENT 1002*91f16700Schasinglulu }), 1003*91f16700Schasinglulu .nodes = &generic_pll_pre_src_nodes, 1004*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_pre_src_nodes), 1005*91f16700Schasinglulu }, 1006*91f16700Schasinglulu [CLK_VPLL_HALF] = { 1007*91f16700Schasinglulu .name = "vpll_half", 1008*91f16700Schasinglulu .control_reg = CRF_APB_VPLL_CTRL, 1009*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 1010*91f16700Schasinglulu .parents = &((int32_t []) {CLK_VPLL_INT, CLK_NA_PARENT}), 1011*91f16700Schasinglulu .nodes = &generic_pll_half_nodes, 1012*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_half_nodes), 1013*91f16700Schasinglulu }, 1014*91f16700Schasinglulu [CLK_VPLL_INT_MUX] = { 1015*91f16700Schasinglulu .name = "vpll_int_mux", 1016*91f16700Schasinglulu .control_reg = CRF_APB_VPLL_CTRL, 1017*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 1018*91f16700Schasinglulu .parents = &((int32_t []) { 1019*91f16700Schasinglulu CLK_VPLL_INT, 1020*91f16700Schasinglulu CLK_VPLL_HALF, 1021*91f16700Schasinglulu CLK_NA_PARENT 1022*91f16700Schasinglulu }), 1023*91f16700Schasinglulu .nodes = &generic_pll_int_nodes, 1024*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_int_nodes), 1025*91f16700Schasinglulu }, 1026*91f16700Schasinglulu [CLK_VPLL_POST_SRC] = { 1027*91f16700Schasinglulu .name = "vpll_post_src", 1028*91f16700Schasinglulu .control_reg = CRF_APB_VPLL_CTRL, 1029*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 1030*91f16700Schasinglulu .parents = &((int32_t []) { 1031*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1032*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1033*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1034*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1035*91f16700Schasinglulu EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT, 1036*91f16700Schasinglulu EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT, 1037*91f16700Schasinglulu EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT, 1038*91f16700Schasinglulu EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT, 1039*91f16700Schasinglulu CLK_NA_PARENT 1040*91f16700Schasinglulu }), 1041*91f16700Schasinglulu .nodes = &generic_pll_post_src_nodes, 1042*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_post_src_nodes), 1043*91f16700Schasinglulu }, 1044*91f16700Schasinglulu [CLK_VPLL] = { 1045*91f16700Schasinglulu .name = "vpll", 1046*91f16700Schasinglulu .control_reg = CRF_APB_VPLL_CTRL, 1047*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 1048*91f16700Schasinglulu .parents = &((int32_t []) { 1049*91f16700Schasinglulu CLK_VPLL_INT_MUX, 1050*91f16700Schasinglulu CLK_VPLL_POST_SRC, 1051*91f16700Schasinglulu CLK_NA_PARENT 1052*91f16700Schasinglulu }), 1053*91f16700Schasinglulu .nodes = &generic_pll_system_nodes, 1054*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_system_nodes), 1055*91f16700Schasinglulu }, 1056*91f16700Schasinglulu [CLK_IOPLL_INT] = { 1057*91f16700Schasinglulu .name = "iopll_int", 1058*91f16700Schasinglulu .control_reg = CRL_APB_IOPLL_CTRL, 1059*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 1060*91f16700Schasinglulu .parents = &((int32_t []) {CLK_IOPLL_PRE_SRC, CLK_NA_PARENT}), 1061*91f16700Schasinglulu .nodes = &generic_pll_nodes, 1062*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_nodes), 1063*91f16700Schasinglulu }, 1064*91f16700Schasinglulu [CLK_IOPLL_PRE_SRC] = { 1065*91f16700Schasinglulu .name = "iopll_pre_src", 1066*91f16700Schasinglulu .control_reg = CRL_APB_IOPLL_CTRL, 1067*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 1068*91f16700Schasinglulu .parents = &((int32_t []) { 1069*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1070*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1071*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1072*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1073*91f16700Schasinglulu EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT, 1074*91f16700Schasinglulu EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT, 1075*91f16700Schasinglulu EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT, 1076*91f16700Schasinglulu EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT, 1077*91f16700Schasinglulu CLK_NA_PARENT 1078*91f16700Schasinglulu }), 1079*91f16700Schasinglulu .nodes = &generic_pll_pre_src_nodes, 1080*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_pre_src_nodes), 1081*91f16700Schasinglulu }, 1082*91f16700Schasinglulu [CLK_IOPLL_HALF] = { 1083*91f16700Schasinglulu .name = "iopll_half", 1084*91f16700Schasinglulu .control_reg = CRL_APB_IOPLL_CTRL, 1085*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 1086*91f16700Schasinglulu .parents = &((int32_t []) {CLK_IOPLL_INT, CLK_NA_PARENT}), 1087*91f16700Schasinglulu .nodes = &generic_pll_half_nodes, 1088*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_half_nodes), 1089*91f16700Schasinglulu }, 1090*91f16700Schasinglulu [CLK_IOPLL_INT_MUX] = { 1091*91f16700Schasinglulu .name = "iopll_int_mux", 1092*91f16700Schasinglulu .control_reg = CRL_APB_IOPLL_CTRL, 1093*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 1094*91f16700Schasinglulu .parents = &((int32_t []) { 1095*91f16700Schasinglulu CLK_IOPLL_INT, 1096*91f16700Schasinglulu CLK_IOPLL_HALF, 1097*91f16700Schasinglulu CLK_NA_PARENT 1098*91f16700Schasinglulu }), 1099*91f16700Schasinglulu .nodes = &generic_pll_int_nodes, 1100*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_int_nodes), 1101*91f16700Schasinglulu }, 1102*91f16700Schasinglulu [CLK_IOPLL_POST_SRC] = { 1103*91f16700Schasinglulu .name = "iopll_post_src", 1104*91f16700Schasinglulu .control_reg = CRL_APB_IOPLL_CTRL, 1105*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 1106*91f16700Schasinglulu .parents = &((int32_t []) { 1107*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1108*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1109*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1110*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1111*91f16700Schasinglulu EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT, 1112*91f16700Schasinglulu EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT, 1113*91f16700Schasinglulu EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT, 1114*91f16700Schasinglulu EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT, 1115*91f16700Schasinglulu CLK_NA_PARENT 1116*91f16700Schasinglulu }), 1117*91f16700Schasinglulu .nodes = &generic_pll_post_src_nodes, 1118*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_post_src_nodes), 1119*91f16700Schasinglulu }, 1120*91f16700Schasinglulu [CLK_IOPLL] = { 1121*91f16700Schasinglulu .name = "iopll", 1122*91f16700Schasinglulu .control_reg = CRL_APB_IOPLL_CTRL, 1123*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 1124*91f16700Schasinglulu .parents = &((int32_t []) { 1125*91f16700Schasinglulu CLK_IOPLL_INT_MUX, 1126*91f16700Schasinglulu CLK_IOPLL_POST_SRC, 1127*91f16700Schasinglulu CLK_NA_PARENT 1128*91f16700Schasinglulu }), 1129*91f16700Schasinglulu .nodes = &generic_pll_system_nodes, 1130*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_system_nodes), 1131*91f16700Schasinglulu }, 1132*91f16700Schasinglulu [CLK_RPLL_INT] = { 1133*91f16700Schasinglulu .name = "rpll_int", 1134*91f16700Schasinglulu .control_reg = CRL_APB_RPLL_CTRL, 1135*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 1136*91f16700Schasinglulu .parents = &((int32_t []) {CLK_RPLL_PRE_SRC, CLK_NA_PARENT}), 1137*91f16700Schasinglulu .nodes = &generic_pll_nodes, 1138*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_nodes), 1139*91f16700Schasinglulu }, 1140*91f16700Schasinglulu [CLK_RPLL_PRE_SRC] = { 1141*91f16700Schasinglulu .name = "rpll_pre_src", 1142*91f16700Schasinglulu .control_reg = CRL_APB_RPLL_CTRL, 1143*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 1144*91f16700Schasinglulu .parents = &((int32_t []) { 1145*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1146*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1147*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1148*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1149*91f16700Schasinglulu EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT, 1150*91f16700Schasinglulu EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT, 1151*91f16700Schasinglulu EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT, 1152*91f16700Schasinglulu EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT, 1153*91f16700Schasinglulu CLK_NA_PARENT 1154*91f16700Schasinglulu }), 1155*91f16700Schasinglulu 1156*91f16700Schasinglulu .nodes = &generic_pll_pre_src_nodes, 1157*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_pre_src_nodes), 1158*91f16700Schasinglulu }, 1159*91f16700Schasinglulu [CLK_RPLL_HALF] = { 1160*91f16700Schasinglulu .name = "rpll_half", 1161*91f16700Schasinglulu .control_reg = CRL_APB_RPLL_CTRL, 1162*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 1163*91f16700Schasinglulu .parents = &((int32_t []) {CLK_RPLL_INT, CLK_NA_PARENT}), 1164*91f16700Schasinglulu .nodes = &generic_pll_half_nodes, 1165*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_half_nodes), 1166*91f16700Schasinglulu }, 1167*91f16700Schasinglulu [CLK_RPLL_INT_MUX] = { 1168*91f16700Schasinglulu .name = "rpll_int_mux", 1169*91f16700Schasinglulu .control_reg = CRL_APB_RPLL_CTRL, 1170*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 1171*91f16700Schasinglulu .parents = &((int32_t []) { 1172*91f16700Schasinglulu CLK_RPLL_INT, 1173*91f16700Schasinglulu CLK_RPLL_HALF, 1174*91f16700Schasinglulu CLK_NA_PARENT 1175*91f16700Schasinglulu }), 1176*91f16700Schasinglulu .nodes = &generic_pll_int_nodes, 1177*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_int_nodes), 1178*91f16700Schasinglulu }, 1179*91f16700Schasinglulu [CLK_RPLL_POST_SRC] = { 1180*91f16700Schasinglulu .name = "rpll_post_src", 1181*91f16700Schasinglulu .control_reg = CRL_APB_RPLL_CTRL, 1182*91f16700Schasinglulu .status_reg = CRF_APB_PLL_STATUS, 1183*91f16700Schasinglulu .parents = &((int32_t []) { 1184*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1185*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1186*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1187*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1188*91f16700Schasinglulu EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT, 1189*91f16700Schasinglulu EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT, 1190*91f16700Schasinglulu EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT, 1191*91f16700Schasinglulu EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT, 1192*91f16700Schasinglulu CLK_NA_PARENT 1193*91f16700Schasinglulu }), 1194*91f16700Schasinglulu .nodes = &generic_pll_post_src_nodes, 1195*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_post_src_nodes), 1196*91f16700Schasinglulu }, 1197*91f16700Schasinglulu [CLK_RPLL] = { 1198*91f16700Schasinglulu .name = "rpll", 1199*91f16700Schasinglulu .control_reg = CRL_APB_RPLL_CTRL, 1200*91f16700Schasinglulu .status_reg = CRL_APB_PLL_STATUS, 1201*91f16700Schasinglulu .parents = &((int32_t []) { 1202*91f16700Schasinglulu CLK_RPLL_INT_MUX, 1203*91f16700Schasinglulu CLK_RPLL_POST_SRC, 1204*91f16700Schasinglulu CLK_NA_PARENT 1205*91f16700Schasinglulu }), 1206*91f16700Schasinglulu .nodes = &generic_pll_system_nodes, 1207*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_pll_system_nodes), 1208*91f16700Schasinglulu }, 1209*91f16700Schasinglulu /* Peripheral Clocks */ 1210*91f16700Schasinglulu [CLK_ACPU] = { 1211*91f16700Schasinglulu .name = "acpu", 1212*91f16700Schasinglulu .control_reg = CRF_APB_ACPU_CTRL, 1213*91f16700Schasinglulu .status_reg = 0, 1214*91f16700Schasinglulu .parents = &((int32_t []) { 1215*91f16700Schasinglulu CLK_APLL, 1216*91f16700Schasinglulu CLK_DUMMY_PARENT, 1217*91f16700Schasinglulu CLK_DPLL, 1218*91f16700Schasinglulu CLK_VPLL, 1219*91f16700Schasinglulu CLK_NA_PARENT 1220*91f16700Schasinglulu }), 1221*91f16700Schasinglulu .nodes = &acpu_nodes, 1222*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(acpu_nodes), 1223*91f16700Schasinglulu }, 1224*91f16700Schasinglulu [CLK_ACPU_FULL] = { 1225*91f16700Schasinglulu .name = "acpu_full", 1226*91f16700Schasinglulu .control_reg = CRF_APB_ACPU_CTRL, 1227*91f16700Schasinglulu .status_reg = 0, 1228*91f16700Schasinglulu .parents = &((int32_t []) { 1229*91f16700Schasinglulu CLK_ACPU | PARENT_CLK_NODE2 << CLK_PARENTS_ID_LEN, 1230*91f16700Schasinglulu CLK_NA_PARENT 1231*91f16700Schasinglulu }), 1232*91f16700Schasinglulu .nodes = &acpu_full_nodes, 1233*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(acpu_full_nodes), 1234*91f16700Schasinglulu }, 1235*91f16700Schasinglulu [CLK_DBG_TRACE] = { 1236*91f16700Schasinglulu .name = "dbg_trace", 1237*91f16700Schasinglulu .control_reg = CRF_APB_DBG_TRACE_CTRL, 1238*91f16700Schasinglulu .status_reg = 0, 1239*91f16700Schasinglulu .parents = &((int32_t []) { 1240*91f16700Schasinglulu CLK_IOPLL_TO_FPD, 1241*91f16700Schasinglulu CLK_DUMMY_PARENT, 1242*91f16700Schasinglulu CLK_DPLL, 1243*91f16700Schasinglulu CLK_APLL, 1244*91f16700Schasinglulu CLK_NA_PARENT 1245*91f16700Schasinglulu }), 1246*91f16700Schasinglulu .nodes = &generic_mux_div_gate_nodes, 1247*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes), 1248*91f16700Schasinglulu }, 1249*91f16700Schasinglulu [CLK_DBG_FPD] = { 1250*91f16700Schasinglulu .name = "dbg_fpd", 1251*91f16700Schasinglulu .control_reg = CRF_APB_DBG_FPD_CTRL, 1252*91f16700Schasinglulu .status_reg = 0, 1253*91f16700Schasinglulu .parents = &((int32_t []) { 1254*91f16700Schasinglulu CLK_IOPLL_TO_FPD, 1255*91f16700Schasinglulu CLK_DUMMY_PARENT, 1256*91f16700Schasinglulu CLK_DPLL, 1257*91f16700Schasinglulu CLK_APLL, 1258*91f16700Schasinglulu CLK_NA_PARENT 1259*91f16700Schasinglulu }), 1260*91f16700Schasinglulu .nodes = &generic_mux_div_gate_nodes, 1261*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes), 1262*91f16700Schasinglulu }, 1263*91f16700Schasinglulu [CLK_DBG_TSTMP] = { 1264*91f16700Schasinglulu .name = "dbg_tstmp", 1265*91f16700Schasinglulu .control_reg = CRF_APB_DBG_TSTMP_CTRL, 1266*91f16700Schasinglulu .status_reg = 0, 1267*91f16700Schasinglulu .parents = &((int32_t []) { 1268*91f16700Schasinglulu CLK_IOPLL_TO_FPD, 1269*91f16700Schasinglulu CLK_DUMMY_PARENT, 1270*91f16700Schasinglulu CLK_DPLL, 1271*91f16700Schasinglulu CLK_APLL, 1272*91f16700Schasinglulu CLK_NA_PARENT 1273*91f16700Schasinglulu }), 1274*91f16700Schasinglulu .nodes = &generic_mux_div_nodes, 1275*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_nodes), 1276*91f16700Schasinglulu }, 1277*91f16700Schasinglulu [CLK_DP_VIDEO_REF] = { 1278*91f16700Schasinglulu .name = "dp_video_ref", 1279*91f16700Schasinglulu .control_reg = CRF_APB_DP_VIDEO_REF_CTRL, 1280*91f16700Schasinglulu .status_reg = 0, 1281*91f16700Schasinglulu .parents = &((int32_t []) { 1282*91f16700Schasinglulu CLK_VPLL, 1283*91f16700Schasinglulu CLK_DUMMY_PARENT, 1284*91f16700Schasinglulu CLK_DPLL, 1285*91f16700Schasinglulu CLK_RPLL_TO_FPD, 1286*91f16700Schasinglulu CLK_NA_PARENT 1287*91f16700Schasinglulu }), 1288*91f16700Schasinglulu .nodes = &dp_audio_video_ref_nodes, 1289*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(dp_audio_video_ref_nodes), 1290*91f16700Schasinglulu }, 1291*91f16700Schasinglulu [CLK_DP_AUDIO_REF] = { 1292*91f16700Schasinglulu .name = "dp_audio_ref", 1293*91f16700Schasinglulu .control_reg = CRF_APB_DP_AUDIO_REF_CTRL, 1294*91f16700Schasinglulu .status_reg = 0, 1295*91f16700Schasinglulu .parents = &((int32_t []) { 1296*91f16700Schasinglulu CLK_VPLL, 1297*91f16700Schasinglulu CLK_DUMMY_PARENT, 1298*91f16700Schasinglulu CLK_DPLL, 1299*91f16700Schasinglulu CLK_RPLL_TO_FPD, 1300*91f16700Schasinglulu CLK_NA_PARENT 1301*91f16700Schasinglulu }), 1302*91f16700Schasinglulu .nodes = &dp_audio_video_ref_nodes, 1303*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(dp_audio_video_ref_nodes), 1304*91f16700Schasinglulu }, 1305*91f16700Schasinglulu [CLK_DP_STC_REF] = { 1306*91f16700Schasinglulu .name = "dp_stc_ref", 1307*91f16700Schasinglulu .control_reg = CRF_APB_DP_STC_REF_CTRL, 1308*91f16700Schasinglulu .status_reg = 0, 1309*91f16700Schasinglulu .parents = &((int32_t []) { 1310*91f16700Schasinglulu CLK_VPLL, 1311*91f16700Schasinglulu CLK_DUMMY_PARENT, 1312*91f16700Schasinglulu CLK_DPLL, 1313*91f16700Schasinglulu CLK_RPLL_TO_FPD, 1314*91f16700Schasinglulu CLK_NA_PARENT 1315*91f16700Schasinglulu }), 1316*91f16700Schasinglulu .nodes = &generic_mux_div_div_gate_nodes, 1317*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes), 1318*91f16700Schasinglulu }, 1319*91f16700Schasinglulu [CLK_DPDMA_REF] = { 1320*91f16700Schasinglulu .name = "dpdma_ref", 1321*91f16700Schasinglulu .control_reg = CRF_APB_DPDMA_REF_CTRL, 1322*91f16700Schasinglulu .status_reg = 0, 1323*91f16700Schasinglulu .parents = &((int32_t []) { 1324*91f16700Schasinglulu CLK_APLL, 1325*91f16700Schasinglulu CLK_DUMMY_PARENT, 1326*91f16700Schasinglulu CLK_VPLL, 1327*91f16700Schasinglulu CLK_DPLL, 1328*91f16700Schasinglulu CLK_NA_PARENT 1329*91f16700Schasinglulu }), 1330*91f16700Schasinglulu .nodes = &generic_mux_div_gate_nodes, 1331*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes), 1332*91f16700Schasinglulu }, 1333*91f16700Schasinglulu [CLK_DDR_REF] = { 1334*91f16700Schasinglulu .name = "ddr_ref", 1335*91f16700Schasinglulu .control_reg = CRF_APB_DDR_CTRL, 1336*91f16700Schasinglulu .status_reg = 0, 1337*91f16700Schasinglulu .parents = &((int32_t []) { 1338*91f16700Schasinglulu CLK_DPLL, 1339*91f16700Schasinglulu CLK_VPLL, 1340*91f16700Schasinglulu CLK_NA_PARENT 1341*91f16700Schasinglulu }), 1342*91f16700Schasinglulu .nodes = &ddr_nodes, 1343*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(ddr_nodes), 1344*91f16700Schasinglulu }, 1345*91f16700Schasinglulu [CLK_GPU_REF] = { 1346*91f16700Schasinglulu .name = "gpu_ref", 1347*91f16700Schasinglulu .control_reg = CRF_APB_GPU_REF_CTRL, 1348*91f16700Schasinglulu .status_reg = 0, 1349*91f16700Schasinglulu .parents = &((int32_t []) { 1350*91f16700Schasinglulu CLK_IOPLL_TO_FPD, 1351*91f16700Schasinglulu CLK_DUMMY_PARENT, 1352*91f16700Schasinglulu CLK_VPLL, 1353*91f16700Schasinglulu CLK_DPLL, 1354*91f16700Schasinglulu CLK_NA_PARENT 1355*91f16700Schasinglulu }), 1356*91f16700Schasinglulu .nodes = &generic_mux_div_gate_nodes, 1357*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes), 1358*91f16700Schasinglulu }, 1359*91f16700Schasinglulu [CLK_SATA_REF] = { 1360*91f16700Schasinglulu .name = "sata_ref", 1361*91f16700Schasinglulu .control_reg = CRF_APB_SATA_REF_CTRL, 1362*91f16700Schasinglulu .status_reg = 0, 1363*91f16700Schasinglulu .parents = &((int32_t []) { 1364*91f16700Schasinglulu CLK_IOPLL_TO_FPD, 1365*91f16700Schasinglulu CLK_DUMMY_PARENT, 1366*91f16700Schasinglulu CLK_APLL, 1367*91f16700Schasinglulu CLK_DPLL, 1368*91f16700Schasinglulu CLK_NA_PARENT 1369*91f16700Schasinglulu }), 1370*91f16700Schasinglulu .nodes = &generic_mux_div_gate_nodes, 1371*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes), 1372*91f16700Schasinglulu }, 1373*91f16700Schasinglulu [CLK_PCIE_REF] = { 1374*91f16700Schasinglulu .name = "pcie_ref", 1375*91f16700Schasinglulu .control_reg = CRF_APB_PCIE_REF_CTRL, 1376*91f16700Schasinglulu .status_reg = 0, 1377*91f16700Schasinglulu .parents = &((int32_t []) { 1378*91f16700Schasinglulu CLK_IOPLL_TO_FPD, 1379*91f16700Schasinglulu CLK_DUMMY_PARENT, 1380*91f16700Schasinglulu CLK_RPLL_TO_FPD, 1381*91f16700Schasinglulu CLK_DPLL, 1382*91f16700Schasinglulu CLK_NA_PARENT 1383*91f16700Schasinglulu }), 1384*91f16700Schasinglulu .nodes = &generic_mux_div_gate_nodes, 1385*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes), 1386*91f16700Schasinglulu }, 1387*91f16700Schasinglulu [CLK_GDMA_REF] = { 1388*91f16700Schasinglulu .name = "gdma_ref", 1389*91f16700Schasinglulu .control_reg = CRF_APB_GDMA_REF_CTRL, 1390*91f16700Schasinglulu .status_reg = 0, 1391*91f16700Schasinglulu .parents = &((int32_t []) { 1392*91f16700Schasinglulu CLK_APLL, 1393*91f16700Schasinglulu CLK_DUMMY_PARENT, 1394*91f16700Schasinglulu CLK_VPLL, 1395*91f16700Schasinglulu CLK_DPLL, 1396*91f16700Schasinglulu CLK_NA_PARENT 1397*91f16700Schasinglulu }), 1398*91f16700Schasinglulu .nodes = &generic_mux_div_gate_nodes, 1399*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes), 1400*91f16700Schasinglulu }, 1401*91f16700Schasinglulu [CLK_GTGREF0_REF] = { 1402*91f16700Schasinglulu .name = "gtgref0_ref", 1403*91f16700Schasinglulu .control_reg = CRF_APB_GTGREF0_REF_CTRL, 1404*91f16700Schasinglulu .status_reg = 0, 1405*91f16700Schasinglulu .parents = &((int32_t []) { 1406*91f16700Schasinglulu CLK_IOPLL_TO_FPD, 1407*91f16700Schasinglulu CLK_DUMMY_PARENT, 1408*91f16700Schasinglulu CLK_APLL, 1409*91f16700Schasinglulu CLK_DPLL, 1410*91f16700Schasinglulu CLK_NA_PARENT 1411*91f16700Schasinglulu }), 1412*91f16700Schasinglulu .nodes = &generic_mux_div_gate_nodes, 1413*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes), 1414*91f16700Schasinglulu }, 1415*91f16700Schasinglulu [CLK_TOPSW_MAIN] = { 1416*91f16700Schasinglulu .name = "topsw_main", 1417*91f16700Schasinglulu .control_reg = CRF_APB_TOPSW_MAIN_CTRL, 1418*91f16700Schasinglulu .status_reg = 0, 1419*91f16700Schasinglulu .parents = &((int32_t []) { 1420*91f16700Schasinglulu CLK_APLL, 1421*91f16700Schasinglulu CLK_DUMMY_PARENT, 1422*91f16700Schasinglulu CLK_VPLL, 1423*91f16700Schasinglulu CLK_DPLL, 1424*91f16700Schasinglulu CLK_NA_PARENT 1425*91f16700Schasinglulu }), 1426*91f16700Schasinglulu .nodes = &generic_mux_div_unused_gate_nodes, 1427*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes), 1428*91f16700Schasinglulu }, 1429*91f16700Schasinglulu [CLK_TOPSW_LSBUS] = { 1430*91f16700Schasinglulu .name = "topsw_lsbus", 1431*91f16700Schasinglulu .control_reg = CRF_APB_TOPSW_LSBUS_CTRL, 1432*91f16700Schasinglulu .status_reg = 0, 1433*91f16700Schasinglulu .parents = &((int32_t []) { 1434*91f16700Schasinglulu CLK_APLL, 1435*91f16700Schasinglulu CLK_DUMMY_PARENT, 1436*91f16700Schasinglulu CLK_IOPLL_TO_FPD, 1437*91f16700Schasinglulu CLK_DPLL, 1438*91f16700Schasinglulu CLK_NA_PARENT 1439*91f16700Schasinglulu }), 1440*91f16700Schasinglulu .nodes = &generic_mux_div_unused_gate_nodes, 1441*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes), 1442*91f16700Schasinglulu }, 1443*91f16700Schasinglulu [CLK_IOU_SWITCH] = { 1444*91f16700Schasinglulu .name = "iou_switch", 1445*91f16700Schasinglulu .control_reg = CRL_APB_IOU_SWITCH_CTRL, 1446*91f16700Schasinglulu .status_reg = 0, 1447*91f16700Schasinglulu .parents = &((int32_t []) { 1448*91f16700Schasinglulu CLK_RPLL, 1449*91f16700Schasinglulu CLK_DUMMY_PARENT, 1450*91f16700Schasinglulu CLK_IOPLL, 1451*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1452*91f16700Schasinglulu CLK_NA_PARENT 1453*91f16700Schasinglulu }), 1454*91f16700Schasinglulu .nodes = &generic_mux_div_unused_gate_nodes, 1455*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes), 1456*91f16700Schasinglulu }, 1457*91f16700Schasinglulu [CLK_GEM0_REF_UNGATED] = { 1458*91f16700Schasinglulu .name = "gem0_ref_ung", 1459*91f16700Schasinglulu .control_reg = CRL_APB_GEM0_REF_CTRL, 1460*91f16700Schasinglulu .status_reg = 0, 1461*91f16700Schasinglulu .parents = &((int32_t []) { 1462*91f16700Schasinglulu CLK_IOPLL, 1463*91f16700Schasinglulu CLK_DUMMY_PARENT, 1464*91f16700Schasinglulu CLK_RPLL, 1465*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1466*91f16700Schasinglulu CLK_NA_PARENT 1467*91f16700Schasinglulu }), 1468*91f16700Schasinglulu .nodes = &gem_ref_ungated_nodes, 1469*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem_ref_ungated_nodes), 1470*91f16700Schasinglulu }, 1471*91f16700Schasinglulu [CLK_GEM1_REF_UNGATED] = { 1472*91f16700Schasinglulu .name = "gem1_ref_ung", 1473*91f16700Schasinglulu .control_reg = CRL_APB_GEM1_REF_CTRL, 1474*91f16700Schasinglulu .status_reg = 0, 1475*91f16700Schasinglulu .parents = &((int32_t []) { 1476*91f16700Schasinglulu CLK_IOPLL, 1477*91f16700Schasinglulu CLK_DUMMY_PARENT, 1478*91f16700Schasinglulu CLK_RPLL, 1479*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1480*91f16700Schasinglulu CLK_NA_PARENT 1481*91f16700Schasinglulu }), 1482*91f16700Schasinglulu .nodes = &gem_ref_ungated_nodes, 1483*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem_ref_ungated_nodes), 1484*91f16700Schasinglulu }, 1485*91f16700Schasinglulu [CLK_GEM2_REF_UNGATED] = { 1486*91f16700Schasinglulu .name = "gem2_ref_ung", 1487*91f16700Schasinglulu .control_reg = CRL_APB_GEM2_REF_CTRL, 1488*91f16700Schasinglulu .status_reg = 0, 1489*91f16700Schasinglulu .parents = &((int32_t []) { 1490*91f16700Schasinglulu CLK_IOPLL, 1491*91f16700Schasinglulu CLK_DUMMY_PARENT, 1492*91f16700Schasinglulu CLK_RPLL, 1493*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1494*91f16700Schasinglulu CLK_NA_PARENT 1495*91f16700Schasinglulu }), 1496*91f16700Schasinglulu .nodes = &gem_ref_ungated_nodes, 1497*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem_ref_ungated_nodes), 1498*91f16700Schasinglulu }, 1499*91f16700Schasinglulu [CLK_GEM3_REF_UNGATED] = { 1500*91f16700Schasinglulu .name = "gem3_ref_ung", 1501*91f16700Schasinglulu .control_reg = CRL_APB_GEM3_REF_CTRL, 1502*91f16700Schasinglulu .status_reg = 0, 1503*91f16700Schasinglulu .parents = &((int32_t []) { 1504*91f16700Schasinglulu CLK_IOPLL, 1505*91f16700Schasinglulu CLK_DUMMY_PARENT, 1506*91f16700Schasinglulu CLK_RPLL, 1507*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1508*91f16700Schasinglulu CLK_NA_PARENT 1509*91f16700Schasinglulu }), 1510*91f16700Schasinglulu .nodes = &gem_ref_ungated_nodes, 1511*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem_ref_ungated_nodes), 1512*91f16700Schasinglulu }, 1513*91f16700Schasinglulu [CLK_GEM0_REF] = { 1514*91f16700Schasinglulu .name = "gem0_ref", 1515*91f16700Schasinglulu .control_reg = IOU_SLCR_GEM_CLK_CTRL, 1516*91f16700Schasinglulu .status_reg = 0, 1517*91f16700Schasinglulu .parents = &((int32_t []) { 1518*91f16700Schasinglulu CLK_GEM0_REF_UNGATED | 1519*91f16700Schasinglulu (PARENT_CLK_NODE3 << CLK_PARENTS_ID_LEN), 1520*91f16700Schasinglulu EXT_CLK_GEM0_TX_EMIO | CLK_EXTERNAL_PARENT, 1521*91f16700Schasinglulu CLK_NA_PARENT 1522*91f16700Schasinglulu }), 1523*91f16700Schasinglulu .nodes = &gem0_ref_nodes, 1524*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem0_ref_nodes), 1525*91f16700Schasinglulu }, 1526*91f16700Schasinglulu [CLK_GEM1_REF] = { 1527*91f16700Schasinglulu .name = "gem1_ref", 1528*91f16700Schasinglulu .control_reg = IOU_SLCR_GEM_CLK_CTRL, 1529*91f16700Schasinglulu .status_reg = 0, 1530*91f16700Schasinglulu .parents = &((int32_t []) { 1531*91f16700Schasinglulu CLK_GEM1_REF_UNGATED | 1532*91f16700Schasinglulu (PARENT_CLK_NODE3 << CLK_PARENTS_ID_LEN), 1533*91f16700Schasinglulu EXT_CLK_GEM1_TX_EMIO | CLK_EXTERNAL_PARENT, 1534*91f16700Schasinglulu CLK_NA_PARENT 1535*91f16700Schasinglulu }), 1536*91f16700Schasinglulu .nodes = &gem1_ref_nodes, 1537*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem1_ref_nodes), 1538*91f16700Schasinglulu }, 1539*91f16700Schasinglulu [CLK_GEM2_REF] = { 1540*91f16700Schasinglulu .name = "gem2_ref", 1541*91f16700Schasinglulu .control_reg = IOU_SLCR_GEM_CLK_CTRL, 1542*91f16700Schasinglulu .status_reg = 0, 1543*91f16700Schasinglulu .parents = &((int32_t []) { 1544*91f16700Schasinglulu CLK_GEM2_REF_UNGATED | 1545*91f16700Schasinglulu (PARENT_CLK_NODE3 << CLK_PARENTS_ID_LEN), 1546*91f16700Schasinglulu EXT_CLK_GEM2_TX_EMIO | CLK_EXTERNAL_PARENT, 1547*91f16700Schasinglulu CLK_NA_PARENT 1548*91f16700Schasinglulu }), 1549*91f16700Schasinglulu .nodes = &gem2_ref_nodes, 1550*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem2_ref_nodes), 1551*91f16700Schasinglulu }, 1552*91f16700Schasinglulu [CLK_GEM3_REF] = { 1553*91f16700Schasinglulu .name = "gem3_ref", 1554*91f16700Schasinglulu .control_reg = IOU_SLCR_GEM_CLK_CTRL, 1555*91f16700Schasinglulu .status_reg = 0, 1556*91f16700Schasinglulu .parents = &((int32_t []) { 1557*91f16700Schasinglulu CLK_GEM3_REF_UNGATED | 1558*91f16700Schasinglulu (PARENT_CLK_NODE3 << CLK_PARENTS_ID_LEN), 1559*91f16700Schasinglulu EXT_CLK_GEM3_TX_EMIO | CLK_EXTERNAL_PARENT, 1560*91f16700Schasinglulu CLK_NA_PARENT 1561*91f16700Schasinglulu }), 1562*91f16700Schasinglulu .nodes = &gem3_ref_nodes, 1563*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem3_ref_nodes), 1564*91f16700Schasinglulu }, 1565*91f16700Schasinglulu [CLK_USB0_BUS_REF] = { 1566*91f16700Schasinglulu .name = "usb0_bus_ref", 1567*91f16700Schasinglulu .control_reg = CRL_APB_USB0_BUS_REF_CTRL, 1568*91f16700Schasinglulu .status_reg = 0, 1569*91f16700Schasinglulu .parents = &((int32_t []) { 1570*91f16700Schasinglulu CLK_IOPLL, 1571*91f16700Schasinglulu CLK_DUMMY_PARENT, 1572*91f16700Schasinglulu CLK_RPLL, 1573*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1574*91f16700Schasinglulu CLK_NA_PARENT 1575*91f16700Schasinglulu }), 1576*91f16700Schasinglulu .nodes = &usb_nodes, 1577*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(usb_nodes), 1578*91f16700Schasinglulu }, 1579*91f16700Schasinglulu [CLK_USB1_BUS_REF] = { 1580*91f16700Schasinglulu .name = "usb1_bus_ref", 1581*91f16700Schasinglulu .control_reg = CRL_APB_USB1_BUS_REF_CTRL, 1582*91f16700Schasinglulu .status_reg = 0, 1583*91f16700Schasinglulu .parents = &((int32_t []) { 1584*91f16700Schasinglulu CLK_IOPLL, 1585*91f16700Schasinglulu CLK_DUMMY_PARENT, 1586*91f16700Schasinglulu CLK_RPLL, 1587*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1588*91f16700Schasinglulu CLK_NA_PARENT 1589*91f16700Schasinglulu }), 1590*91f16700Schasinglulu .nodes = &usb_nodes, 1591*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(usb_nodes), 1592*91f16700Schasinglulu }, 1593*91f16700Schasinglulu [CLK_USB3_DUAL_REF] = { 1594*91f16700Schasinglulu .name = "usb3_dual_ref", 1595*91f16700Schasinglulu .control_reg = CRL_APB_USB3_DUAL_REF_CTRL, 1596*91f16700Schasinglulu .status_reg = 0, 1597*91f16700Schasinglulu .parents = &((int32_t []) { 1598*91f16700Schasinglulu CLK_IOPLL, 1599*91f16700Schasinglulu CLK_DUMMY_PARENT, 1600*91f16700Schasinglulu CLK_RPLL, 1601*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1602*91f16700Schasinglulu CLK_NA_PARENT 1603*91f16700Schasinglulu }), 1604*91f16700Schasinglulu .nodes = &usb_nodes, 1605*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(usb_nodes), 1606*91f16700Schasinglulu }, 1607*91f16700Schasinglulu [CLK_QSPI_REF] = { 1608*91f16700Schasinglulu .name = "qspi_ref", 1609*91f16700Schasinglulu .control_reg = CRL_APB_QSPI_REF_CTRL, 1610*91f16700Schasinglulu .status_reg = 0, 1611*91f16700Schasinglulu .parents = &((int32_t []) { 1612*91f16700Schasinglulu CLK_IOPLL, 1613*91f16700Schasinglulu CLK_DUMMY_PARENT, 1614*91f16700Schasinglulu CLK_RPLL, 1615*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1616*91f16700Schasinglulu CLK_NA_PARENT 1617*91f16700Schasinglulu }), 1618*91f16700Schasinglulu .nodes = &generic_mux_div_div_gate_nodes, 1619*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes), 1620*91f16700Schasinglulu }, 1621*91f16700Schasinglulu [CLK_SDIO0_REF] = { 1622*91f16700Schasinglulu .name = "sdio0_ref", 1623*91f16700Schasinglulu .control_reg = CRL_APB_SDIO0_REF_CTRL, 1624*91f16700Schasinglulu .status_reg = 0, 1625*91f16700Schasinglulu .parents = &((int32_t []) { 1626*91f16700Schasinglulu CLK_IOPLL, 1627*91f16700Schasinglulu CLK_DUMMY_PARENT, 1628*91f16700Schasinglulu CLK_RPLL, 1629*91f16700Schasinglulu CLK_VPLL_TO_LPD, 1630*91f16700Schasinglulu CLK_NA_PARENT 1631*91f16700Schasinglulu }), 1632*91f16700Schasinglulu .nodes = &generic_mux_div_div_gate_nodes, 1633*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes), 1634*91f16700Schasinglulu }, 1635*91f16700Schasinglulu [CLK_SDIO1_REF] = { 1636*91f16700Schasinglulu .name = "sdio1_ref", 1637*91f16700Schasinglulu .control_reg = CRL_APB_SDIO1_REF_CTRL, 1638*91f16700Schasinglulu .status_reg = 0, 1639*91f16700Schasinglulu .parents = &((int32_t []) { 1640*91f16700Schasinglulu CLK_IOPLL, 1641*91f16700Schasinglulu CLK_DUMMY_PARENT, 1642*91f16700Schasinglulu CLK_RPLL, 1643*91f16700Schasinglulu CLK_VPLL_TO_LPD, 1644*91f16700Schasinglulu CLK_NA_PARENT 1645*91f16700Schasinglulu }), 1646*91f16700Schasinglulu .nodes = &generic_mux_div_div_gate_nodes, 1647*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes), 1648*91f16700Schasinglulu }, 1649*91f16700Schasinglulu [CLK_UART0_REF] = { 1650*91f16700Schasinglulu .name = "uart0_ref", 1651*91f16700Schasinglulu .control_reg = CRL_APB_UART0_REF_CTRL, 1652*91f16700Schasinglulu .status_reg = 0, 1653*91f16700Schasinglulu .parents = &((int32_t []) { 1654*91f16700Schasinglulu CLK_IOPLL, 1655*91f16700Schasinglulu CLK_DUMMY_PARENT, 1656*91f16700Schasinglulu CLK_RPLL, 1657*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1658*91f16700Schasinglulu CLK_NA_PARENT 1659*91f16700Schasinglulu }), 1660*91f16700Schasinglulu .nodes = &generic_mux_div_div_gate_nodes, 1661*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes), 1662*91f16700Schasinglulu }, 1663*91f16700Schasinglulu [CLK_UART1_REF] = { 1664*91f16700Schasinglulu .name = "uart1_ref", 1665*91f16700Schasinglulu .control_reg = CRL_APB_UART1_REF_CTRL, 1666*91f16700Schasinglulu .status_reg = 0, 1667*91f16700Schasinglulu .parents = &((int32_t []) { 1668*91f16700Schasinglulu CLK_IOPLL, 1669*91f16700Schasinglulu CLK_DUMMY_PARENT, 1670*91f16700Schasinglulu CLK_RPLL, 1671*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1672*91f16700Schasinglulu CLK_NA_PARENT 1673*91f16700Schasinglulu }), 1674*91f16700Schasinglulu .nodes = &generic_mux_div_div_gate_nodes, 1675*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes), 1676*91f16700Schasinglulu }, 1677*91f16700Schasinglulu [CLK_SPI0_REF] = { 1678*91f16700Schasinglulu .name = "spi0_ref", 1679*91f16700Schasinglulu .control_reg = CRL_APB_SPI0_REF_CTRL, 1680*91f16700Schasinglulu .status_reg = 0, 1681*91f16700Schasinglulu .parents = &((int32_t []) { 1682*91f16700Schasinglulu CLK_IOPLL, 1683*91f16700Schasinglulu CLK_DUMMY_PARENT, 1684*91f16700Schasinglulu CLK_RPLL, 1685*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1686*91f16700Schasinglulu CLK_NA_PARENT 1687*91f16700Schasinglulu }), 1688*91f16700Schasinglulu .nodes = &generic_mux_div_div_gate_nodes, 1689*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes), 1690*91f16700Schasinglulu }, 1691*91f16700Schasinglulu [CLK_SPI1_REF] = { 1692*91f16700Schasinglulu .name = "spi1_ref", 1693*91f16700Schasinglulu .control_reg = CRL_APB_SPI1_REF_CTRL, 1694*91f16700Schasinglulu .status_reg = 0, 1695*91f16700Schasinglulu .parents = &((int32_t []) { 1696*91f16700Schasinglulu CLK_IOPLL, 1697*91f16700Schasinglulu CLK_DUMMY_PARENT, 1698*91f16700Schasinglulu CLK_RPLL, 1699*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1700*91f16700Schasinglulu CLK_NA_PARENT 1701*91f16700Schasinglulu }), 1702*91f16700Schasinglulu .nodes = &generic_mux_div_div_gate_nodes, 1703*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes), 1704*91f16700Schasinglulu }, 1705*91f16700Schasinglulu [CLK_CAN0_REF] = { 1706*91f16700Schasinglulu .name = "can0_ref", 1707*91f16700Schasinglulu .control_reg = CRL_APB_CAN0_REF_CTRL, 1708*91f16700Schasinglulu .status_reg = 0, 1709*91f16700Schasinglulu .parents = &((int32_t []) { 1710*91f16700Schasinglulu CLK_IOPLL, 1711*91f16700Schasinglulu CLK_DUMMY_PARENT, 1712*91f16700Schasinglulu CLK_RPLL, 1713*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1714*91f16700Schasinglulu CLK_NA_PARENT 1715*91f16700Schasinglulu }), 1716*91f16700Schasinglulu .nodes = &generic_mux_div_div_gate_nodes, 1717*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes), 1718*91f16700Schasinglulu }, 1719*91f16700Schasinglulu [CLK_CAN1_REF] = { 1720*91f16700Schasinglulu .name = "can1_ref", 1721*91f16700Schasinglulu .control_reg = CRL_APB_CAN1_REF_CTRL, 1722*91f16700Schasinglulu .status_reg = 0, 1723*91f16700Schasinglulu .parents = &((int32_t []) { 1724*91f16700Schasinglulu CLK_IOPLL, 1725*91f16700Schasinglulu CLK_DUMMY_PARENT, 1726*91f16700Schasinglulu CLK_RPLL, 1727*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1728*91f16700Schasinglulu CLK_NA_PARENT 1729*91f16700Schasinglulu }), 1730*91f16700Schasinglulu .nodes = &generic_mux_div_div_gate_nodes, 1731*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes), 1732*91f16700Schasinglulu }, 1733*91f16700Schasinglulu [CLK_NAND_REF] = { 1734*91f16700Schasinglulu .name = "nand_ref", 1735*91f16700Schasinglulu .control_reg = CRL_APB_NAND_REF_CTRL, 1736*91f16700Schasinglulu .status_reg = 0, 1737*91f16700Schasinglulu .parents = &((int32_t []) { 1738*91f16700Schasinglulu CLK_IOPLL, 1739*91f16700Schasinglulu CLK_DUMMY_PARENT, 1740*91f16700Schasinglulu CLK_RPLL, 1741*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1742*91f16700Schasinglulu CLK_NA_PARENT 1743*91f16700Schasinglulu }), 1744*91f16700Schasinglulu .nodes = &generic_mux_div_div_gate_nodes, 1745*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes), 1746*91f16700Schasinglulu }, 1747*91f16700Schasinglulu [CLK_GEM_TSU_REF] = { 1748*91f16700Schasinglulu .name = "gem_tsu_ref", 1749*91f16700Schasinglulu .control_reg = CRL_APB_GEM_TSU_REF_CTRL, 1750*91f16700Schasinglulu .status_reg = 0, 1751*91f16700Schasinglulu .parents = &((int32_t []) { 1752*91f16700Schasinglulu CLK_IOPLL, 1753*91f16700Schasinglulu CLK_DUMMY_PARENT, 1754*91f16700Schasinglulu CLK_RPLL, 1755*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1756*91f16700Schasinglulu CLK_NA_PARENT 1757*91f16700Schasinglulu }), 1758*91f16700Schasinglulu .nodes = &generic_mux_div_div_gate_nodes, 1759*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes), 1760*91f16700Schasinglulu }, 1761*91f16700Schasinglulu [CLK_DLL_REF] = { 1762*91f16700Schasinglulu .name = "dll_ref", 1763*91f16700Schasinglulu .control_reg = CRL_APB_DLL_REF_CTRL, 1764*91f16700Schasinglulu .status_reg = 0, 1765*91f16700Schasinglulu .parents = &((int32_t []) { 1766*91f16700Schasinglulu CLK_IOPLL, 1767*91f16700Schasinglulu CLK_RPLL, 1768*91f16700Schasinglulu CLK_NA_PARENT 1769*91f16700Schasinglulu }), 1770*91f16700Schasinglulu .nodes = &dll_ref_nodes, 1771*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(dll_ref_nodes), 1772*91f16700Schasinglulu }, 1773*91f16700Schasinglulu [CLK_ADMA_REF] = { 1774*91f16700Schasinglulu .name = "adma_ref", 1775*91f16700Schasinglulu .control_reg = CRL_APB_ADMA_REF_CTRL, 1776*91f16700Schasinglulu .status_reg = 0, 1777*91f16700Schasinglulu .parents = &((int32_t []) { 1778*91f16700Schasinglulu CLK_RPLL, 1779*91f16700Schasinglulu CLK_DUMMY_PARENT, 1780*91f16700Schasinglulu CLK_IOPLL, 1781*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1782*91f16700Schasinglulu CLK_NA_PARENT 1783*91f16700Schasinglulu }), 1784*91f16700Schasinglulu .nodes = &generic_mux_div_gate_nodes, 1785*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes), 1786*91f16700Schasinglulu }, 1787*91f16700Schasinglulu [CLK_DBG_LPD] = { 1788*91f16700Schasinglulu .name = "dbg_lpd", 1789*91f16700Schasinglulu .control_reg = CRL_APB_DBG_LPD_CTRL, 1790*91f16700Schasinglulu .status_reg = 0, 1791*91f16700Schasinglulu .parents = &((int32_t []) { 1792*91f16700Schasinglulu CLK_RPLL, 1793*91f16700Schasinglulu CLK_DUMMY_PARENT, 1794*91f16700Schasinglulu CLK_IOPLL, 1795*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1796*91f16700Schasinglulu CLK_NA_PARENT 1797*91f16700Schasinglulu }), 1798*91f16700Schasinglulu .nodes = &generic_mux_div_gate_nodes, 1799*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes), 1800*91f16700Schasinglulu }, 1801*91f16700Schasinglulu [CLK_CPU_R5] = { 1802*91f16700Schasinglulu .name = "cpu_r5", 1803*91f16700Schasinglulu .control_reg = CRL_APB_CPU_R5_CTRL, 1804*91f16700Schasinglulu .status_reg = 0, 1805*91f16700Schasinglulu .parents = &((int32_t []) { 1806*91f16700Schasinglulu CLK_RPLL, 1807*91f16700Schasinglulu CLK_DUMMY_PARENT, 1808*91f16700Schasinglulu CLK_IOPLL, 1809*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1810*91f16700Schasinglulu CLK_NA_PARENT 1811*91f16700Schasinglulu }), 1812*91f16700Schasinglulu .nodes = &generic_mux_div_unused_gate_nodes, 1813*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes), 1814*91f16700Schasinglulu }, 1815*91f16700Schasinglulu [CLK_CSU_PLL] = { 1816*91f16700Schasinglulu .name = "csu_pll", 1817*91f16700Schasinglulu .control_reg = CRL_APB_CSU_PLL_CTRL, 1818*91f16700Schasinglulu .status_reg = 0, 1819*91f16700Schasinglulu .parents = &((int32_t []) { 1820*91f16700Schasinglulu CLK_IOPLL, 1821*91f16700Schasinglulu CLK_DUMMY_PARENT, 1822*91f16700Schasinglulu CLK_RPLL, 1823*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1824*91f16700Schasinglulu CLK_NA_PARENT 1825*91f16700Schasinglulu }), 1826*91f16700Schasinglulu .nodes = &generic_mux_div_gate_nodes, 1827*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes), 1828*91f16700Schasinglulu }, 1829*91f16700Schasinglulu [CLK_PCAP] = { 1830*91f16700Schasinglulu .name = "pcap", 1831*91f16700Schasinglulu .control_reg = CRL_APB_PCAP_CTRL, 1832*91f16700Schasinglulu .status_reg = 0, 1833*91f16700Schasinglulu .parents = &((int32_t []) { 1834*91f16700Schasinglulu CLK_IOPLL, 1835*91f16700Schasinglulu CLK_DUMMY_PARENT, 1836*91f16700Schasinglulu CLK_RPLL, 1837*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1838*91f16700Schasinglulu CLK_NA_PARENT 1839*91f16700Schasinglulu }), 1840*91f16700Schasinglulu .nodes = &generic_mux_div_gate_nodes, 1841*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes), 1842*91f16700Schasinglulu }, 1843*91f16700Schasinglulu [CLK_LPD_LSBUS] = { 1844*91f16700Schasinglulu .name = "lpd_lsbus", 1845*91f16700Schasinglulu .control_reg = CRL_APB_LPD_LSBUS_CTRL, 1846*91f16700Schasinglulu .status_reg = 0, 1847*91f16700Schasinglulu .parents = &((int32_t []) { 1848*91f16700Schasinglulu CLK_RPLL, 1849*91f16700Schasinglulu CLK_DUMMY_PARENT, 1850*91f16700Schasinglulu CLK_IOPLL, 1851*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1852*91f16700Schasinglulu CLK_NA_PARENT 1853*91f16700Schasinglulu }), 1854*91f16700Schasinglulu .nodes = &generic_mux_div_unused_gate_nodes, 1855*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes), 1856*91f16700Schasinglulu }, 1857*91f16700Schasinglulu [CLK_LPD_SWITCH] = { 1858*91f16700Schasinglulu .name = "lpd_switch", 1859*91f16700Schasinglulu .control_reg = CRL_APB_LPD_SWITCH_CTRL, 1860*91f16700Schasinglulu .status_reg = 0, 1861*91f16700Schasinglulu .parents = &((int32_t []) { 1862*91f16700Schasinglulu CLK_RPLL, 1863*91f16700Schasinglulu CLK_DUMMY_PARENT, 1864*91f16700Schasinglulu CLK_IOPLL, 1865*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1866*91f16700Schasinglulu CLK_NA_PARENT 1867*91f16700Schasinglulu }), 1868*91f16700Schasinglulu .nodes = &generic_mux_div_unused_gate_nodes, 1869*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes), 1870*91f16700Schasinglulu }, 1871*91f16700Schasinglulu [CLK_I2C0_REF] = { 1872*91f16700Schasinglulu .name = "i2c0_ref", 1873*91f16700Schasinglulu .control_reg = CRL_APB_I2C0_REF_CTRL, 1874*91f16700Schasinglulu .status_reg = 0, 1875*91f16700Schasinglulu .parents = &((int32_t []) { 1876*91f16700Schasinglulu CLK_IOPLL, 1877*91f16700Schasinglulu CLK_DUMMY_PARENT, 1878*91f16700Schasinglulu CLK_RPLL, 1879*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1880*91f16700Schasinglulu CLK_NA_PARENT 1881*91f16700Schasinglulu }), 1882*91f16700Schasinglulu .nodes = &generic_mux_div_div_gate_nodes, 1883*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes), 1884*91f16700Schasinglulu }, 1885*91f16700Schasinglulu [CLK_I2C1_REF] = { 1886*91f16700Schasinglulu .name = "i2c1_ref", 1887*91f16700Schasinglulu .control_reg = CRL_APB_I2C1_REF_CTRL, 1888*91f16700Schasinglulu .status_reg = 0, 1889*91f16700Schasinglulu .parents = &((int32_t []) { 1890*91f16700Schasinglulu CLK_IOPLL, 1891*91f16700Schasinglulu CLK_DUMMY_PARENT, 1892*91f16700Schasinglulu CLK_RPLL, 1893*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1894*91f16700Schasinglulu CLK_NA_PARENT 1895*91f16700Schasinglulu }), 1896*91f16700Schasinglulu .nodes = &generic_mux_div_div_gate_nodes, 1897*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes), 1898*91f16700Schasinglulu }, 1899*91f16700Schasinglulu [CLK_TIMESTAMP_REF] = { 1900*91f16700Schasinglulu .name = "timestamp_ref", 1901*91f16700Schasinglulu .control_reg = CRL_APB_TIMESTAMP_REF_CTRL, 1902*91f16700Schasinglulu .status_reg = 0, 1903*91f16700Schasinglulu .parents = &((int32_t []) { 1904*91f16700Schasinglulu CLK_IOPLL, 1905*91f16700Schasinglulu CLK_DUMMY_PARENT, 1906*91f16700Schasinglulu CLK_RPLL, 1907*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1908*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1909*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1910*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1911*91f16700Schasinglulu EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT, 1912*91f16700Schasinglulu CLK_NA_PARENT 1913*91f16700Schasinglulu }), 1914*91f16700Schasinglulu .nodes = ×tamp_ref_nodes, 1915*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(timestamp_ref_nodes), 1916*91f16700Schasinglulu }, 1917*91f16700Schasinglulu [CLK_PL0_REF] = { 1918*91f16700Schasinglulu .name = "pl0_ref", 1919*91f16700Schasinglulu .control_reg = CRL_APB_PL0_REF_CTRL, 1920*91f16700Schasinglulu .status_reg = 0, 1921*91f16700Schasinglulu .parents = &((int32_t []) { 1922*91f16700Schasinglulu CLK_IOPLL, 1923*91f16700Schasinglulu CLK_DUMMY_PARENT, 1924*91f16700Schasinglulu CLK_RPLL, 1925*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1926*91f16700Schasinglulu CLK_NA_PARENT 1927*91f16700Schasinglulu }), 1928*91f16700Schasinglulu .nodes = &pl_nodes, 1929*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(pl_nodes), 1930*91f16700Schasinglulu }, 1931*91f16700Schasinglulu [CLK_PL1_REF] = { 1932*91f16700Schasinglulu .name = "pl1_ref", 1933*91f16700Schasinglulu .control_reg = CRL_APB_PL1_REF_CTRL, 1934*91f16700Schasinglulu .status_reg = 0, 1935*91f16700Schasinglulu .parents = &((int32_t []) { 1936*91f16700Schasinglulu CLK_IOPLL, 1937*91f16700Schasinglulu CLK_DUMMY_PARENT, 1938*91f16700Schasinglulu CLK_RPLL, 1939*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1940*91f16700Schasinglulu CLK_NA_PARENT 1941*91f16700Schasinglulu }), 1942*91f16700Schasinglulu .nodes = &pl_nodes, 1943*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(pl_nodes), 1944*91f16700Schasinglulu }, 1945*91f16700Schasinglulu [CLK_PL2_REF] = { 1946*91f16700Schasinglulu .name = "pl2_ref", 1947*91f16700Schasinglulu .control_reg = CRL_APB_PL2_REF_CTRL, 1948*91f16700Schasinglulu .status_reg = 0, 1949*91f16700Schasinglulu .parents = &((int32_t []) { 1950*91f16700Schasinglulu CLK_IOPLL, 1951*91f16700Schasinglulu CLK_DUMMY_PARENT, 1952*91f16700Schasinglulu CLK_RPLL, 1953*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1954*91f16700Schasinglulu CLK_NA_PARENT 1955*91f16700Schasinglulu }), 1956*91f16700Schasinglulu .nodes = &pl_nodes, 1957*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(pl_nodes), 1958*91f16700Schasinglulu }, 1959*91f16700Schasinglulu [CLK_PL3_REF] = { 1960*91f16700Schasinglulu .name = "pl3_ref", 1961*91f16700Schasinglulu .control_reg = CRL_APB_PL3_REF_CTRL, 1962*91f16700Schasinglulu .status_reg = 0, 1963*91f16700Schasinglulu .parents = &((int32_t []) { 1964*91f16700Schasinglulu CLK_IOPLL, 1965*91f16700Schasinglulu CLK_DUMMY_PARENT, 1966*91f16700Schasinglulu CLK_RPLL, 1967*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1968*91f16700Schasinglulu CLK_NA_PARENT 1969*91f16700Schasinglulu }), 1970*91f16700Schasinglulu .nodes = &pl_nodes, 1971*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(pl_nodes), 1972*91f16700Schasinglulu }, 1973*91f16700Schasinglulu [CLK_AMS_REF] = { 1974*91f16700Schasinglulu .name = "ams_ref", 1975*91f16700Schasinglulu .control_reg = CRL_APB_AMS_REF_CTRL, 1976*91f16700Schasinglulu .status_reg = 0, 1977*91f16700Schasinglulu .parents = &((int32_t []) { 1978*91f16700Schasinglulu CLK_RPLL, 1979*91f16700Schasinglulu CLK_DUMMY_PARENT, 1980*91f16700Schasinglulu CLK_IOPLL, 1981*91f16700Schasinglulu CLK_DPLL_TO_LPD, 1982*91f16700Schasinglulu CLK_NA_PARENT 1983*91f16700Schasinglulu }), 1984*91f16700Schasinglulu .nodes = &generic_mux_div_div_gate_nodes, 1985*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes), 1986*91f16700Schasinglulu }, 1987*91f16700Schasinglulu [CLK_IOPLL_TO_FPD] = { 1988*91f16700Schasinglulu .name = "iopll_to_fpd", 1989*91f16700Schasinglulu .control_reg = CRL_APB_IOPLL_TO_FPD_CTRL, 1990*91f16700Schasinglulu .status_reg = 0, 1991*91f16700Schasinglulu .parents = &((int32_t []) {CLK_IOPLL, CLK_NA_PARENT}), 1992*91f16700Schasinglulu .nodes = &generic_domain_crossing_nodes, 1993*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_domain_crossing_nodes), 1994*91f16700Schasinglulu }, 1995*91f16700Schasinglulu [CLK_RPLL_TO_FPD] = { 1996*91f16700Schasinglulu .name = "rpll_to_fpd", 1997*91f16700Schasinglulu .control_reg = CRL_APB_RPLL_TO_FPD_CTRL, 1998*91f16700Schasinglulu .status_reg = 0, 1999*91f16700Schasinglulu .parents = &((int32_t []) {CLK_RPLL, CLK_NA_PARENT}), 2000*91f16700Schasinglulu .nodes = &rpll_to_fpd_nodes, 2001*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(rpll_to_fpd_nodes), 2002*91f16700Schasinglulu }, 2003*91f16700Schasinglulu [CLK_APLL_TO_LPD] = { 2004*91f16700Schasinglulu .name = "apll_to_lpd", 2005*91f16700Schasinglulu .control_reg = CRF_APB_APLL_TO_LPD_CTRL, 2006*91f16700Schasinglulu .status_reg = 0, 2007*91f16700Schasinglulu .parents = &((int32_t []) {CLK_APLL, CLK_NA_PARENT}), 2008*91f16700Schasinglulu .nodes = &generic_domain_crossing_nodes, 2009*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_domain_crossing_nodes), 2010*91f16700Schasinglulu }, 2011*91f16700Schasinglulu [CLK_DPLL_TO_LPD] = { 2012*91f16700Schasinglulu .name = "dpll_to_lpd", 2013*91f16700Schasinglulu .control_reg = CRF_APB_DPLL_TO_LPD_CTRL, 2014*91f16700Schasinglulu .status_reg = 0, 2015*91f16700Schasinglulu .parents = &((int32_t []) {CLK_DPLL, CLK_NA_PARENT}), 2016*91f16700Schasinglulu .nodes = &generic_domain_crossing_nodes, 2017*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_domain_crossing_nodes), 2018*91f16700Schasinglulu }, 2019*91f16700Schasinglulu [CLK_VPLL_TO_LPD] = { 2020*91f16700Schasinglulu .name = "vpll_to_lpd", 2021*91f16700Schasinglulu .control_reg = CRF_APB_VPLL_TO_LPD_CTRL, 2022*91f16700Schasinglulu .status_reg = 0, 2023*91f16700Schasinglulu .parents = &((int32_t []) {CLK_VPLL, CLK_NA_PARENT}), 2024*91f16700Schasinglulu .nodes = &generic_domain_crossing_nodes, 2025*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(generic_domain_crossing_nodes), 2026*91f16700Schasinglulu }, 2027*91f16700Schasinglulu [CLK_GEM0_TX] = { 2028*91f16700Schasinglulu .name = "gem0_tx", 2029*91f16700Schasinglulu .control_reg = CRL_APB_GEM0_REF_CTRL, 2030*91f16700Schasinglulu .status_reg = 0, 2031*91f16700Schasinglulu .parents = &((int32_t []) { 2032*91f16700Schasinglulu CLK_GEM0_REF, 2033*91f16700Schasinglulu CLK_NA_PARENT 2034*91f16700Schasinglulu }), 2035*91f16700Schasinglulu .nodes = &gem_tx_nodes, 2036*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem_tx_nodes), 2037*91f16700Schasinglulu }, 2038*91f16700Schasinglulu [CLK_GEM1_TX] = { 2039*91f16700Schasinglulu .name = "gem1_tx", 2040*91f16700Schasinglulu .control_reg = CRL_APB_GEM1_REF_CTRL, 2041*91f16700Schasinglulu .status_reg = 0, 2042*91f16700Schasinglulu .parents = &((int32_t []) { 2043*91f16700Schasinglulu CLK_GEM1_REF, 2044*91f16700Schasinglulu CLK_NA_PARENT 2045*91f16700Schasinglulu }), 2046*91f16700Schasinglulu .nodes = &gem_tx_nodes, 2047*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem_tx_nodes), 2048*91f16700Schasinglulu }, 2049*91f16700Schasinglulu [CLK_GEM2_TX] = { 2050*91f16700Schasinglulu .name = "gem2_tx", 2051*91f16700Schasinglulu .control_reg = CRL_APB_GEM2_REF_CTRL, 2052*91f16700Schasinglulu .status_reg = 0, 2053*91f16700Schasinglulu .parents = &((int32_t []) { 2054*91f16700Schasinglulu CLK_GEM2_REF, 2055*91f16700Schasinglulu CLK_NA_PARENT 2056*91f16700Schasinglulu }), 2057*91f16700Schasinglulu .nodes = &gem_tx_nodes, 2058*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem_tx_nodes), 2059*91f16700Schasinglulu }, 2060*91f16700Schasinglulu [CLK_GEM3_TX] = { 2061*91f16700Schasinglulu .name = "gem3_tx", 2062*91f16700Schasinglulu .control_reg = CRL_APB_GEM3_REF_CTRL, 2063*91f16700Schasinglulu .status_reg = 0, 2064*91f16700Schasinglulu .parents = &((int32_t []) { 2065*91f16700Schasinglulu CLK_GEM3_REF, 2066*91f16700Schasinglulu CLK_NA_PARENT 2067*91f16700Schasinglulu }), 2068*91f16700Schasinglulu .nodes = &gem_tx_nodes, 2069*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem_tx_nodes), 2070*91f16700Schasinglulu }, 2071*91f16700Schasinglulu [CLK_GEM0_RX] = { 2072*91f16700Schasinglulu .name = "gem0_rx", 2073*91f16700Schasinglulu .control_reg = CRL_APB_GEM0_REF_CTRL, 2074*91f16700Schasinglulu .status_reg = 0, 2075*91f16700Schasinglulu .parents = &((int32_t []) { 2076*91f16700Schasinglulu EXT_CLK_GEM0_RX_EMIO | CLK_EXTERNAL_PARENT, 2077*91f16700Schasinglulu CLK_NA_PARENT 2078*91f16700Schasinglulu }), 2079*91f16700Schasinglulu .nodes = &gem_rx_nodes, 2080*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem_rx_nodes), 2081*91f16700Schasinglulu }, 2082*91f16700Schasinglulu [CLK_GEM1_RX] = { 2083*91f16700Schasinglulu .name = "gem1_rx", 2084*91f16700Schasinglulu .control_reg = CRL_APB_GEM1_REF_CTRL, 2085*91f16700Schasinglulu .status_reg = 0, 2086*91f16700Schasinglulu .parents = &((int32_t []) { 2087*91f16700Schasinglulu EXT_CLK_GEM1_RX_EMIO | CLK_EXTERNAL_PARENT, 2088*91f16700Schasinglulu CLK_NA_PARENT 2089*91f16700Schasinglulu }), 2090*91f16700Schasinglulu .nodes = &gem_rx_nodes, 2091*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem_rx_nodes), 2092*91f16700Schasinglulu }, 2093*91f16700Schasinglulu [CLK_GEM2_RX] = { 2094*91f16700Schasinglulu .name = "gem2_rx", 2095*91f16700Schasinglulu .control_reg = CRL_APB_GEM2_REF_CTRL, 2096*91f16700Schasinglulu .status_reg = 0, 2097*91f16700Schasinglulu .parents = &((int32_t []) { 2098*91f16700Schasinglulu EXT_CLK_GEM2_RX_EMIO | CLK_EXTERNAL_PARENT, 2099*91f16700Schasinglulu CLK_NA_PARENT 2100*91f16700Schasinglulu }), 2101*91f16700Schasinglulu .nodes = &gem_rx_nodes, 2102*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem_rx_nodes), 2103*91f16700Schasinglulu }, 2104*91f16700Schasinglulu [CLK_GEM3_RX] = { 2105*91f16700Schasinglulu .name = "gem3_rx", 2106*91f16700Schasinglulu .control_reg = CRL_APB_GEM3_REF_CTRL, 2107*91f16700Schasinglulu .status_reg = 0, 2108*91f16700Schasinglulu .parents = &((int32_t []) { 2109*91f16700Schasinglulu EXT_CLK_GEM3_RX_EMIO | CLK_EXTERNAL_PARENT, 2110*91f16700Schasinglulu CLK_NA_PARENT 2111*91f16700Schasinglulu }), 2112*91f16700Schasinglulu .nodes = &gem_rx_nodes, 2113*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem_rx_nodes), 2114*91f16700Schasinglulu }, 2115*91f16700Schasinglulu [CLK_ACPU_HALF] = { 2116*91f16700Schasinglulu .name = "acpu_half", 2117*91f16700Schasinglulu .control_reg = CRF_APB_ACPU_CTRL, 2118*91f16700Schasinglulu .status_reg = 0, 2119*91f16700Schasinglulu .parents = &((int32_t []) { 2120*91f16700Schasinglulu CLK_ACPU | PARENT_CLK_NODE2 << CLK_PARENTS_ID_LEN, 2121*91f16700Schasinglulu CLK_NA_PARENT 2122*91f16700Schasinglulu }), 2123*91f16700Schasinglulu .nodes = &acpu_half_nodes, 2124*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(acpu_half_nodes), 2125*91f16700Schasinglulu }, 2126*91f16700Schasinglulu [CLK_FPD_WDT] = { 2127*91f16700Schasinglulu .name = "fpd_wdt", 2128*91f16700Schasinglulu .control_reg = FPD_SLCR_WDT_CLK_SEL, 2129*91f16700Schasinglulu .status_reg = 0, 2130*91f16700Schasinglulu .parents = &((int32_t []) { 2131*91f16700Schasinglulu CLK_TOPSW_LSBUS, 2132*91f16700Schasinglulu EXT_CLK_SWDT0 | CLK_EXTERNAL_PARENT, 2133*91f16700Schasinglulu CLK_NA_PARENT 2134*91f16700Schasinglulu }), 2135*91f16700Schasinglulu .nodes = &wdt_nodes, 2136*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(wdt_nodes), 2137*91f16700Schasinglulu }, 2138*91f16700Schasinglulu [CLK_GPU_PP0_REF] = { 2139*91f16700Schasinglulu .name = "gpu_pp0_ref", 2140*91f16700Schasinglulu .control_reg = CRF_APB_GPU_REF_CTRL, 2141*91f16700Schasinglulu .status_reg = 0, 2142*91f16700Schasinglulu .parents = &((int32_t []) { 2143*91f16700Schasinglulu CLK_GPU_REF | PARENT_CLK_NODE2 << CLK_PARENTS_ID_LEN, 2144*91f16700Schasinglulu CLK_NA_PARENT 2145*91f16700Schasinglulu }), 2146*91f16700Schasinglulu .nodes = &gpu_pp0_nodes, 2147*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gpu_pp0_nodes), 2148*91f16700Schasinglulu }, 2149*91f16700Schasinglulu [CLK_GPU_PP1_REF] = { 2150*91f16700Schasinglulu .name = "gpu_pp1_ref", 2151*91f16700Schasinglulu .control_reg = CRF_APB_GPU_REF_CTRL, 2152*91f16700Schasinglulu .status_reg = 0, 2153*91f16700Schasinglulu .parents = &((int32_t []) { 2154*91f16700Schasinglulu CLK_GPU_REF | PARENT_CLK_NODE2 << CLK_PARENTS_ID_LEN, 2155*91f16700Schasinglulu CLK_NA_PARENT 2156*91f16700Schasinglulu }), 2157*91f16700Schasinglulu .nodes = &gpu_pp1_nodes, 2158*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gpu_pp1_nodes), 2159*91f16700Schasinglulu }, 2160*91f16700Schasinglulu [CLK_GEM_TSU] = { 2161*91f16700Schasinglulu .name = "gem_tsu", 2162*91f16700Schasinglulu .control_reg = IOU_SLCR_GEM_CLK_CTRL, 2163*91f16700Schasinglulu .status_reg = 0, 2164*91f16700Schasinglulu .parents = &((int32_t []) { 2165*91f16700Schasinglulu CLK_GEM_TSU_REF, 2166*91f16700Schasinglulu CLK_GEM_TSU_REF, 2167*91f16700Schasinglulu EXT_CLK_MIO26 | CLK_EXTERNAL_PARENT, 2168*91f16700Schasinglulu EXT_CLK_MIO50_OR_MIO51 | CLK_EXTERNAL_PARENT, 2169*91f16700Schasinglulu CLK_NA_PARENT 2170*91f16700Schasinglulu }), 2171*91f16700Schasinglulu .nodes = &gem_tsu_nodes, 2172*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(gem_tsu_nodes), 2173*91f16700Schasinglulu }, 2174*91f16700Schasinglulu [CLK_CPU_R5_CORE] = { 2175*91f16700Schasinglulu .name = "cpu_r5_core", 2176*91f16700Schasinglulu .control_reg = CRL_APB_CPU_R5_CTRL, 2177*91f16700Schasinglulu .status_reg = 0, 2178*91f16700Schasinglulu .parents = &((int32_t []) { 2179*91f16700Schasinglulu CLK_CPU_R5 | PARENT_CLK_NODE2 << CLK_PARENTS_ID_LEN, 2180*91f16700Schasinglulu CLK_DUMMY_PARENT, 2181*91f16700Schasinglulu CLK_NA_PARENT 2182*91f16700Schasinglulu }), 2183*91f16700Schasinglulu .nodes = &cpu_r5_core_nodes, 2184*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(cpu_r5_core_nodes), 2185*91f16700Schasinglulu }, 2186*91f16700Schasinglulu [CLK_CAN0_MIO] = { 2187*91f16700Schasinglulu .name = "can0_mio", 2188*91f16700Schasinglulu .control_reg = IOU_SLCR_CAN_MIO_CTRL, 2189*91f16700Schasinglulu .status_reg = 0, 2190*91f16700Schasinglulu .parents = &can_mio_parents, 2191*91f16700Schasinglulu .nodes = &can0_mio_nodes, 2192*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(can0_mio_nodes), 2193*91f16700Schasinglulu }, 2194*91f16700Schasinglulu [CLK_CAN1_MIO] = { 2195*91f16700Schasinglulu .name = "can1_mio", 2196*91f16700Schasinglulu .control_reg = IOU_SLCR_CAN_MIO_CTRL, 2197*91f16700Schasinglulu .status_reg = 0, 2198*91f16700Schasinglulu .parents = &can_mio_parents, 2199*91f16700Schasinglulu .nodes = &can1_mio_nodes, 2200*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(can1_mio_nodes), 2201*91f16700Schasinglulu }, 2202*91f16700Schasinglulu [CLK_CAN0] = { 2203*91f16700Schasinglulu .name = "can0", 2204*91f16700Schasinglulu .control_reg = IOU_SLCR_CAN_MIO_CTRL, 2205*91f16700Schasinglulu .status_reg = 0, 2206*91f16700Schasinglulu .parents = &((int32_t []) { 2207*91f16700Schasinglulu CLK_CAN0_REF, 2208*91f16700Schasinglulu CLK_CAN0_MIO, 2209*91f16700Schasinglulu CLK_NA_PARENT 2210*91f16700Schasinglulu }), 2211*91f16700Schasinglulu .nodes = &can0_nodes, 2212*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(can0_nodes), 2213*91f16700Schasinglulu }, 2214*91f16700Schasinglulu [CLK_CAN1] = { 2215*91f16700Schasinglulu .name = "can1", 2216*91f16700Schasinglulu .control_reg = IOU_SLCR_CAN_MIO_CTRL, 2217*91f16700Schasinglulu .status_reg = 0, 2218*91f16700Schasinglulu .parents = &((int32_t []) { 2219*91f16700Schasinglulu CLK_CAN1_REF, 2220*91f16700Schasinglulu CLK_CAN1_MIO, 2221*91f16700Schasinglulu CLK_NA_PARENT 2222*91f16700Schasinglulu }), 2223*91f16700Schasinglulu .nodes = &can1_nodes, 2224*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(can1_nodes), 2225*91f16700Schasinglulu }, 2226*91f16700Schasinglulu [CLK_LPD_WDT] = { 2227*91f16700Schasinglulu .name = "lpd_wdt", 2228*91f16700Schasinglulu .control_reg = IOU_SLCR_WDT_CLK_SEL, 2229*91f16700Schasinglulu .status_reg = 0, 2230*91f16700Schasinglulu .parents = &((int32_t []) { 2231*91f16700Schasinglulu CLK_LPD_LSBUS, 2232*91f16700Schasinglulu EXT_CLK_SWDT1 | CLK_EXTERNAL_PARENT, 2233*91f16700Schasinglulu CLK_NA_PARENT 2234*91f16700Schasinglulu }), 2235*91f16700Schasinglulu .nodes = &wdt_nodes, 2236*91f16700Schasinglulu .num_nodes = ARRAY_SIZE(wdt_nodes), 2237*91f16700Schasinglulu }, 2238*91f16700Schasinglulu }; 2239*91f16700Schasinglulu 2240*91f16700Schasinglulu static struct pm_ext_clock ext_clocks[] = { 2241*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_PSS_REF)] = { 2242*91f16700Schasinglulu .name = "pss_ref_clk", 2243*91f16700Schasinglulu }, 2244*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_VIDEO)] = { 2245*91f16700Schasinglulu .name = "video_clk", 2246*91f16700Schasinglulu }, 2247*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_PSS_ALT_REF)] = { 2248*91f16700Schasinglulu .name = "pss_alt_ref_clk", 2249*91f16700Schasinglulu }, 2250*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_AUX_REF)] = { 2251*91f16700Schasinglulu .name = "aux_ref_clk", 2252*91f16700Schasinglulu }, 2253*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_GT_CRX_REF)] = { 2254*91f16700Schasinglulu .name = "video_clk", 2255*91f16700Schasinglulu }, 2256*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_SWDT0)] = { 2257*91f16700Schasinglulu .name = "swdt0_ext_clk", 2258*91f16700Schasinglulu }, 2259*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_SWDT1)] = { 2260*91f16700Schasinglulu .name = "swdt1_ext_clk", 2261*91f16700Schasinglulu }, 2262*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_GEM0_TX_EMIO)] = { 2263*91f16700Schasinglulu .name = "gem0_tx_ext", 2264*91f16700Schasinglulu }, 2265*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_GEM1_TX_EMIO)] = { 2266*91f16700Schasinglulu .name = "gem1_tx_ext", 2267*91f16700Schasinglulu }, 2268*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_GEM2_TX_EMIO)] = { 2269*91f16700Schasinglulu .name = "gem2_tx_ext", 2270*91f16700Schasinglulu }, 2271*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_GEM3_TX_EMIO)] = { 2272*91f16700Schasinglulu .name = "gem3_tx_ext", 2273*91f16700Schasinglulu }, 2274*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_GEM0_RX_EMIO)] = { 2275*91f16700Schasinglulu .name = "gem0_rx_ext", 2276*91f16700Schasinglulu }, 2277*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_GEM1_RX_EMIO)] = { 2278*91f16700Schasinglulu .name = "gem1_rx_ext", 2279*91f16700Schasinglulu }, 2280*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_GEM2_RX_EMIO)] = { 2281*91f16700Schasinglulu .name = "gem2_rx_ext", 2282*91f16700Schasinglulu }, 2283*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_GEM3_RX_EMIO)] = { 2284*91f16700Schasinglulu .name = "gem3_rx_ext", 2285*91f16700Schasinglulu }, 2286*91f16700Schasinglulu [EXT_CLK_INDEX(EXT_CLK_MIO50_OR_MIO51)] = { 2287*91f16700Schasinglulu .name = "mio_clk_50_51", 2288*91f16700Schasinglulu }, 2289*91f16700Schasinglulu EXT_CLK_MIO_DATA(0), 2290*91f16700Schasinglulu EXT_CLK_MIO_DATA(1), 2291*91f16700Schasinglulu EXT_CLK_MIO_DATA(2), 2292*91f16700Schasinglulu EXT_CLK_MIO_DATA(3), 2293*91f16700Schasinglulu EXT_CLK_MIO_DATA(4), 2294*91f16700Schasinglulu EXT_CLK_MIO_DATA(5), 2295*91f16700Schasinglulu EXT_CLK_MIO_DATA(6), 2296*91f16700Schasinglulu EXT_CLK_MIO_DATA(7), 2297*91f16700Schasinglulu EXT_CLK_MIO_DATA(8), 2298*91f16700Schasinglulu EXT_CLK_MIO_DATA(9), 2299*91f16700Schasinglulu EXT_CLK_MIO_DATA(10), 2300*91f16700Schasinglulu EXT_CLK_MIO_DATA(11), 2301*91f16700Schasinglulu EXT_CLK_MIO_DATA(12), 2302*91f16700Schasinglulu EXT_CLK_MIO_DATA(13), 2303*91f16700Schasinglulu EXT_CLK_MIO_DATA(14), 2304*91f16700Schasinglulu EXT_CLK_MIO_DATA(15), 2305*91f16700Schasinglulu EXT_CLK_MIO_DATA(16), 2306*91f16700Schasinglulu EXT_CLK_MIO_DATA(17), 2307*91f16700Schasinglulu EXT_CLK_MIO_DATA(18), 2308*91f16700Schasinglulu EXT_CLK_MIO_DATA(19), 2309*91f16700Schasinglulu EXT_CLK_MIO_DATA(20), 2310*91f16700Schasinglulu EXT_CLK_MIO_DATA(21), 2311*91f16700Schasinglulu EXT_CLK_MIO_DATA(22), 2312*91f16700Schasinglulu EXT_CLK_MIO_DATA(23), 2313*91f16700Schasinglulu EXT_CLK_MIO_DATA(24), 2314*91f16700Schasinglulu EXT_CLK_MIO_DATA(25), 2315*91f16700Schasinglulu EXT_CLK_MIO_DATA(26), 2316*91f16700Schasinglulu EXT_CLK_MIO_DATA(27), 2317*91f16700Schasinglulu EXT_CLK_MIO_DATA(28), 2318*91f16700Schasinglulu EXT_CLK_MIO_DATA(29), 2319*91f16700Schasinglulu EXT_CLK_MIO_DATA(30), 2320*91f16700Schasinglulu EXT_CLK_MIO_DATA(31), 2321*91f16700Schasinglulu EXT_CLK_MIO_DATA(32), 2322*91f16700Schasinglulu EXT_CLK_MIO_DATA(33), 2323*91f16700Schasinglulu EXT_CLK_MIO_DATA(34), 2324*91f16700Schasinglulu EXT_CLK_MIO_DATA(35), 2325*91f16700Schasinglulu EXT_CLK_MIO_DATA(36), 2326*91f16700Schasinglulu EXT_CLK_MIO_DATA(37), 2327*91f16700Schasinglulu EXT_CLK_MIO_DATA(38), 2328*91f16700Schasinglulu EXT_CLK_MIO_DATA(39), 2329*91f16700Schasinglulu EXT_CLK_MIO_DATA(40), 2330*91f16700Schasinglulu EXT_CLK_MIO_DATA(41), 2331*91f16700Schasinglulu EXT_CLK_MIO_DATA(42), 2332*91f16700Schasinglulu EXT_CLK_MIO_DATA(43), 2333*91f16700Schasinglulu EXT_CLK_MIO_DATA(44), 2334*91f16700Schasinglulu EXT_CLK_MIO_DATA(45), 2335*91f16700Schasinglulu EXT_CLK_MIO_DATA(46), 2336*91f16700Schasinglulu EXT_CLK_MIO_DATA(47), 2337*91f16700Schasinglulu EXT_CLK_MIO_DATA(48), 2338*91f16700Schasinglulu EXT_CLK_MIO_DATA(49), 2339*91f16700Schasinglulu EXT_CLK_MIO_DATA(50), 2340*91f16700Schasinglulu EXT_CLK_MIO_DATA(51), 2341*91f16700Schasinglulu EXT_CLK_MIO_DATA(52), 2342*91f16700Schasinglulu EXT_CLK_MIO_DATA(53), 2343*91f16700Schasinglulu EXT_CLK_MIO_DATA(54), 2344*91f16700Schasinglulu EXT_CLK_MIO_DATA(55), 2345*91f16700Schasinglulu EXT_CLK_MIO_DATA(56), 2346*91f16700Schasinglulu EXT_CLK_MIO_DATA(57), 2347*91f16700Schasinglulu EXT_CLK_MIO_DATA(58), 2348*91f16700Schasinglulu EXT_CLK_MIO_DATA(59), 2349*91f16700Schasinglulu EXT_CLK_MIO_DATA(60), 2350*91f16700Schasinglulu EXT_CLK_MIO_DATA(61), 2351*91f16700Schasinglulu EXT_CLK_MIO_DATA(62), 2352*91f16700Schasinglulu EXT_CLK_MIO_DATA(63), 2353*91f16700Schasinglulu EXT_CLK_MIO_DATA(64), 2354*91f16700Schasinglulu EXT_CLK_MIO_DATA(65), 2355*91f16700Schasinglulu EXT_CLK_MIO_DATA(66), 2356*91f16700Schasinglulu EXT_CLK_MIO_DATA(67), 2357*91f16700Schasinglulu EXT_CLK_MIO_DATA(68), 2358*91f16700Schasinglulu EXT_CLK_MIO_DATA(69), 2359*91f16700Schasinglulu EXT_CLK_MIO_DATA(70), 2360*91f16700Schasinglulu EXT_CLK_MIO_DATA(71), 2361*91f16700Schasinglulu EXT_CLK_MIO_DATA(72), 2362*91f16700Schasinglulu EXT_CLK_MIO_DATA(73), 2363*91f16700Schasinglulu EXT_CLK_MIO_DATA(74), 2364*91f16700Schasinglulu EXT_CLK_MIO_DATA(75), 2365*91f16700Schasinglulu EXT_CLK_MIO_DATA(76), 2366*91f16700Schasinglulu EXT_CLK_MIO_DATA(77), 2367*91f16700Schasinglulu }; 2368*91f16700Schasinglulu 2369*91f16700Schasinglulu /* Array of clock which are invalid for this variant */ 2370*91f16700Schasinglulu static uint32_t pm_clk_invalid_list[] = {CLK_USB0, CLK_USB1, CLK_CSU_SPB, 2371*91f16700Schasinglulu CLK_ACPU_FULL, 2372*91f16700Schasinglulu CLK_ACPU_HALF, 2373*91f16700Schasinglulu CLK_APLL_TO_LPD, 2374*91f16700Schasinglulu CLK_DBG_FPD, 2375*91f16700Schasinglulu CLK_DBG_LPD, 2376*91f16700Schasinglulu CLK_DBG_TRACE, 2377*91f16700Schasinglulu CLK_DBG_TSTMP, 2378*91f16700Schasinglulu CLK_DDR_REF, 2379*91f16700Schasinglulu CLK_TOPSW_MAIN, 2380*91f16700Schasinglulu CLK_GTGREF0_REF, 2381*91f16700Schasinglulu CLK_LPD_SWITCH, 2382*91f16700Schasinglulu CLK_CPU_R5, 2383*91f16700Schasinglulu CLK_CPU_R5_CORE, 2384*91f16700Schasinglulu CLK_CSU_SPB, 2385*91f16700Schasinglulu CLK_CSU_PLL, 2386*91f16700Schasinglulu CLK_PCAP, 2387*91f16700Schasinglulu CLK_IOU_SWITCH, 2388*91f16700Schasinglulu CLK_DLL_REF, 2389*91f16700Schasinglulu CLK_TIMESTAMP_REF, 2390*91f16700Schasinglulu }; 2391*91f16700Schasinglulu 2392*91f16700Schasinglulu /** 2393*91f16700Schasinglulu * pm_clock_valid - Check if clock is valid or not. 2394*91f16700Schasinglulu * @clock_id: Id of the clock to be queried. 2395*91f16700Schasinglulu * 2396*91f16700Schasinglulu * This function is used to check if given clock is valid 2397*91f16700Schasinglulu * or not for the chip variant. 2398*91f16700Schasinglulu * 2399*91f16700Schasinglulu * List of invalid clocks are maintained in array list for 2400*91f16700Schasinglulu * different variants. 2401*91f16700Schasinglulu * 2402*91f16700Schasinglulu * Return: Returns 1 if clock is valid else 0. 2403*91f16700Schasinglulu * 2404*91f16700Schasinglulu */ 2405*91f16700Schasinglulu static bool pm_clock_valid(uint32_t clock_id) 2406*91f16700Schasinglulu { 2407*91f16700Schasinglulu unsigned int i; 2408*91f16700Schasinglulu 2409*91f16700Schasinglulu for (i = 0U; i < ARRAY_SIZE(pm_clk_invalid_list); i++) 2410*91f16700Schasinglulu if (pm_clk_invalid_list[i] == clock_id) 2411*91f16700Schasinglulu return 0; 2412*91f16700Schasinglulu 2413*91f16700Schasinglulu return 1; 2414*91f16700Schasinglulu } 2415*91f16700Schasinglulu 2416*91f16700Schasinglulu /** 2417*91f16700Schasinglulu * pm_clock_type - Get clock's type. 2418*91f16700Schasinglulu * @clock_id: Id of the clock to be queried. 2419*91f16700Schasinglulu * 2420*91f16700Schasinglulu * This function is used to check type of clock (OUTPUT/EXTERNAL). 2421*91f16700Schasinglulu * 2422*91f16700Schasinglulu * Return: Returns type of clock (OUTPUT/EXTERNAL). 2423*91f16700Schasinglulu * 2424*91f16700Schasinglulu */ 2425*91f16700Schasinglulu static uint32_t pm_clock_type(uint32_t clock_id) 2426*91f16700Schasinglulu { 2427*91f16700Schasinglulu return (clock_id < CLK_MAX_OUTPUT_CLK) ? 2428*91f16700Schasinglulu CLK_TYPE_OUTPUT : CLK_TYPE_EXTERNAL; 2429*91f16700Schasinglulu } 2430*91f16700Schasinglulu 2431*91f16700Schasinglulu /** 2432*91f16700Schasinglulu * pm_api_clock_get_num_clocks() - PM call to request number of clocks. 2433*91f16700Schasinglulu * @nclocks: Number of clocks. 2434*91f16700Schasinglulu * 2435*91f16700Schasinglulu * This function is used by master to get number of clocks. 2436*91f16700Schasinglulu * 2437*91f16700Schasinglulu * Return: Returns success. 2438*91f16700Schasinglulu * 2439*91f16700Schasinglulu */ 2440*91f16700Schasinglulu enum pm_ret_status pm_api_clock_get_num_clocks(uint32_t *nclocks) 2441*91f16700Schasinglulu { 2442*91f16700Schasinglulu *nclocks = CLK_MAX; 2443*91f16700Schasinglulu 2444*91f16700Schasinglulu return PM_RET_SUCCESS; 2445*91f16700Schasinglulu } 2446*91f16700Schasinglulu 2447*91f16700Schasinglulu /** 2448*91f16700Schasinglulu * pm_api_clock_get_name() - PM call to request a clock's name. 2449*91f16700Schasinglulu * @clock_id: Clock ID. 2450*91f16700Schasinglulu * @name: Name of clock (max 16 bytes). 2451*91f16700Schasinglulu * 2452*91f16700Schasinglulu * This function is used by master to get nmae of clock specified 2453*91f16700Schasinglulu * by given clock ID. 2454*91f16700Schasinglulu * 2455*91f16700Schasinglulu */ 2456*91f16700Schasinglulu void pm_api_clock_get_name(uint32_t clock_id, char *name) 2457*91f16700Schasinglulu { 2458*91f16700Schasinglulu if (clock_id == CLK_MAX) { 2459*91f16700Schasinglulu memcpy(name, END_OF_CLK, sizeof(END_OF_CLK) > CLK_NAME_LEN ? 2460*91f16700Schasinglulu CLK_NAME_LEN : sizeof(END_OF_CLK)); 2461*91f16700Schasinglulu } else if ((clock_id > CLK_MAX) || (!pm_clock_valid(clock_id))) { 2462*91f16700Schasinglulu memset(name, 0, CLK_NAME_LEN); 2463*91f16700Schasinglulu } else if (clock_id < CLK_MAX_OUTPUT_CLK) { 2464*91f16700Schasinglulu memcpy(name, clocks[clock_id].name, CLK_NAME_LEN); 2465*91f16700Schasinglulu } else { 2466*91f16700Schasinglulu memcpy(name, ext_clocks[clock_id - CLK_MAX_OUTPUT_CLK].name, 2467*91f16700Schasinglulu CLK_NAME_LEN); 2468*91f16700Schasinglulu } 2469*91f16700Schasinglulu } 2470*91f16700Schasinglulu 2471*91f16700Schasinglulu /** 2472*91f16700Schasinglulu * pm_api_clock_get_topology() - PM call to request a clock's topology. 2473*91f16700Schasinglulu * @clock_id: Clock ID. 2474*91f16700Schasinglulu * @index: Topology index for next toplogy node. 2475*91f16700Schasinglulu * @topology: Buffer to store nodes in topology and flags. 2476*91f16700Schasinglulu * 2477*91f16700Schasinglulu * This function is used by master to get topology information for the 2478*91f16700Schasinglulu * clock specified by given clock ID. Each response would return 3 2479*91f16700Schasinglulu * topology nodes. To get next nodes, caller needs to call this API with 2480*91f16700Schasinglulu * index of next node. Index starts from 0. 2481*91f16700Schasinglulu * 2482*91f16700Schasinglulu * Return: Returns status, either success or error+reason. 2483*91f16700Schasinglulu * 2484*91f16700Schasinglulu */ 2485*91f16700Schasinglulu enum pm_ret_status pm_api_clock_get_topology(uint32_t clock_id, 2486*91f16700Schasinglulu uint32_t index, 2487*91f16700Schasinglulu uint32_t *topology) 2488*91f16700Schasinglulu { 2489*91f16700Schasinglulu struct pm_clock_node *clock_nodes; 2490*91f16700Schasinglulu uint8_t num_nodes; 2491*91f16700Schasinglulu uint32_t i; 2492*91f16700Schasinglulu uint16_t typeflags; 2493*91f16700Schasinglulu 2494*91f16700Schasinglulu if (!pm_clock_valid(clock_id)) { 2495*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2496*91f16700Schasinglulu } 2497*91f16700Schasinglulu 2498*91f16700Schasinglulu if (pm_clock_type(clock_id) != CLK_TYPE_OUTPUT) { 2499*91f16700Schasinglulu return PM_RET_ERROR_NOTSUPPORTED; 2500*91f16700Schasinglulu } 2501*91f16700Schasinglulu 2502*91f16700Schasinglulu memset(topology, 0, CLK_TOPOLOGY_PAYLOAD_LEN); 2503*91f16700Schasinglulu clock_nodes = *clocks[clock_id].nodes; 2504*91f16700Schasinglulu num_nodes = clocks[clock_id].num_nodes; 2505*91f16700Schasinglulu 2506*91f16700Schasinglulu /* Skip parent till index */ 2507*91f16700Schasinglulu if (index >= num_nodes) { 2508*91f16700Schasinglulu return PM_RET_SUCCESS; 2509*91f16700Schasinglulu } 2510*91f16700Schasinglulu 2511*91f16700Schasinglulu for (i = 0; i < 3U; i++) { 2512*91f16700Schasinglulu if ((index + i) == num_nodes) { 2513*91f16700Schasinglulu break; 2514*91f16700Schasinglulu } 2515*91f16700Schasinglulu 2516*91f16700Schasinglulu topology[i] = clock_nodes[index + i].type; 2517*91f16700Schasinglulu topology[i] |= clock_nodes[index + i].clkflags << 2518*91f16700Schasinglulu CLK_CLKFLAGS_SHIFT; 2519*91f16700Schasinglulu typeflags = clock_nodes[index + i].typeflags; 2520*91f16700Schasinglulu topology[i] |= (typeflags & CLK_TYPEFLAGS_BITS_MASK) << 2521*91f16700Schasinglulu CLK_TYPEFLAGS_SHIFT; 2522*91f16700Schasinglulu topology[i] |= (typeflags & CLK_TYPEFLAGS2_BITS_MASK) >> 2523*91f16700Schasinglulu (CLK_TYPEFLAGS_BITS - CLK_TYPEFLAGS2_SHIFT); 2524*91f16700Schasinglulu } 2525*91f16700Schasinglulu 2526*91f16700Schasinglulu return PM_RET_SUCCESS; 2527*91f16700Schasinglulu } 2528*91f16700Schasinglulu 2529*91f16700Schasinglulu /** 2530*91f16700Schasinglulu * pm_api_clock_get_fixedfactor_params() - PM call to request a clock's fixed 2531*91f16700Schasinglulu * factor parameters for fixed clock. 2532*91f16700Schasinglulu * @clock_id: Clock ID. 2533*91f16700Schasinglulu * @mul: Multiplication value. 2534*91f16700Schasinglulu * @div: Divisor value. 2535*91f16700Schasinglulu * 2536*91f16700Schasinglulu * This function is used by master to get fixed factor parameers for the 2537*91f16700Schasinglulu * fixed clock. This API is application only for the fixed clock. 2538*91f16700Schasinglulu * 2539*91f16700Schasinglulu * Return: Returns status, either success or error+reason. 2540*91f16700Schasinglulu * 2541*91f16700Schasinglulu */ 2542*91f16700Schasinglulu enum pm_ret_status pm_api_clock_get_fixedfactor_params(uint32_t clock_id, 2543*91f16700Schasinglulu uint32_t *mul, 2544*91f16700Schasinglulu uint32_t *div) 2545*91f16700Schasinglulu { 2546*91f16700Schasinglulu struct pm_clock_node *clock_nodes; 2547*91f16700Schasinglulu uint8_t num_nodes; 2548*91f16700Schasinglulu uint32_t type, i; 2549*91f16700Schasinglulu 2550*91f16700Schasinglulu if (!pm_clock_valid(clock_id)) { 2551*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2552*91f16700Schasinglulu } 2553*91f16700Schasinglulu 2554*91f16700Schasinglulu if (pm_clock_type(clock_id) != CLK_TYPE_OUTPUT) { 2555*91f16700Schasinglulu return PM_RET_ERROR_NOTSUPPORTED; 2556*91f16700Schasinglulu } 2557*91f16700Schasinglulu 2558*91f16700Schasinglulu clock_nodes = *clocks[clock_id].nodes; 2559*91f16700Schasinglulu num_nodes = clocks[clock_id].num_nodes; 2560*91f16700Schasinglulu 2561*91f16700Schasinglulu for (i = 0; i < num_nodes; i++) { 2562*91f16700Schasinglulu type = clock_nodes[i].type; 2563*91f16700Schasinglulu if (type == TYPE_FIXEDFACTOR) { 2564*91f16700Schasinglulu *mul = clock_nodes[i].mult; 2565*91f16700Schasinglulu *div = clock_nodes[i].div; 2566*91f16700Schasinglulu break; 2567*91f16700Schasinglulu } 2568*91f16700Schasinglulu } 2569*91f16700Schasinglulu 2570*91f16700Schasinglulu /* Clock is not fixed clock */ 2571*91f16700Schasinglulu if (i == num_nodes) { 2572*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2573*91f16700Schasinglulu } 2574*91f16700Schasinglulu 2575*91f16700Schasinglulu return PM_RET_SUCCESS; 2576*91f16700Schasinglulu } 2577*91f16700Schasinglulu 2578*91f16700Schasinglulu /** 2579*91f16700Schasinglulu * pm_api_clock_get_parents() - PM call to request a clock's first 3 parents. 2580*91f16700Schasinglulu * @clock_id: Clock ID. 2581*91f16700Schasinglulu * @index: Index of next parent. 2582*91f16700Schasinglulu * @parents: Parents of the given clock. 2583*91f16700Schasinglulu * 2584*91f16700Schasinglulu * This function is used by master to get clock's parents information. 2585*91f16700Schasinglulu * This API will return 3 parents with a single response. To get other 2586*91f16700Schasinglulu * parents, master should call same API in loop with new parent index 2587*91f16700Schasinglulu * till error is returned. 2588*91f16700Schasinglulu * 2589*91f16700Schasinglulu * E.g First call should have index 0 which will return parents 0, 1 and 2590*91f16700Schasinglulu * 2. Next call, index should be 3 which will return parent 3,4 and 5 and 2591*91f16700Schasinglulu * so on. 2592*91f16700Schasinglulu * 2593*91f16700Schasinglulu * Return: Returns status, either success or error+reason. 2594*91f16700Schasinglulu * 2595*91f16700Schasinglulu */ 2596*91f16700Schasinglulu enum pm_ret_status pm_api_clock_get_parents(uint32_t clock_id, 2597*91f16700Schasinglulu uint32_t index, 2598*91f16700Schasinglulu uint32_t *parents) 2599*91f16700Schasinglulu { 2600*91f16700Schasinglulu uint32_t i; 2601*91f16700Schasinglulu int32_t *clk_parents; 2602*91f16700Schasinglulu 2603*91f16700Schasinglulu if (!pm_clock_valid(clock_id)) { 2604*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2605*91f16700Schasinglulu } 2606*91f16700Schasinglulu 2607*91f16700Schasinglulu if (pm_clock_type(clock_id) != CLK_TYPE_OUTPUT) { 2608*91f16700Schasinglulu return PM_RET_ERROR_NOTSUPPORTED; 2609*91f16700Schasinglulu } 2610*91f16700Schasinglulu 2611*91f16700Schasinglulu clk_parents = *clocks[clock_id].parents; 2612*91f16700Schasinglulu if (clk_parents == NULL) { 2613*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2614*91f16700Schasinglulu } 2615*91f16700Schasinglulu 2616*91f16700Schasinglulu memset(parents, 0, CLK_PARENTS_PAYLOAD_LEN); 2617*91f16700Schasinglulu 2618*91f16700Schasinglulu /* Skip parent till index */ 2619*91f16700Schasinglulu for (i = 0; i < index; i++) { 2620*91f16700Schasinglulu if (clk_parents[i] == CLK_NA_PARENT) { 2621*91f16700Schasinglulu return PM_RET_SUCCESS; 2622*91f16700Schasinglulu } 2623*91f16700Schasinglulu } 2624*91f16700Schasinglulu 2625*91f16700Schasinglulu for (i = 0; i < 3U; i++) { 2626*91f16700Schasinglulu parents[i] = clk_parents[index + i]; 2627*91f16700Schasinglulu if (clk_parents[index + i] == CLK_NA_PARENT) { 2628*91f16700Schasinglulu break; 2629*91f16700Schasinglulu } 2630*91f16700Schasinglulu } 2631*91f16700Schasinglulu 2632*91f16700Schasinglulu return PM_RET_SUCCESS; 2633*91f16700Schasinglulu } 2634*91f16700Schasinglulu 2635*91f16700Schasinglulu /** 2636*91f16700Schasinglulu * pm_api_clock_get_attributes() - PM call to request a clock's attributes. 2637*91f16700Schasinglulu * @clock_id: Clock ID. 2638*91f16700Schasinglulu * @attr: Clock attributes. 2639*91f16700Schasinglulu * 2640*91f16700Schasinglulu * This function is used by master to get clock's attributes 2641*91f16700Schasinglulu * (e.g. valid, clock type, etc). 2642*91f16700Schasinglulu * 2643*91f16700Schasinglulu * Return: Returns status, either success or error+reason. 2644*91f16700Schasinglulu * 2645*91f16700Schasinglulu */ 2646*91f16700Schasinglulu enum pm_ret_status pm_api_clock_get_attributes(uint32_t clock_id, 2647*91f16700Schasinglulu uint32_t *attr) 2648*91f16700Schasinglulu { 2649*91f16700Schasinglulu if (clock_id >= CLK_MAX) { 2650*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2651*91f16700Schasinglulu } 2652*91f16700Schasinglulu 2653*91f16700Schasinglulu /* Clock valid bit */ 2654*91f16700Schasinglulu *attr = pm_clock_valid(clock_id); 2655*91f16700Schasinglulu 2656*91f16700Schasinglulu /* Clock type (Output/External) */ 2657*91f16700Schasinglulu *attr |= (pm_clock_type(clock_id) << CLK_TYPE_SHIFT); 2658*91f16700Schasinglulu 2659*91f16700Schasinglulu return PM_RET_SUCCESS; 2660*91f16700Schasinglulu } 2661*91f16700Schasinglulu 2662*91f16700Schasinglulu /** 2663*91f16700Schasinglulu * pm_api_clock_get_max_divisor - PM call to get max divisor. 2664*91f16700Schasinglulu * @clock_id: Clock ID. 2665*91f16700Schasinglulu * @div_type: Divisor Type (TYPE_DIV1 or TYPE_DIV2). 2666*91f16700Schasinglulu * @max_div: Maximum supported divisor. 2667*91f16700Schasinglulu * 2668*91f16700Schasinglulu * This function is used by master to get maximum supported value. 2669*91f16700Schasinglulu * 2670*91f16700Schasinglulu * Return: Returns status, either success or error+reason. 2671*91f16700Schasinglulu * 2672*91f16700Schasinglulu */ 2673*91f16700Schasinglulu enum pm_ret_status pm_api_clock_get_max_divisor(enum clock_id clock_id, 2674*91f16700Schasinglulu uint8_t div_type, 2675*91f16700Schasinglulu uint32_t *max_div) 2676*91f16700Schasinglulu { 2677*91f16700Schasinglulu uint32_t i; 2678*91f16700Schasinglulu struct pm_clock_node *nodes; 2679*91f16700Schasinglulu 2680*91f16700Schasinglulu if (clock_id >= CLK_MAX_OUTPUT_CLK) { 2681*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2682*91f16700Schasinglulu } 2683*91f16700Schasinglulu 2684*91f16700Schasinglulu nodes = *clocks[clock_id].nodes; 2685*91f16700Schasinglulu for (i = 0; i < clocks[clock_id].num_nodes; i++) { 2686*91f16700Schasinglulu if (nodes[i].type == div_type) { 2687*91f16700Schasinglulu if (CLK_DIVIDER_POWER_OF_TWO & 2688*91f16700Schasinglulu nodes[i].typeflags) { 2689*91f16700Schasinglulu *max_div = (1U << (BIT(nodes[i].width) - 1U)); 2690*91f16700Schasinglulu } else { 2691*91f16700Schasinglulu *max_div = BIT(nodes[i].width) - 1U; 2692*91f16700Schasinglulu } 2693*91f16700Schasinglulu return PM_RET_SUCCESS; 2694*91f16700Schasinglulu } 2695*91f16700Schasinglulu } 2696*91f16700Schasinglulu 2697*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2698*91f16700Schasinglulu } 2699*91f16700Schasinglulu 2700*91f16700Schasinglulu /** 2701*91f16700Schasinglulu * struct pm_pll - PLL related data required to map IOCTL-based PLL control. 2702*91f16700Schasinglulu * implemented by linux to system-level EEMI APIs. 2703*91f16700Schasinglulu * @nid: PLL node ID. 2704*91f16700Schasinglulu * @cid: PLL clock ID. 2705*91f16700Schasinglulu * @pre_src: Pre-source PLL clock ID. 2706*91f16700Schasinglulu * @post_src: Post-source PLL clock ID. 2707*91f16700Schasinglulu * @div2: DIV2 PLL clock ID. 2708*91f16700Schasinglulu * @bypass: PLL output clock ID that maps to bypass select output. 2709*91f16700Schasinglulu * @mode: PLL mode currently set via IOCTL (PLL_FRAC_MODE/PLL_INT_MODE). 2710*91f16700Schasinglulu * 2711*91f16700Schasinglulu */ 2712*91f16700Schasinglulu struct pm_pll { 2713*91f16700Schasinglulu const enum pm_node_id nid; 2714*91f16700Schasinglulu const enum clock_id cid; 2715*91f16700Schasinglulu const enum clock_id pre_src; 2716*91f16700Schasinglulu const enum clock_id post_src; 2717*91f16700Schasinglulu const enum clock_id div2; 2718*91f16700Schasinglulu const enum clock_id bypass; 2719*91f16700Schasinglulu uint8_t mode; 2720*91f16700Schasinglulu }; 2721*91f16700Schasinglulu 2722*91f16700Schasinglulu static struct pm_pll pm_plls[] = { 2723*91f16700Schasinglulu { 2724*91f16700Schasinglulu .nid = NODE_IOPLL, 2725*91f16700Schasinglulu .cid = CLK_IOPLL_INT, 2726*91f16700Schasinglulu .pre_src = CLK_IOPLL_PRE_SRC, 2727*91f16700Schasinglulu .post_src = CLK_IOPLL_POST_SRC, 2728*91f16700Schasinglulu .div2 = CLK_IOPLL_INT_MUX, 2729*91f16700Schasinglulu .bypass = CLK_IOPLL, 2730*91f16700Schasinglulu }, { 2731*91f16700Schasinglulu .nid = NODE_RPLL, 2732*91f16700Schasinglulu .cid = CLK_RPLL_INT, 2733*91f16700Schasinglulu .pre_src = CLK_RPLL_PRE_SRC, 2734*91f16700Schasinglulu .post_src = CLK_RPLL_POST_SRC, 2735*91f16700Schasinglulu .div2 = CLK_RPLL_INT_MUX, 2736*91f16700Schasinglulu .bypass = CLK_RPLL, 2737*91f16700Schasinglulu }, { 2738*91f16700Schasinglulu .nid = NODE_APLL, 2739*91f16700Schasinglulu .cid = CLK_APLL_INT, 2740*91f16700Schasinglulu .pre_src = CLK_APLL_PRE_SRC, 2741*91f16700Schasinglulu .post_src = CLK_APLL_POST_SRC, 2742*91f16700Schasinglulu .div2 = CLK_APLL_INT_MUX, 2743*91f16700Schasinglulu .bypass = CLK_APLL, 2744*91f16700Schasinglulu }, { 2745*91f16700Schasinglulu .nid = NODE_VPLL, 2746*91f16700Schasinglulu .cid = CLK_VPLL_INT, 2747*91f16700Schasinglulu .pre_src = CLK_VPLL_PRE_SRC, 2748*91f16700Schasinglulu .post_src = CLK_VPLL_POST_SRC, 2749*91f16700Schasinglulu .div2 = CLK_VPLL_INT_MUX, 2750*91f16700Schasinglulu .bypass = CLK_VPLL, 2751*91f16700Schasinglulu }, { 2752*91f16700Schasinglulu .nid = NODE_DPLL, 2753*91f16700Schasinglulu .cid = CLK_DPLL_INT, 2754*91f16700Schasinglulu .pre_src = CLK_DPLL_PRE_SRC, 2755*91f16700Schasinglulu .post_src = CLK_DPLL_POST_SRC, 2756*91f16700Schasinglulu .div2 = CLK_DPLL_INT_MUX, 2757*91f16700Schasinglulu .bypass = CLK_DPLL, 2758*91f16700Schasinglulu }, 2759*91f16700Schasinglulu }; 2760*91f16700Schasinglulu 2761*91f16700Schasinglulu /** 2762*91f16700Schasinglulu * pm_clock_get_pll() - Get PLL structure by PLL clock ID. 2763*91f16700Schasinglulu * @clock_id: Clock ID of the target PLL. 2764*91f16700Schasinglulu * 2765*91f16700Schasinglulu * Return: Pointer to PLL structure if found, NULL otherwise. 2766*91f16700Schasinglulu * 2767*91f16700Schasinglulu */ 2768*91f16700Schasinglulu struct pm_pll *pm_clock_get_pll(enum clock_id clock_id) 2769*91f16700Schasinglulu { 2770*91f16700Schasinglulu uint32_t i; 2771*91f16700Schasinglulu 2772*91f16700Schasinglulu for (i = 0; i < ARRAY_SIZE(pm_plls); i++) { 2773*91f16700Schasinglulu if (pm_plls[i].cid == clock_id) { 2774*91f16700Schasinglulu return &pm_plls[i]; 2775*91f16700Schasinglulu } 2776*91f16700Schasinglulu } 2777*91f16700Schasinglulu 2778*91f16700Schasinglulu return NULL; 2779*91f16700Schasinglulu } 2780*91f16700Schasinglulu 2781*91f16700Schasinglulu /** 2782*91f16700Schasinglulu * pm_clock_get_pll_node_id() - Get PLL node ID by PLL clock ID. 2783*91f16700Schasinglulu * @clock_id: Clock ID of the target PLL. 2784*91f16700Schasinglulu * @node_id: Location to store node ID of the target PLL. 2785*91f16700Schasinglulu * 2786*91f16700Schasinglulu * Return: PM_RET_SUCCESS if node ID is found, PM_RET_ERROR_ARGS otherwise. 2787*91f16700Schasinglulu * 2788*91f16700Schasinglulu */ 2789*91f16700Schasinglulu enum pm_ret_status pm_clock_get_pll_node_id(enum clock_id clock_id, 2790*91f16700Schasinglulu enum pm_node_id *node_id) 2791*91f16700Schasinglulu { 2792*91f16700Schasinglulu struct pm_pll *pll = pm_clock_get_pll(clock_id); 2793*91f16700Schasinglulu 2794*91f16700Schasinglulu if (pll) { 2795*91f16700Schasinglulu *node_id = pll->nid; 2796*91f16700Schasinglulu return PM_RET_SUCCESS; 2797*91f16700Schasinglulu } 2798*91f16700Schasinglulu 2799*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2800*91f16700Schasinglulu } 2801*91f16700Schasinglulu 2802*91f16700Schasinglulu /** 2803*91f16700Schasinglulu * pm_clock_get_pll_by_related_clk() - Get PLL structure by PLL-related clock 2804*91f16700Schasinglulu * ID. 2805*91f16700Schasinglulu * @clock_id: Clock ID. 2806*91f16700Schasinglulu * 2807*91f16700Schasinglulu * Return: Pointer to PLL structure if found, NULL otherwise. 2808*91f16700Schasinglulu * 2809*91f16700Schasinglulu */ 2810*91f16700Schasinglulu struct pm_pll *pm_clock_get_pll_by_related_clk(enum clock_id clock_id) 2811*91f16700Schasinglulu { 2812*91f16700Schasinglulu uint32_t i; 2813*91f16700Schasinglulu 2814*91f16700Schasinglulu for (i = 0; i < ARRAY_SIZE(pm_plls); i++) { 2815*91f16700Schasinglulu if (pm_plls[i].pre_src == clock_id || 2816*91f16700Schasinglulu pm_plls[i].post_src == clock_id || 2817*91f16700Schasinglulu pm_plls[i].div2 == clock_id || 2818*91f16700Schasinglulu pm_plls[i].bypass == clock_id) { 2819*91f16700Schasinglulu return &pm_plls[i]; 2820*91f16700Schasinglulu } 2821*91f16700Schasinglulu } 2822*91f16700Schasinglulu 2823*91f16700Schasinglulu return NULL; 2824*91f16700Schasinglulu } 2825*91f16700Schasinglulu 2826*91f16700Schasinglulu /** 2827*91f16700Schasinglulu * pm_clock_pll_enable() - "Enable" the PLL clock (lock the PLL). 2828*91f16700Schasinglulu * @pll: PLL to be locked. 2829*91f16700Schasinglulu * 2830*91f16700Schasinglulu * This function is used to map IOCTL/linux-based PLL handling to system-level 2831*91f16700Schasinglulu * EEMI APIs. 2832*91f16700Schasinglulu * 2833*91f16700Schasinglulu * Return: Error if the argument is not valid or status as returned by PMU. 2834*91f16700Schasinglulu * 2835*91f16700Schasinglulu */ 2836*91f16700Schasinglulu enum pm_ret_status pm_clock_pll_enable(struct pm_pll *pll) 2837*91f16700Schasinglulu { 2838*91f16700Schasinglulu if (pll == NULL) { 2839*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2840*91f16700Schasinglulu } 2841*91f16700Schasinglulu 2842*91f16700Schasinglulu /* Set the PLL mode according to the buffered mode value */ 2843*91f16700Schasinglulu if (pll->mode == PLL_FRAC_MODE) { 2844*91f16700Schasinglulu return pm_pll_set_mode(pll->nid, PM_PLL_MODE_FRACTIONAL); 2845*91f16700Schasinglulu } 2846*91f16700Schasinglulu 2847*91f16700Schasinglulu return pm_pll_set_mode(pll->nid, PM_PLL_MODE_INTEGER); 2848*91f16700Schasinglulu } 2849*91f16700Schasinglulu 2850*91f16700Schasinglulu /** 2851*91f16700Schasinglulu * pm_clock_pll_disable - "Disable" the PLL clock (bypass/reset the PLL). 2852*91f16700Schasinglulu * @pll: PLL to be bypassed/reset. 2853*91f16700Schasinglulu * 2854*91f16700Schasinglulu * This function is used to map IOCTL/linux-based PLL handling to system-level 2855*91f16700Schasinglulu * EEMI APIs. 2856*91f16700Schasinglulu * 2857*91f16700Schasinglulu * Return: Error if the argument is not valid or status as returned by PMU. 2858*91f16700Schasinglulu * 2859*91f16700Schasinglulu */ 2860*91f16700Schasinglulu enum pm_ret_status pm_clock_pll_disable(struct pm_pll *pll) 2861*91f16700Schasinglulu { 2862*91f16700Schasinglulu if (pll == NULL) { 2863*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2864*91f16700Schasinglulu } 2865*91f16700Schasinglulu 2866*91f16700Schasinglulu return pm_pll_set_mode(pll->nid, PM_PLL_MODE_RESET); 2867*91f16700Schasinglulu } 2868*91f16700Schasinglulu 2869*91f16700Schasinglulu /** 2870*91f16700Schasinglulu * pm_clock_pll_get_state - Get state of the PLL. 2871*91f16700Schasinglulu * @pll: Pointer to the target PLL structure. 2872*91f16700Schasinglulu * @state: Location to store the state: 1/0 ("Enabled"/"Disabled"). 2873*91f16700Schasinglulu * 2874*91f16700Schasinglulu * "Enable" actually means that the PLL is locked and its bypass is deasserted, 2875*91f16700Schasinglulu * "Disable" means that it is bypassed. 2876*91f16700Schasinglulu * 2877*91f16700Schasinglulu * Return: PM_RET_ERROR_ARGS error if the argument is not valid, success if 2878*91f16700Schasinglulu * returned state value is valid or an error if returned by PMU. 2879*91f16700Schasinglulu */ 2880*91f16700Schasinglulu enum pm_ret_status pm_clock_pll_get_state(struct pm_pll *pll, 2881*91f16700Schasinglulu uint32_t *state) 2882*91f16700Schasinglulu { 2883*91f16700Schasinglulu enum pm_ret_status status; 2884*91f16700Schasinglulu enum pm_pll_mode mode; 2885*91f16700Schasinglulu 2886*91f16700Schasinglulu if ((pll == NULL) || !state) { 2887*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2888*91f16700Schasinglulu } 2889*91f16700Schasinglulu 2890*91f16700Schasinglulu status = pm_pll_get_mode(pll->nid, &mode); 2891*91f16700Schasinglulu if (status != PM_RET_SUCCESS) { 2892*91f16700Schasinglulu return status; 2893*91f16700Schasinglulu } 2894*91f16700Schasinglulu 2895*91f16700Schasinglulu if (mode == PM_PLL_MODE_RESET) { 2896*91f16700Schasinglulu *state = 0; 2897*91f16700Schasinglulu } else { 2898*91f16700Schasinglulu *state = 1; 2899*91f16700Schasinglulu } 2900*91f16700Schasinglulu 2901*91f16700Schasinglulu return PM_RET_SUCCESS; 2902*91f16700Schasinglulu } 2903*91f16700Schasinglulu 2904*91f16700Schasinglulu /** 2905*91f16700Schasinglulu * pm_clock_pll_set_parent - Set the clock parent for PLL-related clock id. 2906*91f16700Schasinglulu * @pll: Target PLL structure. 2907*91f16700Schasinglulu * @clock_id: Id of the clock. 2908*91f16700Schasinglulu * @parent_index: parent index (=mux select value). 2909*91f16700Schasinglulu * 2910*91f16700Schasinglulu * The whole clock-tree implementation relies on the fact that parent indexes 2911*91f16700Schasinglulu * match to the multiplexer select values. This function has to rely on that 2912*91f16700Schasinglulu * assumption as well => parent_index is actually the mux select value. 2913*91f16700Schasinglulu * 2914*91f16700Schasinglulu * Return: Returns status, either success or error+reason. 2915*91f16700Schasinglulu * 2916*91f16700Schasinglulu */ 2917*91f16700Schasinglulu enum pm_ret_status pm_clock_pll_set_parent(struct pm_pll *pll, 2918*91f16700Schasinglulu enum clock_id clock_id, 2919*91f16700Schasinglulu uint32_t parent_index) 2920*91f16700Schasinglulu { 2921*91f16700Schasinglulu if (pll == NULL) { 2922*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2923*91f16700Schasinglulu } 2924*91f16700Schasinglulu if (pll->pre_src == clock_id) { 2925*91f16700Schasinglulu return pm_pll_set_parameter(pll->nid, PM_PLL_PARAM_PRE_SRC, 2926*91f16700Schasinglulu parent_index); 2927*91f16700Schasinglulu } 2928*91f16700Schasinglulu if (pll->post_src == clock_id) { 2929*91f16700Schasinglulu return pm_pll_set_parameter(pll->nid, PM_PLL_PARAM_POST_SRC, 2930*91f16700Schasinglulu parent_index); 2931*91f16700Schasinglulu } 2932*91f16700Schasinglulu if (pll->div2 == clock_id) { 2933*91f16700Schasinglulu return pm_pll_set_parameter(pll->nid, PM_PLL_PARAM_DIV2, 2934*91f16700Schasinglulu parent_index); 2935*91f16700Schasinglulu } 2936*91f16700Schasinglulu 2937*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2938*91f16700Schasinglulu } 2939*91f16700Schasinglulu 2940*91f16700Schasinglulu /** 2941*91f16700Schasinglulu * pm_clock_pll_get_parent - Get mux select value of PLL-related clock parent. 2942*91f16700Schasinglulu * @pll: Target PLL structure. 2943*91f16700Schasinglulu * @clock_id: Id of the clock. 2944*91f16700Schasinglulu * @parent_index: parent index (=mux select value). 2945*91f16700Schasinglulu * 2946*91f16700Schasinglulu * This function is used by master to get parent index for PLL-related clock. 2947*91f16700Schasinglulu * 2948*91f16700Schasinglulu * Return: Returns status, either success or error+reason. 2949*91f16700Schasinglulu * 2950*91f16700Schasinglulu */ 2951*91f16700Schasinglulu enum pm_ret_status pm_clock_pll_get_parent(struct pm_pll *pll, 2952*91f16700Schasinglulu enum clock_id clock_id, 2953*91f16700Schasinglulu uint32_t *parent_index) 2954*91f16700Schasinglulu { 2955*91f16700Schasinglulu if (pll == NULL) { 2956*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2957*91f16700Schasinglulu } 2958*91f16700Schasinglulu if (pll->pre_src == clock_id) { 2959*91f16700Schasinglulu return pm_pll_get_parameter(pll->nid, PM_PLL_PARAM_PRE_SRC, 2960*91f16700Schasinglulu parent_index); 2961*91f16700Schasinglulu } 2962*91f16700Schasinglulu if (pll->post_src == clock_id) { 2963*91f16700Schasinglulu return pm_pll_get_parameter(pll->nid, PM_PLL_PARAM_POST_SRC, 2964*91f16700Schasinglulu parent_index); 2965*91f16700Schasinglulu } 2966*91f16700Schasinglulu if (pll->div2 == clock_id) { 2967*91f16700Schasinglulu return pm_pll_get_parameter(pll->nid, PM_PLL_PARAM_DIV2, 2968*91f16700Schasinglulu parent_index); 2969*91f16700Schasinglulu } 2970*91f16700Schasinglulu if (pll->bypass == clock_id) { 2971*91f16700Schasinglulu *parent_index = 0; 2972*91f16700Schasinglulu return PM_RET_SUCCESS; 2973*91f16700Schasinglulu } 2974*91f16700Schasinglulu 2975*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2976*91f16700Schasinglulu } 2977*91f16700Schasinglulu 2978*91f16700Schasinglulu /** 2979*91f16700Schasinglulu * pm_clock_set_pll_mode() - Set PLL mode. 2980*91f16700Schasinglulu * @clock_id: PLL clock id. 2981*91f16700Schasinglulu * @mode: Mode fractional/integer. 2982*91f16700Schasinglulu * 2983*91f16700Schasinglulu * This function buffers/saves the PLL mode that is set. 2984*91f16700Schasinglulu * 2985*91f16700Schasinglulu * Return: Success if mode is buffered or error if an argument is invalid. 2986*91f16700Schasinglulu * 2987*91f16700Schasinglulu */ 2988*91f16700Schasinglulu enum pm_ret_status pm_clock_set_pll_mode(enum clock_id clock_id, 2989*91f16700Schasinglulu uint32_t mode) 2990*91f16700Schasinglulu { 2991*91f16700Schasinglulu struct pm_pll *pll = pm_clock_get_pll(clock_id); 2992*91f16700Schasinglulu 2993*91f16700Schasinglulu if ((pll == NULL) || (mode != PLL_FRAC_MODE && mode != PLL_INT_MODE)) { 2994*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 2995*91f16700Schasinglulu } 2996*91f16700Schasinglulu pll->mode = mode; 2997*91f16700Schasinglulu 2998*91f16700Schasinglulu return PM_RET_SUCCESS; 2999*91f16700Schasinglulu } 3000*91f16700Schasinglulu 3001*91f16700Schasinglulu /** 3002*91f16700Schasinglulu * pm_clock_get_pll_mode() - Get PLL mode. 3003*91f16700Schasinglulu * @clock_id: PLL clock id. 3004*91f16700Schasinglulu * @mode: Location to store the mode (fractional/integer). 3005*91f16700Schasinglulu * 3006*91f16700Schasinglulu * This function returns buffered PLL mode. 3007*91f16700Schasinglulu * 3008*91f16700Schasinglulu * Return: Success if mode is stored or error if an argument is invalid. 3009*91f16700Schasinglulu * 3010*91f16700Schasinglulu */ 3011*91f16700Schasinglulu enum pm_ret_status pm_clock_get_pll_mode(enum clock_id clock_id, 3012*91f16700Schasinglulu uint32_t *mode) 3013*91f16700Schasinglulu { 3014*91f16700Schasinglulu struct pm_pll *pll = pm_clock_get_pll(clock_id); 3015*91f16700Schasinglulu 3016*91f16700Schasinglulu if ((pll == NULL) || !mode) { 3017*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 3018*91f16700Schasinglulu } 3019*91f16700Schasinglulu *mode = pll->mode; 3020*91f16700Schasinglulu 3021*91f16700Schasinglulu return PM_RET_SUCCESS; 3022*91f16700Schasinglulu } 3023*91f16700Schasinglulu 3024*91f16700Schasinglulu /** 3025*91f16700Schasinglulu * pm_clock_id_is_valid() - Check if given clock ID is valid. 3026*91f16700Schasinglulu * @clock_id: ID of the clock to be checked. 3027*91f16700Schasinglulu * 3028*91f16700Schasinglulu * Return: Returns success if clock_id is valid, otherwise an error. 3029*91f16700Schasinglulu * 3030*91f16700Schasinglulu */ 3031*91f16700Schasinglulu enum pm_ret_status pm_clock_id_is_valid(uint32_t clock_id) 3032*91f16700Schasinglulu { 3033*91f16700Schasinglulu if (!pm_clock_valid(clock_id)) { 3034*91f16700Schasinglulu return PM_RET_ERROR_ARGS; 3035*91f16700Schasinglulu } 3036*91f16700Schasinglulu 3037*91f16700Schasinglulu if (pm_clock_type(clock_id) != CLK_TYPE_OUTPUT) { 3038*91f16700Schasinglulu return PM_RET_ERROR_NOTSUPPORTED; 3039*91f16700Schasinglulu } 3040*91f16700Schasinglulu 3041*91f16700Schasinglulu return PM_RET_SUCCESS; 3042*91f16700Schasinglulu } 3043*91f16700Schasinglulu 3044*91f16700Schasinglulu /** 3045*91f16700Schasinglulu * pm_clock_has_div() - Check if the clock has divider with given ID. 3046*91f16700Schasinglulu * @clock_id: Clock ID. 3047*91f16700Schasinglulu * @div_id: Divider ID. 3048*91f16700Schasinglulu * 3049*91f16700Schasinglulu * Return: True(1)=clock has the divider, false(0)=otherwise. 3050*91f16700Schasinglulu * 3051*91f16700Schasinglulu */ 3052*91f16700Schasinglulu uint8_t pm_clock_has_div(uint32_t clock_id, enum pm_clock_div_id div_id) 3053*91f16700Schasinglulu { 3054*91f16700Schasinglulu uint32_t i; 3055*91f16700Schasinglulu struct pm_clock_node *nodes; 3056*91f16700Schasinglulu 3057*91f16700Schasinglulu if (clock_id >= CLK_MAX_OUTPUT_CLK) { 3058*91f16700Schasinglulu return 0; 3059*91f16700Schasinglulu } 3060*91f16700Schasinglulu 3061*91f16700Schasinglulu nodes = *clocks[clock_id].nodes; 3062*91f16700Schasinglulu for (i = 0; i < clocks[clock_id].num_nodes; i++) { 3063*91f16700Schasinglulu if (nodes[i].type == TYPE_DIV1) { 3064*91f16700Schasinglulu if (div_id == PM_CLOCK_DIV0_ID) 3065*91f16700Schasinglulu return 1; 3066*91f16700Schasinglulu } else if (nodes[i].type == TYPE_DIV2) { 3067*91f16700Schasinglulu if (div_id == PM_CLOCK_DIV1_ID) 3068*91f16700Schasinglulu return 1; 3069*91f16700Schasinglulu } else { 3070*91f16700Schasinglulu /* To fix the misra 15.7 warning */ 3071*91f16700Schasinglulu } 3072*91f16700Schasinglulu } 3073*91f16700Schasinglulu 3074*91f16700Schasinglulu return 0; 3075*91f16700Schasinglulu } 3076