Merge branch 'develop-3.10-next' of ssh://10.10.10.29/rk/kernel into develop-3.10...
[firefly-linux-kernel-4.4.55.git] / drivers / hwmon / rockchip-hwmon.c
1 /*
2  * Copyright (C) rockchip 2014
3  * Author:zhangqing <zhangqing@rock-chips.com>
4  *        
5  * License Terms: GNU General Public License v2
6  *
7  * rockchip tsadc does not provide auto tsADC, so to monitor the required temperatures,
8  * a periodic work is used. It is more important to not wake up the CPU than
9  * to perform this job, hence the use of a deferred delay.
10  *
11  */
12
13 #include <linux/err.h>
14 #include <linux/hwmon.h>
15 #include <linux/hwmon-sysfs.h>
16 #include <linux/interrupt.h>
17 #include <linux/jiffies.h>
18 #include <linux/module.h>
19 #include <linux/mutex.h>
20 #include <linux/of.h>
21 #include <linux/platform_device.h>
22 #include <linux/pm.h>
23 #include <linux/slab.h>
24 #include <linux/sysfs.h>
25 #include <linux/workqueue.h>
26 #include "hwmon-rockchip.h"
27
28
29 #define DEFAULT_MONITOR_DELAY   HZ
30 #define DEFAULT_MAX_TEMP        130
31
32 static inline void schedule_monitor(struct rockchip_temp *data)
33 {
34         data->work_active = true;
35         schedule_delayed_work(&data->work, DEFAULT_MONITOR_DELAY);
36 }
37
38 static void threshold_updated(struct rockchip_temp *data)
39 {
40         int i;
41         for (i = 0; i < data->monitored_sensors; i++)
42                 if (data->max[i] != 0 || data->min[i] != 0) {
43                         schedule_monitor(data);
44                         return;
45                 }
46
47         dev_dbg(&data->pdev->dev, "No active thresholds.\n");
48         cancel_delayed_work_sync(&data->work);
49         data->work_active = false;
50 }
51
52 static void tsadc_monitor(struct work_struct *work)
53 {
54         int temp,i, ret;
55         char alarm_node[30];
56         bool updated_min_alarm, updated_max_alarm;
57         struct rockchip_temp *data;
58
59         data = container_of(work, struct rockchip_temp, work.work);
60         mutex_lock(&data->lock);
61
62         for (i = 0; i < data->monitored_sensors; i++) {
63                 /* Thresholds are considered inactive if set to 0 */
64                 if (data->max[i] == 0 && data->min[i] == 0)
65                         continue;
66
67                 if (data->max[i] < data->min[i])
68                         continue;
69
70                 temp = data->ops.read_sensor(i);
71                 if (temp == 150) {
72                         dev_err(&data->pdev->dev, "TSADC read failed\n");
73                         continue;
74                 }
75
76                 updated_min_alarm = false;
77                 updated_max_alarm = false;
78
79                 if (data->min[i] != 0) {
80                         if (temp < data->min[i]) {
81                                 if (data->min_alarm[i] == false) {
82                                         data->min_alarm[i] = true;
83                                         updated_min_alarm = true;
84                                 }
85                         } else {
86                                 if (data->min_alarm[i] == true) {
87                                         data->min_alarm[i] = false;
88                                         updated_min_alarm = true;
89                                 }
90                         }
91                 }
92                 if (data->max[i] != 0) {
93                         if (temp > data->max[i]) {
94                                 if (data->max_alarm[i] == false) {
95                                         data->max_alarm[i] = true;
96                                         updated_max_alarm = true;
97                                 }
98                         } else if (temp < data->max[i] - data->max_hyst[i]) {
99                                 if (data->max_alarm[i] == true) {
100                                         data->max_alarm[i] = false;
101                                         updated_max_alarm = true;
102                                 }
103                         }
104                 }
105
106                 if (updated_min_alarm) {
107                         ret = sprintf(alarm_node, "temp%d_min_alarm", i + 1);
108                         sysfs_notify(&data->pdev->dev.kobj, NULL, alarm_node);
109                 }
110                 if (updated_max_alarm) {
111                         ret = sprintf(alarm_node, "temp%d_max_alarm", i + 1);
112                         sysfs_notify(&data->pdev->dev.kobj, NULL, alarm_node);
113                 }
114         }
115
116         schedule_monitor(data);
117         mutex_unlock(&data->lock);
118 }
119
120 /* HWMON sysfs interfaces */
121 static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
122                          char *buf)
123 {
124         struct rockchip_temp *data = dev_get_drvdata(dev);
125         /* Show chip name */
126         return data->ops.show_name(dev, devattr, buf);
127 }
128
129 static ssize_t show_label(struct device *dev,
130                           struct device_attribute *devattr, char *buf)
131 {
132         struct rockchip_temp *data = dev_get_drvdata(dev);
133         /* Show each sensor label */
134         return data->ops.show_label(dev, devattr, buf);
135 }
136
137 static ssize_t show_input(struct device *dev,
138                           struct device_attribute *devattr, char *buf)
139 {
140         int  temp;
141         struct rockchip_temp *data = dev_get_drvdata(dev);
142         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
143
144         temp = data->ops.read_sensor(attr->index);
145
146         return sprintf(buf, "%d\n", temp);
147 }
148
149 /* Set functions (RW nodes) */
150 static ssize_t set_min(struct device *dev, struct device_attribute *devattr,
151                        const char *buf, size_t count)
152 {
153         unsigned long val;
154         struct rockchip_temp *data = dev_get_drvdata(dev);
155         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
156         int res = kstrtol(buf, 10, &val);
157         if (res < 0)
158                 return res;
159
160         val = clamp_val(val, 0, DEFAULT_MAX_TEMP);
161
162         mutex_lock(&data->lock);
163         data->min[attr->index] = val;
164         threshold_updated(data);
165         mutex_unlock(&data->lock);
166
167         return count;
168 }
169
170 static ssize_t set_max(struct device *dev, struct device_attribute *devattr,
171                        const char *buf, size_t count)
172 {
173         unsigned long val;
174         struct rockchip_temp *data = dev_get_drvdata(dev);
175         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
176         int res = kstrtol(buf, 10, &val);
177         if (res < 0)
178                 return res;
179
180         val = clamp_val(val, 0, DEFAULT_MAX_TEMP);
181
182         mutex_lock(&data->lock);
183         data->max[attr->index] = val;
184         threshold_updated(data);
185         mutex_unlock(&data->lock);
186
187         return count;
188 }
189
190 static ssize_t set_max_hyst(struct device *dev,
191                             struct device_attribute *devattr,
192                             const char *buf, size_t count)
193 {
194         unsigned long val;
195         struct rockchip_temp *data = dev_get_drvdata(dev);
196         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
197         int res = kstrtoul(buf, 10, &val);
198         if (res < 0)
199                 return res;
200
201         val = clamp_val(val, 0, DEFAULT_MAX_TEMP);
202
203         mutex_lock(&data->lock);
204         data->max_hyst[attr->index] = val;
205         threshold_updated(data);
206         mutex_unlock(&data->lock);
207
208         return count;
209 }
210
211 /* Show functions (RO nodes) */
212 static ssize_t show_min(struct device *dev,
213                         struct device_attribute *devattr, char *buf)
214 {
215         struct rockchip_temp *data = dev_get_drvdata(dev);
216         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
217
218         return sprintf(buf, "%ld\n", data->min[attr->index]);
219 }
220
221 static ssize_t show_max(struct device *dev,
222                         struct device_attribute *devattr, char *buf)
223 {
224         struct rockchip_temp *data = dev_get_drvdata(dev);
225         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
226
227         return sprintf(buf, "%ld\n", data->max[attr->index]);
228 }
229
230 static ssize_t show_max_hyst(struct device *dev,
231                              struct device_attribute *devattr, char *buf)
232 {
233         struct rockchip_temp *data = dev_get_drvdata(dev);
234         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
235
236         return sprintf(buf, "%ld\n", data->max_hyst[attr->index]);
237 }
238
239 static ssize_t show_min_alarm(struct device *dev,
240                               struct device_attribute *devattr, char *buf)
241 {
242         struct rockchip_temp *data = dev_get_drvdata(dev);
243         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
244
245         return sprintf(buf, "%d\n", data->min_alarm[attr->index]);
246 }
247
248 static ssize_t show_max_alarm(struct device *dev,
249                               struct device_attribute *devattr, char *buf)
250 {
251         struct rockchip_temp *data = dev_get_drvdata(dev);
252         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
253
254         return sprintf(buf, "%d\n", data->max_alarm[attr->index]);
255 }
256
257 static umode_t rockchip_attrs_visible(struct kobject *kobj,
258                                    struct attribute *attr, int n)
259 {
260         struct device *dev = container_of(kobj, struct device, kobj);
261         struct rockchip_temp *data = dev_get_drvdata(dev);
262
263         if (data->ops.is_visible)
264                 return data->ops.is_visible(attr, n);
265
266         return attr->mode;
267 }
268
269 /* Chip name, required by hwmon */
270 static SENSOR_DEVICE_ATTR(name, S_IRUGO, show_name, NULL, 0);
271
272 /* GPADC - SENSOR0 */
273 static SENSOR_DEVICE_ATTR(temp0_label, S_IRUGO, show_label, NULL, 0);
274 static SENSOR_DEVICE_ATTR(temp0_input, S_IRUGO, show_input, NULL, 0);
275 static SENSOR_DEVICE_ATTR(temp0_min, S_IWUSR | S_IRUGO, show_min, set_min, 0);
276 static SENSOR_DEVICE_ATTR(temp0_max, S_IWUSR | S_IRUGO, show_max, set_max, 0);
277 static SENSOR_DEVICE_ATTR(temp0_max_hyst, S_IWUSR | S_IRUGO,
278                           show_max_hyst, set_max_hyst, 0);
279 static SENSOR_DEVICE_ATTR(temp0_min_alarm, S_IRUGO, show_min_alarm, NULL, 0);
280 static SENSOR_DEVICE_ATTR(temp0_max_alarm, S_IRUGO, show_max_alarm, NULL, 0);
281
282 /* GPADC - SENSOR1 */
283 static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, show_label, NULL, 1);
284 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_input, NULL, 1);
285 static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_min, set_min, 1);
286 static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_max, set_max, 1);
287 static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO,
288                           show_max_hyst, set_max_hyst, 1);
289 static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO, show_min_alarm, NULL, 1);
290 static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_max_alarm, NULL, 1);
291
292 /* GPADC - SENSOR2 */
293 static SENSOR_DEVICE_ATTR(temp2_label, S_IRUGO, show_label, NULL, 2);
294 static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_input, NULL, 2);
295 static SENSOR_DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_min, set_min, 2);
296 static SENSOR_DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_max, set_max, 2);
297 static SENSOR_DEVICE_ATTR(temp2_max_hyst, S_IWUSR | S_IRUGO,
298                           show_max_hyst, set_max_hyst, 2);
299 static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO, show_min_alarm, NULL, 2);
300 static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, show_max_alarm, NULL, 2);
301
302 /* GPADC - SENSOR3 */
303 static SENSOR_DEVICE_ATTR(temp3_label, S_IRUGO, show_label, NULL, 3);
304 static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_input, NULL, 3);
305 static SENSOR_DEVICE_ATTR(temp3_min, S_IWUSR | S_IRUGO, show_min, set_min, 3);
306 static SENSOR_DEVICE_ATTR(temp3_max, S_IWUSR | S_IRUGO, show_max, set_max, 3);
307 static SENSOR_DEVICE_ATTR(temp3_max_hyst, S_IWUSR | S_IRUGO,
308                           show_max_hyst, set_max_hyst, 3);
309 static SENSOR_DEVICE_ATTR(temp3_min_alarm, S_IRUGO, show_min_alarm, NULL, 3);
310 static SENSOR_DEVICE_ATTR(temp3_max_alarm, S_IRUGO, show_max_alarm, NULL, 3);
311
312
313 struct attribute *rockchip_temp_attributes[] = {
314         &sensor_dev_attr_name.dev_attr.attr,
315
316         &sensor_dev_attr_temp0_label.dev_attr.attr,
317         &sensor_dev_attr_temp0_input.dev_attr.attr,
318         &sensor_dev_attr_temp0_min.dev_attr.attr,
319         &sensor_dev_attr_temp0_max.dev_attr.attr,
320         &sensor_dev_attr_temp0_max_hyst.dev_attr.attr,
321         &sensor_dev_attr_temp0_min_alarm.dev_attr.attr,
322         &sensor_dev_attr_temp0_max_alarm.dev_attr.attr,
323
324         &sensor_dev_attr_temp1_label.dev_attr.attr,
325         &sensor_dev_attr_temp1_input.dev_attr.attr,
326         &sensor_dev_attr_temp1_min.dev_attr.attr,
327         &sensor_dev_attr_temp1_max.dev_attr.attr,
328         &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
329         &sensor_dev_attr_temp1_min_alarm.dev_attr.attr,
330         &sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
331
332         &sensor_dev_attr_temp2_label.dev_attr.attr,
333         &sensor_dev_attr_temp2_input.dev_attr.attr,
334         &sensor_dev_attr_temp2_min.dev_attr.attr,
335         &sensor_dev_attr_temp2_max.dev_attr.attr,
336         &sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
337         &sensor_dev_attr_temp2_min_alarm.dev_attr.attr,
338         &sensor_dev_attr_temp2_max_alarm.dev_attr.attr,
339
340         &sensor_dev_attr_temp3_label.dev_attr.attr,
341         &sensor_dev_attr_temp3_input.dev_attr.attr,
342         &sensor_dev_attr_temp3_min.dev_attr.attr,
343         &sensor_dev_attr_temp3_max.dev_attr.attr,
344         &sensor_dev_attr_temp3_max_hyst.dev_attr.attr,
345         &sensor_dev_attr_temp3_min_alarm.dev_attr.attr,
346         &sensor_dev_attr_temp3_max_alarm.dev_attr.attr,
347
348         
349         NULL
350 };
351
352 static const struct attribute_group rockchip_temp_group = {
353         .attrs = rockchip_temp_attributes,
354         .is_visible = rockchip_attrs_visible,
355 };
356
357 static int rockchip_temp_probe(struct platform_device *pdev)
358 {
359         struct rockchip_temp *data;
360         int err;
361         printk("%s,line=%d\n", __func__,__LINE__);
362
363         data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
364         if (!data)
365                 return -ENOMEM;
366         data->pdev = pdev;
367         mutex_init(&data->lock);
368
369         /* Chip specific initialization */
370         err = rockchip_hwmon_init(data);
371         if (err < 0 || !data->ops.read_sensor || !data->ops.show_name ||
372                         !data->ops.show_label)
373                 return err;
374
375         INIT_DEFERRABLE_WORK(&data->work, tsadc_monitor);
376         platform_set_drvdata(pdev, data);
377
378         err = sysfs_create_group(&pdev->dev.kobj, &rockchip_temp_group);
379         if (err < 0) {
380                 dev_err(&pdev->dev, "Create sysfs group failed (%d)\n", err);
381                 return err;
382         }
383         data->hwmon_dev = hwmon_device_register(&pdev->dev);
384         if (IS_ERR(data->hwmon_dev)) {
385                 err = PTR_ERR(data->hwmon_dev);
386                 dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
387                 goto exit_sysfs_group;
388         }
389         return 0;
390
391 exit_sysfs_group:
392         sysfs_remove_group(&pdev->dev.kobj, &rockchip_temp_group);
393         return err;
394 }
395
396 static int rockchip_temp_remove(struct platform_device *pdev)
397 {
398         struct rockchip_temp *data = platform_get_drvdata(pdev);
399
400         cancel_delayed_work_sync(&data->work);
401         hwmon_device_unregister(data->hwmon_dev);
402         sysfs_remove_group(&pdev->dev.kobj, &rockchip_temp_group);
403
404         return 0;
405 }
406
407 static int rockchip_temp_suspend(struct platform_device *pdev,
408                                pm_message_t state)
409 {
410         struct rockchip_temp *data = platform_get_drvdata(pdev);
411
412         if (data->work_active)
413                 cancel_delayed_work_sync(&data->work);
414
415         return 0;
416 }
417
418 static int rockchip_temp_resume(struct platform_device *pdev)
419 {
420         struct rockchip_temp *data = platform_get_drvdata(pdev);
421
422         if (data->work_active)
423                 schedule_monitor(data);
424
425         return 0;
426 }
427
428 #ifdef CONFIG_OF
429 static const struct of_device_id rockchip_temp_match[] = {
430         { .compatible = "rockchip,tsadc" },
431         {},
432 };
433 #endif
434
435 static struct platform_driver rockchip_temp_driver = {
436         .driver = {
437                 .owner = THIS_MODULE,
438                 .name = "tsadc",
439                 .of_match_table = of_match_ptr(rockchip_temp_match),
440         },
441         .suspend = rockchip_temp_suspend,
442         .resume = rockchip_temp_resume,
443         .probe = rockchip_temp_probe,
444         .remove = rockchip_temp_remove,
445 };
446
447 module_platform_driver(rockchip_temp_driver);
448
449 MODULE_AUTHOR("<rockchip>");
450 MODULE_DESCRIPTION("rockchip temperature driver");
451 MODULE_LICENSE("GPL");
452