5aae43570d28ba05943b94a973f716911456b29a
[linux-2.6.git] / arch / arm / mach-tegra / dvfs.h
1 /*
2  *
3  * Copyright (C) 2010 Google, Inc.
4  *
5  * Author:
6  *      Colin Cross <ccross@google.com>
7  *
8  * Copyright (C) 2010-2012 NVIDIA CORPORATION. All rights reserved.
9  *
10  * This software is licensed under the terms of the GNU General Public
11  * License version 2, as published by the Free Software Foundation, and
12  * may be copied, distributed, and modified under those terms.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  */
20
21 #ifndef _TEGRA_DVFS_H_
22 #define _TEGRA_DVFS_H_
23
24 #define MAX_DVFS_FREQS  40
25 #define DVFS_RAIL_STATS_TOP_BIN 40
26
27 struct clk;
28 struct dvfs_rail;
29
30 /*
31  * dvfs_relationship between to rails, "from" and "to"
32  * when the rail changes, it will call dvfs_rail_update on the rails
33  * in the relationship_to list.
34  * when determining the voltage to set a rail to, it will consider each
35  * rail in the relationship_from list.
36  */
37 struct dvfs_relationship {
38         struct dvfs_rail *to;
39         struct dvfs_rail *from;
40         int (*solve)(struct dvfs_rail *, struct dvfs_rail *);
41
42         struct list_head to_node; /* node in relationship_to list */
43         struct list_head from_node; /* node in relationship_from list */
44         bool solved_at_nominal;
45 };
46
47 struct rail_stats {
48         ktime_t time_at_mv[DVFS_RAIL_STATS_TOP_BIN + 1];
49         ktime_t last_update;
50         int last_index;
51         bool off;
52 };
53
54 struct dvfs_rail {
55         const char *reg_id;
56         int min_millivolts;
57         int max_millivolts;
58         int nominal_millivolts;
59         int step;
60         bool jmp_to_zero;
61         bool disabled;
62         bool updating;
63         bool resolving_to;
64
65         struct list_head node;  /* node in dvfs_rail_list */
66         struct list_head dvfs;  /* list head of attached dvfs clocks */
67         struct list_head relationships_to;
68         struct list_head relationships_from;
69         struct regulator *reg;
70         int millivolts;
71         int new_millivolts;
72         bool suspended;
73         bool auto_control;
74         struct rail_stats stats;
75 };
76
77 struct dvfs {
78         /* Used only by tegra2_clock.c */
79         const char *clk_name;
80         int speedo_id;
81         int process_id;
82
83         /* Must be initialized before tegra_dvfs_init */
84         int freqs_mult;
85         unsigned long freqs[MAX_DVFS_FREQS];
86         unsigned long *alt_freqs;
87         const int *millivolts;
88         struct dvfs_rail *dvfs_rail;
89         bool auto_dvfs;
90
91         /* Filled in by tegra_dvfs_init */
92         int max_millivolts;
93         int num_freqs;
94
95         int cur_millivolts;
96         unsigned long cur_rate;
97         struct list_head node;
98         struct list_head debug_node;
99         struct list_head reg_node;
100 };
101
102 extern struct dvfs_rail *tegra_cpu_rail;
103
104 void tegra2_init_dvfs(void);
105 void tegra3_init_dvfs(void);
106 void tegra11x_init_dvfs(void);
107 int tegra_enable_dvfs_on_clk(struct clk *c, struct dvfs *d);
108 int dvfs_debugfs_init(struct dentry *clk_debugfs_root);
109 int tegra_dvfs_late_init(void);
110 int tegra_dvfs_init_rails(struct dvfs_rail *dvfs_rails[], int n);
111 void tegra_dvfs_add_relationships(struct dvfs_relationship *rels, int n);
112 void tegra_dvfs_rail_enable(struct dvfs_rail *rail);
113 void tegra_dvfs_rail_disable(struct dvfs_rail *rail);
114 bool tegra_dvfs_rail_updating(struct clk *clk);
115 void tegra_dvfs_rail_off(struct dvfs_rail *rail, ktime_t now);
116 void tegra_dvfs_rail_on(struct dvfs_rail *rail, ktime_t now);
117 void tegra_dvfs_rail_pause(struct dvfs_rail *rail, ktime_t delta, bool on);
118 struct dvfs_rail *tegra_dvfs_get_rail_by_name(const char *reg_id);
119 int tegra_dvfs_predict_millivolts(struct clk *c, unsigned long rate);
120 void tegra_dvfs_core_cap_enable(bool enable);
121 void tegra_dvfs_core_cap_level_set(int level);
122 int tegra_dvfs_alt_freqs_set(struct dvfs *d, unsigned long *alt_freqs);
123 int tegra_cpu_dvfs_alter(int edp_thermal_index, const cpumask_t *cpus,
124                          bool before_clk_update, int cpu_event);
125
126 #ifndef CONFIG_ARCH_TEGRA_2x_SOC
127 int tegra_dvfs_rail_disable_prepare(struct dvfs_rail *rail);
128 int tegra_dvfs_rail_post_enable(struct dvfs_rail *rail);
129 #else
130 static inline int tegra_dvfs_rail_disable_prepare(struct dvfs_rail *rail)
131 { return 0; }
132 static inline int tegra_dvfs_rail_post_enable(struct dvfs_rail *rail)
133 { return 0; }
134 #endif
135
136 #endif