Merge tag 'lsk-android-14.03' 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(data->tsadc_addr[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         u8 tsadc_addr = data->tsadc_addr[attr->index];
144
145         temp = data->ops.read_sensor(tsadc_addr);
146
147         return sprintf(buf, "%d\n", temp);
148 }
149
150 /* Set functions (RW nodes) */
151 static ssize_t set_min(struct device *dev, struct device_attribute *devattr,
152                        const char *buf, size_t count)
153 {
154         unsigned long val;
155         struct rockchip_temp *data = dev_get_drvdata(dev);
156         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
157         int res = kstrtol(buf, 10, &val);
158         if (res < 0)
159                 return res;
160
161         val = clamp_val(val, 0, DEFAULT_MAX_TEMP);
162
163         mutex_lock(&data->lock);
164         data->min[attr->index] = val;
165         threshold_updated(data);
166         mutex_unlock(&data->lock);
167
168         return count;
169 }
170
171 static ssize_t set_max(struct device *dev, struct device_attribute *devattr,
172                        const char *buf, size_t count)
173 {
174         unsigned long val;
175         struct rockchip_temp *data = dev_get_drvdata(dev);
176         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
177         int res = kstrtol(buf, 10, &val);
178         if (res < 0)
179                 return res;
180
181         val = clamp_val(val, 0, DEFAULT_MAX_TEMP);
182
183         mutex_lock(&data->lock);
184         data->max[attr->index] = val;
185         threshold_updated(data);
186         mutex_unlock(&data->lock);
187
188         return count;
189 }
190
191 static ssize_t set_max_hyst(struct device *dev,
192                             struct device_attribute *devattr,
193                             const char *buf, size_t count)
194 {
195         unsigned long val;
196         struct rockchip_temp *data = dev_get_drvdata(dev);
197         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
198         int res = kstrtoul(buf, 10, &val);
199         if (res < 0)
200                 return res;
201
202         val = clamp_val(val, 0, DEFAULT_MAX_TEMP);
203
204         mutex_lock(&data->lock);
205         data->max_hyst[attr->index] = val;
206         threshold_updated(data);
207         mutex_unlock(&data->lock);
208
209         return count;
210 }
211
212 /* Show functions (RO nodes) */
213 static ssize_t show_min(struct device *dev,
214                         struct device_attribute *devattr, char *buf)
215 {
216         struct rockchip_temp *data = dev_get_drvdata(dev);
217         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
218
219         return sprintf(buf, "%ld\n", data->min[attr->index]);
220 }
221
222 static ssize_t show_max(struct device *dev,
223                         struct device_attribute *devattr, char *buf)
224 {
225         struct rockchip_temp *data = dev_get_drvdata(dev);
226         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
227
228         return sprintf(buf, "%ld\n", data->max[attr->index]);
229 }
230
231 static ssize_t show_max_hyst(struct device *dev,
232                              struct device_attribute *devattr, char *buf)
233 {
234         struct rockchip_temp *data = dev_get_drvdata(dev);
235         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
236
237         return sprintf(buf, "%ld\n", data->max_hyst[attr->index]);
238 }
239
240 static ssize_t show_min_alarm(struct device *dev,
241                               struct device_attribute *devattr, char *buf)
242 {
243         struct rockchip_temp *data = dev_get_drvdata(dev);
244         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
245
246         return sprintf(buf, "%d\n", data->min_alarm[attr->index]);
247 }
248
249 static ssize_t show_max_alarm(struct device *dev,
250                               struct device_attribute *devattr, char *buf)
251 {
252         struct rockchip_temp *data = dev_get_drvdata(dev);
253         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
254
255         return sprintf(buf, "%d\n", data->max_alarm[attr->index]);
256 }
257
258 static umode_t rockchip_attrs_visible(struct kobject *kobj,
259                                    struct attribute *attr, int n)
260 {
261         struct device *dev = container_of(kobj, struct device, kobj);
262         struct rockchip_temp *data = dev_get_drvdata(dev);
263
264         if (data->ops.is_visible)
265                 return data->ops.is_visible(attr, n);
266
267         return attr->mode;
268 }
269
270 /* Chip name, required by hwmon */
271 static SENSOR_DEVICE_ATTR(name, S_IRUGO, show_name, NULL, 0);
272
273 /* GPADC - SENSOR0 */
274 static SENSOR_DEVICE_ATTR(temp0_label, S_IRUGO, show_label, NULL, 0);
275 static SENSOR_DEVICE_ATTR(temp0_input, S_IRUGO, show_input, NULL, 0);
276 static SENSOR_DEVICE_ATTR(temp0_min, S_IWUSR | S_IRUGO, show_min, set_min, 0);
277 static SENSOR_DEVICE_ATTR(temp0_max, S_IWUSR | S_IRUGO, show_max, set_max, 0);
278 static SENSOR_DEVICE_ATTR(temp0_max_hyst, S_IWUSR | S_IRUGO,
279                           show_max_hyst, set_max_hyst, 0);
280 static SENSOR_DEVICE_ATTR(temp0_min_alarm, S_IRUGO, show_min_alarm, NULL, 0);
281 static SENSOR_DEVICE_ATTR(temp0_max_alarm, S_IRUGO, show_max_alarm, NULL, 0);
282
283 /* GPADC - SENSOR1 */
284 static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, show_label, NULL, 1);
285 static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_input, NULL, 1);
286 static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_min, set_min, 1);
287 static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_max, set_max, 1);
288 static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO,
289                           show_max_hyst, set_max_hyst, 1);
290 static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO, show_min_alarm, NULL, 1);
291 static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_max_alarm, NULL, 1);
292
293 /* GPADC - SENSOR2 */
294 static SENSOR_DEVICE_ATTR(temp2_label, S_IRUGO, show_label, NULL, 2);
295 static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_input, NULL, 2);
296 static SENSOR_DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_min, set_min, 2);
297 static SENSOR_DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_max, set_max, 2);
298 static SENSOR_DEVICE_ATTR(temp2_max_hyst, S_IWUSR | S_IRUGO,
299                           show_max_hyst, set_max_hyst, 2);
300 static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO, show_min_alarm, NULL, 2);
301 static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, show_max_alarm, NULL, 2);
302
303 /* GPADC - SENSOR3 */
304 static SENSOR_DEVICE_ATTR(temp3_label, S_IRUGO, show_label, NULL, 3);
305 static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_input, NULL, 3);
306 static SENSOR_DEVICE_ATTR(temp3_min, S_IWUSR | S_IRUGO, show_min, set_min, 3);
307 static SENSOR_DEVICE_ATTR(temp3_max, S_IWUSR | S_IRUGO, show_max, set_max, 3);
308 static SENSOR_DEVICE_ATTR(temp3_max_hyst, S_IWUSR | S_IRUGO,
309                           show_max_hyst, set_max_hyst, 3);
310 static SENSOR_DEVICE_ATTR(temp3_min_alarm, S_IRUGO, show_min_alarm, NULL, 3);
311 static SENSOR_DEVICE_ATTR(temp3_max_alarm, S_IRUGO, show_max_alarm, NULL, 3);
312
313
314 struct attribute *rockchip_temp_attributes[] = {
315         &sensor_dev_attr_name.dev_attr.attr,
316
317         &sensor_dev_attr_temp0_label.dev_attr.attr,
318         &sensor_dev_attr_temp0_input.dev_attr.attr,
319         &sensor_dev_attr_temp0_min.dev_attr.attr,
320         &sensor_dev_attr_temp0_max.dev_attr.attr,
321         &sensor_dev_attr_temp0_max_hyst.dev_attr.attr,
322         &sensor_dev_attr_temp0_min_alarm.dev_attr.attr,
323         &sensor_dev_attr_temp0_max_alarm.dev_attr.attr,
324
325         &sensor_dev_attr_temp1_label.dev_attr.attr,
326         &sensor_dev_attr_temp1_input.dev_attr.attr,
327         &sensor_dev_attr_temp1_min.dev_attr.attr,
328         &sensor_dev_attr_temp1_max.dev_attr.attr,
329         &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
330         &sensor_dev_attr_temp1_min_alarm.dev_attr.attr,
331         &sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
332
333         &sensor_dev_attr_temp2_label.dev_attr.attr,
334         &sensor_dev_attr_temp2_input.dev_attr.attr,
335         &sensor_dev_attr_temp2_min.dev_attr.attr,
336         &sensor_dev_attr_temp2_max.dev_attr.attr,
337         &sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
338         &sensor_dev_attr_temp2_min_alarm.dev_attr.attr,
339         &sensor_dev_attr_temp2_max_alarm.dev_attr.attr,
340
341         &sensor_dev_attr_temp3_label.dev_attr.attr,
342         &sensor_dev_attr_temp3_input.dev_attr.attr,
343         &sensor_dev_attr_temp3_min.dev_attr.attr,
344         &sensor_dev_attr_temp3_max.dev_attr.attr,
345         &sensor_dev_attr_temp3_max_hyst.dev_attr.attr,
346         &sensor_dev_attr_temp3_min_alarm.dev_attr.attr,
347         &sensor_dev_attr_temp3_max_alarm.dev_attr.attr,
348
349         
350         NULL
351 };
352
353 static const struct attribute_group rockchip_temp_group = {
354         .attrs = rockchip_temp_attributes,
355         .is_visible = rockchip_attrs_visible,
356 };
357
358 static int rockchip_temp_probe(struct platform_device *pdev)
359 {
360         struct rockchip_temp *data;
361         int err;
362         printk("%s,line=%d\n", __func__,__LINE__);
363
364         data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
365         if (!data)
366                 return -ENOMEM;
367         data->pdev = pdev;
368         mutex_init(&data->lock);
369
370         /* Chip specific initialization */
371         err = rockchip_hwmon_init(data);
372         if (err < 0 || !data->ops.read_sensor || !data->ops.show_name ||
373                         !data->ops.show_label)
374                 return err;
375
376         INIT_DEFERRABLE_WORK(&data->work, tsadc_monitor);
377         platform_set_drvdata(pdev, data);
378
379         err = sysfs_create_group(&pdev->dev.kobj, &rockchip_temp_group);
380         if (err < 0) {
381                 dev_err(&pdev->dev, "Create sysfs group failed (%d)\n", err);
382                 return err;
383         }
384         data->hwmon_dev = hwmon_device_register(&pdev->dev);
385         if (IS_ERR(data->hwmon_dev)) {
386                 err = PTR_ERR(data->hwmon_dev);
387                 dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
388                 goto exit_sysfs_group;
389         }
390         return 0;
391
392 exit_sysfs_group:
393         sysfs_remove_group(&pdev->dev.kobj, &rockchip_temp_group);
394         return err;
395 }
396
397 static int rockchip_temp_remove(struct platform_device *pdev)
398 {
399         struct rockchip_temp *data = platform_get_drvdata(pdev);
400
401         cancel_delayed_work_sync(&data->work);
402         hwmon_device_unregister(data->hwmon_dev);
403         sysfs_remove_group(&pdev->dev.kobj, &rockchip_temp_group);
404
405         return 0;
406 }
407
408 static int rockchip_temp_suspend(struct platform_device *pdev,
409                                pm_message_t state)
410 {
411         struct rockchip_temp *data = platform_get_drvdata(pdev);
412
413         if (data->work_active)
414                 cancel_delayed_work_sync(&data->work);
415
416         return 0;
417 }
418
419 static int rockchip_temp_resume(struct platform_device *pdev)
420 {
421         struct rockchip_temp *data = platform_get_drvdata(pdev);
422
423         if (data->work_active)
424                 schedule_monitor(data);
425
426         return 0;
427 }
428
429 #ifdef CONFIG_OF
430 static const struct of_device_id rockchip_temp_match[] = {
431         { .compatible = "rockchip,tsadc" },
432         {},
433 };
434 #endif
435
436 static struct platform_driver rockchip_temp_driver = {
437         .driver = {
438                 .owner = THIS_MODULE,
439                 .name = "tsadc",
440                 .of_match_table = of_match_ptr(rockchip_temp_match),
441         },
442         .suspend = rockchip_temp_suspend,
443         .resume = rockchip_temp_resume,
444         .probe = rockchip_temp_probe,
445         .remove = rockchip_temp_remove,
446 };
447
448 module_platform_driver(rockchip_temp_driver);
449
450 MODULE_AUTHOR("<rockchip>");
451 MODULE_DESCRIPTION("rockchip temperature driver");
452 MODULE_LICENSE("GPL");
453