ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / tegra_cl_dvfs.h
1 /*
2  * arch/arm/mach-tegra/tegra_cl_dvfs.h
3  *
4  * Copyright (C) 2012 NVIDIA Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #ifndef _TEGRA_CL_DVFS_H_
20 #define _TEGRA_CL_DVFS_H_
21
22 struct tegra_cl_dvfs;
23
24 #define MAX_CL_DVFS_VOLTAGES            33
25
26 enum tegra_cl_dvfs_force_mode {
27         TEGRA_CL_DVFS_FORCE_NONE = 0,
28         TEGRA_CL_DVFS_FORCE_FIXED = 1,
29         TEGRA_CL_DVFS_FORCE_AUTO = 2,
30 };
31
32 enum tegra_cl_dvfs_pmu_if {
33         TEGRA_CL_DVFS_PMU_I2C,
34         TEGRA_CL_DVFS_PMU_PWM,
35 };
36
37 enum tegra_cl_dvfs_pwm_bus {
38         TEGRA_CL_DVFS_PWM_1WIRE_BUFFER,
39         TEGRA_CL_DVFS_PWM_1WIRE_DIRECT,
40         TEGRA_CL_DVFS_PWM_2WIRE,
41 };
42
43 /* CL DVFS plaform flags*/
44 /* set if output to PMU can be disabled only between I2C transactions */
45 #define TEGRA_CL_DVFS_FLAGS_I2C_WAIT_QUIET      (0x1UL << 0)
46 /* dynamic output registers update is supported */
47 #define TEGRA_CL_DVFS_DYN_OUTPUT_CFG            (0x1UL << 1)
48 /* monitor data new synchronization can not be used */
49 #define TEGRA_CL_DVFS_DATA_NEW_NO_USE           (0x1UL << 2)
50
51 struct tegra_cl_dvfs_cfg_param {
52         unsigned long   sample_rate;
53
54         enum tegra_cl_dvfs_force_mode force_mode;
55         u8              cf;
56         u8              ci;
57         s8              cg;
58         bool            cg_scale;
59
60         u8              droop_cut_value;
61         u8              droop_restore_ramp;
62         u8              scale_out_ramp;
63 };
64
65 struct voltage_reg_map {
66         u8              reg_value;
67         int             reg_uV;
68 };
69
70 struct tegra_cl_dvfs_platform_data {
71         const char *dfll_clk_name;
72         u32 flags;
73
74         enum tegra_cl_dvfs_pmu_if pmu_if;
75         union {
76                 struct {
77                         unsigned long           fs_rate;
78                         unsigned long           hs_rate; /* if 0 - no hs mode */
79                         u8                      hs_master_code;
80                         u8                      reg;
81                         u16                     slave_addr;
82                         bool                    addr_10;
83                 } pmu_i2c;
84                 struct {
85                         unsigned long           pwm_rate;
86                         bool                    delta_mode;
87
88                         enum tegra_cl_dvfs_pwm_bus pwm_bus;
89                         int                     pwm_pingroup;
90                         int                     pwm_clk_pingroup;
91                         int                     out_gpio;
92                         bool                    out_enable_high;
93                         struct platform_device  *dfll_bypass_dev;
94                 } pmu_pwm;
95         } u;
96
97         struct voltage_reg_map  *vdd_map;
98         int                     vdd_map_size;
99         int                     pmu_undershoot_gb;
100
101         struct tegra_cl_dvfs_cfg_param          *cfg_param;
102 };
103
104 #ifdef CONFIG_ARCH_TEGRA_HAS_CL_DVFS
105 int tegra_init_cl_dvfs(void);
106 int tegra_cl_dvfs_debug_init(struct clk *dfll_clk);
107 void tegra_cl_dvfs_resume(struct tegra_cl_dvfs *cld);
108
109 void tegra_cl_dvfs_disable(struct tegra_cl_dvfs *cld);
110 int tegra_cl_dvfs_enable(struct tegra_cl_dvfs *cld);
111 int tegra_cl_dvfs_lock(struct tegra_cl_dvfs *cld);
112 int tegra_cl_dvfs_unlock(struct tegra_cl_dvfs *cld);
113 int tegra_cl_dvfs_request_rate(struct tegra_cl_dvfs *cld, unsigned long rate);
114 unsigned long tegra_cl_dvfs_request_get(struct tegra_cl_dvfs *cld);
115 #else
116 static inline int tegra_init_cl_dvfs(void)
117 { return -ENOSYS; }
118 static inline int tegra_cl_dvfs_debug_init(struct clk *dfll_clk)
119 { return -ENOSYS; }
120 static inline void tegra_cl_dvfs_resume(struct tegra_cl_dvfs *cld)
121 {}
122
123 static inline void tegra_cl_dvfs_disable(struct tegra_cl_dvfs *cld)
124 {}
125 static inline int tegra_cl_dvfs_enable(struct tegra_cl_dvfs *cld)
126 { return -ENOSYS; }
127 static inline int tegra_cl_dvfs_lock(struct tegra_cl_dvfs *cld)
128 { return -ENOSYS; }
129 static inline int tegra_cl_dvfs_unlock(struct tegra_cl_dvfs *cld)
130 { return -ENOSYS; }
131 static inline int tegra_cl_dvfs_request_rate(
132         struct tegra_cl_dvfs *cld, unsigned long rate)
133 { return -ENOSYS; }
134 static inline unsigned long tegra_cl_dvfs_request_get(struct tegra_cl_dvfs *cld)
135 { return 0; }
136 #endif
137
138 #endif