drivers: power: report battery voltage in AOSP compatible format
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / kernel / power / tuxonice_sysfs.h
1 /*
2 * kernel/power/tuxonice_sysfs.h
3 *
4 * Copyright (C) 2004-2010 Nigel Cunningham (nigel at tuxonice net)
5 *
6 * This file is released under the GPLv2.
7 */
8
9 #include <linux/sysfs.h>
10
11 struct toi_sysfs_data {
12 struct attribute attr;
13 int type;
14 int flags;
15 union {
16 struct {
17 unsigned long *bit_vector;
18 int bit;
19 } bit;
20 struct {
21 int *variable;
22 int minimum;
23 int maximum;
24 } integer;
25 struct {
26 long *variable;
27 long minimum;
28 long maximum;
29 } a_long;
30 struct {
31 unsigned long *variable;
32 unsigned long minimum;
33 unsigned long maximum;
34 } ul;
35 struct {
36 char *variable;
37 int max_length;
38 } string;
39 struct {
40 int (*read_sysfs) (const char *buffer, int count);
41 int (*write_sysfs) (const char *buffer, int count);
42 void *data;
43 } special;
44 } data;
45
46 /* Side effects routine. Used, eg, for reparsing the
47 * resume= entry when it changes */
48 void (*write_side_effect) (void);
49 struct list_head sysfs_data_list;
50 };
51
52 enum {
53 TOI_SYSFS_DATA_NONE = 1,
54 TOI_SYSFS_DATA_CUSTOM,
55 TOI_SYSFS_DATA_BIT,
56 TOI_SYSFS_DATA_INTEGER,
57 TOI_SYSFS_DATA_UL,
58 TOI_SYSFS_DATA_LONG,
59 TOI_SYSFS_DATA_STRING
60 };
61
62 #define SYSFS_WRITEONLY 0200
63 #define SYSFS_READONLY 0444
64 #define SYSFS_RW 0644
65
66 #define SYSFS_BIT(_name, _mode, _ul, _bit, _flags) { \
67 .attr = {.name = _name , .mode = _mode }, \
68 .type = TOI_SYSFS_DATA_BIT, \
69 .flags = _flags, \
70 .data = { .bit = { .bit_vector = _ul, .bit = _bit } } }
71
72 #define SYSFS_INT(_name, _mode, _int, _min, _max, _flags, _wse) { \
73 .attr = {.name = _name , .mode = _mode }, \
74 .type = TOI_SYSFS_DATA_INTEGER, \
75 .flags = _flags, \
76 .data = { .integer = { .variable = _int, .minimum = _min, \
77 .maximum = _max } }, \
78 .write_side_effect = _wse }
79
80 #define SYSFS_UL(_name, _mode, _ul, _min, _max, _flags) { \
81 .attr = {.name = _name , .mode = _mode }, \
82 .type = TOI_SYSFS_DATA_UL, \
83 .flags = _flags, \
84 .data = { .ul = { .variable = _ul, .minimum = _min, \
85 .maximum = _max } } }
86
87 #define SYSFS_LONG(_name, _mode, _long, _min, _max, _flags) { \
88 .attr = {.name = _name , .mode = _mode }, \
89 .type = TOI_SYSFS_DATA_LONG, \
90 .flags = _flags, \
91 .data = { .a_long = { .variable = _long, .minimum = _min, \
92 .maximum = _max } } }
93
94 #define SYSFS_STRING(_name, _mode, _string, _max_len, _flags, _wse) { \
95 .attr = {.name = _name , .mode = _mode }, \
96 .type = TOI_SYSFS_DATA_STRING, \
97 .flags = _flags, \
98 .data = { .string = { .variable = _string, .max_length = _max_len } }, \
99 .write_side_effect = _wse }
100
101 #define SYSFS_CUSTOM(_name, _mode, _read, _write, _flags, _wse) { \
102 .attr = {.name = _name , .mode = _mode }, \
103 .type = TOI_SYSFS_DATA_CUSTOM, \
104 .flags = _flags, \
105 .data = { .special = { .read_sysfs = _read, .write_sysfs = _write } }, \
106 .write_side_effect = _wse }
107
108 #define SYSFS_NONE(_name, _wse) { \
109 .attr = {.name = _name , .mode = SYSFS_WRITEONLY }, \
110 .type = TOI_SYSFS_DATA_NONE, \
111 .write_side_effect = _wse, \
112 }
113
114 /* Flags */
115 #define SYSFS_NEEDS_SM_FOR_READ 1
116 #define SYSFS_NEEDS_SM_FOR_WRITE 2
117 #define SYSFS_HIBERNATE 4
118 #define SYSFS_RESUME 8
119 #define SYSFS_HIBERNATE_OR_RESUME (SYSFS_HIBERNATE | SYSFS_RESUME)
120 #define SYSFS_HIBERNATING (SYSFS_HIBERNATE | SYSFS_NEEDS_SM_FOR_WRITE)
121 #define SYSFS_RESUMING (SYSFS_RESUME | SYSFS_NEEDS_SM_FOR_WRITE)
122 #define SYSFS_NEEDS_SM_FOR_BOTH \
123 (SYSFS_NEEDS_SM_FOR_READ | SYSFS_NEEDS_SM_FOR_WRITE)
124
125 int toi_register_sysfs_file(struct kobject *kobj, struct toi_sysfs_data *toi_sysfs_data);
126 void toi_unregister_sysfs_file(struct kobject *kobj, struct toi_sysfs_data *toi_sysfs_data);
127
128 extern struct kobject *tuxonice_kobj;
129
130 struct kobject *make_toi_sysdir(char *name);
131 void remove_toi_sysdir(struct kobject *obj);
132 extern void toi_cleanup_sysfs(void);
133
134 extern int toi_sysfs_init(void);
135 extern void toi_sysfs_exit(void);