|
1 /* |
|
2 * Universal power supply monitor class |
|
3 * |
|
4 * Copyright © 2007 Anton Vorontsov <cbou@mail.ru> |
|
5 * Copyright © 2004 Szabolcs Gyurko |
|
6 * Copyright © 2003 Ian Molton <spyro@f2s.com> |
|
7 * |
|
8 * Modified: 2004, Oct Szabolcs Gyurko |
|
9 * |
|
10 * You may use this code as per GPL version 2 |
|
11 */ |
|
12 |
|
13 #ifndef __LINUX_POWER_SUPPLY_H__ |
|
14 #define __LINUX_POWER_SUPPLY_H__ |
|
15 |
|
16 #include <linux/device.h> |
|
17 #include <linux/workqueue.h> |
|
18 #include <linux/leds.h> |
|
19 |
|
20 /* |
|
21 * All voltages, currents, charges, energies, time and temperatures in uV, |
|
22 * µA, µAh, µWh, seconds and tenths of degree Celsius unless otherwise |
|
23 * stated. It's driver's job to convert its raw values to units in which |
|
24 * this class operates. |
|
25 */ |
|
26 |
|
27 /* |
|
28 * For systems where the charger determines the maximum battery capacity |
|
29 * the min and max fields should be used to present these values to user |
|
30 * space. Unused/unknown fields will not appear in sysfs. |
|
31 */ |
|
32 |
|
33 enum { |
|
34 POWER_SUPPLY_STATUS_UNKNOWN = 0, |
|
35 POWER_SUPPLY_STATUS_CHARGING, |
|
36 POWER_SUPPLY_STATUS_DISCHARGING, |
|
37 POWER_SUPPLY_STATUS_NOT_CHARGING, |
|
38 POWER_SUPPLY_STATUS_FULL, |
|
39 }; |
|
40 |
|
41 enum { |
|
42 POWER_SUPPLY_HEALTH_UNKNOWN = 0, |
|
43 POWER_SUPPLY_HEALTH_GOOD, |
|
44 POWER_SUPPLY_HEALTH_OVERHEAT, |
|
45 POWER_SUPPLY_HEALTH_DEAD, |
|
46 POWER_SUPPLY_HEALTH_OVERVOLTAGE, |
|
47 POWER_SUPPLY_HEALTH_UNSPEC_FAILURE, |
|
48 }; |
|
49 |
|
50 enum { |
|
51 POWER_SUPPLY_TECHNOLOGY_UNKNOWN = 0, |
|
52 POWER_SUPPLY_TECHNOLOGY_NiMH, |
|
53 POWER_SUPPLY_TECHNOLOGY_LION, |
|
54 POWER_SUPPLY_TECHNOLOGY_LIPO, |
|
55 POWER_SUPPLY_TECHNOLOGY_LiFe, |
|
56 POWER_SUPPLY_TECHNOLOGY_NiCd, |
|
57 POWER_SUPPLY_TECHNOLOGY_LiMn, |
|
58 }; |
|
59 |
|
60 enum power_supply_property { |
|
61 /* Properties of type `int' */ |
|
62 POWER_SUPPLY_PROP_STATUS = 0, |
|
63 POWER_SUPPLY_PROP_HEALTH, |
|
64 POWER_SUPPLY_PROP_PRESENT, |
|
65 POWER_SUPPLY_PROP_ONLINE, |
|
66 POWER_SUPPLY_PROP_TECHNOLOGY, |
|
67 POWER_SUPPLY_PROP_VOLTAGE_MAX, |
|
68 POWER_SUPPLY_PROP_VOLTAGE_MIN, |
|
69 POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, |
|
70 POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, |
|
71 POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
72 POWER_SUPPLY_PROP_VOLTAGE_AVG, |
|
73 POWER_SUPPLY_PROP_CURRENT_NOW, |
|
74 POWER_SUPPLY_PROP_CURRENT_AVG, |
|
75 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
|
76 POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN, |
|
77 POWER_SUPPLY_PROP_CHARGE_FULL, |
|
78 POWER_SUPPLY_PROP_CHARGE_EMPTY, |
|
79 POWER_SUPPLY_PROP_CHARGE_NOW, |
|
80 POWER_SUPPLY_PROP_CHARGE_AVG, |
|
81 POWER_SUPPLY_PROP_CHARGE_COUNTER, |
|
82 POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN, |
|
83 POWER_SUPPLY_PROP_ENERGY_EMPTY_DESIGN, |
|
84 POWER_SUPPLY_PROP_ENERGY_FULL, |
|
85 POWER_SUPPLY_PROP_ENERGY_EMPTY, |
|
86 POWER_SUPPLY_PROP_ENERGY_NOW, |
|
87 POWER_SUPPLY_PROP_ENERGY_AVG, |
|
88 POWER_SUPPLY_PROP_CAPACITY, /* in percents! */ |
|
89 POWER_SUPPLY_PROP_TEMP, |
|
90 POWER_SUPPLY_PROP_TEMP_AMBIENT, |
|
91 POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, |
|
92 POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG, |
|
93 POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, |
|
94 POWER_SUPPLY_PROP_TIME_TO_FULL_AVG, |
|
95 /* Properties of type `const char *' */ |
|
96 POWER_SUPPLY_PROP_MODEL_NAME, |
|
97 POWER_SUPPLY_PROP_MANUFACTURER, |
|
98 POWER_SUPPLY_PROP_SERIAL_NUMBER, |
|
99 }; |
|
100 |
|
101 enum power_supply_type { |
|
102 POWER_SUPPLY_TYPE_BATTERY = 0, |
|
103 POWER_SUPPLY_TYPE_UPS, |
|
104 POWER_SUPPLY_TYPE_MAINS, |
|
105 POWER_SUPPLY_TYPE_USB, |
|
106 }; |
|
107 |
|
108 union power_supply_propval { |
|
109 int intval; |
|
110 const char *strval; |
|
111 }; |
|
112 |
|
113 struct power_supply { |
|
114 const char *name; |
|
115 enum power_supply_type type; |
|
116 enum power_supply_property *properties; |
|
117 size_t num_properties; |
|
118 |
|
119 char **supplied_to; |
|
120 size_t num_supplicants; |
|
121 |
|
122 int (*get_property)(struct power_supply *psy, |
|
123 enum power_supply_property psp, |
|
124 union power_supply_propval *val); |
|
125 void (*external_power_changed)(struct power_supply *psy); |
|
126 |
|
127 /* For APM emulation, think legacy userspace. */ |
|
128 int use_for_apm; |
|
129 |
|
130 /* private */ |
|
131 struct device *dev; |
|
132 struct work_struct changed_work; |
|
133 |
|
134 #ifdef CONFIG_LEDS_TRIGGERS |
|
135 struct led_trigger *charging_full_trig; |
|
136 char *charging_full_trig_name; |
|
137 struct led_trigger *charging_trig; |
|
138 char *charging_trig_name; |
|
139 struct led_trigger *full_trig; |
|
140 char *full_trig_name; |
|
141 struct led_trigger *online_trig; |
|
142 char *online_trig_name; |
|
143 #endif |
|
144 }; |
|
145 |
|
146 /* |
|
147 * This is recommended structure to specify static power supply parameters. |
|
148 * Generic one, parametrizable for different power supplies. Power supply |
|
149 * class itself does not use it, but that's what implementing most platform |
|
150 * drivers, should try reuse for consistency. |
|
151 */ |
|
152 |
|
153 struct power_supply_info { |
|
154 const char *name; |
|
155 int technology; |
|
156 int voltage_max_design; |
|
157 int voltage_min_design; |
|
158 int charge_full_design; |
|
159 int charge_empty_design; |
|
160 int energy_full_design; |
|
161 int energy_empty_design; |
|
162 int use_for_apm; |
|
163 }; |
|
164 |
|
165 extern void power_supply_changed(struct power_supply *psy); |
|
166 extern int power_supply_am_i_supplied(struct power_supply *psy); |
|
167 |
|
168 #if defined(CONFIG_POWER_SUPPLY) || defined(CONFIG_POWER_SUPPLY_MODULE) |
|
169 extern int power_supply_is_system_supplied(void); |
|
170 #else |
|
171 static inline int power_supply_is_system_supplied(void) { return -ENOSYS; } |
|
172 #endif |
|
173 |
|
174 extern int power_supply_register(struct device *parent, |
|
175 struct power_supply *psy); |
|
176 extern void power_supply_unregister(struct power_supply *psy); |
|
177 |
|
178 /* For APM emulation, think legacy userspace. */ |
|
179 extern struct class *power_supply_class; |
|
180 |
|
181 #endif /* __LINUX_POWER_SUPPLY_H__ */ |