cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

gcc-mdm9615.c (36475B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
      4 * Copyright (c) BayLibre, SAS.
      5 * Author : Neil Armstrong <narmstrong@baylibre.com>
      6 */
      7
      8#include <linux/kernel.h>
      9#include <linux/bitops.h>
     10#include <linux/err.h>
     11#include <linux/platform_device.h>
     12#include <linux/module.h>
     13#include <linux/of.h>
     14#include <linux/of_device.h>
     15#include <linux/clk-provider.h>
     16#include <linux/regmap.h>
     17#include <linux/reset-controller.h>
     18
     19#include <dt-bindings/clock/qcom,gcc-mdm9615.h>
     20#include <dt-bindings/reset/qcom,gcc-mdm9615.h>
     21
     22#include "common.h"
     23#include "clk-regmap.h"
     24#include "clk-pll.h"
     25#include "clk-rcg.h"
     26#include "clk-branch.h"
     27#include "reset.h"
     28
     29static struct clk_fixed_factor cxo = {
     30	.mult = 1,
     31	.div = 1,
     32	.hw.init = &(struct clk_init_data){
     33		.name = "cxo",
     34		.parent_names = (const char *[]){ "cxo_board" },
     35		.num_parents = 1,
     36		.ops = &clk_fixed_factor_ops,
     37	},
     38};
     39
     40static struct clk_pll pll0 = {
     41	.l_reg = 0x30c4,
     42	.m_reg = 0x30c8,
     43	.n_reg = 0x30cc,
     44	.config_reg = 0x30d4,
     45	.mode_reg = 0x30c0,
     46	.status_reg = 0x30d8,
     47	.status_bit = 16,
     48	.clkr.hw.init = &(struct clk_init_data){
     49		.name = "pll0",
     50		.parent_names = (const char *[]){ "cxo" },
     51		.num_parents = 1,
     52		.ops = &clk_pll_ops,
     53	},
     54};
     55
     56static struct clk_regmap pll0_vote = {
     57	.enable_reg = 0x34c0,
     58	.enable_mask = BIT(0),
     59	.hw.init = &(struct clk_init_data){
     60		.name = "pll0_vote",
     61		.parent_names = (const char *[]){ "pll8" },
     62		.num_parents = 1,
     63		.ops = &clk_pll_vote_ops,
     64	},
     65};
     66
     67static struct clk_regmap pll4_vote = {
     68	.enable_reg = 0x34c0,
     69	.enable_mask = BIT(4),
     70	.hw.init = &(struct clk_init_data){
     71		.name = "pll4_vote",
     72		.parent_names = (const char *[]){ "pll4" },
     73		.num_parents = 1,
     74		.ops = &clk_pll_vote_ops,
     75	},
     76};
     77
     78static struct clk_pll pll8 = {
     79	.l_reg = 0x3144,
     80	.m_reg = 0x3148,
     81	.n_reg = 0x314c,
     82	.config_reg = 0x3154,
     83	.mode_reg = 0x3140,
     84	.status_reg = 0x3158,
     85	.status_bit = 16,
     86	.clkr.hw.init = &(struct clk_init_data){
     87		.name = "pll8",
     88		.parent_names = (const char *[]){ "cxo" },
     89		.num_parents = 1,
     90		.ops = &clk_pll_ops,
     91	},
     92};
     93
     94static struct clk_regmap pll8_vote = {
     95	.enable_reg = 0x34c0,
     96	.enable_mask = BIT(8),
     97	.hw.init = &(struct clk_init_data){
     98		.name = "pll8_vote",
     99		.parent_names = (const char *[]){ "pll8" },
    100		.num_parents = 1,
    101		.ops = &clk_pll_vote_ops,
    102	},
    103};
    104
    105static struct clk_pll pll14 = {
    106	.l_reg = 0x31c4,
    107	.m_reg = 0x31c8,
    108	.n_reg = 0x31cc,
    109	.config_reg = 0x31d4,
    110	.mode_reg = 0x31c0,
    111	.status_reg = 0x31d8,
    112	.status_bit = 16,
    113	.clkr.hw.init = &(struct clk_init_data){
    114		.name = "pll14",
    115		.parent_names = (const char *[]){ "cxo" },
    116		.num_parents = 1,
    117		.ops = &clk_pll_ops,
    118	},
    119};
    120
    121static struct clk_regmap pll14_vote = {
    122	.enable_reg = 0x34c0,
    123	.enable_mask = BIT(11),
    124	.hw.init = &(struct clk_init_data){
    125		.name = "pll14_vote",
    126		.parent_names = (const char *[]){ "pll14" },
    127		.num_parents = 1,
    128		.ops = &clk_pll_vote_ops,
    129	},
    130};
    131
    132enum {
    133	P_CXO,
    134	P_PLL8,
    135	P_PLL14,
    136};
    137
    138static const struct parent_map gcc_cxo_pll8_map[] = {
    139	{ P_CXO, 0 },
    140	{ P_PLL8, 3 }
    141};
    142
    143static const char * const gcc_cxo_pll8[] = {
    144	"cxo",
    145	"pll8_vote",
    146};
    147
    148static const struct parent_map gcc_cxo_pll14_map[] = {
    149	{ P_CXO, 0 },
    150	{ P_PLL14, 4 }
    151};
    152
    153static const char * const gcc_cxo_pll14[] = {
    154	"cxo",
    155	"pll14_vote",
    156};
    157
    158static const struct parent_map gcc_cxo_map[] = {
    159	{ P_CXO, 0 },
    160};
    161
    162static const char * const gcc_cxo[] = {
    163	"cxo",
    164};
    165
    166static struct freq_tbl clk_tbl_gsbi_uart[] = {
    167	{  1843200, P_PLL8, 2,  6, 625 },
    168	{  3686400, P_PLL8, 2, 12, 625 },
    169	{  7372800, P_PLL8, 2, 24, 625 },
    170	{ 14745600, P_PLL8, 2, 48, 625 },
    171	{ 16000000, P_PLL8, 4,  1,   6 },
    172	{ 24000000, P_PLL8, 4,  1,   4 },
    173	{ 32000000, P_PLL8, 4,  1,   3 },
    174	{ 40000000, P_PLL8, 1,  5,  48 },
    175	{ 46400000, P_PLL8, 1, 29, 240 },
    176	{ 48000000, P_PLL8, 4,  1,   2 },
    177	{ 51200000, P_PLL8, 1,  2,  15 },
    178	{ 56000000, P_PLL8, 1,  7,  48 },
    179	{ 58982400, P_PLL8, 1, 96, 625 },
    180	{ 64000000, P_PLL8, 2,  1,   3 },
    181	{ }
    182};
    183
    184static struct clk_rcg gsbi1_uart_src = {
    185	.ns_reg = 0x29d4,
    186	.md_reg = 0x29d0,
    187	.mn = {
    188		.mnctr_en_bit = 8,
    189		.mnctr_reset_bit = 7,
    190		.mnctr_mode_shift = 5,
    191		.n_val_shift = 16,
    192		.m_val_shift = 16,
    193		.width = 16,
    194	},
    195	.p = {
    196		.pre_div_shift = 3,
    197		.pre_div_width = 2,
    198	},
    199	.s = {
    200		.src_sel_shift = 0,
    201		.parent_map = gcc_cxo_pll8_map,
    202	},
    203	.freq_tbl = clk_tbl_gsbi_uart,
    204	.clkr = {
    205		.enable_reg = 0x29d4,
    206		.enable_mask = BIT(11),
    207		.hw.init = &(struct clk_init_data){
    208			.name = "gsbi1_uart_src",
    209			.parent_names = gcc_cxo_pll8,
    210			.num_parents = 2,
    211			.ops = &clk_rcg_ops,
    212			.flags = CLK_SET_PARENT_GATE,
    213		},
    214	},
    215};
    216
    217static struct clk_branch gsbi1_uart_clk = {
    218	.halt_reg = 0x2fcc,
    219	.halt_bit = 10,
    220	.clkr = {
    221		.enable_reg = 0x29d4,
    222		.enable_mask = BIT(9),
    223		.hw.init = &(struct clk_init_data){
    224			.name = "gsbi1_uart_clk",
    225			.parent_names = (const char *[]){
    226				"gsbi1_uart_src",
    227			},
    228			.num_parents = 1,
    229			.ops = &clk_branch_ops,
    230			.flags = CLK_SET_RATE_PARENT,
    231		},
    232	},
    233};
    234
    235static struct clk_rcg gsbi2_uart_src = {
    236	.ns_reg = 0x29f4,
    237	.md_reg = 0x29f0,
    238	.mn = {
    239		.mnctr_en_bit = 8,
    240		.mnctr_reset_bit = 7,
    241		.mnctr_mode_shift = 5,
    242		.n_val_shift = 16,
    243		.m_val_shift = 16,
    244		.width = 16,
    245	},
    246	.p = {
    247		.pre_div_shift = 3,
    248		.pre_div_width = 2,
    249	},
    250	.s = {
    251		.src_sel_shift = 0,
    252		.parent_map = gcc_cxo_pll8_map,
    253	},
    254	.freq_tbl = clk_tbl_gsbi_uart,
    255	.clkr = {
    256		.enable_reg = 0x29f4,
    257		.enable_mask = BIT(11),
    258		.hw.init = &(struct clk_init_data){
    259			.name = "gsbi2_uart_src",
    260			.parent_names = gcc_cxo_pll8,
    261			.num_parents = 2,
    262			.ops = &clk_rcg_ops,
    263			.flags = CLK_SET_PARENT_GATE,
    264		},
    265	},
    266};
    267
    268static struct clk_branch gsbi2_uart_clk = {
    269	.halt_reg = 0x2fcc,
    270	.halt_bit = 6,
    271	.clkr = {
    272		.enable_reg = 0x29f4,
    273		.enable_mask = BIT(9),
    274		.hw.init = &(struct clk_init_data){
    275			.name = "gsbi2_uart_clk",
    276			.parent_names = (const char *[]){
    277				"gsbi2_uart_src",
    278			},
    279			.num_parents = 1,
    280			.ops = &clk_branch_ops,
    281			.flags = CLK_SET_RATE_PARENT,
    282		},
    283	},
    284};
    285
    286static struct clk_rcg gsbi3_uart_src = {
    287	.ns_reg = 0x2a14,
    288	.md_reg = 0x2a10,
    289	.mn = {
    290		.mnctr_en_bit = 8,
    291		.mnctr_reset_bit = 7,
    292		.mnctr_mode_shift = 5,
    293		.n_val_shift = 16,
    294		.m_val_shift = 16,
    295		.width = 16,
    296	},
    297	.p = {
    298		.pre_div_shift = 3,
    299		.pre_div_width = 2,
    300	},
    301	.s = {
    302		.src_sel_shift = 0,
    303		.parent_map = gcc_cxo_pll8_map,
    304	},
    305	.freq_tbl = clk_tbl_gsbi_uart,
    306	.clkr = {
    307		.enable_reg = 0x2a14,
    308		.enable_mask = BIT(11),
    309		.hw.init = &(struct clk_init_data){
    310			.name = "gsbi3_uart_src",
    311			.parent_names = gcc_cxo_pll8,
    312			.num_parents = 2,
    313			.ops = &clk_rcg_ops,
    314			.flags = CLK_SET_PARENT_GATE,
    315		},
    316	},
    317};
    318
    319static struct clk_branch gsbi3_uart_clk = {
    320	.halt_reg = 0x2fcc,
    321	.halt_bit = 2,
    322	.clkr = {
    323		.enable_reg = 0x2a14,
    324		.enable_mask = BIT(9),
    325		.hw.init = &(struct clk_init_data){
    326			.name = "gsbi3_uart_clk",
    327			.parent_names = (const char *[]){
    328				"gsbi3_uart_src",
    329			},
    330			.num_parents = 1,
    331			.ops = &clk_branch_ops,
    332			.flags = CLK_SET_RATE_PARENT,
    333		},
    334	},
    335};
    336
    337static struct clk_rcg gsbi4_uart_src = {
    338	.ns_reg = 0x2a34,
    339	.md_reg = 0x2a30,
    340	.mn = {
    341		.mnctr_en_bit = 8,
    342		.mnctr_reset_bit = 7,
    343		.mnctr_mode_shift = 5,
    344		.n_val_shift = 16,
    345		.m_val_shift = 16,
    346		.width = 16,
    347	},
    348	.p = {
    349		.pre_div_shift = 3,
    350		.pre_div_width = 2,
    351	},
    352	.s = {
    353		.src_sel_shift = 0,
    354		.parent_map = gcc_cxo_pll8_map,
    355	},
    356	.freq_tbl = clk_tbl_gsbi_uart,
    357	.clkr = {
    358		.enable_reg = 0x2a34,
    359		.enable_mask = BIT(11),
    360		.hw.init = &(struct clk_init_data){
    361			.name = "gsbi4_uart_src",
    362			.parent_names = gcc_cxo_pll8,
    363			.num_parents = 2,
    364			.ops = &clk_rcg_ops,
    365			.flags = CLK_SET_PARENT_GATE,
    366		},
    367	},
    368};
    369
    370static struct clk_branch gsbi4_uart_clk = {
    371	.halt_reg = 0x2fd0,
    372	.halt_bit = 26,
    373	.clkr = {
    374		.enable_reg = 0x2a34,
    375		.enable_mask = BIT(9),
    376		.hw.init = &(struct clk_init_data){
    377			.name = "gsbi4_uart_clk",
    378			.parent_names = (const char *[]){
    379				"gsbi4_uart_src",
    380			},
    381			.num_parents = 1,
    382			.ops = &clk_branch_ops,
    383			.flags = CLK_SET_RATE_PARENT,
    384		},
    385	},
    386};
    387
    388static struct clk_rcg gsbi5_uart_src = {
    389	.ns_reg = 0x2a54,
    390	.md_reg = 0x2a50,
    391	.mn = {
    392		.mnctr_en_bit = 8,
    393		.mnctr_reset_bit = 7,
    394		.mnctr_mode_shift = 5,
    395		.n_val_shift = 16,
    396		.m_val_shift = 16,
    397		.width = 16,
    398	},
    399	.p = {
    400		.pre_div_shift = 3,
    401		.pre_div_width = 2,
    402	},
    403	.s = {
    404		.src_sel_shift = 0,
    405		.parent_map = gcc_cxo_pll8_map,
    406	},
    407	.freq_tbl = clk_tbl_gsbi_uart,
    408	.clkr = {
    409		.enable_reg = 0x2a54,
    410		.enable_mask = BIT(11),
    411		.hw.init = &(struct clk_init_data){
    412			.name = "gsbi5_uart_src",
    413			.parent_names = gcc_cxo_pll8,
    414			.num_parents = 2,
    415			.ops = &clk_rcg_ops,
    416			.flags = CLK_SET_PARENT_GATE,
    417		},
    418	},
    419};
    420
    421static struct clk_branch gsbi5_uart_clk = {
    422	.halt_reg = 0x2fd0,
    423	.halt_bit = 22,
    424	.clkr = {
    425		.enable_reg = 0x2a54,
    426		.enable_mask = BIT(9),
    427		.hw.init = &(struct clk_init_data){
    428			.name = "gsbi5_uart_clk",
    429			.parent_names = (const char *[]){
    430				"gsbi5_uart_src",
    431			},
    432			.num_parents = 1,
    433			.ops = &clk_branch_ops,
    434			.flags = CLK_SET_RATE_PARENT,
    435		},
    436	},
    437};
    438
    439static struct freq_tbl clk_tbl_gsbi_qup[] = {
    440	{   960000, P_CXO,  4, 1,  5 },
    441	{  4800000, P_CXO,  4, 0,  1 },
    442	{  9600000, P_CXO,  2, 0,  1 },
    443	{ 15060000, P_PLL8, 1, 2, 51 },
    444	{ 24000000, P_PLL8, 4, 1,  4 },
    445	{ 25600000, P_PLL8, 1, 1, 15 },
    446	{ 48000000, P_PLL8, 4, 1,  2 },
    447	{ 51200000, P_PLL8, 1, 2, 15 },
    448	{ }
    449};
    450
    451static struct clk_rcg gsbi1_qup_src = {
    452	.ns_reg = 0x29cc,
    453	.md_reg = 0x29c8,
    454	.mn = {
    455		.mnctr_en_bit = 8,
    456		.mnctr_reset_bit = 7,
    457		.mnctr_mode_shift = 5,
    458		.n_val_shift = 16,
    459		.m_val_shift = 16,
    460		.width = 8,
    461	},
    462	.p = {
    463		.pre_div_shift = 3,
    464		.pre_div_width = 2,
    465	},
    466	.s = {
    467		.src_sel_shift = 0,
    468		.parent_map = gcc_cxo_pll8_map,
    469	},
    470	.freq_tbl = clk_tbl_gsbi_qup,
    471	.clkr = {
    472		.enable_reg = 0x29cc,
    473		.enable_mask = BIT(11),
    474		.hw.init = &(struct clk_init_data){
    475			.name = "gsbi1_qup_src",
    476			.parent_names = gcc_cxo_pll8,
    477			.num_parents = 2,
    478			.ops = &clk_rcg_ops,
    479			.flags = CLK_SET_PARENT_GATE,
    480		},
    481	},
    482};
    483
    484static struct clk_branch gsbi1_qup_clk = {
    485	.halt_reg = 0x2fcc,
    486	.halt_bit = 9,
    487	.clkr = {
    488		.enable_reg = 0x29cc,
    489		.enable_mask = BIT(9),
    490		.hw.init = &(struct clk_init_data){
    491			.name = "gsbi1_qup_clk",
    492			.parent_names = (const char *[]){ "gsbi1_qup_src" },
    493			.num_parents = 1,
    494			.ops = &clk_branch_ops,
    495			.flags = CLK_SET_RATE_PARENT,
    496		},
    497	},
    498};
    499
    500static struct clk_rcg gsbi2_qup_src = {
    501	.ns_reg = 0x29ec,
    502	.md_reg = 0x29e8,
    503	.mn = {
    504		.mnctr_en_bit = 8,
    505		.mnctr_reset_bit = 7,
    506		.mnctr_mode_shift = 5,
    507		.n_val_shift = 16,
    508		.m_val_shift = 16,
    509		.width = 8,
    510	},
    511	.p = {
    512		.pre_div_shift = 3,
    513		.pre_div_width = 2,
    514	},
    515	.s = {
    516		.src_sel_shift = 0,
    517		.parent_map = gcc_cxo_pll8_map,
    518	},
    519	.freq_tbl = clk_tbl_gsbi_qup,
    520	.clkr = {
    521		.enable_reg = 0x29ec,
    522		.enable_mask = BIT(11),
    523		.hw.init = &(struct clk_init_data){
    524			.name = "gsbi2_qup_src",
    525			.parent_names = gcc_cxo_pll8,
    526			.num_parents = 2,
    527			.ops = &clk_rcg_ops,
    528			.flags = CLK_SET_PARENT_GATE,
    529		},
    530	},
    531};
    532
    533static struct clk_branch gsbi2_qup_clk = {
    534	.halt_reg = 0x2fcc,
    535	.halt_bit = 4,
    536	.clkr = {
    537		.enable_reg = 0x29ec,
    538		.enable_mask = BIT(9),
    539		.hw.init = &(struct clk_init_data){
    540			.name = "gsbi2_qup_clk",
    541			.parent_names = (const char *[]){ "gsbi2_qup_src" },
    542			.num_parents = 1,
    543			.ops = &clk_branch_ops,
    544			.flags = CLK_SET_RATE_PARENT,
    545		},
    546	},
    547};
    548
    549static struct clk_rcg gsbi3_qup_src = {
    550	.ns_reg = 0x2a0c,
    551	.md_reg = 0x2a08,
    552	.mn = {
    553		.mnctr_en_bit = 8,
    554		.mnctr_reset_bit = 7,
    555		.mnctr_mode_shift = 5,
    556		.n_val_shift = 16,
    557		.m_val_shift = 16,
    558		.width = 8,
    559	},
    560	.p = {
    561		.pre_div_shift = 3,
    562		.pre_div_width = 2,
    563	},
    564	.s = {
    565		.src_sel_shift = 0,
    566		.parent_map = gcc_cxo_pll8_map,
    567	},
    568	.freq_tbl = clk_tbl_gsbi_qup,
    569	.clkr = {
    570		.enable_reg = 0x2a0c,
    571		.enable_mask = BIT(11),
    572		.hw.init = &(struct clk_init_data){
    573			.name = "gsbi3_qup_src",
    574			.parent_names = gcc_cxo_pll8,
    575			.num_parents = 2,
    576			.ops = &clk_rcg_ops,
    577			.flags = CLK_SET_PARENT_GATE,
    578		},
    579	},
    580};
    581
    582static struct clk_branch gsbi3_qup_clk = {
    583	.halt_reg = 0x2fcc,
    584	.halt_bit = 0,
    585	.clkr = {
    586		.enable_reg = 0x2a0c,
    587		.enable_mask = BIT(9),
    588		.hw.init = &(struct clk_init_data){
    589			.name = "gsbi3_qup_clk",
    590			.parent_names = (const char *[]){ "gsbi3_qup_src" },
    591			.num_parents = 1,
    592			.ops = &clk_branch_ops,
    593			.flags = CLK_SET_RATE_PARENT,
    594		},
    595	},
    596};
    597
    598static struct clk_rcg gsbi4_qup_src = {
    599	.ns_reg = 0x2a2c,
    600	.md_reg = 0x2a28,
    601	.mn = {
    602		.mnctr_en_bit = 8,
    603		.mnctr_reset_bit = 7,
    604		.mnctr_mode_shift = 5,
    605		.n_val_shift = 16,
    606		.m_val_shift = 16,
    607		.width = 8,
    608	},
    609	.p = {
    610		.pre_div_shift = 3,
    611		.pre_div_width = 2,
    612	},
    613	.s = {
    614		.src_sel_shift = 0,
    615		.parent_map = gcc_cxo_pll8_map,
    616	},
    617	.freq_tbl = clk_tbl_gsbi_qup,
    618	.clkr = {
    619		.enable_reg = 0x2a2c,
    620		.enable_mask = BIT(11),
    621		.hw.init = &(struct clk_init_data){
    622			.name = "gsbi4_qup_src",
    623			.parent_names = gcc_cxo_pll8,
    624			.num_parents = 2,
    625			.ops = &clk_rcg_ops,
    626			.flags = CLK_SET_PARENT_GATE,
    627		},
    628	},
    629};
    630
    631static struct clk_branch gsbi4_qup_clk = {
    632	.halt_reg = 0x2fd0,
    633	.halt_bit = 24,
    634	.clkr = {
    635		.enable_reg = 0x2a2c,
    636		.enable_mask = BIT(9),
    637		.hw.init = &(struct clk_init_data){
    638			.name = "gsbi4_qup_clk",
    639			.parent_names = (const char *[]){ "gsbi4_qup_src" },
    640			.num_parents = 1,
    641			.ops = &clk_branch_ops,
    642			.flags = CLK_SET_RATE_PARENT,
    643		},
    644	},
    645};
    646
    647static struct clk_rcg gsbi5_qup_src = {
    648	.ns_reg = 0x2a4c,
    649	.md_reg = 0x2a48,
    650	.mn = {
    651		.mnctr_en_bit = 8,
    652		.mnctr_reset_bit = 7,
    653		.mnctr_mode_shift = 5,
    654		.n_val_shift = 16,
    655		.m_val_shift = 16,
    656		.width = 8,
    657	},
    658	.p = {
    659		.pre_div_shift = 3,
    660		.pre_div_width = 2,
    661	},
    662	.s = {
    663		.src_sel_shift = 0,
    664		.parent_map = gcc_cxo_pll8_map,
    665	},
    666	.freq_tbl = clk_tbl_gsbi_qup,
    667	.clkr = {
    668		.enable_reg = 0x2a4c,
    669		.enable_mask = BIT(11),
    670		.hw.init = &(struct clk_init_data){
    671			.name = "gsbi5_qup_src",
    672			.parent_names = gcc_cxo_pll8,
    673			.num_parents = 2,
    674			.ops = &clk_rcg_ops,
    675			.flags = CLK_SET_PARENT_GATE,
    676		},
    677	},
    678};
    679
    680static struct clk_branch gsbi5_qup_clk = {
    681	.halt_reg = 0x2fd0,
    682	.halt_bit = 20,
    683	.clkr = {
    684		.enable_reg = 0x2a4c,
    685		.enable_mask = BIT(9),
    686		.hw.init = &(struct clk_init_data){
    687			.name = "gsbi5_qup_clk",
    688			.parent_names = (const char *[]){ "gsbi5_qup_src" },
    689			.num_parents = 1,
    690			.ops = &clk_branch_ops,
    691			.flags = CLK_SET_RATE_PARENT,
    692		},
    693	},
    694};
    695
    696static const struct freq_tbl clk_tbl_gp[] = {
    697	{ 9600000, P_CXO,  2, 0, 0 },
    698	{ 19200000, P_CXO,  1, 0, 0 },
    699	{ }
    700};
    701
    702static struct clk_rcg gp0_src = {
    703	.ns_reg = 0x2d24,
    704	.md_reg = 0x2d00,
    705	.mn = {
    706		.mnctr_en_bit = 8,
    707		.mnctr_reset_bit = 7,
    708		.mnctr_mode_shift = 5,
    709		.n_val_shift = 16,
    710		.m_val_shift = 16,
    711		.width = 8,
    712	},
    713	.p = {
    714		.pre_div_shift = 3,
    715		.pre_div_width = 2,
    716	},
    717	.s = {
    718		.src_sel_shift = 0,
    719		.parent_map = gcc_cxo_map,
    720	},
    721	.freq_tbl = clk_tbl_gp,
    722	.clkr = {
    723		.enable_reg = 0x2d24,
    724		.enable_mask = BIT(11),
    725		.hw.init = &(struct clk_init_data){
    726			.name = "gp0_src",
    727			.parent_names = gcc_cxo,
    728			.num_parents = 1,
    729			.ops = &clk_rcg_ops,
    730			.flags = CLK_SET_PARENT_GATE,
    731		},
    732	}
    733};
    734
    735static struct clk_branch gp0_clk = {
    736	.halt_reg = 0x2fd8,
    737	.halt_bit = 7,
    738	.clkr = {
    739		.enable_reg = 0x2d24,
    740		.enable_mask = BIT(9),
    741		.hw.init = &(struct clk_init_data){
    742			.name = "gp0_clk",
    743			.parent_names = (const char *[]){ "gp0_src" },
    744			.num_parents = 1,
    745			.ops = &clk_branch_ops,
    746			.flags = CLK_SET_RATE_PARENT,
    747		},
    748	},
    749};
    750
    751static struct clk_rcg gp1_src = {
    752	.ns_reg = 0x2d44,
    753	.md_reg = 0x2d40,
    754	.mn = {
    755		.mnctr_en_bit = 8,
    756		.mnctr_reset_bit = 7,
    757		.mnctr_mode_shift = 5,
    758		.n_val_shift = 16,
    759		.m_val_shift = 16,
    760		.width = 8,
    761	},
    762	.p = {
    763		.pre_div_shift = 3,
    764		.pre_div_width = 2,
    765	},
    766	.s = {
    767		.src_sel_shift = 0,
    768		.parent_map = gcc_cxo_map,
    769	},
    770	.freq_tbl = clk_tbl_gp,
    771	.clkr = {
    772		.enable_reg = 0x2d44,
    773		.enable_mask = BIT(11),
    774		.hw.init = &(struct clk_init_data){
    775			.name = "gp1_src",
    776			.parent_names = gcc_cxo,
    777			.num_parents = 1,
    778			.ops = &clk_rcg_ops,
    779			.flags = CLK_SET_RATE_GATE,
    780		},
    781	}
    782};
    783
    784static struct clk_branch gp1_clk = {
    785	.halt_reg = 0x2fd8,
    786	.halt_bit = 6,
    787	.clkr = {
    788		.enable_reg = 0x2d44,
    789		.enable_mask = BIT(9),
    790		.hw.init = &(struct clk_init_data){
    791			.name = "gp1_clk",
    792			.parent_names = (const char *[]){ "gp1_src" },
    793			.num_parents = 1,
    794			.ops = &clk_branch_ops,
    795			.flags = CLK_SET_RATE_PARENT,
    796		},
    797	},
    798};
    799
    800static struct clk_rcg gp2_src = {
    801	.ns_reg = 0x2d64,
    802	.md_reg = 0x2d60,
    803	.mn = {
    804		.mnctr_en_bit = 8,
    805		.mnctr_reset_bit = 7,
    806		.mnctr_mode_shift = 5,
    807		.n_val_shift = 16,
    808		.m_val_shift = 16,
    809		.width = 8,
    810	},
    811	.p = {
    812		.pre_div_shift = 3,
    813		.pre_div_width = 2,
    814	},
    815	.s = {
    816		.src_sel_shift = 0,
    817		.parent_map = gcc_cxo_map,
    818	},
    819	.freq_tbl = clk_tbl_gp,
    820	.clkr = {
    821		.enable_reg = 0x2d64,
    822		.enable_mask = BIT(11),
    823		.hw.init = &(struct clk_init_data){
    824			.name = "gp2_src",
    825			.parent_names = gcc_cxo,
    826			.num_parents = 1,
    827			.ops = &clk_rcg_ops,
    828			.flags = CLK_SET_RATE_GATE,
    829		},
    830	}
    831};
    832
    833static struct clk_branch gp2_clk = {
    834	.halt_reg = 0x2fd8,
    835	.halt_bit = 5,
    836	.clkr = {
    837		.enable_reg = 0x2d64,
    838		.enable_mask = BIT(9),
    839		.hw.init = &(struct clk_init_data){
    840			.name = "gp2_clk",
    841			.parent_names = (const char *[]){ "gp2_src" },
    842			.num_parents = 1,
    843			.ops = &clk_branch_ops,
    844			.flags = CLK_SET_RATE_PARENT,
    845		},
    846	},
    847};
    848
    849static struct clk_branch pmem_clk = {
    850	.hwcg_reg = 0x25a0,
    851	.hwcg_bit = 6,
    852	.halt_reg = 0x2fc8,
    853	.halt_bit = 20,
    854	.clkr = {
    855		.enable_reg = 0x25a0,
    856		.enable_mask = BIT(4),
    857		.hw.init = &(struct clk_init_data){
    858			.name = "pmem_clk",
    859			.ops = &clk_branch_ops,
    860		},
    861	},
    862};
    863
    864static struct clk_rcg prng_src = {
    865	.ns_reg = 0x2e80,
    866	.p = {
    867		.pre_div_shift = 3,
    868		.pre_div_width = 4,
    869	},
    870	.s = {
    871		.src_sel_shift = 0,
    872		.parent_map = gcc_cxo_pll8_map,
    873	},
    874	.clkr = {
    875		.hw.init = &(struct clk_init_data){
    876			.name = "prng_src",
    877			.parent_names = gcc_cxo_pll8,
    878			.num_parents = 2,
    879			.ops = &clk_rcg_ops,
    880		},
    881	},
    882};
    883
    884static struct clk_branch prng_clk = {
    885	.halt_reg = 0x2fd8,
    886	.halt_check = BRANCH_HALT_VOTED,
    887	.halt_bit = 10,
    888	.clkr = {
    889		.enable_reg = 0x3080,
    890		.enable_mask = BIT(10),
    891		.hw.init = &(struct clk_init_data){
    892			.name = "prng_clk",
    893			.parent_names = (const char *[]){ "prng_src" },
    894			.num_parents = 1,
    895			.ops = &clk_branch_ops,
    896		},
    897	},
    898};
    899
    900static const struct freq_tbl clk_tbl_sdc[] = {
    901	{    144000, P_CXO,   1, 1, 133 },
    902	{    400000, P_PLL8,  4, 1, 240 },
    903	{  16000000, P_PLL8,  4, 1,   6 },
    904	{  17070000, P_PLL8,  1, 2,  45 },
    905	{  20210000, P_PLL8,  1, 1,  19 },
    906	{  24000000, P_PLL8,  4, 1,   4 },
    907	{  38400000, P_PLL8,  2, 1,   5 },
    908	{  48000000, P_PLL8,  4, 1,   2 },
    909	{  64000000, P_PLL8,  3, 1,   2 },
    910	{  76800000, P_PLL8,  1, 1,   5 },
    911	{ }
    912};
    913
    914static struct clk_rcg sdc1_src = {
    915	.ns_reg = 0x282c,
    916	.md_reg = 0x2828,
    917	.mn = {
    918		.mnctr_en_bit = 8,
    919		.mnctr_reset_bit = 7,
    920		.mnctr_mode_shift = 5,
    921		.n_val_shift = 16,
    922		.m_val_shift = 16,
    923		.width = 8,
    924	},
    925	.p = {
    926		.pre_div_shift = 3,
    927		.pre_div_width = 2,
    928	},
    929	.s = {
    930		.src_sel_shift = 0,
    931		.parent_map = gcc_cxo_pll8_map,
    932	},
    933	.freq_tbl = clk_tbl_sdc,
    934	.clkr = {
    935		.enable_reg = 0x282c,
    936		.enable_mask = BIT(11),
    937		.hw.init = &(struct clk_init_data){
    938			.name = "sdc1_src",
    939			.parent_names = gcc_cxo_pll8,
    940			.num_parents = 2,
    941			.ops = &clk_rcg_ops,
    942		},
    943	}
    944};
    945
    946static struct clk_branch sdc1_clk = {
    947	.halt_reg = 0x2fc8,
    948	.halt_bit = 6,
    949	.clkr = {
    950		.enable_reg = 0x282c,
    951		.enable_mask = BIT(9),
    952		.hw.init = &(struct clk_init_data){
    953			.name = "sdc1_clk",
    954			.parent_names = (const char *[]){ "sdc1_src" },
    955			.num_parents = 1,
    956			.ops = &clk_branch_ops,
    957			.flags = CLK_SET_RATE_PARENT,
    958		},
    959	},
    960};
    961
    962static struct clk_rcg sdc2_src = {
    963	.ns_reg = 0x284c,
    964	.md_reg = 0x2848,
    965	.mn = {
    966		.mnctr_en_bit = 8,
    967		.mnctr_reset_bit = 7,
    968		.mnctr_mode_shift = 5,
    969		.n_val_shift = 16,
    970		.m_val_shift = 16,
    971		.width = 8,
    972	},
    973	.p = {
    974		.pre_div_shift = 3,
    975		.pre_div_width = 2,
    976	},
    977	.s = {
    978		.src_sel_shift = 0,
    979		.parent_map = gcc_cxo_pll8_map,
    980	},
    981	.freq_tbl = clk_tbl_sdc,
    982	.clkr = {
    983		.enable_reg = 0x284c,
    984		.enable_mask = BIT(11),
    985		.hw.init = &(struct clk_init_data){
    986			.name = "sdc2_src",
    987			.parent_names = gcc_cxo_pll8,
    988			.num_parents = 2,
    989			.ops = &clk_rcg_ops,
    990		},
    991	}
    992};
    993
    994static struct clk_branch sdc2_clk = {
    995	.halt_reg = 0x2fc8,
    996	.halt_bit = 5,
    997	.clkr = {
    998		.enable_reg = 0x284c,
    999		.enable_mask = BIT(9),
   1000		.hw.init = &(struct clk_init_data){
   1001			.name = "sdc2_clk",
   1002			.parent_names = (const char *[]){ "sdc2_src" },
   1003			.num_parents = 1,
   1004			.ops = &clk_branch_ops,
   1005			.flags = CLK_SET_RATE_PARENT,
   1006		},
   1007	},
   1008};
   1009
   1010static const struct freq_tbl clk_tbl_usb[] = {
   1011	{ 60000000, P_PLL8, 1, 5, 32 },
   1012	{ }
   1013};
   1014
   1015static struct clk_rcg usb_hs1_xcvr_src = {
   1016	.ns_reg = 0x290c,
   1017	.md_reg = 0x2908,
   1018	.mn = {
   1019		.mnctr_en_bit = 8,
   1020		.mnctr_reset_bit = 7,
   1021		.mnctr_mode_shift = 5,
   1022		.n_val_shift = 16,
   1023		.m_val_shift = 16,
   1024		.width = 8,
   1025	},
   1026	.p = {
   1027		.pre_div_shift = 3,
   1028		.pre_div_width = 2,
   1029	},
   1030	.s = {
   1031		.src_sel_shift = 0,
   1032		.parent_map = gcc_cxo_pll8_map,
   1033	},
   1034	.freq_tbl = clk_tbl_usb,
   1035	.clkr = {
   1036		.enable_reg = 0x290c,
   1037		.enable_mask = BIT(11),
   1038		.hw.init = &(struct clk_init_data){
   1039			.name = "usb_hs1_xcvr_src",
   1040			.parent_names = gcc_cxo_pll8,
   1041			.num_parents = 2,
   1042			.ops = &clk_rcg_ops,
   1043			.flags = CLK_SET_RATE_GATE,
   1044		},
   1045	}
   1046};
   1047
   1048static struct clk_branch usb_hs1_xcvr_clk = {
   1049	.halt_reg = 0x2fc8,
   1050	.halt_bit = 0,
   1051	.clkr = {
   1052		.enable_reg = 0x290c,
   1053		.enable_mask = BIT(9),
   1054		.hw.init = &(struct clk_init_data){
   1055			.name = "usb_hs1_xcvr_clk",
   1056			.parent_names = (const char *[]){ "usb_hs1_xcvr_src" },
   1057			.num_parents = 1,
   1058			.ops = &clk_branch_ops,
   1059			.flags = CLK_SET_RATE_PARENT,
   1060		},
   1061	},
   1062};
   1063
   1064static struct clk_rcg usb_hsic_xcvr_fs_src = {
   1065	.ns_reg = 0x2928,
   1066	.md_reg = 0x2924,
   1067	.mn = {
   1068		.mnctr_en_bit = 8,
   1069		.mnctr_reset_bit = 7,
   1070		.mnctr_mode_shift = 5,
   1071		.n_val_shift = 16,
   1072		.m_val_shift = 16,
   1073		.width = 8,
   1074	},
   1075	.p = {
   1076		.pre_div_shift = 3,
   1077		.pre_div_width = 2,
   1078	},
   1079	.s = {
   1080		.src_sel_shift = 0,
   1081		.parent_map = gcc_cxo_pll8_map,
   1082	},
   1083	.freq_tbl = clk_tbl_usb,
   1084	.clkr = {
   1085		.enable_reg = 0x2928,
   1086		.enable_mask = BIT(11),
   1087		.hw.init = &(struct clk_init_data){
   1088			.name = "usb_hsic_xcvr_fs_src",
   1089			.parent_names = gcc_cxo_pll8,
   1090			.num_parents = 2,
   1091			.ops = &clk_rcg_ops,
   1092			.flags = CLK_SET_RATE_GATE,
   1093		},
   1094	}
   1095};
   1096
   1097static struct clk_branch usb_hsic_xcvr_fs_clk = {
   1098	.halt_reg = 0x2fc8,
   1099	.halt_bit = 9,
   1100	.clkr = {
   1101		.enable_reg = 0x2928,
   1102		.enable_mask = BIT(9),
   1103		.hw.init = &(struct clk_init_data){
   1104			.name = "usb_hsic_xcvr_fs_clk",
   1105			.parent_names =
   1106				(const char *[]){ "usb_hsic_xcvr_fs_src" },
   1107			.num_parents = 1,
   1108			.ops = &clk_branch_ops,
   1109			.flags = CLK_SET_RATE_PARENT,
   1110		},
   1111	},
   1112};
   1113
   1114static const struct freq_tbl clk_tbl_usb_hs1_system[] = {
   1115	{ 60000000, P_PLL8, 1, 5, 32 },
   1116	{ }
   1117};
   1118
   1119static struct clk_rcg usb_hs1_system_src = {
   1120	.ns_reg = 0x36a4,
   1121	.md_reg = 0x36a0,
   1122	.mn = {
   1123		.mnctr_en_bit = 8,
   1124		.mnctr_reset_bit = 7,
   1125		.mnctr_mode_shift = 5,
   1126		.n_val_shift = 16,
   1127		.m_val_shift = 16,
   1128		.width = 8,
   1129	},
   1130	.p = {
   1131		.pre_div_shift = 3,
   1132		.pre_div_width = 2,
   1133	},
   1134	.s = {
   1135		.src_sel_shift = 0,
   1136		.parent_map = gcc_cxo_pll8_map,
   1137	},
   1138	.freq_tbl = clk_tbl_usb_hs1_system,
   1139	.clkr = {
   1140		.enable_reg = 0x36a4,
   1141		.enable_mask = BIT(11),
   1142		.hw.init = &(struct clk_init_data){
   1143			.name = "usb_hs1_system_src",
   1144			.parent_names = gcc_cxo_pll8,
   1145			.num_parents = 2,
   1146			.ops = &clk_rcg_ops,
   1147			.flags = CLK_SET_RATE_GATE,
   1148		},
   1149	}
   1150};
   1151
   1152static struct clk_branch usb_hs1_system_clk = {
   1153	.halt_reg = 0x2fc8,
   1154	.halt_bit = 4,
   1155	.clkr = {
   1156		.enable_reg = 0x36a4,
   1157		.enable_mask = BIT(9),
   1158		.hw.init = &(struct clk_init_data){
   1159			.parent_names =
   1160				(const char *[]){ "usb_hs1_system_src" },
   1161			.num_parents = 1,
   1162			.name = "usb_hs1_system_clk",
   1163			.ops = &clk_branch_ops,
   1164			.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
   1165		},
   1166	},
   1167};
   1168
   1169static const struct freq_tbl clk_tbl_usb_hsic_system[] = {
   1170	{ 64000000, P_PLL8, 1, 1, 6 },
   1171	{ }
   1172};
   1173
   1174static struct clk_rcg usb_hsic_system_src = {
   1175	.ns_reg = 0x2b58,
   1176	.md_reg = 0x2b54,
   1177	.mn = {
   1178		.mnctr_en_bit = 8,
   1179		.mnctr_reset_bit = 7,
   1180		.mnctr_mode_shift = 5,
   1181		.n_val_shift = 16,
   1182		.m_val_shift = 16,
   1183		.width = 8,
   1184	},
   1185	.p = {
   1186		.pre_div_shift = 3,
   1187		.pre_div_width = 2,
   1188	},
   1189	.s = {
   1190		.src_sel_shift = 0,
   1191		.parent_map = gcc_cxo_pll8_map,
   1192	},
   1193	.freq_tbl = clk_tbl_usb_hsic_system,
   1194	.clkr = {
   1195		.enable_reg = 0x2b58,
   1196		.enable_mask = BIT(11),
   1197		.hw.init = &(struct clk_init_data){
   1198			.name = "usb_hsic_system_src",
   1199			.parent_names = gcc_cxo_pll8,
   1200			.num_parents = 2,
   1201			.ops = &clk_rcg_ops,
   1202			.flags = CLK_SET_RATE_GATE,
   1203		},
   1204	}
   1205};
   1206
   1207static struct clk_branch usb_hsic_system_clk = {
   1208	.halt_reg = 0x2fc8,
   1209	.halt_bit = 7,
   1210	.clkr = {
   1211		.enable_reg = 0x2b58,
   1212		.enable_mask = BIT(9),
   1213		.hw.init = &(struct clk_init_data){
   1214			.parent_names =
   1215				(const char *[]){ "usb_hsic_system_src" },
   1216			.num_parents = 1,
   1217			.name = "usb_hsic_system_clk",
   1218			.ops = &clk_branch_ops,
   1219			.flags = CLK_SET_RATE_PARENT,
   1220		},
   1221	},
   1222};
   1223
   1224static const struct freq_tbl clk_tbl_usb_hsic_hsic[] = {
   1225	{ 48000000, P_PLL14, 1, 0, 0 },
   1226	{ }
   1227};
   1228
   1229static struct clk_rcg usb_hsic_hsic_src = {
   1230	.ns_reg = 0x2b50,
   1231	.md_reg = 0x2b4c,
   1232	.mn = {
   1233		.mnctr_en_bit = 8,
   1234		.mnctr_reset_bit = 7,
   1235		.mnctr_mode_shift = 5,
   1236		.n_val_shift = 16,
   1237		.m_val_shift = 16,
   1238		.width = 8,
   1239	},
   1240	.p = {
   1241		.pre_div_shift = 3,
   1242		.pre_div_width = 2,
   1243	},
   1244	.s = {
   1245		.src_sel_shift = 0,
   1246		.parent_map = gcc_cxo_pll14_map,
   1247	},
   1248	.freq_tbl = clk_tbl_usb_hsic_hsic,
   1249	.clkr = {
   1250		.enable_reg = 0x2b50,
   1251		.enable_mask = BIT(11),
   1252		.hw.init = &(struct clk_init_data){
   1253			.name = "usb_hsic_hsic_src",
   1254			.parent_names = gcc_cxo_pll14,
   1255			.num_parents = 2,
   1256			.ops = &clk_rcg_ops,
   1257			.flags = CLK_SET_RATE_GATE,
   1258		},
   1259	}
   1260};
   1261
   1262static struct clk_branch usb_hsic_hsic_clk = {
   1263	.halt_check = BRANCH_HALT_DELAY,
   1264	.clkr = {
   1265		.enable_reg = 0x2b50,
   1266		.enable_mask = BIT(9),
   1267		.hw.init = &(struct clk_init_data){
   1268			.parent_names = (const char *[]){ "usb_hsic_hsic_src" },
   1269			.num_parents = 1,
   1270			.name = "usb_hsic_hsic_clk",
   1271			.ops = &clk_branch_ops,
   1272			.flags = CLK_SET_RATE_PARENT,
   1273		},
   1274	},
   1275};
   1276
   1277static struct clk_branch usb_hsic_hsio_cal_clk = {
   1278	.halt_reg = 0x2fc8,
   1279	.halt_bit = 8,
   1280	.clkr = {
   1281		.enable_reg = 0x2b48,
   1282		.enable_mask = BIT(0),
   1283		.hw.init = &(struct clk_init_data){
   1284			.parent_names = (const char *[]){ "cxo" },
   1285			.num_parents = 1,
   1286			.name = "usb_hsic_hsio_cal_clk",
   1287			.ops = &clk_branch_ops,
   1288		},
   1289	},
   1290};
   1291
   1292static struct clk_branch ce1_core_clk = {
   1293	.hwcg_reg = 0x2724,
   1294	.hwcg_bit = 6,
   1295	.halt_reg = 0x2fd4,
   1296	.halt_bit = 27,
   1297	.clkr = {
   1298		.enable_reg = 0x2724,
   1299		.enable_mask = BIT(4),
   1300		.hw.init = &(struct clk_init_data){
   1301			.name = "ce1_core_clk",
   1302			.ops = &clk_branch_ops,
   1303		},
   1304	},
   1305};
   1306
   1307static struct clk_branch ce1_h_clk = {
   1308	.halt_reg = 0x2fd4,
   1309	.halt_bit = 1,
   1310	.clkr = {
   1311		.enable_reg = 0x2720,
   1312		.enable_mask = BIT(4),
   1313		.hw.init = &(struct clk_init_data){
   1314			.name = "ce1_h_clk",
   1315			.ops = &clk_branch_ops,
   1316		},
   1317	},
   1318};
   1319
   1320static struct clk_branch dma_bam_h_clk = {
   1321	.hwcg_reg = 0x25c0,
   1322	.hwcg_bit = 6,
   1323	.halt_reg = 0x2fc8,
   1324	.halt_bit = 12,
   1325	.clkr = {
   1326		.enable_reg = 0x25c0,
   1327		.enable_mask = BIT(4),
   1328		.hw.init = &(struct clk_init_data){
   1329			.name = "dma_bam_h_clk",
   1330			.ops = &clk_branch_ops,
   1331		},
   1332	},
   1333};
   1334
   1335static struct clk_branch gsbi1_h_clk = {
   1336	.hwcg_reg = 0x29c0,
   1337	.hwcg_bit = 6,
   1338	.halt_reg = 0x2fcc,
   1339	.halt_bit = 11,
   1340	.clkr = {
   1341		.enable_reg = 0x29c0,
   1342		.enable_mask = BIT(4),
   1343		.hw.init = &(struct clk_init_data){
   1344			.name = "gsbi1_h_clk",
   1345			.ops = &clk_branch_ops,
   1346		},
   1347	},
   1348};
   1349
   1350static struct clk_branch gsbi2_h_clk = {
   1351	.hwcg_reg = 0x29e0,
   1352	.hwcg_bit = 6,
   1353	.halt_reg = 0x2fcc,
   1354	.halt_bit = 7,
   1355	.clkr = {
   1356		.enable_reg = 0x29e0,
   1357		.enable_mask = BIT(4),
   1358		.hw.init = &(struct clk_init_data){
   1359			.name = "gsbi2_h_clk",
   1360			.ops = &clk_branch_ops,
   1361		},
   1362	},
   1363};
   1364
   1365static struct clk_branch gsbi3_h_clk = {
   1366	.hwcg_reg = 0x2a00,
   1367	.hwcg_bit = 6,
   1368	.halt_reg = 0x2fcc,
   1369	.halt_bit = 3,
   1370	.clkr = {
   1371		.enable_reg = 0x2a00,
   1372		.enable_mask = BIT(4),
   1373		.hw.init = &(struct clk_init_data){
   1374			.name = "gsbi3_h_clk",
   1375			.ops = &clk_branch_ops,
   1376		},
   1377	},
   1378};
   1379
   1380static struct clk_branch gsbi4_h_clk = {
   1381	.hwcg_reg = 0x2a20,
   1382	.hwcg_bit = 6,
   1383	.halt_reg = 0x2fd0,
   1384	.halt_bit = 27,
   1385	.clkr = {
   1386		.enable_reg = 0x2a20,
   1387		.enable_mask = BIT(4),
   1388		.hw.init = &(struct clk_init_data){
   1389			.name = "gsbi4_h_clk",
   1390			.ops = &clk_branch_ops,
   1391		},
   1392	},
   1393};
   1394
   1395static struct clk_branch gsbi5_h_clk = {
   1396	.hwcg_reg = 0x2a40,
   1397	.hwcg_bit = 6,
   1398	.halt_reg = 0x2fd0,
   1399	.halt_bit = 23,
   1400	.clkr = {
   1401		.enable_reg = 0x2a40,
   1402		.enable_mask = BIT(4),
   1403		.hw.init = &(struct clk_init_data){
   1404			.name = "gsbi5_h_clk",
   1405			.ops = &clk_branch_ops,
   1406		},
   1407	},
   1408};
   1409
   1410static struct clk_branch usb_hs1_h_clk = {
   1411	.hwcg_reg = 0x2900,
   1412	.hwcg_bit = 6,
   1413	.halt_reg = 0x2fc8,
   1414	.halt_bit = 1,
   1415	.clkr = {
   1416		.enable_reg = 0x2900,
   1417		.enable_mask = BIT(4),
   1418		.hw.init = &(struct clk_init_data){
   1419			.name = "usb_hs1_h_clk",
   1420			.ops = &clk_branch_ops,
   1421		},
   1422	},
   1423};
   1424
   1425static struct clk_branch usb_hsic_h_clk = {
   1426	.halt_reg = 0x2fcc,
   1427	.halt_bit = 28,
   1428	.clkr = {
   1429		.enable_reg = 0x2920,
   1430		.enable_mask = BIT(4),
   1431		.hw.init = &(struct clk_init_data){
   1432			.name = "usb_hsic_h_clk",
   1433			.ops = &clk_branch_ops,
   1434		},
   1435	},
   1436};
   1437
   1438static struct clk_branch sdc1_h_clk = {
   1439	.hwcg_reg = 0x2820,
   1440	.hwcg_bit = 6,
   1441	.halt_reg = 0x2fc8,
   1442	.halt_bit = 11,
   1443	.clkr = {
   1444		.enable_reg = 0x2820,
   1445		.enable_mask = BIT(4),
   1446		.hw.init = &(struct clk_init_data){
   1447			.name = "sdc1_h_clk",
   1448			.ops = &clk_branch_ops,
   1449		},
   1450	},
   1451};
   1452
   1453static struct clk_branch sdc2_h_clk = {
   1454	.hwcg_reg = 0x2840,
   1455	.hwcg_bit = 6,
   1456	.halt_reg = 0x2fc8,
   1457	.halt_bit = 10,
   1458	.clkr = {
   1459		.enable_reg = 0x2840,
   1460		.enable_mask = BIT(4),
   1461		.hw.init = &(struct clk_init_data){
   1462			.name = "sdc2_h_clk",
   1463			.ops = &clk_branch_ops,
   1464		},
   1465	},
   1466};
   1467
   1468static struct clk_branch adm0_clk = {
   1469	.halt_reg = 0x2fdc,
   1470	.halt_check = BRANCH_HALT_VOTED,
   1471	.halt_bit = 14,
   1472	.clkr = {
   1473		.enable_reg = 0x3080,
   1474		.enable_mask = BIT(2),
   1475		.hw.init = &(struct clk_init_data){
   1476			.name = "adm0_clk",
   1477			.ops = &clk_branch_ops,
   1478		},
   1479	},
   1480};
   1481
   1482static struct clk_branch adm0_pbus_clk = {
   1483	.hwcg_reg = 0x2208,
   1484	.hwcg_bit = 6,
   1485	.halt_reg = 0x2fdc,
   1486	.halt_check = BRANCH_HALT_VOTED,
   1487	.halt_bit = 13,
   1488	.clkr = {
   1489		.enable_reg = 0x3080,
   1490		.enable_mask = BIT(3),
   1491		.hw.init = &(struct clk_init_data){
   1492			.name = "adm0_pbus_clk",
   1493			.ops = &clk_branch_ops,
   1494		},
   1495	},
   1496};
   1497
   1498static struct clk_branch pmic_arb0_h_clk = {
   1499	.halt_reg = 0x2fd8,
   1500	.halt_check = BRANCH_HALT_VOTED,
   1501	.halt_bit = 22,
   1502	.clkr = {
   1503		.enable_reg = 0x3080,
   1504		.enable_mask = BIT(8),
   1505		.hw.init = &(struct clk_init_data){
   1506			.name = "pmic_arb0_h_clk",
   1507			.ops = &clk_branch_ops,
   1508		},
   1509	},
   1510};
   1511
   1512static struct clk_branch pmic_arb1_h_clk = {
   1513	.halt_reg = 0x2fd8,
   1514	.halt_check = BRANCH_HALT_VOTED,
   1515	.halt_bit = 21,
   1516	.clkr = {
   1517		.enable_reg = 0x3080,
   1518		.enable_mask = BIT(9),
   1519		.hw.init = &(struct clk_init_data){
   1520			.name = "pmic_arb1_h_clk",
   1521			.ops = &clk_branch_ops,
   1522		},
   1523	},
   1524};
   1525
   1526static struct clk_branch pmic_ssbi2_clk = {
   1527	.halt_reg = 0x2fd8,
   1528	.halt_check = BRANCH_HALT_VOTED,
   1529	.halt_bit = 23,
   1530	.clkr = {
   1531		.enable_reg = 0x3080,
   1532		.enable_mask = BIT(7),
   1533		.hw.init = &(struct clk_init_data){
   1534			.name = "pmic_ssbi2_clk",
   1535			.ops = &clk_branch_ops,
   1536		},
   1537	},
   1538};
   1539
   1540static struct clk_branch rpm_msg_ram_h_clk = {
   1541	.hwcg_reg = 0x27e0,
   1542	.hwcg_bit = 6,
   1543	.halt_reg = 0x2fd8,
   1544	.halt_check = BRANCH_HALT_VOTED,
   1545	.halt_bit = 12,
   1546	.clkr = {
   1547		.enable_reg = 0x3080,
   1548		.enable_mask = BIT(6),
   1549		.hw.init = &(struct clk_init_data){
   1550			.name = "rpm_msg_ram_h_clk",
   1551			.ops = &clk_branch_ops,
   1552		},
   1553	},
   1554};
   1555
   1556static struct clk_branch ebi2_clk = {
   1557	.hwcg_reg = 0x2664,
   1558	.hwcg_bit = 6,
   1559	.halt_reg = 0x2fcc,
   1560	.halt_bit = 24,
   1561	.clkr = {
   1562		.enable_reg = 0x2664,
   1563		.enable_mask = BIT(6) | BIT(4),
   1564		.hw.init = &(struct clk_init_data){
   1565			.name = "ebi2_clk",
   1566			.ops = &clk_branch_ops,
   1567		},
   1568	},
   1569};
   1570
   1571static struct clk_branch ebi2_aon_clk = {
   1572	.halt_reg = 0x2fcc,
   1573	.halt_bit = 23,
   1574	.clkr = {
   1575		.enable_reg = 0x2664,
   1576		.enable_mask = BIT(8),
   1577		.hw.init = &(struct clk_init_data){
   1578			.name = "ebi2_aon_clk",
   1579			.ops = &clk_branch_ops,
   1580		},
   1581	},
   1582};
   1583
   1584static struct clk_hw *gcc_mdm9615_hws[] = {
   1585	&cxo.hw,
   1586};
   1587
   1588static struct clk_regmap *gcc_mdm9615_clks[] = {
   1589	[PLL0] = &pll0.clkr,
   1590	[PLL0_VOTE] = &pll0_vote,
   1591	[PLL4_VOTE] = &pll4_vote,
   1592	[PLL8] = &pll8.clkr,
   1593	[PLL8_VOTE] = &pll8_vote,
   1594	[PLL14] = &pll14.clkr,
   1595	[PLL14_VOTE] = &pll14_vote,
   1596	[GSBI1_UART_SRC] = &gsbi1_uart_src.clkr,
   1597	[GSBI1_UART_CLK] = &gsbi1_uart_clk.clkr,
   1598	[GSBI2_UART_SRC] = &gsbi2_uart_src.clkr,
   1599	[GSBI2_UART_CLK] = &gsbi2_uart_clk.clkr,
   1600	[GSBI3_UART_SRC] = &gsbi3_uart_src.clkr,
   1601	[GSBI3_UART_CLK] = &gsbi3_uart_clk.clkr,
   1602	[GSBI4_UART_SRC] = &gsbi4_uart_src.clkr,
   1603	[GSBI4_UART_CLK] = &gsbi4_uart_clk.clkr,
   1604	[GSBI5_UART_SRC] = &gsbi5_uart_src.clkr,
   1605	[GSBI5_UART_CLK] = &gsbi5_uart_clk.clkr,
   1606	[GSBI1_QUP_SRC] = &gsbi1_qup_src.clkr,
   1607	[GSBI1_QUP_CLK] = &gsbi1_qup_clk.clkr,
   1608	[GSBI2_QUP_SRC] = &gsbi2_qup_src.clkr,
   1609	[GSBI2_QUP_CLK] = &gsbi2_qup_clk.clkr,
   1610	[GSBI3_QUP_SRC] = &gsbi3_qup_src.clkr,
   1611	[GSBI3_QUP_CLK] = &gsbi3_qup_clk.clkr,
   1612	[GSBI4_QUP_SRC] = &gsbi4_qup_src.clkr,
   1613	[GSBI4_QUP_CLK] = &gsbi4_qup_clk.clkr,
   1614	[GSBI5_QUP_SRC] = &gsbi5_qup_src.clkr,
   1615	[GSBI5_QUP_CLK] = &gsbi5_qup_clk.clkr,
   1616	[GP0_SRC] = &gp0_src.clkr,
   1617	[GP0_CLK] = &gp0_clk.clkr,
   1618	[GP1_SRC] = &gp1_src.clkr,
   1619	[GP1_CLK] = &gp1_clk.clkr,
   1620	[GP2_SRC] = &gp2_src.clkr,
   1621	[GP2_CLK] = &gp2_clk.clkr,
   1622	[PMEM_A_CLK] = &pmem_clk.clkr,
   1623	[PRNG_SRC] = &prng_src.clkr,
   1624	[PRNG_CLK] = &prng_clk.clkr,
   1625	[SDC1_SRC] = &sdc1_src.clkr,
   1626	[SDC1_CLK] = &sdc1_clk.clkr,
   1627	[SDC2_SRC] = &sdc2_src.clkr,
   1628	[SDC2_CLK] = &sdc2_clk.clkr,
   1629	[USB_HS1_XCVR_SRC] = &usb_hs1_xcvr_src.clkr,
   1630	[USB_HS1_XCVR_CLK] = &usb_hs1_xcvr_clk.clkr,
   1631	[USB_HS1_SYSTEM_CLK_SRC] = &usb_hs1_system_src.clkr,
   1632	[USB_HS1_SYSTEM_CLK] = &usb_hs1_system_clk.clkr,
   1633	[USB_HSIC_XCVR_FS_SRC] = &usb_hsic_xcvr_fs_src.clkr,
   1634	[USB_HSIC_XCVR_FS_CLK] = &usb_hsic_xcvr_fs_clk.clkr,
   1635	[USB_HSIC_SYSTEM_CLK_SRC] = &usb_hsic_system_src.clkr,
   1636	[USB_HSIC_SYSTEM_CLK] = &usb_hsic_system_clk.clkr,
   1637	[USB_HSIC_HSIC_CLK_SRC] = &usb_hsic_hsic_src.clkr,
   1638	[USB_HSIC_HSIC_CLK] = &usb_hsic_hsic_clk.clkr,
   1639	[USB_HSIC_HSIO_CAL_CLK] = &usb_hsic_hsio_cal_clk.clkr,
   1640	[CE1_CORE_CLK] = &ce1_core_clk.clkr,
   1641	[CE1_H_CLK] = &ce1_h_clk.clkr,
   1642	[DMA_BAM_H_CLK] = &dma_bam_h_clk.clkr,
   1643	[GSBI1_H_CLK] = &gsbi1_h_clk.clkr,
   1644	[GSBI2_H_CLK] = &gsbi2_h_clk.clkr,
   1645	[GSBI3_H_CLK] = &gsbi3_h_clk.clkr,
   1646	[GSBI4_H_CLK] = &gsbi4_h_clk.clkr,
   1647	[GSBI5_H_CLK] = &gsbi5_h_clk.clkr,
   1648	[USB_HS1_H_CLK] = &usb_hs1_h_clk.clkr,
   1649	[USB_HSIC_H_CLK] = &usb_hsic_h_clk.clkr,
   1650	[SDC1_H_CLK] = &sdc1_h_clk.clkr,
   1651	[SDC2_H_CLK] = &sdc2_h_clk.clkr,
   1652	[ADM0_CLK] = &adm0_clk.clkr,
   1653	[ADM0_PBUS_CLK] = &adm0_pbus_clk.clkr,
   1654	[PMIC_ARB0_H_CLK] = &pmic_arb0_h_clk.clkr,
   1655	[PMIC_ARB1_H_CLK] = &pmic_arb1_h_clk.clkr,
   1656	[PMIC_SSBI2_CLK] = &pmic_ssbi2_clk.clkr,
   1657	[RPM_MSG_RAM_H_CLK] = &rpm_msg_ram_h_clk.clkr,
   1658	[EBI2_CLK] = &ebi2_clk.clkr,
   1659	[EBI2_AON_CLK] = &ebi2_aon_clk.clkr,
   1660};
   1661
   1662static const struct qcom_reset_map gcc_mdm9615_resets[] = {
   1663	[DMA_BAM_RESET] = { 0x25c0, 7 },
   1664	[CE1_H_RESET] = { 0x2720, 7 },
   1665	[CE1_CORE_RESET] = { 0x2724, 7 },
   1666	[SDC1_RESET] = { 0x2830 },
   1667	[SDC2_RESET] = { 0x2850 },
   1668	[ADM0_C2_RESET] = { 0x220c, 4 },
   1669	[ADM0_C1_RESET] = { 0x220c, 3 },
   1670	[ADM0_C0_RESET] = { 0x220c, 2 },
   1671	[ADM0_PBUS_RESET] = { 0x220c, 1 },
   1672	[ADM0_RESET] = { 0x220c },
   1673	[USB_HS1_RESET] = { 0x2910 },
   1674	[USB_HSIC_RESET] = { 0x2934 },
   1675	[GSBI1_RESET] = { 0x29dc },
   1676	[GSBI2_RESET] = { 0x29fc },
   1677	[GSBI3_RESET] = { 0x2a1c },
   1678	[GSBI4_RESET] = { 0x2a3c },
   1679	[GSBI5_RESET] = { 0x2a5c },
   1680	[PDM_RESET] = { 0x2CC0, 12 },
   1681};
   1682
   1683static const struct regmap_config gcc_mdm9615_regmap_config = {
   1684	.reg_bits	= 32,
   1685	.reg_stride	= 4,
   1686	.val_bits	= 32,
   1687	.max_register	= 0x3660,
   1688	.fast_io	= true,
   1689};
   1690
   1691static const struct qcom_cc_desc gcc_mdm9615_desc = {
   1692	.config = &gcc_mdm9615_regmap_config,
   1693	.clks = gcc_mdm9615_clks,
   1694	.num_clks = ARRAY_SIZE(gcc_mdm9615_clks),
   1695	.resets = gcc_mdm9615_resets,
   1696	.num_resets = ARRAY_SIZE(gcc_mdm9615_resets),
   1697	.clk_hws = gcc_mdm9615_hws,
   1698	.num_clk_hws = ARRAY_SIZE(gcc_mdm9615_hws),
   1699};
   1700
   1701static const struct of_device_id gcc_mdm9615_match_table[] = {
   1702	{ .compatible = "qcom,gcc-mdm9615" },
   1703	{ }
   1704};
   1705MODULE_DEVICE_TABLE(of, gcc_mdm9615_match_table);
   1706
   1707static int gcc_mdm9615_probe(struct platform_device *pdev)
   1708{
   1709	struct regmap *regmap;
   1710
   1711	regmap = qcom_cc_map(pdev, &gcc_mdm9615_desc);
   1712	if (IS_ERR(regmap))
   1713		return PTR_ERR(regmap);
   1714
   1715	return qcom_cc_really_probe(pdev, &gcc_mdm9615_desc, regmap);
   1716}
   1717
   1718static struct platform_driver gcc_mdm9615_driver = {
   1719	.probe		= gcc_mdm9615_probe,
   1720	.driver		= {
   1721		.name	= "gcc-mdm9615",
   1722		.of_match_table = gcc_mdm9615_match_table,
   1723	},
   1724};
   1725
   1726static int __init gcc_mdm9615_init(void)
   1727{
   1728	return platform_driver_register(&gcc_mdm9615_driver);
   1729}
   1730core_initcall(gcc_mdm9615_init);
   1731
   1732static void __exit gcc_mdm9615_exit(void)
   1733{
   1734	platform_driver_unregister(&gcc_mdm9615_driver);
   1735}
   1736module_exit(gcc_mdm9615_exit);
   1737
   1738MODULE_DESCRIPTION("QCOM GCC MDM9615 Driver");
   1739MODULE_LICENSE("GPL v2");
   1740MODULE_ALIAS("platform:gcc-mdm9615");