tuxonice_sysfs.h 3.7 KB

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