0001
0002
0003
0004 #ifndef __QCOM_CLK_RCG_H__
0005 #define __QCOM_CLK_RCG_H__
0006
0007 #include <linux/clk-provider.h>
0008 #include "clk-regmap.h"
0009
0010 #define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) }
0011
0012 struct freq_tbl {
0013 unsigned long freq;
0014 u8 src;
0015 u8 pre_div;
0016 u16 m;
0017 u16 n;
0018 };
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 struct mn {
0031 u8 mnctr_en_bit;
0032 u8 mnctr_reset_bit;
0033 u8 mnctr_mode_shift;
0034 #define MNCTR_MODE_DUAL 0x2
0035 #define MNCTR_MODE_MASK 0x3
0036 u8 n_val_shift;
0037 u8 m_val_shift;
0038 u8 width;
0039 bool reset_in_cc;
0040 };
0041
0042
0043
0044
0045
0046
0047 struct pre_div {
0048 u8 pre_div_shift;
0049 u8 pre_div_width;
0050 };
0051
0052
0053
0054
0055
0056
0057 struct src_sel {
0058 u8 src_sel_shift;
0059 #define SRC_SEL_MASK 0x7
0060 const struct parent_map *parent_map;
0061 };
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075 struct clk_rcg {
0076 u32 ns_reg;
0077 u32 md_reg;
0078
0079 struct mn mn;
0080 struct pre_div p;
0081 struct src_sel s;
0082
0083 const struct freq_tbl *freq_tbl;
0084
0085 struct clk_regmap clkr;
0086 };
0087
0088 extern const struct clk_ops clk_rcg_ops;
0089 extern const struct clk_ops clk_rcg_floor_ops;
0090 extern const struct clk_ops clk_rcg_bypass_ops;
0091 extern const struct clk_ops clk_rcg_bypass2_ops;
0092 extern const struct clk_ops clk_rcg_pixel_ops;
0093 extern const struct clk_ops clk_rcg_esc_ops;
0094 extern const struct clk_ops clk_rcg_lcc_ops;
0095
0096 #define to_clk_rcg(_hw) container_of(to_clk_regmap(_hw), struct clk_rcg, clkr)
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111 struct clk_dyn_rcg {
0112 u32 ns_reg[2];
0113 u32 md_reg[2];
0114 u32 bank_reg;
0115
0116 u8 mux_sel_bit;
0117
0118 struct mn mn[2];
0119 struct pre_div p[2];
0120 struct src_sel s[2];
0121
0122 const struct freq_tbl *freq_tbl;
0123
0124 struct clk_regmap clkr;
0125 };
0126
0127 extern const struct clk_ops clk_dyn_rcg_ops;
0128
0129 #define to_clk_dyn_rcg(_hw) \
0130 container_of(to_clk_regmap(_hw), struct clk_dyn_rcg, clkr)
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145 struct clk_rcg2 {
0146 u32 cmd_rcgr;
0147 u8 mnd_width;
0148 u8 hid_width;
0149 u8 safe_src_index;
0150 const struct parent_map *parent_map;
0151 const struct freq_tbl *freq_tbl;
0152 struct clk_regmap clkr;
0153 u8 cfg_off;
0154 u32 parked_cfg;
0155 };
0156
0157 #define to_clk_rcg2(_hw) container_of(to_clk_regmap(_hw), struct clk_rcg2, clkr)
0158
0159 struct clk_rcg2_gfx3d {
0160 u8 div;
0161 struct clk_rcg2 rcg;
0162 struct clk_hw **hws;
0163 };
0164
0165 #define to_clk_rcg2_gfx3d(_hw) \
0166 container_of(to_clk_rcg2(_hw), struct clk_rcg2_gfx3d, rcg)
0167
0168 extern const struct clk_ops clk_rcg2_ops;
0169 extern const struct clk_ops clk_rcg2_floor_ops;
0170 extern const struct clk_ops clk_edp_pixel_ops;
0171 extern const struct clk_ops clk_byte_ops;
0172 extern const struct clk_ops clk_byte2_ops;
0173 extern const struct clk_ops clk_pixel_ops;
0174 extern const struct clk_ops clk_gfx3d_ops;
0175 extern const struct clk_ops clk_rcg2_shared_ops;
0176 extern const struct clk_ops clk_dp_ops;
0177
0178 struct clk_rcg_dfs_data {
0179 struct clk_rcg2 *rcg;
0180 struct clk_init_data *init;
0181 };
0182
0183 #define DEFINE_RCG_DFS(r) \
0184 { .rcg = &r, .init = &r##_init }
0185
0186 extern int qcom_cc_register_rcg_dfs(struct regmap *regmap,
0187 const struct clk_rcg_dfs_data *rcgs,
0188 size_t len);
0189 #endif