97ae21d21b6e6c6af28f4ae1140f51e19a8b54a6
[linux-2.6.git] / drivers / edp / edp.c
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 #include <linux/kernel.h>
20 #include <linux/module.h>
21 #include <linux/string.h>
22 #include <linux/mutex.h>
23 #include <linux/errno.h>
24 #include <linux/edp.h>
25
26 DEFINE_MUTEX(edp_lock);
27 static LIST_HEAD(edp_managers);
28
29 static struct edp_manager *find_manager(const char *name)
30 {
31         struct edp_manager *mgr;
32
33         if (!name)
34                 return NULL;
35
36         list_for_each_entry(mgr, &edp_managers, link)
37                 if (!strcmp(mgr->name, name))
38                         return mgr;
39
40         return NULL;
41 }
42
43 int edp_register_manager(struct edp_manager *mgr)
44 {
45         int r = -EEXIST;
46
47         if (!mgr)
48                 return -EINVAL;
49
50         mutex_lock(&edp_lock);
51         if (!find_manager(mgr->name)) {
52                 list_add_tail(&mgr->link, &edp_managers);
53                 mgr->registered = true;
54                 r = 0;
55         }
56         mutex_unlock(&edp_lock);
57
58         return r;
59 }
60 EXPORT_SYMBOL(edp_register_manager);
61
62 int edp_unregister_manager(struct edp_manager *mgr)
63 {
64         int r = -ENODEV;
65
66         if (!mgr)
67                 return -EINVAL;
68
69         mutex_lock(&edp_lock);
70         if (mgr->registered) {
71                 list_del(&mgr->link);
72                 mgr->registered = false;
73                 r = 0;
74         }
75         mutex_unlock(&edp_lock);
76
77         return r;
78 }
79 EXPORT_SYMBOL(edp_unregister_manager);
80
81 struct edp_manager *edp_get_manager(const char *name)
82 {
83         struct edp_manager *mgr;
84
85         mutex_lock(&edp_lock);
86         mgr = find_manager(name);
87         mutex_unlock(&edp_lock);
88
89         return mgr;
90 }
91 EXPORT_SYMBOL(edp_get_manager);