diff options
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/sbs.c | 565 |
1 files changed, 287 insertions, 278 deletions
diff --git a/drivers/acpi/sbs.c b/drivers/acpi/sbs.c index 59640d9a0acc..eab5c680a6ac 100644 --- a/drivers/acpi/sbs.c +++ b/drivers/acpi/sbs.c | |||
@@ -30,30 +30,9 @@ | |||
30 | #include <linux/seq_file.h> | 30 | #include <linux/seq_file.h> |
31 | #include <asm/uaccess.h> | 31 | #include <asm/uaccess.h> |
32 | #include <linux/acpi.h> | 32 | #include <linux/acpi.h> |
33 | #include <linux/i2c.h> | 33 | #include <linux/timer.h> |
34 | #include <linux/delay.h> | 34 | #include <linux/delay.h> |
35 | 35 | ||
36 | #include "i2c_ec.h" | ||
37 | |||
38 | #define DEF_CAPACITY_UNIT 3 | ||
39 | #define MAH_CAPACITY_UNIT 1 | ||
40 | #define MWH_CAPACITY_UNIT 2 | ||
41 | #define CAPACITY_UNIT DEF_CAPACITY_UNIT | ||
42 | |||
43 | #define REQUEST_UPDATE_MODE 1 | ||
44 | #define QUEUE_UPDATE_MODE 2 | ||
45 | |||
46 | #define DATA_TYPE_COMMON 0 | ||
47 | #define DATA_TYPE_INFO 1 | ||
48 | #define DATA_TYPE_STATE 2 | ||
49 | #define DATA_TYPE_ALARM 3 | ||
50 | #define DATA_TYPE_AC_STATE 4 | ||
51 | |||
52 | extern struct proc_dir_entry *acpi_lock_ac_dir(void); | ||
53 | extern struct proc_dir_entry *acpi_lock_battery_dir(void); | ||
54 | extern void acpi_unlock_ac_dir(struct proc_dir_entry *acpi_ac_dir); | ||
55 | extern void acpi_unlock_battery_dir(struct proc_dir_entry *acpi_battery_dir); | ||
56 | |||
57 | #define ACPI_SBS_COMPONENT 0x00080000 | 36 | #define ACPI_SBS_COMPONENT 0x00080000 |
58 | #define ACPI_SBS_CLASS "sbs" | 37 | #define ACPI_SBS_CLASS "sbs" |
59 | #define ACPI_AC_CLASS "ac_adapter" | 38 | #define ACPI_AC_CLASS "ac_adapter" |
@@ -74,15 +53,62 @@ extern void acpi_unlock_battery_dir(struct proc_dir_entry *acpi_battery_dir); | |||
74 | 53 | ||
75 | #define _COMPONENT ACPI_SBS_COMPONENT | 54 | #define _COMPONENT ACPI_SBS_COMPONENT |
76 | 55 | ||
77 | #define MAX_SBS_BAT 4 | ||
78 | #define MAX_SMBUS_ERR 1 | ||
79 | |||
80 | ACPI_MODULE_NAME("sbs"); | 56 | ACPI_MODULE_NAME("sbs"); |
81 | 57 | ||
82 | MODULE_AUTHOR("Rich Townsend"); | 58 | MODULE_AUTHOR("Rich Townsend"); |
83 | MODULE_DESCRIPTION("Smart Battery System ACPI interface driver"); | 59 | MODULE_DESCRIPTION("Smart Battery System ACPI interface driver"); |
84 | MODULE_LICENSE("GPL"); | 60 | MODULE_LICENSE("GPL"); |
85 | 61 | ||
62 | #define xmsleep(t) msleep(t) | ||
63 | |||
64 | #define ACPI_EC_SMB_PRTCL 0x00 /* protocol, PEC */ | ||
65 | |||
66 | #define ACPI_EC_SMB_STS 0x01 /* status */ | ||
67 | #define ACPI_EC_SMB_ADDR 0x02 /* address */ | ||
68 | #define ACPI_EC_SMB_CMD 0x03 /* command */ | ||
69 | #define ACPI_EC_SMB_DATA 0x04 /* 32 data registers */ | ||
70 | #define ACPI_EC_SMB_BCNT 0x24 /* number of data bytes */ | ||
71 | |||
72 | #define ACPI_EC_SMB_STS_DONE 0x80 | ||
73 | #define ACPI_EC_SMB_STS_STATUS 0x1f | ||
74 | |||
75 | #define ACPI_EC_SMB_PRTCL_WRITE 0x00 | ||
76 | #define ACPI_EC_SMB_PRTCL_READ 0x01 | ||
77 | #define ACPI_EC_SMB_PRTCL_WORD_DATA 0x08 | ||
78 | #define ACPI_EC_SMB_PRTCL_BLOCK_DATA 0x0a | ||
79 | |||
80 | #define ACPI_EC_SMB_TRANSACTION_SLEEP 1 | ||
81 | #define ACPI_EC_SMB_ACCESS_SLEEP1 1 | ||
82 | #define ACPI_EC_SMB_ACCESS_SLEEP2 10 | ||
83 | |||
84 | #define DEF_CAPACITY_UNIT 3 | ||
85 | #define MAH_CAPACITY_UNIT 1 | ||
86 | #define MWH_CAPACITY_UNIT 2 | ||
87 | #define CAPACITY_UNIT DEF_CAPACITY_UNIT | ||
88 | |||
89 | #define REQUEST_UPDATE_MODE 1 | ||
90 | #define QUEUE_UPDATE_MODE 2 | ||
91 | |||
92 | #define DATA_TYPE_COMMON 0 | ||
93 | #define DATA_TYPE_INFO 1 | ||
94 | #define DATA_TYPE_STATE 2 | ||
95 | #define DATA_TYPE_ALARM 3 | ||
96 | #define DATA_TYPE_AC_STATE 4 | ||
97 | |||
98 | extern struct proc_dir_entry *acpi_lock_ac_dir(void); | ||
99 | extern struct proc_dir_entry *acpi_lock_battery_dir(void); | ||
100 | extern void acpi_unlock_ac_dir(struct proc_dir_entry *acpi_ac_dir); | ||
101 | extern void acpi_unlock_battery_dir(struct proc_dir_entry *acpi_battery_dir); | ||
102 | |||
103 | #define MAX_SBS_BAT 4 | ||
104 | #define ACPI_SBS_BLOCK_MAX 32 | ||
105 | |||
106 | #define ACPI_SBS_SMBUS_READ 1 | ||
107 | #define ACPI_SBS_SMBUS_WRITE 2 | ||
108 | |||
109 | #define ACPI_SBS_WORD_DATA 1 | ||
110 | #define ACPI_SBS_BLOCK_DATA 2 | ||
111 | |||
86 | static struct semaphore sbs_sem; | 112 | static struct semaphore sbs_sem; |
87 | 113 | ||
88 | #define UPDATE_MODE QUEUE_UPDATE_MODE | 114 | #define UPDATE_MODE QUEUE_UPDATE_MODE |
@@ -105,7 +131,6 @@ module_param(update_time2, int, 0); | |||
105 | 131 | ||
106 | static int acpi_sbs_add(struct acpi_device *device); | 132 | static int acpi_sbs_add(struct acpi_device *device); |
107 | static int acpi_sbs_remove(struct acpi_device *device, int type); | 133 | static int acpi_sbs_remove(struct acpi_device *device, int type); |
108 | static void acpi_battery_smbus_err_handler(struct acpi_ec_smbus *smbus); | ||
109 | static void acpi_sbs_update_queue(void *data); | 134 | static void acpi_sbs_update_queue(void *data); |
110 | 135 | ||
111 | static struct acpi_driver acpi_sbs_driver = { | 136 | static struct acpi_driver acpi_sbs_driver = { |
@@ -126,9 +151,9 @@ struct acpi_battery_info { | |||
126 | int vscale; | 151 | int vscale; |
127 | int ipscale; | 152 | int ipscale; |
128 | s16 serial_number; | 153 | s16 serial_number; |
129 | char manufacturer_name[I2C_SMBUS_BLOCK_MAX + 3]; | 154 | char manufacturer_name[ACPI_SBS_BLOCK_MAX + 3]; |
130 | char device_name[I2C_SMBUS_BLOCK_MAX + 3]; | 155 | char device_name[ACPI_SBS_BLOCK_MAX + 3]; |
131 | char device_chemistry[I2C_SMBUS_BLOCK_MAX + 3]; | 156 | char device_chemistry[ACPI_SBS_BLOCK_MAX + 3]; |
132 | }; | 157 | }; |
133 | 158 | ||
134 | struct acpi_battery_state { | 159 | struct acpi_battery_state { |
@@ -158,8 +183,8 @@ struct acpi_battery { | |||
158 | 183 | ||
159 | struct acpi_sbs { | 184 | struct acpi_sbs { |
160 | acpi_handle handle; | 185 | acpi_handle handle; |
186 | int base; | ||
161 | struct acpi_device *device; | 187 | struct acpi_device *device; |
162 | struct acpi_ec_smbus *smbus; | ||
163 | int sbsm_present; | 188 | int sbsm_present; |
164 | int sbsm_batteries_supported; | 189 | int sbsm_batteries_supported; |
165 | int ac_present; | 190 | int ac_present; |
@@ -172,6 +197,14 @@ struct acpi_sbs { | |||
172 | struct timer_list update_timer; | 197 | struct timer_list update_timer; |
173 | }; | 198 | }; |
174 | 199 | ||
200 | union sbs_rw_data { | ||
201 | u16 word; | ||
202 | u8 block[ACPI_SBS_BLOCK_MAX + 2]; | ||
203 | }; | ||
204 | |||
205 | static int acpi_ec_sbs_access(struct acpi_sbs *sbs, u16 addr, | ||
206 | char read_write, u8 command, int size, | ||
207 | union sbs_rw_data *data); | ||
175 | static void acpi_update_delay(struct acpi_sbs *sbs); | 208 | static void acpi_update_delay(struct acpi_sbs *sbs); |
176 | static int acpi_sbs_update_run(struct acpi_sbs *sbs, int data_type); | 209 | static int acpi_sbs_update_run(struct acpi_sbs *sbs, int data_type); |
177 | 210 | ||
@@ -179,155 +212,172 @@ static int acpi_sbs_update_run(struct acpi_sbs *sbs, int data_type); | |||
179 | SMBus Communication | 212 | SMBus Communication |
180 | -------------------------------------------------------------------------- */ | 213 | -------------------------------------------------------------------------- */ |
181 | 214 | ||
182 | static void acpi_battery_smbus_err_handler(struct acpi_ec_smbus *smbus) | 215 | static int acpi_ec_sbs_read(struct acpi_sbs *sbs, u8 address, u8 * data) |
183 | { | 216 | { |
184 | union i2c_smbus_data data; | 217 | u8 val; |
185 | int result = 0; | 218 | int err; |
186 | char *err_str; | ||
187 | int err_number; | ||
188 | 219 | ||
189 | data.word = 0; | 220 | err = ec_read(sbs->base + address, &val); |
221 | if (!err) { | ||
222 | *data = val; | ||
223 | } | ||
224 | xmsleep(ACPI_EC_SMB_TRANSACTION_SLEEP); | ||
225 | return (err); | ||
226 | } | ||
190 | 227 | ||
191 | result = smbus->adapter.algo-> | 228 | static int acpi_ec_sbs_write(struct acpi_sbs *sbs, u8 address, u8 data) |
192 | smbus_xfer(&smbus->adapter, | 229 | { |
193 | ACPI_SB_SMBUS_ADDR, | 230 | int err; |
194 | 0, I2C_SMBUS_READ, 0x16, I2C_SMBUS_BLOCK_DATA, &data); | ||
195 | 231 | ||
196 | err_number = (data.word & 0x000f); | 232 | err = ec_write(sbs->base + address, data); |
233 | return (err); | ||
234 | } | ||
197 | 235 | ||
198 | switch (data.word & 0x000f) { | 236 | static int |
199 | case 0x0000: | 237 | acpi_ec_sbs_access(struct acpi_sbs *sbs, u16 addr, |
200 | err_str = "unexpected bus error"; | 238 | char read_write, u8 command, int size, |
201 | break; | 239 | union sbs_rw_data *data) |
202 | case 0x0001: | 240 | { |
203 | err_str = "busy"; | 241 | unsigned char protocol, len = 0, temp[2] = { 0, 0 }; |
204 | break; | 242 | int i; |
205 | case 0x0002: | 243 | |
206 | err_str = "reserved command"; | 244 | if (read_write == ACPI_SBS_SMBUS_READ) { |
207 | break; | 245 | protocol = ACPI_EC_SMB_PRTCL_READ; |
208 | case 0x0003: | 246 | } else { |
209 | err_str = "unsupported command"; | 247 | protocol = ACPI_EC_SMB_PRTCL_WRITE; |
210 | break; | 248 | } |
211 | case 0x0004: | 249 | |
212 | err_str = "access denied"; | 250 | switch (size) { |
251 | |||
252 | case ACPI_SBS_WORD_DATA: | ||
253 | acpi_ec_sbs_write(sbs, ACPI_EC_SMB_CMD, command); | ||
254 | if (read_write == ACPI_SBS_SMBUS_WRITE) { | ||
255 | acpi_ec_sbs_write(sbs, ACPI_EC_SMB_DATA, data->word); | ||
256 | acpi_ec_sbs_write(sbs, ACPI_EC_SMB_DATA + 1, | ||
257 | data->word >> 8); | ||
258 | } | ||
259 | protocol |= ACPI_EC_SMB_PRTCL_WORD_DATA; | ||
213 | break; | 260 | break; |
214 | case 0x0005: | 261 | case ACPI_SBS_BLOCK_DATA: |
215 | err_str = "overflow/underflow"; | 262 | acpi_ec_sbs_write(sbs, ACPI_EC_SMB_CMD, command); |
263 | if (read_write == ACPI_SBS_SMBUS_WRITE) { | ||
264 | len = min_t(u8, data->block[0], 32); | ||
265 | acpi_ec_sbs_write(sbs, ACPI_EC_SMB_BCNT, len); | ||
266 | for (i = 0; i < len; i++) | ||
267 | acpi_ec_sbs_write(sbs, ACPI_EC_SMB_DATA + i, | ||
268 | data->block[i + 1]); | ||
269 | } | ||
270 | protocol |= ACPI_EC_SMB_PRTCL_BLOCK_DATA; | ||
216 | break; | 271 | break; |
217 | case 0x0006: | 272 | default: |
218 | err_str = "bad size"; | 273 | ACPI_EXCEPTION((AE_INFO, AE_ERROR, |
274 | "unsupported transaction %d\n", size)); | ||
275 | return (-1); | ||
276 | } | ||
277 | |||
278 | acpi_ec_sbs_write(sbs, ACPI_EC_SMB_ADDR, addr << 1); | ||
279 | acpi_ec_sbs_write(sbs, ACPI_EC_SMB_PRTCL, protocol); | ||
280 | |||
281 | acpi_ec_sbs_read(sbs, ACPI_EC_SMB_STS, temp); | ||
282 | |||
283 | if (~temp[0] & ACPI_EC_SMB_STS_DONE) { | ||
284 | xmsleep(ACPI_EC_SMB_ACCESS_SLEEP1); | ||
285 | acpi_ec_sbs_read(sbs, ACPI_EC_SMB_STS, temp); | ||
286 | } | ||
287 | if (~temp[0] & ACPI_EC_SMB_STS_DONE) { | ||
288 | xmsleep(ACPI_EC_SMB_ACCESS_SLEEP2); | ||
289 | acpi_ec_sbs_read(sbs, ACPI_EC_SMB_STS, temp); | ||
290 | } | ||
291 | if ((~temp[0] & ACPI_EC_SMB_STS_DONE) | ||
292 | || (temp[0] & ACPI_EC_SMB_STS_STATUS)) { | ||
293 | ACPI_EXCEPTION((AE_INFO, AE_ERROR, | ||
294 | "transaction %d error\n", size)); | ||
295 | return (-1); | ||
296 | } | ||
297 | |||
298 | if (read_write == ACPI_SBS_SMBUS_WRITE) { | ||
299 | return (0); | ||
300 | } | ||
301 | |||
302 | switch (size) { | ||
303 | |||
304 | case ACPI_SBS_WORD_DATA: | ||
305 | acpi_ec_sbs_read(sbs, ACPI_EC_SMB_DATA, temp); | ||
306 | acpi_ec_sbs_read(sbs, ACPI_EC_SMB_DATA + 1, temp + 1); | ||
307 | data->word = (temp[1] << 8) | temp[0]; | ||
219 | break; | 308 | break; |
220 | case 0x0007: | 309 | |
221 | err_str = "unknown error"; | 310 | case ACPI_SBS_BLOCK_DATA: |
311 | len = 0; | ||
312 | acpi_ec_sbs_read(sbs, ACPI_EC_SMB_BCNT, &len); | ||
313 | len = min_t(u8, len, 32); | ||
314 | for (i = 0; i < len; i++) | ||
315 | acpi_ec_sbs_read(sbs, ACPI_EC_SMB_DATA + i, | ||
316 | data->block + i + 1); | ||
317 | data->block[0] = len; | ||
222 | break; | 318 | break; |
223 | default: | 319 | default: |
224 | err_str = "unrecognized error"; | 320 | ACPI_EXCEPTION((AE_INFO, AE_ERROR, |
321 | "unsupported transaction %d\n", size)); | ||
322 | return (-1); | ||
225 | } | 323 | } |
226 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 324 | |
227 | "%s: ret %i, err %i\n", err_str, result, err_number)); | 325 | return (0); |
228 | } | 326 | } |
229 | 327 | ||
230 | static int | 328 | static int |
231 | acpi_sbs_smbus_read_word(struct acpi_ec_smbus *smbus, int addr, int func, | 329 | acpi_sbs_read_word(struct acpi_sbs *sbs, int addr, int func, u16 * word) |
232 | u16 * word, | ||
233 | void (*err_handler) (struct acpi_ec_smbus * smbus)) | ||
234 | { | 330 | { |
235 | union i2c_smbus_data data; | 331 | union sbs_rw_data data; |
236 | int result = 0; | 332 | int result = 0; |
237 | int i; | ||
238 | 333 | ||
239 | if (err_handler == NULL) { | 334 | result = acpi_ec_sbs_access(sbs, addr, |
240 | err_handler = acpi_battery_smbus_err_handler; | 335 | ACPI_SBS_SMBUS_READ, func, |
241 | } | 336 | ACPI_SBS_WORD_DATA, &data); |
242 | 337 | if (result) { | |
243 | for (i = 0; i < MAX_SMBUS_ERR; i++) { | 338 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
244 | result = | 339 | "acpi_ec_sbs_access() failed\n")); |
245 | smbus->adapter.algo->smbus_xfer(&smbus->adapter, addr, 0, | 340 | } else { |
246 | I2C_SMBUS_READ, func, | 341 | *word = data.word; |
247 | I2C_SMBUS_WORD_DATA, &data); | ||
248 | if (result) { | ||
249 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | ||
250 | "try %i: smbus->adapter.algo->smbus_xfer() failed\n", | ||
251 | i)); | ||
252 | if (err_handler) { | ||
253 | err_handler(smbus); | ||
254 | } | ||
255 | } else { | ||
256 | *word = data.word; | ||
257 | break; | ||
258 | } | ||
259 | } | 342 | } |
260 | 343 | ||
261 | return result; | 344 | return result; |
262 | } | 345 | } |
263 | 346 | ||
264 | static int | 347 | static int |
265 | acpi_sbs_smbus_read_str(struct acpi_ec_smbus *smbus, int addr, int func, | 348 | acpi_sbs_read_str(struct acpi_sbs *sbs, int addr, int func, char *str) |
266 | char *str, | ||
267 | void (*err_handler) (struct acpi_ec_smbus * smbus)) | ||
268 | { | 349 | { |
269 | union i2c_smbus_data data; | 350 | union sbs_rw_data data; |
270 | int result = 0; | 351 | int result = 0; |
271 | int i; | ||
272 | |||
273 | if (err_handler == NULL) { | ||
274 | err_handler = acpi_battery_smbus_err_handler; | ||
275 | } | ||
276 | 352 | ||
277 | for (i = 0; i < MAX_SMBUS_ERR; i++) { | 353 | result = acpi_ec_sbs_access(sbs, addr, |
278 | result = | 354 | ACPI_SBS_SMBUS_READ, func, |
279 | smbus->adapter.algo->smbus_xfer(&smbus->adapter, addr, 0, | 355 | ACPI_SBS_BLOCK_DATA, &data); |
280 | I2C_SMBUS_READ, func, | 356 | if (result) { |
281 | I2C_SMBUS_BLOCK_DATA, | 357 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
282 | &data); | 358 | "acpi_ec_sbs_access() failed\n")); |
283 | if (result) { | 359 | } else { |
284 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 360 | strncpy(str, (const char *)data.block + 1, data.block[0]); |
285 | "try %i: smbus->adapter.algo->smbus_xfer() failed\n", | 361 | str[data.block[0]] = 0; |
286 | i)); | ||
287 | if (err_handler) { | ||
288 | err_handler(smbus); | ||
289 | } | ||
290 | } else { | ||
291 | strncpy(str, (const char *)data.block + 1, | ||
292 | data.block[0]); | ||
293 | str[data.block[0]] = 0; | ||
294 | break; | ||
295 | } | ||
296 | } | 362 | } |
297 | 363 | ||
298 | return result; | 364 | return result; |
299 | } | 365 | } |
300 | 366 | ||
301 | static int | 367 | static int |
302 | acpi_sbs_smbus_write_word(struct acpi_ec_smbus *smbus, int addr, int func, | 368 | acpi_sbs_write_word(struct acpi_sbs *sbs, int addr, int func, int word) |
303 | int word, | ||
304 | void (*err_handler) (struct acpi_ec_smbus * smbus)) | ||
305 | { | 369 | { |
306 | union i2c_smbus_data data; | 370 | union sbs_rw_data data; |
307 | int result = 0; | 371 | int result = 0; |
308 | int i; | ||
309 | |||
310 | if (err_handler == NULL) { | ||
311 | err_handler = acpi_battery_smbus_err_handler; | ||
312 | } | ||
313 | 372 | ||
314 | data.word = word; | 373 | data.word = word; |
315 | 374 | ||
316 | for (i = 0; i < MAX_SMBUS_ERR; i++) { | 375 | result = acpi_ec_sbs_access(sbs, addr, |
317 | result = | 376 | ACPI_SBS_SMBUS_WRITE, func, |
318 | smbus->adapter.algo->smbus_xfer(&smbus->adapter, addr, 0, | 377 | ACPI_SBS_WORD_DATA, &data); |
319 | I2C_SMBUS_WRITE, func, | 378 | if (result) { |
320 | I2C_SMBUS_WORD_DATA, &data); | 379 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
321 | if (result) { | 380 | "acpi_ec_sbs_access() failed\n")); |
322 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | ||
323 | "try %i: smbus->adapter.algo" | ||
324 | "->smbus_xfer() failed\n", i)); | ||
325 | if (err_handler) { | ||
326 | err_handler(smbus); | ||
327 | } | ||
328 | } else { | ||
329 | break; | ||
330 | } | ||
331 | } | 381 | } |
332 | 382 | ||
333 | return result; | 383 | return result; |
@@ -366,12 +416,11 @@ static int acpi_battery_get_present(struct acpi_battery *battery) | |||
366 | int result = 0; | 416 | int result = 0; |
367 | int is_present = 0; | 417 | int is_present = 0; |
368 | 418 | ||
369 | result = acpi_sbs_smbus_read_word(battery->sbs->smbus, | 419 | result = acpi_sbs_read_word(battery->sbs, |
370 | ACPI_SBSM_SMBUS_ADDR, 0x01, | 420 | ACPI_SBSM_SMBUS_ADDR, 0x01, &state); |
371 | &state, NULL); | ||
372 | if (result) { | 421 | if (result) { |
373 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 422 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
374 | "acpi_sbs_smbus_read_word() failed")); | 423 | "acpi_sbs_read_word() failed")); |
375 | } | 424 | } |
376 | if (!result) { | 425 | if (!result) { |
377 | is_present = (state & 0x000f) & (1 << battery->id); | 426 | is_present = (state & 0x000f) & (1 << battery->id); |
@@ -393,7 +442,7 @@ static int acpi_ac_is_present(struct acpi_sbs *sbs) | |||
393 | 442 | ||
394 | static int acpi_battery_select(struct acpi_battery *battery) | 443 | static int acpi_battery_select(struct acpi_battery *battery) |
395 | { | 444 | { |
396 | struct acpi_ec_smbus *smbus = battery->sbs->smbus; | 445 | struct acpi_sbs *sbs = battery->sbs; |
397 | int result = 0; | 446 | int result = 0; |
398 | s16 state; | 447 | s16 state; |
399 | int foo; | 448 | int foo; |
@@ -405,21 +454,19 @@ static int acpi_battery_select(struct acpi_battery *battery) | |||
405 | * it causes charging to halt on SBSELs */ | 454 | * it causes charging to halt on SBSELs */ |
406 | 455 | ||
407 | result = | 456 | result = |
408 | acpi_sbs_smbus_read_word(smbus, ACPI_SBSM_SMBUS_ADDR, 0x01, | 457 | acpi_sbs_read_word(sbs, ACPI_SBSM_SMBUS_ADDR, 0x01, &state); |
409 | &state, NULL); | ||
410 | if (result) { | 458 | if (result) { |
411 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 459 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
412 | "acpi_sbs_smbus_read_word() failed\n")); | 460 | "acpi_sbs_read_word() failed\n")); |
413 | goto end; | 461 | goto end; |
414 | } | 462 | } |
415 | 463 | ||
416 | foo = (state & 0x0fff) | (1 << (battery->id + 12)); | 464 | foo = (state & 0x0fff) | (1 << (battery->id + 12)); |
417 | result = | 465 | result = |
418 | acpi_sbs_smbus_write_word(smbus, ACPI_SBSM_SMBUS_ADDR, 0x01, | 466 | acpi_sbs_write_word(sbs, ACPI_SBSM_SMBUS_ADDR, 0x01, foo); |
419 | foo, NULL); | ||
420 | if (result) { | 467 | if (result) { |
421 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 468 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
422 | "acpi_sbs_smbus_write_word() failed\n")); | 469 | "acpi_sbs_write_word() failed\n")); |
423 | goto end; | 470 | goto end; |
424 | } | 471 | } |
425 | } | 472 | } |
@@ -430,15 +477,14 @@ static int acpi_battery_select(struct acpi_battery *battery) | |||
430 | 477 | ||
431 | static int acpi_sbsm_get_info(struct acpi_sbs *sbs) | 478 | static int acpi_sbsm_get_info(struct acpi_sbs *sbs) |
432 | { | 479 | { |
433 | struct acpi_ec_smbus *smbus = sbs->smbus; | ||
434 | int result = 0; | 480 | int result = 0; |
435 | s16 battery_system_info; | 481 | s16 battery_system_info; |
436 | 482 | ||
437 | result = acpi_sbs_smbus_read_word(smbus, ACPI_SBSM_SMBUS_ADDR, 0x04, | 483 | result = acpi_sbs_read_word(sbs, ACPI_SBSM_SMBUS_ADDR, 0x04, |
438 | &battery_system_info, NULL); | 484 | &battery_system_info); |
439 | if (result) { | 485 | if (result) { |
440 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 486 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
441 | "acpi_sbs_smbus_read_word() failed\n")); | 487 | "acpi_sbs_read_word() failed\n")); |
442 | goto end; | 488 | goto end; |
443 | } | 489 | } |
444 | 490 | ||
@@ -451,53 +497,48 @@ static int acpi_sbsm_get_info(struct acpi_sbs *sbs) | |||
451 | 497 | ||
452 | static int acpi_battery_get_info(struct acpi_battery *battery) | 498 | static int acpi_battery_get_info(struct acpi_battery *battery) |
453 | { | 499 | { |
454 | struct acpi_ec_smbus *smbus = battery->sbs->smbus; | 500 | struct acpi_sbs *sbs = battery->sbs; |
455 | int result = 0; | 501 | int result = 0; |
456 | s16 battery_mode; | 502 | s16 battery_mode; |
457 | s16 specification_info; | 503 | s16 specification_info; |
458 | 504 | ||
459 | result = acpi_sbs_smbus_read_word(smbus, ACPI_SB_SMBUS_ADDR, 0x03, | 505 | result = acpi_sbs_read_word(sbs, ACPI_SB_SMBUS_ADDR, 0x03, |
460 | &battery_mode, | 506 | &battery_mode); |
461 | &acpi_battery_smbus_err_handler); | ||
462 | if (result) { | 507 | if (result) { |
463 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 508 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
464 | "acpi_sbs_smbus_read_word() failed\n")); | 509 | "acpi_sbs_read_word() failed\n")); |
465 | goto end; | 510 | goto end; |
466 | } | 511 | } |
467 | battery->info.capacity_mode = (battery_mode & 0x8000) >> 15; | 512 | battery->info.capacity_mode = (battery_mode & 0x8000) >> 15; |
468 | 513 | ||
469 | result = acpi_sbs_smbus_read_word(smbus, ACPI_SB_SMBUS_ADDR, 0x10, | 514 | result = acpi_sbs_read_word(sbs, ACPI_SB_SMBUS_ADDR, 0x10, |
470 | &battery->info.full_charge_capacity, | 515 | &battery->info.full_charge_capacity); |
471 | &acpi_battery_smbus_err_handler); | ||
472 | if (result) { | 516 | if (result) { |
473 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 517 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
474 | "acpi_sbs_smbus_read_word() failed\n")); | 518 | "acpi_sbs_read_word() failed\n")); |
475 | goto end; | 519 | goto end; |
476 | } | 520 | } |
477 | 521 | ||
478 | result = acpi_sbs_smbus_read_word(smbus, ACPI_SB_SMBUS_ADDR, 0x18, | 522 | result = acpi_sbs_read_word(sbs, ACPI_SB_SMBUS_ADDR, 0x18, |
479 | &battery->info.design_capacity, | 523 | &battery->info.design_capacity); |
480 | &acpi_battery_smbus_err_handler); | ||
481 | 524 | ||
482 | if (result) { | 525 | if (result) { |
483 | goto end; | 526 | goto end; |
484 | } | 527 | } |
485 | 528 | ||
486 | result = acpi_sbs_smbus_read_word(smbus, ACPI_SB_SMBUS_ADDR, 0x19, | 529 | result = acpi_sbs_read_word(sbs, ACPI_SB_SMBUS_ADDR, 0x19, |
487 | &battery->info.design_voltage, | 530 | &battery->info.design_voltage); |
488 | &acpi_battery_smbus_err_handler); | ||
489 | if (result) { | 531 | if (result) { |
490 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 532 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
491 | "acpi_sbs_smbus_read_word() failed\n")); | 533 | "acpi_sbs_read_word() failed\n")); |
492 | goto end; | 534 | goto end; |
493 | } | 535 | } |
494 | 536 | ||
495 | result = acpi_sbs_smbus_read_word(smbus, ACPI_SB_SMBUS_ADDR, 0x1a, | 537 | result = acpi_sbs_read_word(sbs, ACPI_SB_SMBUS_ADDR, 0x1a, |
496 | &specification_info, | 538 | &specification_info); |
497 | &acpi_battery_smbus_err_handler); | ||
498 | if (result) { | 539 | if (result) { |
499 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 540 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
500 | "acpi_sbs_smbus_read_word() failed\n")); | 541 | "acpi_sbs_read_word() failed\n")); |
501 | goto end; | 542 | goto end; |
502 | } | 543 | } |
503 | 544 | ||
@@ -529,37 +570,33 @@ static int acpi_battery_get_info(struct acpi_battery *battery) | |||
529 | battery->info.ipscale = 1; | 570 | battery->info.ipscale = 1; |
530 | } | 571 | } |
531 | 572 | ||
532 | result = acpi_sbs_smbus_read_word(smbus, ACPI_SB_SMBUS_ADDR, 0x1c, | 573 | result = acpi_sbs_read_word(sbs, ACPI_SB_SMBUS_ADDR, 0x1c, |
533 | &battery->info.serial_number, | 574 | &battery->info.serial_number); |
534 | &acpi_battery_smbus_err_handler); | ||
535 | if (result) { | 575 | if (result) { |
536 | goto end; | 576 | goto end; |
537 | } | 577 | } |
538 | 578 | ||
539 | result = acpi_sbs_smbus_read_str(smbus, ACPI_SB_SMBUS_ADDR, 0x20, | 579 | result = acpi_sbs_read_str(sbs, ACPI_SB_SMBUS_ADDR, 0x20, |
540 | battery->info.manufacturer_name, | 580 | battery->info.manufacturer_name); |
541 | &acpi_battery_smbus_err_handler); | ||
542 | if (result) { | 581 | if (result) { |
543 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 582 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
544 | "acpi_sbs_smbus_read_str() failed\n")); | 583 | "acpi_sbs_read_str() failed\n")); |
545 | goto end; | 584 | goto end; |
546 | } | 585 | } |
547 | 586 | ||
548 | result = acpi_sbs_smbus_read_str(smbus, ACPI_SB_SMBUS_ADDR, 0x21, | 587 | result = acpi_sbs_read_str(sbs, ACPI_SB_SMBUS_ADDR, 0x21, |
549 | battery->info.device_name, | 588 | battery->info.device_name); |
550 | &acpi_battery_smbus_err_handler); | ||
551 | if (result) { | 589 | if (result) { |
552 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 590 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
553 | "acpi_sbs_smbus_read_str() failed\n")); | 591 | "acpi_sbs_read_str() failed\n")); |
554 | goto end; | 592 | goto end; |
555 | } | 593 | } |
556 | 594 | ||
557 | result = acpi_sbs_smbus_read_str(smbus, ACPI_SB_SMBUS_ADDR, 0x22, | 595 | result = acpi_sbs_read_str(sbs, ACPI_SB_SMBUS_ADDR, 0x22, |
558 | battery->info.device_chemistry, | 596 | battery->info.device_chemistry); |
559 | &acpi_battery_smbus_err_handler); | ||
560 | if (result) { | 597 | if (result) { |
561 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 598 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
562 | "acpi_sbs_smbus_read_str() failed\n")); | 599 | "acpi_sbs_read_str() failed\n")); |
563 | goto end; | 600 | goto end; |
564 | } | 601 | } |
565 | 602 | ||
@@ -579,66 +616,60 @@ static void acpi_update_delay(struct acpi_sbs *sbs) | |||
579 | 616 | ||
580 | static int acpi_battery_get_state(struct acpi_battery *battery) | 617 | static int acpi_battery_get_state(struct acpi_battery *battery) |
581 | { | 618 | { |
582 | struct acpi_ec_smbus *smbus = battery->sbs->smbus; | 619 | struct acpi_sbs *sbs = battery->sbs; |
583 | int result = 0; | 620 | int result = 0; |
584 | 621 | ||
585 | acpi_update_delay(battery->sbs); | 622 | acpi_update_delay(battery->sbs); |
586 | result = acpi_sbs_smbus_read_word(smbus, ACPI_SB_SMBUS_ADDR, 0x09, | 623 | result = acpi_sbs_read_word(sbs, ACPI_SB_SMBUS_ADDR, 0x09, |
587 | &battery->state.voltage, | 624 | &battery->state.voltage); |
588 | &acpi_battery_smbus_err_handler); | ||
589 | if (result) { | 625 | if (result) { |
590 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 626 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
591 | "acpi_sbs_smbus_read_word() failed\n")); | 627 | "acpi_sbs_read_word() failed\n")); |
592 | goto end; | 628 | goto end; |
593 | } | 629 | } |
594 | 630 | ||
595 | acpi_update_delay(battery->sbs); | 631 | acpi_update_delay(battery->sbs); |
596 | result = acpi_sbs_smbus_read_word(smbus, ACPI_SB_SMBUS_ADDR, 0x0a, | 632 | result = acpi_sbs_read_word(sbs, ACPI_SB_SMBUS_ADDR, 0x0a, |
597 | &battery->state.amperage, | 633 | &battery->state.amperage); |
598 | &acpi_battery_smbus_err_handler); | ||
599 | if (result) { | 634 | if (result) { |
600 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 635 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
601 | "acpi_sbs_smbus_read_word() failed\n")); | 636 | "acpi_sbs_read_word() failed\n")); |
602 | goto end; | 637 | goto end; |
603 | } | 638 | } |
604 | 639 | ||
605 | acpi_update_delay(battery->sbs); | 640 | acpi_update_delay(battery->sbs); |
606 | result = acpi_sbs_smbus_read_word(smbus, ACPI_SB_SMBUS_ADDR, 0x0f, | 641 | result = acpi_sbs_read_word(sbs, ACPI_SB_SMBUS_ADDR, 0x0f, |
607 | &battery->state.remaining_capacity, | 642 | &battery->state.remaining_capacity); |
608 | &acpi_battery_smbus_err_handler); | ||
609 | if (result) { | 643 | if (result) { |
610 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 644 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
611 | "acpi_sbs_smbus_read_word() failed\n")); | 645 | "acpi_sbs_read_word() failed\n")); |
612 | goto end; | 646 | goto end; |
613 | } | 647 | } |
614 | 648 | ||
615 | acpi_update_delay(battery->sbs); | 649 | acpi_update_delay(battery->sbs); |
616 | result = acpi_sbs_smbus_read_word(smbus, ACPI_SB_SMBUS_ADDR, 0x12, | 650 | result = acpi_sbs_read_word(sbs, ACPI_SB_SMBUS_ADDR, 0x12, |
617 | &battery->state.average_time_to_empty, | 651 | &battery->state.average_time_to_empty); |
618 | &acpi_battery_smbus_err_handler); | ||
619 | if (result) { | 652 | if (result) { |
620 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 653 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
621 | "acpi_sbs_smbus_read_word() failed\n")); | 654 | "acpi_sbs_read_word() failed\n")); |
622 | goto end; | 655 | goto end; |
623 | } | 656 | } |
624 | 657 | ||
625 | acpi_update_delay(battery->sbs); | 658 | acpi_update_delay(battery->sbs); |
626 | result = acpi_sbs_smbus_read_word(smbus, ACPI_SB_SMBUS_ADDR, 0x13, | 659 | result = acpi_sbs_read_word(sbs, ACPI_SB_SMBUS_ADDR, 0x13, |
627 | &battery->state.average_time_to_full, | 660 | &battery->state.average_time_to_full); |
628 | &acpi_battery_smbus_err_handler); | ||
629 | if (result) { | 661 | if (result) { |
630 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 662 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
631 | "acpi_sbs_smbus_read_word() failed\n")); | 663 | "acpi_sbs_read_word() failed\n")); |
632 | goto end; | 664 | goto end; |
633 | } | 665 | } |
634 | 666 | ||
635 | acpi_update_delay(battery->sbs); | 667 | acpi_update_delay(battery->sbs); |
636 | result = acpi_sbs_smbus_read_word(smbus, ACPI_SB_SMBUS_ADDR, 0x16, | 668 | result = acpi_sbs_read_word(sbs, ACPI_SB_SMBUS_ADDR, 0x16, |
637 | &battery->state.battery_status, | 669 | &battery->state.battery_status); |
638 | &acpi_battery_smbus_err_handler); | ||
639 | if (result) { | 670 | if (result) { |
640 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 671 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
641 | "acpi_sbs_smbus_read_word() failed\n")); | 672 | "acpi_sbs_read_word() failed\n")); |
642 | goto end; | 673 | goto end; |
643 | } | 674 | } |
644 | 675 | ||
@@ -650,15 +681,14 @@ static int acpi_battery_get_state(struct acpi_battery *battery) | |||
650 | 681 | ||
651 | static int acpi_battery_get_alarm(struct acpi_battery *battery) | 682 | static int acpi_battery_get_alarm(struct acpi_battery *battery) |
652 | { | 683 | { |
653 | struct acpi_ec_smbus *smbus = battery->sbs->smbus; | 684 | struct acpi_sbs *sbs = battery->sbs; |
654 | int result = 0; | 685 | int result = 0; |
655 | 686 | ||
656 | result = acpi_sbs_smbus_read_word(smbus, ACPI_SB_SMBUS_ADDR, 0x01, | 687 | result = acpi_sbs_read_word(sbs, ACPI_SB_SMBUS_ADDR, 0x01, |
657 | &battery->alarm.remaining_capacity, | 688 | &battery->alarm.remaining_capacity); |
658 | &acpi_battery_smbus_err_handler); | ||
659 | if (result) { | 689 | if (result) { |
660 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 690 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
661 | "acpi_sbs_smbus_read_word() failed\n")); | 691 | "acpi_sbs_read_word() failed\n")); |
662 | goto end; | 692 | goto end; |
663 | } | 693 | } |
664 | 694 | ||
@@ -672,7 +702,7 @@ static int acpi_battery_get_alarm(struct acpi_battery *battery) | |||
672 | static int acpi_battery_set_alarm(struct acpi_battery *battery, | 702 | static int acpi_battery_set_alarm(struct acpi_battery *battery, |
673 | unsigned long alarm) | 703 | unsigned long alarm) |
674 | { | 704 | { |
675 | struct acpi_ec_smbus *smbus = battery->sbs->smbus; | 705 | struct acpi_sbs *sbs = battery->sbs; |
676 | int result = 0; | 706 | int result = 0; |
677 | s16 battery_mode; | 707 | s16 battery_mode; |
678 | int foo; | 708 | int foo; |
@@ -688,33 +718,29 @@ static int acpi_battery_set_alarm(struct acpi_battery *battery, | |||
688 | 718 | ||
689 | if (alarm > 0) { | 719 | if (alarm > 0) { |
690 | result = | 720 | result = |
691 | acpi_sbs_smbus_read_word(smbus, ACPI_SB_SMBUS_ADDR, 0x03, | 721 | acpi_sbs_read_word(sbs, ACPI_SB_SMBUS_ADDR, 0x03, |
692 | &battery_mode, | 722 | &battery_mode); |
693 | &acpi_battery_smbus_err_handler); | ||
694 | if (result) { | 723 | if (result) { |
695 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 724 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
696 | "acpi_sbs_smbus_read_word() failed\n")); | 725 | "acpi_sbs_read_word() failed\n")); |
697 | goto end; | 726 | goto end; |
698 | } | 727 | } |
699 | 728 | ||
700 | result = | 729 | result = |
701 | acpi_sbs_smbus_write_word(smbus, ACPI_SB_SMBUS_ADDR, 0x01, | 730 | acpi_sbs_write_word(sbs, ACPI_SB_SMBUS_ADDR, 0x01, |
702 | battery_mode & 0xbfff, | 731 | battery_mode & 0xbfff); |
703 | &acpi_battery_smbus_err_handler); | ||
704 | if (result) { | 732 | if (result) { |
705 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 733 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
706 | "acpi_sbs_smbus_write_word() failed\n")); | 734 | "acpi_sbs_write_word() failed\n")); |
707 | goto end; | 735 | goto end; |
708 | } | 736 | } |
709 | } | 737 | } |
710 | 738 | ||
711 | foo = alarm / (battery->info.capacity_mode ? 10 : 1); | 739 | foo = alarm / (battery->info.capacity_mode ? 10 : 1); |
712 | result = acpi_sbs_smbus_write_word(smbus, ACPI_SB_SMBUS_ADDR, 0x01, | 740 | result = acpi_sbs_write_word(sbs, ACPI_SB_SMBUS_ADDR, 0x01, foo); |
713 | foo, | ||
714 | &acpi_battery_smbus_err_handler); | ||
715 | if (result) { | 741 | if (result) { |
716 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 742 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
717 | "acpi_sbs_smbus_write_word() failed\n")); | 743 | "acpi_sbs_write_word() failed\n")); |
718 | goto end; | 744 | goto end; |
719 | } | 745 | } |
720 | 746 | ||
@@ -732,12 +758,11 @@ static int acpi_battery_set_mode(struct acpi_battery *battery) | |||
732 | goto end; | 758 | goto end; |
733 | } | 759 | } |
734 | 760 | ||
735 | result = acpi_sbs_smbus_read_word(battery->sbs->smbus, | 761 | result = acpi_sbs_read_word(battery->sbs, |
736 | ACPI_SB_SMBUS_ADDR, 0x03, | 762 | ACPI_SB_SMBUS_ADDR, 0x03, &battery_mode); |
737 | &battery_mode, NULL); | ||
738 | if (result) { | 763 | if (result) { |
739 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 764 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
740 | "acpi_sbs_smbus_read_word() failed\n")); | 765 | "acpi_sbs_read_word() failed\n")); |
741 | goto end; | 766 | goto end; |
742 | } | 767 | } |
743 | 768 | ||
@@ -746,21 +771,19 @@ static int acpi_battery_set_mode(struct acpi_battery *battery) | |||
746 | } else { | 771 | } else { |
747 | battery_mode |= 0x8000; | 772 | battery_mode |= 0x8000; |
748 | } | 773 | } |
749 | result = acpi_sbs_smbus_write_word(battery->sbs->smbus, | 774 | result = acpi_sbs_write_word(battery->sbs, |
750 | ACPI_SB_SMBUS_ADDR, 0x03, | 775 | ACPI_SB_SMBUS_ADDR, 0x03, battery_mode); |
751 | battery_mode, NULL); | ||
752 | if (result) { | 776 | if (result) { |
753 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 777 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
754 | "acpi_sbs_smbus_write_word() failed\n")); | 778 | "acpi_sbs_write_word() failed\n")); |
755 | goto end; | 779 | goto end; |
756 | } | 780 | } |
757 | 781 | ||
758 | result = acpi_sbs_smbus_read_word(battery->sbs->smbus, | 782 | result = acpi_sbs_read_word(battery->sbs, |
759 | ACPI_SB_SMBUS_ADDR, 0x03, | 783 | ACPI_SB_SMBUS_ADDR, 0x03, &battery_mode); |
760 | &battery_mode, NULL); | ||
761 | if (result) { | 784 | if (result) { |
762 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 785 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
763 | "acpi_sbs_smbus_read_word() failed\n")); | 786 | "acpi_sbs_read_word() failed\n")); |
764 | goto end; | 787 | goto end; |
765 | } | 788 | } |
766 | 789 | ||
@@ -813,16 +836,15 @@ static int acpi_battery_init(struct acpi_battery *battery) | |||
813 | 836 | ||
814 | static int acpi_ac_get_present(struct acpi_sbs *sbs) | 837 | static int acpi_ac_get_present(struct acpi_sbs *sbs) |
815 | { | 838 | { |
816 | struct acpi_ec_smbus *smbus = sbs->smbus; | ||
817 | int result = 0; | 839 | int result = 0; |
818 | s16 charger_status; | 840 | s16 charger_status; |
819 | 841 | ||
820 | result = acpi_sbs_smbus_read_word(smbus, ACPI_SBC_SMBUS_ADDR, 0x13, | 842 | result = acpi_sbs_read_word(sbs, ACPI_SBC_SMBUS_ADDR, 0x13, |
821 | &charger_status, NULL); | 843 | &charger_status); |
822 | 844 | ||
823 | if (result) { | 845 | if (result) { |
824 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 846 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
825 | "acpi_sbs_smbus_read_word() failed\n")); | 847 | "acpi_sbs_read_word() failed\n")); |
826 | goto end; | 848 | goto end; |
827 | } | 849 | } |
828 | 850 | ||
@@ -1567,38 +1589,27 @@ static void acpi_sbs_update_queue(void *data) | |||
1567 | static int acpi_sbs_add(struct acpi_device *device) | 1589 | static int acpi_sbs_add(struct acpi_device *device) |
1568 | { | 1590 | { |
1569 | struct acpi_sbs *sbs = NULL; | 1591 | struct acpi_sbs *sbs = NULL; |
1570 | struct acpi_ec_hc *ec_hc = NULL; | 1592 | int result; |
1571 | int result, remove_result = 0; | ||
1572 | unsigned long sbs_obj; | 1593 | unsigned long sbs_obj; |
1573 | int id, cnt; | 1594 | int id; |
1574 | acpi_status status = AE_OK; | 1595 | acpi_status status = AE_OK; |
1596 | unsigned long val; | ||
1597 | |||
1598 | status = | ||
1599 | acpi_evaluate_integer(device->parent->handle, "_EC", NULL, &val); | ||
1600 | if (ACPI_FAILURE(status)) { | ||
1601 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Error obtaining _EC\n")); | ||
1602 | return -EIO; | ||
1603 | } | ||
1575 | 1604 | ||
1576 | sbs = kzalloc(sizeof(struct acpi_sbs), GFP_KERNEL); | 1605 | sbs = kzalloc(sizeof(struct acpi_sbs), GFP_KERNEL); |
1577 | if (!sbs) { | 1606 | if (!sbs) { |
1578 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "kmalloc() failed\n")); | 1607 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "kmalloc() failed\n")); |
1579 | return -ENOMEM; | 1608 | return -ENOMEM; |
1580 | } | 1609 | } |
1581 | 1610 | sbs->base = (val & 0xff00ull) >> 8; | |
1582 | cnt = 0; | ||
1583 | while (cnt < 10) { | ||
1584 | cnt++; | ||
1585 | ec_hc = acpi_get_ec_hc(device); | ||
1586 | if (ec_hc) { | ||
1587 | break; | ||
1588 | } | ||
1589 | msleep(1000); | ||
1590 | } | ||
1591 | |||
1592 | if (!ec_hc) { | ||
1593 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | ||
1594 | "acpi_get_ec_hc() failed: " | ||
1595 | "NO driver found for EC HC SMBus\n")); | ||
1596 | result = -ENODEV; | ||
1597 | goto end; | ||
1598 | } | ||
1599 | 1611 | ||
1600 | sbs->device = device; | 1612 | sbs->device = device; |
1601 | sbs->smbus = ec_hc->smbus; | ||
1602 | 1613 | ||
1603 | strcpy(acpi_device_name(device), ACPI_SBS_DEVICE_NAME); | 1614 | strcpy(acpi_device_name(device), ACPI_SBS_DEVICE_NAME); |
1604 | strcpy(acpi_device_class(device), ACPI_SBS_CLASS); | 1615 | strcpy(acpi_device_class(device), ACPI_SBS_CLASS); |
@@ -1669,11 +1680,7 @@ static int acpi_sbs_add(struct acpi_device *device) | |||
1669 | 1680 | ||
1670 | end: | 1681 | end: |
1671 | if (result) { | 1682 | if (result) { |
1672 | remove_result = acpi_sbs_remove(device, 0); | 1683 | acpi_sbs_remove(device, 0); |
1673 | if (remove_result) { | ||
1674 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | ||
1675 | "acpi_sbs_remove() failed\n")); | ||
1676 | } | ||
1677 | } | 1684 | } |
1678 | 1685 | ||
1679 | return result; | 1686 | return result; |
@@ -1707,6 +1714,8 @@ int acpi_sbs_remove(struct acpi_device *device, int type) | |||
1707 | 1714 | ||
1708 | acpi_ac_remove(sbs); | 1715 | acpi_ac_remove(sbs); |
1709 | 1716 | ||
1717 | acpi_driver_data(device) = NULL; | ||
1718 | |||
1710 | kfree(sbs); | 1719 | kfree(sbs); |
1711 | 1720 | ||
1712 | return 0; | 1721 | return 0; |