18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* Copyright (c) 2013, 2018, The Linux Foundation. All rights reserved. */ 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci#ifndef __QCOM_CLK_RCG_H__ 58c2ecf20Sopenharmony_ci#define __QCOM_CLK_RCG_H__ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/clk-provider.h> 88c2ecf20Sopenharmony_ci#include "clk-regmap.h" 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) } 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_cistruct freq_tbl { 138c2ecf20Sopenharmony_ci unsigned long freq; 148c2ecf20Sopenharmony_ci u8 src; 158c2ecf20Sopenharmony_ci u8 pre_div; 168c2ecf20Sopenharmony_ci u16 m; 178c2ecf20Sopenharmony_ci u16 n; 188c2ecf20Sopenharmony_ci}; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci/** 218c2ecf20Sopenharmony_ci * struct mn - M/N:D counter 228c2ecf20Sopenharmony_ci * @mnctr_en_bit: bit to enable mn counter 238c2ecf20Sopenharmony_ci * @mnctr_reset_bit: bit to assert mn counter reset 248c2ecf20Sopenharmony_ci * @mnctr_mode_shift: lowest bit of mn counter mode field 258c2ecf20Sopenharmony_ci * @n_val_shift: lowest bit of n value field 268c2ecf20Sopenharmony_ci * @m_val_shift: lowest bit of m value field 278c2ecf20Sopenharmony_ci * @width: number of bits in m/n/d values 288c2ecf20Sopenharmony_ci * @reset_in_cc: true if the mnctr_reset_bit is in the CC register 298c2ecf20Sopenharmony_ci */ 308c2ecf20Sopenharmony_cistruct mn { 318c2ecf20Sopenharmony_ci u8 mnctr_en_bit; 328c2ecf20Sopenharmony_ci u8 mnctr_reset_bit; 338c2ecf20Sopenharmony_ci u8 mnctr_mode_shift; 348c2ecf20Sopenharmony_ci#define MNCTR_MODE_DUAL 0x2 358c2ecf20Sopenharmony_ci#define MNCTR_MODE_MASK 0x3 368c2ecf20Sopenharmony_ci u8 n_val_shift; 378c2ecf20Sopenharmony_ci u8 m_val_shift; 388c2ecf20Sopenharmony_ci u8 width; 398c2ecf20Sopenharmony_ci bool reset_in_cc; 408c2ecf20Sopenharmony_ci}; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci/** 438c2ecf20Sopenharmony_ci * struct pre_div - pre-divider 448c2ecf20Sopenharmony_ci * @pre_div_shift: lowest bit of pre divider field 458c2ecf20Sopenharmony_ci * @pre_div_width: number of bits in predivider 468c2ecf20Sopenharmony_ci */ 478c2ecf20Sopenharmony_cistruct pre_div { 488c2ecf20Sopenharmony_ci u8 pre_div_shift; 498c2ecf20Sopenharmony_ci u8 pre_div_width; 508c2ecf20Sopenharmony_ci}; 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci/** 538c2ecf20Sopenharmony_ci * struct src_sel - source selector 548c2ecf20Sopenharmony_ci * @src_sel_shift: lowest bit of source selection field 558c2ecf20Sopenharmony_ci * @parent_map: map from software's parent index to hardware's src_sel field 568c2ecf20Sopenharmony_ci */ 578c2ecf20Sopenharmony_cistruct src_sel { 588c2ecf20Sopenharmony_ci u8 src_sel_shift; 598c2ecf20Sopenharmony_ci#define SRC_SEL_MASK 0x7 608c2ecf20Sopenharmony_ci const struct parent_map *parent_map; 618c2ecf20Sopenharmony_ci}; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci/** 648c2ecf20Sopenharmony_ci * struct clk_rcg - root clock generator 658c2ecf20Sopenharmony_ci * 668c2ecf20Sopenharmony_ci * @ns_reg: NS register 678c2ecf20Sopenharmony_ci * @md_reg: MD register 688c2ecf20Sopenharmony_ci * @mn: mn counter 698c2ecf20Sopenharmony_ci * @p: pre divider 708c2ecf20Sopenharmony_ci * @s: source selector 718c2ecf20Sopenharmony_ci * @freq_tbl: frequency table 728c2ecf20Sopenharmony_ci * @clkr: regmap clock handle 738c2ecf20Sopenharmony_ci * @lock: register lock 748c2ecf20Sopenharmony_ci */ 758c2ecf20Sopenharmony_cistruct clk_rcg { 768c2ecf20Sopenharmony_ci u32 ns_reg; 778c2ecf20Sopenharmony_ci u32 md_reg; 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci struct mn mn; 808c2ecf20Sopenharmony_ci struct pre_div p; 818c2ecf20Sopenharmony_ci struct src_sel s; 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci const struct freq_tbl *freq_tbl; 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci struct clk_regmap clkr; 868c2ecf20Sopenharmony_ci}; 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ciextern const struct clk_ops clk_rcg_ops; 898c2ecf20Sopenharmony_ciextern const struct clk_ops clk_rcg_bypass_ops; 908c2ecf20Sopenharmony_ciextern const struct clk_ops clk_rcg_bypass2_ops; 918c2ecf20Sopenharmony_ciextern const struct clk_ops clk_rcg_pixel_ops; 928c2ecf20Sopenharmony_ciextern const struct clk_ops clk_rcg_esc_ops; 938c2ecf20Sopenharmony_ciextern const struct clk_ops clk_rcg_lcc_ops; 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci#define to_clk_rcg(_hw) container_of(to_clk_regmap(_hw), struct clk_rcg, clkr) 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci/** 988c2ecf20Sopenharmony_ci * struct clk_dyn_rcg - root clock generator with glitch free mux 998c2ecf20Sopenharmony_ci * 1008c2ecf20Sopenharmony_ci * @mux_sel_bit: bit to switch glitch free mux 1018c2ecf20Sopenharmony_ci * @ns_reg: NS0 and NS1 register 1028c2ecf20Sopenharmony_ci * @md_reg: MD0 and MD1 register 1038c2ecf20Sopenharmony_ci * @bank_reg: register to XOR @mux_sel_bit into to switch glitch free mux 1048c2ecf20Sopenharmony_ci * @mn: mn counter (banked) 1058c2ecf20Sopenharmony_ci * @s: source selector (banked) 1068c2ecf20Sopenharmony_ci * @freq_tbl: frequency table 1078c2ecf20Sopenharmony_ci * @clkr: regmap clock handle 1088c2ecf20Sopenharmony_ci * @lock: register lock 1098c2ecf20Sopenharmony_ci */ 1108c2ecf20Sopenharmony_cistruct clk_dyn_rcg { 1118c2ecf20Sopenharmony_ci u32 ns_reg[2]; 1128c2ecf20Sopenharmony_ci u32 md_reg[2]; 1138c2ecf20Sopenharmony_ci u32 bank_reg; 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci u8 mux_sel_bit; 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci struct mn mn[2]; 1188c2ecf20Sopenharmony_ci struct pre_div p[2]; 1198c2ecf20Sopenharmony_ci struct src_sel s[2]; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci const struct freq_tbl *freq_tbl; 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci struct clk_regmap clkr; 1248c2ecf20Sopenharmony_ci}; 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ciextern const struct clk_ops clk_dyn_rcg_ops; 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci#define to_clk_dyn_rcg(_hw) \ 1298c2ecf20Sopenharmony_ci container_of(to_clk_regmap(_hw), struct clk_dyn_rcg, clkr) 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci/** 1328c2ecf20Sopenharmony_ci * struct clk_rcg2 - root clock generator 1338c2ecf20Sopenharmony_ci * 1348c2ecf20Sopenharmony_ci * @cmd_rcgr: corresponds to *_CMD_RCGR 1358c2ecf20Sopenharmony_ci * @mnd_width: number of bits in m/n/d values 1368c2ecf20Sopenharmony_ci * @hid_width: number of bits in half integer divider 1378c2ecf20Sopenharmony_ci * @safe_src_index: safe src index value 1388c2ecf20Sopenharmony_ci * @parent_map: map from software's parent index to hardware's src_sel field 1398c2ecf20Sopenharmony_ci * @freq_tbl: frequency table 1408c2ecf20Sopenharmony_ci * @clkr: regmap clock handle 1418c2ecf20Sopenharmony_ci * @cfg_off: defines the cfg register offset from the CMD_RCGR + CFG_REG 1428c2ecf20Sopenharmony_ci */ 1438c2ecf20Sopenharmony_cistruct clk_rcg2 { 1448c2ecf20Sopenharmony_ci u32 cmd_rcgr; 1458c2ecf20Sopenharmony_ci u8 mnd_width; 1468c2ecf20Sopenharmony_ci u8 hid_width; 1478c2ecf20Sopenharmony_ci u8 safe_src_index; 1488c2ecf20Sopenharmony_ci const struct parent_map *parent_map; 1498c2ecf20Sopenharmony_ci const struct freq_tbl *freq_tbl; 1508c2ecf20Sopenharmony_ci struct clk_regmap clkr; 1518c2ecf20Sopenharmony_ci u8 cfg_off; 1528c2ecf20Sopenharmony_ci}; 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci#define to_clk_rcg2(_hw) container_of(to_clk_regmap(_hw), struct clk_rcg2, clkr) 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ciextern const struct clk_ops clk_rcg2_ops; 1578c2ecf20Sopenharmony_ciextern const struct clk_ops clk_rcg2_floor_ops; 1588c2ecf20Sopenharmony_ciextern const struct clk_ops clk_edp_pixel_ops; 1598c2ecf20Sopenharmony_ciextern const struct clk_ops clk_byte_ops; 1608c2ecf20Sopenharmony_ciextern const struct clk_ops clk_byte2_ops; 1618c2ecf20Sopenharmony_ciextern const struct clk_ops clk_pixel_ops; 1628c2ecf20Sopenharmony_ciextern const struct clk_ops clk_gfx3d_ops; 1638c2ecf20Sopenharmony_ciextern const struct clk_ops clk_rcg2_shared_ops; 1648c2ecf20Sopenharmony_ciextern const struct clk_ops clk_dp_ops; 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_cistruct clk_rcg_dfs_data { 1678c2ecf20Sopenharmony_ci struct clk_rcg2 *rcg; 1688c2ecf20Sopenharmony_ci struct clk_init_data *init; 1698c2ecf20Sopenharmony_ci}; 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci#define DEFINE_RCG_DFS(r) \ 1728c2ecf20Sopenharmony_ci { .rcg = &r, .init = &r##_init } 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ciextern int qcom_cc_register_rcg_dfs(struct regmap *regmap, 1758c2ecf20Sopenharmony_ci const struct clk_rcg_dfs_data *rcgs, 1768c2ecf20Sopenharmony_ci size_t len); 1778c2ecf20Sopenharmony_ci#endif 178