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

mmcc-msm8960.c (68794B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (c) 2013, The Linux Foundation. All rights reserved.
      4 */
      5
      6#include <linux/kernel.h>
      7#include <linux/bitops.h>
      8#include <linux/err.h>
      9#include <linux/delay.h>
     10#include <linux/platform_device.h>
     11#include <linux/module.h>
     12#include <linux/of.h>
     13#include <linux/of_device.h>
     14#include <linux/clk.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,mmcc-msm8960.h>
     20#include <dt-bindings/reset/qcom,mmcc-msm8960.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
     29enum {
     30	P_PXO,
     31	P_PLL8,
     32	P_PLL2,
     33	P_PLL3,
     34	P_PLL15,
     35	P_HDMI_PLL,
     36	P_DSI1_PLL_DSICLK,
     37	P_DSI2_PLL_DSICLK,
     38	P_DSI1_PLL_BYTECLK,
     39	P_DSI2_PLL_BYTECLK,
     40};
     41
     42#define F_MN(f, s, _m, _n) { .freq = f, .src = s, .m = _m, .n = _n }
     43
     44static const struct parent_map mmcc_pxo_pll8_pll2_map[] = {
     45	{ P_PXO, 0 },
     46	{ P_PLL8, 2 },
     47	{ P_PLL2, 1 }
     48};
     49
     50static const char * const mmcc_pxo_pll8_pll2[] = {
     51	"pxo",
     52	"pll8_vote",
     53	"pll2",
     54};
     55
     56static const struct parent_map mmcc_pxo_pll8_pll2_pll3_map[] = {
     57	{ P_PXO, 0 },
     58	{ P_PLL8, 2 },
     59	{ P_PLL2, 1 },
     60	{ P_PLL3, 3 }
     61};
     62
     63static const char * const mmcc_pxo_pll8_pll2_pll15[] = {
     64	"pxo",
     65	"pll8_vote",
     66	"pll2",
     67	"pll15",
     68};
     69
     70static const struct parent_map mmcc_pxo_pll8_pll2_pll15_map[] = {
     71	{ P_PXO, 0 },
     72	{ P_PLL8, 2 },
     73	{ P_PLL2, 1 },
     74	{ P_PLL15, 3 }
     75};
     76
     77static const char * const mmcc_pxo_pll8_pll2_pll3[] = {
     78	"pxo",
     79	"pll8_vote",
     80	"pll2",
     81	"pll3",
     82};
     83
     84static const struct parent_map mmcc_pxo_dsi2_dsi1_map[] = {
     85	{ P_PXO, 0 },
     86	{ P_DSI2_PLL_DSICLK, 1 },
     87	{ P_DSI1_PLL_DSICLK, 3 },
     88};
     89
     90static const char * const mmcc_pxo_dsi2_dsi1[] = {
     91	"pxo",
     92	"dsi2pll",
     93	"dsi1pll",
     94};
     95
     96static const struct parent_map mmcc_pxo_dsi1_dsi2_byte_map[] = {
     97	{ P_PXO, 0 },
     98	{ P_DSI1_PLL_BYTECLK, 1 },
     99	{ P_DSI2_PLL_BYTECLK, 2 },
    100};
    101
    102static const char * const mmcc_pxo_dsi1_dsi2_byte[] = {
    103	"pxo",
    104	"dsi1pllbyte",
    105	"dsi2pllbyte",
    106};
    107
    108static struct clk_pll pll2 = {
    109	.l_reg = 0x320,
    110	.m_reg = 0x324,
    111	.n_reg = 0x328,
    112	.config_reg = 0x32c,
    113	.mode_reg = 0x31c,
    114	.status_reg = 0x334,
    115	.status_bit = 16,
    116	.clkr.hw.init = &(struct clk_init_data){
    117		.name = "pll2",
    118		.parent_names = (const char *[]){ "pxo" },
    119		.num_parents = 1,
    120		.ops = &clk_pll_ops,
    121	},
    122};
    123
    124static struct clk_pll pll15 = {
    125	.l_reg = 0x33c,
    126	.m_reg = 0x340,
    127	.n_reg = 0x344,
    128	.config_reg = 0x348,
    129	.mode_reg = 0x338,
    130	.status_reg = 0x350,
    131	.status_bit = 16,
    132	.clkr.hw.init = &(struct clk_init_data){
    133		.name = "pll15",
    134		.parent_names = (const char *[]){ "pxo" },
    135		.num_parents = 1,
    136		.ops = &clk_pll_ops,
    137	},
    138};
    139
    140static const struct pll_config pll15_config = {
    141	.l = 33,
    142	.m = 1,
    143	.n = 3,
    144	.vco_val = 0x2 << 16,
    145	.vco_mask = 0x3 << 16,
    146	.pre_div_val = 0x0,
    147	.pre_div_mask = BIT(19),
    148	.post_div_val = 0x0,
    149	.post_div_mask = 0x3 << 20,
    150	.mn_ena_mask = BIT(22),
    151	.main_output_mask = BIT(23),
    152};
    153
    154static struct freq_tbl clk_tbl_cam[] = {
    155	{   6000000, P_PLL8, 4, 1, 16 },
    156	{   8000000, P_PLL8, 4, 1, 12 },
    157	{  12000000, P_PLL8, 4, 1,  8 },
    158	{  16000000, P_PLL8, 4, 1,  6 },
    159	{  19200000, P_PLL8, 4, 1,  5 },
    160	{  24000000, P_PLL8, 4, 1,  4 },
    161	{  32000000, P_PLL8, 4, 1,  3 },
    162	{  48000000, P_PLL8, 4, 1,  2 },
    163	{  64000000, P_PLL8, 3, 1,  2 },
    164	{  96000000, P_PLL8, 4, 0,  0 },
    165	{ 128000000, P_PLL8, 3, 0,  0 },
    166	{ }
    167};
    168
    169static struct clk_rcg camclk0_src = {
    170	.ns_reg = 0x0148,
    171	.md_reg = 0x0144,
    172	.mn = {
    173		.mnctr_en_bit = 5,
    174		.mnctr_reset_bit = 8,
    175		.reset_in_cc = true,
    176		.mnctr_mode_shift = 6,
    177		.n_val_shift = 24,
    178		.m_val_shift = 8,
    179		.width = 8,
    180	},
    181	.p = {
    182		.pre_div_shift = 14,
    183		.pre_div_width = 2,
    184	},
    185	.s = {
    186		.src_sel_shift = 0,
    187		.parent_map = mmcc_pxo_pll8_pll2_map,
    188	},
    189	.freq_tbl = clk_tbl_cam,
    190	.clkr = {
    191		.enable_reg = 0x0140,
    192		.enable_mask = BIT(2),
    193		.hw.init = &(struct clk_init_data){
    194			.name = "camclk0_src",
    195			.parent_names = mmcc_pxo_pll8_pll2,
    196			.num_parents = 3,
    197			.ops = &clk_rcg_ops,
    198		},
    199	},
    200};
    201
    202static struct clk_branch camclk0_clk = {
    203	.halt_reg = 0x01e8,
    204	.halt_bit = 15,
    205	.clkr = {
    206		.enable_reg = 0x0140,
    207		.enable_mask = BIT(0),
    208		.hw.init = &(struct clk_init_data){
    209			.name = "camclk0_clk",
    210			.parent_names = (const char *[]){ "camclk0_src" },
    211			.num_parents = 1,
    212			.ops = &clk_branch_ops,
    213		},
    214	},
    215
    216};
    217
    218static struct clk_rcg camclk1_src = {
    219	.ns_reg = 0x015c,
    220	.md_reg = 0x0158,
    221	.mn = {
    222		.mnctr_en_bit = 5,
    223		.mnctr_reset_bit = 8,
    224		.reset_in_cc = true,
    225		.mnctr_mode_shift = 6,
    226		.n_val_shift = 24,
    227		.m_val_shift = 8,
    228		.width = 8,
    229	},
    230	.p = {
    231		.pre_div_shift = 14,
    232		.pre_div_width = 2,
    233	},
    234	.s = {
    235		.src_sel_shift = 0,
    236		.parent_map = mmcc_pxo_pll8_pll2_map,
    237	},
    238	.freq_tbl = clk_tbl_cam,
    239	.clkr = {
    240		.enable_reg = 0x0154,
    241		.enable_mask = BIT(2),
    242		.hw.init = &(struct clk_init_data){
    243			.name = "camclk1_src",
    244			.parent_names = mmcc_pxo_pll8_pll2,
    245			.num_parents = 3,
    246			.ops = &clk_rcg_ops,
    247		},
    248	},
    249};
    250
    251static struct clk_branch camclk1_clk = {
    252	.halt_reg = 0x01e8,
    253	.halt_bit = 16,
    254	.clkr = {
    255		.enable_reg = 0x0154,
    256		.enable_mask = BIT(0),
    257		.hw.init = &(struct clk_init_data){
    258			.name = "camclk1_clk",
    259			.parent_names = (const char *[]){ "camclk1_src" },
    260			.num_parents = 1,
    261			.ops = &clk_branch_ops,
    262		},
    263	},
    264
    265};
    266
    267static struct clk_rcg camclk2_src = {
    268	.ns_reg = 0x0228,
    269	.md_reg = 0x0224,
    270	.mn = {
    271		.mnctr_en_bit = 5,
    272		.mnctr_reset_bit = 8,
    273		.reset_in_cc = true,
    274		.mnctr_mode_shift = 6,
    275		.n_val_shift = 24,
    276		.m_val_shift = 8,
    277		.width = 8,
    278	},
    279	.p = {
    280		.pre_div_shift = 14,
    281		.pre_div_width = 2,
    282	},
    283	.s = {
    284		.src_sel_shift = 0,
    285		.parent_map = mmcc_pxo_pll8_pll2_map,
    286	},
    287	.freq_tbl = clk_tbl_cam,
    288	.clkr = {
    289		.enable_reg = 0x0220,
    290		.enable_mask = BIT(2),
    291		.hw.init = &(struct clk_init_data){
    292			.name = "camclk2_src",
    293			.parent_names = mmcc_pxo_pll8_pll2,
    294			.num_parents = 3,
    295			.ops = &clk_rcg_ops,
    296		},
    297	},
    298};
    299
    300static struct clk_branch camclk2_clk = {
    301	.halt_reg = 0x01e8,
    302	.halt_bit = 16,
    303	.clkr = {
    304		.enable_reg = 0x0220,
    305		.enable_mask = BIT(0),
    306		.hw.init = &(struct clk_init_data){
    307			.name = "camclk2_clk",
    308			.parent_names = (const char *[]){ "camclk2_src" },
    309			.num_parents = 1,
    310			.ops = &clk_branch_ops,
    311		},
    312	},
    313
    314};
    315
    316static struct freq_tbl clk_tbl_csi[] = {
    317	{  27000000, P_PXO,  1, 0, 0 },
    318	{  85330000, P_PLL8, 1, 2, 9 },
    319	{ 177780000, P_PLL2, 1, 2, 9 },
    320	{ }
    321};
    322
    323static struct clk_rcg csi0_src = {
    324	.ns_reg = 0x0048,
    325	.md_reg	= 0x0044,
    326	.mn = {
    327		.mnctr_en_bit = 5,
    328		.mnctr_reset_bit = 7,
    329		.mnctr_mode_shift = 6,
    330		.n_val_shift = 24,
    331		.m_val_shift = 8,
    332		.width = 8,
    333	},
    334	.p = {
    335		.pre_div_shift = 14,
    336		.pre_div_width = 2,
    337	},
    338	.s = {
    339		.src_sel_shift = 0,
    340		.parent_map = mmcc_pxo_pll8_pll2_map,
    341	},
    342	.freq_tbl = clk_tbl_csi,
    343	.clkr = {
    344		.enable_reg = 0x0040,
    345		.enable_mask = BIT(2),
    346		.hw.init = &(struct clk_init_data){
    347			.name = "csi0_src",
    348			.parent_names = mmcc_pxo_pll8_pll2,
    349			.num_parents = 3,
    350			.ops = &clk_rcg_ops,
    351		},
    352	},
    353};
    354
    355static struct clk_branch csi0_clk = {
    356	.halt_reg = 0x01cc,
    357	.halt_bit = 13,
    358	.clkr = {
    359		.enable_reg = 0x0040,
    360		.enable_mask = BIT(0),
    361		.hw.init = &(struct clk_init_data){
    362			.parent_names = (const char *[]){ "csi0_src" },
    363			.num_parents = 1,
    364			.name = "csi0_clk",
    365			.ops = &clk_branch_ops,
    366			.flags = CLK_SET_RATE_PARENT,
    367		},
    368	},
    369};
    370
    371static struct clk_branch csi0_phy_clk = {
    372	.halt_reg = 0x01e8,
    373	.halt_bit = 9,
    374	.clkr = {
    375		.enable_reg = 0x0040,
    376		.enable_mask = BIT(8),
    377		.hw.init = &(struct clk_init_data){
    378			.parent_names = (const char *[]){ "csi0_src" },
    379			.num_parents = 1,
    380			.name = "csi0_phy_clk",
    381			.ops = &clk_branch_ops,
    382			.flags = CLK_SET_RATE_PARENT,
    383		},
    384	},
    385};
    386
    387static struct clk_rcg csi1_src = {
    388	.ns_reg = 0x0010,
    389	.md_reg	= 0x0028,
    390	.mn = {
    391		.mnctr_en_bit = 5,
    392		.mnctr_reset_bit = 7,
    393		.mnctr_mode_shift = 6,
    394		.n_val_shift = 24,
    395		.m_val_shift = 8,
    396		.width = 8,
    397	},
    398	.p = {
    399		.pre_div_shift = 14,
    400		.pre_div_width = 2,
    401	},
    402	.s = {
    403		.src_sel_shift = 0,
    404		.parent_map = mmcc_pxo_pll8_pll2_map,
    405	},
    406	.freq_tbl = clk_tbl_csi,
    407	.clkr = {
    408		.enable_reg = 0x0024,
    409		.enable_mask = BIT(2),
    410		.hw.init = &(struct clk_init_data){
    411			.name = "csi1_src",
    412			.parent_names = mmcc_pxo_pll8_pll2,
    413			.num_parents = 3,
    414			.ops = &clk_rcg_ops,
    415		},
    416	},
    417};
    418
    419static struct clk_branch csi1_clk = {
    420	.halt_reg = 0x01cc,
    421	.halt_bit = 14,
    422	.clkr = {
    423		.enable_reg = 0x0024,
    424		.enable_mask = BIT(0),
    425		.hw.init = &(struct clk_init_data){
    426			.parent_names = (const char *[]){ "csi1_src" },
    427			.num_parents = 1,
    428			.name = "csi1_clk",
    429			.ops = &clk_branch_ops,
    430			.flags = CLK_SET_RATE_PARENT,
    431		},
    432	},
    433};
    434
    435static struct clk_branch csi1_phy_clk = {
    436	.halt_reg = 0x01e8,
    437	.halt_bit = 10,
    438	.clkr = {
    439		.enable_reg = 0x0024,
    440		.enable_mask = BIT(8),
    441		.hw.init = &(struct clk_init_data){
    442			.parent_names = (const char *[]){ "csi1_src" },
    443			.num_parents = 1,
    444			.name = "csi1_phy_clk",
    445			.ops = &clk_branch_ops,
    446			.flags = CLK_SET_RATE_PARENT,
    447		},
    448	},
    449};
    450
    451static struct clk_rcg csi2_src = {
    452	.ns_reg = 0x0234,
    453	.md_reg = 0x022c,
    454	.mn = {
    455		.mnctr_en_bit = 5,
    456		.mnctr_reset_bit = 7,
    457		.mnctr_mode_shift = 6,
    458		.n_val_shift = 24,
    459		.m_val_shift = 8,
    460		.width = 8,
    461	},
    462	.p = {
    463		.pre_div_shift = 14,
    464		.pre_div_width = 2,
    465	},
    466	.s = {
    467		.src_sel_shift = 0,
    468		.parent_map = mmcc_pxo_pll8_pll2_map,
    469	},
    470	.freq_tbl = clk_tbl_csi,
    471	.clkr = {
    472		.enable_reg = 0x022c,
    473		.enable_mask = BIT(2),
    474		.hw.init = &(struct clk_init_data){
    475			.name = "csi2_src",
    476			.parent_names = mmcc_pxo_pll8_pll2,
    477			.num_parents = 3,
    478			.ops = &clk_rcg_ops,
    479		},
    480	},
    481};
    482
    483static struct clk_branch csi2_clk = {
    484	.halt_reg = 0x01cc,
    485	.halt_bit = 29,
    486	.clkr = {
    487		.enable_reg = 0x022c,
    488		.enable_mask = BIT(0),
    489		.hw.init = &(struct clk_init_data){
    490			.parent_names = (const char *[]){ "csi2_src" },
    491			.num_parents = 1,
    492			.name = "csi2_clk",
    493			.ops = &clk_branch_ops,
    494			.flags = CLK_SET_RATE_PARENT,
    495		},
    496	},
    497};
    498
    499static struct clk_branch csi2_phy_clk = {
    500	.halt_reg = 0x01e8,
    501	.halt_bit = 29,
    502	.clkr = {
    503		.enable_reg = 0x022c,
    504		.enable_mask = BIT(8),
    505		.hw.init = &(struct clk_init_data){
    506			.parent_names = (const char *[]){ "csi2_src" },
    507			.num_parents = 1,
    508			.name = "csi2_phy_clk",
    509			.ops = &clk_branch_ops,
    510			.flags = CLK_SET_RATE_PARENT,
    511		},
    512	},
    513};
    514
    515struct clk_pix_rdi {
    516	u32 s_reg;
    517	u32 s_mask;
    518	u32 s2_reg;
    519	u32 s2_mask;
    520	struct clk_regmap clkr;
    521};
    522
    523#define to_clk_pix_rdi(_hw) \
    524	container_of(to_clk_regmap(_hw), struct clk_pix_rdi, clkr)
    525
    526static int pix_rdi_set_parent(struct clk_hw *hw, u8 index)
    527{
    528	int i;
    529	int ret = 0;
    530	u32 val;
    531	struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw);
    532	int num_parents = clk_hw_get_num_parents(hw);
    533
    534	/*
    535	 * These clocks select three inputs via two muxes. One mux selects
    536	 * between csi0 and csi1 and the second mux selects between that mux's
    537	 * output and csi2. The source and destination selections for each
    538	 * mux must be clocking for the switch to succeed so just turn on
    539	 * all three sources because it's easier than figuring out what source
    540	 * needs to be on at what time.
    541	 */
    542	for (i = 0; i < num_parents; i++) {
    543		struct clk_hw *p = clk_hw_get_parent_by_index(hw, i);
    544		ret = clk_prepare_enable(p->clk);
    545		if (ret)
    546			goto err;
    547	}
    548
    549	if (index == 2)
    550		val = rdi->s2_mask;
    551	else
    552		val = 0;
    553	regmap_update_bits(rdi->clkr.regmap, rdi->s2_reg, rdi->s2_mask, val);
    554	/*
    555	 * Wait at least 6 cycles of slowest clock
    556	 * for the glitch-free MUX to fully switch sources.
    557	 */
    558	udelay(1);
    559
    560	if (index == 1)
    561		val = rdi->s_mask;
    562	else
    563		val = 0;
    564	regmap_update_bits(rdi->clkr.regmap, rdi->s_reg, rdi->s_mask, val);
    565	/*
    566	 * Wait at least 6 cycles of slowest clock
    567	 * for the glitch-free MUX to fully switch sources.
    568	 */
    569	udelay(1);
    570
    571err:
    572	for (i--; i >= 0; i--) {
    573		struct clk_hw *p = clk_hw_get_parent_by_index(hw, i);
    574		clk_disable_unprepare(p->clk);
    575	}
    576
    577	return ret;
    578}
    579
    580static u8 pix_rdi_get_parent(struct clk_hw *hw)
    581{
    582	u32 val;
    583	struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw);
    584
    585
    586	regmap_read(rdi->clkr.regmap, rdi->s2_reg, &val);
    587	if (val & rdi->s2_mask)
    588		return 2;
    589
    590	regmap_read(rdi->clkr.regmap, rdi->s_reg, &val);
    591	if (val & rdi->s_mask)
    592		return 1;
    593
    594	return 0;
    595}
    596
    597static const struct clk_ops clk_ops_pix_rdi = {
    598	.enable = clk_enable_regmap,
    599	.disable = clk_disable_regmap,
    600	.set_parent = pix_rdi_set_parent,
    601	.get_parent = pix_rdi_get_parent,
    602	.determine_rate = __clk_mux_determine_rate,
    603};
    604
    605static const char * const pix_rdi_parents[] = {
    606	"csi0_clk",
    607	"csi1_clk",
    608	"csi2_clk",
    609};
    610
    611static struct clk_pix_rdi csi_pix_clk = {
    612	.s_reg = 0x0058,
    613	.s_mask = BIT(25),
    614	.s2_reg = 0x0238,
    615	.s2_mask = BIT(13),
    616	.clkr = {
    617		.enable_reg = 0x0058,
    618		.enable_mask = BIT(26),
    619		.hw.init = &(struct clk_init_data){
    620			.name = "csi_pix_clk",
    621			.parent_names = pix_rdi_parents,
    622			.num_parents = 3,
    623			.ops = &clk_ops_pix_rdi,
    624		},
    625	},
    626};
    627
    628static struct clk_pix_rdi csi_pix1_clk = {
    629	.s_reg = 0x0238,
    630	.s_mask = BIT(8),
    631	.s2_reg = 0x0238,
    632	.s2_mask = BIT(9),
    633	.clkr = {
    634		.enable_reg = 0x0238,
    635		.enable_mask = BIT(10),
    636		.hw.init = &(struct clk_init_data){
    637			.name = "csi_pix1_clk",
    638			.parent_names = pix_rdi_parents,
    639			.num_parents = 3,
    640			.ops = &clk_ops_pix_rdi,
    641		},
    642	},
    643};
    644
    645static struct clk_pix_rdi csi_rdi_clk = {
    646	.s_reg = 0x0058,
    647	.s_mask = BIT(12),
    648	.s2_reg = 0x0238,
    649	.s2_mask = BIT(12),
    650	.clkr = {
    651		.enable_reg = 0x0058,
    652		.enable_mask = BIT(13),
    653		.hw.init = &(struct clk_init_data){
    654			.name = "csi_rdi_clk",
    655			.parent_names = pix_rdi_parents,
    656			.num_parents = 3,
    657			.ops = &clk_ops_pix_rdi,
    658		},
    659	},
    660};
    661
    662static struct clk_pix_rdi csi_rdi1_clk = {
    663	.s_reg = 0x0238,
    664	.s_mask = BIT(0),
    665	.s2_reg = 0x0238,
    666	.s2_mask = BIT(1),
    667	.clkr = {
    668		.enable_reg = 0x0238,
    669		.enable_mask = BIT(2),
    670		.hw.init = &(struct clk_init_data){
    671			.name = "csi_rdi1_clk",
    672			.parent_names = pix_rdi_parents,
    673			.num_parents = 3,
    674			.ops = &clk_ops_pix_rdi,
    675		},
    676	},
    677};
    678
    679static struct clk_pix_rdi csi_rdi2_clk = {
    680	.s_reg = 0x0238,
    681	.s_mask = BIT(4),
    682	.s2_reg = 0x0238,
    683	.s2_mask = BIT(5),
    684	.clkr = {
    685		.enable_reg = 0x0238,
    686		.enable_mask = BIT(6),
    687		.hw.init = &(struct clk_init_data){
    688			.name = "csi_rdi2_clk",
    689			.parent_names = pix_rdi_parents,
    690			.num_parents = 3,
    691			.ops = &clk_ops_pix_rdi,
    692		},
    693	},
    694};
    695
    696static struct freq_tbl clk_tbl_csiphytimer[] = {
    697	{  85330000, P_PLL8, 1, 2, 9 },
    698	{ 177780000, P_PLL2, 1, 2, 9 },
    699	{ }
    700};
    701
    702static struct clk_rcg csiphytimer_src = {
    703	.ns_reg = 0x0168,
    704	.md_reg = 0x0164,
    705	.mn = {
    706		.mnctr_en_bit = 5,
    707		.mnctr_reset_bit = 8,
    708		.reset_in_cc = true,
    709		.mnctr_mode_shift = 6,
    710		.n_val_shift = 24,
    711		.m_val_shift = 8,
    712		.width = 8,
    713	},
    714	.p = {
    715		.pre_div_shift = 14,
    716		.pre_div_width = 2,
    717	},
    718	.s = {
    719		.src_sel_shift = 0,
    720		.parent_map = mmcc_pxo_pll8_pll2_map,
    721	},
    722	.freq_tbl = clk_tbl_csiphytimer,
    723	.clkr = {
    724		.enable_reg = 0x0160,
    725		.enable_mask = BIT(2),
    726		.hw.init = &(struct clk_init_data){
    727			.name = "csiphytimer_src",
    728			.parent_names = mmcc_pxo_pll8_pll2,
    729			.num_parents = 3,
    730			.ops = &clk_rcg_ops,
    731		},
    732	},
    733};
    734
    735static const char * const csixphy_timer_src[] = { "csiphytimer_src" };
    736
    737static struct clk_branch csiphy0_timer_clk = {
    738	.halt_reg = 0x01e8,
    739	.halt_bit = 17,
    740	.clkr = {
    741		.enable_reg = 0x0160,
    742		.enable_mask = BIT(0),
    743		.hw.init = &(struct clk_init_data){
    744			.parent_names = csixphy_timer_src,
    745			.num_parents = 1,
    746			.name = "csiphy0_timer_clk",
    747			.ops = &clk_branch_ops,
    748			.flags = CLK_SET_RATE_PARENT,
    749		},
    750	},
    751};
    752
    753static struct clk_branch csiphy1_timer_clk = {
    754	.halt_reg = 0x01e8,
    755	.halt_bit = 18,
    756	.clkr = {
    757		.enable_reg = 0x0160,
    758		.enable_mask = BIT(9),
    759		.hw.init = &(struct clk_init_data){
    760			.parent_names = csixphy_timer_src,
    761			.num_parents = 1,
    762			.name = "csiphy1_timer_clk",
    763			.ops = &clk_branch_ops,
    764			.flags = CLK_SET_RATE_PARENT,
    765		},
    766	},
    767};
    768
    769static struct clk_branch csiphy2_timer_clk = {
    770	.halt_reg = 0x01e8,
    771	.halt_bit = 30,
    772	.clkr = {
    773		.enable_reg = 0x0160,
    774		.enable_mask = BIT(11),
    775		.hw.init = &(struct clk_init_data){
    776			.parent_names = csixphy_timer_src,
    777			.num_parents = 1,
    778			.name = "csiphy2_timer_clk",
    779			.ops = &clk_branch_ops,
    780			.flags = CLK_SET_RATE_PARENT,
    781		},
    782	},
    783};
    784
    785static struct freq_tbl clk_tbl_gfx2d[] = {
    786	F_MN( 27000000, P_PXO,  1,  0),
    787	F_MN( 48000000, P_PLL8, 1,  8),
    788	F_MN( 54857000, P_PLL8, 1,  7),
    789	F_MN( 64000000, P_PLL8, 1,  6),
    790	F_MN( 76800000, P_PLL8, 1,  5),
    791	F_MN( 96000000, P_PLL8, 1,  4),
    792	F_MN(128000000, P_PLL8, 1,  3),
    793	F_MN(145455000, P_PLL2, 2, 11),
    794	F_MN(160000000, P_PLL2, 1,  5),
    795	F_MN(177778000, P_PLL2, 2,  9),
    796	F_MN(200000000, P_PLL2, 1,  4),
    797	F_MN(228571000, P_PLL2, 2,  7),
    798	{ }
    799};
    800
    801static struct clk_dyn_rcg gfx2d0_src = {
    802	.ns_reg[0] = 0x0070,
    803	.ns_reg[1] = 0x0070,
    804	.md_reg[0] = 0x0064,
    805	.md_reg[1] = 0x0068,
    806	.bank_reg = 0x0060,
    807	.mn[0] = {
    808		.mnctr_en_bit = 8,
    809		.mnctr_reset_bit = 25,
    810		.mnctr_mode_shift = 9,
    811		.n_val_shift = 20,
    812		.m_val_shift = 4,
    813		.width = 4,
    814	},
    815	.mn[1] = {
    816		.mnctr_en_bit = 5,
    817		.mnctr_reset_bit = 24,
    818		.mnctr_mode_shift = 6,
    819		.n_val_shift = 16,
    820		.m_val_shift = 4,
    821		.width = 4,
    822	},
    823	.s[0] = {
    824		.src_sel_shift = 3,
    825		.parent_map = mmcc_pxo_pll8_pll2_map,
    826	},
    827	.s[1] = {
    828		.src_sel_shift = 0,
    829		.parent_map = mmcc_pxo_pll8_pll2_map,
    830	},
    831	.mux_sel_bit = 11,
    832	.freq_tbl = clk_tbl_gfx2d,
    833	.clkr = {
    834		.enable_reg = 0x0060,
    835		.enable_mask = BIT(2),
    836		.hw.init = &(struct clk_init_data){
    837			.name = "gfx2d0_src",
    838			.parent_names = mmcc_pxo_pll8_pll2,
    839			.num_parents = 3,
    840			.ops = &clk_dyn_rcg_ops,
    841		},
    842	},
    843};
    844
    845static struct clk_branch gfx2d0_clk = {
    846	.halt_reg = 0x01c8,
    847	.halt_bit = 9,
    848	.clkr = {
    849		.enable_reg = 0x0060,
    850		.enable_mask = BIT(0),
    851		.hw.init = &(struct clk_init_data){
    852			.name = "gfx2d0_clk",
    853			.parent_names = (const char *[]){ "gfx2d0_src" },
    854			.num_parents = 1,
    855			.ops = &clk_branch_ops,
    856			.flags = CLK_SET_RATE_PARENT,
    857		},
    858	},
    859};
    860
    861static struct clk_dyn_rcg gfx2d1_src = {
    862	.ns_reg[0] = 0x007c,
    863	.ns_reg[1] = 0x007c,
    864	.md_reg[0] = 0x0078,
    865	.md_reg[1] = 0x006c,
    866	.bank_reg = 0x0074,
    867	.mn[0] = {
    868		.mnctr_en_bit = 8,
    869		.mnctr_reset_bit = 25,
    870		.mnctr_mode_shift = 9,
    871		.n_val_shift = 20,
    872		.m_val_shift = 4,
    873		.width = 4,
    874	},
    875	.mn[1] = {
    876		.mnctr_en_bit = 5,
    877		.mnctr_reset_bit = 24,
    878		.mnctr_mode_shift = 6,
    879		.n_val_shift = 16,
    880		.m_val_shift = 4,
    881		.width = 4,
    882	},
    883	.s[0] = {
    884		.src_sel_shift = 3,
    885		.parent_map = mmcc_pxo_pll8_pll2_map,
    886	},
    887	.s[1] = {
    888		.src_sel_shift = 0,
    889		.parent_map = mmcc_pxo_pll8_pll2_map,
    890	},
    891	.mux_sel_bit = 11,
    892	.freq_tbl = clk_tbl_gfx2d,
    893	.clkr = {
    894		.enable_reg = 0x0074,
    895		.enable_mask = BIT(2),
    896		.hw.init = &(struct clk_init_data){
    897			.name = "gfx2d1_src",
    898			.parent_names = mmcc_pxo_pll8_pll2,
    899			.num_parents = 3,
    900			.ops = &clk_dyn_rcg_ops,
    901		},
    902	},
    903};
    904
    905static struct clk_branch gfx2d1_clk = {
    906	.halt_reg = 0x01c8,
    907	.halt_bit = 14,
    908	.clkr = {
    909		.enable_reg = 0x0074,
    910		.enable_mask = BIT(0),
    911		.hw.init = &(struct clk_init_data){
    912			.name = "gfx2d1_clk",
    913			.parent_names = (const char *[]){ "gfx2d1_src" },
    914			.num_parents = 1,
    915			.ops = &clk_branch_ops,
    916			.flags = CLK_SET_RATE_PARENT,
    917		},
    918	},
    919};
    920
    921static struct freq_tbl clk_tbl_gfx3d[] = {
    922	F_MN( 27000000, P_PXO,  1,  0),
    923	F_MN( 48000000, P_PLL8, 1,  8),
    924	F_MN( 54857000, P_PLL8, 1,  7),
    925	F_MN( 64000000, P_PLL8, 1,  6),
    926	F_MN( 76800000, P_PLL8, 1,  5),
    927	F_MN( 96000000, P_PLL8, 1,  4),
    928	F_MN(128000000, P_PLL8, 1,  3),
    929	F_MN(145455000, P_PLL2, 2, 11),
    930	F_MN(160000000, P_PLL2, 1,  5),
    931	F_MN(177778000, P_PLL2, 2,  9),
    932	F_MN(200000000, P_PLL2, 1,  4),
    933	F_MN(228571000, P_PLL2, 2,  7),
    934	F_MN(266667000, P_PLL2, 1,  3),
    935	F_MN(300000000, P_PLL3, 1,  4),
    936	F_MN(320000000, P_PLL2, 2,  5),
    937	F_MN(400000000, P_PLL2, 1,  2),
    938	{ }
    939};
    940
    941static struct freq_tbl clk_tbl_gfx3d_8064[] = {
    942	F_MN( 27000000, P_PXO,   0,  0),
    943	F_MN( 48000000, P_PLL8,  1,  8),
    944	F_MN( 54857000, P_PLL8,  1,  7),
    945	F_MN( 64000000, P_PLL8,  1,  6),
    946	F_MN( 76800000, P_PLL8,  1,  5),
    947	F_MN( 96000000, P_PLL8,  1,  4),
    948	F_MN(128000000, P_PLL8,  1,  3),
    949	F_MN(145455000, P_PLL2,  2, 11),
    950	F_MN(160000000, P_PLL2,  1,  5),
    951	F_MN(177778000, P_PLL2,  2,  9),
    952	F_MN(192000000, P_PLL8,  1,  2),
    953	F_MN(200000000, P_PLL2,  1,  4),
    954	F_MN(228571000, P_PLL2,  2,  7),
    955	F_MN(266667000, P_PLL2,  1,  3),
    956	F_MN(320000000, P_PLL2,  2,  5),
    957	F_MN(400000000, P_PLL2,  1,  2),
    958	F_MN(450000000, P_PLL15, 1,  2),
    959	{ }
    960};
    961
    962static struct clk_dyn_rcg gfx3d_src = {
    963	.ns_reg[0] = 0x008c,
    964	.ns_reg[1] = 0x008c,
    965	.md_reg[0] = 0x0084,
    966	.md_reg[1] = 0x0088,
    967	.bank_reg = 0x0080,
    968	.mn[0] = {
    969		.mnctr_en_bit = 8,
    970		.mnctr_reset_bit = 25,
    971		.mnctr_mode_shift = 9,
    972		.n_val_shift = 18,
    973		.m_val_shift = 4,
    974		.width = 4,
    975	},
    976	.mn[1] = {
    977		.mnctr_en_bit = 5,
    978		.mnctr_reset_bit = 24,
    979		.mnctr_mode_shift = 6,
    980		.n_val_shift = 14,
    981		.m_val_shift = 4,
    982		.width = 4,
    983	},
    984	.s[0] = {
    985		.src_sel_shift = 3,
    986		.parent_map = mmcc_pxo_pll8_pll2_pll3_map,
    987	},
    988	.s[1] = {
    989		.src_sel_shift = 0,
    990		.parent_map = mmcc_pxo_pll8_pll2_pll3_map,
    991	},
    992	.mux_sel_bit = 11,
    993	.freq_tbl = clk_tbl_gfx3d,
    994	.clkr = {
    995		.enable_reg = 0x0080,
    996		.enable_mask = BIT(2),
    997		.hw.init = &(struct clk_init_data){
    998			.name = "gfx3d_src",
    999			.parent_names = mmcc_pxo_pll8_pll2_pll3,
   1000			.num_parents = 4,
   1001			.ops = &clk_dyn_rcg_ops,
   1002		},
   1003	},
   1004};
   1005
   1006static const struct clk_init_data gfx3d_8064_init = {
   1007	.name = "gfx3d_src",
   1008	.parent_names = mmcc_pxo_pll8_pll2_pll15,
   1009	.num_parents = 4,
   1010	.ops = &clk_dyn_rcg_ops,
   1011};
   1012
   1013static struct clk_branch gfx3d_clk = {
   1014	.halt_reg = 0x01c8,
   1015	.halt_bit = 4,
   1016	.clkr = {
   1017		.enable_reg = 0x0080,
   1018		.enable_mask = BIT(0),
   1019		.hw.init = &(struct clk_init_data){
   1020			.name = "gfx3d_clk",
   1021			.parent_names = (const char *[]){ "gfx3d_src" },
   1022			.num_parents = 1,
   1023			.ops = &clk_branch_ops,
   1024			.flags = CLK_SET_RATE_PARENT,
   1025		},
   1026	},
   1027};
   1028
   1029static struct freq_tbl clk_tbl_vcap[] = {
   1030	F_MN( 27000000, P_PXO,  0,  0),
   1031	F_MN( 54860000, P_PLL8, 1,  7),
   1032	F_MN( 64000000, P_PLL8, 1,  6),
   1033	F_MN( 76800000, P_PLL8, 1,  5),
   1034	F_MN(128000000, P_PLL8, 1,  3),
   1035	F_MN(160000000, P_PLL2, 1,  5),
   1036	F_MN(200000000, P_PLL2, 1,  4),
   1037	{ }
   1038};
   1039
   1040static struct clk_dyn_rcg vcap_src = {
   1041	.ns_reg[0] = 0x021c,
   1042	.ns_reg[1] = 0x021c,
   1043	.md_reg[0] = 0x01ec,
   1044	.md_reg[1] = 0x0218,
   1045	.bank_reg = 0x0178,
   1046	.mn[0] = {
   1047		.mnctr_en_bit = 8,
   1048		.mnctr_reset_bit = 23,
   1049		.mnctr_mode_shift = 9,
   1050		.n_val_shift = 18,
   1051		.m_val_shift = 4,
   1052		.width = 4,
   1053	},
   1054	.mn[1] = {
   1055		.mnctr_en_bit = 5,
   1056		.mnctr_reset_bit = 22,
   1057		.mnctr_mode_shift = 6,
   1058		.n_val_shift = 14,
   1059		.m_val_shift = 4,
   1060		.width = 4,
   1061	},
   1062	.s[0] = {
   1063		.src_sel_shift = 3,
   1064		.parent_map = mmcc_pxo_pll8_pll2_map,
   1065	},
   1066	.s[1] = {
   1067		.src_sel_shift = 0,
   1068		.parent_map = mmcc_pxo_pll8_pll2_map,
   1069	},
   1070	.mux_sel_bit = 11,
   1071	.freq_tbl = clk_tbl_vcap,
   1072	.clkr = {
   1073		.enable_reg = 0x0178,
   1074		.enable_mask = BIT(2),
   1075		.hw.init = &(struct clk_init_data){
   1076			.name = "vcap_src",
   1077			.parent_names = mmcc_pxo_pll8_pll2,
   1078			.num_parents = 3,
   1079			.ops = &clk_dyn_rcg_ops,
   1080		},
   1081	},
   1082};
   1083
   1084static struct clk_branch vcap_clk = {
   1085	.halt_reg = 0x0240,
   1086	.halt_bit = 15,
   1087	.clkr = {
   1088		.enable_reg = 0x0178,
   1089		.enable_mask = BIT(0),
   1090		.hw.init = &(struct clk_init_data){
   1091			.name = "vcap_clk",
   1092			.parent_names = (const char *[]){ "vcap_src" },
   1093			.num_parents = 1,
   1094			.ops = &clk_branch_ops,
   1095			.flags = CLK_SET_RATE_PARENT,
   1096		},
   1097	},
   1098};
   1099
   1100static struct clk_branch vcap_npl_clk = {
   1101	.halt_reg = 0x0240,
   1102	.halt_bit = 25,
   1103	.clkr = {
   1104		.enable_reg = 0x0178,
   1105		.enable_mask = BIT(13),
   1106		.hw.init = &(struct clk_init_data){
   1107			.name = "vcap_npl_clk",
   1108			.parent_names = (const char *[]){ "vcap_src" },
   1109			.num_parents = 1,
   1110			.ops = &clk_branch_ops,
   1111			.flags = CLK_SET_RATE_PARENT,
   1112		},
   1113	},
   1114};
   1115
   1116static struct freq_tbl clk_tbl_ijpeg[] = {
   1117	{  27000000, P_PXO,  1, 0,  0 },
   1118	{  36570000, P_PLL8, 1, 2, 21 },
   1119	{  54860000, P_PLL8, 7, 0,  0 },
   1120	{  96000000, P_PLL8, 4, 0,  0 },
   1121	{ 109710000, P_PLL8, 1, 2,  7 },
   1122	{ 128000000, P_PLL8, 3, 0,  0 },
   1123	{ 153600000, P_PLL8, 1, 2,  5 },
   1124	{ 200000000, P_PLL2, 4, 0,  0 },
   1125	{ 228571000, P_PLL2, 1, 2,  7 },
   1126	{ 266667000, P_PLL2, 1, 1,  3 },
   1127	{ 320000000, P_PLL2, 1, 2,  5 },
   1128	{ }
   1129};
   1130
   1131static struct clk_rcg ijpeg_src = {
   1132	.ns_reg = 0x00a0,
   1133	.md_reg = 0x009c,
   1134	.mn = {
   1135		.mnctr_en_bit = 5,
   1136		.mnctr_reset_bit = 7,
   1137		.mnctr_mode_shift = 6,
   1138		.n_val_shift = 16,
   1139		.m_val_shift = 8,
   1140		.width = 8,
   1141	},
   1142	.p = {
   1143		.pre_div_shift = 12,
   1144		.pre_div_width = 2,
   1145	},
   1146	.s = {
   1147		.src_sel_shift = 0,
   1148		.parent_map = mmcc_pxo_pll8_pll2_map,
   1149	},
   1150	.freq_tbl = clk_tbl_ijpeg,
   1151	.clkr = {
   1152		.enable_reg = 0x0098,
   1153		.enable_mask = BIT(2),
   1154		.hw.init = &(struct clk_init_data){
   1155			.name = "ijpeg_src",
   1156			.parent_names = mmcc_pxo_pll8_pll2,
   1157			.num_parents = 3,
   1158			.ops = &clk_rcg_ops,
   1159		},
   1160	},
   1161};
   1162
   1163static struct clk_branch ijpeg_clk = {
   1164	.halt_reg = 0x01c8,
   1165	.halt_bit = 24,
   1166	.clkr = {
   1167		.enable_reg = 0x0098,
   1168		.enable_mask = BIT(0),
   1169		.hw.init = &(struct clk_init_data){
   1170			.name = "ijpeg_clk",
   1171			.parent_names = (const char *[]){ "ijpeg_src" },
   1172			.num_parents = 1,
   1173			.ops = &clk_branch_ops,
   1174			.flags = CLK_SET_RATE_PARENT,
   1175		},
   1176	},
   1177};
   1178
   1179static struct freq_tbl clk_tbl_jpegd[] = {
   1180	{  64000000, P_PLL8, 6 },
   1181	{  76800000, P_PLL8, 5 },
   1182	{  96000000, P_PLL8, 4 },
   1183	{ 160000000, P_PLL2, 5 },
   1184	{ 200000000, P_PLL2, 4 },
   1185	{ }
   1186};
   1187
   1188static struct clk_rcg jpegd_src = {
   1189	.ns_reg = 0x00ac,
   1190	.p = {
   1191		.pre_div_shift = 12,
   1192		.pre_div_width = 4,
   1193	},
   1194	.s = {
   1195		.src_sel_shift = 0,
   1196		.parent_map = mmcc_pxo_pll8_pll2_map,
   1197	},
   1198	.freq_tbl = clk_tbl_jpegd,
   1199	.clkr = {
   1200		.enable_reg = 0x00a4,
   1201		.enable_mask = BIT(2),
   1202		.hw.init = &(struct clk_init_data){
   1203			.name = "jpegd_src",
   1204			.parent_names = mmcc_pxo_pll8_pll2,
   1205			.num_parents = 3,
   1206			.ops = &clk_rcg_ops,
   1207		},
   1208	},
   1209};
   1210
   1211static struct clk_branch jpegd_clk = {
   1212	.halt_reg = 0x01c8,
   1213	.halt_bit = 19,
   1214	.clkr = {
   1215		.enable_reg = 0x00a4,
   1216		.enable_mask = BIT(0),
   1217		.hw.init = &(struct clk_init_data){
   1218			.name = "jpegd_clk",
   1219			.parent_names = (const char *[]){ "jpegd_src" },
   1220			.num_parents = 1,
   1221			.ops = &clk_branch_ops,
   1222			.flags = CLK_SET_RATE_PARENT,
   1223		},
   1224	},
   1225};
   1226
   1227static struct freq_tbl clk_tbl_mdp[] = {
   1228	{   9600000, P_PLL8, 1, 1, 40 },
   1229	{  13710000, P_PLL8, 1, 1, 28 },
   1230	{  27000000, P_PXO,  1, 0,  0 },
   1231	{  29540000, P_PLL8, 1, 1, 13 },
   1232	{  34910000, P_PLL8, 1, 1, 11 },
   1233	{  38400000, P_PLL8, 1, 1, 10 },
   1234	{  59080000, P_PLL8, 1, 2, 13 },
   1235	{  76800000, P_PLL8, 1, 1,  5 },
   1236	{  85330000, P_PLL8, 1, 2,  9 },
   1237	{  96000000, P_PLL8, 1, 1,  4 },
   1238	{ 128000000, P_PLL8, 1, 1,  3 },
   1239	{ 160000000, P_PLL2, 1, 1,  5 },
   1240	{ 177780000, P_PLL2, 1, 2,  9 },
   1241	{ 200000000, P_PLL2, 1, 1,  4 },
   1242	{ 228571000, P_PLL2, 1, 2,  7 },
   1243	{ 266667000, P_PLL2, 1, 1,  3 },
   1244	{ }
   1245};
   1246
   1247static struct clk_dyn_rcg mdp_src = {
   1248	.ns_reg[0] = 0x00d0,
   1249	.ns_reg[1] = 0x00d0,
   1250	.md_reg[0] = 0x00c4,
   1251	.md_reg[1] = 0x00c8,
   1252	.bank_reg = 0x00c0,
   1253	.mn[0] = {
   1254		.mnctr_en_bit = 8,
   1255		.mnctr_reset_bit = 31,
   1256		.mnctr_mode_shift = 9,
   1257		.n_val_shift = 22,
   1258		.m_val_shift = 8,
   1259		.width = 8,
   1260	},
   1261	.mn[1] = {
   1262		.mnctr_en_bit = 5,
   1263		.mnctr_reset_bit = 30,
   1264		.mnctr_mode_shift = 6,
   1265		.n_val_shift = 14,
   1266		.m_val_shift = 8,
   1267		.width = 8,
   1268	},
   1269	.s[0] = {
   1270		.src_sel_shift = 3,
   1271		.parent_map = mmcc_pxo_pll8_pll2_map,
   1272	},
   1273	.s[1] = {
   1274		.src_sel_shift = 0,
   1275		.parent_map = mmcc_pxo_pll8_pll2_map,
   1276	},
   1277	.mux_sel_bit = 11,
   1278	.freq_tbl = clk_tbl_mdp,
   1279	.clkr = {
   1280		.enable_reg = 0x00c0,
   1281		.enable_mask = BIT(2),
   1282		.hw.init = &(struct clk_init_data){
   1283			.name = "mdp_src",
   1284			.parent_names = mmcc_pxo_pll8_pll2,
   1285			.num_parents = 3,
   1286			.ops = &clk_dyn_rcg_ops,
   1287		},
   1288	},
   1289};
   1290
   1291static struct clk_branch mdp_clk = {
   1292	.halt_reg = 0x01d0,
   1293	.halt_bit = 10,
   1294	.clkr = {
   1295		.enable_reg = 0x00c0,
   1296		.enable_mask = BIT(0),
   1297		.hw.init = &(struct clk_init_data){
   1298			.name = "mdp_clk",
   1299			.parent_names = (const char *[]){ "mdp_src" },
   1300			.num_parents = 1,
   1301			.ops = &clk_branch_ops,
   1302			.flags = CLK_SET_RATE_PARENT,
   1303		},
   1304	},
   1305};
   1306
   1307static struct clk_branch mdp_lut_clk = {
   1308	.halt_reg = 0x01e8,
   1309	.halt_bit = 13,
   1310	.clkr = {
   1311		.enable_reg = 0x016c,
   1312		.enable_mask = BIT(0),
   1313		.hw.init = &(struct clk_init_data){
   1314			.parent_names = (const char *[]){ "mdp_src" },
   1315			.num_parents = 1,
   1316			.name = "mdp_lut_clk",
   1317			.ops = &clk_branch_ops,
   1318			.flags = CLK_SET_RATE_PARENT,
   1319		},
   1320	},
   1321};
   1322
   1323static struct clk_branch mdp_vsync_clk = {
   1324	.halt_reg = 0x01cc,
   1325	.halt_bit = 22,
   1326	.clkr = {
   1327		.enable_reg = 0x0058,
   1328		.enable_mask = BIT(6),
   1329		.hw.init = &(struct clk_init_data){
   1330			.name = "mdp_vsync_clk",
   1331			.parent_names = (const char *[]){ "pxo" },
   1332			.num_parents = 1,
   1333			.ops = &clk_branch_ops
   1334		},
   1335	},
   1336};
   1337
   1338static struct freq_tbl clk_tbl_rot[] = {
   1339	{  27000000, P_PXO,   1 },
   1340	{  29540000, P_PLL8, 13 },
   1341	{  32000000, P_PLL8, 12 },
   1342	{  38400000, P_PLL8, 10 },
   1343	{  48000000, P_PLL8,  8 },
   1344	{  54860000, P_PLL8,  7 },
   1345	{  64000000, P_PLL8,  6 },
   1346	{  76800000, P_PLL8,  5 },
   1347	{  96000000, P_PLL8,  4 },
   1348	{ 100000000, P_PLL2,  8 },
   1349	{ 114290000, P_PLL2,  7 },
   1350	{ 133330000, P_PLL2,  6 },
   1351	{ 160000000, P_PLL2,  5 },
   1352	{ 200000000, P_PLL2,  4 },
   1353	{ }
   1354};
   1355
   1356static struct clk_dyn_rcg rot_src = {
   1357	.ns_reg[0] = 0x00e8,
   1358	.ns_reg[1] = 0x00e8,
   1359	.bank_reg = 0x00e8,
   1360	.p[0] = {
   1361		.pre_div_shift = 22,
   1362		.pre_div_width = 4,
   1363	},
   1364	.p[1] = {
   1365		.pre_div_shift = 26,
   1366		.pre_div_width = 4,
   1367	},
   1368	.s[0] = {
   1369		.src_sel_shift = 16,
   1370		.parent_map = mmcc_pxo_pll8_pll2_map,
   1371	},
   1372	.s[1] = {
   1373		.src_sel_shift = 19,
   1374		.parent_map = mmcc_pxo_pll8_pll2_map,
   1375	},
   1376	.mux_sel_bit = 30,
   1377	.freq_tbl = clk_tbl_rot,
   1378	.clkr = {
   1379		.enable_reg = 0x00e0,
   1380		.enable_mask = BIT(2),
   1381		.hw.init = &(struct clk_init_data){
   1382			.name = "rot_src",
   1383			.parent_names = mmcc_pxo_pll8_pll2,
   1384			.num_parents = 3,
   1385			.ops = &clk_dyn_rcg_ops,
   1386		},
   1387	},
   1388};
   1389
   1390static struct clk_branch rot_clk = {
   1391	.halt_reg = 0x01d0,
   1392	.halt_bit = 15,
   1393	.clkr = {
   1394		.enable_reg = 0x00e0,
   1395		.enable_mask = BIT(0),
   1396		.hw.init = &(struct clk_init_data){
   1397			.name = "rot_clk",
   1398			.parent_names = (const char *[]){ "rot_src" },
   1399			.num_parents = 1,
   1400			.ops = &clk_branch_ops,
   1401			.flags = CLK_SET_RATE_PARENT,
   1402		},
   1403	},
   1404};
   1405
   1406static const struct parent_map mmcc_pxo_hdmi_map[] = {
   1407	{ P_PXO, 0 },
   1408	{ P_HDMI_PLL, 3 }
   1409};
   1410
   1411static const char * const mmcc_pxo_hdmi[] = {
   1412	"pxo",
   1413	"hdmi_pll",
   1414};
   1415
   1416static struct freq_tbl clk_tbl_tv[] = {
   1417	{  .src = P_HDMI_PLL, .pre_div = 1 },
   1418	{ }
   1419};
   1420
   1421static struct clk_rcg tv_src = {
   1422	.ns_reg = 0x00f4,
   1423	.md_reg = 0x00f0,
   1424	.mn = {
   1425		.mnctr_en_bit = 5,
   1426		.mnctr_reset_bit = 7,
   1427		.mnctr_mode_shift = 6,
   1428		.n_val_shift = 16,
   1429		.m_val_shift = 8,
   1430		.width = 8,
   1431	},
   1432	.p = {
   1433		.pre_div_shift = 14,
   1434		.pre_div_width = 2,
   1435	},
   1436	.s = {
   1437		.src_sel_shift = 0,
   1438		.parent_map = mmcc_pxo_hdmi_map,
   1439	},
   1440	.freq_tbl = clk_tbl_tv,
   1441	.clkr = {
   1442		.enable_reg = 0x00ec,
   1443		.enable_mask = BIT(2),
   1444		.hw.init = &(struct clk_init_data){
   1445			.name = "tv_src",
   1446			.parent_names = mmcc_pxo_hdmi,
   1447			.num_parents = 2,
   1448			.ops = &clk_rcg_bypass_ops,
   1449			.flags = CLK_SET_RATE_PARENT,
   1450		},
   1451	},
   1452};
   1453
   1454static const char * const tv_src_name[] = { "tv_src" };
   1455
   1456static struct clk_branch tv_enc_clk = {
   1457	.halt_reg = 0x01d4,
   1458	.halt_bit = 9,
   1459	.clkr = {
   1460		.enable_reg = 0x00ec,
   1461		.enable_mask = BIT(8),
   1462		.hw.init = &(struct clk_init_data){
   1463			.parent_names = tv_src_name,
   1464			.num_parents = 1,
   1465			.name = "tv_enc_clk",
   1466			.ops = &clk_branch_ops,
   1467			.flags = CLK_SET_RATE_PARENT,
   1468		},
   1469	},
   1470};
   1471
   1472static struct clk_branch tv_dac_clk = {
   1473	.halt_reg = 0x01d4,
   1474	.halt_bit = 10,
   1475	.clkr = {
   1476		.enable_reg = 0x00ec,
   1477		.enable_mask = BIT(10),
   1478		.hw.init = &(struct clk_init_data){
   1479			.parent_names = tv_src_name,
   1480			.num_parents = 1,
   1481			.name = "tv_dac_clk",
   1482			.ops = &clk_branch_ops,
   1483			.flags = CLK_SET_RATE_PARENT,
   1484		},
   1485	},
   1486};
   1487
   1488static struct clk_branch mdp_tv_clk = {
   1489	.halt_reg = 0x01d4,
   1490	.halt_bit = 12,
   1491	.clkr = {
   1492		.enable_reg = 0x00ec,
   1493		.enable_mask = BIT(0),
   1494		.hw.init = &(struct clk_init_data){
   1495			.parent_names = tv_src_name,
   1496			.num_parents = 1,
   1497			.name = "mdp_tv_clk",
   1498			.ops = &clk_branch_ops,
   1499			.flags = CLK_SET_RATE_PARENT,
   1500		},
   1501	},
   1502};
   1503
   1504static struct clk_branch hdmi_tv_clk = {
   1505	.halt_reg = 0x01d4,
   1506	.halt_bit = 11,
   1507	.clkr = {
   1508		.enable_reg = 0x00ec,
   1509		.enable_mask = BIT(12),
   1510		.hw.init = &(struct clk_init_data){
   1511			.parent_names = tv_src_name,
   1512			.num_parents = 1,
   1513			.name = "hdmi_tv_clk",
   1514			.ops = &clk_branch_ops,
   1515			.flags = CLK_SET_RATE_PARENT,
   1516		},
   1517	},
   1518};
   1519
   1520static struct clk_branch rgb_tv_clk = {
   1521	.halt_reg = 0x0240,
   1522	.halt_bit = 27,
   1523	.clkr = {
   1524		.enable_reg = 0x0124,
   1525		.enable_mask = BIT(14),
   1526		.hw.init = &(struct clk_init_data){
   1527			.parent_names = tv_src_name,
   1528			.num_parents = 1,
   1529			.name = "rgb_tv_clk",
   1530			.ops = &clk_branch_ops,
   1531			.flags = CLK_SET_RATE_PARENT,
   1532		},
   1533	},
   1534};
   1535
   1536static struct clk_branch npl_tv_clk = {
   1537	.halt_reg = 0x0240,
   1538	.halt_bit = 26,
   1539	.clkr = {
   1540		.enable_reg = 0x0124,
   1541		.enable_mask = BIT(16),
   1542		.hw.init = &(struct clk_init_data){
   1543			.parent_names = tv_src_name,
   1544			.num_parents = 1,
   1545			.name = "npl_tv_clk",
   1546			.ops = &clk_branch_ops,
   1547			.flags = CLK_SET_RATE_PARENT,
   1548		},
   1549	},
   1550};
   1551
   1552static struct clk_branch hdmi_app_clk = {
   1553	.halt_reg = 0x01cc,
   1554	.halt_bit = 25,
   1555	.clkr = {
   1556		.enable_reg = 0x005c,
   1557		.enable_mask = BIT(11),
   1558		.hw.init = &(struct clk_init_data){
   1559			.parent_names = (const char *[]){ "pxo" },
   1560			.num_parents = 1,
   1561			.name = "hdmi_app_clk",
   1562			.ops = &clk_branch_ops,
   1563		},
   1564	},
   1565};
   1566
   1567static struct freq_tbl clk_tbl_vcodec[] = {
   1568	F_MN( 27000000, P_PXO,  1,  0),
   1569	F_MN( 32000000, P_PLL8, 1, 12),
   1570	F_MN( 48000000, P_PLL8, 1,  8),
   1571	F_MN( 54860000, P_PLL8, 1,  7),
   1572	F_MN( 96000000, P_PLL8, 1,  4),
   1573	F_MN(133330000, P_PLL2, 1,  6),
   1574	F_MN(200000000, P_PLL2, 1,  4),
   1575	F_MN(228570000, P_PLL2, 2,  7),
   1576	F_MN(266670000, P_PLL2, 1,  3),
   1577	{ }
   1578};
   1579
   1580static struct clk_dyn_rcg vcodec_src = {
   1581	.ns_reg[0] = 0x0100,
   1582	.ns_reg[1] = 0x0100,
   1583	.md_reg[0] = 0x00fc,
   1584	.md_reg[1] = 0x0128,
   1585	.bank_reg = 0x00f8,
   1586	.mn[0] = {
   1587		.mnctr_en_bit = 5,
   1588		.mnctr_reset_bit = 31,
   1589		.mnctr_mode_shift = 6,
   1590		.n_val_shift = 11,
   1591		.m_val_shift = 8,
   1592		.width = 8,
   1593	},
   1594	.mn[1] = {
   1595		.mnctr_en_bit = 10,
   1596		.mnctr_reset_bit = 30,
   1597		.mnctr_mode_shift = 11,
   1598		.n_val_shift = 19,
   1599		.m_val_shift = 8,
   1600		.width = 8,
   1601	},
   1602	.s[0] = {
   1603		.src_sel_shift = 27,
   1604		.parent_map = mmcc_pxo_pll8_pll2_map,
   1605	},
   1606	.s[1] = {
   1607		.src_sel_shift = 0,
   1608		.parent_map = mmcc_pxo_pll8_pll2_map,
   1609	},
   1610	.mux_sel_bit = 13,
   1611	.freq_tbl = clk_tbl_vcodec,
   1612	.clkr = {
   1613		.enable_reg = 0x00f8,
   1614		.enable_mask = BIT(2),
   1615		.hw.init = &(struct clk_init_data){
   1616			.name = "vcodec_src",
   1617			.parent_names = mmcc_pxo_pll8_pll2,
   1618			.num_parents = 3,
   1619			.ops = &clk_dyn_rcg_ops,
   1620		},
   1621	},
   1622};
   1623
   1624static struct clk_branch vcodec_clk = {
   1625	.halt_reg = 0x01d0,
   1626	.halt_bit = 29,
   1627	.clkr = {
   1628		.enable_reg = 0x00f8,
   1629		.enable_mask = BIT(0),
   1630		.hw.init = &(struct clk_init_data){
   1631			.name = "vcodec_clk",
   1632			.parent_names = (const char *[]){ "vcodec_src" },
   1633			.num_parents = 1,
   1634			.ops = &clk_branch_ops,
   1635			.flags = CLK_SET_RATE_PARENT,
   1636		},
   1637	},
   1638};
   1639
   1640static struct freq_tbl clk_tbl_vpe[] = {
   1641	{  27000000, P_PXO,   1 },
   1642	{  34909000, P_PLL8, 11 },
   1643	{  38400000, P_PLL8, 10 },
   1644	{  64000000, P_PLL8,  6 },
   1645	{  76800000, P_PLL8,  5 },
   1646	{  96000000, P_PLL8,  4 },
   1647	{ 100000000, P_PLL2,  8 },
   1648	{ 160000000, P_PLL2,  5 },
   1649	{ }
   1650};
   1651
   1652static struct clk_rcg vpe_src = {
   1653	.ns_reg = 0x0118,
   1654	.p = {
   1655		.pre_div_shift = 12,
   1656		.pre_div_width = 4,
   1657	},
   1658	.s = {
   1659		.src_sel_shift = 0,
   1660		.parent_map = mmcc_pxo_pll8_pll2_map,
   1661	},
   1662	.freq_tbl = clk_tbl_vpe,
   1663	.clkr = {
   1664		.enable_reg = 0x0110,
   1665		.enable_mask = BIT(2),
   1666		.hw.init = &(struct clk_init_data){
   1667			.name = "vpe_src",
   1668			.parent_names = mmcc_pxo_pll8_pll2,
   1669			.num_parents = 3,
   1670			.ops = &clk_rcg_ops,
   1671		},
   1672	},
   1673};
   1674
   1675static struct clk_branch vpe_clk = {
   1676	.halt_reg = 0x01c8,
   1677	.halt_bit = 28,
   1678	.clkr = {
   1679		.enable_reg = 0x0110,
   1680		.enable_mask = BIT(0),
   1681		.hw.init = &(struct clk_init_data){
   1682			.name = "vpe_clk",
   1683			.parent_names = (const char *[]){ "vpe_src" },
   1684			.num_parents = 1,
   1685			.ops = &clk_branch_ops,
   1686			.flags = CLK_SET_RATE_PARENT,
   1687		},
   1688	},
   1689};
   1690
   1691static struct freq_tbl clk_tbl_vfe[] = {
   1692	{  13960000, P_PLL8,  1, 2, 55 },
   1693	{  27000000, P_PXO,   1, 0,  0 },
   1694	{  36570000, P_PLL8,  1, 2, 21 },
   1695	{  38400000, P_PLL8,  2, 1,  5 },
   1696	{  45180000, P_PLL8,  1, 2, 17 },
   1697	{  48000000, P_PLL8,  2, 1,  4 },
   1698	{  54860000, P_PLL8,  1, 1,  7 },
   1699	{  64000000, P_PLL8,  2, 1,  3 },
   1700	{  76800000, P_PLL8,  1, 1,  5 },
   1701	{  96000000, P_PLL8,  2, 1,  2 },
   1702	{ 109710000, P_PLL8,  1, 2,  7 },
   1703	{ 128000000, P_PLL8,  1, 1,  3 },
   1704	{ 153600000, P_PLL8,  1, 2,  5 },
   1705	{ 200000000, P_PLL2,  2, 1,  2 },
   1706	{ 228570000, P_PLL2,  1, 2,  7 },
   1707	{ 266667000, P_PLL2,  1, 1,  3 },
   1708	{ 320000000, P_PLL2,  1, 2,  5 },
   1709	{ }
   1710};
   1711
   1712static struct clk_rcg vfe_src = {
   1713	.ns_reg = 0x0108,
   1714	.mn = {
   1715		.mnctr_en_bit = 5,
   1716		.mnctr_reset_bit = 7,
   1717		.mnctr_mode_shift = 6,
   1718		.n_val_shift = 16,
   1719		.m_val_shift = 8,
   1720		.width = 8,
   1721	},
   1722	.p = {
   1723		.pre_div_shift = 10,
   1724		.pre_div_width = 1,
   1725	},
   1726	.s = {
   1727		.src_sel_shift = 0,
   1728		.parent_map = mmcc_pxo_pll8_pll2_map,
   1729	},
   1730	.freq_tbl = clk_tbl_vfe,
   1731	.clkr = {
   1732		.enable_reg = 0x0104,
   1733		.enable_mask = BIT(2),
   1734		.hw.init = &(struct clk_init_data){
   1735			.name = "vfe_src",
   1736			.parent_names = mmcc_pxo_pll8_pll2,
   1737			.num_parents = 3,
   1738			.ops = &clk_rcg_ops,
   1739		},
   1740	},
   1741};
   1742
   1743static struct clk_branch vfe_clk = {
   1744	.halt_reg = 0x01cc,
   1745	.halt_bit = 6,
   1746	.clkr = {
   1747		.enable_reg = 0x0104,
   1748		.enable_mask = BIT(0),
   1749		.hw.init = &(struct clk_init_data){
   1750			.name = "vfe_clk",
   1751			.parent_names = (const char *[]){ "vfe_src" },
   1752			.num_parents = 1,
   1753			.ops = &clk_branch_ops,
   1754			.flags = CLK_SET_RATE_PARENT,
   1755		},
   1756	},
   1757};
   1758
   1759static struct clk_branch vfe_csi_clk = {
   1760	.halt_reg = 0x01cc,
   1761	.halt_bit = 8,
   1762	.clkr = {
   1763		.enable_reg = 0x0104,
   1764		.enable_mask = BIT(12),
   1765		.hw.init = &(struct clk_init_data){
   1766			.parent_names = (const char *[]){ "vfe_src" },
   1767			.num_parents = 1,
   1768			.name = "vfe_csi_clk",
   1769			.ops = &clk_branch_ops,
   1770			.flags = CLK_SET_RATE_PARENT,
   1771		},
   1772	},
   1773};
   1774
   1775static struct clk_branch gmem_axi_clk = {
   1776	.halt_reg = 0x01d8,
   1777	.halt_bit = 6,
   1778	.clkr = {
   1779		.enable_reg = 0x0018,
   1780		.enable_mask = BIT(24),
   1781		.hw.init = &(struct clk_init_data){
   1782			.name = "gmem_axi_clk",
   1783			.ops = &clk_branch_ops,
   1784		},
   1785	},
   1786};
   1787
   1788static struct clk_branch ijpeg_axi_clk = {
   1789	.hwcg_reg = 0x0018,
   1790	.hwcg_bit = 11,
   1791	.halt_reg = 0x01d8,
   1792	.halt_bit = 4,
   1793	.clkr = {
   1794		.enable_reg = 0x0018,
   1795		.enable_mask = BIT(21),
   1796		.hw.init = &(struct clk_init_data){
   1797			.name = "ijpeg_axi_clk",
   1798			.ops = &clk_branch_ops,
   1799		},
   1800	},
   1801};
   1802
   1803static struct clk_branch mmss_imem_axi_clk = {
   1804	.hwcg_reg = 0x0018,
   1805	.hwcg_bit = 15,
   1806	.halt_reg = 0x01d8,
   1807	.halt_bit = 7,
   1808	.clkr = {
   1809		.enable_reg = 0x0018,
   1810		.enable_mask = BIT(22),
   1811		.hw.init = &(struct clk_init_data){
   1812			.name = "mmss_imem_axi_clk",
   1813			.ops = &clk_branch_ops,
   1814		},
   1815	},
   1816};
   1817
   1818static struct clk_branch jpegd_axi_clk = {
   1819	.halt_reg = 0x01d8,
   1820	.halt_bit = 5,
   1821	.clkr = {
   1822		.enable_reg = 0x0018,
   1823		.enable_mask = BIT(25),
   1824		.hw.init = &(struct clk_init_data){
   1825			.name = "jpegd_axi_clk",
   1826			.ops = &clk_branch_ops,
   1827		},
   1828	},
   1829};
   1830
   1831static struct clk_branch vcodec_axi_b_clk = {
   1832	.hwcg_reg = 0x0114,
   1833	.hwcg_bit = 22,
   1834	.halt_reg = 0x01e8,
   1835	.halt_bit = 25,
   1836	.clkr = {
   1837		.enable_reg = 0x0114,
   1838		.enable_mask = BIT(23),
   1839		.hw.init = &(struct clk_init_data){
   1840			.name = "vcodec_axi_b_clk",
   1841			.ops = &clk_branch_ops,
   1842		},
   1843	},
   1844};
   1845
   1846static struct clk_branch vcodec_axi_a_clk = {
   1847	.hwcg_reg = 0x0114,
   1848	.hwcg_bit = 24,
   1849	.halt_reg = 0x01e8,
   1850	.halt_bit = 26,
   1851	.clkr = {
   1852		.enable_reg = 0x0114,
   1853		.enable_mask = BIT(25),
   1854		.hw.init = &(struct clk_init_data){
   1855			.name = "vcodec_axi_a_clk",
   1856			.ops = &clk_branch_ops,
   1857		},
   1858	},
   1859};
   1860
   1861static struct clk_branch vcodec_axi_clk = {
   1862	.hwcg_reg = 0x0018,
   1863	.hwcg_bit = 13,
   1864	.halt_reg = 0x01d8,
   1865	.halt_bit = 3,
   1866	.clkr = {
   1867		.enable_reg = 0x0018,
   1868		.enable_mask = BIT(19),
   1869		.hw.init = &(struct clk_init_data){
   1870			.name = "vcodec_axi_clk",
   1871			.ops = &clk_branch_ops,
   1872		},
   1873	},
   1874};
   1875
   1876static struct clk_branch vfe_axi_clk = {
   1877	.halt_reg = 0x01d8,
   1878	.halt_bit = 0,
   1879	.clkr = {
   1880		.enable_reg = 0x0018,
   1881		.enable_mask = BIT(18),
   1882		.hw.init = &(struct clk_init_data){
   1883			.name = "vfe_axi_clk",
   1884			.ops = &clk_branch_ops,
   1885		},
   1886	},
   1887};
   1888
   1889static struct clk_branch mdp_axi_clk = {
   1890	.hwcg_reg = 0x0018,
   1891	.hwcg_bit = 16,
   1892	.halt_reg = 0x01d8,
   1893	.halt_bit = 8,
   1894	.clkr = {
   1895		.enable_reg = 0x0018,
   1896		.enable_mask = BIT(23),
   1897		.hw.init = &(struct clk_init_data){
   1898			.name = "mdp_axi_clk",
   1899			.ops = &clk_branch_ops,
   1900		},
   1901	},
   1902};
   1903
   1904static struct clk_branch rot_axi_clk = {
   1905	.hwcg_reg = 0x0020,
   1906	.hwcg_bit = 25,
   1907	.halt_reg = 0x01d8,
   1908	.halt_bit = 2,
   1909	.clkr = {
   1910		.enable_reg = 0x0020,
   1911		.enable_mask = BIT(24),
   1912		.hw.init = &(struct clk_init_data){
   1913			.name = "rot_axi_clk",
   1914			.ops = &clk_branch_ops,
   1915		},
   1916	},
   1917};
   1918
   1919static struct clk_branch vcap_axi_clk = {
   1920	.halt_reg = 0x0240,
   1921	.halt_bit = 20,
   1922	.hwcg_reg = 0x0244,
   1923	.hwcg_bit = 11,
   1924	.clkr = {
   1925		.enable_reg = 0x0244,
   1926		.enable_mask = BIT(12),
   1927		.hw.init = &(struct clk_init_data){
   1928			.name = "vcap_axi_clk",
   1929			.ops = &clk_branch_ops,
   1930		},
   1931	},
   1932};
   1933
   1934static struct clk_branch vpe_axi_clk = {
   1935	.hwcg_reg = 0x0020,
   1936	.hwcg_bit = 27,
   1937	.halt_reg = 0x01d8,
   1938	.halt_bit = 1,
   1939	.clkr = {
   1940		.enable_reg = 0x0020,
   1941		.enable_mask = BIT(26),
   1942		.hw.init = &(struct clk_init_data){
   1943			.name = "vpe_axi_clk",
   1944			.ops = &clk_branch_ops,
   1945		},
   1946	},
   1947};
   1948
   1949static struct clk_branch gfx3d_axi_clk = {
   1950	.hwcg_reg = 0x0244,
   1951	.hwcg_bit = 24,
   1952	.halt_reg = 0x0240,
   1953	.halt_bit = 30,
   1954	.clkr = {
   1955		.enable_reg = 0x0244,
   1956		.enable_mask = BIT(25),
   1957		.hw.init = &(struct clk_init_data){
   1958			.name = "gfx3d_axi_clk",
   1959			.ops = &clk_branch_ops,
   1960		},
   1961	},
   1962};
   1963
   1964static struct clk_branch amp_ahb_clk = {
   1965	.halt_reg = 0x01dc,
   1966	.halt_bit = 18,
   1967	.clkr = {
   1968		.enable_reg = 0x0008,
   1969		.enable_mask = BIT(24),
   1970		.hw.init = &(struct clk_init_data){
   1971			.name = "amp_ahb_clk",
   1972			.ops = &clk_branch_ops,
   1973		},
   1974	},
   1975};
   1976
   1977static struct clk_branch csi_ahb_clk = {
   1978	.halt_reg = 0x01dc,
   1979	.halt_bit = 16,
   1980	.clkr = {
   1981		.enable_reg = 0x0008,
   1982		.enable_mask = BIT(7),
   1983		.hw.init = &(struct clk_init_data){
   1984			.name = "csi_ahb_clk",
   1985			.ops = &clk_branch_ops,
   1986		},
   1987	},
   1988};
   1989
   1990static struct clk_branch dsi_m_ahb_clk = {
   1991	.halt_reg = 0x01dc,
   1992	.halt_bit = 19,
   1993	.clkr = {
   1994		.enable_reg = 0x0008,
   1995		.enable_mask = BIT(9),
   1996		.hw.init = &(struct clk_init_data){
   1997			.name = "dsi_m_ahb_clk",
   1998			.ops = &clk_branch_ops,
   1999		},
   2000	},
   2001};
   2002
   2003static struct clk_branch dsi_s_ahb_clk = {
   2004	.hwcg_reg = 0x0038,
   2005	.hwcg_bit = 20,
   2006	.halt_reg = 0x01dc,
   2007	.halt_bit = 21,
   2008	.clkr = {
   2009		.enable_reg = 0x0008,
   2010		.enable_mask = BIT(18),
   2011		.hw.init = &(struct clk_init_data){
   2012			.name = "dsi_s_ahb_clk",
   2013			.ops = &clk_branch_ops,
   2014		},
   2015	},
   2016};
   2017
   2018static struct clk_branch dsi2_m_ahb_clk = {
   2019	.halt_reg = 0x01d8,
   2020	.halt_bit = 18,
   2021	.clkr = {
   2022		.enable_reg = 0x0008,
   2023		.enable_mask = BIT(17),
   2024		.hw.init = &(struct clk_init_data){
   2025			.name = "dsi2_m_ahb_clk",
   2026			.ops = &clk_branch_ops,
   2027		},
   2028	},
   2029};
   2030
   2031static struct clk_branch dsi2_s_ahb_clk = {
   2032	.hwcg_reg = 0x0038,
   2033	.hwcg_bit = 15,
   2034	.halt_reg = 0x01dc,
   2035	.halt_bit = 20,
   2036	.clkr = {
   2037		.enable_reg = 0x0008,
   2038		.enable_mask = BIT(22),
   2039		.hw.init = &(struct clk_init_data){
   2040			.name = "dsi2_s_ahb_clk",
   2041			.ops = &clk_branch_ops,
   2042		},
   2043	},
   2044};
   2045
   2046static struct clk_rcg dsi1_src = {
   2047	.ns_reg = 0x0054,
   2048	.md_reg = 0x0050,
   2049	.mn = {
   2050		.mnctr_en_bit = 5,
   2051		.mnctr_reset_bit = 7,
   2052		.mnctr_mode_shift = 6,
   2053		.n_val_shift = 24,
   2054		.m_val_shift = 8,
   2055		.width = 8,
   2056	},
   2057	.p = {
   2058		.pre_div_shift = 14,
   2059		.pre_div_width = 2,
   2060	},
   2061	.s = {
   2062		.src_sel_shift = 0,
   2063		.parent_map = mmcc_pxo_dsi2_dsi1_map,
   2064	},
   2065	.clkr = {
   2066		.enable_reg = 0x004c,
   2067		.enable_mask = BIT(2),
   2068		.hw.init = &(struct clk_init_data){
   2069			.name = "dsi1_src",
   2070			.parent_names = mmcc_pxo_dsi2_dsi1,
   2071			.num_parents = 3,
   2072			.ops = &clk_rcg_bypass2_ops,
   2073			.flags = CLK_SET_RATE_PARENT,
   2074		},
   2075	},
   2076};
   2077
   2078static struct clk_branch dsi1_clk = {
   2079	.halt_reg = 0x01d0,
   2080	.halt_bit = 2,
   2081	.clkr = {
   2082		.enable_reg = 0x004c,
   2083		.enable_mask = BIT(0),
   2084		.hw.init = &(struct clk_init_data){
   2085			.name = "dsi1_clk",
   2086			.parent_names = (const char *[]){ "dsi1_src" },
   2087			.num_parents = 1,
   2088			.ops = &clk_branch_ops,
   2089			.flags = CLK_SET_RATE_PARENT,
   2090		},
   2091	},
   2092};
   2093
   2094static struct clk_rcg dsi2_src = {
   2095	.ns_reg = 0x012c,
   2096	.md_reg = 0x00a8,
   2097	.mn = {
   2098		.mnctr_en_bit = 5,
   2099		.mnctr_reset_bit = 7,
   2100		.mnctr_mode_shift = 6,
   2101		.n_val_shift = 24,
   2102		.m_val_shift = 8,
   2103		.width = 8,
   2104	},
   2105	.p = {
   2106		.pre_div_shift = 14,
   2107		.pre_div_width = 2,
   2108	},
   2109	.s = {
   2110		.src_sel_shift = 0,
   2111		.parent_map = mmcc_pxo_dsi2_dsi1_map,
   2112	},
   2113	.clkr = {
   2114		.enable_reg = 0x003c,
   2115		.enable_mask = BIT(2),
   2116		.hw.init = &(struct clk_init_data){
   2117			.name = "dsi2_src",
   2118			.parent_names = mmcc_pxo_dsi2_dsi1,
   2119			.num_parents = 3,
   2120			.ops = &clk_rcg_bypass2_ops,
   2121			.flags = CLK_SET_RATE_PARENT,
   2122		},
   2123	},
   2124};
   2125
   2126static struct clk_branch dsi2_clk = {
   2127	.halt_reg = 0x01d0,
   2128	.halt_bit = 20,
   2129	.clkr = {
   2130		.enable_reg = 0x003c,
   2131		.enable_mask = BIT(0),
   2132		.hw.init = &(struct clk_init_data){
   2133			.name = "dsi2_clk",
   2134			.parent_names = (const char *[]){ "dsi2_src" },
   2135			.num_parents = 1,
   2136			.ops = &clk_branch_ops,
   2137			.flags = CLK_SET_RATE_PARENT,
   2138		},
   2139	},
   2140};
   2141
   2142static struct clk_rcg dsi1_byte_src = {
   2143	.ns_reg = 0x00b0,
   2144	.p = {
   2145		.pre_div_shift = 12,
   2146		.pre_div_width = 4,
   2147	},
   2148	.s = {
   2149		.src_sel_shift = 0,
   2150		.parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
   2151	},
   2152	.clkr = {
   2153		.enable_reg = 0x0090,
   2154		.enable_mask = BIT(2),
   2155		.hw.init = &(struct clk_init_data){
   2156			.name = "dsi1_byte_src",
   2157			.parent_names = mmcc_pxo_dsi1_dsi2_byte,
   2158			.num_parents = 3,
   2159			.ops = &clk_rcg_bypass2_ops,
   2160			.flags = CLK_SET_RATE_PARENT,
   2161		},
   2162	},
   2163};
   2164
   2165static struct clk_branch dsi1_byte_clk = {
   2166	.halt_reg = 0x01cc,
   2167	.halt_bit = 21,
   2168	.clkr = {
   2169		.enable_reg = 0x0090,
   2170		.enable_mask = BIT(0),
   2171		.hw.init = &(struct clk_init_data){
   2172			.name = "dsi1_byte_clk",
   2173			.parent_names = (const char *[]){ "dsi1_byte_src" },
   2174			.num_parents = 1,
   2175			.ops = &clk_branch_ops,
   2176			.flags = CLK_SET_RATE_PARENT,
   2177		},
   2178	},
   2179};
   2180
   2181static struct clk_rcg dsi2_byte_src = {
   2182	.ns_reg = 0x012c,
   2183	.p = {
   2184		.pre_div_shift = 12,
   2185		.pre_div_width = 4,
   2186	},
   2187	.s = {
   2188		.src_sel_shift = 0,
   2189		.parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
   2190	},
   2191	.clkr = {
   2192		.enable_reg = 0x0130,
   2193		.enable_mask = BIT(2),
   2194		.hw.init = &(struct clk_init_data){
   2195			.name = "dsi2_byte_src",
   2196			.parent_names = mmcc_pxo_dsi1_dsi2_byte,
   2197			.num_parents = 3,
   2198			.ops = &clk_rcg_bypass2_ops,
   2199			.flags = CLK_SET_RATE_PARENT,
   2200		},
   2201	},
   2202};
   2203
   2204static struct clk_branch dsi2_byte_clk = {
   2205	.halt_reg = 0x01cc,
   2206	.halt_bit = 20,
   2207	.clkr = {
   2208		.enable_reg = 0x00b4,
   2209		.enable_mask = BIT(0),
   2210		.hw.init = &(struct clk_init_data){
   2211			.name = "dsi2_byte_clk",
   2212			.parent_names = (const char *[]){ "dsi2_byte_src" },
   2213			.num_parents = 1,
   2214			.ops = &clk_branch_ops,
   2215			.flags = CLK_SET_RATE_PARENT,
   2216		},
   2217	},
   2218};
   2219
   2220static struct clk_rcg dsi1_esc_src = {
   2221	.ns_reg = 0x0011c,
   2222	.p = {
   2223		.pre_div_shift = 12,
   2224		.pre_div_width = 4,
   2225	},
   2226	.s = {
   2227		.src_sel_shift = 0,
   2228		.parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
   2229	},
   2230	.clkr = {
   2231		.enable_reg = 0x00cc,
   2232		.enable_mask = BIT(2),
   2233		.hw.init = &(struct clk_init_data){
   2234			.name = "dsi1_esc_src",
   2235			.parent_names = mmcc_pxo_dsi1_dsi2_byte,
   2236			.num_parents = 3,
   2237			.ops = &clk_rcg_esc_ops,
   2238		},
   2239	},
   2240};
   2241
   2242static struct clk_branch dsi1_esc_clk = {
   2243	.halt_reg = 0x01e8,
   2244	.halt_bit = 1,
   2245	.clkr = {
   2246		.enable_reg = 0x00cc,
   2247		.enable_mask = BIT(0),
   2248		.hw.init = &(struct clk_init_data){
   2249			.name = "dsi1_esc_clk",
   2250			.parent_names = (const char *[]){ "dsi1_esc_src" },
   2251			.num_parents = 1,
   2252			.ops = &clk_branch_ops,
   2253			.flags = CLK_SET_RATE_PARENT,
   2254		},
   2255	},
   2256};
   2257
   2258static struct clk_rcg dsi2_esc_src = {
   2259	.ns_reg = 0x0150,
   2260	.p = {
   2261		.pre_div_shift = 12,
   2262		.pre_div_width = 4,
   2263	},
   2264	.s = {
   2265		.src_sel_shift = 0,
   2266		.parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
   2267	},
   2268	.clkr = {
   2269		.enable_reg = 0x013c,
   2270		.enable_mask = BIT(2),
   2271		.hw.init = &(struct clk_init_data){
   2272			.name = "dsi2_esc_src",
   2273			.parent_names = mmcc_pxo_dsi1_dsi2_byte,
   2274			.num_parents = 3,
   2275			.ops = &clk_rcg_esc_ops,
   2276		},
   2277	},
   2278};
   2279
   2280static struct clk_branch dsi2_esc_clk = {
   2281	.halt_reg = 0x01e8,
   2282	.halt_bit = 3,
   2283	.clkr = {
   2284		.enable_reg = 0x013c,
   2285		.enable_mask = BIT(0),
   2286		.hw.init = &(struct clk_init_data){
   2287			.name = "dsi2_esc_clk",
   2288			.parent_names = (const char *[]){ "dsi2_esc_src" },
   2289			.num_parents = 1,
   2290			.ops = &clk_branch_ops,
   2291			.flags = CLK_SET_RATE_PARENT,
   2292		},
   2293	},
   2294};
   2295
   2296static struct clk_rcg dsi1_pixel_src = {
   2297	.ns_reg = 0x0138,
   2298	.md_reg = 0x0134,
   2299	.mn = {
   2300		.mnctr_en_bit = 5,
   2301		.mnctr_reset_bit = 7,
   2302		.mnctr_mode_shift = 6,
   2303		.n_val_shift = 16,
   2304		.m_val_shift = 8,
   2305		.width = 8,
   2306	},
   2307	.p = {
   2308		.pre_div_shift = 12,
   2309		.pre_div_width = 4,
   2310	},
   2311	.s = {
   2312		.src_sel_shift = 0,
   2313		.parent_map = mmcc_pxo_dsi2_dsi1_map,
   2314	},
   2315	.clkr = {
   2316		.enable_reg = 0x0130,
   2317		.enable_mask = BIT(2),
   2318		.hw.init = &(struct clk_init_data){
   2319			.name = "dsi1_pixel_src",
   2320			.parent_names = mmcc_pxo_dsi2_dsi1,
   2321			.num_parents = 3,
   2322			.ops = &clk_rcg_pixel_ops,
   2323		},
   2324	},
   2325};
   2326
   2327static struct clk_branch dsi1_pixel_clk = {
   2328	.halt_reg = 0x01d0,
   2329	.halt_bit = 6,
   2330	.clkr = {
   2331		.enable_reg = 0x0130,
   2332		.enable_mask = BIT(0),
   2333		.hw.init = &(struct clk_init_data){
   2334			.name = "mdp_pclk1_clk",
   2335			.parent_names = (const char *[]){ "dsi1_pixel_src" },
   2336			.num_parents = 1,
   2337			.ops = &clk_branch_ops,
   2338			.flags = CLK_SET_RATE_PARENT,
   2339		},
   2340	},
   2341};
   2342
   2343static struct clk_rcg dsi2_pixel_src = {
   2344	.ns_reg = 0x00e4,
   2345	.md_reg = 0x00b8,
   2346	.mn = {
   2347		.mnctr_en_bit = 5,
   2348		.mnctr_reset_bit = 7,
   2349		.mnctr_mode_shift = 6,
   2350		.n_val_shift = 16,
   2351		.m_val_shift = 8,
   2352		.width = 8,
   2353	},
   2354	.p = {
   2355		.pre_div_shift = 12,
   2356		.pre_div_width = 4,
   2357	},
   2358	.s = {
   2359		.src_sel_shift = 0,
   2360		.parent_map = mmcc_pxo_dsi2_dsi1_map,
   2361	},
   2362	.clkr = {
   2363		.enable_reg = 0x0094,
   2364		.enable_mask = BIT(2),
   2365		.hw.init = &(struct clk_init_data){
   2366			.name = "dsi2_pixel_src",
   2367			.parent_names = mmcc_pxo_dsi2_dsi1,
   2368			.num_parents = 3,
   2369			.ops = &clk_rcg_pixel_ops,
   2370		},
   2371	},
   2372};
   2373
   2374static struct clk_branch dsi2_pixel_clk = {
   2375	.halt_reg = 0x01d0,
   2376	.halt_bit = 19,
   2377	.clkr = {
   2378		.enable_reg = 0x0094,
   2379		.enable_mask = BIT(0),
   2380		.hw.init = &(struct clk_init_data){
   2381			.name = "mdp_pclk2_clk",
   2382			.parent_names = (const char *[]){ "dsi2_pixel_src" },
   2383			.num_parents = 1,
   2384			.ops = &clk_branch_ops,
   2385			.flags = CLK_SET_RATE_PARENT,
   2386		},
   2387	},
   2388};
   2389
   2390static struct clk_branch gfx2d0_ahb_clk = {
   2391	.hwcg_reg = 0x0038,
   2392	.hwcg_bit = 28,
   2393	.halt_reg = 0x01dc,
   2394	.halt_bit = 2,
   2395	.clkr = {
   2396		.enable_reg = 0x0008,
   2397		.enable_mask = BIT(19),
   2398		.hw.init = &(struct clk_init_data){
   2399			.name = "gfx2d0_ahb_clk",
   2400			.ops = &clk_branch_ops,
   2401		},
   2402	},
   2403};
   2404
   2405static struct clk_branch gfx2d1_ahb_clk = {
   2406	.hwcg_reg = 0x0038,
   2407	.hwcg_bit = 29,
   2408	.halt_reg = 0x01dc,
   2409	.halt_bit = 3,
   2410	.clkr = {
   2411		.enable_reg = 0x0008,
   2412		.enable_mask = BIT(2),
   2413		.hw.init = &(struct clk_init_data){
   2414			.name = "gfx2d1_ahb_clk",
   2415			.ops = &clk_branch_ops,
   2416		},
   2417	},
   2418};
   2419
   2420static struct clk_branch gfx3d_ahb_clk = {
   2421	.hwcg_reg = 0x0038,
   2422	.hwcg_bit = 27,
   2423	.halt_reg = 0x01dc,
   2424	.halt_bit = 4,
   2425	.clkr = {
   2426		.enable_reg = 0x0008,
   2427		.enable_mask = BIT(3),
   2428		.hw.init = &(struct clk_init_data){
   2429			.name = "gfx3d_ahb_clk",
   2430			.ops = &clk_branch_ops,
   2431		},
   2432	},
   2433};
   2434
   2435static struct clk_branch hdmi_m_ahb_clk = {
   2436	.hwcg_reg = 0x0038,
   2437	.hwcg_bit = 21,
   2438	.halt_reg = 0x01dc,
   2439	.halt_bit = 5,
   2440	.clkr = {
   2441		.enable_reg = 0x0008,
   2442		.enable_mask = BIT(14),
   2443		.hw.init = &(struct clk_init_data){
   2444			.name = "hdmi_m_ahb_clk",
   2445			.ops = &clk_branch_ops,
   2446		},
   2447	},
   2448};
   2449
   2450static struct clk_branch hdmi_s_ahb_clk = {
   2451	.hwcg_reg = 0x0038,
   2452	.hwcg_bit = 22,
   2453	.halt_reg = 0x01dc,
   2454	.halt_bit = 6,
   2455	.clkr = {
   2456		.enable_reg = 0x0008,
   2457		.enable_mask = BIT(4),
   2458		.hw.init = &(struct clk_init_data){
   2459			.name = "hdmi_s_ahb_clk",
   2460			.ops = &clk_branch_ops,
   2461		},
   2462	},
   2463};
   2464
   2465static struct clk_branch ijpeg_ahb_clk = {
   2466	.halt_reg = 0x01dc,
   2467	.halt_bit = 9,
   2468	.clkr = {
   2469		.enable_reg = 0x0008,
   2470		.enable_mask = BIT(5),
   2471		.hw.init = &(struct clk_init_data){
   2472			.name = "ijpeg_ahb_clk",
   2473			.ops = &clk_branch_ops,
   2474		},
   2475	},
   2476};
   2477
   2478static struct clk_branch mmss_imem_ahb_clk = {
   2479	.hwcg_reg = 0x0038,
   2480	.hwcg_bit = 12,
   2481	.halt_reg = 0x01dc,
   2482	.halt_bit = 10,
   2483	.clkr = {
   2484		.enable_reg = 0x0008,
   2485		.enable_mask = BIT(6),
   2486		.hw.init = &(struct clk_init_data){
   2487			.name = "mmss_imem_ahb_clk",
   2488			.ops = &clk_branch_ops,
   2489		},
   2490	},
   2491};
   2492
   2493static struct clk_branch jpegd_ahb_clk = {
   2494	.halt_reg = 0x01dc,
   2495	.halt_bit = 7,
   2496	.clkr = {
   2497		.enable_reg = 0x0008,
   2498		.enable_mask = BIT(21),
   2499		.hw.init = &(struct clk_init_data){
   2500			.name = "jpegd_ahb_clk",
   2501			.ops = &clk_branch_ops,
   2502		},
   2503	},
   2504};
   2505
   2506static struct clk_branch mdp_ahb_clk = {
   2507	.halt_reg = 0x01dc,
   2508	.halt_bit = 11,
   2509	.clkr = {
   2510		.enable_reg = 0x0008,
   2511		.enable_mask = BIT(10),
   2512		.hw.init = &(struct clk_init_data){
   2513			.name = "mdp_ahb_clk",
   2514			.ops = &clk_branch_ops,
   2515		},
   2516	},
   2517};
   2518
   2519static struct clk_branch rot_ahb_clk = {
   2520	.halt_reg = 0x01dc,
   2521	.halt_bit = 13,
   2522	.clkr = {
   2523		.enable_reg = 0x0008,
   2524		.enable_mask = BIT(12),
   2525		.hw.init = &(struct clk_init_data){
   2526			.name = "rot_ahb_clk",
   2527			.ops = &clk_branch_ops,
   2528		},
   2529	},
   2530};
   2531
   2532static struct clk_branch smmu_ahb_clk = {
   2533	.hwcg_reg = 0x0008,
   2534	.hwcg_bit = 26,
   2535	.halt_reg = 0x01dc,
   2536	.halt_bit = 22,
   2537	.clkr = {
   2538		.enable_reg = 0x0008,
   2539		.enable_mask = BIT(15),
   2540		.hw.init = &(struct clk_init_data){
   2541			.name = "smmu_ahb_clk",
   2542			.ops = &clk_branch_ops,
   2543		},
   2544	},
   2545};
   2546
   2547static struct clk_branch tv_enc_ahb_clk = {
   2548	.halt_reg = 0x01dc,
   2549	.halt_bit = 23,
   2550	.clkr = {
   2551		.enable_reg = 0x0008,
   2552		.enable_mask = BIT(25),
   2553		.hw.init = &(struct clk_init_data){
   2554			.name = "tv_enc_ahb_clk",
   2555			.ops = &clk_branch_ops,
   2556		},
   2557	},
   2558};
   2559
   2560static struct clk_branch vcap_ahb_clk = {
   2561	.halt_reg = 0x0240,
   2562	.halt_bit = 23,
   2563	.clkr = {
   2564		.enable_reg = 0x0248,
   2565		.enable_mask = BIT(1),
   2566		.hw.init = &(struct clk_init_data){
   2567			.name = "vcap_ahb_clk",
   2568			.ops = &clk_branch_ops,
   2569		},
   2570	},
   2571};
   2572
   2573static struct clk_branch vcodec_ahb_clk = {
   2574	.hwcg_reg = 0x0038,
   2575	.hwcg_bit = 26,
   2576	.halt_reg = 0x01dc,
   2577	.halt_bit = 12,
   2578	.clkr = {
   2579		.enable_reg = 0x0008,
   2580		.enable_mask = BIT(11),
   2581		.hw.init = &(struct clk_init_data){
   2582			.name = "vcodec_ahb_clk",
   2583			.ops = &clk_branch_ops,
   2584		},
   2585	},
   2586};
   2587
   2588static struct clk_branch vfe_ahb_clk = {
   2589	.halt_reg = 0x01dc,
   2590	.halt_bit = 14,
   2591	.clkr = {
   2592		.enable_reg = 0x0008,
   2593		.enable_mask = BIT(13),
   2594		.hw.init = &(struct clk_init_data){
   2595			.name = "vfe_ahb_clk",
   2596			.ops = &clk_branch_ops,
   2597		},
   2598	},
   2599};
   2600
   2601static struct clk_branch vpe_ahb_clk = {
   2602	.halt_reg = 0x01dc,
   2603	.halt_bit = 15,
   2604	.clkr = {
   2605		.enable_reg = 0x0008,
   2606		.enable_mask = BIT(16),
   2607		.hw.init = &(struct clk_init_data){
   2608			.name = "vpe_ahb_clk",
   2609			.ops = &clk_branch_ops,
   2610		},
   2611	},
   2612};
   2613
   2614static struct clk_regmap *mmcc_msm8960_clks[] = {
   2615	[TV_ENC_AHB_CLK] = &tv_enc_ahb_clk.clkr,
   2616	[AMP_AHB_CLK] = &amp_ahb_clk.clkr,
   2617	[DSI2_S_AHB_CLK] = &dsi2_s_ahb_clk.clkr,
   2618	[JPEGD_AHB_CLK] = &jpegd_ahb_clk.clkr,
   2619	[GFX2D0_AHB_CLK] = &gfx2d0_ahb_clk.clkr,
   2620	[DSI_S_AHB_CLK] = &dsi_s_ahb_clk.clkr,
   2621	[DSI2_M_AHB_CLK] = &dsi2_m_ahb_clk.clkr,
   2622	[VPE_AHB_CLK] = &vpe_ahb_clk.clkr,
   2623	[SMMU_AHB_CLK] = &smmu_ahb_clk.clkr,
   2624	[HDMI_M_AHB_CLK] = &hdmi_m_ahb_clk.clkr,
   2625	[VFE_AHB_CLK] = &vfe_ahb_clk.clkr,
   2626	[ROT_AHB_CLK] = &rot_ahb_clk.clkr,
   2627	[VCODEC_AHB_CLK] = &vcodec_ahb_clk.clkr,
   2628	[MDP_AHB_CLK] = &mdp_ahb_clk.clkr,
   2629	[DSI_M_AHB_CLK] = &dsi_m_ahb_clk.clkr,
   2630	[CSI_AHB_CLK] = &csi_ahb_clk.clkr,
   2631	[MMSS_IMEM_AHB_CLK] = &mmss_imem_ahb_clk.clkr,
   2632	[IJPEG_AHB_CLK] = &ijpeg_ahb_clk.clkr,
   2633	[HDMI_S_AHB_CLK] = &hdmi_s_ahb_clk.clkr,
   2634	[GFX3D_AHB_CLK] = &gfx3d_ahb_clk.clkr,
   2635	[GFX2D1_AHB_CLK] = &gfx2d1_ahb_clk.clkr,
   2636	[JPEGD_AXI_CLK] = &jpegd_axi_clk.clkr,
   2637	[GMEM_AXI_CLK] = &gmem_axi_clk.clkr,
   2638	[MDP_AXI_CLK] = &mdp_axi_clk.clkr,
   2639	[MMSS_IMEM_AXI_CLK] = &mmss_imem_axi_clk.clkr,
   2640	[IJPEG_AXI_CLK] = &ijpeg_axi_clk.clkr,
   2641	[GFX3D_AXI_CLK] = &gfx3d_axi_clk.clkr,
   2642	[VCODEC_AXI_CLK] = &vcodec_axi_clk.clkr,
   2643	[VFE_AXI_CLK] = &vfe_axi_clk.clkr,
   2644	[VPE_AXI_CLK] = &vpe_axi_clk.clkr,
   2645	[ROT_AXI_CLK] = &rot_axi_clk.clkr,
   2646	[VCODEC_AXI_A_CLK] = &vcodec_axi_a_clk.clkr,
   2647	[VCODEC_AXI_B_CLK] = &vcodec_axi_b_clk.clkr,
   2648	[CSI0_SRC] = &csi0_src.clkr,
   2649	[CSI0_CLK] = &csi0_clk.clkr,
   2650	[CSI0_PHY_CLK] = &csi0_phy_clk.clkr,
   2651	[CSI1_SRC] = &csi1_src.clkr,
   2652	[CSI1_CLK] = &csi1_clk.clkr,
   2653	[CSI1_PHY_CLK] = &csi1_phy_clk.clkr,
   2654	[CSI2_SRC] = &csi2_src.clkr,
   2655	[CSI2_CLK] = &csi2_clk.clkr,
   2656	[CSI2_PHY_CLK] = &csi2_phy_clk.clkr,
   2657	[DSI_SRC] = &dsi1_src.clkr,
   2658	[DSI_CLK] = &dsi1_clk.clkr,
   2659	[CSI_PIX_CLK] = &csi_pix_clk.clkr,
   2660	[CSI_RDI_CLK] = &csi_rdi_clk.clkr,
   2661	[MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr,
   2662	[HDMI_APP_CLK] = &hdmi_app_clk.clkr,
   2663	[CSI_PIX1_CLK] = &csi_pix1_clk.clkr,
   2664	[CSI_RDI2_CLK] = &csi_rdi2_clk.clkr,
   2665	[CSI_RDI1_CLK] = &csi_rdi1_clk.clkr,
   2666	[GFX2D0_SRC] = &gfx2d0_src.clkr,
   2667	[GFX2D0_CLK] = &gfx2d0_clk.clkr,
   2668	[GFX2D1_SRC] = &gfx2d1_src.clkr,
   2669	[GFX2D1_CLK] = &gfx2d1_clk.clkr,
   2670	[GFX3D_SRC] = &gfx3d_src.clkr,
   2671	[GFX3D_CLK] = &gfx3d_clk.clkr,
   2672	[IJPEG_SRC] = &ijpeg_src.clkr,
   2673	[IJPEG_CLK] = &ijpeg_clk.clkr,
   2674	[JPEGD_SRC] = &jpegd_src.clkr,
   2675	[JPEGD_CLK] = &jpegd_clk.clkr,
   2676	[MDP_SRC] = &mdp_src.clkr,
   2677	[MDP_CLK] = &mdp_clk.clkr,
   2678	[MDP_LUT_CLK] = &mdp_lut_clk.clkr,
   2679	[DSI2_PIXEL_SRC] = &dsi2_pixel_src.clkr,
   2680	[DSI2_PIXEL_CLK] = &dsi2_pixel_clk.clkr,
   2681	[DSI2_SRC] = &dsi2_src.clkr,
   2682	[DSI2_CLK] = &dsi2_clk.clkr,
   2683	[DSI1_BYTE_SRC] = &dsi1_byte_src.clkr,
   2684	[DSI1_BYTE_CLK] = &dsi1_byte_clk.clkr,
   2685	[DSI2_BYTE_SRC] = &dsi2_byte_src.clkr,
   2686	[DSI2_BYTE_CLK] = &dsi2_byte_clk.clkr,
   2687	[DSI1_ESC_SRC] = &dsi1_esc_src.clkr,
   2688	[DSI1_ESC_CLK] = &dsi1_esc_clk.clkr,
   2689	[DSI2_ESC_SRC] = &dsi2_esc_src.clkr,
   2690	[DSI2_ESC_CLK] = &dsi2_esc_clk.clkr,
   2691	[ROT_SRC] = &rot_src.clkr,
   2692	[ROT_CLK] = &rot_clk.clkr,
   2693	[TV_ENC_CLK] = &tv_enc_clk.clkr,
   2694	[TV_DAC_CLK] = &tv_dac_clk.clkr,
   2695	[HDMI_TV_CLK] = &hdmi_tv_clk.clkr,
   2696	[MDP_TV_CLK] = &mdp_tv_clk.clkr,
   2697	[TV_SRC] = &tv_src.clkr,
   2698	[VCODEC_SRC] = &vcodec_src.clkr,
   2699	[VCODEC_CLK] = &vcodec_clk.clkr,
   2700	[VFE_SRC] = &vfe_src.clkr,
   2701	[VFE_CLK] = &vfe_clk.clkr,
   2702	[VFE_CSI_CLK] = &vfe_csi_clk.clkr,
   2703	[VPE_SRC] = &vpe_src.clkr,
   2704	[VPE_CLK] = &vpe_clk.clkr,
   2705	[DSI_PIXEL_SRC] = &dsi1_pixel_src.clkr,
   2706	[DSI_PIXEL_CLK] = &dsi1_pixel_clk.clkr,
   2707	[CAMCLK0_SRC] = &camclk0_src.clkr,
   2708	[CAMCLK0_CLK] = &camclk0_clk.clkr,
   2709	[CAMCLK1_SRC] = &camclk1_src.clkr,
   2710	[CAMCLK1_CLK] = &camclk1_clk.clkr,
   2711	[CAMCLK2_SRC] = &camclk2_src.clkr,
   2712	[CAMCLK2_CLK] = &camclk2_clk.clkr,
   2713	[CSIPHYTIMER_SRC] = &csiphytimer_src.clkr,
   2714	[CSIPHY2_TIMER_CLK] = &csiphy2_timer_clk.clkr,
   2715	[CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr,
   2716	[CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr,
   2717	[PLL2] = &pll2.clkr,
   2718};
   2719
   2720static const struct qcom_reset_map mmcc_msm8960_resets[] = {
   2721	[VPE_AXI_RESET] = { 0x0208, 15 },
   2722	[IJPEG_AXI_RESET] = { 0x0208, 14 },
   2723	[MPD_AXI_RESET] = { 0x0208, 13 },
   2724	[VFE_AXI_RESET] = { 0x0208, 9 },
   2725	[SP_AXI_RESET] = { 0x0208, 8 },
   2726	[VCODEC_AXI_RESET] = { 0x0208, 7 },
   2727	[ROT_AXI_RESET] = { 0x0208, 6 },
   2728	[VCODEC_AXI_A_RESET] = { 0x0208, 5 },
   2729	[VCODEC_AXI_B_RESET] = { 0x0208, 4 },
   2730	[FAB_S3_AXI_RESET] = { 0x0208, 3 },
   2731	[FAB_S2_AXI_RESET] = { 0x0208, 2 },
   2732	[FAB_S1_AXI_RESET] = { 0x0208, 1 },
   2733	[FAB_S0_AXI_RESET] = { 0x0208 },
   2734	[SMMU_GFX3D_ABH_RESET] = { 0x020c, 31 },
   2735	[SMMU_VPE_AHB_RESET] = { 0x020c, 30 },
   2736	[SMMU_VFE_AHB_RESET] = { 0x020c, 29 },
   2737	[SMMU_ROT_AHB_RESET] = { 0x020c, 28 },
   2738	[SMMU_VCODEC_B_AHB_RESET] = { 0x020c, 27 },
   2739	[SMMU_VCODEC_A_AHB_RESET] = { 0x020c, 26 },
   2740	[SMMU_MDP1_AHB_RESET] = { 0x020c, 25 },
   2741	[SMMU_MDP0_AHB_RESET] = { 0x020c, 24 },
   2742	[SMMU_JPEGD_AHB_RESET] = { 0x020c, 23 },
   2743	[SMMU_IJPEG_AHB_RESET] = { 0x020c, 22 },
   2744	[SMMU_GFX2D0_AHB_RESET] = { 0x020c, 21 },
   2745	[SMMU_GFX2D1_AHB_RESET] = { 0x020c, 20 },
   2746	[APU_AHB_RESET] = { 0x020c, 18 },
   2747	[CSI_AHB_RESET] = { 0x020c, 17 },
   2748	[TV_ENC_AHB_RESET] = { 0x020c, 15 },
   2749	[VPE_AHB_RESET] = { 0x020c, 14 },
   2750	[FABRIC_AHB_RESET] = { 0x020c, 13 },
   2751	[GFX2D0_AHB_RESET] = { 0x020c, 12 },
   2752	[GFX2D1_AHB_RESET] = { 0x020c, 11 },
   2753	[GFX3D_AHB_RESET] = { 0x020c, 10 },
   2754	[HDMI_AHB_RESET] = { 0x020c, 9 },
   2755	[MSSS_IMEM_AHB_RESET] = { 0x020c, 8 },
   2756	[IJPEG_AHB_RESET] = { 0x020c, 7 },
   2757	[DSI_M_AHB_RESET] = { 0x020c, 6 },
   2758	[DSI_S_AHB_RESET] = { 0x020c, 5 },
   2759	[JPEGD_AHB_RESET] = { 0x020c, 4 },
   2760	[MDP_AHB_RESET] = { 0x020c, 3 },
   2761	[ROT_AHB_RESET] = { 0x020c, 2 },
   2762	[VCODEC_AHB_RESET] = { 0x020c, 1 },
   2763	[VFE_AHB_RESET] = { 0x020c, 0 },
   2764	[DSI2_M_AHB_RESET] = { 0x0210, 31 },
   2765	[DSI2_S_AHB_RESET] = { 0x0210, 30 },
   2766	[CSIPHY2_RESET] = { 0x0210, 29 },
   2767	[CSI_PIX1_RESET] = { 0x0210, 28 },
   2768	[CSIPHY0_RESET] = { 0x0210, 27 },
   2769	[CSIPHY1_RESET] = { 0x0210, 26 },
   2770	[DSI2_RESET] = { 0x0210, 25 },
   2771	[VFE_CSI_RESET] = { 0x0210, 24 },
   2772	[MDP_RESET] = { 0x0210, 21 },
   2773	[AMP_RESET] = { 0x0210, 20 },
   2774	[JPEGD_RESET] = { 0x0210, 19 },
   2775	[CSI1_RESET] = { 0x0210, 18 },
   2776	[VPE_RESET] = { 0x0210, 17 },
   2777	[MMSS_FABRIC_RESET] = { 0x0210, 16 },
   2778	[VFE_RESET] = { 0x0210, 15 },
   2779	[GFX2D0_RESET] = { 0x0210, 14 },
   2780	[GFX2D1_RESET] = { 0x0210, 13 },
   2781	[GFX3D_RESET] = { 0x0210, 12 },
   2782	[HDMI_RESET] = { 0x0210, 11 },
   2783	[MMSS_IMEM_RESET] = { 0x0210, 10 },
   2784	[IJPEG_RESET] = { 0x0210, 9 },
   2785	[CSI0_RESET] = { 0x0210, 8 },
   2786	[DSI_RESET] = { 0x0210, 7 },
   2787	[VCODEC_RESET] = { 0x0210, 6 },
   2788	[MDP_TV_RESET] = { 0x0210, 4 },
   2789	[MDP_VSYNC_RESET] = { 0x0210, 3 },
   2790	[ROT_RESET] = { 0x0210, 2 },
   2791	[TV_HDMI_RESET] = { 0x0210, 1 },
   2792	[TV_ENC_RESET] = { 0x0210 },
   2793	[CSI2_RESET] = { 0x0214, 2 },
   2794	[CSI_RDI1_RESET] = { 0x0214, 1 },
   2795	[CSI_RDI2_RESET] = { 0x0214 },
   2796};
   2797
   2798static struct clk_regmap *mmcc_apq8064_clks[] = {
   2799	[AMP_AHB_CLK] = &amp_ahb_clk.clkr,
   2800	[DSI2_S_AHB_CLK] = &dsi2_s_ahb_clk.clkr,
   2801	[JPEGD_AHB_CLK] = &jpegd_ahb_clk.clkr,
   2802	[DSI_S_AHB_CLK] = &dsi_s_ahb_clk.clkr,
   2803	[DSI2_M_AHB_CLK] = &dsi2_m_ahb_clk.clkr,
   2804	[VPE_AHB_CLK] = &vpe_ahb_clk.clkr,
   2805	[SMMU_AHB_CLK] = &smmu_ahb_clk.clkr,
   2806	[HDMI_M_AHB_CLK] = &hdmi_m_ahb_clk.clkr,
   2807	[VFE_AHB_CLK] = &vfe_ahb_clk.clkr,
   2808	[ROT_AHB_CLK] = &rot_ahb_clk.clkr,
   2809	[VCODEC_AHB_CLK] = &vcodec_ahb_clk.clkr,
   2810	[MDP_AHB_CLK] = &mdp_ahb_clk.clkr,
   2811	[DSI_M_AHB_CLK] = &dsi_m_ahb_clk.clkr,
   2812	[CSI_AHB_CLK] = &csi_ahb_clk.clkr,
   2813	[MMSS_IMEM_AHB_CLK] = &mmss_imem_ahb_clk.clkr,
   2814	[IJPEG_AHB_CLK] = &ijpeg_ahb_clk.clkr,
   2815	[HDMI_S_AHB_CLK] = &hdmi_s_ahb_clk.clkr,
   2816	[GFX3D_AHB_CLK] = &gfx3d_ahb_clk.clkr,
   2817	[JPEGD_AXI_CLK] = &jpegd_axi_clk.clkr,
   2818	[GMEM_AXI_CLK] = &gmem_axi_clk.clkr,
   2819	[MDP_AXI_CLK] = &mdp_axi_clk.clkr,
   2820	[MMSS_IMEM_AXI_CLK] = &mmss_imem_axi_clk.clkr,
   2821	[IJPEG_AXI_CLK] = &ijpeg_axi_clk.clkr,
   2822	[GFX3D_AXI_CLK] = &gfx3d_axi_clk.clkr,
   2823	[VCODEC_AXI_CLK] = &vcodec_axi_clk.clkr,
   2824	[VFE_AXI_CLK] = &vfe_axi_clk.clkr,
   2825	[VPE_AXI_CLK] = &vpe_axi_clk.clkr,
   2826	[ROT_AXI_CLK] = &rot_axi_clk.clkr,
   2827	[VCODEC_AXI_A_CLK] = &vcodec_axi_a_clk.clkr,
   2828	[VCODEC_AXI_B_CLK] = &vcodec_axi_b_clk.clkr,
   2829	[CSI0_SRC] = &csi0_src.clkr,
   2830	[CSI0_CLK] = &csi0_clk.clkr,
   2831	[CSI0_PHY_CLK] = &csi0_phy_clk.clkr,
   2832	[CSI1_SRC] = &csi1_src.clkr,
   2833	[CSI1_CLK] = &csi1_clk.clkr,
   2834	[CSI1_PHY_CLK] = &csi1_phy_clk.clkr,
   2835	[CSI2_SRC] = &csi2_src.clkr,
   2836	[CSI2_CLK] = &csi2_clk.clkr,
   2837	[CSI2_PHY_CLK] = &csi2_phy_clk.clkr,
   2838	[DSI_SRC] = &dsi1_src.clkr,
   2839	[DSI_CLK] = &dsi1_clk.clkr,
   2840	[CSI_PIX_CLK] = &csi_pix_clk.clkr,
   2841	[CSI_RDI_CLK] = &csi_rdi_clk.clkr,
   2842	[MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr,
   2843	[HDMI_APP_CLK] = &hdmi_app_clk.clkr,
   2844	[CSI_PIX1_CLK] = &csi_pix1_clk.clkr,
   2845	[CSI_RDI2_CLK] = &csi_rdi2_clk.clkr,
   2846	[CSI_RDI1_CLK] = &csi_rdi1_clk.clkr,
   2847	[GFX3D_SRC] = &gfx3d_src.clkr,
   2848	[GFX3D_CLK] = &gfx3d_clk.clkr,
   2849	[IJPEG_SRC] = &ijpeg_src.clkr,
   2850	[IJPEG_CLK] = &ijpeg_clk.clkr,
   2851	[JPEGD_SRC] = &jpegd_src.clkr,
   2852	[JPEGD_CLK] = &jpegd_clk.clkr,
   2853	[MDP_SRC] = &mdp_src.clkr,
   2854	[MDP_CLK] = &mdp_clk.clkr,
   2855	[MDP_LUT_CLK] = &mdp_lut_clk.clkr,
   2856	[DSI2_PIXEL_SRC] = &dsi2_pixel_src.clkr,
   2857	[DSI2_PIXEL_CLK] = &dsi2_pixel_clk.clkr,
   2858	[DSI2_SRC] = &dsi2_src.clkr,
   2859	[DSI2_CLK] = &dsi2_clk.clkr,
   2860	[DSI1_BYTE_SRC] = &dsi1_byte_src.clkr,
   2861	[DSI1_BYTE_CLK] = &dsi1_byte_clk.clkr,
   2862	[DSI2_BYTE_SRC] = &dsi2_byte_src.clkr,
   2863	[DSI2_BYTE_CLK] = &dsi2_byte_clk.clkr,
   2864	[DSI1_ESC_SRC] = &dsi1_esc_src.clkr,
   2865	[DSI1_ESC_CLK] = &dsi1_esc_clk.clkr,
   2866	[DSI2_ESC_SRC] = &dsi2_esc_src.clkr,
   2867	[DSI2_ESC_CLK] = &dsi2_esc_clk.clkr,
   2868	[ROT_SRC] = &rot_src.clkr,
   2869	[ROT_CLK] = &rot_clk.clkr,
   2870	[TV_DAC_CLK] = &tv_dac_clk.clkr,
   2871	[HDMI_TV_CLK] = &hdmi_tv_clk.clkr,
   2872	[MDP_TV_CLK] = &mdp_tv_clk.clkr,
   2873	[TV_SRC] = &tv_src.clkr,
   2874	[VCODEC_SRC] = &vcodec_src.clkr,
   2875	[VCODEC_CLK] = &vcodec_clk.clkr,
   2876	[VFE_SRC] = &vfe_src.clkr,
   2877	[VFE_CLK] = &vfe_clk.clkr,
   2878	[VFE_CSI_CLK] = &vfe_csi_clk.clkr,
   2879	[VPE_SRC] = &vpe_src.clkr,
   2880	[VPE_CLK] = &vpe_clk.clkr,
   2881	[DSI_PIXEL_SRC] = &dsi1_pixel_src.clkr,
   2882	[DSI_PIXEL_CLK] = &dsi1_pixel_clk.clkr,
   2883	[CAMCLK0_SRC] = &camclk0_src.clkr,
   2884	[CAMCLK0_CLK] = &camclk0_clk.clkr,
   2885	[CAMCLK1_SRC] = &camclk1_src.clkr,
   2886	[CAMCLK1_CLK] = &camclk1_clk.clkr,
   2887	[CAMCLK2_SRC] = &camclk2_src.clkr,
   2888	[CAMCLK2_CLK] = &camclk2_clk.clkr,
   2889	[CSIPHYTIMER_SRC] = &csiphytimer_src.clkr,
   2890	[CSIPHY2_TIMER_CLK] = &csiphy2_timer_clk.clkr,
   2891	[CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr,
   2892	[CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr,
   2893	[PLL2] = &pll2.clkr,
   2894	[RGB_TV_CLK] = &rgb_tv_clk.clkr,
   2895	[NPL_TV_CLK] = &npl_tv_clk.clkr,
   2896	[VCAP_AHB_CLK] = &vcap_ahb_clk.clkr,
   2897	[VCAP_AXI_CLK] = &vcap_axi_clk.clkr,
   2898	[VCAP_SRC] = &vcap_src.clkr,
   2899	[VCAP_CLK] = &vcap_clk.clkr,
   2900	[VCAP_NPL_CLK] = &vcap_npl_clk.clkr,
   2901	[PLL15] = &pll15.clkr,
   2902};
   2903
   2904static const struct qcom_reset_map mmcc_apq8064_resets[] = {
   2905	[GFX3D_AXI_RESET] = { 0x0208, 17 },
   2906	[VCAP_AXI_RESET] = { 0x0208, 16 },
   2907	[VPE_AXI_RESET] = { 0x0208, 15 },
   2908	[IJPEG_AXI_RESET] = { 0x0208, 14 },
   2909	[MPD_AXI_RESET] = { 0x0208, 13 },
   2910	[VFE_AXI_RESET] = { 0x0208, 9 },
   2911	[SP_AXI_RESET] = { 0x0208, 8 },
   2912	[VCODEC_AXI_RESET] = { 0x0208, 7 },
   2913	[ROT_AXI_RESET] = { 0x0208, 6 },
   2914	[VCODEC_AXI_A_RESET] = { 0x0208, 5 },
   2915	[VCODEC_AXI_B_RESET] = { 0x0208, 4 },
   2916	[FAB_S3_AXI_RESET] = { 0x0208, 3 },
   2917	[FAB_S2_AXI_RESET] = { 0x0208, 2 },
   2918	[FAB_S1_AXI_RESET] = { 0x0208, 1 },
   2919	[FAB_S0_AXI_RESET] = { 0x0208 },
   2920	[SMMU_GFX3D_ABH_RESET] = { 0x020c, 31 },
   2921	[SMMU_VPE_AHB_RESET] = { 0x020c, 30 },
   2922	[SMMU_VFE_AHB_RESET] = { 0x020c, 29 },
   2923	[SMMU_ROT_AHB_RESET] = { 0x020c, 28 },
   2924	[SMMU_VCODEC_B_AHB_RESET] = { 0x020c, 27 },
   2925	[SMMU_VCODEC_A_AHB_RESET] = { 0x020c, 26 },
   2926	[SMMU_MDP1_AHB_RESET] = { 0x020c, 25 },
   2927	[SMMU_MDP0_AHB_RESET] = { 0x020c, 24 },
   2928	[SMMU_JPEGD_AHB_RESET] = { 0x020c, 23 },
   2929	[SMMU_IJPEG_AHB_RESET] = { 0x020c, 22 },
   2930	[APU_AHB_RESET] = { 0x020c, 18 },
   2931	[CSI_AHB_RESET] = { 0x020c, 17 },
   2932	[TV_ENC_AHB_RESET] = { 0x020c, 15 },
   2933	[VPE_AHB_RESET] = { 0x020c, 14 },
   2934	[FABRIC_AHB_RESET] = { 0x020c, 13 },
   2935	[GFX3D_AHB_RESET] = { 0x020c, 10 },
   2936	[HDMI_AHB_RESET] = { 0x020c, 9 },
   2937	[MSSS_IMEM_AHB_RESET] = { 0x020c, 8 },
   2938	[IJPEG_AHB_RESET] = { 0x020c, 7 },
   2939	[DSI_M_AHB_RESET] = { 0x020c, 6 },
   2940	[DSI_S_AHB_RESET] = { 0x020c, 5 },
   2941	[JPEGD_AHB_RESET] = { 0x020c, 4 },
   2942	[MDP_AHB_RESET] = { 0x020c, 3 },
   2943	[ROT_AHB_RESET] = { 0x020c, 2 },
   2944	[VCODEC_AHB_RESET] = { 0x020c, 1 },
   2945	[VFE_AHB_RESET] = { 0x020c, 0 },
   2946	[SMMU_VCAP_AHB_RESET] = { 0x0200, 3 },
   2947	[VCAP_AHB_RESET] = { 0x0200, 2 },
   2948	[DSI2_M_AHB_RESET] = { 0x0200, 1 },
   2949	[DSI2_S_AHB_RESET] = { 0x0200, 0 },
   2950	[CSIPHY2_RESET] = { 0x0210, 31 },
   2951	[CSI_PIX1_RESET] = { 0x0210, 30 },
   2952	[CSIPHY0_RESET] = { 0x0210, 29 },
   2953	[CSIPHY1_RESET] = { 0x0210, 28 },
   2954	[CSI_RDI_RESET] = { 0x0210, 27 },
   2955	[CSI_PIX_RESET] = { 0x0210, 26 },
   2956	[DSI2_RESET] = { 0x0210, 25 },
   2957	[VFE_CSI_RESET] = { 0x0210, 24 },
   2958	[MDP_RESET] = { 0x0210, 21 },
   2959	[AMP_RESET] = { 0x0210, 20 },
   2960	[JPEGD_RESET] = { 0x0210, 19 },
   2961	[CSI1_RESET] = { 0x0210, 18 },
   2962	[VPE_RESET] = { 0x0210, 17 },
   2963	[MMSS_FABRIC_RESET] = { 0x0210, 16 },
   2964	[VFE_RESET] = { 0x0210, 15 },
   2965	[GFX3D_RESET] = { 0x0210, 12 },
   2966	[HDMI_RESET] = { 0x0210, 11 },
   2967	[MMSS_IMEM_RESET] = { 0x0210, 10 },
   2968	[IJPEG_RESET] = { 0x0210, 9 },
   2969	[CSI0_RESET] = { 0x0210, 8 },
   2970	[DSI_RESET] = { 0x0210, 7 },
   2971	[VCODEC_RESET] = { 0x0210, 6 },
   2972	[MDP_TV_RESET] = { 0x0210, 4 },
   2973	[MDP_VSYNC_RESET] = { 0x0210, 3 },
   2974	[ROT_RESET] = { 0x0210, 2 },
   2975	[TV_HDMI_RESET] = { 0x0210, 1 },
   2976	[VCAP_NPL_RESET] = { 0x0214, 4 },
   2977	[VCAP_RESET] = { 0x0214, 3 },
   2978	[CSI2_RESET] = { 0x0214, 2 },
   2979	[CSI_RDI1_RESET] = { 0x0214, 1 },
   2980	[CSI_RDI2_RESET] = { 0x0214 },
   2981};
   2982
   2983static const struct regmap_config mmcc_msm8960_regmap_config = {
   2984	.reg_bits	= 32,
   2985	.reg_stride	= 4,
   2986	.val_bits	= 32,
   2987	.max_register	= 0x334,
   2988	.fast_io	= true,
   2989};
   2990
   2991static const struct regmap_config mmcc_apq8064_regmap_config = {
   2992	.reg_bits	= 32,
   2993	.reg_stride	= 4,
   2994	.val_bits	= 32,
   2995	.max_register	= 0x350,
   2996	.fast_io	= true,
   2997};
   2998
   2999static const struct qcom_cc_desc mmcc_msm8960_desc = {
   3000	.config = &mmcc_msm8960_regmap_config,
   3001	.clks = mmcc_msm8960_clks,
   3002	.num_clks = ARRAY_SIZE(mmcc_msm8960_clks),
   3003	.resets = mmcc_msm8960_resets,
   3004	.num_resets = ARRAY_SIZE(mmcc_msm8960_resets),
   3005};
   3006
   3007static const struct qcom_cc_desc mmcc_apq8064_desc = {
   3008	.config = &mmcc_apq8064_regmap_config,
   3009	.clks = mmcc_apq8064_clks,
   3010	.num_clks = ARRAY_SIZE(mmcc_apq8064_clks),
   3011	.resets = mmcc_apq8064_resets,
   3012	.num_resets = ARRAY_SIZE(mmcc_apq8064_resets),
   3013};
   3014
   3015static const struct of_device_id mmcc_msm8960_match_table[] = {
   3016	{ .compatible = "qcom,mmcc-msm8960", .data = &mmcc_msm8960_desc },
   3017	{ .compatible = "qcom,mmcc-apq8064", .data = &mmcc_apq8064_desc },
   3018	{ }
   3019};
   3020MODULE_DEVICE_TABLE(of, mmcc_msm8960_match_table);
   3021
   3022static int mmcc_msm8960_probe(struct platform_device *pdev)
   3023{
   3024	const struct of_device_id *match;
   3025	struct regmap *regmap;
   3026	bool is_8064;
   3027	struct device *dev = &pdev->dev;
   3028
   3029	match = of_match_device(mmcc_msm8960_match_table, dev);
   3030	if (!match)
   3031		return -EINVAL;
   3032
   3033	is_8064 = of_device_is_compatible(dev->of_node, "qcom,mmcc-apq8064");
   3034	if (is_8064) {
   3035		gfx3d_src.freq_tbl = clk_tbl_gfx3d_8064;
   3036		gfx3d_src.clkr.hw.init = &gfx3d_8064_init;
   3037		gfx3d_src.s[0].parent_map = mmcc_pxo_pll8_pll2_pll15_map;
   3038		gfx3d_src.s[1].parent_map = mmcc_pxo_pll8_pll2_pll15_map;
   3039	}
   3040
   3041	regmap = qcom_cc_map(pdev, match->data);
   3042	if (IS_ERR(regmap))
   3043		return PTR_ERR(regmap);
   3044
   3045	clk_pll_configure_sr(&pll15, regmap, &pll15_config, false);
   3046
   3047	return qcom_cc_really_probe(pdev, match->data, regmap);
   3048}
   3049
   3050static struct platform_driver mmcc_msm8960_driver = {
   3051	.probe		= mmcc_msm8960_probe,
   3052	.driver		= {
   3053		.name	= "mmcc-msm8960",
   3054		.of_match_table = mmcc_msm8960_match_table,
   3055	},
   3056};
   3057
   3058module_platform_driver(mmcc_msm8960_driver);
   3059
   3060MODULE_DESCRIPTION("QCOM MMCC MSM8960 Driver");
   3061MODULE_LICENSE("GPL v2");
   3062MODULE_ALIAS("platform:mmcc-msm8960");