2 * kernel/power/tuxonice_sysfs.h
4 * Copyright (C) 2004-2010 Nigel Cunningham (nigel at tuxonice net)
6 * This file is released under the GPLv2.
9 #include <linux/sysfs.h>
11 struct toi_sysfs_data
{
12 struct attribute attr
;
17 unsigned long *bit_vector
;
31 unsigned long *variable
;
32 unsigned long minimum
;
33 unsigned long maximum
;
40 int (*read_sysfs
) (const char *buffer
, int count
);
41 int (*write_sysfs
) (const char *buffer
, int count
);
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
;
53 TOI_SYSFS_DATA_NONE
= 1,
54 TOI_SYSFS_DATA_CUSTOM
,
56 TOI_SYSFS_DATA_INTEGER
,
62 #define SYSFS_WRITEONLY 0200
63 #define SYSFS_READONLY 0444
66 #define SYSFS_BIT(_name, _mode, _ul, _bit, _flags) { \
67 .attr = {.name = _name , .mode = _mode }, \
68 .type = TOI_SYSFS_DATA_BIT, \
70 .data = { .bit = { .bit_vector = _ul, .bit = _bit } } }
72 #define SYSFS_INT(_name, _mode, _int, _min, _max, _flags, _wse) { \
73 .attr = {.name = _name , .mode = _mode }, \
74 .type = TOI_SYSFS_DATA_INTEGER, \
76 .data = { .integer = { .variable = _int, .minimum = _min, \
77 .maximum = _max } }, \
78 .write_side_effect = _wse }
80 #define SYSFS_UL(_name, _mode, _ul, _min, _max, _flags) { \
81 .attr = {.name = _name , .mode = _mode }, \
82 .type = TOI_SYSFS_DATA_UL, \
84 .data = { .ul = { .variable = _ul, .minimum = _min, \
87 #define SYSFS_LONG(_name, _mode, _long, _min, _max, _flags) { \
88 .attr = {.name = _name , .mode = _mode }, \
89 .type = TOI_SYSFS_DATA_LONG, \
91 .data = { .a_long = { .variable = _long, .minimum = _min, \
94 #define SYSFS_STRING(_name, _mode, _string, _max_len, _flags, _wse) { \
95 .attr = {.name = _name , .mode = _mode }, \
96 .type = TOI_SYSFS_DATA_STRING, \
98 .data = { .string = { .variable = _string, .max_length = _max_len } }, \
99 .write_side_effect = _wse }
101 #define SYSFS_CUSTOM(_name, _mode, _read, _write, _flags, _wse) { \
102 .attr = {.name = _name , .mode = _mode }, \
103 .type = TOI_SYSFS_DATA_CUSTOM, \
105 .data = { .special = { .read_sysfs = _read, .write_sysfs = _write } }, \
106 .write_side_effect = _wse }
108 #define SYSFS_NONE(_name, _wse) { \
109 .attr = {.name = _name , .mode = SYSFS_WRITEONLY }, \
110 .type = TOI_SYSFS_DATA_NONE, \
111 .write_side_effect = _wse, \
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)
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
);
128 extern struct kobject
*tuxonice_kobj
;
130 struct kobject
*make_toi_sysdir(char *name
);
131 void remove_toi_sysdir(struct kobject
*obj
);
132 extern void toi_cleanup_sysfs(void);
134 extern int toi_sysfs_init(void);
135 extern void toi_sysfs_exit(void);