Commit | Line | Data |
---|---|---|
6fa3eb70 S |
1 | #ifdef pr_fmt |
2 | #undef pr_fmt | |
3 | #endif | |
4 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | |
5 | ||
6 | #include <linux/version.h> | |
7 | #include <linux/kernel.h> | |
8 | #include <linux/module.h> | |
9 | #include <linux/printk.h> | |
10 | #include <linux/types.h> | |
11 | #include <linux/kobject.h> | |
12 | #include <linux/proc_fs.h> | |
13 | #include <linux/seq_file.h> | |
14 | #include <asm/uaccess.h> | |
15 | #include "mach/mtk_thermal_monitor.h" | |
16 | ||
17 | #define MAX_NUM_INSTANCE_MTK_COOLER_VRT 1 | |
18 | ||
19 | #if 1 | |
20 | #define mtk_cooler_vrt_dprintk(fmt, args...) \ | |
21 | do { pr_debug("thermal/cooler/vrt " fmt, ##args); } while (0) | |
22 | #else | |
23 | #define mtk_cooler_vrt_dprintk(fmt, args...) | |
24 | #endif | |
25 | ||
26 | static struct thermal_cooling_device *cl_vrt_dev[MAX_NUM_INSTANCE_MTK_COOLER_VRT] = { 0 }; | |
27 | static unsigned long cl_vrt_state[MAX_NUM_INSTANCE_MTK_COOLER_VRT] = { 0 }; | |
28 | ||
29 | static unsigned int _cl_vrt; | |
30 | ||
31 | #define MAX_LEN (256) | |
32 | ||
33 | static ssize_t _cl_vrt_write(struct file *filp, const char __user *buf, size_t len, loff_t *data) | |
34 | { | |
35 | int ret = 0; | |
36 | char tmp[MAX_LEN] = { 0 }; | |
37 | ||
4b9e9796 | 38 | len = (len < (MAX_LEN-1)) ? len : (MAX_LEN-1); |
6fa3eb70 S |
39 | /* write data to the buffer */ |
40 | if (copy_from_user(tmp, buf, len)) { | |
41 | return -EFAULT; | |
42 | } | |
43 | ||
44 | ret = kstrtouint(tmp, 10, &_cl_vrt); | |
45 | if (ret) | |
46 | WARN_ON(1); | |
47 | ||
48 | mtk_cooler_vrt_dprintk("%s %s = %d\n", __func__, tmp, _cl_vrt); | |
49 | ||
50 | return len; | |
51 | } | |
52 | ||
53 | static int _cl_vrt_read(struct seq_file *m, void *v) | |
54 | { | |
55 | seq_printf(m, "%d\n", _cl_vrt); | |
56 | mtk_cooler_vrt_dprintk("%s %d\n", __func__, _cl_vrt); | |
57 | ||
58 | return 0; | |
59 | } | |
60 | ||
61 | static int _cl_vrt_open(struct inode *inode, struct file *file) | |
62 | { | |
63 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) | |
64 | return single_open(file, _cl_vrt_read, PDE_DATA(inode)); | |
65 | #else | |
66 | return single_open(file, _cl_vrt_read, PDE(inode)->data); | |
67 | #endif | |
68 | } | |
69 | ||
70 | static const struct file_operations _cl_vrt_fops = { | |
71 | .owner = THIS_MODULE, | |
72 | .open = _cl_vrt_open, | |
73 | .read = seq_read, | |
74 | .llseek = seq_lseek, | |
75 | .write = _cl_vrt_write, | |
76 | .release = single_release, | |
77 | }; | |
78 | ||
79 | ||
80 | static int mtk_cl_vrt_get_max_state(struct thermal_cooling_device *cdev, unsigned long *state) | |
81 | { | |
82 | *state = 1; | |
83 | /* mtk_cooler_vrt_dprintk("mtk_cl_vrt_get_max_state() %s %d\n", cdev->type, *state); */ | |
84 | return 0; | |
85 | } | |
86 | ||
87 | static int mtk_cl_vrt_get_cur_state(struct thermal_cooling_device *cdev, unsigned long *state) | |
88 | { | |
89 | *state = *((unsigned long *)cdev->devdata); | |
90 | /* mtk_cooler_vrt_dprintk("mtk_cl_vrt_get_cur_state() %s %d\n", cdev->type, *state); */ | |
91 | return 0; | |
92 | } | |
93 | ||
94 | static int mtk_cl_vrt_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state) | |
95 | { | |
96 | /* mtk_cooler_vrt_dprintk("mtk_cl_vrt_set_cur_state() %s %d\n", cdev->type, state); */ | |
97 | ||
98 | *((unsigned long *)cdev->devdata) = state; | |
99 | ||
100 | if (1 == state) { | |
101 | _cl_vrt = 1; | |
102 | } else { | |
103 | _cl_vrt = 0; | |
104 | } | |
105 | ||
106 | return 0; | |
107 | } | |
108 | ||
109 | /* bind fan callbacks to fan device */ | |
110 | static struct thermal_cooling_device_ops mtk_cl_vrt_ops = { | |
111 | .get_max_state = mtk_cl_vrt_get_max_state, | |
112 | .get_cur_state = mtk_cl_vrt_get_cur_state, | |
113 | .set_cur_state = mtk_cl_vrt_set_cur_state, | |
114 | }; | |
115 | ||
116 | static int mtk_cooler_vrt_register_ltf(void) | |
117 | { | |
118 | int i; | |
119 | mtk_cooler_vrt_dprintk("register ltf\n"); | |
120 | ||
121 | for (i = MAX_NUM_INSTANCE_MTK_COOLER_VRT; i-- > 0;) { | |
122 | char temp[20] = { 0 }; | |
123 | sprintf(temp, "mtk-cl-vrt%02d", i); | |
124 | cl_vrt_dev[i] = mtk_thermal_cooling_device_register(temp, | |
125 | (void *)&cl_vrt_state[i], | |
126 | &mtk_cl_vrt_ops); | |
127 | } | |
128 | ||
129 | return 0; | |
130 | } | |
131 | ||
132 | static void mtk_cooler_vrt_unregister_ltf(void) | |
133 | { | |
134 | int i; | |
135 | mtk_cooler_vrt_dprintk("unregister ltf\n"); | |
136 | ||
137 | for (i = MAX_NUM_INSTANCE_MTK_COOLER_VRT; i-- > 0;) { | |
138 | if (cl_vrt_dev[i]) { | |
139 | mtk_thermal_cooling_device_unregister(cl_vrt_dev[i]); | |
140 | cl_vrt_dev[i] = NULL; | |
141 | cl_vrt_state[i] = 0; | |
142 | } | |
143 | } | |
144 | } | |
145 | ||
146 | ||
147 | static int __init mtk_cooler_vrt_init(void) | |
148 | { | |
149 | int err = 0; | |
150 | int i; | |
151 | ||
152 | for (i = MAX_NUM_INSTANCE_MTK_COOLER_VRT; i-- > 0;) { | |
153 | cl_vrt_dev[i] = NULL; | |
154 | cl_vrt_state[i] = 0; | |
155 | } | |
156 | ||
157 | mtk_cooler_vrt_dprintk("init\n"); | |
158 | ||
159 | { | |
160 | struct proc_dir_entry *entry; | |
161 | ||
162 | #if 0 | |
163 | entry = create_proc_entry("driver/cl_vrt", S_IRUGO | S_IWUSR, NULL); | |
164 | if (NULL != entry) { | |
165 | entry->read_proc = _cl_vrt_read; | |
166 | entry->write_proc = _cl_vrt_write; | |
167 | } | |
168 | #endif | |
169 | entry = proc_create("driver/cl_vrt", S_IRUGO | S_IWUSR, NULL, &_cl_vrt_fops); | |
170 | if (!entry) { | |
171 | mtk_cooler_vrt_dprintk("%s driver/cl_vrt creation failed\n", __func__); | |
172 | } | |
173 | ||
174 | } | |
175 | ||
176 | err = mtk_cooler_vrt_register_ltf(); | |
177 | if (err) | |
178 | goto err_unreg; | |
179 | ||
180 | return 0; | |
181 | ||
182 | err_unreg: | |
183 | mtk_cooler_vrt_unregister_ltf(); | |
184 | return err; | |
185 | } | |
186 | ||
187 | static void __exit mtk_cooler_vrt_exit(void) | |
188 | { | |
189 | mtk_cooler_vrt_dprintk("exit\n"); | |
190 | ||
191 | mtk_cooler_vrt_unregister_ltf(); | |
192 | } | |
193 | module_init(mtk_cooler_vrt_init); | |
194 | module_exit(mtk_cooler_vrt_exit); |