a785a2edc53096f2eb06d6146336414e68aeea02
[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  * This software is licensed under the terms of the GNU General Public
9  * License version 2, as published by the Free Software Foundation, and
10  * may be copied, distributed, and modified under those terms.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  */
18
19 #ifndef _TEGRA_DVFS_H_
20 #define _TEGRA_DVFS_H_
21
22 #define MAX_DVFS_FREQS  16
23
24 struct clk;
25 struct dvfs_rail;
26
27 /*
28  * dvfs_relationship between to rails, "from" and "to"
29  * when the rail changes, it will call dvfs_rail_update on the rails
30  * in the relationship_to list.
31  * when determining the voltage to set a rail to, it will consider each
32  * rail in the relationship_from list.
33  */
34 struct dvfs_relationship {
35         struct dvfs_rail *to;
36         struct dvfs_rail *from;
37         int (*solve)(struct dvfs_rail *, struct dvfs_rail *);
38
39         struct list_head to_node; /* node in relationship_to list */
40         struct list_head from_node; /* node in relationship_from list */
41 };
42
43 struct dvfs_rail {
44         const char *reg_id;
45         int min_millivolts;
46         int max_millivolts;
47         int nominal_millivolts;
48         int step;
49         bool disabled;
50
51         struct list_head node;  /* node in dvfs_rail_list */
52         struct list_head dvfs;  /* list head of attached dvfs clocks */
53         struct list_head relationships_to;
54         struct list_head relationships_from;
55         struct regulator *reg;
56         int millivolts;
57         int new_millivolts;
58         bool suspended;
59 };
60
61 struct dvfs {
62         /* Used only by tegra2_clock.c */
63         const char *clk_name;
64         int speedo_id;
65         int process_id;
66
67         /* Must be initialized before tegra_dvfs_init */
68         int freqs_mult;
69         unsigned long freqs[MAX_DVFS_FREQS];
70         const int *millivolts;
71         struct dvfs_rail *dvfs_rail;
72         bool auto_dvfs;
73
74         /* Filled in by tegra_dvfs_init */
75         int max_millivolts;
76         int num_freqs;
77
78         int cur_millivolts;
79         unsigned long cur_rate;
80         struct list_head node;
81         struct list_head debug_node;
82         struct list_head reg_node;
83 };
84
85 void tegra2_init_dvfs(void);
86 int tegra_enable_dvfs_on_clk(struct clk *c, struct dvfs *d);
87 int dvfs_debugfs_init(struct dentry *clk_debugfs_root);
88 int tegra_dvfs_late_init(void);
89 int tegra_dvfs_init_rails(struct dvfs_rail *dvfs_rails[], int n);
90 void tegra_dvfs_add_relationships(struct dvfs_relationship *rels, int n);
91 void tegra_dvfs_rail_enable(struct dvfs_rail *rail);
92 void tegra_dvfs_rail_disable(struct dvfs_rail *rail);
93
94 #endif