import PULS_20180308
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / thermal / mtk_cooler_vrt.c
CommitLineData
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
26static struct thermal_cooling_device *cl_vrt_dev[MAX_NUM_INSTANCE_MTK_COOLER_VRT] = { 0 };
27static unsigned long cl_vrt_state[MAX_NUM_INSTANCE_MTK_COOLER_VRT] = { 0 };
28
29static unsigned int _cl_vrt;
30
31#define MAX_LEN (256)
32
33static 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
53static 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
61static 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
70static 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
80static 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
87static 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
94static 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 */
110static 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
116static 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
132static 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
147static 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
187static void __exit mtk_cooler_vrt_exit(void)
188{
189 mtk_cooler_vrt_dprintk("exit\n");
190
191 mtk_cooler_vrt_unregister_ltf();
192}
193module_init(mtk_cooler_vrt_init);
194module_exit(mtk_cooler_vrt_exit);