6d31123f4d6e11889f9376742aba9f36f7c7b502
[linux-2.6.git] / include / linux / edp.h
1 /*
2  * Copyright (c) 2012 NVIDIA CORPORATION.  All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 2 of the License.
7  *
8  * This program is distributed in the hope that it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11  * more details.
12  *
13  * You should have received a copy of the GNU General Public License along
14  * with this program; if not, write to the Free Software Foundation, Inc.,
15  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
16  *
17  */
18
19 #ifndef _LINUX_EDP_H
20 #define _LINUX_EDP_H
21
22 #include <linux/kernel.h>
23 #include <linux/errno.h>
24
25 #define EDP_NAME_LEN    16
26
27 struct edp_manager {
28         const char name[EDP_NAME_LEN];
29         const unsigned int imax;
30
31         /* internal */
32         struct list_head link;
33         struct list_head clients;
34         bool registered;
35 };
36
37 /*
38  * @states: EDP state array holding the IMAX for each state.
39  *      This must be sorted in descending order.
40  * @num_states: length of the above array
41  * @e0_index: index of the E0 state in the above array
42  * Note that each EDP client is tied to a single EDP manager
43  */
44 struct edp_client {
45         const char name[EDP_NAME_LEN];
46         const unsigned int *const states;
47         const unsigned int num_states;
48         const unsigned int e0_index;
49
50         /* internal */
51         struct list_head link;
52         struct edp_manager *manager;
53 };
54
55 #ifdef CONFIG_EDP_FRAMEWORK
56 extern int edp_register_manager(struct edp_manager *mgr);
57 extern int edp_unregister_manager(struct edp_manager *mgr);
58 extern struct edp_manager *edp_get_manager(const char *name);
59
60 extern int edp_register_client(struct edp_manager *mgr,
61                 struct edp_client *client);
62 extern int edp_unregister_client(struct edp_client *client);
63 #else
64 static inline int edp_register_manager(struct edp_manager *mgr)
65 { return -ENODEV; }
66 static inline int edp_unregister_manager(struct edp_manager *mgr)
67 { return -ENODEV; }
68 static inline struct edp_manager *edp_get_manager(const char *name)
69 { return NULL; }
70 static inline int edp_register_client(struct edp_manager *mgr,
71                 struct edp_client *client)
72 { return -ENODEV; }
73 static inline int edp_unregister_client(struct edp_client *client)
74 { return -ENODEV; }
75 #endif
76
77 #endif