aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-10-28 11:26:12 -0400
committerIngo Molnar <mingo@elte.hu>2008-10-28 11:26:12 -0400
commit7a9787e1eba95a166265e6a260cf30af04ef0a99 (patch)
treee730a4565e0318140d2fbd2f0415d18a339d7336 /drivers/acpi
parent41b9eb264c8407655db57b60b4457fe1b2ec9977 (diff)
parent0173a3265b228da319ceb9c1ec6a5682fd1b2d92 (diff)
Merge commit 'v2.6.28-rc2' into x86/pci-ioapic-boot-irq-quirks
Diffstat (limited to 'drivers/acpi')
-rw-r--r--drivers/acpi/Kconfig20
-rw-r--r--drivers/acpi/Makefile3
-rw-r--r--drivers/acpi/ac.c4
-rw-r--r--drivers/acpi/acpi_memhotplug.c11
-rw-r--r--drivers/acpi/asus_acpi.c231
-rw-r--r--drivers/acpi/battery.c4
-rw-r--r--drivers/acpi/bay.c414
-rw-r--r--drivers/acpi/bus.c78
-rw-r--r--drivers/acpi/button.c6
-rw-r--r--drivers/acpi/cm_sbs.c8
-rw-r--r--drivers/acpi/container.c4
-rw-r--r--drivers/acpi/debug.c2
-rw-r--r--drivers/acpi/dispatcher/dsmethod.c3
-rw-r--r--drivers/acpi/dispatcher/dsmthdat.c83
-rw-r--r--drivers/acpi/dispatcher/dsobject.c64
-rw-r--r--drivers/acpi/dispatcher/dsopcode.c2
-rw-r--r--drivers/acpi/dispatcher/dswexec.c12
-rw-r--r--drivers/acpi/dock.c392
-rw-r--r--drivers/acpi/ec.c432
-rw-r--r--drivers/acpi/executer/exconfig.c126
-rw-r--r--drivers/acpi/executer/exconvrt.c32
-rw-r--r--drivers/acpi/executer/exdump.c87
-rw-r--r--drivers/acpi/executer/exmisc.c14
-rw-r--r--drivers/acpi/executer/exoparg1.c26
-rw-r--r--drivers/acpi/executer/exoparg2.c4
-rw-r--r--drivers/acpi/executer/exresnte.c16
-rw-r--r--drivers/acpi/executer/exresolv.c60
-rw-r--r--drivers/acpi/executer/exresop.c50
-rw-r--r--drivers/acpi/executer/exstore.c61
-rw-r--r--drivers/acpi/executer/exstoren.c3
-rw-r--r--drivers/acpi/fan.c16
-rw-r--r--drivers/acpi/glue.c127
-rw-r--r--drivers/acpi/hardware/hwsleep.c44
-rw-r--r--drivers/acpi/namespace/Makefile2
-rw-r--r--drivers/acpi/namespace/nsdump.c5
-rw-r--r--drivers/acpi/namespace/nseval.c73
-rw-r--r--drivers/acpi/namespace/nsnames.c37
-rw-r--r--drivers/acpi/namespace/nspredef.c900
-rw-r--r--drivers/acpi/namespace/nssearch.c2
-rw-r--r--drivers/acpi/namespace/nsxfeval.c78
-rw-r--r--drivers/acpi/namespace/nsxfname.c5
-rw-r--r--drivers/acpi/numa.c2
-rw-r--r--drivers/acpi/osl.c55
-rw-r--r--drivers/acpi/parser/psloop.c2
-rw-r--r--drivers/acpi/parser/psparse.c32
-rw-r--r--drivers/acpi/pci_link.c49
-rw-r--r--drivers/acpi/pci_root.c4
-rw-r--r--drivers/acpi/pci_slot.c33
-rw-r--r--drivers/acpi/power.c74
-rw-r--r--drivers/acpi/processor_core.c15
-rw-r--r--drivers/acpi/processor_idle.c23
-rw-r--r--drivers/acpi/processor_perflib.c53
-rw-r--r--drivers/acpi/processor_throttling.c18
-rw-r--r--drivers/acpi/reboot.c25
-rw-r--r--drivers/acpi/resources/rscalc.c8
-rw-r--r--drivers/acpi/resources/rscreate.c10
-rw-r--r--drivers/acpi/sbs.c4
-rw-r--r--drivers/acpi/sbshc.c13
-rw-r--r--drivers/acpi/scan.c92
-rw-r--r--drivers/acpi/sleep/main.c108
-rw-r--r--drivers/acpi/sleep/proc.c28
-rw-r--r--drivers/acpi/system.c6
-rw-r--r--drivers/acpi/tables.c2
-rw-r--r--drivers/acpi/tables/tbfadt.c35
-rw-r--r--drivers/acpi/tables/tbinstal.c61
-rw-r--r--drivers/acpi/thermal.c104
-rw-r--r--drivers/acpi/toshiba_acpi.c263
-rw-r--r--drivers/acpi/utilities/utalloc.c59
-rw-r--r--drivers/acpi/utilities/utcopy.c29
-rw-r--r--drivers/acpi/utilities/utdelete.c25
-rw-r--r--drivers/acpi/utilities/utglobal.c52
-rw-r--r--drivers/acpi/utilities/utmisc.c9
-rw-r--r--drivers/acpi/utilities/utobject.c28
-rw-r--r--drivers/acpi/utilities/utxface.c7
-rw-r--r--drivers/acpi/utils.c4
-rw-r--r--drivers/acpi/video.c79
-rw-r--r--drivers/acpi/wmi.c51
77 files changed, 3320 insertions, 1683 deletions
diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
index 735f5ea17473..f4f632917509 100644
--- a/drivers/acpi/Kconfig
+++ b/drivers/acpi/Kconfig
@@ -42,7 +42,7 @@ if ACPI
42 42
43config ACPI_SLEEP 43config ACPI_SLEEP
44 bool 44 bool
45 depends on PM_SLEEP 45 depends on SUSPEND || HIBERNATION
46 default y 46 default y
47 47
48config ACPI_PROCFS 48config ACPI_PROCFS
@@ -157,18 +157,11 @@ config ACPI_FAN
157 applications to perform basic fan control (on, off, status). 157 applications to perform basic fan control (on, off, status).
158 158
159config ACPI_DOCK 159config ACPI_DOCK
160 tristate "Dock" 160 bool "Dock"
161 depends on EXPERIMENTAL 161 depends on EXPERIMENTAL
162 help 162 help
163 This driver adds support for ACPI controlled docking stations 163 This driver adds support for ACPI controlled docking stations and removable
164 164 drive bays such as the IBM ultrabay or the Dell Module Bay.
165config ACPI_BAY
166 tristate "Removable Drive Bay (EXPERIMENTAL)"
167 depends on EXPERIMENTAL
168 depends on ACPI_DOCK
169 help
170 This driver adds support for ACPI controlled removable drive
171 bays such as the IBM ultrabay or the Dell Module Bay.
172 165
173config ACPI_PROCESSOR 166config ACPI_PROCESSOR
174 tristate "Processor" 167 tristate "Processor"
@@ -259,7 +252,10 @@ config ACPI_ASUS
259 252
260config ACPI_TOSHIBA 253config ACPI_TOSHIBA
261 tristate "Toshiba Laptop Extras" 254 tristate "Toshiba Laptop Extras"
262 depends on X86 255 depends on X86 && INPUT
256 select INPUT_POLLDEV
257 select NET
258 select RFKILL
263 select BACKLIGHT_CLASS_DEVICE 259 select BACKLIGHT_CLASS_DEVICE
264 ---help--- 260 ---help---
265 This driver adds support for access to certain system settings 261 This driver adds support for access to certain system settings
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
index 52a4cd4b81d0..d91c027ece8f 100644
--- a/drivers/acpi/Makefile
+++ b/drivers/acpi/Makefile
@@ -45,14 +45,13 @@ obj-$(CONFIG_ACPI_BATTERY) += battery.o
45obj-$(CONFIG_ACPI_BUTTON) += button.o 45obj-$(CONFIG_ACPI_BUTTON) += button.o
46obj-$(CONFIG_ACPI_FAN) += fan.o 46obj-$(CONFIG_ACPI_FAN) += fan.o
47obj-$(CONFIG_ACPI_DOCK) += dock.o 47obj-$(CONFIG_ACPI_DOCK) += dock.o
48obj-$(CONFIG_ACPI_BAY) += bay.o
49obj-$(CONFIG_ACPI_VIDEO) += video.o 48obj-$(CONFIG_ACPI_VIDEO) += video.o
50obj-y += pci_root.o pci_link.o pci_irq.o pci_bind.o 49obj-y += pci_root.o pci_link.o pci_irq.o pci_bind.o
51obj-$(CONFIG_ACPI_PCI_SLOT) += pci_slot.o 50obj-$(CONFIG_ACPI_PCI_SLOT) += pci_slot.o
52obj-$(CONFIG_ACPI_POWER) += power.o
53obj-$(CONFIG_ACPI_PROCESSOR) += processor.o 51obj-$(CONFIG_ACPI_PROCESSOR) += processor.o
54obj-$(CONFIG_ACPI_CONTAINER) += container.o 52obj-$(CONFIG_ACPI_CONTAINER) += container.o
55obj-$(CONFIG_ACPI_THERMAL) += thermal.o 53obj-$(CONFIG_ACPI_THERMAL) += thermal.o
54obj-$(CONFIG_ACPI_POWER) += power.o
56obj-$(CONFIG_ACPI_SYSTEM) += system.o event.o 55obj-$(CONFIG_ACPI_SYSTEM) += system.o event.o
57obj-$(CONFIG_ACPI_DEBUG) += debug.o 56obj-$(CONFIG_ACPI_DEBUG) += debug.o
58obj-$(CONFIG_ACPI_NUMA) += numa.o 57obj-$(CONFIG_ACPI_NUMA) += numa.o
diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c
index 831883b7d6c9..d72a1b6c8a94 100644
--- a/drivers/acpi/ac.c
+++ b/drivers/acpi/ac.c
@@ -85,7 +85,7 @@ struct acpi_ac {
85 struct power_supply charger; 85 struct power_supply charger;
86#endif 86#endif
87 struct acpi_device * device; 87 struct acpi_device * device;
88 unsigned long state; 88 unsigned long long state;
89}; 89};
90 90
91#define to_acpi_ac(x) container_of(x, struct acpi_ac, charger); 91#define to_acpi_ac(x) container_of(x, struct acpi_ac, charger);
@@ -269,7 +269,7 @@ static int acpi_ac_add(struct acpi_device *device)
269 ac->device = device; 269 ac->device = device;
270 strcpy(acpi_device_name(device), ACPI_AC_DEVICE_NAME); 270 strcpy(acpi_device_name(device), ACPI_AC_DEVICE_NAME);
271 strcpy(acpi_device_class(device), ACPI_AC_CLASS); 271 strcpy(acpi_device_class(device), ACPI_AC_CLASS);
272 acpi_driver_data(device) = ac; 272 device->driver_data = ac;
273 273
274 result = acpi_ac_get_state(ac); 274 result = acpi_ac_get_state(ac);
275 if (result) 275 if (result)
diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
index 5f1127ad5a95..71d21c51c45f 100644
--- a/drivers/acpi/acpi_memhotplug.c
+++ b/drivers/acpi/acpi_memhotplug.c
@@ -194,8 +194,7 @@ acpi_memory_get_device(acpi_handle handle,
194 194
195static int acpi_memory_check_device(struct acpi_memory_device *mem_device) 195static int acpi_memory_check_device(struct acpi_memory_device *mem_device)
196{ 196{
197 unsigned long current_status; 197 unsigned long long current_status;
198
199 198
200 /* Get device present/absent information from the _STA */ 199 /* Get device present/absent information from the _STA */
201 if (ACPI_FAILURE(acpi_evaluate_integer(mem_device->device->handle, "_STA", 200 if (ACPI_FAILURE(acpi_evaluate_integer(mem_device->device->handle, "_STA",
@@ -264,7 +263,7 @@ static int acpi_memory_powerdown_device(struct acpi_memory_device *mem_device)
264 acpi_status status; 263 acpi_status status;
265 struct acpi_object_list arg_list; 264 struct acpi_object_list arg_list;
266 union acpi_object arg; 265 union acpi_object arg;
267 unsigned long current_status; 266 unsigned long long current_status;
268 267
269 268
270 /* Issue the _EJ0 command */ 269 /* Issue the _EJ0 command */
@@ -403,7 +402,7 @@ static int acpi_memory_device_add(struct acpi_device *device)
403 mem_device->device = device; 402 mem_device->device = device;
404 sprintf(acpi_device_name(device), "%s", ACPI_MEMORY_DEVICE_NAME); 403 sprintf(acpi_device_name(device), "%s", ACPI_MEMORY_DEVICE_NAME);
405 sprintf(acpi_device_class(device), "%s", ACPI_MEMORY_DEVICE_CLASS); 404 sprintf(acpi_device_class(device), "%s", ACPI_MEMORY_DEVICE_CLASS);
406 acpi_driver_data(device) = mem_device; 405 device->driver_data = mem_device;
407 406
408 /* Get the range from the _CRS */ 407 /* Get the range from the _CRS */
409 result = acpi_memory_get_device_resources(mem_device); 408 result = acpi_memory_get_device_resources(mem_device);
@@ -454,8 +453,8 @@ static int acpi_memory_device_start (struct acpi_device *device)
454 /* call add_memory func */ 453 /* call add_memory func */
455 result = acpi_memory_enable_device(mem_device); 454 result = acpi_memory_enable_device(mem_device);
456 if (result) 455 if (result)
457 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 456 printk(KERN_ERR PREFIX
458 "Error in acpi_memory_enable_device\n")); 457 "Error in acpi_memory_enable_device\n");
459 } 458 }
460 return result; 459 return result;
461} 460}
diff --git a/drivers/acpi/asus_acpi.c b/drivers/acpi/asus_acpi.c
index 44ad90c03c2e..1e74988c7b2d 100644
--- a/drivers/acpi/asus_acpi.c
+++ b/drivers/acpi/asus_acpi.c
@@ -42,7 +42,7 @@
42 42
43#define ASUS_ACPI_VERSION "0.30" 43#define ASUS_ACPI_VERSION "0.30"
44 44
45#define PROC_ASUS "asus" //the directory 45#define PROC_ASUS "asus" /* The directory */
46#define PROC_MLED "mled" 46#define PROC_MLED "mled"
47#define PROC_WLED "wled" 47#define PROC_WLED "wled"
48#define PROC_TLED "tled" 48#define PROC_TLED "tled"
@@ -66,10 +66,10 @@
66/* 66/*
67 * Flags for hotk status 67 * Flags for hotk status
68 */ 68 */
69#define MLED_ON 0x01 //mail LED 69#define MLED_ON 0x01 /* Mail LED */
70#define WLED_ON 0x02 //wireless LED 70#define WLED_ON 0x02 /* Wireless LED */
71#define TLED_ON 0x04 //touchpad LED 71#define TLED_ON 0x04 /* Touchpad LED */
72#define BT_ON 0x08 //internal Bluetooth 72#define BT_ON 0x08 /* Internal Bluetooth */
73 73
74MODULE_AUTHOR("Julien Lerouge, Karol Kozimor"); 74MODULE_AUTHOR("Julien Lerouge, Karol Kozimor");
75MODULE_DESCRIPTION(ACPI_HOTK_NAME); 75MODULE_DESCRIPTION(ACPI_HOTK_NAME);
@@ -78,32 +78,32 @@ MODULE_LICENSE("GPL");
78static uid_t asus_uid; 78static uid_t asus_uid;
79static gid_t asus_gid; 79static gid_t asus_gid;
80module_param(asus_uid, uint, 0); 80module_param(asus_uid, uint, 0);
81MODULE_PARM_DESC(asus_uid, "UID for entries in /proc/acpi/asus.\n"); 81MODULE_PARM_DESC(asus_uid, "UID for entries in /proc/acpi/asus");
82module_param(asus_gid, uint, 0); 82module_param(asus_gid, uint, 0);
83MODULE_PARM_DESC(asus_gid, "GID for entries in /proc/acpi/asus.\n"); 83MODULE_PARM_DESC(asus_gid, "GID for entries in /proc/acpi/asus");
84 84
85/* For each model, all features implemented, 85/* For each model, all features implemented,
86 * those marked with R are relative to HOTK, A for absolute */ 86 * those marked with R are relative to HOTK, A for absolute */
87struct model_data { 87struct model_data {
88 char *name; //name of the laptop________________A 88 char *name; /* name of the laptop________________A */
89 char *mt_mled; //method to handle mled_____________R 89 char *mt_mled; /* method to handle mled_____________R */
90 char *mled_status; //node to handle mled reading_______A 90 char *mled_status; /* node to handle mled reading_______A */
91 char *mt_wled; //method to handle wled_____________R 91 char *mt_wled; /* method to handle wled_____________R */
92 char *wled_status; //node to handle wled reading_______A 92 char *wled_status; /* node to handle wled reading_______A */
93 char *mt_tled; //method to handle tled_____________R 93 char *mt_tled; /* method to handle tled_____________R */
94 char *tled_status; //node to handle tled reading_______A 94 char *tled_status; /* node to handle tled reading_______A */
95 char *mt_ledd; //method to handle LED display______R 95 char *mt_ledd; /* method to handle LED display______R */
96 char *mt_bt_switch; //method to switch Bluetooth on/off_R 96 char *mt_bt_switch; /* method to switch Bluetooth on/off_R */
97 char *bt_status; //no model currently supports this__? 97 char *bt_status; /* no model currently supports this__? */
98 char *mt_lcd_switch; //method to turn LCD on/off_________A 98 char *mt_lcd_switch; /* method to turn LCD on/off_________A */
99 char *lcd_status; //node to read LCD panel state______A 99 char *lcd_status; /* node to read LCD panel state______A */
100 char *brightness_up; //method to set brightness up_______A 100 char *brightness_up; /* method to set brightness up_______A */
101 char *brightness_down; //guess what ?______________________A 101 char *brightness_down; /* method to set brightness down ____A */
102 char *brightness_set; //method to set absolute brightness_R 102 char *brightness_set; /* method to set absolute brightness_R */
103 char *brightness_get; //method to get absolute brightness_R 103 char *brightness_get; /* method to get absolute brightness_R */
104 char *brightness_status; //node to get brightness____________A 104 char *brightness_status;/* node to get brightness____________A */
105 char *display_set; //method to set video output________R 105 char *display_set; /* method to set video output________R */
106 char *display_get; //method to get video output________R 106 char *display_get; /* method to get video output________R */
107}; 107};
108 108
109/* 109/*
@@ -111,41 +111,41 @@ struct model_data {
111 * about the hotk device 111 * about the hotk device
112 */ 112 */
113struct asus_hotk { 113struct asus_hotk {
114 struct acpi_device *device; //the device we are in 114 struct acpi_device *device; /* the device we are in */
115 acpi_handle handle; //the handle of the hotk device 115 acpi_handle handle; /* the handle of the hotk device */
116 char status; //status of the hotk, for LEDs, ... 116 char status; /* status of the hotk, for LEDs */
117 u32 ledd_status; //status of the LED display 117 u32 ledd_status; /* status of the LED display */
118 struct model_data *methods; //methods available on the laptop 118 struct model_data *methods; /* methods available on the laptop */
119 u8 brightness; //brightness level 119 u8 brightness; /* brightness level */
120 enum { 120 enum {
121 A1x = 0, //A1340D, A1300F 121 A1x = 0, /* A1340D, A1300F */
122 A2x, //A2500H 122 A2x, /* A2500H */
123 A4G, //A4700G 123 A4G, /* A4700G */
124 D1x, //D1 124 D1x, /* D1 */
125 L2D, //L2000D 125 L2D, /* L2000D */
126 L3C, //L3800C 126 L3C, /* L3800C */
127 L3D, //L3400D 127 L3D, /* L3400D */
128 L3H, //L3H, L2000E, L5D 128 L3H, /* L3H, L2000E, L5D */
129 L4R, //L4500R 129 L4R, /* L4500R */
130 L5x, //L5800C 130 L5x, /* L5800C */
131 L8L, //L8400L 131 L8L, /* L8400L */
132 M1A, //M1300A 132 M1A, /* M1300A */
133 M2E, //M2400E, L4400L 133 M2E, /* M2400E, L4400L */
134 M6N, //M6800N, W3400N 134 M6N, /* M6800N, W3400N */
135 M6R, //M6700R, A3000G 135 M6R, /* M6700R, A3000G */
136 P30, //Samsung P30 136 P30, /* Samsung P30 */
137 S1x, //S1300A, but also L1400B and M2400A (L84F) 137 S1x, /* S1300A, but also L1400B and M2400A (L84F) */
138 S2x, //S200 (J1 reported), Victor MP-XP7210 138 S2x, /* S200 (J1 reported), Victor MP-XP7210 */
139 W1N, //W1000N 139 W1N, /* W1000N */
140 W5A, //W5A 140 W5A, /* W5A */
141 W3V, //W3030V 141 W3V, /* W3030V */
142 xxN, //M2400N, M3700N, M5200N, M6800N, S1300N, S5200N 142 xxN, /* M2400N, M3700N, M5200N, M6800N,
143 A4S, //Z81sp 143 S1300N, S5200N*/
144 //(Centrino) 144 A4S, /* Z81sp */
145 F3Sa, 145 F3Sa, /* (Centrino) */
146 END_MODEL 146 END_MODEL
147 } model; //Models currently supported 147 } model; /* Models currently supported */
148 u16 event_count[128]; //count for each event TODO make this better 148 u16 event_count[128]; /* Count for each event TODO make this better */
149}; 149};
150 150
151/* Here we go */ 151/* Here we go */
@@ -459,18 +459,18 @@ static struct acpi_driver asus_hotk_driver = {
459 }, 459 },
460}; 460};
461 461
462/* 462/*
463 * This function evaluates an ACPI method, given an int as parameter, the 463 * This function evaluates an ACPI method, given an int as parameter, the
464 * method is searched within the scope of the handle, can be NULL. The output 464 * method is searched within the scope of the handle, can be NULL. The output
465 * of the method is written is output, which can also be NULL 465 * of the method is written is output, which can also be NULL
466 * 466 *
467 * returns 1 if write is successful, 0 else. 467 * returns 1 if write is successful, 0 else.
468 */ 468 */
469static int write_acpi_int(acpi_handle handle, const char *method, int val, 469static int write_acpi_int(acpi_handle handle, const char *method, int val,
470 struct acpi_buffer *output) 470 struct acpi_buffer *output)
471{ 471{
472 struct acpi_object_list params; //list of input parameters (an int here) 472 struct acpi_object_list params; /* list of input parameters (int) */
473 union acpi_object in_obj; //the only param we use 473 union acpi_object in_obj; /* the only param we use */
474 acpi_status status; 474 acpi_status status;
475 475
476 params.count = 1; 476 params.count = 1;
@@ -507,18 +507,18 @@ proc_read_info(char *page, char **start, off_t off, int count, int *eof,
507{ 507{
508 int len = 0; 508 int len = 0;
509 int temp; 509 int temp;
510 char buf[16]; //enough for all info 510 char buf[16]; /* enough for all info */
511 /* 511 /*
512 * We use the easy way, we don't care of off and count, so we don't set eof 512 * We use the easy way, we don't care of off and count,
513 * to 1 513 * so we don't set eof to 1
514 */ 514 */
515 515
516 len += sprintf(page, ACPI_HOTK_NAME " " ASUS_ACPI_VERSION "\n"); 516 len += sprintf(page, ACPI_HOTK_NAME " " ASUS_ACPI_VERSION "\n");
517 len += sprintf(page + len, "Model reference : %s\n", 517 len += sprintf(page + len, "Model reference : %s\n",
518 hotk->methods->name); 518 hotk->methods->name);
519 /* 519 /*
520 * The SFUN method probably allows the original driver to get the list 520 * The SFUN method probably allows the original driver to get the list
521 * of features supported by a given model. For now, 0x0100 or 0x0800 521 * of features supported by a given model. For now, 0x0100 or 0x0800
522 * bit signifies that the laptop is equipped with a Wi-Fi MiniPCI card. 522 * bit signifies that the laptop is equipped with a Wi-Fi MiniPCI card.
523 * The significance of others is yet to be found. 523 * The significance of others is yet to be found.
524 */ 524 */
@@ -528,7 +528,7 @@ proc_read_info(char *page, char **start, off_t off, int count, int *eof,
528 /* 528 /*
529 * Another value for userspace: the ASYM method returns 0x02 for 529 * Another value for userspace: the ASYM method returns 0x02 for
530 * battery low and 0x04 for battery critical, its readings tend to be 530 * battery low and 0x04 for battery critical, its readings tend to be
531 * more accurate than those provided by _BST. 531 * more accurate than those provided by _BST.
532 * Note: since not all the laptops provide this method, errors are 532 * Note: since not all the laptops provide this method, errors are
533 * silently ignored. 533 * silently ignored.
534 */ 534 */
@@ -579,7 +579,7 @@ static int read_led(const char *ledname, int ledmask)
579 return (hotk->status & ledmask) ? 1 : 0; 579 return (hotk->status & ledmask) ? 1 : 0;
580} 580}
581 581
582static int parse_arg(const char __user * buf, unsigned long count, int *val) 582static int parse_arg(const char __user *buf, unsigned long count, int *val)
583{ 583{
584 char s[32]; 584 char s[32];
585 if (!count) 585 if (!count)
@@ -596,7 +596,7 @@ static int parse_arg(const char __user * buf, unsigned long count, int *val)
596 596
597/* FIXME: kill extraneous args so it can be called independently */ 597/* FIXME: kill extraneous args so it can be called independently */
598static int 598static int
599write_led(const char __user * buffer, unsigned long count, 599write_led(const char __user *buffer, unsigned long count,
600 char *ledname, int ledmask, int invert) 600 char *ledname, int ledmask, int invert)
601{ 601{
602 int rv, value; 602 int rv, value;
@@ -631,7 +631,7 @@ proc_read_mled(char *page, char **start, off_t off, int count, int *eof,
631} 631}
632 632
633static int 633static int
634proc_write_mled(struct file *file, const char __user * buffer, 634proc_write_mled(struct file *file, const char __user *buffer,
635 unsigned long count, void *data) 635 unsigned long count, void *data)
636{ 636{
637 return write_led(buffer, count, hotk->methods->mt_mled, MLED_ON, 1); 637 return write_led(buffer, count, hotk->methods->mt_mled, MLED_ON, 1);
@@ -648,7 +648,7 @@ proc_read_ledd(char *page, char **start, off_t off, int count, int *eof,
648} 648}
649 649
650static int 650static int
651proc_write_ledd(struct file *file, const char __user * buffer, 651proc_write_ledd(struct file *file, const char __user *buffer,
652 unsigned long count, void *data) 652 unsigned long count, void *data)
653{ 653{
654 int rv, value; 654 int rv, value;
@@ -677,7 +677,7 @@ proc_read_wled(char *page, char **start, off_t off, int count, int *eof,
677} 677}
678 678
679static int 679static int
680proc_write_wled(struct file *file, const char __user * buffer, 680proc_write_wled(struct file *file, const char __user *buffer,
681 unsigned long count, void *data) 681 unsigned long count, void *data)
682{ 682{
683 return write_led(buffer, count, hotk->methods->mt_wled, WLED_ON, 0); 683 return write_led(buffer, count, hotk->methods->mt_wled, WLED_ON, 0);
@@ -694,10 +694,10 @@ proc_read_bluetooth(char *page, char **start, off_t off, int count, int *eof,
694} 694}
695 695
696static int 696static int
697proc_write_bluetooth(struct file *file, const char __user * buffer, 697proc_write_bluetooth(struct file *file, const char __user *buffer,
698 unsigned long count, void *data) 698 unsigned long count, void *data)
699{ 699{
700 /* Note: mt_bt_switch controls both internal Bluetooth adapter's 700 /* Note: mt_bt_switch controls both internal Bluetooth adapter's
701 presence and its LED */ 701 presence and its LED */
702 return write_led(buffer, count, hotk->methods->mt_bt_switch, BT_ON, 0); 702 return write_led(buffer, count, hotk->methods->mt_bt_switch, BT_ON, 0);
703} 703}
@@ -714,7 +714,7 @@ proc_read_tled(char *page, char **start, off_t off, int count, int *eof,
714} 714}
715 715
716static int 716static int
717proc_write_tled(struct file *file, const char __user * buffer, 717proc_write_tled(struct file *file, const char __user *buffer,
718 unsigned long count, void *data) 718 unsigned long count, void *data)
719{ 719{
720 return write_led(buffer, count, hotk->methods->mt_tled, TLED_ON, 0); 720 return write_led(buffer, count, hotk->methods->mt_tled, TLED_ON, 0);
@@ -734,7 +734,7 @@ static int get_lcd_state(void)
734 734
735 input.count = 2; 735 input.count = 2;
736 input.pointer = mt_params; 736 input.pointer = mt_params;
737 /* Note: the following values are partly guessed up, but 737 /* Note: the following values are partly guessed up, but
738 otherwise they seem to work */ 738 otherwise they seem to work */
739 mt_params[0].type = ACPI_TYPE_INTEGER; 739 mt_params[0].type = ACPI_TYPE_INTEGER;
740 mt_params[0].integer.value = 0x02; 740 mt_params[0].integer.value = 0x02;
@@ -753,7 +753,7 @@ static int get_lcd_state(void)
753 /* That's what the AML code does */ 753 /* That's what the AML code does */
754 lcd = out_obj.integer.value >> 8; 754 lcd = out_obj.integer.value >> 8;
755 } else if (hotk->model == F3Sa) { 755 } else if (hotk->model == F3Sa) {
756 unsigned long tmp; 756 unsigned long long tmp;
757 union acpi_object param; 757 union acpi_object param;
758 struct acpi_object_list input; 758 struct acpi_object_list input;
759 acpi_status status; 759 acpi_status status;
@@ -796,12 +796,13 @@ static int set_lcd_state(int value)
796 acpi_evaluate_object(NULL, 796 acpi_evaluate_object(NULL,
797 hotk->methods->mt_lcd_switch, 797 hotk->methods->mt_lcd_switch,
798 NULL, NULL); 798 NULL, NULL);
799 } else { /* L3H and the like have to be handled differently */ 799 } else {
800 /* L3H and the like must be handled differently */
800 if (!write_acpi_int 801 if (!write_acpi_int
801 (hotk->handle, hotk->methods->mt_lcd_switch, 0x07, 802 (hotk->handle, hotk->methods->mt_lcd_switch, 0x07,
802 NULL)) 803 NULL))
803 status = AE_ERROR; 804 status = AE_ERROR;
804 /* L3H's AML executes EHK (0x07) upon Fn+F7 keypress, 805 /* L3H's AML executes EHK (0x07) upon Fn+F7 keypress,
805 the exact behaviour is simulated here */ 806 the exact behaviour is simulated here */
806 } 807 }
807 if (ACPI_FAILURE(status)) 808 if (ACPI_FAILURE(status))
@@ -819,7 +820,7 @@ proc_read_lcd(char *page, char **start, off_t off, int count, int *eof,
819} 820}
820 821
821static int 822static int
822proc_write_lcd(struct file *file, const char __user * buffer, 823proc_write_lcd(struct file *file, const char __user *buffer,
823 unsigned long count, void *data) 824 unsigned long count, void *data)
824{ 825{
825 int rv, value; 826 int rv, value;
@@ -897,7 +898,7 @@ proc_read_brn(char *page, char **start, off_t off, int count, int *eof,
897} 898}
898 899
899static int 900static int
900proc_write_brn(struct file *file, const char __user * buffer, 901proc_write_brn(struct file *file, const char __user *buffer,
901 unsigned long count, void *data) 902 unsigned long count, void *data)
902{ 903{
903 int rv, value; 904 int rv, value;
@@ -921,7 +922,7 @@ static void set_display(int value)
921} 922}
922 923
923/* 924/*
924 * Now, *this* one could be more user-friendly, but so far, no-one has 925 * Now, *this* one could be more user-friendly, but so far, no-one has
925 * complained. The significance of bits is the same as in proc_write_disp() 926 * complained. The significance of bits is the same as in proc_write_disp()
926 */ 927 */
927static int 928static int
@@ -933,18 +934,18 @@ proc_read_disp(char *page, char **start, off_t off, int count, int *eof,
933 if (!read_acpi_int(hotk->handle, hotk->methods->display_get, &value)) 934 if (!read_acpi_int(hotk->handle, hotk->methods->display_get, &value))
934 printk(KERN_WARNING 935 printk(KERN_WARNING
935 "Asus ACPI: Error reading display status\n"); 936 "Asus ACPI: Error reading display status\n");
936 value &= 0x07; /* needed for some models, shouldn't hurt others */ 937 value &= 0x07; /* needed for some models, shouldn't hurt others */
937 return sprintf(page, "%d\n", value); 938 return sprintf(page, "%d\n", value);
938} 939}
939 940
940/* 941/*
941 * Experimental support for display switching. As of now: 1 should activate 942 * Experimental support for display switching. As of now: 1 should activate
942 * the LCD output, 2 should do for CRT, and 4 for TV-Out. Any combination 943 * the LCD output, 2 should do for CRT, and 4 for TV-Out. Any combination
943 * (bitwise) of these will suffice. I never actually tested 3 displays hooked up 944 * (bitwise) of these will suffice. I never actually tested 3 displays hooked
944 * simultaneously, so be warned. See the acpi4asus README for more info. 945 * up simultaneously, so be warned. See the acpi4asus README for more info.
945 */ 946 */
946static int 947static int
947proc_write_disp(struct file *file, const char __user * buffer, 948proc_write_disp(struct file *file, const char __user *buffer,
948 unsigned long count, void *data) 949 unsigned long count, void *data)
949{ 950{
950 int rv, value; 951 int rv, value;
@@ -957,12 +958,12 @@ proc_write_disp(struct file *file, const char __user * buffer,
957 958
958typedef int (proc_readfunc) (char *page, char **start, off_t off, int count, 959typedef int (proc_readfunc) (char *page, char **start, off_t off, int count,
959 int *eof, void *data); 960 int *eof, void *data);
960typedef int (proc_writefunc) (struct file * file, const char __user * buffer, 961typedef int (proc_writefunc) (struct file *file, const char __user *buffer,
961 unsigned long count, void *data); 962 unsigned long count, void *data);
962 963
963static int 964static int
964asus_proc_add(char *name, proc_writefunc * writefunc, 965asus_proc_add(char *name, proc_writefunc *writefunc,
965 proc_readfunc * readfunc, mode_t mode, 966 proc_readfunc *readfunc, mode_t mode,
966 struct acpi_device *device) 967 struct acpi_device *device)
967{ 968{
968 struct proc_dir_entry *proc = 969 struct proc_dir_entry *proc =
@@ -1040,9 +1041,9 @@ static int asus_hotk_add_fs(struct acpi_device *device)
1040 &proc_read_bluetooth, mode, device); 1041 &proc_read_bluetooth, mode, device);
1041 } 1042 }
1042 1043
1043 /* 1044 /*
1044 * We need both read node and write method as LCD switch is also accessible 1045 * We need both read node and write method as LCD switch is also
1045 * from keyboard 1046 * accessible from the keyboard
1046 */ 1047 */
1047 if (hotk->methods->mt_lcd_switch && hotk->methods->lcd_status) { 1048 if (hotk->methods->mt_lcd_switch && hotk->methods->lcd_status) {
1048 asus_proc_add(PROC_LCD, &proc_write_lcd, &proc_read_lcd, mode, 1049 asus_proc_add(PROC_LCD, &proc_write_lcd, &proc_read_lcd, mode,
@@ -1096,11 +1097,10 @@ static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)
1096 if (!hotk) 1097 if (!hotk)
1097 return; 1098 return;
1098 1099
1099 if ((event & ~((u32) BR_UP)) < 16) { 1100 if ((event & ~((u32) BR_UP)) < 16)
1100 hotk->brightness = (event & ~((u32) BR_UP)); 1101 hotk->brightness = (event & ~((u32) BR_UP));
1101 } else if ((event & ~((u32) BR_DOWN)) < 16) { 1102 else if ((event & ~((u32) BR_DOWN)) < 16)
1102 hotk->brightness = (event & ~((u32) BR_DOWN)); 1103 hotk->brightness = (event & ~((u32) BR_DOWN));
1103 }
1104 1104
1105 acpi_bus_generate_proc_event(hotk->device, event, 1105 acpi_bus_generate_proc_event(hotk->device, event,
1106 hotk->event_count[event % 128]++); 1106 hotk->event_count[event % 128]++);
@@ -1186,8 +1186,8 @@ static int asus_hotk_get_info(void)
1186 acpi_status status; 1186 acpi_status status;
1187 1187
1188 /* 1188 /*
1189 * Get DSDT headers early enough to allow for differentiating between 1189 * Get DSDT headers early enough to allow for differentiating between
1190 * models, but late enough to allow acpi_bus_register_driver() to fail 1190 * models, but late enough to allow acpi_bus_register_driver() to fail
1191 * before doing anything ACPI-specific. Should we encounter a machine, 1191 * before doing anything ACPI-specific. Should we encounter a machine,
1192 * which needs special handling (i.e. its hotkey device has a different 1192 * which needs special handling (i.e. its hotkey device has a different
1193 * HID), this bit will be moved. A global variable asus_info contains 1193 * HID), this bit will be moved. A global variable asus_info contains
@@ -1212,8 +1212,8 @@ static int asus_hotk_get_info(void)
1212 1212
1213 /* 1213 /*
1214 * Try to match the object returned by INIT to the specific model. 1214 * Try to match the object returned by INIT to the specific model.
1215 * Handle every possible object (or the lack of thereof) the DSDT 1215 * Handle every possible object (or the lack of thereof) the DSDT
1216 * writers might throw at us. When in trouble, we pass NULL to 1216 * writers might throw at us. When in trouble, we pass NULL to
1217 * asus_model_match() and try something completely different. 1217 * asus_model_match() and try something completely different.
1218 */ 1218 */
1219 if (buffer.pointer) { 1219 if (buffer.pointer) {
@@ -1244,6 +1244,8 @@ static int asus_hotk_get_info(void)
1244 "default values\n", string); 1244 "default values\n", string);
1245 printk(KERN_NOTICE 1245 printk(KERN_NOTICE
1246 " send /proc/acpi/dsdt to the developers\n"); 1246 " send /proc/acpi/dsdt to the developers\n");
1247 kfree(model);
1248 return -ENODEV;
1247 } 1249 }
1248 hotk->methods = &model_conf[hotk->model]; 1250 hotk->methods = &model_conf[hotk->model];
1249 return AE_OK; 1251 return AE_OK;
@@ -1254,7 +1256,7 @@ static int asus_hotk_get_info(void)
1254 /* Sort of per-model blacklist */ 1256 /* Sort of per-model blacklist */
1255 if (strncmp(string, "L2B", 3) == 0) 1257 if (strncmp(string, "L2B", 3) == 0)
1256 hotk->methods->lcd_status = NULL; 1258 hotk->methods->lcd_status = NULL;
1257 /* L2B is similar enough to L3C to use its settings, with this only 1259 /* L2B is similar enough to L3C to use its settings, with this only
1258 exception */ 1260 exception */
1259 else if (strncmp(string, "A3G", 3) == 0) 1261 else if (strncmp(string, "A3G", 3) == 0)
1260 hotk->methods->lcd_status = "\\BLFG"; 1262 hotk->methods->lcd_status = "\\BLFG";
@@ -1321,7 +1323,7 @@ static int asus_hotk_add(struct acpi_device *device)
1321 hotk->handle = device->handle; 1323 hotk->handle = device->handle;
1322 strcpy(acpi_device_name(device), ACPI_HOTK_DEVICE_NAME); 1324 strcpy(acpi_device_name(device), ACPI_HOTK_DEVICE_NAME);
1323 strcpy(acpi_device_class(device), ACPI_HOTK_CLASS); 1325 strcpy(acpi_device_class(device), ACPI_HOTK_CLASS);
1324 acpi_driver_data(device) = hotk; 1326 device->driver_data = hotk;
1325 hotk->device = device; 1327 hotk->device = device;
1326 1328
1327 result = asus_hotk_check(); 1329 result = asus_hotk_check();
@@ -1366,10 +1368,9 @@ static int asus_hotk_add(struct acpi_device *device)
1366 /* LED display is off by default */ 1368 /* LED display is off by default */
1367 hotk->ledd_status = 0xFFF; 1369 hotk->ledd_status = 0xFFF;
1368 1370
1369 end: 1371end:
1370 if (result) { 1372 if (result)
1371 kfree(hotk); 1373 kfree(hotk);
1372 }
1373 1374
1374 return result; 1375 return result;
1375} 1376}
@@ -1394,8 +1395,8 @@ static int asus_hotk_remove(struct acpi_device *device, int type)
1394} 1395}
1395 1396
1396static struct backlight_ops asus_backlight_data = { 1397static struct backlight_ops asus_backlight_data = {
1397 .get_brightness = read_brightness, 1398 .get_brightness = read_brightness,
1398 .update_status = set_brightness_status, 1399 .update_status = set_brightness_status,
1399}; 1400};
1400 1401
1401static void asus_acpi_exit(void) 1402static void asus_acpi_exit(void)
@@ -1442,15 +1443,15 @@ static int __init asus_acpi_init(void)
1442 return -ENODEV; 1443 return -ENODEV;
1443 } 1444 }
1444 1445
1445 asus_backlight_device = backlight_device_register("asus",NULL,NULL, 1446 asus_backlight_device = backlight_device_register("asus", NULL, NULL,
1446 &asus_backlight_data); 1447 &asus_backlight_data);
1447 if (IS_ERR(asus_backlight_device)) { 1448 if (IS_ERR(asus_backlight_device)) {
1448 printk(KERN_ERR "Could not register asus backlight device\n"); 1449 printk(KERN_ERR "Could not register asus backlight device\n");
1449 asus_backlight_device = NULL; 1450 asus_backlight_device = NULL;
1450 asus_acpi_exit(); 1451 asus_acpi_exit();
1451 return -ENODEV; 1452 return -ENODEV;
1452 } 1453 }
1453 asus_backlight_device->props.max_brightness = 15; 1454 asus_backlight_device->props.max_brightness = 15;
1454 1455
1455 return 0; 1456 return 0;
1456} 1457}
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index b1c723f9f58d..b2133e89ad9a 100644
--- a/drivers/acpi/battery.c
+++ b/drivers/acpi/battery.c
@@ -431,7 +431,7 @@ static ssize_t acpi_battery_alarm_store(struct device *dev,
431} 431}
432 432
433static struct device_attribute alarm_attr = { 433static struct device_attribute alarm_attr = {
434 .attr = {.name = "alarm", .mode = 0644, .owner = THIS_MODULE}, 434 .attr = {.name = "alarm", .mode = 0644},
435 .show = acpi_battery_alarm_show, 435 .show = acpi_battery_alarm_show,
436 .store = acpi_battery_alarm_store, 436 .store = acpi_battery_alarm_store,
437}; 437};
@@ -804,7 +804,7 @@ static int acpi_battery_add(struct acpi_device *device)
804 battery->device = device; 804 battery->device = device;
805 strcpy(acpi_device_name(device), ACPI_BATTERY_DEVICE_NAME); 805 strcpy(acpi_device_name(device), ACPI_BATTERY_DEVICE_NAME);
806 strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS); 806 strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS);
807 acpi_driver_data(device) = battery; 807 device->driver_data = battery;
808 mutex_init(&battery->lock); 808 mutex_init(&battery->lock);
809 acpi_battery_update(battery); 809 acpi_battery_update(battery);
810#ifdef CONFIG_ACPI_PROCFS_POWER 810#ifdef CONFIG_ACPI_PROCFS_POWER
diff --git a/drivers/acpi/bay.c b/drivers/acpi/bay.c
deleted file mode 100644
index e6caf5d42e0e..000000000000
--- a/drivers/acpi/bay.c
+++ /dev/null
@@ -1,414 +0,0 @@
1/*
2 * bay.c - ACPI removable drive bay driver
3 *
4 * Copyright (C) 2006 Kristen Carlson Accardi <kristen.c.accardi@intel.com>
5 *
6 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or (at
11 * your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
21 *
22 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23 */
24#include <linux/kernel.h>
25#include <linux/module.h>
26#include <linux/init.h>
27#include <linux/types.h>
28#include <linux/notifier.h>
29#include <acpi/acpi_bus.h>
30#include <acpi/acpi_drivers.h>
31#include <linux/seq_file.h>
32#include <asm/uaccess.h>
33#include <linux/platform_device.h>
34
35ACPI_MODULE_NAME("bay");
36MODULE_AUTHOR("Kristen Carlson Accardi");
37MODULE_DESCRIPTION("ACPI Removable Drive Bay Driver");
38MODULE_LICENSE("GPL");
39#define ACPI_BAY_CLASS "bay"
40#define ACPI_BAY_COMPONENT 0x10000000
41#define _COMPONENT ACPI_BAY_COMPONENT
42#define bay_dprintk(h,s) {\
43 char prefix[80] = {'\0'};\
44 struct acpi_buffer buffer = {sizeof(prefix), prefix};\
45 acpi_get_name(h, ACPI_FULL_PATHNAME, &buffer);\
46 printk(KERN_DEBUG PREFIX "%s: %s\n", prefix, s); }
47static void bay_notify(acpi_handle handle, u32 event, void *data);
48
49static const struct acpi_device_id bay_device_ids[] = {
50 {"LNXIOBAY", 0},
51 {"", 0},
52};
53MODULE_DEVICE_TABLE(acpi, bay_device_ids);
54
55struct bay {
56 acpi_handle handle;
57 char *name;
58 struct list_head list;
59 struct platform_device *pdev;
60};
61
62static LIST_HEAD(drive_bays);
63
64
65/*****************************************************************************
66 * Drive Bay functions *
67 *****************************************************************************/
68/**
69 * is_ejectable - see if a device is ejectable
70 * @handle: acpi handle of the device
71 *
72 * If an acpi object has a _EJ0 method, then it is ejectable
73 */
74static int is_ejectable(acpi_handle handle)
75{
76 acpi_status status;
77 acpi_handle tmp;
78
79 status = acpi_get_handle(handle, "_EJ0", &tmp);
80 if (ACPI_FAILURE(status))
81 return 0;
82 return 1;
83}
84
85/**
86 * bay_present - see if the bay device is present
87 * @bay: the drive bay
88 *
89 * execute the _STA method.
90 */
91static int bay_present(struct bay *bay)
92{
93 unsigned long sta;
94 acpi_status status;
95
96 if (bay) {
97 status = acpi_evaluate_integer(bay->handle, "_STA", NULL, &sta);
98 if (ACPI_SUCCESS(status) && sta)
99 return 1;
100 }
101 return 0;
102}
103
104/**
105 * eject_device - respond to an eject request
106 * @handle - the device to eject
107 *
108 * Call this devices _EJ0 method.
109 */
110static void eject_device(acpi_handle handle)
111{
112 struct acpi_object_list arg_list;
113 union acpi_object arg;
114
115 bay_dprintk(handle, "Ejecting device");
116
117 arg_list.count = 1;
118 arg_list.pointer = &arg;
119 arg.type = ACPI_TYPE_INTEGER;
120 arg.integer.value = 1;
121
122 if (ACPI_FAILURE(acpi_evaluate_object(handle, "_EJ0",
123 &arg_list, NULL)))
124 pr_debug("Failed to evaluate _EJ0!\n");
125}
126
127/*
128 * show_present - read method for "present" file in sysfs
129 */
130static ssize_t show_present(struct device *dev,
131 struct device_attribute *attr, char *buf)
132{
133 struct bay *bay = dev_get_drvdata(dev);
134 return snprintf(buf, PAGE_SIZE, "%d\n", bay_present(bay));
135
136}
137static DEVICE_ATTR(present, S_IRUGO, show_present, NULL);
138
139/*
140 * write_eject - write method for "eject" file in sysfs
141 */
142static ssize_t write_eject(struct device *dev, struct device_attribute *attr,
143 const char *buf, size_t count)
144{
145 struct bay *bay = dev_get_drvdata(dev);
146
147 if (!count)
148 return -EINVAL;
149
150 eject_device(bay->handle);
151 return count;
152}
153static DEVICE_ATTR(eject, S_IWUSR, NULL, write_eject);
154
155/**
156 * is_ata - see if a device is an ata device
157 * @handle: acpi handle of the device
158 *
159 * If an acpi object has one of 4 ATA ACPI methods defined,
160 * then it is an ATA device
161 */
162static int is_ata(acpi_handle handle)
163{
164 acpi_handle tmp;
165
166 if ((ACPI_SUCCESS(acpi_get_handle(handle, "_GTF", &tmp))) ||
167 (ACPI_SUCCESS(acpi_get_handle(handle, "_GTM", &tmp))) ||
168 (ACPI_SUCCESS(acpi_get_handle(handle, "_STM", &tmp))) ||
169 (ACPI_SUCCESS(acpi_get_handle(handle, "_SDD", &tmp))))
170 return 1;
171
172 return 0;
173}
174
175/**
176 * parent_is_ata(acpi_handle handle)
177 *
178 */
179static int parent_is_ata(acpi_handle handle)
180{
181 acpi_handle phandle;
182
183 if (acpi_get_parent(handle, &phandle))
184 return 0;
185
186 return is_ata(phandle);
187}
188
189/**
190 * is_ejectable_bay - see if a device is an ejectable drive bay
191 * @handle: acpi handle of the device
192 *
193 * If an acpi object is ejectable and has one of the ACPI ATA
194 * methods defined, then we can safely call it an ejectable
195 * drive bay
196 */
197static int is_ejectable_bay(acpi_handle handle)
198{
199 if ((is_ata(handle) || parent_is_ata(handle)) && is_ejectable(handle))
200 return 1;
201 return 0;
202}
203
204#if 0
205/**
206 * eject_removable_drive - try to eject this drive
207 * @dev : the device structure of the drive
208 *
209 * If a device is a removable drive that requires an _EJ0 method
210 * to be executed in order to safely remove from the system, do
211 * it. ATM - always returns success
212 */
213int eject_removable_drive(struct device *dev)
214{
215 acpi_handle handle = DEVICE_ACPI_HANDLE(dev);
216
217 if (handle) {
218 bay_dprintk(handle, "Got device handle");
219 if (is_ejectable_bay(handle))
220 eject_device(handle);
221 } else {
222 printk("No acpi handle for device\n");
223 }
224
225 /* should I return an error code? */
226 return 0;
227}
228EXPORT_SYMBOL_GPL(eject_removable_drive);
229#endif /* 0 */
230
231static int acpi_bay_add_fs(struct bay *bay)
232{
233 int ret;
234 struct device *dev = &bay->pdev->dev;
235
236 ret = device_create_file(dev, &dev_attr_present);
237 if (ret)
238 goto add_fs_err;
239 ret = device_create_file(dev, &dev_attr_eject);
240 if (ret) {
241 device_remove_file(dev, &dev_attr_present);
242 goto add_fs_err;
243 }
244 return 0;
245
246 add_fs_err:
247 bay_dprintk(bay->handle, "Error adding sysfs files\n");
248 return ret;
249}
250
251static void acpi_bay_remove_fs(struct bay *bay)
252{
253 struct device *dev = &bay->pdev->dev;
254
255 /* cleanup sysfs */
256 device_remove_file(dev, &dev_attr_present);
257 device_remove_file(dev, &dev_attr_eject);
258}
259
260static int bay_is_dock_device(acpi_handle handle)
261{
262 acpi_handle parent;
263
264 acpi_get_parent(handle, &parent);
265
266 /* if the device or it's parent is dependent on the
267 * dock, then we are a dock device
268 */
269 return (is_dock_device(handle) || is_dock_device(parent));
270}
271
272static int bay_add(acpi_handle handle, int id)
273{
274 acpi_status status;
275 struct bay *new_bay;
276 struct platform_device *pdev;
277 struct acpi_buffer nbuffer = {ACPI_ALLOCATE_BUFFER, NULL};
278 acpi_get_name(handle, ACPI_FULL_PATHNAME, &nbuffer);
279
280 bay_dprintk(handle, "Adding notify handler");
281
282 /*
283 * Initialize bay device structure
284 */
285 new_bay = kzalloc(sizeof(*new_bay), GFP_ATOMIC);
286 INIT_LIST_HEAD(&new_bay->list);
287 new_bay->handle = handle;
288 new_bay->name = (char *)nbuffer.pointer;
289
290 /* initialize platform device stuff */
291 pdev = platform_device_register_simple(ACPI_BAY_CLASS, id, NULL, 0);
292 if (IS_ERR(pdev)) {
293 printk(KERN_ERR PREFIX "Error registering bay device\n");
294 goto bay_add_err;
295 }
296 new_bay->pdev = pdev;
297 platform_set_drvdata(pdev, new_bay);
298
299 /*
300 * we want the bay driver to be able to send uevents
301 */
302 pdev->dev.uevent_suppress = 0;
303
304 /* register for events on this device */
305 status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
306 bay_notify, new_bay);
307 if (ACPI_FAILURE(status)) {
308 printk(KERN_INFO PREFIX "Error installing bay notify handler\n");
309 platform_device_unregister(new_bay->pdev);
310 goto bay_add_err;
311 }
312
313 if (acpi_bay_add_fs(new_bay)) {
314 acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
315 bay_notify);
316 platform_device_unregister(new_bay->pdev);
317 goto bay_add_err;
318 }
319
320 /* if we are on a dock station, we should register for dock
321 * notifications.
322 */
323 if (bay_is_dock_device(handle)) {
324 bay_dprintk(handle, "Is dependent on dock\n");
325 register_hotplug_dock_device(handle, bay_notify, new_bay);
326 }
327 list_add(&new_bay->list, &drive_bays);
328 printk(KERN_INFO PREFIX "Bay [%s] Added\n", new_bay->name);
329 return 0;
330
331bay_add_err:
332 kfree(new_bay->name);
333 kfree(new_bay);
334 return -ENODEV;
335}
336
337/**
338 * bay_notify - act upon an acpi bay notification
339 * @handle: the bay handle
340 * @event: the acpi event
341 * @data: our driver data struct
342 *
343 */
344static void bay_notify(acpi_handle handle, u32 event, void *data)
345{
346 struct bay *bay_dev = (struct bay *)data;
347 struct device *dev = &bay_dev->pdev->dev;
348 char event_string[12];
349 char *envp[] = { event_string, NULL };
350
351 bay_dprintk(handle, "Bay event");
352 sprintf(event_string, "BAY_EVENT=%d", event);
353 kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp);
354}
355
356static acpi_status
357find_bay(acpi_handle handle, u32 lvl, void *context, void **rv)
358{
359 int *count = (int *)context;
360
361 /*
362 * there could be more than one ejectable bay.
363 * so, just return AE_OK always so that every object
364 * will be checked.
365 */
366 if (is_ejectable_bay(handle)) {
367 bay_dprintk(handle, "found ejectable bay");
368 if (!bay_add(handle, *count))
369 (*count)++;
370 }
371 return AE_OK;
372}
373
374static int __init bay_init(void)
375{
376 int bays = 0;
377
378 INIT_LIST_HEAD(&drive_bays);
379
380 if (acpi_disabled)
381 return -ENODEV;
382
383 if (acpi_disabled)
384 return -ENODEV;
385
386 /* look for dockable drive bays */
387 acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
388 ACPI_UINT32_MAX, find_bay, &bays, NULL);
389
390 if (!bays)
391 return -ENODEV;
392
393 return 0;
394}
395
396static void __exit bay_exit(void)
397{
398 struct bay *bay, *tmp;
399
400 list_for_each_entry_safe(bay, tmp, &drive_bays, list) {
401 if (is_dock_device(bay->handle))
402 unregister_hotplug_dock_device(bay->handle);
403 acpi_bay_remove_fs(bay);
404 acpi_remove_notify_handler(bay->handle, ACPI_SYSTEM_NOTIFY,
405 bay_notify);
406 platform_device_unregister(bay->pdev);
407 kfree(bay->name);
408 kfree(bay);
409 }
410}
411
412postcore_initcall(bay_init);
413module_exit(bay_exit);
414
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
index ccae305ee55d..c797c6473f31 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -48,6 +48,23 @@ EXPORT_SYMBOL(acpi_root_dir);
48 48
49#define STRUCT_TO_INT(s) (*((int*)&s)) 49#define STRUCT_TO_INT(s) (*((int*)&s))
50 50
51static int set_power_nocheck(const struct dmi_system_id *id)
52{
53 printk(KERN_NOTICE PREFIX "%s detected - "
54 "disable power check in power transistion\n", id->ident);
55 acpi_power_nocheck = 1;
56 return 0;
57}
58static struct dmi_system_id __cpuinitdata power_nocheck_dmi_table[] = {
59 {
60 set_power_nocheck, "HP Pavilion 05", {
61 DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
62 DMI_MATCH(DMI_SYS_VENDOR, "HP Pavilion 05"),
63 DMI_MATCH(DMI_PRODUCT_VERSION, "2001211RE101GLEND") }, NULL},
64 {},
65};
66
67
51/* -------------------------------------------------------------------------- 68/* --------------------------------------------------------------------------
52 Device Management 69 Device Management
53 -------------------------------------------------------------------------- */ 70 -------------------------------------------------------------------------- */
@@ -77,7 +94,7 @@ EXPORT_SYMBOL(acpi_bus_get_device);
77int acpi_bus_get_status(struct acpi_device *device) 94int acpi_bus_get_status(struct acpi_device *device)
78{ 95{
79 acpi_status status = AE_OK; 96 acpi_status status = AE_OK;
80 unsigned long sta = 0; 97 unsigned long long sta = 0;
81 98
82 99
83 if (!device) 100 if (!device)
@@ -95,21 +112,21 @@ int acpi_bus_get_status(struct acpi_device *device)
95 } 112 }
96 113
97 /* 114 /*
98 * Otherwise we assume the status of our parent (unless we don't 115 * According to ACPI spec some device can be present and functional
99 * have one, in which case status is implied). 116 * even if the parent is not present but functional.
117 * In such conditions the child device should not inherit the status
118 * from the parent.
100 */ 119 */
101 else if (device->parent)
102 device->status = device->parent->status;
103 else 120 else
104 STRUCT_TO_INT(device->status) = 121 STRUCT_TO_INT(device->status) =
105 ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED | 122 ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED |
106 ACPI_STA_DEVICE_UI | ACPI_STA_DEVICE_FUNCTIONING; 123 ACPI_STA_DEVICE_UI | ACPI_STA_DEVICE_FUNCTIONING;
107 124
108 if (device->status.functional && !device->status.present) { 125 if (device->status.functional && !device->status.present) {
109 printk(KERN_WARNING PREFIX "Device [%s] status [%08x]: " 126 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]: "
110 "functional but not present; setting present\n", 127 "functional but not present;\n",
111 device->pnp.bus_id, (u32) STRUCT_TO_INT(device->status)); 128 device->pnp.bus_id,
112 device->status.present = 1; 129 (u32) STRUCT_TO_INT(device->status)));
113 } 130 }
114 131
115 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]\n", 132 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]\n",
@@ -155,7 +172,7 @@ int acpi_bus_get_power(acpi_handle handle, int *state)
155 int result = 0; 172 int result = 0;
156 acpi_status status = 0; 173 acpi_status status = 0;
157 struct acpi_device *device = NULL; 174 struct acpi_device *device = NULL;
158 unsigned long psc = 0; 175 unsigned long long psc = 0;
159 176
160 177
161 result = acpi_bus_get_device(handle, &device); 178 result = acpi_bus_get_device(handle, &device);
@@ -223,7 +240,19 @@ int acpi_bus_set_power(acpi_handle handle, int state)
223 /* 240 /*
224 * Get device's current power state 241 * Get device's current power state
225 */ 242 */
226 acpi_bus_get_power(device->handle, &device->power.state); 243 if (!acpi_power_nocheck) {
244 /*
245 * Maybe the incorrect power state is returned on the bogus
246 * bios, which is different with the real power state.
247 * For example: the bios returns D0 state and the real power
248 * state is D3. OS expects to set the device to D0 state. In
249 * such case if OS uses the power state returned by the BIOS,
250 * the device can't be transisted to the correct power state.
251 * So if the acpi_power_nocheck is set, it is unnecessary to
252 * get the power state by calling acpi_bus_get_power.
253 */
254 acpi_bus_get_power(device->handle, &device->power.state);
255 }
227 if ((state == device->power.state) && !device->flags.force_power_state) { 256 if ((state == device->power.state) && !device->flags.force_power_state) {
228 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n", 257 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n",
229 state)); 258 state));
@@ -496,6 +525,19 @@ static int acpi_bus_check_scope(struct acpi_device *device)
496 return 0; 525 return 0;
497} 526}
498 527
528static BLOCKING_NOTIFIER_HEAD(acpi_bus_notify_list);
529int register_acpi_bus_notifier(struct notifier_block *nb)
530{
531 return blocking_notifier_chain_register(&acpi_bus_notify_list, nb);
532}
533EXPORT_SYMBOL_GPL(register_acpi_bus_notifier);
534
535void unregister_acpi_bus_notifier(struct notifier_block *nb)
536{
537 blocking_notifier_chain_unregister(&acpi_bus_notify_list, nb);
538}
539EXPORT_SYMBOL_GPL(unregister_acpi_bus_notifier);
540
499/** 541/**
500 * acpi_bus_notify 542 * acpi_bus_notify
501 * --------------- 543 * ---------------
@@ -506,6 +548,8 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
506 int result = 0; 548 int result = 0;
507 struct acpi_device *device = NULL; 549 struct acpi_device *device = NULL;
508 550
551 blocking_notifier_call_chain(&acpi_bus_notify_list,
552 type, (void *)handle);
509 553
510 if (acpi_bus_get_device(handle, &device)) 554 if (acpi_bus_get_device(handle, &device))
511 return; 555 return;
@@ -749,6 +793,12 @@ static int __init acpi_bus_init(void)
749 goto error1; 793 goto error1;
750 } 794 }
751 795
796 /*
797 * Maybe EC region is required at bus_scan/acpi_get_devices. So it
798 * is necessary to enable it as early as possible.
799 */
800 acpi_boot_ec_enable();
801
752 printk(KERN_INFO PREFIX "Interpreter enabled\n"); 802 printk(KERN_INFO PREFIX "Interpreter enabled\n");
753 803
754 /* Initialize sleep structures */ 804 /* Initialize sleep structures */
@@ -818,7 +868,11 @@ static int __init acpi_init(void)
818 } 868 }
819 } else 869 } else
820 disable_acpi(); 870 disable_acpi();
821 871 /*
872 * If the laptop falls into the DMI check table, the power state check
873 * will be disabled in the course of device power transistion.
874 */
875 dmi_check_system(power_nocheck_dmi_table);
822 return result; 876 return result;
823} 877}
824 878
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
index 1dfec413588c..9d568d417eaa 100644
--- a/drivers/acpi/button.c
+++ b/drivers/acpi/button.c
@@ -145,7 +145,7 @@ static int acpi_button_state_seq_show(struct seq_file *seq, void *offset)
145{ 145{
146 struct acpi_button *button = seq->private; 146 struct acpi_button *button = seq->private;
147 acpi_status status; 147 acpi_status status;
148 unsigned long state; 148 unsigned long long state;
149 149
150 if (!button || !button->device) 150 if (!button || !button->device)
151 return 0; 151 return 0;
@@ -253,7 +253,7 @@ static int acpi_button_remove_fs(struct acpi_device *device)
253 -------------------------------------------------------------------------- */ 253 -------------------------------------------------------------------------- */
254static int acpi_lid_send_state(struct acpi_button *button) 254static int acpi_lid_send_state(struct acpi_button *button)
255{ 255{
256 unsigned long state; 256 unsigned long long state;
257 acpi_status status; 257 acpi_status status;
258 258
259 status = acpi_evaluate_integer(button->device->handle, "_LID", NULL, 259 status = acpi_evaluate_integer(button->device->handle, "_LID", NULL,
@@ -384,7 +384,7 @@ static int acpi_button_add(struct acpi_device *device)
384 return -ENOMEM; 384 return -ENOMEM;
385 385
386 button->device = device; 386 button->device = device;
387 acpi_driver_data(device) = button; 387 device->driver_data = button;
388 388
389 button->input = input = input_allocate_device(); 389 button->input = input = input_allocate_device();
390 if (!input) { 390 if (!input) {
diff --git a/drivers/acpi/cm_sbs.c b/drivers/acpi/cm_sbs.c
index f9db4f444bd0..4441e84b28a9 100644
--- a/drivers/acpi/cm_sbs.c
+++ b/drivers/acpi/cm_sbs.c
@@ -52,8 +52,8 @@ struct proc_dir_entry *acpi_lock_ac_dir(void)
52 if (acpi_ac_dir) { 52 if (acpi_ac_dir) {
53 lock_ac_dir_cnt++; 53 lock_ac_dir_cnt++;
54 } else { 54 } else {
55 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 55 printk(KERN_ERR PREFIX
56 "Cannot create %s\n", ACPI_AC_CLASS)); 56 "Cannot create %s\n", ACPI_AC_CLASS);
57 } 57 }
58 mutex_unlock(&cm_sbs_mutex); 58 mutex_unlock(&cm_sbs_mutex);
59 return acpi_ac_dir; 59 return acpi_ac_dir;
@@ -83,8 +83,8 @@ struct proc_dir_entry *acpi_lock_battery_dir(void)
83 if (acpi_battery_dir) { 83 if (acpi_battery_dir) {
84 lock_battery_dir_cnt++; 84 lock_battery_dir_cnt++;
85 } else { 85 } else {
86 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 86 printk(KERN_ERR PREFIX
87 "Cannot create %s\n", ACPI_BATTERY_CLASS)); 87 "Cannot create %s\n", ACPI_BATTERY_CLASS);
88 } 88 }
89 mutex_unlock(&cm_sbs_mutex); 89 mutex_unlock(&cm_sbs_mutex);
90 return acpi_battery_dir; 90 return acpi_battery_dir;
diff --git a/drivers/acpi/container.c b/drivers/acpi/container.c
index 3c25ec7a1871..134818b265a9 100644
--- a/drivers/acpi/container.c
+++ b/drivers/acpi/container.c
@@ -76,7 +76,7 @@ static int is_device_present(acpi_handle handle)
76{ 76{
77 acpi_handle temp; 77 acpi_handle temp;
78 acpi_status status; 78 acpi_status status;
79 unsigned long sta; 79 unsigned long long sta;
80 80
81 81
82 status = acpi_get_handle(handle, "_STA", &temp); 82 status = acpi_get_handle(handle, "_STA", &temp);
@@ -108,7 +108,7 @@ static int acpi_container_add(struct acpi_device *device)
108 container->handle = device->handle; 108 container->handle = device->handle;
109 strcpy(acpi_device_name(device), ACPI_CONTAINER_DEVICE_NAME); 109 strcpy(acpi_device_name(device), ACPI_CONTAINER_DEVICE_NAME);
110 strcpy(acpi_device_class(device), ACPI_CONTAINER_CLASS); 110 strcpy(acpi_device_class(device), ACPI_CONTAINER_CLASS);
111 acpi_driver_data(device) = container; 111 device->driver_data = container;
112 112
113 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device <%s> bid <%s>\n", 113 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device <%s> bid <%s>\n",
114 acpi_device_name(device), acpi_device_bid(device))); 114 acpi_device_name(device), acpi_device_bid(device)));
diff --git a/drivers/acpi/debug.c b/drivers/acpi/debug.c
index 6df564f4ca6e..abf36b4b1d1d 100644
--- a/drivers/acpi/debug.c
+++ b/drivers/acpi/debug.c
@@ -47,8 +47,6 @@ static const struct acpi_dlayer acpi_debug_layers[] = {
47}; 47};
48 48
49static const struct acpi_dlevel acpi_debug_levels[] = { 49static const struct acpi_dlevel acpi_debug_levels[] = {
50 ACPI_DEBUG_INIT(ACPI_LV_ERROR),
51 ACPI_DEBUG_INIT(ACPI_LV_WARN),
52 ACPI_DEBUG_INIT(ACPI_LV_INIT), 50 ACPI_DEBUG_INIT(ACPI_LV_INIT),
53 ACPI_DEBUG_INIT(ACPI_LV_DEBUG_OBJECT), 51 ACPI_DEBUG_INIT(ACPI_LV_DEBUG_OBJECT),
54 ACPI_DEBUG_INIT(ACPI_LV_INFO), 52 ACPI_DEBUG_INIT(ACPI_LV_INFO),
diff --git a/drivers/acpi/dispatcher/dsmethod.c b/drivers/acpi/dispatcher/dsmethod.c
index 4613b9ca5792..279a5a60a0dd 100644
--- a/drivers/acpi/dispatcher/dsmethod.c
+++ b/drivers/acpi/dispatcher/dsmethod.c
@@ -103,6 +103,9 @@ acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state)
103 NULL); 103 NULL);
104 acpi_ex_enter_interpreter(); 104 acpi_ex_enter_interpreter();
105 } 105 }
106
107 acpi_ds_clear_implicit_return(walk_state);
108
106#ifdef ACPI_DISASSEMBLER 109#ifdef ACPI_DISASSEMBLER
107 if (ACPI_FAILURE(status)) { 110 if (ACPI_FAILURE(status)) {
108 111
diff --git a/drivers/acpi/dispatcher/dsmthdat.c b/drivers/acpi/dispatcher/dsmthdat.c
index 13c43eac35db..d03f81bd1bcb 100644
--- a/drivers/acpi/dispatcher/dsmthdat.c
+++ b/drivers/acpi/dispatcher/dsmthdat.c
@@ -43,7 +43,6 @@
43 43
44#include <acpi/acpi.h> 44#include <acpi/acpi.h>
45#include <acpi/acdispat.h> 45#include <acpi/acdispat.h>
46#include <acpi/amlcode.h>
47#include <acpi/acnamesp.h> 46#include <acpi/acnamesp.h>
48#include <acpi/acinterp.h> 47#include <acpi/acinterp.h>
49 48
@@ -52,11 +51,11 @@ ACPI_MODULE_NAME("dsmthdat")
52 51
53/* Local prototypes */ 52/* Local prototypes */
54static void 53static void
55acpi_ds_method_data_delete_value(u16 opcode, 54acpi_ds_method_data_delete_value(u8 type,
56 u32 index, struct acpi_walk_state *walk_state); 55 u32 index, struct acpi_walk_state *walk_state);
57 56
58static acpi_status 57static acpi_status
59acpi_ds_method_data_set_value(u16 opcode, 58acpi_ds_method_data_set_value(u8 type,
60 u32 index, 59 u32 index,
61 union acpi_operand_object *object, 60 union acpi_operand_object *object,
62 struct acpi_walk_state *walk_state); 61 struct acpi_walk_state *walk_state);
@@ -216,7 +215,7 @@ acpi_ds_method_data_init_args(union acpi_operand_object **params,
216 * Store the argument in the method/walk descriptor. 215 * Store the argument in the method/walk descriptor.
217 * Do not copy the arg in order to implement call by reference 216 * Do not copy the arg in order to implement call by reference
218 */ 217 */
219 status = acpi_ds_method_data_set_value(AML_ARG_OP, index, 218 status = acpi_ds_method_data_set_value(ACPI_REFCLASS_ARG, index,
220 params[index], 219 params[index],
221 walk_state); 220 walk_state);
222 if (ACPI_FAILURE(status)) { 221 if (ACPI_FAILURE(status)) {
@@ -234,7 +233,8 @@ acpi_ds_method_data_init_args(union acpi_operand_object **params,
234 * 233 *
235 * FUNCTION: acpi_ds_method_data_get_node 234 * FUNCTION: acpi_ds_method_data_get_node
236 * 235 *
237 * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP 236 * PARAMETERS: Type - Either ACPI_REFCLASS_LOCAL or
237 * ACPI_REFCLASS_ARG
238 * Index - Which Local or Arg whose type to get 238 * Index - Which Local or Arg whose type to get
239 * walk_state - Current walk state object 239 * walk_state - Current walk state object
240 * Node - Where the node is returned. 240 * Node - Where the node is returned.
@@ -246,7 +246,7 @@ acpi_ds_method_data_init_args(union acpi_operand_object **params,
246 ******************************************************************************/ 246 ******************************************************************************/
247 247
248acpi_status 248acpi_status
249acpi_ds_method_data_get_node(u16 opcode, 249acpi_ds_method_data_get_node(u8 type,
250 u32 index, 250 u32 index,
251 struct acpi_walk_state *walk_state, 251 struct acpi_walk_state *walk_state,
252 struct acpi_namespace_node **node) 252 struct acpi_namespace_node **node)
@@ -256,8 +256,8 @@ acpi_ds_method_data_get_node(u16 opcode,
256 /* 256 /*
257 * Method Locals and Arguments are supported 257 * Method Locals and Arguments are supported
258 */ 258 */
259 switch (opcode) { 259 switch (type) {
260 case AML_LOCAL_OP: 260 case ACPI_REFCLASS_LOCAL:
261 261
262 if (index > ACPI_METHOD_MAX_LOCAL) { 262 if (index > ACPI_METHOD_MAX_LOCAL) {
263 ACPI_ERROR((AE_INFO, 263 ACPI_ERROR((AE_INFO,
@@ -271,7 +271,7 @@ acpi_ds_method_data_get_node(u16 opcode,
271 *node = &walk_state->local_variables[index]; 271 *node = &walk_state->local_variables[index];
272 break; 272 break;
273 273
274 case AML_ARG_OP: 274 case ACPI_REFCLASS_ARG:
275 275
276 if (index > ACPI_METHOD_MAX_ARG) { 276 if (index > ACPI_METHOD_MAX_ARG) {
277 ACPI_ERROR((AE_INFO, 277 ACPI_ERROR((AE_INFO,
@@ -286,8 +286,8 @@ acpi_ds_method_data_get_node(u16 opcode,
286 break; 286 break;
287 287
288 default: 288 default:
289 ACPI_ERROR((AE_INFO, "Opcode %d is invalid", opcode)); 289 ACPI_ERROR((AE_INFO, "Type %d is invalid", type));
290 return_ACPI_STATUS(AE_AML_BAD_OPCODE); 290 return_ACPI_STATUS(AE_TYPE);
291 } 291 }
292 292
293 return_ACPI_STATUS(AE_OK); 293 return_ACPI_STATUS(AE_OK);
@@ -297,7 +297,8 @@ acpi_ds_method_data_get_node(u16 opcode,
297 * 297 *
298 * FUNCTION: acpi_ds_method_data_set_value 298 * FUNCTION: acpi_ds_method_data_set_value
299 * 299 *
300 * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP 300 * PARAMETERS: Type - Either ACPI_REFCLASS_LOCAL or
301 * ACPI_REFCLASS_ARG
301 * Index - Which Local or Arg to get 302 * Index - Which Local or Arg to get
302 * Object - Object to be inserted into the stack entry 303 * Object - Object to be inserted into the stack entry
303 * walk_state - Current walk state object 304 * walk_state - Current walk state object
@@ -310,7 +311,7 @@ acpi_ds_method_data_get_node(u16 opcode,
310 ******************************************************************************/ 311 ******************************************************************************/
311 312
312static acpi_status 313static acpi_status
313acpi_ds_method_data_set_value(u16 opcode, 314acpi_ds_method_data_set_value(u8 type,
314 u32 index, 315 u32 index,
315 union acpi_operand_object *object, 316 union acpi_operand_object *object,
316 struct acpi_walk_state *walk_state) 317 struct acpi_walk_state *walk_state)
@@ -321,13 +322,13 @@ acpi_ds_method_data_set_value(u16 opcode,
321 ACPI_FUNCTION_TRACE(ds_method_data_set_value); 322 ACPI_FUNCTION_TRACE(ds_method_data_set_value);
322 323
323 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 324 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
324 "NewObj %p Opcode %X, Refs=%d [%s]\n", object, 325 "NewObj %p Type %2.2X, Refs=%d [%s]\n", object,
325 opcode, object->common.reference_count, 326 type, object->common.reference_count,
326 acpi_ut_get_type_name(object->common.type))); 327 acpi_ut_get_type_name(object->common.type)));
327 328
328 /* Get the namespace node for the arg/local */ 329 /* Get the namespace node for the arg/local */
329 330
330 status = acpi_ds_method_data_get_node(opcode, index, walk_state, &node); 331 status = acpi_ds_method_data_get_node(type, index, walk_state, &node);
331 if (ACPI_FAILURE(status)) { 332 if (ACPI_FAILURE(status)) {
332 return_ACPI_STATUS(status); 333 return_ACPI_STATUS(status);
333 } 334 }
@@ -350,7 +351,8 @@ acpi_ds_method_data_set_value(u16 opcode,
350 * 351 *
351 * FUNCTION: acpi_ds_method_data_get_value 352 * FUNCTION: acpi_ds_method_data_get_value
352 * 353 *
353 * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP 354 * PARAMETERS: Type - Either ACPI_REFCLASS_LOCAL or
355 * ACPI_REFCLASS_ARG
354 * Index - Which local_var or argument to get 356 * Index - Which local_var or argument to get
355 * walk_state - Current walk state object 357 * walk_state - Current walk state object
356 * dest_desc - Where Arg or Local value is returned 358 * dest_desc - Where Arg or Local value is returned
@@ -363,7 +365,7 @@ acpi_ds_method_data_set_value(u16 opcode,
363 ******************************************************************************/ 365 ******************************************************************************/
364 366
365acpi_status 367acpi_status
366acpi_ds_method_data_get_value(u16 opcode, 368acpi_ds_method_data_get_value(u8 type,
367 u32 index, 369 u32 index,
368 struct acpi_walk_state *walk_state, 370 struct acpi_walk_state *walk_state,
369 union acpi_operand_object **dest_desc) 371 union acpi_operand_object **dest_desc)
@@ -383,7 +385,7 @@ acpi_ds_method_data_get_value(u16 opcode,
383 385
384 /* Get the namespace node for the arg/local */ 386 /* Get the namespace node for the arg/local */
385 387
386 status = acpi_ds_method_data_get_node(opcode, index, walk_state, &node); 388 status = acpi_ds_method_data_get_node(type, index, walk_state, &node);
387 if (ACPI_FAILURE(status)) { 389 if (ACPI_FAILURE(status)) {
388 return_ACPI_STATUS(status); 390 return_ACPI_STATUS(status);
389 } 391 }
@@ -419,8 +421,8 @@ acpi_ds_method_data_get_value(u16 opcode,
419 /* Otherwise, return the error */ 421 /* Otherwise, return the error */
420 422
421 else 423 else
422 switch (opcode) { 424 switch (type) {
423 case AML_ARG_OP: 425 case ACPI_REFCLASS_ARG:
424 426
425 ACPI_ERROR((AE_INFO, 427 ACPI_ERROR((AE_INFO,
426 "Uninitialized Arg[%d] at node %p", 428 "Uninitialized Arg[%d] at node %p",
@@ -428,7 +430,7 @@ acpi_ds_method_data_get_value(u16 opcode,
428 430
429 return_ACPI_STATUS(AE_AML_UNINITIALIZED_ARG); 431 return_ACPI_STATUS(AE_AML_UNINITIALIZED_ARG);
430 432
431 case AML_LOCAL_OP: 433 case ACPI_REFCLASS_LOCAL:
432 434
433 ACPI_ERROR((AE_INFO, 435 ACPI_ERROR((AE_INFO,
434 "Uninitialized Local[%d] at node %p", 436 "Uninitialized Local[%d] at node %p",
@@ -437,9 +439,10 @@ acpi_ds_method_data_get_value(u16 opcode,
437 return_ACPI_STATUS(AE_AML_UNINITIALIZED_LOCAL); 439 return_ACPI_STATUS(AE_AML_UNINITIALIZED_LOCAL);
438 440
439 default: 441 default:
442
440 ACPI_ERROR((AE_INFO, 443 ACPI_ERROR((AE_INFO,
441 "Not a Arg/Local opcode: %X", 444 "Not a Arg/Local opcode: %X",
442 opcode)); 445 type));
443 return_ACPI_STATUS(AE_AML_INTERNAL); 446 return_ACPI_STATUS(AE_AML_INTERNAL);
444 } 447 }
445 } 448 }
@@ -458,7 +461,8 @@ acpi_ds_method_data_get_value(u16 opcode,
458 * 461 *
459 * FUNCTION: acpi_ds_method_data_delete_value 462 * FUNCTION: acpi_ds_method_data_delete_value
460 * 463 *
461 * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP 464 * PARAMETERS: Type - Either ACPI_REFCLASS_LOCAL or
465 * ACPI_REFCLASS_ARG
462 * Index - Which local_var or argument to delete 466 * Index - Which local_var or argument to delete
463 * walk_state - Current walk state object 467 * walk_state - Current walk state object
464 * 468 *
@@ -470,7 +474,7 @@ acpi_ds_method_data_get_value(u16 opcode,
470 ******************************************************************************/ 474 ******************************************************************************/
471 475
472static void 476static void
473acpi_ds_method_data_delete_value(u16 opcode, 477acpi_ds_method_data_delete_value(u8 type,
474 u32 index, struct acpi_walk_state *walk_state) 478 u32 index, struct acpi_walk_state *walk_state)
475{ 479{
476 acpi_status status; 480 acpi_status status;
@@ -481,7 +485,7 @@ acpi_ds_method_data_delete_value(u16 opcode,
481 485
482 /* Get the namespace node for the arg/local */ 486 /* Get the namespace node for the arg/local */
483 487
484 status = acpi_ds_method_data_get_node(opcode, index, walk_state, &node); 488 status = acpi_ds_method_data_get_node(type, index, walk_state, &node);
485 if (ACPI_FAILURE(status)) { 489 if (ACPI_FAILURE(status)) {
486 return_VOID; 490 return_VOID;
487 } 491 }
@@ -514,7 +518,8 @@ acpi_ds_method_data_delete_value(u16 opcode,
514 * 518 *
515 * FUNCTION: acpi_ds_store_object_to_local 519 * FUNCTION: acpi_ds_store_object_to_local
516 * 520 *
517 * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP 521 * PARAMETERS: Type - Either ACPI_REFCLASS_LOCAL or
522 * ACPI_REFCLASS_ARG
518 * Index - Which Local or Arg to set 523 * Index - Which Local or Arg to set
519 * obj_desc - Value to be stored 524 * obj_desc - Value to be stored
520 * walk_state - Current walk state 525 * walk_state - Current walk state
@@ -528,7 +533,7 @@ acpi_ds_method_data_delete_value(u16 opcode,
528 ******************************************************************************/ 533 ******************************************************************************/
529 534
530acpi_status 535acpi_status
531acpi_ds_store_object_to_local(u16 opcode, 536acpi_ds_store_object_to_local(u8 type,
532 u32 index, 537 u32 index,
533 union acpi_operand_object *obj_desc, 538 union acpi_operand_object *obj_desc,
534 struct acpi_walk_state *walk_state) 539 struct acpi_walk_state *walk_state)
@@ -539,8 +544,8 @@ acpi_ds_store_object_to_local(u16 opcode,
539 union acpi_operand_object *new_obj_desc; 544 union acpi_operand_object *new_obj_desc;
540 545
541 ACPI_FUNCTION_TRACE(ds_store_object_to_local); 546 ACPI_FUNCTION_TRACE(ds_store_object_to_local);
542 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Opcode=%X Index=%d Obj=%p\n", 547 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Type=%2.2X Index=%d Obj=%p\n",
543 opcode, index, obj_desc)); 548 type, index, obj_desc));
544 549
545 /* Parameter validation */ 550 /* Parameter validation */
546 551
@@ -550,7 +555,7 @@ acpi_ds_store_object_to_local(u16 opcode,
550 555
551 /* Get the namespace node for the arg/local */ 556 /* Get the namespace node for the arg/local */
552 557
553 status = acpi_ds_method_data_get_node(opcode, index, walk_state, &node); 558 status = acpi_ds_method_data_get_node(type, index, walk_state, &node);
554 if (ACPI_FAILURE(status)) { 559 if (ACPI_FAILURE(status)) {
555 return_ACPI_STATUS(status); 560 return_ACPI_STATUS(status);
556 } 561 }
@@ -602,7 +607,7 @@ acpi_ds_store_object_to_local(u16 opcode,
602 * 607 *
603 * Weird, but true. 608 * Weird, but true.
604 */ 609 */
605 if (opcode == AML_ARG_OP) { 610 if (type == ACPI_REFCLASS_ARG) {
606 /* 611 /*
607 * If we have a valid reference object that came from ref_of(), 612 * If we have a valid reference object that came from ref_of(),
608 * do the indirect store 613 * do the indirect store
@@ -611,8 +616,8 @@ acpi_ds_store_object_to_local(u16 opcode,
611 ACPI_DESC_TYPE_OPERAND) 616 ACPI_DESC_TYPE_OPERAND)
612 && (current_obj_desc->common.type == 617 && (current_obj_desc->common.type ==
613 ACPI_TYPE_LOCAL_REFERENCE) 618 ACPI_TYPE_LOCAL_REFERENCE)
614 && (current_obj_desc->reference.opcode == 619 && (current_obj_desc->reference.class ==
615 AML_REF_OF_OP)) { 620 ACPI_REFCLASS_REFOF)) {
616 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 621 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
617 "Arg (%p) is an ObjRef(Node), storing in node %p\n", 622 "Arg (%p) is an ObjRef(Node), storing in node %p\n",
618 new_obj_desc, 623 new_obj_desc,
@@ -640,11 +645,9 @@ acpi_ds_store_object_to_local(u16 opcode,
640 } 645 }
641 } 646 }
642 647
643 /* 648 /* Delete the existing object before storing the new one */
644 * Delete the existing object 649
645 * before storing the new one 650 acpi_ds_method_data_delete_value(type, index, walk_state);
646 */
647 acpi_ds_method_data_delete_value(opcode, index, walk_state);
648 } 651 }
649 652
650 /* 653 /*
@@ -653,7 +656,7 @@ acpi_ds_store_object_to_local(u16 opcode,
653 * (increments the object reference count by one) 656 * (increments the object reference count by one)
654 */ 657 */
655 status = 658 status =
656 acpi_ds_method_data_set_value(opcode, index, new_obj_desc, 659 acpi_ds_method_data_set_value(type, index, new_obj_desc,
657 walk_state); 660 walk_state);
658 661
659 /* Remove local reference if we copied the object above */ 662 /* Remove local reference if we copied the object above */
diff --git a/drivers/acpi/dispatcher/dsobject.c b/drivers/acpi/dispatcher/dsobject.c
index 1022e38994c2..4f08e599d07e 100644
--- a/drivers/acpi/dispatcher/dsobject.c
+++ b/drivers/acpi/dispatcher/dsobject.c
@@ -496,7 +496,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
496 arg = arg->common.next; 496 arg = arg->common.next;
497 } 497 }
498 498
499 ACPI_ERROR((AE_INFO, 499 ACPI_WARNING((AE_INFO,
500 "Package List length (%X) larger than NumElements count (%X), truncated\n", 500 "Package List length (%X) larger than NumElements count (%X), truncated\n",
501 i, element_count)); 501 i, element_count));
502 } else if (i < element_count) { 502 } else if (i < element_count) {
@@ -731,54 +731,70 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
731 switch (op_info->type) { 731 switch (op_info->type) {
732 case AML_TYPE_LOCAL_VARIABLE: 732 case AML_TYPE_LOCAL_VARIABLE:
733 733
734 /* Split the opcode into a base opcode + offset */ 734 /* Local ID (0-7) is (AML opcode - base AML_LOCAL_OP) */
735 735
736 obj_desc->reference.opcode = AML_LOCAL_OP; 736 obj_desc->reference.value = opcode - AML_LOCAL_OP;
737 obj_desc->reference.offset = opcode - AML_LOCAL_OP; 737 obj_desc->reference.class = ACPI_REFCLASS_LOCAL;
738 738
739#ifndef ACPI_NO_METHOD_EXECUTION 739#ifndef ACPI_NO_METHOD_EXECUTION
740 status = acpi_ds_method_data_get_node(AML_LOCAL_OP, 740 status =
741 obj_desc-> 741 acpi_ds_method_data_get_node(ACPI_REFCLASS_LOCAL,
742 reference.offset, 742 obj_desc->reference.
743 walk_state, 743 value, walk_state,
744 (struct 744 ACPI_CAST_INDIRECT_PTR
745 acpi_namespace_node 745 (struct
746 **)&obj_desc-> 746 acpi_namespace_node,
747 reference.object); 747 &obj_desc->reference.
748 object));
748#endif 749#endif
749 break; 750 break;
750 751
751 case AML_TYPE_METHOD_ARGUMENT: 752 case AML_TYPE_METHOD_ARGUMENT:
752 753
753 /* Split the opcode into a base opcode + offset */ 754 /* Arg ID (0-6) is (AML opcode - base AML_ARG_OP) */
754 755
755 obj_desc->reference.opcode = AML_ARG_OP; 756 obj_desc->reference.value = opcode - AML_ARG_OP;
756 obj_desc->reference.offset = opcode - AML_ARG_OP; 757 obj_desc->reference.class = ACPI_REFCLASS_ARG;
757 758
758#ifndef ACPI_NO_METHOD_EXECUTION 759#ifndef ACPI_NO_METHOD_EXECUTION
759 status = acpi_ds_method_data_get_node(AML_ARG_OP, 760 status = acpi_ds_method_data_get_node(ACPI_REFCLASS_ARG,
760 obj_desc-> 761 obj_desc->
761 reference.offset, 762 reference.value,
762 walk_state, 763 walk_state,
764 ACPI_CAST_INDIRECT_PTR
763 (struct 765 (struct
764 acpi_namespace_node 766 acpi_namespace_node,
765 **)&obj_desc-> 767 &obj_desc->
766 reference.object); 768 reference.
769 object));
767#endif 770#endif
768 break; 771 break;
769 772
770 default: /* Other literals, etc.. */ 773 default: /* Object name or Debug object */
771 774
772 if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) { 775 switch (op->common.aml_opcode) {
776 case AML_INT_NAMEPATH_OP:
773 777
774 /* Node was saved in Op */ 778 /* Node was saved in Op */
775 779
776 obj_desc->reference.node = op->common.node; 780 obj_desc->reference.node = op->common.node;
777 obj_desc->reference.object = 781 obj_desc->reference.object =
778 op->common.node->object; 782 op->common.node->object;
779 } 783 obj_desc->reference.class = ACPI_REFCLASS_NAME;
784 break;
785
786 case AML_DEBUG_OP:
780 787
781 obj_desc->reference.opcode = opcode; 788 obj_desc->reference.class = ACPI_REFCLASS_DEBUG;
789 break;
790
791 default:
792
793 ACPI_ERROR((AE_INFO,
794 "Unimplemented reference type for AML opcode: %4.4X",
795 opcode));
796 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
797 }
782 break; 798 break;
783 } 799 }
784 break; 800 break;
diff --git a/drivers/acpi/dispatcher/dsopcode.c b/drivers/acpi/dispatcher/dsopcode.c
index 6a81c4400edf..69fae5905bb8 100644
--- a/drivers/acpi/dispatcher/dsopcode.c
+++ b/drivers/acpi/dispatcher/dsopcode.c
@@ -1330,7 +1330,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
1330 (walk_state->results->results.obj_desc[0]) == 1330 (walk_state->results->results.obj_desc[0]) ==
1331 ACPI_TYPE_LOCAL_REFERENCE) 1331 ACPI_TYPE_LOCAL_REFERENCE)
1332 && ((walk_state->results->results.obj_desc[0])-> 1332 && ((walk_state->results->results.obj_desc[0])->
1333 reference.opcode != AML_INDEX_OP)) { 1333 reference.class != ACPI_REFCLASS_INDEX)) {
1334 status = 1334 status =
1335 acpi_ex_resolve_to_value(&walk_state-> 1335 acpi_ex_resolve_to_value(&walk_state->
1336 results->results. 1336 results->results.
diff --git a/drivers/acpi/dispatcher/dswexec.c b/drivers/acpi/dispatcher/dswexec.c
index b5072fa9c920..396fe12078cd 100644
--- a/drivers/acpi/dispatcher/dswexec.c
+++ b/drivers/acpi/dispatcher/dswexec.c
@@ -166,6 +166,10 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
166 status = AE_CTRL_FALSE; 166 status = AE_CTRL_FALSE;
167 } 167 }
168 168
169 /* Predicate can be used for an implicit return value */
170
171 (void)acpi_ds_do_implicit_return(local_obj_desc, walk_state, TRUE);
172
169 cleanup: 173 cleanup:
170 174
171 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%p\n", 175 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%p\n",
@@ -429,10 +433,10 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
429 ACPI_TYPE_LOCAL_REFERENCE) 433 ACPI_TYPE_LOCAL_REFERENCE)
430 && (walk_state->operands[1]->common.type == 434 && (walk_state->operands[1]->common.type ==
431 ACPI_TYPE_LOCAL_REFERENCE) 435 ACPI_TYPE_LOCAL_REFERENCE)
432 && (walk_state->operands[0]->reference.opcode == 436 && (walk_state->operands[0]->reference.class ==
433 walk_state->operands[1]->reference.opcode) 437 walk_state->operands[1]->reference.class)
434 && (walk_state->operands[0]->reference.offset == 438 && (walk_state->operands[0]->reference.value ==
435 walk_state->operands[1]->reference.offset)) { 439 walk_state->operands[1]->reference.value)) {
436 status = AE_OK; 440 status = AE_OK;
437 } else { 441 } else {
438 ACPI_EXCEPTION((AE_INFO, status, 442 ACPI_EXCEPTION((AE_INFO, status,
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c
index 1e872e79db33..5b30b8d91d71 100644
--- a/drivers/acpi/dock.c
+++ b/drivers/acpi/dock.c
@@ -48,7 +48,6 @@ MODULE_PARM_DESC(immediate_undock, "1 (default) will cause the driver to "
48 " before undocking"); 48 " before undocking");
49 49
50static struct atomic_notifier_head dock_notifier_list; 50static struct atomic_notifier_head dock_notifier_list;
51static struct platform_device *dock_device;
52static char dock_device_name[] = "dock"; 51static char dock_device_name[] = "dock";
53 52
54static const struct acpi_device_id dock_device_ids[] = { 53static const struct acpi_device_id dock_device_ids[] = {
@@ -65,23 +64,29 @@ struct dock_station {
65 struct mutex hp_lock; 64 struct mutex hp_lock;
66 struct list_head dependent_devices; 65 struct list_head dependent_devices;
67 struct list_head hotplug_devices; 66 struct list_head hotplug_devices;
67
68 struct list_head sibiling;
69 struct platform_device *dock_device;
68}; 70};
71static LIST_HEAD(dock_stations);
72static int dock_station_count;
69 73
70struct dock_dependent_device { 74struct dock_dependent_device {
71 struct list_head list; 75 struct list_head list;
72 struct list_head hotplug_list; 76 struct list_head hotplug_list;
73 acpi_handle handle; 77 acpi_handle handle;
74 acpi_notify_handler handler; 78 struct acpi_dock_ops *ops;
75 void *context; 79 void *context;
76}; 80};
77 81
78#define DOCK_DOCKING 0x00000001 82#define DOCK_DOCKING 0x00000001
79#define DOCK_UNDOCKING 0x00000002 83#define DOCK_UNDOCKING 0x00000002
84#define DOCK_IS_DOCK 0x00000010
85#define DOCK_IS_ATA 0x00000020
86#define DOCK_IS_BAT 0x00000040
80#define DOCK_EVENT 3 87#define DOCK_EVENT 3
81#define UNDOCK_EVENT 2 88#define UNDOCK_EVENT 2
82 89
83static struct dock_station *dock_station;
84
85/***************************************************************************** 90/*****************************************************************************
86 * Dock Dependent device functions * 91 * Dock Dependent device functions *
87 *****************************************************************************/ 92 *****************************************************************************/
@@ -199,6 +204,60 @@ static int is_dock(acpi_handle handle)
199 return 1; 204 return 1;
200} 205}
201 206
207static int is_ejectable(acpi_handle handle)
208{
209 acpi_status status;
210 acpi_handle tmp;
211
212 status = acpi_get_handle(handle, "_EJ0", &tmp);
213 if (ACPI_FAILURE(status))
214 return 0;
215 return 1;
216}
217
218static int is_ata(acpi_handle handle)
219{
220 acpi_handle tmp;
221
222 if ((ACPI_SUCCESS(acpi_get_handle(handle, "_GTF", &tmp))) ||
223 (ACPI_SUCCESS(acpi_get_handle(handle, "_GTM", &tmp))) ||
224 (ACPI_SUCCESS(acpi_get_handle(handle, "_STM", &tmp))) ||
225 (ACPI_SUCCESS(acpi_get_handle(handle, "_SDD", &tmp))))
226 return 1;
227
228 return 0;
229}
230
231static int is_battery(acpi_handle handle)
232{
233 struct acpi_device_info *info;
234 struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
235 int ret = 1;
236
237 if (!ACPI_SUCCESS(acpi_get_object_info(handle, &buffer)))
238 return 0;
239 info = buffer.pointer;
240 if (!(info->valid & ACPI_VALID_HID))
241 ret = 0;
242 else
243 ret = !strcmp("PNP0C0A", info->hardware_id.value);
244
245 kfree(buffer.pointer);
246 return ret;
247}
248
249static int is_ejectable_bay(acpi_handle handle)
250{
251 acpi_handle phandle;
252 if (!is_ejectable(handle))
253 return 0;
254 if (is_battery(handle) || is_ata(handle))
255 return 1;
256 if (!acpi_get_parent(handle, &phandle) && is_ata(phandle))
257 return 1;
258 return 0;
259}
260
202/** 261/**
203 * is_dock_device - see if a device is on a dock station 262 * is_dock_device - see if a device is on a dock station
204 * @handle: acpi handle of the device 263 * @handle: acpi handle of the device
@@ -209,11 +268,17 @@ static int is_dock(acpi_handle handle)
209 */ 268 */
210int is_dock_device(acpi_handle handle) 269int is_dock_device(acpi_handle handle)
211{ 270{
212 if (!dock_station) 271 struct dock_station *dock_station;
272
273 if (!dock_station_count)
213 return 0; 274 return 0;
214 275
215 if (is_dock(handle) || find_dock_dependent_device(dock_station, handle)) 276 if (is_dock(handle))
216 return 1; 277 return 1;
278 list_for_each_entry(dock_station, &dock_stations, sibiling) {
279 if (find_dock_dependent_device(dock_station, handle))
280 return 1;
281 }
217 282
218 return 0; 283 return 0;
219} 284}
@@ -229,7 +294,7 @@ EXPORT_SYMBOL_GPL(is_dock_device);
229 */ 294 */
230static int dock_present(struct dock_station *ds) 295static int dock_present(struct dock_station *ds)
231{ 296{
232 unsigned long sta; 297 unsigned long long sta;
233 acpi_status status; 298 acpi_status status;
234 299
235 if (ds) { 300 if (ds) {
@@ -320,8 +385,8 @@ static void hotplug_dock_devices(struct dock_station *ds, u32 event)
320 * First call driver specific hotplug functions 385 * First call driver specific hotplug functions
321 */ 386 */
322 list_for_each_entry(dd, &ds->hotplug_devices, hotplug_list) { 387 list_for_each_entry(dd, &ds->hotplug_devices, hotplug_list) {
323 if (dd->handler) 388 if (dd->ops && dd->ops->handler)
324 dd->handler(dd->handle, event, dd->context); 389 dd->ops->handler(dd->handle, event, dd->context);
325 } 390 }
326 391
327 /* 392 /*
@@ -341,9 +406,10 @@ static void hotplug_dock_devices(struct dock_station *ds, u32 event)
341 406
342static void dock_event(struct dock_station *ds, u32 event, int num) 407static void dock_event(struct dock_station *ds, u32 event, int num)
343{ 408{
344 struct device *dev = &dock_device->dev; 409 struct device *dev = &ds->dock_device->dev;
345 char event_string[13]; 410 char event_string[13];
346 char *envp[] = { event_string, NULL }; 411 char *envp[] = { event_string, NULL };
412 struct dock_dependent_device *dd;
347 413
348 if (num == UNDOCK_EVENT) 414 if (num == UNDOCK_EVENT)
349 sprintf(event_string, "EVENT=undock"); 415 sprintf(event_string, "EVENT=undock");
@@ -354,7 +420,14 @@ static void dock_event(struct dock_station *ds, u32 event, int num)
354 * Indicate that the status of the dock station has 420 * Indicate that the status of the dock station has
355 * changed. 421 * changed.
356 */ 422 */
357 kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp); 423 if (num == DOCK_EVENT)
424 kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp);
425
426 list_for_each_entry(dd, &ds->hotplug_devices, hotplug_list)
427 if (dd->ops && dd->ops->uevent)
428 dd->ops->uevent(dd->handle, event, dd->context);
429 if (num != DOCK_EVENT)
430 kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp);
358} 431}
359 432
360/** 433/**
@@ -414,9 +487,10 @@ static void handle_dock(struct dock_station *ds, int dock)
414 arg.type = ACPI_TYPE_INTEGER; 487 arg.type = ACPI_TYPE_INTEGER;
415 arg.integer.value = dock; 488 arg.integer.value = dock;
416 status = acpi_evaluate_object(ds->handle, "_DCK", &arg_list, &buffer); 489 status = acpi_evaluate_object(ds->handle, "_DCK", &arg_list, &buffer);
417 if (ACPI_FAILURE(status)) 490 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND)
418 printk(KERN_ERR PREFIX "%s - failed to execute _DCK\n", 491 ACPI_EXCEPTION((AE_INFO, status, "%s - failed to execute"
419 (char *)name_buffer.pointer); 492 " _DCK\n", (char *)name_buffer.pointer));
493
420 kfree(buffer.pointer); 494 kfree(buffer.pointer);
421 kfree(name_buffer.pointer); 495 kfree(name_buffer.pointer);
422} 496}
@@ -452,6 +526,25 @@ static inline void complete_undock(struct dock_station *ds)
452 ds->flags &= ~(DOCK_UNDOCKING); 526 ds->flags &= ~(DOCK_UNDOCKING);
453} 527}
454 528
529static void dock_lock(struct dock_station *ds, int lock)
530{
531 struct acpi_object_list arg_list;
532 union acpi_object arg;
533 acpi_status status;
534
535 arg_list.count = 1;
536 arg_list.pointer = &arg;
537 arg.type = ACPI_TYPE_INTEGER;
538 arg.integer.value = !!lock;
539 status = acpi_evaluate_object(ds->handle, "_LCK", &arg_list, NULL);
540 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
541 if (lock)
542 printk(KERN_WARNING PREFIX "Locking device failed\n");
543 else
544 printk(KERN_WARNING PREFIX "Unlocking device failed\n");
545 }
546}
547
455/** 548/**
456 * dock_in_progress - see if we are in the middle of handling a dock event 549 * dock_in_progress - see if we are in the middle of handling a dock event
457 * @ds: the dock station 550 * @ds: the dock station
@@ -479,7 +572,7 @@ static int dock_in_progress(struct dock_station *ds)
479 */ 572 */
480int register_dock_notifier(struct notifier_block *nb) 573int register_dock_notifier(struct notifier_block *nb)
481{ 574{
482 if (!dock_station) 575 if (!dock_station_count)
483 return -ENODEV; 576 return -ENODEV;
484 577
485 return atomic_notifier_chain_register(&dock_notifier_list, nb); 578 return atomic_notifier_chain_register(&dock_notifier_list, nb);
@@ -493,7 +586,7 @@ EXPORT_SYMBOL_GPL(register_dock_notifier);
493 */ 586 */
494void unregister_dock_notifier(struct notifier_block *nb) 587void unregister_dock_notifier(struct notifier_block *nb)
495{ 588{
496 if (!dock_station) 589 if (!dock_station_count)
497 return; 590 return;
498 591
499 atomic_notifier_chain_unregister(&dock_notifier_list, nb); 592 atomic_notifier_chain_unregister(&dock_notifier_list, nb);
@@ -504,7 +597,7 @@ EXPORT_SYMBOL_GPL(unregister_dock_notifier);
504/** 597/**
505 * register_hotplug_dock_device - register a hotplug function 598 * register_hotplug_dock_device - register a hotplug function
506 * @handle: the handle of the device 599 * @handle: the handle of the device
507 * @handler: the acpi_notifier_handler to call after docking 600 * @ops: handlers to call after docking
508 * @context: device specific data 601 * @context: device specific data
509 * 602 *
510 * If a driver would like to perform a hotplug operation after a dock 603 * If a driver would like to perform a hotplug operation after a dock
@@ -512,27 +605,36 @@ EXPORT_SYMBOL_GPL(unregister_dock_notifier);
512 * the dock driver after _DCK is executed. 605 * the dock driver after _DCK is executed.
513 */ 606 */
514int 607int
515register_hotplug_dock_device(acpi_handle handle, acpi_notify_handler handler, 608register_hotplug_dock_device(acpi_handle handle, struct acpi_dock_ops *ops,
516 void *context) 609 void *context)
517{ 610{
518 struct dock_dependent_device *dd; 611 struct dock_dependent_device *dd;
612 struct dock_station *dock_station;
613 int ret = -EINVAL;
519 614
520 if (!dock_station) 615 if (!dock_station_count)
521 return -ENODEV; 616 return -ENODEV;
522 617
523 /* 618 /*
524 * make sure this handle is for a device dependent on the dock, 619 * make sure this handle is for a device dependent on the dock,
525 * this would include the dock station itself 620 * this would include the dock station itself
526 */ 621 */
527 dd = find_dock_dependent_device(dock_station, handle); 622 list_for_each_entry(dock_station, &dock_stations, sibiling) {
528 if (dd) { 623 /*
529 dd->handler = handler; 624 * An ATA bay can be in a dock and itself can be ejected
530 dd->context = context; 625 * seperately, so there are two 'dock stations' which need the
531 dock_add_hotplug_device(dock_station, dd); 626 * ops
532 return 0; 627 */
628 dd = find_dock_dependent_device(dock_station, handle);
629 if (dd) {
630 dd->ops = ops;
631 dd->context = context;
632 dock_add_hotplug_device(dock_station, dd);
633 ret = 0;
634 }
533 } 635 }
534 636
535 return -EINVAL; 637 return ret;
536} 638}
537 639
538EXPORT_SYMBOL_GPL(register_hotplug_dock_device); 640EXPORT_SYMBOL_GPL(register_hotplug_dock_device);
@@ -544,13 +646,16 @@ EXPORT_SYMBOL_GPL(register_hotplug_dock_device);
544void unregister_hotplug_dock_device(acpi_handle handle) 646void unregister_hotplug_dock_device(acpi_handle handle)
545{ 647{
546 struct dock_dependent_device *dd; 648 struct dock_dependent_device *dd;
649 struct dock_station *dock_station;
547 650
548 if (!dock_station) 651 if (!dock_station_count)
549 return; 652 return;
550 653
551 dd = find_dock_dependent_device(dock_station, handle); 654 list_for_each_entry(dock_station, &dock_stations, sibiling) {
552 if (dd) 655 dd = find_dock_dependent_device(dock_station, handle);
553 dock_del_hotplug_device(dock_station, dd); 656 if (dd)
657 dock_del_hotplug_device(dock_station, dd);
658 }
554} 659}
555 660
556EXPORT_SYMBOL_GPL(unregister_hotplug_dock_device); 661EXPORT_SYMBOL_GPL(unregister_hotplug_dock_device);
@@ -563,9 +668,6 @@ EXPORT_SYMBOL_GPL(unregister_hotplug_dock_device);
563 */ 668 */
564static int handle_eject_request(struct dock_station *ds, u32 event) 669static int handle_eject_request(struct dock_station *ds, u32 event)
565{ 670{
566 if (!dock_present(ds))
567 return -ENODEV;
568
569 if (dock_in_progress(ds)) 671 if (dock_in_progress(ds))
570 return -EBUSY; 672 return -EBUSY;
571 673
@@ -573,10 +675,14 @@ static int handle_eject_request(struct dock_station *ds, u32 event)
573 * here we need to generate the undock 675 * here we need to generate the undock
574 * event prior to actually doing the undock 676 * event prior to actually doing the undock
575 * so that the device struct still exists. 677 * so that the device struct still exists.
678 * Also, even send the dock event if the
679 * device is not present anymore
576 */ 680 */
577 dock_event(ds, event, UNDOCK_EVENT); 681 dock_event(ds, event, UNDOCK_EVENT);
682
578 hotplug_dock_devices(ds, ACPI_NOTIFY_EJECT_REQUEST); 683 hotplug_dock_devices(ds, ACPI_NOTIFY_EJECT_REQUEST);
579 undock(ds); 684 undock(ds);
685 dock_lock(ds, 0);
580 eject_dock(ds); 686 eject_dock(ds);
581 if (dock_present(ds)) { 687 if (dock_present(ds)) {
582 printk(KERN_ERR PREFIX "Unable to undock!\n"); 688 printk(KERN_ERR PREFIX "Unable to undock!\n");
@@ -599,14 +705,36 @@ static int handle_eject_request(struct dock_station *ds, u32 event)
599static void dock_notify(acpi_handle handle, u32 event, void *data) 705static void dock_notify(acpi_handle handle, u32 event, void *data)
600{ 706{
601 struct dock_station *ds = data; 707 struct dock_station *ds = data;
708 struct acpi_device *tmp;
709 int surprise_removal = 0;
710
711 /*
712 * According to acpi spec 3.0a, if a DEVICE_CHECK notification
713 * is sent and _DCK is present, it is assumed to mean an undock
714 * request.
715 */
716 if ((ds->flags & DOCK_IS_DOCK) && event == ACPI_NOTIFY_DEVICE_CHECK)
717 event = ACPI_NOTIFY_EJECT_REQUEST;
602 718
719 /*
720 * dock station: BUS_CHECK - docked or surprise removal
721 * DEVICE_CHECK - undocked
722 * other device: BUS_CHECK/DEVICE_CHECK - added or surprise removal
723 *
724 * To simplify event handling, dock dependent device handler always
725 * get ACPI_NOTIFY_BUS_CHECK/ACPI_NOTIFY_DEVICE_CHECK for add and
726 * ACPI_NOTIFY_EJECT_REQUEST for removal
727 */
603 switch (event) { 728 switch (event) {
604 case ACPI_NOTIFY_BUS_CHECK: 729 case ACPI_NOTIFY_BUS_CHECK:
605 if (!dock_in_progress(ds) && dock_present(ds)) { 730 case ACPI_NOTIFY_DEVICE_CHECK:
731 if (!dock_in_progress(ds) && acpi_bus_get_device(ds->handle,
732 &tmp)) {
606 begin_dock(ds); 733 begin_dock(ds);
607 dock(ds); 734 dock(ds);
608 if (!dock_present(ds)) { 735 if (!dock_present(ds)) {
609 printk(KERN_ERR PREFIX "Unable to dock!\n"); 736 printk(KERN_ERR PREFIX "Unable to dock!\n");
737 complete_dock(ds);
610 break; 738 break;
611 } 739 }
612 atomic_notifier_call_chain(&dock_notifier_list, 740 atomic_notifier_call_chain(&dock_notifier_list,
@@ -614,20 +742,19 @@ static void dock_notify(acpi_handle handle, u32 event, void *data)
614 hotplug_dock_devices(ds, event); 742 hotplug_dock_devices(ds, event);
615 complete_dock(ds); 743 complete_dock(ds);
616 dock_event(ds, event, DOCK_EVENT); 744 dock_event(ds, event, DOCK_EVENT);
745 dock_lock(ds, 1);
746 break;
617 } 747 }
618 break; 748 if (dock_present(ds) || dock_in_progress(ds))
619 case ACPI_NOTIFY_DEVICE_CHECK: 749 break;
620 /* 750 /* This is a surprise removal */
621 * According to acpi spec 3.0a, if a DEVICE_CHECK notification 751 surprise_removal = 1;
622 * is sent and _DCK is present, it is assumed to mean an 752 event = ACPI_NOTIFY_EJECT_REQUEST;
623 * undock request. This notify routine will only be called 753 /* Fall back */
624 * for objects defining _DCK, so we will fall through to eject
625 * request here. However, we will pass an eject request through
626 * to the driver who wish to hotplug.
627 */
628 case ACPI_NOTIFY_EJECT_REQUEST: 754 case ACPI_NOTIFY_EJECT_REQUEST:
629 begin_undock(ds); 755 begin_undock(ds);
630 if (immediate_undock) 756 if ((immediate_undock && !(ds->flags & DOCK_IS_ATA))
757 || surprise_removal)
631 handle_eject_request(ds, event); 758 handle_eject_request(ds, event);
632 else 759 else
633 dock_event(ds, event, UNDOCK_EVENT); 760 dock_event(ds, event, UNDOCK_EVENT);
@@ -637,6 +764,51 @@ static void dock_notify(acpi_handle handle, u32 event, void *data)
637 } 764 }
638} 765}
639 766
767struct dock_data {
768 acpi_handle handle;
769 unsigned long event;
770 struct dock_station *ds;
771};
772
773static void acpi_dock_deferred_cb(void *context)
774{
775 struct dock_data *data = (struct dock_data *)context;
776
777 dock_notify(data->handle, data->event, data->ds);
778 kfree(data);
779}
780
781static int acpi_dock_notifier_call(struct notifier_block *this,
782 unsigned long event, void *data)
783{
784 struct dock_station *dock_station;
785 acpi_handle handle = (acpi_handle)data;
786
787 if (event != ACPI_NOTIFY_BUS_CHECK && event != ACPI_NOTIFY_DEVICE_CHECK
788 && event != ACPI_NOTIFY_EJECT_REQUEST)
789 return 0;
790 list_for_each_entry(dock_station, &dock_stations, sibiling) {
791 if (dock_station->handle == handle) {
792 struct dock_data *dock_data;
793
794 dock_data = kmalloc(sizeof(*dock_data), GFP_KERNEL);
795 if (!dock_data)
796 return 0;
797 dock_data->handle = handle;
798 dock_data->event = event;
799 dock_data->ds = dock_station;
800 acpi_os_hotplug_execute(acpi_dock_deferred_cb,
801 dock_data);
802 return 0 ;
803 }
804 }
805 return 0;
806}
807
808static struct notifier_block dock_acpi_notifier = {
809 .notifier_call = acpi_dock_notifier_call,
810};
811
640/** 812/**
641 * find_dock_devices - find devices on the dock station 813 * find_dock_devices - find devices on the dock station
642 * @handle: the handle of the device we are examining 814 * @handle: the handle of the device we are examining
@@ -683,6 +855,8 @@ fdd_out:
683static ssize_t show_docked(struct device *dev, 855static ssize_t show_docked(struct device *dev,
684 struct device_attribute *attr, char *buf) 856 struct device_attribute *attr, char *buf)
685{ 857{
858 struct dock_station *dock_station = *((struct dock_station **)
859 dev->platform_data);
686 return snprintf(buf, PAGE_SIZE, "%d\n", dock_present(dock_station)); 860 return snprintf(buf, PAGE_SIZE, "%d\n", dock_present(dock_station));
687 861
688} 862}
@@ -694,6 +868,8 @@ static DEVICE_ATTR(docked, S_IRUGO, show_docked, NULL);
694static ssize_t show_flags(struct device *dev, 868static ssize_t show_flags(struct device *dev,
695 struct device_attribute *attr, char *buf) 869 struct device_attribute *attr, char *buf)
696{ 870{
871 struct dock_station *dock_station = *((struct dock_station **)
872 dev->platform_data);
697 return snprintf(buf, PAGE_SIZE, "%d\n", dock_station->flags); 873 return snprintf(buf, PAGE_SIZE, "%d\n", dock_station->flags);
698 874
699} 875}
@@ -706,6 +882,8 @@ static ssize_t write_undock(struct device *dev, struct device_attribute *attr,
706 const char *buf, size_t count) 882 const char *buf, size_t count)
707{ 883{
708 int ret; 884 int ret;
885 struct dock_station *dock_station = *((struct dock_station **)
886 dev->platform_data);
709 887
710 if (!count) 888 if (!count)
711 return -EINVAL; 889 return -EINVAL;
@@ -722,16 +900,38 @@ static DEVICE_ATTR(undock, S_IWUSR, NULL, write_undock);
722static ssize_t show_dock_uid(struct device *dev, 900static ssize_t show_dock_uid(struct device *dev,
723 struct device_attribute *attr, char *buf) 901 struct device_attribute *attr, char *buf)
724{ 902{
725 unsigned long lbuf; 903 unsigned long long lbuf;
904 struct dock_station *dock_station = *((struct dock_station **)
905 dev->platform_data);
726 acpi_status status = acpi_evaluate_integer(dock_station->handle, 906 acpi_status status = acpi_evaluate_integer(dock_station->handle,
727 "_UID", NULL, &lbuf); 907 "_UID", NULL, &lbuf);
728 if (ACPI_FAILURE(status)) 908 if (ACPI_FAILURE(status))
729 return 0; 909 return 0;
730 910
731 return snprintf(buf, PAGE_SIZE, "%lx\n", lbuf); 911 return snprintf(buf, PAGE_SIZE, "%llx\n", lbuf);
732} 912}
733static DEVICE_ATTR(uid, S_IRUGO, show_dock_uid, NULL); 913static DEVICE_ATTR(uid, S_IRUGO, show_dock_uid, NULL);
734 914
915static ssize_t show_dock_type(struct device *dev,
916 struct device_attribute *attr, char *buf)
917{
918 struct dock_station *dock_station = *((struct dock_station **)
919 dev->platform_data);
920 char *type;
921
922 if (dock_station->flags & DOCK_IS_DOCK)
923 type = "dock_station";
924 else if (dock_station->flags & DOCK_IS_ATA)
925 type = "ata_bay";
926 else if (dock_station->flags & DOCK_IS_BAT)
927 type = "battery_bay";
928 else
929 type = "unknown";
930
931 return snprintf(buf, PAGE_SIZE, "%s\n", type);
932}
933static DEVICE_ATTR(type, S_IRUGO, show_dock_type, NULL);
934
735/** 935/**
736 * dock_add - add a new dock station 936 * dock_add - add a new dock station
737 * @handle: the dock station handle 937 * @handle: the dock station handle
@@ -742,8 +942,9 @@ static DEVICE_ATTR(uid, S_IRUGO, show_dock_uid, NULL);
742static int dock_add(acpi_handle handle) 942static int dock_add(acpi_handle handle)
743{ 943{
744 int ret; 944 int ret;
745 acpi_status status;
746 struct dock_dependent_device *dd; 945 struct dock_dependent_device *dd;
946 struct dock_station *dock_station;
947 struct platform_device *dock_device;
747 948
748 /* allocate & initialize the dock_station private data */ 949 /* allocate & initialize the dock_station private data */
749 dock_station = kzalloc(sizeof(*dock_station), GFP_KERNEL); 950 dock_station = kzalloc(sizeof(*dock_station), GFP_KERNEL);
@@ -753,22 +954,34 @@ static int dock_add(acpi_handle handle)
753 dock_station->last_dock_time = jiffies - HZ; 954 dock_station->last_dock_time = jiffies - HZ;
754 INIT_LIST_HEAD(&dock_station->dependent_devices); 955 INIT_LIST_HEAD(&dock_station->dependent_devices);
755 INIT_LIST_HEAD(&dock_station->hotplug_devices); 956 INIT_LIST_HEAD(&dock_station->hotplug_devices);
957 INIT_LIST_HEAD(&dock_station->sibiling);
756 spin_lock_init(&dock_station->dd_lock); 958 spin_lock_init(&dock_station->dd_lock);
757 mutex_init(&dock_station->hp_lock); 959 mutex_init(&dock_station->hp_lock);
758 ATOMIC_INIT_NOTIFIER_HEAD(&dock_notifier_list); 960 ATOMIC_INIT_NOTIFIER_HEAD(&dock_notifier_list);
759 961
760 /* initialize platform device stuff */ 962 /* initialize platform device stuff */
761 dock_device = 963 dock_station->dock_device =
762 platform_device_register_simple(dock_device_name, 0, NULL, 0); 964 platform_device_register_simple(dock_device_name,
965 dock_station_count, NULL, 0);
966 dock_device = dock_station->dock_device;
763 if (IS_ERR(dock_device)) { 967 if (IS_ERR(dock_device)) {
764 kfree(dock_station); 968 kfree(dock_station);
765 dock_station = NULL; 969 dock_station = NULL;
766 return PTR_ERR(dock_device); 970 return PTR_ERR(dock_device);
767 } 971 }
972 platform_device_add_data(dock_device, &dock_station,
973 sizeof(struct dock_station *));
768 974
769 /* we want the dock device to send uevents */ 975 /* we want the dock device to send uevents */
770 dock_device->dev.uevent_suppress = 0; 976 dock_device->dev.uevent_suppress = 0;
771 977
978 if (is_dock(handle))
979 dock_station->flags |= DOCK_IS_DOCK;
980 if (is_ata(handle))
981 dock_station->flags |= DOCK_IS_ATA;
982 if (is_battery(handle))
983 dock_station->flags |= DOCK_IS_BAT;
984
772 ret = device_create_file(&dock_device->dev, &dev_attr_docked); 985 ret = device_create_file(&dock_device->dev, &dev_attr_docked);
773 if (ret) { 986 if (ret) {
774 printk("Error %d adding sysfs file\n", ret); 987 printk("Error %d adding sysfs file\n", ret);
@@ -807,6 +1020,9 @@ static int dock_add(acpi_handle handle)
807 dock_station = NULL; 1020 dock_station = NULL;
808 return ret; 1021 return ret;
809 } 1022 }
1023 ret = device_create_file(&dock_device->dev, &dev_attr_type);
1024 if (ret)
1025 printk(KERN_ERR"Error %d adding sysfs file\n", ret);
810 1026
811 /* Find dependent devices */ 1027 /* Find dependent devices */
812 acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, 1028 acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
@@ -823,24 +1039,12 @@ static int dock_add(acpi_handle handle)
823 } 1039 }
824 add_dock_dependent_device(dock_station, dd); 1040 add_dock_dependent_device(dock_station, dd);
825 1041
826 /* register for dock events */ 1042 dock_station_count++;
827 status = acpi_install_notify_handler(dock_station->handle, 1043 list_add(&dock_station->sibiling, &dock_stations);
828 ACPI_SYSTEM_NOTIFY,
829 dock_notify, dock_station);
830
831 if (ACPI_FAILURE(status)) {
832 printk(KERN_ERR PREFIX "Error installing notify handler\n");
833 ret = -ENODEV;
834 goto dock_add_err;
835 }
836
837 printk(KERN_INFO PREFIX "%s\n", ACPI_DOCK_DRIVER_DESCRIPTION);
838
839 return 0; 1044 return 0;
840 1045
841dock_add_err:
842 kfree(dd);
843dock_add_err_unregister: 1046dock_add_err_unregister:
1047 device_remove_file(&dock_device->dev, &dev_attr_type);
844 device_remove_file(&dock_device->dev, &dev_attr_docked); 1048 device_remove_file(&dock_device->dev, &dev_attr_docked);
845 device_remove_file(&dock_device->dev, &dev_attr_undock); 1049 device_remove_file(&dock_device->dev, &dev_attr_undock);
846 device_remove_file(&dock_device->dev, &dev_attr_uid); 1050 device_remove_file(&dock_device->dev, &dev_attr_uid);
@@ -854,12 +1058,12 @@ dock_add_err_unregister:
854/** 1058/**
855 * dock_remove - free up resources related to the dock station 1059 * dock_remove - free up resources related to the dock station
856 */ 1060 */
857static int dock_remove(void) 1061static int dock_remove(struct dock_station *dock_station)
858{ 1062{
859 struct dock_dependent_device *dd, *tmp; 1063 struct dock_dependent_device *dd, *tmp;
860 acpi_status status; 1064 struct platform_device *dock_device = dock_station->dock_device;
861 1065
862 if (!dock_station) 1066 if (!dock_station_count)
863 return 0; 1067 return 0;
864 1068
865 /* remove dependent devices */ 1069 /* remove dependent devices */
@@ -867,14 +1071,8 @@ static int dock_remove(void)
867 list) 1071 list)
868 kfree(dd); 1072 kfree(dd);
869 1073
870 /* remove dock notify handler */
871 status = acpi_remove_notify_handler(dock_station->handle,
872 ACPI_SYSTEM_NOTIFY,
873 dock_notify);
874 if (ACPI_FAILURE(status))
875 printk(KERN_ERR "Error removing notify handler\n");
876
877 /* cleanup sysfs */ 1074 /* cleanup sysfs */
1075 device_remove_file(&dock_device->dev, &dev_attr_type);
878 device_remove_file(&dock_device->dev, &dev_attr_docked); 1076 device_remove_file(&dock_device->dev, &dev_attr_docked);
879 device_remove_file(&dock_device->dev, &dev_attr_undock); 1077 device_remove_file(&dock_device->dev, &dev_attr_undock);
880 device_remove_file(&dock_device->dev, &dev_attr_uid); 1078 device_remove_file(&dock_device->dev, &dev_attr_uid);
@@ -899,44 +1097,60 @@ static int dock_remove(void)
899static acpi_status 1097static acpi_status
900find_dock(acpi_handle handle, u32 lvl, void *context, void **rv) 1098find_dock(acpi_handle handle, u32 lvl, void *context, void **rv)
901{ 1099{
902 int *count = context;
903 acpi_status status = AE_OK; 1100 acpi_status status = AE_OK;
904 1101
905 if (is_dock(handle)) { 1102 if (is_dock(handle)) {
906 if (dock_add(handle) >= 0) { 1103 if (dock_add(handle) >= 0) {
907 (*count)++;
908 status = AE_CTRL_TERMINATE; 1104 status = AE_CTRL_TERMINATE;
909 } 1105 }
910 } 1106 }
911 return status; 1107 return status;
912} 1108}
913 1109
914static int __init dock_init(void) 1110static acpi_status
1111find_bay(acpi_handle handle, u32 lvl, void *context, void **rv)
915{ 1112{
916 int num = 0; 1113 /* If bay is a dock, it's already handled */
917 1114 if (is_ejectable_bay(handle) && !is_dock(handle))
918 dock_station = NULL; 1115 dock_add(handle);
919 1116 return AE_OK;
920 if (acpi_disabled) 1117}
921 return 0;
922 1118
1119static int __init dock_init(void)
1120{
923 if (acpi_disabled) 1121 if (acpi_disabled)
924 return 0; 1122 return 0;
925 1123
926 /* look for a dock station */ 1124 /* look for a dock station */
927 acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, 1125 acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
928 ACPI_UINT32_MAX, find_dock, &num, NULL); 1126 ACPI_UINT32_MAX, find_dock, NULL, NULL);
929 1127
930 if (!num) 1128 /* look for bay */
931 printk(KERN_INFO "No dock devices found.\n"); 1129 acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
1130 ACPI_UINT32_MAX, find_bay, NULL, NULL);
1131 if (!dock_station_count) {
1132 printk(KERN_INFO PREFIX "No dock devices found.\n");
1133 return 0;
1134 }
932 1135
1136 register_acpi_bus_notifier(&dock_acpi_notifier);
1137 printk(KERN_INFO PREFIX "%s: %d docks/bays found\n",
1138 ACPI_DOCK_DRIVER_DESCRIPTION, dock_station_count);
933 return 0; 1139 return 0;
934} 1140}
935 1141
936static void __exit dock_exit(void) 1142static void __exit dock_exit(void)
937{ 1143{
938 dock_remove(); 1144 struct dock_station *dock_station;
1145
1146 unregister_acpi_bus_notifier(&dock_acpi_notifier);
1147 list_for_each_entry(dock_station, &dock_stations, sibiling)
1148 dock_remove(dock_station);
939} 1149}
940 1150
941postcore_initcall(dock_init); 1151/*
1152 * Must be called before drivers of devices in dock, otherwise we can't know
1153 * which devices are in a dock
1154 */
1155subsys_initcall(dock_init);
942module_exit(dock_exit); 1156module_exit(dock_exit);
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index 5622aee996b2..ef42316f89f5 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * ec.c - ACPI Embedded Controller Driver (v2.0) 2 * ec.c - ACPI Embedded Controller Driver (v2.1)
3 * 3 *
4 * Copyright (C) 2006, 2007 Alexey Starikovskiy <alexey.y.starikovskiy@intel.com> 4 * Copyright (C) 2006-2008 Alexey Starikovskiy <astarikovskiy@suse.de>
5 * Copyright (C) 2006 Denis Sadykov <denis.m.sadykov@intel.com> 5 * Copyright (C) 2006 Denis Sadykov <denis.m.sadykov@intel.com>
6 * Copyright (C) 2004 Luming Yu <luming.yu@intel.com> 6 * Copyright (C) 2004 Luming Yu <luming.yu@intel.com>
7 * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> 7 * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
@@ -26,7 +26,7 @@
26 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 26 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
27 */ 27 */
28 28
29/* Uncomment next line to get verbose print outs*/ 29/* Uncomment next line to get verbose printout */
30/* #define DEBUG */ 30/* #define DEBUG */
31 31
32#include <linux/kernel.h> 32#include <linux/kernel.h>
@@ -38,6 +38,7 @@
38#include <linux/seq_file.h> 38#include <linux/seq_file.h>
39#include <linux/interrupt.h> 39#include <linux/interrupt.h>
40#include <linux/list.h> 40#include <linux/list.h>
41#include <linux/spinlock.h>
41#include <asm/io.h> 42#include <asm/io.h>
42#include <acpi/acpi_bus.h> 43#include <acpi/acpi_bus.h>
43#include <acpi/acpi_drivers.h> 44#include <acpi/acpi_drivers.h>
@@ -65,22 +66,21 @@ enum ec_command {
65 ACPI_EC_COMMAND_QUERY = 0x84, 66 ACPI_EC_COMMAND_QUERY = 0x84,
66}; 67};
67 68
68/* EC events */
69enum ec_event {
70 ACPI_EC_EVENT_OBF_1 = 1, /* Output buffer full */
71 ACPI_EC_EVENT_IBF_0, /* Input buffer empty */
72};
73
74#define ACPI_EC_DELAY 500 /* Wait 500ms max. during EC ops */ 69#define ACPI_EC_DELAY 500 /* Wait 500ms max. during EC ops */
75#define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */ 70#define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */
76#define ACPI_EC_UDELAY 100 /* Wait 100us before polling EC again */ 71#define ACPI_EC_UDELAY 100 /* Wait 100us before polling EC again */
77 72
73#define ACPI_EC_STORM_THRESHOLD 20 /* number of false interrupts
74 per one transaction */
75
78enum { 76enum {
79 EC_FLAGS_WAIT_GPE = 0, /* Don't check status until GPE arrives */
80 EC_FLAGS_QUERY_PENDING, /* Query is pending */ 77 EC_FLAGS_QUERY_PENDING, /* Query is pending */
81 EC_FLAGS_GPE_MODE, /* Expect GPE to be sent for status change */ 78 EC_FLAGS_GPE_MODE, /* Expect GPE to be sent
79 * for status change */
82 EC_FLAGS_NO_GPE, /* Don't use GPE mode */ 80 EC_FLAGS_NO_GPE, /* Don't use GPE mode */
83 EC_FLAGS_RESCHEDULE_POLL /* Re-schedule poll */ 81 EC_FLAGS_GPE_STORM, /* GPE storm detected */
82 EC_FLAGS_HANDLERS_INSTALLED /* Handlers for GPE and
83 * OpReg are installed */
84}; 84};
85 85
86/* If we find an EC via the ECDT, we need to keep a ptr to its context */ 86/* If we find an EC via the ECDT, we need to keep a ptr to its context */
@@ -95,6 +95,15 @@ struct acpi_ec_query_handler {
95 u8 query_bit; 95 u8 query_bit;
96}; 96};
97 97
98struct transaction {
99 const u8 *wdata;
100 u8 *rdata;
101 unsigned short irq_count;
102 u8 command;
103 u8 wlen;
104 u8 rlen;
105};
106
98static struct acpi_ec { 107static struct acpi_ec {
99 acpi_handle handle; 108 acpi_handle handle;
100 unsigned long gpe; 109 unsigned long gpe;
@@ -105,11 +114,35 @@ static struct acpi_ec {
105 struct mutex lock; 114 struct mutex lock;
106 wait_queue_head_t wait; 115 wait_queue_head_t wait;
107 struct list_head list; 116 struct list_head list;
108 struct delayed_work work; 117 struct transaction *curr;
109 atomic_t irq_count; 118 spinlock_t curr_lock;
110 u8 handlers_installed;
111} *boot_ec, *first_ec; 119} *boot_ec, *first_ec;
112 120
121/*
122 * Some Asus system have exchanged ECDT data/command IO addresses.
123 */
124static int print_ecdt_error(const struct dmi_system_id *id)
125{
126 printk(KERN_NOTICE PREFIX "%s detected - "
127 "ECDT has exchanged control/data I/O address\n",
128 id->ident);
129 return 0;
130}
131
132static struct dmi_system_id __cpuinitdata ec_dmi_table[] = {
133 {
134 print_ecdt_error, "Asus L4R", {
135 DMI_MATCH(DMI_BIOS_VERSION, "1008.006"),
136 DMI_MATCH(DMI_PRODUCT_NAME, "L4R"),
137 DMI_MATCH(DMI_BOARD_NAME, "L4R") }, NULL},
138 {
139 print_ecdt_error, "Asus M6R", {
140 DMI_MATCH(DMI_BIOS_VERSION, "0207"),
141 DMI_MATCH(DMI_PRODUCT_NAME, "M6R"),
142 DMI_MATCH(DMI_BOARD_NAME, "M6R") }, NULL},
143 {},
144};
145
113/* -------------------------------------------------------------------------- 146/* --------------------------------------------------------------------------
114 Transaction Management 147 Transaction Management
115 -------------------------------------------------------------------------- */ 148 -------------------------------------------------------------------------- */
@@ -125,7 +158,7 @@ static inline u8 acpi_ec_read_data(struct acpi_ec *ec)
125{ 158{
126 u8 x = inb(ec->data_addr); 159 u8 x = inb(ec->data_addr);
127 pr_debug(PREFIX "---> data = 0x%2.2x\n", x); 160 pr_debug(PREFIX "---> data = 0x%2.2x\n", x);
128 return inb(ec->data_addr); 161 return x;
129} 162}
130 163
131static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command) 164static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command)
@@ -140,156 +173,172 @@ static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data)
140 outb(data, ec->data_addr); 173 outb(data, ec->data_addr);
141} 174}
142 175
143static inline int acpi_ec_check_status(struct acpi_ec *ec, enum ec_event event) 176static int ec_transaction_done(struct acpi_ec *ec)
144{ 177{
145 if (test_bit(EC_FLAGS_WAIT_GPE, &ec->flags)) 178 unsigned long flags;
146 return 0; 179 int ret = 0;
147 if (event == ACPI_EC_EVENT_OBF_1) { 180 spin_lock_irqsave(&ec->curr_lock, flags);
148 if (acpi_ec_read_status(ec) & ACPI_EC_FLAG_OBF) 181 if (!ec->curr || (!ec->curr->wlen && !ec->curr->rlen))
149 return 1; 182 ret = 1;
150 } else if (event == ACPI_EC_EVENT_IBF_0) { 183 spin_unlock_irqrestore(&ec->curr_lock, flags);
151 if (!(acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF)) 184 return ret;
152 return 1;
153 }
154
155 return 0;
156} 185}
157 186
158static void ec_schedule_ec_poll(struct acpi_ec *ec) 187static void gpe_transaction(struct acpi_ec *ec, u8 status)
159{ 188{
160 if (test_bit(EC_FLAGS_RESCHEDULE_POLL, &ec->flags)) 189 unsigned long flags;
161 schedule_delayed_work(&ec->work, 190 spin_lock_irqsave(&ec->curr_lock, flags);
162 msecs_to_jiffies(ACPI_EC_DELAY)); 191 if (!ec->curr)
192 goto unlock;
193 if (ec->curr->wlen > 0) {
194 if ((status & ACPI_EC_FLAG_IBF) == 0) {
195 acpi_ec_write_data(ec, *(ec->curr->wdata++));
196 --ec->curr->wlen;
197 } else
198 /* false interrupt, state didn't change */
199 ++ec->curr->irq_count;
200
201 } else if (ec->curr->rlen > 0) {
202 if ((status & ACPI_EC_FLAG_OBF) == 1) {
203 *(ec->curr->rdata++) = acpi_ec_read_data(ec);
204 --ec->curr->rlen;
205 } else
206 /* false interrupt, state didn't change */
207 ++ec->curr->irq_count;
208 }
209unlock:
210 spin_unlock_irqrestore(&ec->curr_lock, flags);
163} 211}
164 212
165static void ec_switch_to_poll_mode(struct acpi_ec *ec) 213static int acpi_ec_wait(struct acpi_ec *ec)
166{ 214{
215 if (wait_event_timeout(ec->wait, ec_transaction_done(ec),
216 msecs_to_jiffies(ACPI_EC_DELAY)))
217 return 0;
218 /* missing GPEs, switch back to poll mode */
219 if (printk_ratelimit())
220 pr_info(PREFIX "missing confirmations, "
221 "switch off interrupt mode.\n");
167 set_bit(EC_FLAGS_NO_GPE, &ec->flags); 222 set_bit(EC_FLAGS_NO_GPE, &ec->flags);
168 clear_bit(EC_FLAGS_GPE_MODE, &ec->flags); 223 clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
169 acpi_disable_gpe(NULL, ec->gpe, ACPI_NOT_ISR); 224 return 1;
170 set_bit(EC_FLAGS_RESCHEDULE_POLL, &ec->flags);
171} 225}
172 226
173static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll) 227static void acpi_ec_gpe_query(void *ec_cxt);
228
229static int ec_check_sci(struct acpi_ec *ec, u8 state)
174{ 230{
175 atomic_set(&ec->irq_count, 0); 231 if (state & ACPI_EC_FLAG_SCI) {
176 if (likely(test_bit(EC_FLAGS_GPE_MODE, &ec->flags)) && 232 if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags))
177 likely(!force_poll)) { 233 return acpi_os_execute(OSL_EC_BURST_HANDLER,
178 if (wait_event_timeout(ec->wait, acpi_ec_check_status(ec, event), 234 acpi_ec_gpe_query, ec);
179 msecs_to_jiffies(ACPI_EC_DELAY))) 235 }
180 return 0; 236 return 0;
181 clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags); 237}
182 if (acpi_ec_check_status(ec, event)) { 238
183 /* missing GPEs, switch back to poll mode */ 239static int ec_poll(struct acpi_ec *ec)
184 if (printk_ratelimit()) 240{
185 pr_info(PREFIX "missing confirmations, " 241 unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY);
186 "switch off interrupt mode.\n"); 242 msleep(1);
187 ec_switch_to_poll_mode(ec); 243 while (time_before(jiffies, delay)) {
188 ec_schedule_ec_poll(ec); 244 gpe_transaction(ec, acpi_ec_read_status(ec));
245 msleep(1);
246 if (ec_transaction_done(ec))
189 return 0; 247 return 0;
190 }
191 } else {
192 unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY);
193 clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags);
194 while (time_before(jiffies, delay)) {
195 if (acpi_ec_check_status(ec, event))
196 return 0;
197 msleep(1);
198 }
199 } 248 }
200 pr_err(PREFIX "acpi_ec_wait timeout, status = 0x%2.2x, event = %s\n",
201 acpi_ec_read_status(ec),
202 (event == ACPI_EC_EVENT_OBF_1) ? "\"b0=1\"" : "\"b1=0\"");
203 return -ETIME; 249 return -ETIME;
204} 250}
205 251
206static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, u8 command, 252static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
207 const u8 * wdata, unsigned wdata_len, 253 struct transaction *t,
208 u8 * rdata, unsigned rdata_len,
209 int force_poll) 254 int force_poll)
210{ 255{
211 int result = 0; 256 unsigned long tmp;
212 set_bit(EC_FLAGS_WAIT_GPE, &ec->flags); 257 int ret = 0;
213 pr_debug(PREFIX "transaction start\n"); 258 pr_debug(PREFIX "transaction start\n");
214 acpi_ec_write_cmd(ec, command); 259 /* disable GPE during transaction if storm is detected */
215 for (; wdata_len > 0; --wdata_len) { 260 if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
216 result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0, force_poll); 261 clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
217 if (result) { 262 acpi_disable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
218 pr_err(PREFIX
219 "write_cmd timeout, command = %d\n", command);
220 goto end;
221 }
222 set_bit(EC_FLAGS_WAIT_GPE, &ec->flags);
223 acpi_ec_write_data(ec, *(wdata++));
224 } 263 }
225 264 /* start transaction */
226 if (!rdata_len) { 265 spin_lock_irqsave(&ec->curr_lock, tmp);
227 result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0, force_poll); 266 /* following two actions should be kept atomic */
228 if (result) { 267 t->irq_count = 0;
229 pr_err(PREFIX 268 ec->curr = t;
230 "finish-write timeout, command = %d\n", command); 269 acpi_ec_write_cmd(ec, ec->curr->command);
231 goto end; 270 if (ec->curr->command == ACPI_EC_COMMAND_QUERY)
232 }
233 } else if (command == ACPI_EC_COMMAND_QUERY)
234 clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); 271 clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
235 272 spin_unlock_irqrestore(&ec->curr_lock, tmp);
236 for (; rdata_len > 0; --rdata_len) { 273 /* if we selected poll mode or failed in GPE-mode do a poll loop */
237 result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF_1, force_poll); 274 if (force_poll ||
238 if (result) { 275 !test_bit(EC_FLAGS_GPE_MODE, &ec->flags) ||
239 pr_err(PREFIX "read timeout, command = %d\n", command); 276 acpi_ec_wait(ec))
240 goto end; 277 ret = ec_poll(ec);
241 }
242 /* Don't expect GPE after last read */
243 if (rdata_len > 1)
244 set_bit(EC_FLAGS_WAIT_GPE, &ec->flags);
245 *(rdata++) = acpi_ec_read_data(ec);
246 }
247 end:
248 pr_debug(PREFIX "transaction end\n"); 278 pr_debug(PREFIX "transaction end\n");
249 return result; 279 spin_lock_irqsave(&ec->curr_lock, tmp);
280 ec->curr = NULL;
281 spin_unlock_irqrestore(&ec->curr_lock, tmp);
282 if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
283 /* check if we received SCI during transaction */
284 ec_check_sci(ec, acpi_ec_read_status(ec));
285 /* it is safe to enable GPE outside of transaction */
286 acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
287 } else if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
288 t->irq_count > ACPI_EC_STORM_THRESHOLD) {
289 pr_debug(PREFIX "GPE storm detected\n");
290 set_bit(EC_FLAGS_GPE_STORM, &ec->flags);
291 }
292 return ret;
293}
294
295static int ec_check_ibf0(struct acpi_ec *ec)
296{
297 u8 status = acpi_ec_read_status(ec);
298 return (status & ACPI_EC_FLAG_IBF) == 0;
299}
300
301static int ec_wait_ibf0(struct acpi_ec *ec)
302{
303 unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY);
304 /* interrupt wait manually if GPE mode is not active */
305 unsigned long timeout = test_bit(EC_FLAGS_GPE_MODE, &ec->flags) ?
306 msecs_to_jiffies(ACPI_EC_DELAY) : msecs_to_jiffies(1);
307 while (time_before(jiffies, delay))
308 if (wait_event_timeout(ec->wait, ec_check_ibf0(ec), timeout))
309 return 0;
310 return -ETIME;
250} 311}
251 312
252static int acpi_ec_transaction(struct acpi_ec *ec, u8 command, 313static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t,
253 const u8 * wdata, unsigned wdata_len,
254 u8 * rdata, unsigned rdata_len,
255 int force_poll) 314 int force_poll)
256{ 315{
257 int status; 316 int status;
258 u32 glk; 317 u32 glk;
259 318 if (!ec || (!t) || (t->wlen && !t->wdata) || (t->rlen && !t->rdata))
260 if (!ec || (wdata_len && !wdata) || (rdata_len && !rdata))
261 return -EINVAL; 319 return -EINVAL;
262 320 if (t->rdata)
263 if (rdata) 321 memset(t->rdata, 0, t->rlen);
264 memset(rdata, 0, rdata_len);
265
266 mutex_lock(&ec->lock); 322 mutex_lock(&ec->lock);
267 if (ec->global_lock) { 323 if (ec->global_lock) {
268 status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk); 324 status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
269 if (ACPI_FAILURE(status)) { 325 if (ACPI_FAILURE(status)) {
270 mutex_unlock(&ec->lock); 326 status = -ENODEV;
271 return -ENODEV; 327 goto unlock;
272 } 328 }
273 } 329 }
274 330 if (ec_wait_ibf0(ec)) {
275 status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0, 0);
276 if (status) {
277 pr_err(PREFIX "input buffer is not empty, " 331 pr_err(PREFIX "input buffer is not empty, "
278 "aborting transaction\n"); 332 "aborting transaction\n");
333 status = -ETIME;
279 goto end; 334 goto end;
280 } 335 }
281 336 status = acpi_ec_transaction_unlocked(ec, t, force_poll);
282 status = acpi_ec_transaction_unlocked(ec, command, 337end:
283 wdata, wdata_len,
284 rdata, rdata_len,
285 force_poll);
286
287 end:
288
289 if (ec->global_lock) 338 if (ec->global_lock)
290 acpi_release_global_lock(glk); 339 acpi_release_global_lock(glk);
340unlock:
291 mutex_unlock(&ec->lock); 341 mutex_unlock(&ec->lock);
292
293 return status; 342 return status;
294} 343}
295 344
@@ -300,21 +349,32 @@ static int acpi_ec_transaction(struct acpi_ec *ec, u8 command,
300int acpi_ec_burst_enable(struct acpi_ec *ec) 349int acpi_ec_burst_enable(struct acpi_ec *ec)
301{ 350{
302 u8 d; 351 u8 d;
303 return acpi_ec_transaction(ec, ACPI_EC_BURST_ENABLE, NULL, 0, &d, 1, 0); 352 struct transaction t = {.command = ACPI_EC_BURST_ENABLE,
353 .wdata = NULL, .rdata = &d,
354 .wlen = 0, .rlen = 1};
355
356 return acpi_ec_transaction(ec, &t, 0);
304} 357}
305 358
306int acpi_ec_burst_disable(struct acpi_ec *ec) 359int acpi_ec_burst_disable(struct acpi_ec *ec)
307{ 360{
308 return acpi_ec_transaction(ec, ACPI_EC_BURST_DISABLE, NULL, 0, NULL, 0, 0); 361 struct transaction t = {.command = ACPI_EC_BURST_DISABLE,
362 .wdata = NULL, .rdata = NULL,
363 .wlen = 0, .rlen = 0};
364
365 return (acpi_ec_read_status(ec) & ACPI_EC_FLAG_BURST) ?
366 acpi_ec_transaction(ec, &t, 0) : 0;
309} 367}
310 368
311static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 * data) 369static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 * data)
312{ 370{
313 int result; 371 int result;
314 u8 d; 372 u8 d;
373 struct transaction t = {.command = ACPI_EC_COMMAND_READ,
374 .wdata = &address, .rdata = &d,
375 .wlen = 1, .rlen = 1};
315 376
316 result = acpi_ec_transaction(ec, ACPI_EC_COMMAND_READ, 377 result = acpi_ec_transaction(ec, &t, 0);
317 &address, 1, &d, 1, 0);
318 *data = d; 378 *data = d;
319 return result; 379 return result;
320} 380}
@@ -322,8 +382,11 @@ static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 * data)
322static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data) 382static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data)
323{ 383{
324 u8 wdata[2] = { address, data }; 384 u8 wdata[2] = { address, data };
325 return acpi_ec_transaction(ec, ACPI_EC_COMMAND_WRITE, 385 struct transaction t = {.command = ACPI_EC_COMMAND_WRITE,
326 wdata, 2, NULL, 0, 0); 386 .wdata = wdata, .rdata = NULL,
387 .wlen = 2, .rlen = 0};
388
389 return acpi_ec_transaction(ec, &t, 0);
327} 390}
328 391
329/* 392/*
@@ -385,12 +448,13 @@ int ec_transaction(u8 command,
385 u8 * rdata, unsigned rdata_len, 448 u8 * rdata, unsigned rdata_len,
386 int force_poll) 449 int force_poll)
387{ 450{
451 struct transaction t = {.command = command,
452 .wdata = wdata, .rdata = rdata,
453 .wlen = wdata_len, .rlen = rdata_len};
388 if (!first_ec) 454 if (!first_ec)
389 return -ENODEV; 455 return -ENODEV;
390 456
391 return acpi_ec_transaction(first_ec, command, wdata, 457 return acpi_ec_transaction(first_ec, &t, force_poll);
392 wdata_len, rdata, rdata_len,
393 force_poll);
394} 458}
395 459
396EXPORT_SYMBOL(ec_transaction); 460EXPORT_SYMBOL(ec_transaction);
@@ -399,7 +463,9 @@ static int acpi_ec_query(struct acpi_ec *ec, u8 * data)
399{ 463{
400 int result; 464 int result;
401 u8 d; 465 u8 d;
402 466 struct transaction t = {.command = ACPI_EC_COMMAND_QUERY,
467 .wdata = NULL, .rdata = &d,
468 .wlen = 0, .rlen = 1};
403 if (!ec || !data) 469 if (!ec || !data)
404 return -EINVAL; 470 return -EINVAL;
405 471
@@ -409,7 +475,7 @@ static int acpi_ec_query(struct acpi_ec *ec, u8 * data)
409 * bit to be cleared (and thus clearing the interrupt source). 475 * bit to be cleared (and thus clearing the interrupt source).
410 */ 476 */
411 477
412 result = acpi_ec_transaction(ec, ACPI_EC_COMMAND_QUERY, NULL, 0, &d, 1, 0); 478 result = acpi_ec_transaction(ec, &t, 0);
413 if (result) 479 if (result)
414 return result; 480 return result;
415 481
@@ -486,46 +552,26 @@ static void acpi_ec_gpe_query(void *ec_cxt)
486 552
487static u32 acpi_ec_gpe_handler(void *data) 553static u32 acpi_ec_gpe_handler(void *data)
488{ 554{
489 acpi_status status = AE_OK;
490 struct acpi_ec *ec = data; 555 struct acpi_ec *ec = data;
491 u8 state = acpi_ec_read_status(ec); 556 u8 status;
492 557
493 pr_debug(PREFIX "~~~> interrupt\n"); 558 pr_debug(PREFIX "~~~> interrupt\n");
494 atomic_inc(&ec->irq_count); 559 status = acpi_ec_read_status(ec);
495 if (atomic_read(&ec->irq_count) > 5) { 560
496 pr_err(PREFIX "GPE storm detected, disabling EC GPE\n"); 561 gpe_transaction(ec, status);
497 ec_switch_to_poll_mode(ec); 562 if (ec_transaction_done(ec) && (status & ACPI_EC_FLAG_IBF) == 0)
498 goto end;
499 }
500 clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags);
501 if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags))
502 wake_up(&ec->wait); 563 wake_up(&ec->wait);
503 564
504 if (state & ACPI_EC_FLAG_SCI) { 565 ec_check_sci(ec, status);
505 if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) 566 if (!test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
506 status = acpi_os_execute(OSL_EC_BURST_HANDLER, 567 !test_bit(EC_FLAGS_NO_GPE, &ec->flags)) {
507 acpi_ec_gpe_query, ec);
508 } else if (!test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
509 !test_bit(EC_FLAGS_NO_GPE, &ec->flags) &&
510 in_interrupt()) {
511 /* this is non-query, must be confirmation */ 568 /* this is non-query, must be confirmation */
512 if (printk_ratelimit()) 569 if (printk_ratelimit())
513 pr_info(PREFIX "non-query interrupt received," 570 pr_info(PREFIX "non-query interrupt received,"
514 " switching to interrupt mode\n"); 571 " switching to interrupt mode\n");
515 set_bit(EC_FLAGS_GPE_MODE, &ec->flags); 572 set_bit(EC_FLAGS_GPE_MODE, &ec->flags);
516 clear_bit(EC_FLAGS_RESCHEDULE_POLL, &ec->flags);
517 } 573 }
518end: 574 return ACPI_INTERRUPT_HANDLED;
519 ec_schedule_ec_poll(ec);
520 return ACPI_SUCCESS(status) ?
521 ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED;
522}
523
524static void do_ec_poll(struct work_struct *work)
525{
526 struct acpi_ec *ec = container_of(work, struct acpi_ec, work.work);
527 atomic_set(&ec->irq_count, 0);
528 (void)acpi_ec_gpe_handler(ec);
529} 575}
530 576
531/* -------------------------------------------------------------------------- 577/* --------------------------------------------------------------------------
@@ -669,8 +715,7 @@ static struct acpi_ec *make_acpi_ec(void)
669 mutex_init(&ec->lock); 715 mutex_init(&ec->lock);
670 init_waitqueue_head(&ec->wait); 716 init_waitqueue_head(&ec->wait);
671 INIT_LIST_HEAD(&ec->list); 717 INIT_LIST_HEAD(&ec->list);
672 INIT_DELAYED_WORK_DEFERRABLE(&ec->work, do_ec_poll); 718 spin_lock_init(&ec->curr_lock);
673 atomic_set(&ec->irq_count, 0);
674 return ec; 719 return ec;
675} 720}
676 721
@@ -691,6 +736,7 @@ static acpi_status
691ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval) 736ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval)
692{ 737{
693 acpi_status status; 738 acpi_status status;
739 unsigned long long tmp;
694 740
695 struct acpi_ec *ec = context; 741 struct acpi_ec *ec = context;
696 status = acpi_walk_resources(handle, METHOD_NAME__CRS, 742 status = acpi_walk_resources(handle, METHOD_NAME__CRS,
@@ -700,31 +746,26 @@ ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval)
700 746
701 /* Get GPE bit assignment (EC events). */ 747 /* Get GPE bit assignment (EC events). */
702 /* TODO: Add support for _GPE returning a package */ 748 /* TODO: Add support for _GPE returning a package */
703 status = acpi_evaluate_integer(handle, "_GPE", NULL, &ec->gpe); 749 status = acpi_evaluate_integer(handle, "_GPE", NULL, &tmp);
704 if (ACPI_FAILURE(status)) 750 if (ACPI_FAILURE(status))
705 return status; 751 return status;
752 ec->gpe = tmp;
706 /* Use the global lock for all EC transactions? */ 753 /* Use the global lock for all EC transactions? */
707 acpi_evaluate_integer(handle, "_GLK", NULL, &ec->global_lock); 754 acpi_evaluate_integer(handle, "_GLK", NULL, &tmp);
755 ec->global_lock = tmp;
708 ec->handle = handle; 756 ec->handle = handle;
709 return AE_CTRL_TERMINATE; 757 return AE_CTRL_TERMINATE;
710} 758}
711 759
712static void ec_poll_stop(struct acpi_ec *ec)
713{
714 clear_bit(EC_FLAGS_RESCHEDULE_POLL, &ec->flags);
715 cancel_delayed_work(&ec->work);
716}
717
718static void ec_remove_handlers(struct acpi_ec *ec) 760static void ec_remove_handlers(struct acpi_ec *ec)
719{ 761{
720 ec_poll_stop(ec);
721 if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle, 762 if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle,
722 ACPI_ADR_SPACE_EC, &acpi_ec_space_handler))) 763 ACPI_ADR_SPACE_EC, &acpi_ec_space_handler)))
723 pr_err(PREFIX "failed to remove space handler\n"); 764 pr_err(PREFIX "failed to remove space handler\n");
724 if (ACPI_FAILURE(acpi_remove_gpe_handler(NULL, ec->gpe, 765 if (ACPI_FAILURE(acpi_remove_gpe_handler(NULL, ec->gpe,
725 &acpi_ec_gpe_handler))) 766 &acpi_ec_gpe_handler)))
726 pr_err(PREFIX "failed to remove gpe handler\n"); 767 pr_err(PREFIX "failed to remove gpe handler\n");
727 ec->handlers_installed = 0; 768 clear_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags);
728} 769}
729 770
730static int acpi_ec_add(struct acpi_device *device) 771static int acpi_ec_add(struct acpi_device *device)
@@ -761,7 +802,7 @@ static int acpi_ec_add(struct acpi_device *device)
761 802
762 if (!first_ec) 803 if (!first_ec)
763 first_ec = ec; 804 first_ec = ec;
764 acpi_driver_data(device) = ec; 805 device->driver_data = ec;
765 acpi_ec_add_fs(device); 806 acpi_ec_add_fs(device);
766 pr_info(PREFIX "GPE = 0x%lx, I/O: command/status = 0x%lx, data = 0x%lx\n", 807 pr_info(PREFIX "GPE = 0x%lx, I/O: command/status = 0x%lx, data = 0x%lx\n",
767 ec->gpe, ec->command_addr, ec->data_addr); 808 ec->gpe, ec->command_addr, ec->data_addr);
@@ -786,7 +827,7 @@ static int acpi_ec_remove(struct acpi_device *device, int type)
786 } 827 }
787 mutex_unlock(&ec->lock); 828 mutex_unlock(&ec->lock);
788 acpi_ec_remove_fs(device); 829 acpi_ec_remove_fs(device);
789 acpi_driver_data(device) = NULL; 830 device->driver_data = NULL;
790 if (ec == first_ec) 831 if (ec == first_ec)
791 first_ec = NULL; 832 first_ec = NULL;
792 kfree(ec); 833 kfree(ec);
@@ -819,27 +860,36 @@ ec_parse_io_ports(struct acpi_resource *resource, void *context)
819static int ec_install_handlers(struct acpi_ec *ec) 860static int ec_install_handlers(struct acpi_ec *ec)
820{ 861{
821 acpi_status status; 862 acpi_status status;
822 if (ec->handlers_installed) 863 if (test_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags))
823 return 0; 864 return 0;
824 status = acpi_install_gpe_handler(NULL, ec->gpe, 865 status = acpi_install_gpe_handler(NULL, ec->gpe,
825 ACPI_GPE_EDGE_TRIGGERED, 866 ACPI_GPE_EDGE_TRIGGERED,
826 &acpi_ec_gpe_handler, ec); 867 &acpi_ec_gpe_handler, ec);
827 if (ACPI_FAILURE(status)) 868 if (ACPI_FAILURE(status))
828 return -ENODEV; 869 return -ENODEV;
829
830 acpi_set_gpe_type(NULL, ec->gpe, ACPI_GPE_TYPE_RUNTIME); 870 acpi_set_gpe_type(NULL, ec->gpe, ACPI_GPE_TYPE_RUNTIME);
831 acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR); 871 acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
832
833 status = acpi_install_address_space_handler(ec->handle, 872 status = acpi_install_address_space_handler(ec->handle,
834 ACPI_ADR_SPACE_EC, 873 ACPI_ADR_SPACE_EC,
835 &acpi_ec_space_handler, 874 &acpi_ec_space_handler,
836 NULL, ec); 875 NULL, ec);
837 if (ACPI_FAILURE(status)) { 876 if (ACPI_FAILURE(status)) {
838 acpi_remove_gpe_handler(NULL, ec->gpe, &acpi_ec_gpe_handler); 877 if (status == AE_NOT_FOUND) {
839 return -ENODEV; 878 /*
879 * Maybe OS fails in evaluating the _REG object.
880 * The AE_NOT_FOUND error will be ignored and OS
881 * continue to initialize EC.
882 */
883 printk(KERN_ERR "Fail in evaluating the _REG object"
884 " of EC device. Broken bios is suspected.\n");
885 } else {
886 acpi_remove_gpe_handler(NULL, ec->gpe,
887 &acpi_ec_gpe_handler);
888 return -ENODEV;
889 }
840 } 890 }
841 891
842 ec->handlers_installed = 1; 892 set_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags);
843 return 0; 893 return 0;
844} 894}
845 895
@@ -860,7 +910,6 @@ static int acpi_ec_start(struct acpi_device *device)
860 910
861 /* EC is fully operational, allow queries */ 911 /* EC is fully operational, allow queries */
862 clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); 912 clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
863 ec_schedule_ec_poll(ec);
864 return ret; 913 return ret;
865} 914}
866 915
@@ -879,7 +928,7 @@ static int acpi_ec_stop(struct acpi_device *device, int type)
879 928
880int __init acpi_boot_ec_enable(void) 929int __init acpi_boot_ec_enable(void)
881{ 930{
882 if (!boot_ec || boot_ec->handlers_installed) 931 if (!boot_ec || test_bit(EC_FLAGS_HANDLERS_INSTALLED, &boot_ec->flags))
883 return 0; 932 return 0;
884 if (!ec_install_handlers(boot_ec)) { 933 if (!ec_install_handlers(boot_ec)) {
885 first_ec = boot_ec; 934 first_ec = boot_ec;
@@ -911,6 +960,15 @@ int __init acpi_ec_ecdt_probe(void)
911 pr_info(PREFIX "EC description table is found, configuring boot EC\n"); 960 pr_info(PREFIX "EC description table is found, configuring boot EC\n");
912 boot_ec->command_addr = ecdt_ptr->control.address; 961 boot_ec->command_addr = ecdt_ptr->control.address;
913 boot_ec->data_addr = ecdt_ptr->data.address; 962 boot_ec->data_addr = ecdt_ptr->data.address;
963 if (dmi_check_system(ec_dmi_table)) {
964 /*
965 * If the board falls into ec_dmi_table, it means
966 * that ECDT table gives the incorrect command/status
967 * & data I/O address. Just fix it.
968 */
969 boot_ec->data_addr = ecdt_ptr->control.address;
970 boot_ec->command_addr = ecdt_ptr->data.address;
971 }
914 boot_ec->gpe = ecdt_ptr->gpe; 972 boot_ec->gpe = ecdt_ptr->gpe;
915 boot_ec->handle = ACPI_ROOT_OBJECT; 973 boot_ec->handle = ACPI_ROOT_OBJECT;
916 acpi_get_handle(ACPI_ROOT_OBJECT, ecdt_ptr->id, &boot_ec->handle); 974 acpi_get_handle(ACPI_ROOT_OBJECT, ecdt_ptr->id, &boot_ec->handle);
diff --git a/drivers/acpi/executer/exconfig.c b/drivers/acpi/executer/exconfig.c
index 2a32c843cb4a..74da6fa52ef1 100644
--- a/drivers/acpi/executer/exconfig.c
+++ b/drivers/acpi/executer/exconfig.c
@@ -43,7 +43,6 @@
43 43
44#include <acpi/acpi.h> 44#include <acpi/acpi.h>
45#include <acpi/acinterp.h> 45#include <acpi/acinterp.h>
46#include <acpi/amlcode.h>
47#include <acpi/acnamesp.h> 46#include <acpi/acnamesp.h>
48#include <acpi/actables.h> 47#include <acpi/actables.h>
49#include <acpi/acdispat.h> 48#include <acpi/acdispat.h>
@@ -91,13 +90,12 @@ acpi_ex_add_table(u32 table_index,
91 90
92 /* Init the table handle */ 91 /* Init the table handle */
93 92
94 obj_desc->reference.opcode = AML_LOAD_OP; 93 obj_desc->reference.class = ACPI_REFCLASS_TABLE;
95 *ddb_handle = obj_desc; 94 *ddb_handle = obj_desc;
96 95
97 /* Install the new table into the local data structures */ 96 /* Install the new table into the local data structures */
98 97
99 obj_desc->reference.object = ACPI_CAST_PTR(void, 98 obj_desc->reference.value = table_index;
100 (unsigned long)table_index);
101 99
102 /* Add the table to the namespace */ 100 /* Add the table to the namespace */
103 101
@@ -280,6 +278,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
280 struct acpi_walk_state *walk_state) 278 struct acpi_walk_state *walk_state)
281{ 279{
282 union acpi_operand_object *ddb_handle; 280 union acpi_operand_object *ddb_handle;
281 struct acpi_table_header *table;
283 struct acpi_table_desc table_desc; 282 struct acpi_table_desc table_desc;
284 u32 table_index; 283 u32 table_index;
285 acpi_status status; 284 acpi_status status;
@@ -294,9 +293,8 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
294 switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { 293 switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
295 case ACPI_TYPE_REGION: 294 case ACPI_TYPE_REGION:
296 295
297 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Load from Region %p %s\n", 296 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
298 obj_desc, 297 "Load table from Region %p\n", obj_desc));
299 acpi_ut_get_object_type_name(obj_desc)));
300 298
301 /* Region must be system_memory (from ACPI spec) */ 299 /* Region must be system_memory (from ACPI spec) */
302 300
@@ -316,61 +314,112 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
316 } 314 }
317 315
318 /* 316 /*
319 * We will simply map the memory region for the table. However, the 317 * Map the table header and get the actual table length. The region
320 * memory region is technically not guaranteed to remain stable and 318 * length is not guaranteed to be the same as the table length.
321 * we may eventually have to copy the table to a local buffer. 319 */
320 table = acpi_os_map_memory(obj_desc->region.address,
321 sizeof(struct acpi_table_header));
322 if (!table) {
323 return_ACPI_STATUS(AE_NO_MEMORY);
324 }
325
326 length = table->length;
327 acpi_os_unmap_memory(table, sizeof(struct acpi_table_header));
328
329 /* Must have at least an ACPI table header */
330
331 if (length < sizeof(struct acpi_table_header)) {
332 return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
333 }
334
335 /*
336 * The memory region is not guaranteed to remain stable and we must
337 * copy the table to a local buffer. For example, the memory region
338 * is corrupted after suspend on some machines. Dynamically loaded
339 * tables are usually small, so this overhead is minimal.
322 */ 340 */
341
342 /* Allocate a buffer for the table */
343
344 table_desc.pointer = ACPI_ALLOCATE(length);
345 if (!table_desc.pointer) {
346 return_ACPI_STATUS(AE_NO_MEMORY);
347 }
348
349 /* Map the entire table and copy it */
350
351 table = acpi_os_map_memory(obj_desc->region.address, length);
352 if (!table) {
353 ACPI_FREE(table_desc.pointer);
354 return_ACPI_STATUS(AE_NO_MEMORY);
355 }
356
357 ACPI_MEMCPY(table_desc.pointer, table, length);
358 acpi_os_unmap_memory(table, length);
359
323 table_desc.address = obj_desc->region.address; 360 table_desc.address = obj_desc->region.address;
324 table_desc.length = obj_desc->region.length;
325 table_desc.flags = ACPI_TABLE_ORIGIN_MAPPED;
326 break; 361 break;
327 362
328 case ACPI_TYPE_BUFFER: /* Buffer or resolved region_field */ 363 case ACPI_TYPE_BUFFER: /* Buffer or resolved region_field */
329 364
330 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 365 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
331 "Load from Buffer or Field %p %s\n", obj_desc, 366 "Load table from Buffer or Field %p\n",
332 acpi_ut_get_object_type_name(obj_desc))); 367 obj_desc));
333
334 length = obj_desc->buffer.length;
335 368
336 /* Must have at least an ACPI table header */ 369 /* Must have at least an ACPI table header */
337 370
338 if (length < sizeof(struct acpi_table_header)) { 371 if (obj_desc->buffer.length < sizeof(struct acpi_table_header)) {
339 return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH); 372 return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
340 } 373 }
341 374
342 /* Validate checksum here. It won't get validated in tb_add_table */ 375 /* Get the actual table length from the table header */
343 376
344 status = 377 table =
345 acpi_tb_verify_checksum(ACPI_CAST_PTR 378 ACPI_CAST_PTR(struct acpi_table_header,
346 (struct acpi_table_header, 379 obj_desc->buffer.pointer);
347 obj_desc->buffer.pointer), length); 380 length = table->length;
348 if (ACPI_FAILURE(status)) { 381
349 return_ACPI_STATUS(status); 382 /* Table cannot extend beyond the buffer */
383
384 if (length > obj_desc->buffer.length) {
385 return_ACPI_STATUS(AE_AML_BUFFER_LIMIT);
386 }
387 if (length < sizeof(struct acpi_table_header)) {
388 return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
350 } 389 }
351 390
352 /* 391 /*
353 * We need to copy the buffer since the original buffer could be 392 * Copy the table from the buffer because the buffer could be modified
354 * changed or deleted in the future 393 * or even deleted in the future
355 */ 394 */
356 table_desc.pointer = ACPI_ALLOCATE(length); 395 table_desc.pointer = ACPI_ALLOCATE(length);
357 if (!table_desc.pointer) { 396 if (!table_desc.pointer) {
358 return_ACPI_STATUS(AE_NO_MEMORY); 397 return_ACPI_STATUS(AE_NO_MEMORY);
359 } 398 }
360 399
361 ACPI_MEMCPY(table_desc.pointer, obj_desc->buffer.pointer, 400 ACPI_MEMCPY(table_desc.pointer, table, length);
362 length); 401 table_desc.address = ACPI_TO_INTEGER(table_desc.pointer);
363 table_desc.length = length;
364 table_desc.flags = ACPI_TABLE_ORIGIN_ALLOCATED;
365 break; 402 break;
366 403
367 default: 404 default:
368 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 405 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
369 } 406 }
370 407
371 /* 408 /* Validate table checksum (will not get validated in tb_add_table) */
372 * Install the new table into the local data structures 409
373 */ 410 status = acpi_tb_verify_checksum(table_desc.pointer, length);
411 if (ACPI_FAILURE(status)) {
412 ACPI_FREE(table_desc.pointer);
413 return_ACPI_STATUS(status);
414 }
415
416 /* Complete the table descriptor */
417
418 table_desc.length = length;
419 table_desc.flags = ACPI_TABLE_ORIGIN_ALLOCATED;
420
421 /* Install the new table into the local data structures */
422
374 status = acpi_tb_add_table(&table_desc, &table_index); 423 status = acpi_tb_add_table(&table_desc, &table_index);
375 if (ACPI_FAILURE(status)) { 424 if (ACPI_FAILURE(status)) {
376 goto cleanup; 425 goto cleanup;
@@ -379,7 +428,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
379 /* 428 /*
380 * Add the table to the namespace. 429 * Add the table to the namespace.
381 * 430 *
382 * Note: We load the table objects relative to the root of the namespace. 431 * Note: Load the table objects relative to the root of the namespace.
383 * This appears to go against the ACPI specification, but we do it for 432 * This appears to go against the ACPI specification, but we do it for
384 * compatibility with other ACPI implementations. 433 * compatibility with other ACPI implementations.
385 */ 434 */
@@ -415,7 +464,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
415 cleanup: 464 cleanup:
416 if (ACPI_FAILURE(status)) { 465 if (ACPI_FAILURE(status)) {
417 466
418 /* Delete allocated buffer or mapping */ 467 /* Delete allocated table buffer */
419 468
420 acpi_tb_delete_table(&table_desc); 469 acpi_tb_delete_table(&table_desc);
421 } 470 }
@@ -455,9 +504,9 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
455 return_ACPI_STATUS(AE_BAD_PARAMETER); 504 return_ACPI_STATUS(AE_BAD_PARAMETER);
456 } 505 }
457 506
458 /* Get the table index from the ddb_handle (acpi_size for 64-bit case) */ 507 /* Get the table index from the ddb_handle */
459 508
460 table_index = (u32) (acpi_size) table_desc->reference.object; 509 table_index = table_desc->reference.value;
461 510
462 /* Invoke table handler if present */ 511 /* Invoke table handler if present */
463 512
@@ -479,5 +528,8 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
479 528
480 acpi_tb_set_table_loaded_flag(table_index, FALSE); 529 acpi_tb_set_table_loaded_flag(table_index, FALSE);
481 530
531 /* Table unloaded, remove a reference to the ddb_handle object */
532
533 acpi_ut_remove_reference(ddb_handle);
482 return_ACPI_STATUS(AE_OK); 534 return_ACPI_STATUS(AE_OK);
483} 535}
diff --git a/drivers/acpi/executer/exconvrt.c b/drivers/acpi/executer/exconvrt.c
index 261d97516d9b..1d1f35adddde 100644
--- a/drivers/acpi/executer/exconvrt.c
+++ b/drivers/acpi/executer/exconvrt.c
@@ -57,7 +57,7 @@ acpi_ex_convert_to_ascii(acpi_integer integer,
57 * 57 *
58 * FUNCTION: acpi_ex_convert_to_integer 58 * FUNCTION: acpi_ex_convert_to_integer
59 * 59 *
60 * PARAMETERS: obj_desc - Object to be converted. Must be an 60 * PARAMETERS: obj_desc - Object to be converted. Must be an
61 * Integer, Buffer, or String 61 * Integer, Buffer, or String
62 * result_desc - Where the new Integer object is returned 62 * result_desc - Where the new Integer object is returned
63 * Flags - Used for string conversion 63 * Flags - Used for string conversion
@@ -103,7 +103,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
103 } 103 }
104 104
105 /* 105 /*
106 * Convert the buffer/string to an integer. Note that both buffers and 106 * Convert the buffer/string to an integer. Note that both buffers and
107 * strings are treated as raw data - we don't convert ascii to hex for 107 * strings are treated as raw data - we don't convert ascii to hex for
108 * strings. 108 * strings.
109 * 109 *
@@ -120,7 +120,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
120 120
121 /* 121 /*
122 * Convert string to an integer - for most cases, the string must be 122 * Convert string to an integer - for most cases, the string must be
123 * hexadecimal as per the ACPI specification. The only exception (as 123 * hexadecimal as per the ACPI specification. The only exception (as
124 * of ACPI 3.0) is that the to_integer() operator allows both decimal 124 * of ACPI 3.0) is that the to_integer() operator allows both decimal
125 * and hexadecimal strings (hex prefixed with "0x"). 125 * and hexadecimal strings (hex prefixed with "0x").
126 */ 126 */
@@ -159,6 +159,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
159 break; 159 break;
160 160
161 default: 161 default:
162
162 /* No other types can get here */ 163 /* No other types can get here */
163 break; 164 break;
164 } 165 }
@@ -185,7 +186,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
185 * 186 *
186 * FUNCTION: acpi_ex_convert_to_buffer 187 * FUNCTION: acpi_ex_convert_to_buffer
187 * 188 *
188 * PARAMETERS: obj_desc - Object to be converted. Must be an 189 * PARAMETERS: obj_desc - Object to be converted. Must be an
189 * Integer, Buffer, or String 190 * Integer, Buffer, or String
190 * result_desc - Where the new buffer object is returned 191 * result_desc - Where the new buffer object is returned
191 * 192 *
@@ -365,7 +366,7 @@ acpi_ex_convert_to_ascii(acpi_integer integer,
365 } 366 }
366 367
367 /* 368 /*
368 * Since leading zeros are supressed, we must check for the case where 369 * Since leading zeros are suppressed, we must check for the case where
369 * the integer equals 0 370 * the integer equals 0
370 * 371 *
371 * Finally, null terminate the string and return the length 372 * Finally, null terminate the string and return the length
@@ -383,7 +384,7 @@ acpi_ex_convert_to_ascii(acpi_integer integer,
383 * 384 *
384 * FUNCTION: acpi_ex_convert_to_string 385 * FUNCTION: acpi_ex_convert_to_string
385 * 386 *
386 * PARAMETERS: obj_desc - Object to be converted. Must be an 387 * PARAMETERS: obj_desc - Object to be converted. Must be an
387 * Integer, Buffer, or String 388 * Integer, Buffer, or String
388 * result_desc - Where the string object is returned 389 * result_desc - Where the string object is returned
389 * Type - String flags (base and conversion type) 390 * Type - String flags (base and conversion type)
@@ -472,7 +473,7 @@ acpi_ex_convert_to_string(union acpi_operand_object * obj_desc,
472 base = 10; 473 base = 10;
473 474
474 /* 475 /*
475 * Calculate the final string length. Individual string values 476 * Calculate the final string length. Individual string values
476 * are variable length (include separator for each) 477 * are variable length (include separator for each)
477 */ 478 */
478 for (i = 0; i < obj_desc->buffer.length; i++) { 479 for (i = 0; i < obj_desc->buffer.length; i++) {
@@ -511,9 +512,14 @@ acpi_ex_convert_to_string(union acpi_operand_object * obj_desc,
511 /* 512 /*
512 * Create a new string object and string buffer 513 * Create a new string object and string buffer
513 * (-1 because of extra separator included in string_length from above) 514 * (-1 because of extra separator included in string_length from above)
515 * Allow creation of zero-length strings from zero-length buffers.
514 */ 516 */
517 if (string_length) {
518 string_length--;
519 }
520
515 return_desc = acpi_ut_create_string_object((acpi_size) 521 return_desc = acpi_ut_create_string_object((acpi_size)
516 (string_length - 1)); 522 string_length);
517 if (!return_desc) { 523 if (!return_desc) {
518 return_ACPI_STATUS(AE_NO_MEMORY); 524 return_ACPI_STATUS(AE_NO_MEMORY);
519 } 525 }
@@ -536,7 +542,9 @@ acpi_ex_convert_to_string(union acpi_operand_object * obj_desc,
536 * Null terminate the string 542 * Null terminate the string
537 * (overwrites final comma/space from above) 543 * (overwrites final comma/space from above)
538 */ 544 */
539 new_buf--; 545 if (obj_desc->buffer.length) {
546 new_buf--;
547 }
540 *new_buf = 0; 548 *new_buf = 0;
541 break; 549 break;
542 550
@@ -617,7 +625,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
617 case ACPI_TYPE_LOCAL_BANK_FIELD: 625 case ACPI_TYPE_LOCAL_BANK_FIELD:
618 case ACPI_TYPE_LOCAL_INDEX_FIELD: 626 case ACPI_TYPE_LOCAL_INDEX_FIELD:
619 /* 627 /*
620 * These types require an Integer operand. We can convert 628 * These types require an Integer operand. We can convert
621 * a Buffer or a String to an Integer if necessary. 629 * a Buffer or a String to an Integer if necessary.
622 */ 630 */
623 status = 631 status =
@@ -627,7 +635,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
627 635
628 case ACPI_TYPE_STRING: 636 case ACPI_TYPE_STRING:
629 /* 637 /*
630 * The operand must be a String. We can convert an 638 * The operand must be a String. We can convert an
631 * Integer or Buffer if necessary 639 * Integer or Buffer if necessary
632 */ 640 */
633 status = 641 status =
@@ -637,7 +645,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
637 645
638 case ACPI_TYPE_BUFFER: 646 case ACPI_TYPE_BUFFER:
639 /* 647 /*
640 * The operand must be a Buffer. We can convert an 648 * The operand must be a Buffer. We can convert an
641 * Integer or String if necessary 649 * Integer or String if necessary
642 */ 650 */
643 status = 651 status =
diff --git a/drivers/acpi/executer/exdump.c b/drivers/acpi/executer/exdump.c
index 2be2e2bf95bf..d087a7d28aa5 100644
--- a/drivers/acpi/executer/exdump.c
+++ b/drivers/acpi/executer/exdump.c
@@ -45,7 +45,6 @@
45#include <acpi/acinterp.h> 45#include <acpi/acinterp.h>
46#include <acpi/amlcode.h> 46#include <acpi/amlcode.h>
47#include <acpi/acnamesp.h> 47#include <acpi/acnamesp.h>
48#include <acpi/acparser.h>
49 48
50#define _COMPONENT ACPI_EXECUTER 49#define _COMPONENT ACPI_EXECUTER
51ACPI_MODULE_NAME("exdump") 50ACPI_MODULE_NAME("exdump")
@@ -214,10 +213,11 @@ static struct acpi_exdump_info acpi_ex_dump_index_field[5] = {
214 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.data_obj), "Data Object"} 213 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.data_obj), "Data Object"}
215}; 214};
216 215
217static struct acpi_exdump_info acpi_ex_dump_reference[7] = { 216static struct acpi_exdump_info acpi_ex_dump_reference[8] = {
218 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_reference), NULL}, 217 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_reference), NULL},
218 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.class), "Class"},
219 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.target_type), "Target Type"}, 219 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.target_type), "Target Type"},
220 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(reference.offset), "Offset"}, 220 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(reference.value), "Value"},
221 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.object), "Object Desc"}, 221 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.object), "Object Desc"},
222 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.node), "Node"}, 222 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.node), "Node"},
223 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.where), "Where"}, 223 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.where), "Where"},
@@ -413,10 +413,10 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
413 413
414 case ACPI_EXD_REFERENCE: 414 case ACPI_EXD_REFERENCE:
415 415
416 acpi_ex_out_string("Opcode", 416 acpi_ex_out_string("Class Name",
417 (acpi_ps_get_opcode_info 417 (char *)
418 (obj_desc->reference.opcode))-> 418 acpi_ut_get_reference_name
419 name); 419 (obj_desc));
420 acpi_ex_dump_reference_obj(obj_desc); 420 acpi_ex_dump_reference_obj(obj_desc);
421 break; 421 break;
422 422
@@ -494,40 +494,41 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
494 switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { 494 switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
495 case ACPI_TYPE_LOCAL_REFERENCE: 495 case ACPI_TYPE_LOCAL_REFERENCE:
496 496
497 switch (obj_desc->reference.opcode) { 497 acpi_os_printf("Reference: [%s] ",
498 case AML_DEBUG_OP: 498 acpi_ut_get_reference_name(obj_desc));
499
500 switch (obj_desc->reference.class) {
501 case ACPI_REFCLASS_DEBUG:
499 502
500 acpi_os_printf("Reference: Debug\n"); 503 acpi_os_printf("\n");
501 break; 504 break;
502 505
503 case AML_INDEX_OP: 506 case ACPI_REFCLASS_INDEX:
504 507
505 acpi_os_printf("Reference: Index %p\n", 508 acpi_os_printf("%p\n", obj_desc->reference.object);
506 obj_desc->reference.object);
507 break; 509 break;
508 510
509 case AML_LOAD_OP: 511 case ACPI_REFCLASS_TABLE:
510 512
511 acpi_os_printf("Reference: [DdbHandle] TableIndex %p\n", 513 acpi_os_printf("Table Index %X\n",
512 obj_desc->reference.object); 514 obj_desc->reference.value);
513 break; 515 break;
514 516
515 case AML_REF_OF_OP: 517 case ACPI_REFCLASS_REFOF:
516 518
517 acpi_os_printf("Reference: (RefOf) %p [%s]\n", 519 acpi_os_printf("%p [%s]\n", obj_desc->reference.object,
518 obj_desc->reference.object,
519 acpi_ut_get_type_name(((union 520 acpi_ut_get_type_name(((union
520 acpi_operand_object 521 acpi_operand_object
521 *)obj_desc-> 522 *)
523 obj_desc->
522 reference. 524 reference.
523 object)->common. 525 object)->common.
524 type)); 526 type));
525 break; 527 break;
526 528
527 case AML_ARG_OP: 529 case ACPI_REFCLASS_ARG:
528 530
529 acpi_os_printf("Reference: Arg%d", 531 acpi_os_printf("%X", obj_desc->reference.value);
530 obj_desc->reference.offset);
531 532
532 if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { 533 if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
533 534
@@ -542,10 +543,9 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
542 acpi_os_printf("\n"); 543 acpi_os_printf("\n");
543 break; 544 break;
544 545
545 case AML_LOCAL_OP: 546 case ACPI_REFCLASS_LOCAL:
546 547
547 acpi_os_printf("Reference: Local%d", 548 acpi_os_printf("%X", obj_desc->reference.value);
548 obj_desc->reference.offset);
549 549
550 if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { 550 if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
551 551
@@ -560,21 +560,16 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
560 acpi_os_printf("\n"); 560 acpi_os_printf("\n");
561 break; 561 break;
562 562
563 case AML_INT_NAMEPATH_OP: 563 case ACPI_REFCLASS_NAME:
564 564
565 acpi_os_printf("Reference: Namepath %X [%4.4s]\n", 565 acpi_os_printf("- [%4.4s]\n",
566 obj_desc->reference.node->name.integer,
567 obj_desc->reference.node->name.ascii); 566 obj_desc->reference.node->name.ascii);
568 break; 567 break;
569 568
570 default: 569 default: /* Unknown reference class */
571
572 /* Unknown opcode */
573 570
574 acpi_os_printf("Unknown Reference opcode=%X\n", 571 acpi_os_printf("%2.2X\n", obj_desc->reference.class);
575 obj_desc->reference.opcode);
576 break; 572 break;
577
578 } 573 }
579 break; 574 break;
580 575
@@ -865,8 +860,8 @@ static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc)
865 860
866 ret_buf.length = ACPI_ALLOCATE_LOCAL_BUFFER; 861 ret_buf.length = ACPI_ALLOCATE_LOCAL_BUFFER;
867 862
868 if (obj_desc->reference.opcode == AML_INT_NAMEPATH_OP) { 863 if (obj_desc->reference.class == ACPI_REFCLASS_NAME) {
869 acpi_os_printf(" Named Object %p ", obj_desc->reference.node); 864 acpi_os_printf(" %p ", obj_desc->reference.node);
870 865
871 status = 866 status =
872 acpi_ns_handle_to_pathname(obj_desc->reference.node, 867 acpi_ns_handle_to_pathname(obj_desc->reference.node,
@@ -882,14 +877,12 @@ static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc)
882 ACPI_DESC_TYPE_OPERAND) { 877 ACPI_DESC_TYPE_OPERAND) {
883 acpi_os_printf(" Target: %p", 878 acpi_os_printf(" Target: %p",
884 obj_desc->reference.object); 879 obj_desc->reference.object);
885 if (obj_desc->reference.opcode == AML_LOAD_OP) { 880 if (obj_desc->reference.class == ACPI_REFCLASS_TABLE) {
886 /* 881 acpi_os_printf(" Table Index: %X\n",
887 * For DDBHandle reference, 882 obj_desc->reference.value);
888 * obj_desc->Reference.Object is the table index
889 */
890 acpi_os_printf(" [DDBHandle]\n");
891 } else { 883 } else {
892 acpi_os_printf(" [%s]\n", 884 acpi_os_printf(" Target: %p [%s]\n",
885 obj_desc->reference.object,
893 acpi_ut_get_type_name(((union 886 acpi_ut_get_type_name(((union
894 acpi_operand_object 887 acpi_operand_object
895 *) 888 *)
@@ -988,9 +981,9 @@ acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc,
988 981
989 case ACPI_TYPE_LOCAL_REFERENCE: 982 case ACPI_TYPE_LOCAL_REFERENCE:
990 983
991 acpi_os_printf("[Object Reference] %s", 984 acpi_os_printf("[Object Reference] Type [%s] %2.2X",
992 (acpi_ps_get_opcode_info 985 acpi_ut_get_reference_name(obj_desc),
993 (obj_desc->reference.opcode))->name); 986 obj_desc->reference.class);
994 acpi_ex_dump_reference_obj(obj_desc); 987 acpi_ex_dump_reference_obj(obj_desc);
995 break; 988 break;
996 989
diff --git a/drivers/acpi/executer/exmisc.c b/drivers/acpi/executer/exmisc.c
index 731414a581a6..efb191340059 100644
--- a/drivers/acpi/executer/exmisc.c
+++ b/drivers/acpi/executer/exmisc.c
@@ -86,10 +86,10 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
86 /* 86 /*
87 * Must be a reference to a Local or Arg 87 * Must be a reference to a Local or Arg
88 */ 88 */
89 switch (obj_desc->reference.opcode) { 89 switch (obj_desc->reference.class) {
90 case AML_LOCAL_OP: 90 case ACPI_REFCLASS_LOCAL:
91 case AML_ARG_OP: 91 case ACPI_REFCLASS_ARG:
92 case AML_DEBUG_OP: 92 case ACPI_REFCLASS_DEBUG:
93 93
94 /* The referenced object is the pseudo-node for the local/arg */ 94 /* The referenced object is the pseudo-node for the local/arg */
95 95
@@ -98,8 +98,8 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
98 98
99 default: 99 default:
100 100
101 ACPI_ERROR((AE_INFO, "Unknown Reference opcode %X", 101 ACPI_ERROR((AE_INFO, "Unknown Reference Class %2.2X",
102 obj_desc->reference.opcode)); 102 obj_desc->reference.class));
103 return_ACPI_STATUS(AE_AML_INTERNAL); 103 return_ACPI_STATUS(AE_AML_INTERNAL);
104 } 104 }
105 break; 105 break;
@@ -127,7 +127,7 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
127 return_ACPI_STATUS(AE_NO_MEMORY); 127 return_ACPI_STATUS(AE_NO_MEMORY);
128 } 128 }
129 129
130 reference_obj->reference.opcode = AML_REF_OF_OP; 130 reference_obj->reference.class = ACPI_REFCLASS_REFOF;
131 reference_obj->reference.object = referenced_obj; 131 reference_obj->reference.object = referenced_obj;
132 *return_desc = reference_obj; 132 *return_desc = reference_obj;
133 133
diff --git a/drivers/acpi/executer/exoparg1.c b/drivers/acpi/executer/exoparg1.c
index 7c3bea575e02..f622f9eac8a1 100644
--- a/drivers/acpi/executer/exoparg1.c
+++ b/drivers/acpi/executer/exoparg1.c
@@ -825,16 +825,16 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
825 * 825 *
826 * Must resolve/dereference the local/arg reference first 826 * Must resolve/dereference the local/arg reference first
827 */ 827 */
828 switch (operand[0]->reference.opcode) { 828 switch (operand[0]->reference.class) {
829 case AML_LOCAL_OP: 829 case ACPI_REFCLASS_LOCAL:
830 case AML_ARG_OP: 830 case ACPI_REFCLASS_ARG:
831 831
832 /* Set Operand[0] to the value of the local/arg */ 832 /* Set Operand[0] to the value of the local/arg */
833 833
834 status = 834 status =
835 acpi_ds_method_data_get_value 835 acpi_ds_method_data_get_value
836 (operand[0]->reference.opcode, 836 (operand[0]->reference.class,
837 operand[0]->reference.offset, 837 operand[0]->reference.value,
838 walk_state, &temp_desc); 838 walk_state, &temp_desc);
839 if (ACPI_FAILURE(status)) { 839 if (ACPI_FAILURE(status)) {
840 goto cleanup; 840 goto cleanup;
@@ -848,7 +848,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
848 operand[0] = temp_desc; 848 operand[0] = temp_desc;
849 break; 849 break;
850 850
851 case AML_REF_OF_OP: 851 case ACPI_REFCLASS_REFOF:
852 852
853 /* Get the object to which the reference refers */ 853 /* Get the object to which the reference refers */
854 854
@@ -928,8 +928,8 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
928 * This must be a reference object produced by either the 928 * This must be a reference object produced by either the
929 * Index() or ref_of() operator 929 * Index() or ref_of() operator
930 */ 930 */
931 switch (operand[0]->reference.opcode) { 931 switch (operand[0]->reference.class) {
932 case AML_INDEX_OP: 932 case ACPI_REFCLASS_INDEX:
933 933
934 /* 934 /*
935 * The target type for the Index operator must be 935 * The target type for the Index operator must be
@@ -965,7 +965,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
965 return_desc->integer.value = 965 return_desc->integer.value =
966 temp_desc->buffer. 966 temp_desc->buffer.
967 pointer[operand[0]->reference. 967 pointer[operand[0]->reference.
968 offset]; 968 value];
969 break; 969 break;
970 970
971 case ACPI_TYPE_PACKAGE: 971 case ACPI_TYPE_PACKAGE:
@@ -985,7 +985,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
985 default: 985 default:
986 986
987 ACPI_ERROR((AE_INFO, 987 ACPI_ERROR((AE_INFO,
988 "Unknown Index TargetType %X in obj %p", 988 "Unknown Index TargetType %X in reference object %p",
989 operand[0]->reference. 989 operand[0]->reference.
990 target_type, operand[0])); 990 target_type, operand[0]));
991 status = AE_AML_OPERAND_TYPE; 991 status = AE_AML_OPERAND_TYPE;
@@ -993,7 +993,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
993 } 993 }
994 break; 994 break;
995 995
996 case AML_REF_OF_OP: 996 case ACPI_REFCLASS_REFOF:
997 997
998 return_desc = operand[0]->reference.object; 998 return_desc = operand[0]->reference.object;
999 999
@@ -1013,9 +1013,9 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
1013 1013
1014 default: 1014 default:
1015 ACPI_ERROR((AE_INFO, 1015 ACPI_ERROR((AE_INFO,
1016 "Unknown opcode in reference(%p) - %X", 1016 "Unknown class in reference(%p) - %2.2X",
1017 operand[0], 1017 operand[0],
1018 operand[0]->reference.opcode)); 1018 operand[0]->reference.class));
1019 1019
1020 status = AE_TYPE; 1020 status = AE_TYPE;
1021 goto cleanup; 1021 goto cleanup;
diff --git a/drivers/acpi/executer/exoparg2.c b/drivers/acpi/executer/exoparg2.c
index 8e8bbb6ccebd..368def5dffce 100644
--- a/drivers/acpi/executer/exoparg2.c
+++ b/drivers/acpi/executer/exoparg2.c
@@ -391,8 +391,8 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
391 /* Initialize the Index reference object */ 391 /* Initialize the Index reference object */
392 392
393 index = operand[1]->integer.value; 393 index = operand[1]->integer.value;
394 return_desc->reference.offset = (u32) index; 394 return_desc->reference.value = (u32) index;
395 return_desc->reference.opcode = AML_INDEX_OP; 395 return_desc->reference.class = ACPI_REFCLASS_INDEX;
396 396
397 /* 397 /*
398 * At this point, the Source operand is a String, Buffer, or Package. 398 * At this point, the Source operand is a String, Buffer, or Package.
diff --git a/drivers/acpi/executer/exresnte.c b/drivers/acpi/executer/exresnte.c
index 5596f42c9676..423ad3635f3d 100644
--- a/drivers/acpi/executer/exresnte.c
+++ b/drivers/acpi/executer/exresnte.c
@@ -46,8 +46,6 @@
46#include <acpi/acdispat.h> 46#include <acpi/acdispat.h>
47#include <acpi/acinterp.h> 47#include <acpi/acinterp.h>
48#include <acpi/acnamesp.h> 48#include <acpi/acnamesp.h>
49#include <acpi/acparser.h>
50#include <acpi/amlcode.h>
51 49
52#define _COMPONENT ACPI_EXECUTER 50#define _COMPONENT ACPI_EXECUTER
53ACPI_MODULE_NAME("exresnte") 51ACPI_MODULE_NAME("exresnte")
@@ -238,10 +236,10 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
238 236
239 case ACPI_TYPE_LOCAL_REFERENCE: 237 case ACPI_TYPE_LOCAL_REFERENCE:
240 238
241 switch (source_desc->reference.opcode) { 239 switch (source_desc->reference.class) {
242 case AML_LOAD_OP: /* This is a ddb_handle */ 240 case ACPI_REFCLASS_TABLE: /* This is a ddb_handle */
243 case AML_REF_OF_OP: 241 case ACPI_REFCLASS_REFOF:
244 case AML_INDEX_OP: 242 case ACPI_REFCLASS_INDEX:
245 243
246 /* Return an additional reference to the object */ 244 /* Return an additional reference to the object */
247 245
@@ -253,10 +251,8 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
253 /* No named references are allowed here */ 251 /* No named references are allowed here */
254 252
255 ACPI_ERROR((AE_INFO, 253 ACPI_ERROR((AE_INFO,
256 "Unsupported Reference opcode %X (%s)", 254 "Unsupported Reference type %X",
257 source_desc->reference.opcode, 255 source_desc->reference.class));
258 acpi_ps_get_opcode_name(source_desc->
259 reference.opcode)));
260 256
261 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 257 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
262 } 258 }
diff --git a/drivers/acpi/executer/exresolv.c b/drivers/acpi/executer/exresolv.c
index b35f7c817acf..89571b92a522 100644
--- a/drivers/acpi/executer/exresolv.c
+++ b/drivers/acpi/executer/exresolv.c
@@ -47,7 +47,6 @@
47#include <acpi/acdispat.h> 47#include <acpi/acdispat.h>
48#include <acpi/acinterp.h> 48#include <acpi/acinterp.h>
49#include <acpi/acnamesp.h> 49#include <acpi/acnamesp.h>
50#include <acpi/acparser.h>
51 50
52#define _COMPONENT ACPI_EXECUTER 51#define _COMPONENT ACPI_EXECUTER
53ACPI_MODULE_NAME("exresolv") 52ACPI_MODULE_NAME("exresolv")
@@ -141,7 +140,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
141 acpi_status status = AE_OK; 140 acpi_status status = AE_OK;
142 union acpi_operand_object *stack_desc; 141 union acpi_operand_object *stack_desc;
143 union acpi_operand_object *obj_desc = NULL; 142 union acpi_operand_object *obj_desc = NULL;
144 u16 opcode; 143 u8 ref_type;
145 144
146 ACPI_FUNCTION_TRACE(ex_resolve_object_to_value); 145 ACPI_FUNCTION_TRACE(ex_resolve_object_to_value);
147 146
@@ -152,19 +151,19 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
152 switch (ACPI_GET_OBJECT_TYPE(stack_desc)) { 151 switch (ACPI_GET_OBJECT_TYPE(stack_desc)) {
153 case ACPI_TYPE_LOCAL_REFERENCE: 152 case ACPI_TYPE_LOCAL_REFERENCE:
154 153
155 opcode = stack_desc->reference.opcode; 154 ref_type = stack_desc->reference.class;
156 155
157 switch (opcode) { 156 switch (ref_type) {
158 case AML_LOCAL_OP: 157 case ACPI_REFCLASS_LOCAL:
159 case AML_ARG_OP: 158 case ACPI_REFCLASS_ARG:
160 159
161 /* 160 /*
162 * Get the local from the method's state info 161 * Get the local from the method's state info
163 * Note: this increments the local's object reference count 162 * Note: this increments the local's object reference count
164 */ 163 */
165 status = acpi_ds_method_data_get_value(opcode, 164 status = acpi_ds_method_data_get_value(ref_type,
166 stack_desc-> 165 stack_desc->
167 reference.offset, 166 reference.value,
168 walk_state, 167 walk_state,
169 &obj_desc); 168 &obj_desc);
170 if (ACPI_FAILURE(status)) { 169 if (ACPI_FAILURE(status)) {
@@ -173,7 +172,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
173 172
174 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 173 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
175 "[Arg/Local %X] ValueObj is %p\n", 174 "[Arg/Local %X] ValueObj is %p\n",
176 stack_desc->reference.offset, 175 stack_desc->reference.value,
177 obj_desc)); 176 obj_desc));
178 177
179 /* 178 /*
@@ -184,7 +183,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
184 *stack_ptr = obj_desc; 183 *stack_ptr = obj_desc;
185 break; 184 break;
186 185
187 case AML_INDEX_OP: 186 case ACPI_REFCLASS_INDEX:
188 187
189 switch (stack_desc->reference.target_type) { 188 switch (stack_desc->reference.target_type) {
190 case ACPI_TYPE_BUFFER_FIELD: 189 case ACPI_TYPE_BUFFER_FIELD:
@@ -239,15 +238,15 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
239 } 238 }
240 break; 239 break;
241 240
242 case AML_REF_OF_OP: 241 case ACPI_REFCLASS_REFOF:
243 case AML_DEBUG_OP: 242 case ACPI_REFCLASS_DEBUG:
244 case AML_LOAD_OP: 243 case ACPI_REFCLASS_TABLE:
245 244
246 /* Just leave the object as-is, do not dereference */ 245 /* Just leave the object as-is, do not dereference */
247 246
248 break; 247 break;
249 248
250 case AML_INT_NAMEPATH_OP: /* Reference to a named object */ 249 case ACPI_REFCLASS_NAME: /* Reference to a named object */
251 250
252 /* Dereference the name */ 251 /* Dereference the name */
253 252
@@ -273,8 +272,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
273 default: 272 default:
274 273
275 ACPI_ERROR((AE_INFO, 274 ACPI_ERROR((AE_INFO,
276 "Unknown Reference opcode %X (%s) in %p", 275 "Unknown Reference type %X in %p", ref_type,
277 opcode, acpi_ps_get_opcode_name(opcode),
278 stack_desc)); 276 stack_desc));
279 status = AE_AML_INTERNAL; 277 status = AE_AML_INTERNAL;
280 break; 278 break;
@@ -388,13 +386,13 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
388 * traversing the list of possibly many nested references. 386 * traversing the list of possibly many nested references.
389 */ 387 */
390 while (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_LOCAL_REFERENCE) { 388 while (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_LOCAL_REFERENCE) {
391 switch (obj_desc->reference.opcode) { 389 switch (obj_desc->reference.class) {
392 case AML_REF_OF_OP: 390 case ACPI_REFCLASS_REFOF:
393 case AML_INT_NAMEPATH_OP: 391 case ACPI_REFCLASS_NAME:
394 392
395 /* Dereference the reference pointer */ 393 /* Dereference the reference pointer */
396 394
397 if (obj_desc->reference.opcode == AML_REF_OF_OP) { 395 if (obj_desc->reference.class == ACPI_REFCLASS_REFOF) {
398 node = obj_desc->reference.object; 396 node = obj_desc->reference.object;
399 } else { /* AML_INT_NAMEPATH_OP */ 397 } else { /* AML_INT_NAMEPATH_OP */
400 398
@@ -429,7 +427,7 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
429 } 427 }
430 break; 428 break;
431 429
432 case AML_INDEX_OP: 430 case ACPI_REFCLASS_INDEX:
433 431
434 /* Get the type of this reference (index into another object) */ 432 /* Get the type of this reference (index into another object) */
435 433
@@ -455,22 +453,22 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
455 } 453 }
456 break; 454 break;
457 455
458 case AML_LOAD_OP: 456 case ACPI_REFCLASS_TABLE:
459 457
460 type = ACPI_TYPE_DDB_HANDLE; 458 type = ACPI_TYPE_DDB_HANDLE;
461 goto exit; 459 goto exit;
462 460
463 case AML_LOCAL_OP: 461 case ACPI_REFCLASS_LOCAL:
464 case AML_ARG_OP: 462 case ACPI_REFCLASS_ARG:
465 463
466 if (return_desc) { 464 if (return_desc) {
467 status = 465 status =
468 acpi_ds_method_data_get_value(obj_desc-> 466 acpi_ds_method_data_get_value(obj_desc->
469 reference. 467 reference.
470 opcode, 468 class,
471 obj_desc-> 469 obj_desc->
472 reference. 470 reference.
473 offset, 471 value,
474 walk_state, 472 walk_state,
475 &obj_desc); 473 &obj_desc);
476 if (ACPI_FAILURE(status)) { 474 if (ACPI_FAILURE(status)) {
@@ -481,10 +479,10 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
481 status = 479 status =
482 acpi_ds_method_data_get_node(obj_desc-> 480 acpi_ds_method_data_get_node(obj_desc->
483 reference. 481 reference.
484 opcode, 482 class,
485 obj_desc-> 483 obj_desc->
486 reference. 484 reference.
487 offset, 485 value,
488 walk_state, 486 walk_state,
489 &node); 487 &node);
490 if (ACPI_FAILURE(status)) { 488 if (ACPI_FAILURE(status)) {
@@ -499,7 +497,7 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
499 } 497 }
500 break; 498 break;
501 499
502 case AML_DEBUG_OP: 500 case ACPI_REFCLASS_DEBUG:
503 501
504 /* The Debug Object is of type "DebugObject" */ 502 /* The Debug Object is of type "DebugObject" */
505 503
@@ -509,8 +507,8 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
509 default: 507 default:
510 508
511 ACPI_ERROR((AE_INFO, 509 ACPI_ERROR((AE_INFO,
512 "Unknown Reference subtype %X", 510 "Unknown Reference Class %2.2X",
513 obj_desc->reference.opcode)); 511 obj_desc->reference.class));
514 return_ACPI_STATUS(AE_AML_INTERNAL); 512 return_ACPI_STATUS(AE_AML_INTERNAL);
515 } 513 }
516 } 514 }
diff --git a/drivers/acpi/executer/exresop.c b/drivers/acpi/executer/exresop.c
index 54085f16ec28..0bb82593da72 100644
--- a/drivers/acpi/executer/exresop.c
+++ b/drivers/acpi/executer/exresop.c
@@ -225,41 +225,36 @@ acpi_ex_resolve_operands(u16 opcode,
225 225
226 if (object_type == (u8) ACPI_TYPE_LOCAL_REFERENCE) { 226 if (object_type == (u8) ACPI_TYPE_LOCAL_REFERENCE) {
227 227
228 /* Decode the Reference */ 228 /* Validate the Reference */
229 229
230 op_info = acpi_ps_get_opcode_info(opcode); 230 switch (obj_desc->reference.class) {
231 if (op_info->class == AML_CLASS_UNKNOWN) { 231 case ACPI_REFCLASS_DEBUG:
232 return_ACPI_STATUS(AE_AML_BAD_OPCODE);
233 }
234 232
235 switch (obj_desc->reference.opcode) {
236 case AML_DEBUG_OP:
237 target_op = AML_DEBUG_OP; 233 target_op = AML_DEBUG_OP;
238 234
239 /*lint -fallthrough */ 235 /*lint -fallthrough */
240 236
241 case AML_INDEX_OP: 237 case ACPI_REFCLASS_ARG:
242 case AML_REF_OF_OP: 238 case ACPI_REFCLASS_LOCAL:
243 case AML_ARG_OP: 239 case ACPI_REFCLASS_INDEX:
244 case AML_LOCAL_OP: 240 case ACPI_REFCLASS_REFOF:
245 case AML_LOAD_OP: /* ddb_handle from LOAD_OP or LOAD_TABLE_OP */ 241 case ACPI_REFCLASS_TABLE: /* ddb_handle from LOAD_OP or LOAD_TABLE_OP */
246 case AML_INT_NAMEPATH_OP: /* Reference to a named object */ 242 case ACPI_REFCLASS_NAME: /* Reference to a named object */
247 243
248 ACPI_DEBUG_ONLY_MEMBERS(ACPI_DEBUG_PRINT 244 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
249 ((ACPI_DB_EXEC, 245 "Operand is a Reference, Class [%s] %2.2X\n",
250 "Operand is a Reference, RefOpcode [%s]\n", 246 acpi_ut_get_reference_name
251 (acpi_ps_get_opcode_info 247 (obj_desc),
252 (obj_desc-> 248 obj_desc->reference.
253 reference. 249 class));
254 opcode))->
255 name)));
256 break; 250 break;
257 251
258 default: 252 default:
253
259 ACPI_ERROR((AE_INFO, 254 ACPI_ERROR((AE_INFO,
260 "Operand is a Reference, Unknown Reference Opcode: %X", 255 "Unknown Reference Class %2.2X in %p",
261 obj_desc->reference. 256 obj_desc->reference.class,
262 opcode)); 257 obj_desc));
263 258
264 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 259 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
265 } 260 }
@@ -270,8 +265,7 @@ acpi_ex_resolve_operands(u16 opcode,
270 265
271 /* Invalid descriptor */ 266 /* Invalid descriptor */
272 267
273 ACPI_ERROR((AE_INFO, 268 ACPI_ERROR((AE_INFO, "Invalid descriptor %p [%s]",
274 "Invalid descriptor %p [%s]",
275 obj_desc, 269 obj_desc,
276 acpi_ut_get_descriptor_name(obj_desc))); 270 acpi_ut_get_descriptor_name(obj_desc)));
277 271
@@ -343,7 +337,7 @@ acpi_ex_resolve_operands(u16 opcode,
343 if ((opcode == AML_STORE_OP) && 337 if ((opcode == AML_STORE_OP) &&
344 (ACPI_GET_OBJECT_TYPE(*stack_ptr) == 338 (ACPI_GET_OBJECT_TYPE(*stack_ptr) ==
345 ACPI_TYPE_LOCAL_REFERENCE) 339 ACPI_TYPE_LOCAL_REFERENCE)
346 && ((*stack_ptr)->reference.opcode == AML_INDEX_OP)) { 340 && ((*stack_ptr)->reference.class == ACPI_REFCLASS_INDEX)) {
347 goto next_operand; 341 goto next_operand;
348 } 342 }
349 break; 343 break;
diff --git a/drivers/acpi/executer/exstore.c b/drivers/acpi/executer/exstore.c
index 38b55e352495..3318df4cbd98 100644
--- a/drivers/acpi/executer/exstore.c
+++ b/drivers/acpi/executer/exstore.c
@@ -47,7 +47,6 @@
47#include <acpi/acinterp.h> 47#include <acpi/acinterp.h>
48#include <acpi/amlcode.h> 48#include <acpi/amlcode.h>
49#include <acpi/acnamesp.h> 49#include <acpi/acnamesp.h>
50#include <acpi/acparser.h>
51 50
52#define _COMPONENT ACPI_EXECUTER 51#define _COMPONENT ACPI_EXECUTER
53ACPI_MODULE_NAME("exstore") 52ACPI_MODULE_NAME("exstore")
@@ -179,22 +178,26 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
179 178
180 case ACPI_TYPE_LOCAL_REFERENCE: 179 case ACPI_TYPE_LOCAL_REFERENCE:
181 180
182 if (source_desc->reference.opcode == AML_INDEX_OP) { 181 ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "[%s] ",
183 ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, 182 acpi_ut_get_reference_name(source_desc)));
184 "[%s, 0x%X]\n", 183
185 acpi_ps_get_opcode_name 184 /* Decode the reference */
186 (source_desc->reference.opcode), 185
187 source_desc->reference.offset)); 186 switch (source_desc->reference.class) {
188 } else { 187 case ACPI_REFCLASS_INDEX:
189 ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "[%s]", 188
190 acpi_ps_get_opcode_name 189 ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "0x%X\n",
191 (source_desc->reference.opcode))); 190 source_desc->reference.value));
192 } 191 break;
192
193 case ACPI_REFCLASS_TABLE:
193 194
194 if (source_desc->reference.opcode == AML_LOAD_OP) { /* Load and load_table */
195 ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, 195 ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT,
196 " Table OwnerId %p\n", 196 "Table Index 0x%X\n",
197 source_desc->reference.object)); 197 source_desc->reference.value));
198 break;
199
200 default:
198 break; 201 break;
199 } 202 }
200 203
@@ -347,15 +350,15 @@ acpi_ex_store(union acpi_operand_object *source_desc,
347 } 350 }
348 351
349 /* 352 /*
350 * Examine the Reference opcode. These cases are handled: 353 * Examine the Reference class. These cases are handled:
351 * 354 *
352 * 1) Store to Name (Change the object associated with a name) 355 * 1) Store to Name (Change the object associated with a name)
353 * 2) Store to an indexed area of a Buffer or Package 356 * 2) Store to an indexed area of a Buffer or Package
354 * 3) Store to a Method Local or Arg 357 * 3) Store to a Method Local or Arg
355 * 4) Store to the debug object 358 * 4) Store to the debug object
356 */ 359 */
357 switch (ref_desc->reference.opcode) { 360 switch (ref_desc->reference.class) {
358 case AML_REF_OF_OP: 361 case ACPI_REFCLASS_REFOF:
359 362
360 /* Storing an object into a Name "container" */ 363 /* Storing an object into a Name "container" */
361 364
@@ -365,7 +368,7 @@ acpi_ex_store(union acpi_operand_object *source_desc,
365 ACPI_IMPLICIT_CONVERSION); 368 ACPI_IMPLICIT_CONVERSION);
366 break; 369 break;
367 370
368 case AML_INDEX_OP: 371 case ACPI_REFCLASS_INDEX:
369 372
370 /* Storing to an Index (pointer into a packager or buffer) */ 373 /* Storing to an Index (pointer into a packager or buffer) */
371 374
@@ -374,18 +377,18 @@ acpi_ex_store(union acpi_operand_object *source_desc,
374 walk_state); 377 walk_state);
375 break; 378 break;
376 379
377 case AML_LOCAL_OP: 380 case ACPI_REFCLASS_LOCAL:
378 case AML_ARG_OP: 381 case ACPI_REFCLASS_ARG:
379 382
380 /* Store to a method local/arg */ 383 /* Store to a method local/arg */
381 384
382 status = 385 status =
383 acpi_ds_store_object_to_local(ref_desc->reference.opcode, 386 acpi_ds_store_object_to_local(ref_desc->reference.class,
384 ref_desc->reference.offset, 387 ref_desc->reference.value,
385 source_desc, walk_state); 388 source_desc, walk_state);
386 break; 389 break;
387 390
388 case AML_DEBUG_OP: 391 case ACPI_REFCLASS_DEBUG:
389 392
390 /* 393 /*
391 * Storing to the Debug object causes the value stored to be 394 * Storing to the Debug object causes the value stored to be
@@ -401,9 +404,9 @@ acpi_ex_store(union acpi_operand_object *source_desc,
401 404
402 default: 405 default:
403 406
404 ACPI_ERROR((AE_INFO, "Unknown Reference opcode %X", 407 ACPI_ERROR((AE_INFO, "Unknown Reference Class %2.2X",
405 ref_desc->reference.opcode)); 408 ref_desc->reference.class));
406 ACPI_DUMP_ENTRY(ref_desc, ACPI_LV_ERROR); 409 ACPI_DUMP_ENTRY(ref_desc, ACPI_LV_INFO);
407 410
408 status = AE_AML_INTERNAL; 411 status = AE_AML_INTERNAL;
409 break; 412 break;
@@ -458,7 +461,7 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
458 461
459 if (ACPI_GET_OBJECT_TYPE(source_desc) == 462 if (ACPI_GET_OBJECT_TYPE(source_desc) ==
460 ACPI_TYPE_LOCAL_REFERENCE 463 ACPI_TYPE_LOCAL_REFERENCE
461 && source_desc->reference.opcode == AML_LOAD_OP) { 464 && source_desc->reference.class == ACPI_REFCLASS_TABLE) {
462 465
463 /* This is a DDBHandle, just add a reference to it */ 466 /* This is a DDBHandle, just add a reference to it */
464 467
@@ -553,7 +556,7 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
553 556
554 /* Store the source value into the target buffer byte */ 557 /* Store the source value into the target buffer byte */
555 558
556 obj_desc->buffer.pointer[index_desc->reference.offset] = value; 559 obj_desc->buffer.pointer[index_desc->reference.value] = value;
557 break; 560 break;
558 561
559 default: 562 default:
diff --git a/drivers/acpi/executer/exstoren.c b/drivers/acpi/executer/exstoren.c
index a6d2168b81f9..eef61a00803e 100644
--- a/drivers/acpi/executer/exstoren.c
+++ b/drivers/acpi/executer/exstoren.c
@@ -121,7 +121,8 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr,
121 (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_STRING) && 121 (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_STRING) &&
122 !((ACPI_GET_OBJECT_TYPE(source_desc) == 122 !((ACPI_GET_OBJECT_TYPE(source_desc) ==
123 ACPI_TYPE_LOCAL_REFERENCE) 123 ACPI_TYPE_LOCAL_REFERENCE)
124 && (source_desc->reference.opcode == AML_LOAD_OP))) { 124 && (source_desc->reference.class ==
125 ACPI_REFCLASS_TABLE))) {
125 126
126 /* Conversion successful but still not a valid type */ 127 /* Conversion successful but still not a valid type */
127 128
diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c
index 55c17afbe669..60d54d1f6b19 100644
--- a/drivers/acpi/fan.c
+++ b/drivers/acpi/fan.c
@@ -263,22 +263,22 @@ static int acpi_fan_add(struct acpi_device *device)
263 goto end; 263 goto end;
264 } 264 }
265 265
266 printk(KERN_INFO PREFIX 266 dev_info(&device->dev, "registered as cooling_device%d\n", cdev->id);
267 "%s is registered as cooling_device%d\n",
268 device->dev.bus_id, cdev->id);
269 267
270 acpi_driver_data(device) = cdev; 268 device->driver_data = cdev;
271 result = sysfs_create_link(&device->dev.kobj, 269 result = sysfs_create_link(&device->dev.kobj,
272 &cdev->device.kobj, 270 &cdev->device.kobj,
273 "thermal_cooling"); 271 "thermal_cooling");
274 if (result) 272 if (result)
275 printk(KERN_ERR PREFIX "Create sysfs link\n"); 273 dev_err(&device->dev, "Failed to create sysfs link "
274 "'thermal_cooling'\n");
276 275
277 result = sysfs_create_link(&cdev->device.kobj, 276 result = sysfs_create_link(&cdev->device.kobj,
278 &device->dev.kobj, 277 &device->dev.kobj,
279 "device"); 278 "device");
280 if (result) 279 if (result)
281 printk(KERN_ERR PREFIX "Create sysfs link\n"); 280 dev_err(&device->dev, "Failed to create sysfs link "
281 "'device'\n");
282 282
283 result = acpi_fan_add_fs(device); 283 result = acpi_fan_add_fs(device);
284 if (result) 284 if (result)
@@ -327,8 +327,8 @@ static int acpi_fan_resume(struct acpi_device *device)
327 327
328 result = acpi_bus_get_power(device->handle, &power_state); 328 result = acpi_bus_get_power(device->handle, &power_state);
329 if (result) { 329 if (result) {
330 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 330 printk(KERN_ERR PREFIX
331 "Error reading fan power state\n")); 331 "Error reading fan power state\n");
332 return result; 332 return result;
333 } 333 }
334 334
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c
index 0f2dd81736bd..24649ada08df 100644
--- a/drivers/acpi/glue.c
+++ b/drivers/acpi/glue.c
@@ -146,8 +146,7 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle)
146 acpi_status status; 146 acpi_status status;
147 147
148 if (dev->archdata.acpi_handle) { 148 if (dev->archdata.acpi_handle) {
149 printk(KERN_WARNING PREFIX 149 dev_warn(dev, "Drivers changed 'acpi_handle'\n");
150 "Drivers changed 'acpi_handle' for %s\n", dev->bus_id);
151 return -EINVAL; 150 return -EINVAL;
152 } 151 }
153 get_device(dev); 152 get_device(dev);
@@ -166,8 +165,11 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle)
166 "firmware_node"); 165 "firmware_node");
167 ret = sysfs_create_link(&acpi_dev->dev.kobj, &dev->kobj, 166 ret = sysfs_create_link(&acpi_dev->dev.kobj, &dev->kobj,
168 "physical_node"); 167 "physical_node");
169 if (acpi_dev->wakeup.flags.valid) 168 if (acpi_dev->wakeup.flags.valid) {
170 device_set_wakeup_capable(dev, true); 169 device_set_wakeup_capable(dev, true);
170 device_set_wakeup_enable(dev,
171 acpi_dev->wakeup.state.enabled);
172 }
171 } 173 }
172 174
173 return 0; 175 return 0;
@@ -195,8 +197,7 @@ static int acpi_unbind_one(struct device *dev)
195 /* acpi_bind_one increase refcnt by one */ 197 /* acpi_bind_one increase refcnt by one */
196 put_device(dev); 198 put_device(dev);
197 } else { 199 } else {
198 printk(KERN_ERR PREFIX 200 dev_err(dev, "Oops, 'acpi_handle' corrupt\n");
199 "Oops, 'acpi_handle' corrupt for %s\n", dev->bus_id);
200 } 201 }
201 return 0; 202 return 0;
202} 203}
@@ -259,119 +260,3 @@ static int __init init_acpi_device_notify(void)
259} 260}
260 261
261arch_initcall(init_acpi_device_notify); 262arch_initcall(init_acpi_device_notify);
262
263
264#if defined(CONFIG_RTC_DRV_CMOS) || defined(CONFIG_RTC_DRV_CMOS_MODULE)
265
266#ifdef CONFIG_PM
267static u32 rtc_handler(void *context)
268{
269 acpi_clear_event(ACPI_EVENT_RTC);
270 acpi_disable_event(ACPI_EVENT_RTC, 0);
271 return ACPI_INTERRUPT_HANDLED;
272}
273
274static inline void rtc_wake_setup(void)
275{
276 acpi_install_fixed_event_handler(ACPI_EVENT_RTC, rtc_handler, NULL);
277 /*
278 * After the RTC handler is installed, the Fixed_RTC event should
279 * be disabled. Only when the RTC alarm is set will it be enabled.
280 */
281 acpi_clear_event(ACPI_EVENT_RTC);
282 acpi_disable_event(ACPI_EVENT_RTC, 0);
283}
284
285static void rtc_wake_on(struct device *dev)
286{
287 acpi_clear_event(ACPI_EVENT_RTC);
288 acpi_enable_event(ACPI_EVENT_RTC, 0);
289}
290
291static void rtc_wake_off(struct device *dev)
292{
293 acpi_disable_event(ACPI_EVENT_RTC, 0);
294}
295#else
296#define rtc_wake_setup() do{}while(0)
297#define rtc_wake_on NULL
298#define rtc_wake_off NULL
299#endif
300
301/* Every ACPI platform has a mc146818 compatible "cmos rtc". Here we find
302 * its device node and pass extra config data. This helps its driver use
303 * capabilities that the now-obsolete mc146818 didn't have, and informs it
304 * that this board's RTC is wakeup-capable (per ACPI spec).
305 */
306#include <linux/mc146818rtc.h>
307
308static struct cmos_rtc_board_info rtc_info;
309
310
311/* PNP devices are registered in a subsys_initcall();
312 * ACPI specifies the PNP IDs to use.
313 */
314#include <linux/pnp.h>
315
316static int __init pnp_match(struct device *dev, void *data)
317{
318 static const char *ids[] = { "PNP0b00", "PNP0b01", "PNP0b02", };
319 struct pnp_dev *pnp = to_pnp_dev(dev);
320 int i;
321
322 for (i = 0; i < ARRAY_SIZE(ids); i++) {
323 if (compare_pnp_id(pnp->id, ids[i]) != 0)
324 return 1;
325 }
326 return 0;
327}
328
329static struct device *__init get_rtc_dev(void)
330{
331 return bus_find_device(&pnp_bus_type, NULL, NULL, pnp_match);
332}
333
334static int __init acpi_rtc_init(void)
335{
336 struct device *dev = get_rtc_dev();
337
338 if (acpi_disabled)
339 return 0;
340
341 if (acpi_disabled)
342 return 0;
343
344 if (dev) {
345 rtc_wake_setup();
346 rtc_info.wake_on = rtc_wake_on;
347 rtc_info.wake_off = rtc_wake_off;
348
349 /* workaround bug in some ACPI tables */
350 if (acpi_gbl_FADT.month_alarm && !acpi_gbl_FADT.day_alarm) {
351 DBG("bogus FADT month_alarm\n");
352 acpi_gbl_FADT.month_alarm = 0;
353 }
354
355 rtc_info.rtc_day_alarm = acpi_gbl_FADT.day_alarm;
356 rtc_info.rtc_mon_alarm = acpi_gbl_FADT.month_alarm;
357 rtc_info.rtc_century = acpi_gbl_FADT.century;
358
359 /* NOTE: S4_RTC_WAKE is NOT currently useful to Linux */
360 if (acpi_gbl_FADT.flags & ACPI_FADT_S4_RTC_WAKE)
361 printk(PREFIX "RTC can wake from S4\n");
362
363
364 dev->platform_data = &rtc_info;
365
366 /* RTC always wakes from S1/S2/S3, and often S4/STD */
367 device_init_wakeup(dev, 1);
368
369 put_device(dev);
370 } else
371 DBG("RTC unavailable?\n");
372 return 0;
373}
374/* do this between RTC subsys_initcall() and rtc_cmos driver_initcall() */
375fs_initcall(acpi_rtc_init);
376
377#endif
diff --git a/drivers/acpi/hardware/hwsleep.c b/drivers/acpi/hardware/hwsleep.c
index dba3cfbe8cba..25dccdf179b9 100644
--- a/drivers/acpi/hardware/hwsleep.c
+++ b/drivers/acpi/hardware/hwsleep.c
@@ -78,19 +78,17 @@ acpi_set_firmware_waking_vector(acpi_physical_address physical_address)
78 return_ACPI_STATUS(status); 78 return_ACPI_STATUS(status);
79 } 79 }
80 80
81 /* Set the vector */ 81 /*
82 * According to the ACPI specification 2.0c and later, the 64-bit
83 * waking vector should be cleared and the 32-bit waking vector should
84 * be used, unless we want the wake-up code to be called by the BIOS in
85 * Protected Mode. Some systems (for example HP dv5-1004nr) are known
86 * to fail to resume if the 64-bit vector is used.
87 */
88 if (facs->version >= 1)
89 facs->xfirmware_waking_vector = 0;
82 90
83 if ((facs->length < 32) || (!(facs->xfirmware_waking_vector))) { 91 facs->firmware_waking_vector = (u32)physical_address;
84 /*
85 * ACPI 1.0 FACS or short table or optional X_ field is zero
86 */
87 facs->firmware_waking_vector = (u32) physical_address;
88 } else {
89 /*
90 * ACPI 2.0 FACS with valid X_ field
91 */
92 facs->xfirmware_waking_vector = physical_address;
93 }
94 92
95 return_ACPI_STATUS(AE_OK); 93 return_ACPI_STATUS(AE_OK);
96} 94}
@@ -134,20 +132,7 @@ acpi_get_firmware_waking_vector(acpi_physical_address * physical_address)
134 } 132 }
135 133
136 /* Get the vector */ 134 /* Get the vector */
137 135 *physical_address = (acpi_physical_address)facs->firmware_waking_vector;
138 if ((facs->length < 32) || (!(facs->xfirmware_waking_vector))) {
139 /*
140 * ACPI 1.0 FACS or short table or optional X_ field is zero
141 */
142 *physical_address =
143 (acpi_physical_address) facs->firmware_waking_vector;
144 } else {
145 /*
146 * ACPI 2.0 FACS with valid X_ field
147 */
148 *physical_address =
149 (acpi_physical_address) facs->xfirmware_waking_vector;
150 }
151 136
152 return_ACPI_STATUS(AE_OK); 137 return_ACPI_STATUS(AE_OK);
153} 138}
@@ -627,6 +612,13 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
627 } 612 }
628 /* TBD: _WAK "sometimes" returns stuff - do we want to look at it? */ 613 /* TBD: _WAK "sometimes" returns stuff - do we want to look at it? */
629 614
615 /*
616 * Some BIOSes assume that WAK_STS will be cleared on resume and use
617 * it to determine whether the system is rebooting or resuming. Clear
618 * it for compatibility.
619 */
620 acpi_set_register(ACPI_BITREG_WAKE_STATUS, 1);
621
630 acpi_gbl_system_awake_and_running = TRUE; 622 acpi_gbl_system_awake_and_running = TRUE;
631 623
632 /* Enable power button */ 624 /* Enable power button */
diff --git a/drivers/acpi/namespace/Makefile b/drivers/acpi/namespace/Makefile
index 3f63d3640696..371a2daf837f 100644
--- a/drivers/acpi/namespace/Makefile
+++ b/drivers/acpi/namespace/Makefile
@@ -5,7 +5,7 @@
5obj-y := nsaccess.o nsload.o nssearch.o nsxfeval.o \ 5obj-y := nsaccess.o nsload.o nssearch.o nsxfeval.o \
6 nsalloc.o nseval.o nsnames.o nsutils.o nsxfname.o \ 6 nsalloc.o nseval.o nsnames.o nsutils.o nsxfname.o \
7 nsdump.o nsinit.o nsobject.o nswalk.o nsxfobj.o \ 7 nsdump.o nsinit.o nsobject.o nswalk.o nsxfobj.o \
8 nsparse.o 8 nsparse.o nspredef.o
9 9
10obj-$(ACPI_FUTURE_USAGE) += nsdumpdv.o 10obj-$(ACPI_FUTURE_USAGE) += nsdumpdv.o
11 11
diff --git a/drivers/acpi/namespace/nsdump.c b/drivers/acpi/namespace/nsdump.c
index 0ab22004728a..cc0ae39440e4 100644
--- a/drivers/acpi/namespace/nsdump.c
+++ b/drivers/acpi/namespace/nsdump.c
@@ -43,7 +43,6 @@
43 43
44#include <acpi/acpi.h> 44#include <acpi/acpi.h>
45#include <acpi/acnamesp.h> 45#include <acpi/acnamesp.h>
46#include <acpi/acparser.h>
47 46
48#define _COMPONENT ACPI_NAMESPACE 47#define _COMPONENT ACPI_NAMESPACE
49ACPI_MODULE_NAME("nsdump") 48ACPI_MODULE_NAME("nsdump")
@@ -334,9 +333,7 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
334 case ACPI_TYPE_LOCAL_REFERENCE: 333 case ACPI_TYPE_LOCAL_REFERENCE:
335 334
336 acpi_os_printf("[%s]\n", 335 acpi_os_printf("[%s]\n",
337 acpi_ps_get_opcode_name(obj_desc-> 336 acpi_ut_get_reference_name(obj_desc));
338 reference.
339 opcode));
340 break; 337 break;
341 338
342 case ACPI_TYPE_BUFFER_FIELD: 339 case ACPI_TYPE_BUFFER_FIELD:
diff --git a/drivers/acpi/namespace/nseval.c b/drivers/acpi/namespace/nseval.c
index d369164e00b0..4cdf03ac2b46 100644
--- a/drivers/acpi/namespace/nseval.c
+++ b/drivers/acpi/namespace/nseval.c
@@ -78,6 +78,7 @@ ACPI_MODULE_NAME("nseval")
78acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info) 78acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
79{ 79{
80 acpi_status status; 80 acpi_status status;
81 struct acpi_namespace_node *node;
81 82
82 ACPI_FUNCTION_TRACE(ns_evaluate); 83 ACPI_FUNCTION_TRACE(ns_evaluate);
83 84
@@ -117,6 +118,8 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
117 info->resolved_node, 118 info->resolved_node,
118 acpi_ns_get_attached_object(info->resolved_node))); 119 acpi_ns_get_attached_object(info->resolved_node)));
119 120
121 node = info->resolved_node;
122
120 /* 123 /*
121 * Two major cases here: 124 * Two major cases here:
122 * 125 *
@@ -148,21 +151,22 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
148 info->param_count++; 151 info->param_count++;
149 } 152 }
150 153
151 /* Error if too few arguments were passed in */ 154 /*
155 * Warning if too few or too many arguments have been passed by the
156 * caller. We don't want to abort here with an error because an
157 * incorrect number of arguments may not cause the method to fail.
158 * However, the method will fail if there are too few arguments passed
159 * and the method attempts to use one of the missing ones.
160 */
152 161
153 if (info->param_count < info->obj_desc->method.param_count) { 162 if (info->param_count < info->obj_desc->method.param_count) {
154 ACPI_ERROR((AE_INFO, 163 ACPI_WARNING((AE_INFO,
155 "Insufficient arguments - " 164 "Insufficient arguments - "
156 "method [%4.4s] needs %d, found %d", 165 "method [%4.4s] needs %d, found %d",
157 acpi_ut_get_node_name(info->resolved_node), 166 acpi_ut_get_node_name(info->resolved_node),
158 info->obj_desc->method.param_count, 167 info->obj_desc->method.param_count,
159 info->param_count)); 168 info->param_count));
160 return_ACPI_STATUS(AE_MISSING_ARGUMENTS); 169 } else if (info->param_count >
161 }
162
163 /* Just a warning if too many arguments */
164
165 else if (info->param_count >
166 info->obj_desc->method.param_count) { 170 info->obj_desc->method.param_count) {
167 ACPI_WARNING((AE_INFO, 171 ACPI_WARNING((AE_INFO,
168 "Excess arguments - " 172 "Excess arguments - "
@@ -195,7 +199,28 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
195 } else { 199 } else {
196 /* 200 /*
197 * 2) Object is not a method, return its current value 201 * 2) Object is not a method, return its current value
202 *
203 * Disallow certain object types. For these, "evaluation" is undefined.
198 */ 204 */
205 switch (info->resolved_node->type) {
206 case ACPI_TYPE_DEVICE:
207 case ACPI_TYPE_EVENT:
208 case ACPI_TYPE_MUTEX:
209 case ACPI_TYPE_REGION:
210 case ACPI_TYPE_THERMAL:
211 case ACPI_TYPE_LOCAL_SCOPE:
212
213 ACPI_ERROR((AE_INFO,
214 "[%4.4s] Evaluation of object type [%s] is not supported",
215 info->resolved_node->name.ascii,
216 acpi_ut_get_type_name(info->resolved_node->
217 type)));
218
219 return_ACPI_STATUS(AE_TYPE);
220
221 default:
222 break;
223 }
199 224
200 /* 225 /*
201 * Objects require additional resolution steps (e.g., the Node may be 226 * Objects require additional resolution steps (e.g., the Node may be
@@ -239,9 +264,35 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
239 } 264 }
240 } 265 }
241 266
242 /* 267 /* Validation of return values for ACPI-predefined methods and objects */
243 * Check if there is a return value that must be dealt with 268
244 */ 269 if ((status == AE_OK) || (status == AE_CTRL_RETURN_VALUE)) {
270 /*
271 * If this is the first evaluation, check the return value. This
272 * ensures that any warnings will only be emitted during the very
273 * first evaluation of the object.
274 */
275 if (!(node->flags & ANOBJ_EVALUATED)) {
276 /*
277 * Check for a predefined ACPI name. If found, validate the
278 * returned object.
279 *
280 * Note: Ignore return status for now, emit warnings if there are
281 * problems with the returned object. May change later to abort
282 * the method on invalid return object.
283 */
284 (void)acpi_ns_check_predefined_names(node,
285 info->
286 return_object);
287 }
288
289 /* Mark the node as having been evaluated */
290
291 node->flags |= ANOBJ_EVALUATED;
292 }
293
294 /* Check if there is a return value that must be dealt with */
295
245 if (status == AE_CTRL_RETURN_VALUE) { 296 if (status == AE_CTRL_RETURN_VALUE) {
246 297
247 /* If caller does not want the return value, delete it */ 298 /* If caller does not want the return value, delete it */
diff --git a/drivers/acpi/namespace/nsnames.c b/drivers/acpi/namespace/nsnames.c
index cffef1bcbdbc..42a39a7c96e9 100644
--- a/drivers/acpi/namespace/nsnames.c
+++ b/drivers/acpi/namespace/nsnames.c
@@ -56,13 +56,14 @@ ACPI_MODULE_NAME("nsnames")
56 * Size - Size of the pathname 56 * Size - Size of the pathname
57 * *name_buffer - Where to return the pathname 57 * *name_buffer - Where to return the pathname
58 * 58 *
59 * RETURN: Places the pathname into the name_buffer, in external format 59 * RETURN: Status
60 * Places the pathname into the name_buffer, in external format
60 * (name segments separated by path separators) 61 * (name segments separated by path separators)
61 * 62 *
62 * DESCRIPTION: Generate a full pathaname 63 * DESCRIPTION: Generate a full pathaname
63 * 64 *
64 ******************************************************************************/ 65 ******************************************************************************/
65void 66acpi_status
66acpi_ns_build_external_path(struct acpi_namespace_node *node, 67acpi_ns_build_external_path(struct acpi_namespace_node *node,
67 acpi_size size, char *name_buffer) 68 acpi_size size, char *name_buffer)
68{ 69{
@@ -77,7 +78,7 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node,
77 if (index < ACPI_NAME_SIZE) { 78 if (index < ACPI_NAME_SIZE) {
78 name_buffer[0] = AML_ROOT_PREFIX; 79 name_buffer[0] = AML_ROOT_PREFIX;
79 name_buffer[1] = 0; 80 name_buffer[1] = 0;
80 return; 81 return (AE_OK);
81 } 82 }
82 83
83 /* Store terminator byte, then build name backwards */ 84 /* Store terminator byte, then build name backwards */
@@ -105,14 +106,15 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node,
105 106
106 if (index != 0) { 107 if (index != 0) {
107 ACPI_ERROR((AE_INFO, 108 ACPI_ERROR((AE_INFO,
108 "Could not construct pathname; index=%X, size=%X, Path=%s", 109 "Could not construct external pathname; index=%X, size=%X, Path=%s",
109 (u32) index, (u32) size, &name_buffer[size])); 110 (u32) index, (u32) size, &name_buffer[size]));
111
112 return (AE_BAD_PARAMETER);
110 } 113 }
111 114
112 return; 115 return (AE_OK);
113} 116}
114 117
115#ifdef ACPI_DEBUG_OUTPUT
116/******************************************************************************* 118/*******************************************************************************
117 * 119 *
118 * FUNCTION: acpi_ns_get_external_pathname 120 * FUNCTION: acpi_ns_get_external_pathname
@@ -129,6 +131,7 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node,
129 131
130char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node) 132char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
131{ 133{
134 acpi_status status;
132 char *name_buffer; 135 char *name_buffer;
133 acpi_size size; 136 acpi_size size;
134 137
@@ -137,6 +140,9 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
137 /* Calculate required buffer size based on depth below root */ 140 /* Calculate required buffer size based on depth below root */
138 141
139 size = acpi_ns_get_pathname_length(node); 142 size = acpi_ns_get_pathname_length(node);
143 if (!size) {
144 return_PTR(NULL);
145 }
140 146
141 /* Allocate a buffer to be returned to caller */ 147 /* Allocate a buffer to be returned to caller */
142 148
@@ -148,10 +154,14 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
148 154
149 /* Build the path in the allocated buffer */ 155 /* Build the path in the allocated buffer */
150 156
151 acpi_ns_build_external_path(node, size, name_buffer); 157 status = acpi_ns_build_external_path(node, size, name_buffer);
158 if (ACPI_FAILURE(status)) {
159 ACPI_FREE(name_buffer);
160 return_PTR(NULL);
161 }
162
152 return_PTR(name_buffer); 163 return_PTR(name_buffer);
153} 164}
154#endif
155 165
156/******************************************************************************* 166/*******************************************************************************
157 * 167 *
@@ -182,7 +192,7 @@ acpi_size acpi_ns_get_pathname_length(struct acpi_namespace_node *node)
182 while (next_node && (next_node != acpi_gbl_root_node)) { 192 while (next_node && (next_node != acpi_gbl_root_node)) {
183 if (ACPI_GET_DESCRIPTOR_TYPE(next_node) != ACPI_DESC_TYPE_NAMED) { 193 if (ACPI_GET_DESCRIPTOR_TYPE(next_node) != ACPI_DESC_TYPE_NAMED) {
184 ACPI_ERROR((AE_INFO, 194 ACPI_ERROR((AE_INFO,
185 "Invalid NS Node (%p) while traversing path", 195 "Invalid Namespace Node (%p) while traversing namespace",
186 next_node)); 196 next_node));
187 return 0; 197 return 0;
188 } 198 }
@@ -229,6 +239,9 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle,
229 /* Determine size required for the caller buffer */ 239 /* Determine size required for the caller buffer */
230 240
231 required_size = acpi_ns_get_pathname_length(node); 241 required_size = acpi_ns_get_pathname_length(node);
242 if (!required_size) {
243 return_ACPI_STATUS(AE_BAD_PARAMETER);
244 }
232 245
233 /* Validate/Allocate/Clear caller buffer */ 246 /* Validate/Allocate/Clear caller buffer */
234 247
@@ -239,7 +252,11 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle,
239 252
240 /* Build the path in the caller buffer */ 253 /* Build the path in the caller buffer */
241 254
242 acpi_ns_build_external_path(node, required_size, buffer->pointer); 255 status =
256 acpi_ns_build_external_path(node, required_size, buffer->pointer);
257 if (ACPI_FAILURE(status)) {
258 return_ACPI_STATUS(status);
259 }
243 260
244 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s [%X]\n", 261 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s [%X]\n",
245 (char *)buffer->pointer, (u32) required_size)); 262 (char *)buffer->pointer, (u32) required_size));
diff --git a/drivers/acpi/namespace/nspredef.c b/drivers/acpi/namespace/nspredef.c
new file mode 100644
index 000000000000..0f17cf0898c9
--- /dev/null
+++ b/drivers/acpi/namespace/nspredef.c
@@ -0,0 +1,900 @@
1/******************************************************************************
2 *
3 * Module Name: nspredef - Validation of ACPI predefined methods and objects
4 * $Revision: 1.1 $
5 *
6 *****************************************************************************/
7
8/*
9 * Copyright (C) 2000 - 2008, Intel Corp.
10 * All rights reserved.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions, and the following disclaimer,
17 * without modification.
18 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19 * substantially similar to the "NO WARRANTY" disclaimer below
20 * ("Disclaimer") and any redistribution must be conditioned upon
21 * including a substantially similar Disclaimer requirement for further
22 * binary redistribution.
23 * 3. Neither the names of the above-listed copyright holders nor the names
24 * of any contributors may be used to endorse or promote products derived
25 * from this software without specific prior written permission.
26 *
27 * Alternatively, this software may be distributed under the terms of the
28 * GNU General Public License ("GPL") version 2 as published by the Free
29 * Software Foundation.
30 *
31 * NO WARRANTY
32 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42 * POSSIBILITY OF SUCH DAMAGES.
43 */
44
45#include <acpi/acpi.h>
46#include <acpi/acnamesp.h>
47#include <acpi/acpredef.h>
48
49#define _COMPONENT ACPI_NAMESPACE
50ACPI_MODULE_NAME("nspredef")
51
52/*******************************************************************************
53 *
54 * This module validates predefined ACPI objects that appear in the namespace,
55 * at the time they are evaluated (via acpi_evaluate_object). The purpose of this
56 * validation is to detect problems with BIOS-exposed predefined ACPI objects
57 * before the results are returned to the ACPI-related drivers.
58 *
59 * There are several areas that are validated:
60 *
61 * 1) The number of input arguments as defined by the method/object in the
62 * ASL is validated against the ACPI specification.
63 * 2) The type of the return object (if any) is validated against the ACPI
64 * specification.
65 * 3) For returned package objects, the count of package elements is
66 * validated, as well as the type of each package element. Nested
67 * packages are supported.
68 *
69 * For any problems found, a warning message is issued.
70 *
71 ******************************************************************************/
72/* Local prototypes */
73static acpi_status
74acpi_ns_check_package(char *pathname,
75 union acpi_operand_object *return_object,
76 const union acpi_predefined_info *predefined);
77
78static acpi_status
79acpi_ns_check_package_elements(char *pathname,
80 union acpi_operand_object **elements,
81 u8 type1, u32 count1, u8 type2, u32 count2);
82
83static acpi_status
84acpi_ns_check_object_type(char *pathname,
85 union acpi_operand_object *return_object,
86 u32 expected_btypes, u32 package_index);
87
88static acpi_status
89acpi_ns_check_reference(char *pathname,
90 union acpi_operand_object *return_object);
91
92/*
93 * Names for the types that can be returned by the predefined objects.
94 * Used for warning messages. Must be in the same order as the ACPI_RTYPEs
95 */
96static const char *acpi_rtype_names[] = {
97 "/Integer",
98 "/String",
99 "/Buffer",
100 "/Package",
101 "/Reference",
102};
103
104#define ACPI_NOT_PACKAGE ACPI_UINT32_MAX
105
106/*******************************************************************************
107 *
108 * FUNCTION: acpi_ns_check_predefined_names
109 *
110 * PARAMETERS: Node - Namespace node for the method/object
111 * return_object - Object returned from the evaluation of this
112 * method/object
113 *
114 * RETURN: Status
115 *
116 * DESCRIPTION: Check an ACPI name for a match in the predefined name list.
117 *
118 ******************************************************************************/
119
120acpi_status
121acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
122 union acpi_operand_object *return_object)
123{
124 acpi_status status = AE_OK;
125 const union acpi_predefined_info *predefined;
126 char *pathname;
127
128 /* Match the name for this method/object against the predefined list */
129
130 predefined = acpi_ns_check_for_predefined_name(node);
131 if (!predefined) {
132
133 /* Name was not one of the predefined names */
134
135 return (AE_OK);
136 }
137
138 /* Get the full pathname to the object, for use in error messages */
139
140 pathname = acpi_ns_get_external_pathname(node);
141 if (!pathname) {
142 pathname = ACPI_CAST_PTR(char, predefined->info.name);
143 }
144
145 /*
146 * Check that the parameter count for this method is in accordance
147 * with the ACPI specification.
148 */
149 acpi_ns_check_parameter_count(pathname, node, predefined);
150
151 /*
152 * If there is no return value, check if we require a return value for
153 * this predefined name. Either one return value is expected, or none,
154 * for both methods and other objects.
155 *
156 * Exit now if there is no return object. Warning if one was expected.
157 */
158 if (!return_object) {
159 if ((predefined->info.expected_btypes) &&
160 (!(predefined->info.expected_btypes & ACPI_RTYPE_NONE))) {
161 ACPI_ERROR((AE_INFO,
162 "%s: Missing expected return value",
163 pathname));
164
165 status = AE_AML_NO_RETURN_VALUE;
166 }
167 goto exit;
168 }
169
170 /*
171 * We have a return value, but if one wasn't expected, just exit, this is
172 * not a problem
173 *
174 * For example, if "Implicit return value" is enabled, methods will
175 * always return a value
176 */
177 if (!predefined->info.expected_btypes) {
178 goto exit;
179 }
180
181 /*
182 * Check that the type of the return object is what is expected for
183 * this predefined name
184 */
185 status = acpi_ns_check_object_type(pathname, return_object,
186 predefined->info.expected_btypes,
187 ACPI_NOT_PACKAGE);
188 if (ACPI_FAILURE(status)) {
189 goto exit;
190 }
191
192 /* For returned Package objects, check the type of all sub-objects */
193
194 if (ACPI_GET_OBJECT_TYPE(return_object) == ACPI_TYPE_PACKAGE) {
195 status =
196 acpi_ns_check_package(pathname, return_object, predefined);
197 }
198
199 exit:
200 if (pathname) {
201 ACPI_FREE(pathname);
202 }
203
204 return (status);
205}
206
207/*******************************************************************************
208 *
209 * FUNCTION: acpi_ns_check_parameter_count
210 *
211 * PARAMETERS: Pathname - Full pathname to the node (for error msgs)
212 * Node - Namespace node for the method/object
213 * Predefined - Pointer to entry in predefined name table
214 *
215 * RETURN: None
216 *
217 * DESCRIPTION: Check that the declared (in ASL/AML) parameter count for a
218 * predefined name is what is expected (i.e., what is defined in
219 * the ACPI specification for this predefined name.)
220 *
221 ******************************************************************************/
222
223void
224acpi_ns_check_parameter_count(char *pathname,
225 struct acpi_namespace_node *node,
226 const union acpi_predefined_info *predefined)
227{
228 u32 param_count;
229 u32 required_params_current;
230 u32 required_params_old;
231
232 /*
233 * Check that the ASL-defined parameter count is what is expected for
234 * this predefined name.
235 *
236 * Methods have 0-7 parameters. All other types have zero.
237 */
238 param_count = 0;
239 if (node->type == ACPI_TYPE_METHOD) {
240 param_count = node->object->method.param_count;
241 }
242
243 /* Validate parameter count - allow two different legal counts (_SCP) */
244
245 required_params_current = predefined->info.param_count & 0x0F;
246 required_params_old = predefined->info.param_count >> 4;
247
248 if ((param_count != required_params_current) &&
249 (param_count != required_params_old)) {
250 ACPI_WARNING((AE_INFO,
251 "%s: Parameter count mismatch - ASL declared %d, expected %d",
252 pathname, param_count, required_params_current));
253 }
254}
255
256/*******************************************************************************
257 *
258 * FUNCTION: acpi_ns_check_for_predefined_name
259 *
260 * PARAMETERS: Node - Namespace node for the method/object
261 *
262 * RETURN: Pointer to entry in predefined table. NULL indicates not found.
263 *
264 * DESCRIPTION: Check an object name against the predefined object list.
265 *
266 ******************************************************************************/
267
268const union acpi_predefined_info *acpi_ns_check_for_predefined_name(struct
269 acpi_namespace_node
270 *node)
271{
272 const union acpi_predefined_info *this_name;
273
274 /* Quick check for a predefined name, first character must be underscore */
275
276 if (node->name.ascii[0] != '_') {
277 return (NULL);
278 }
279
280 /* Search info table for a predefined method/object name */
281
282 this_name = predefined_names;
283 while (this_name->info.name[0]) {
284 if (ACPI_COMPARE_NAME(node->name.ascii, this_name->info.name)) {
285
286 /* Return pointer to this table entry */
287
288 return (this_name);
289 }
290
291 /*
292 * Skip next entry in the table if this name returns a Package
293 * (next entry contains the package info)
294 */
295 if (this_name->info.expected_btypes & ACPI_RTYPE_PACKAGE) {
296 this_name++;
297 }
298
299 this_name++;
300 }
301
302 return (NULL);
303}
304
305/*******************************************************************************
306 *
307 * FUNCTION: acpi_ns_check_package
308 *
309 * PARAMETERS: Pathname - Full pathname to the node (for error msgs)
310 * return_object - Object returned from the evaluation of a
311 * method or object
312 * Predefined - Pointer to entry in predefined name table
313 *
314 * RETURN: Status
315 *
316 * DESCRIPTION: Check a returned package object for the correct count and
317 * correct type of all sub-objects.
318 *
319 ******************************************************************************/
320
321static acpi_status
322acpi_ns_check_package(char *pathname,
323 union acpi_operand_object *return_object,
324 const union acpi_predefined_info *predefined)
325{
326 const union acpi_predefined_info *package;
327 union acpi_operand_object *sub_package;
328 union acpi_operand_object **elements;
329 union acpi_operand_object **sub_elements;
330 acpi_status status;
331 u32 expected_count;
332 u32 count;
333 u32 i;
334 u32 j;
335
336 ACPI_FUNCTION_NAME(ns_check_package);
337
338 /* The package info for this name is in the next table entry */
339
340 package = predefined + 1;
341
342 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
343 "%s Validating return Package of Type %X, Count %X\n",
344 pathname, package->ret_info.type,
345 return_object->package.count));
346
347 /* Extract package count and elements array */
348
349 elements = return_object->package.elements;
350 count = return_object->package.count;
351
352 /* The package must have at least one element, else invalid */
353
354 if (!count) {
355 ACPI_WARNING((AE_INFO,
356 "%s: Return Package has no elements (empty)",
357 pathname));
358
359 return (AE_AML_OPERAND_VALUE);
360 }
361
362 /*
363 * Decode the type of the expected package contents
364 *
365 * PTYPE1 packages contain no subpackages
366 * PTYPE2 packages contain sub-packages
367 */
368 switch (package->ret_info.type) {
369 case ACPI_PTYPE1_FIXED:
370
371 /*
372 * The package count is fixed and there are no sub-packages
373 *
374 * If package is too small, exit.
375 * If package is larger than expected, issue warning but continue
376 */
377 expected_count =
378 package->ret_info.count1 + package->ret_info.count2;
379 if (count < expected_count) {
380 goto package_too_small;
381 } else if (count > expected_count) {
382 ACPI_WARNING((AE_INFO,
383 "%s: Return Package is larger than needed - "
384 "found %u, expected %u", pathname, count,
385 expected_count));
386 }
387
388 /* Validate all elements of the returned package */
389
390 status = acpi_ns_check_package_elements(pathname, elements,
391 package->ret_info.
392 object_type1,
393 package->ret_info.
394 count1,
395 package->ret_info.
396 object_type2,
397 package->ret_info.
398 count2);
399 if (ACPI_FAILURE(status)) {
400 return (status);
401 }
402 break;
403
404 case ACPI_PTYPE1_VAR:
405
406 /*
407 * The package count is variable, there are no sub-packages, and all
408 * elements must be of the same type
409 */
410 for (i = 0; i < count; i++) {
411 status = acpi_ns_check_object_type(pathname, *elements,
412 package->ret_info.
413 object_type1, i);
414 if (ACPI_FAILURE(status)) {
415 return (status);
416 }
417 elements++;
418 }
419 break;
420
421 case ACPI_PTYPE1_OPTION:
422
423 /*
424 * The package count is variable, there are no sub-packages. There are
425 * a fixed number of required elements, and a variable number of
426 * optional elements.
427 *
428 * Check if package is at least as large as the minimum required
429 */
430 expected_count = package->ret_info3.count;
431 if (count < expected_count) {
432 goto package_too_small;
433 }
434
435 /* Variable number of sub-objects */
436
437 for (i = 0; i < count; i++) {
438 if (i < package->ret_info3.count) {
439
440 /* These are the required package elements (0, 1, or 2) */
441
442 status =
443 acpi_ns_check_object_type(pathname,
444 *elements,
445 package->
446 ret_info3.
447 object_type[i],
448 i);
449 if (ACPI_FAILURE(status)) {
450 return (status);
451 }
452 } else {
453 /* These are the optional package elements */
454
455 status =
456 acpi_ns_check_object_type(pathname,
457 *elements,
458 package->
459 ret_info3.
460 tail_object_type,
461 i);
462 if (ACPI_FAILURE(status)) {
463 return (status);
464 }
465 }
466 elements++;
467 }
468 break;
469
470 case ACPI_PTYPE2_PKG_COUNT:
471
472 /* First element is the (Integer) count of sub-packages to follow */
473
474 status = acpi_ns_check_object_type(pathname, *elements,
475 ACPI_RTYPE_INTEGER, 0);
476 if (ACPI_FAILURE(status)) {
477 return (status);
478 }
479
480 /*
481 * Count cannot be larger than the parent package length, but allow it
482 * to be smaller. The >= accounts for the Integer above.
483 */
484 expected_count = (u32) (*elements)->integer.value;
485 if (expected_count >= count) {
486 goto package_too_small;
487 }
488
489 count = expected_count;
490 elements++;
491
492 /* Now we can walk the sub-packages */
493
494 /*lint -fallthrough */
495
496 case ACPI_PTYPE2:
497 case ACPI_PTYPE2_FIXED:
498 case ACPI_PTYPE2_MIN:
499 case ACPI_PTYPE2_COUNT:
500
501 /*
502 * These types all return a single package that consists of a variable
503 * number of sub-packages
504 */
505 for (i = 0; i < count; i++) {
506 sub_package = *elements;
507 sub_elements = sub_package->package.elements;
508
509 /* Each sub-object must be of type Package */
510
511 status =
512 acpi_ns_check_object_type(pathname, sub_package,
513 ACPI_RTYPE_PACKAGE, i);
514 if (ACPI_FAILURE(status)) {
515 return (status);
516 }
517
518 /* Examine the different types of sub-packages */
519
520 switch (package->ret_info.type) {
521 case ACPI_PTYPE2:
522 case ACPI_PTYPE2_PKG_COUNT:
523
524 /* Each subpackage has a fixed number of elements */
525
526 expected_count =
527 package->ret_info.count1 +
528 package->ret_info.count2;
529 if (sub_package->package.count !=
530 expected_count) {
531 count = sub_package->package.count;
532 goto package_too_small;
533 }
534
535 status =
536 acpi_ns_check_package_elements(pathname,
537 sub_elements,
538 package->
539 ret_info.
540 object_type1,
541 package->
542 ret_info.
543 count1,
544 package->
545 ret_info.
546 object_type2,
547 package->
548 ret_info.
549 count2);
550 if (ACPI_FAILURE(status)) {
551 return (status);
552 }
553 break;
554
555 case ACPI_PTYPE2_FIXED:
556
557 /* Each sub-package has a fixed length */
558
559 expected_count = package->ret_info2.count;
560 if (sub_package->package.count < expected_count) {
561 count = sub_package->package.count;
562 goto package_too_small;
563 }
564
565 /* Check the type of each sub-package element */
566
567 for (j = 0; j < expected_count; j++) {
568 status =
569 acpi_ns_check_object_type(pathname,
570 sub_elements
571 [j],
572 package->
573 ret_info2.
574 object_type
575 [j], j);
576 if (ACPI_FAILURE(status)) {
577 return (status);
578 }
579 }
580 break;
581
582 case ACPI_PTYPE2_MIN:
583
584 /* Each sub-package has a variable but minimum length */
585
586 expected_count = package->ret_info.count1;
587 if (sub_package->package.count < expected_count) {
588 count = sub_package->package.count;
589 goto package_too_small;
590 }
591
592 /* Check the type of each sub-package element */
593
594 status =
595 acpi_ns_check_package_elements(pathname,
596 sub_elements,
597 package->
598 ret_info.
599 object_type1,
600 sub_package->
601 package.
602 count, 0, 0);
603 if (ACPI_FAILURE(status)) {
604 return (status);
605 }
606 break;
607
608 case ACPI_PTYPE2_COUNT:
609
610 /* First element is the (Integer) count of elements to follow */
611
612 status =
613 acpi_ns_check_object_type(pathname,
614 *sub_elements,
615 ACPI_RTYPE_INTEGER,
616 0);
617 if (ACPI_FAILURE(status)) {
618 return (status);
619 }
620
621 /* Make sure package is large enough for the Count */
622
623 expected_count =
624 (u32) (*sub_elements)->integer.value;
625 if (sub_package->package.count < expected_count) {
626 count = sub_package->package.count;
627 goto package_too_small;
628 }
629
630 /* Check the type of each sub-package element */
631
632 status =
633 acpi_ns_check_package_elements(pathname,
634 (sub_elements
635 + 1),
636 package->
637 ret_info.
638 object_type1,
639 (expected_count
640 - 1), 0, 0);
641 if (ACPI_FAILURE(status)) {
642 return (status);
643 }
644 break;
645
646 default:
647 break;
648 }
649
650 elements++;
651 }
652 break;
653
654 default:
655
656 /* Should not get here if predefined info table is correct */
657
658 ACPI_WARNING((AE_INFO,
659 "%s: Invalid internal return type in table entry: %X",
660 pathname, package->ret_info.type));
661
662 return (AE_AML_INTERNAL);
663 }
664
665 return (AE_OK);
666
667 package_too_small:
668
669 /* Error exit for the case with an incorrect package count */
670
671 ACPI_WARNING((AE_INFO, "%s: Return Package is too small - "
672 "found %u, expected %u", pathname, count,
673 expected_count));
674
675 return (AE_AML_OPERAND_VALUE);
676}
677
678/*******************************************************************************
679 *
680 * FUNCTION: acpi_ns_check_package_elements
681 *
682 * PARAMETERS: Pathname - Full pathname to the node (for error msgs)
683 * Elements - Pointer to the package elements array
684 * Type1 - Object type for first group
685 * Count1 - Count for first group
686 * Type2 - Object type for second group
687 * Count2 - Count for second group
688 *
689 * RETURN: Status
690 *
691 * DESCRIPTION: Check that all elements of a package are of the correct object
692 * type. Supports up to two groups of different object types.
693 *
694 ******************************************************************************/
695
696static acpi_status
697acpi_ns_check_package_elements(char *pathname,
698 union acpi_operand_object **elements,
699 u8 type1, u32 count1, u8 type2, u32 count2)
700{
701 union acpi_operand_object **this_element = elements;
702 acpi_status status;
703 u32 i;
704
705 /*
706 * Up to two groups of package elements are supported by the data
707 * structure. All elements in each group must be of the same type.
708 * The second group can have a count of zero.
709 */
710 for (i = 0; i < count1; i++) {
711 status = acpi_ns_check_object_type(pathname, *this_element,
712 type1, i);
713 if (ACPI_FAILURE(status)) {
714 return (status);
715 }
716 this_element++;
717 }
718
719 for (i = 0; i < count2; i++) {
720 status = acpi_ns_check_object_type(pathname, *this_element,
721 type2, (i + count1));
722 if (ACPI_FAILURE(status)) {
723 return (status);
724 }
725 this_element++;
726 }
727
728 return (AE_OK);
729}
730
731/*******************************************************************************
732 *
733 * FUNCTION: acpi_ns_check_object_type
734 *
735 * PARAMETERS: Pathname - Full pathname to the node (for error msgs)
736 * return_object - Object return from the execution of this
737 * method/object
738 * expected_btypes - Bitmap of expected return type(s)
739 * package_index - Index of object within parent package (if
740 * applicable - ACPI_NOT_PACKAGE otherwise)
741 *
742 * RETURN: Status
743 *
744 * DESCRIPTION: Check the type of the return object against the expected object
745 * type(s). Use of Btype allows multiple expected object types.
746 *
747 ******************************************************************************/
748
749static acpi_status
750acpi_ns_check_object_type(char *pathname,
751 union acpi_operand_object *return_object,
752 u32 expected_btypes, u32 package_index)
753{
754 acpi_status status = AE_OK;
755 u32 return_btype;
756 char type_buffer[48]; /* Room for 5 types */
757 u32 this_rtype;
758 u32 i;
759 u32 j;
760
761 /*
762 * If we get a NULL return_object here, it is a NULL package element,
763 * and this is always an error.
764 */
765 if (!return_object) {
766 goto type_error_exit;
767 }
768
769 /* A Namespace node should not get here, but make sure */
770
771 if (ACPI_GET_DESCRIPTOR_TYPE(return_object) == ACPI_DESC_TYPE_NAMED) {
772 ACPI_WARNING((AE_INFO,
773 "%s: Invalid return type - Found a Namespace node [%4.4s] type %s",
774 pathname, return_object->node.name.ascii,
775 acpi_ut_get_type_name(return_object->node.type)));
776 return (AE_AML_OPERAND_TYPE);
777 }
778
779 /*
780 * Convert the object type (ACPI_TYPE_xxx) to a bitmapped object type.
781 * The bitmapped type allows multiple possible return types.
782 *
783 * Note, the cases below must handle all of the possible types returned
784 * from all of the predefined names (including elements of returned
785 * packages)
786 */
787 switch (ACPI_GET_OBJECT_TYPE(return_object)) {
788 case ACPI_TYPE_INTEGER:
789 return_btype = ACPI_RTYPE_INTEGER;
790 break;
791
792 case ACPI_TYPE_BUFFER:
793 return_btype = ACPI_RTYPE_BUFFER;
794 break;
795
796 case ACPI_TYPE_STRING:
797 return_btype = ACPI_RTYPE_STRING;
798 break;
799
800 case ACPI_TYPE_PACKAGE:
801 return_btype = ACPI_RTYPE_PACKAGE;
802 break;
803
804 case ACPI_TYPE_LOCAL_REFERENCE:
805 return_btype = ACPI_RTYPE_REFERENCE;
806 break;
807
808 default:
809 /* Not one of the supported objects, must be incorrect */
810
811 goto type_error_exit;
812 }
813
814 /* Is the object one of the expected types? */
815
816 if (!(return_btype & expected_btypes)) {
817 goto type_error_exit;
818 }
819
820 /* For reference objects, check that the reference type is correct */
821
822 if (ACPI_GET_OBJECT_TYPE(return_object) == ACPI_TYPE_LOCAL_REFERENCE) {
823 status = acpi_ns_check_reference(pathname, return_object);
824 }
825
826 return (status);
827
828 type_error_exit:
829
830 /* Create a string with all expected types for this predefined object */
831
832 j = 1;
833 type_buffer[0] = 0;
834 this_rtype = ACPI_RTYPE_INTEGER;
835
836 for (i = 0; i < ACPI_NUM_RTYPES; i++) {
837
838 /* If one of the expected types, concatenate the name of this type */
839
840 if (expected_btypes & this_rtype) {
841 ACPI_STRCAT(type_buffer, &acpi_rtype_names[i][j]);
842 j = 0; /* Use name separator from now on */
843 }
844 this_rtype <<= 1; /* Next Rtype */
845 }
846
847 if (package_index == ACPI_NOT_PACKAGE) {
848 ACPI_WARNING((AE_INFO,
849 "%s: Return type mismatch - found %s, expected %s",
850 pathname,
851 acpi_ut_get_object_type_name(return_object),
852 type_buffer));
853 } else {
854 ACPI_WARNING((AE_INFO,
855 "%s: Return Package type mismatch at index %u - "
856 "found %s, expected %s", pathname, package_index,
857 acpi_ut_get_object_type_name(return_object),
858 type_buffer));
859 }
860
861 return (AE_AML_OPERAND_TYPE);
862}
863
864/*******************************************************************************
865 *
866 * FUNCTION: acpi_ns_check_reference
867 *
868 * PARAMETERS: Pathname - Full pathname to the node (for error msgs)
869 * return_object - Object returned from the evaluation of a
870 * method or object
871 *
872 * RETURN: Status
873 *
874 * DESCRIPTION: Check a returned reference object for the correct reference
875 * type. The only reference type that can be returned from a
876 * predefined method is a named reference. All others are invalid.
877 *
878 ******************************************************************************/
879
880static acpi_status
881acpi_ns_check_reference(char *pathname,
882 union acpi_operand_object *return_object)
883{
884
885 /*
886 * Check the reference object for the correct reference type (opcode).
887 * The only type of reference that can be converted to an union acpi_object is
888 * a reference to a named object (reference class: NAME)
889 */
890 if (return_object->reference.class == ACPI_REFCLASS_NAME) {
891 return (AE_OK);
892 }
893
894 ACPI_WARNING((AE_INFO,
895 "%s: Return type mismatch - unexpected reference object type [%s] %2.2X",
896 pathname, acpi_ut_get_reference_name(return_object),
897 return_object->reference.class));
898
899 return (AE_AML_OPERAND_TYPE);
900}
diff --git a/drivers/acpi/namespace/nssearch.c b/drivers/acpi/namespace/nssearch.c
index 8399276cba1e..a9a80bf811b3 100644
--- a/drivers/acpi/namespace/nssearch.c
+++ b/drivers/acpi/namespace/nssearch.c
@@ -331,7 +331,7 @@ acpi_ns_search_and_enter(u32 target_name,
331 "Found bad character(s) in name, repaired: [%4.4s]\n", 331 "Found bad character(s) in name, repaired: [%4.4s]\n",
332 ACPI_CAST_PTR(char, &target_name))); 332 ACPI_CAST_PTR(char, &target_name)));
333 } else { 333 } else {
334 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 334 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
335 "Found bad character(s) in name, repaired: [%4.4s]\n", 335 "Found bad character(s) in name, repaired: [%4.4s]\n",
336 ACPI_CAST_PTR(char, &target_name))); 336 ACPI_CAST_PTR(char, &target_name)));
337 } 337 }
diff --git a/drivers/acpi/namespace/nsxfeval.c b/drivers/acpi/namespace/nsxfeval.c
index 38be5865d95d..a085cc39c055 100644
--- a/drivers/acpi/namespace/nsxfeval.c
+++ b/drivers/acpi/namespace/nsxfeval.c
@@ -48,6 +48,10 @@
48 48
49#define _COMPONENT ACPI_NAMESPACE 49#define _COMPONENT ACPI_NAMESPACE
50ACPI_MODULE_NAME("nsxfeval") 50ACPI_MODULE_NAME("nsxfeval")
51
52/* Local prototypes */
53static void acpi_ns_resolve_references(struct acpi_evaluate_info *info);
54
51#ifdef ACPI_FUTURE_USAGE 55#ifdef ACPI_FUTURE_USAGE
52/******************************************************************************* 56/*******************************************************************************
53 * 57 *
@@ -69,6 +73,7 @@ ACPI_MODULE_NAME("nsxfeval")
69 * be valid (non-null) 73 * be valid (non-null)
70 * 74 *
71 ******************************************************************************/ 75 ******************************************************************************/
76
72acpi_status 77acpi_status
73acpi_evaluate_object_typed(acpi_handle handle, 78acpi_evaluate_object_typed(acpi_handle handle,
74 acpi_string pathname, 79 acpi_string pathname,
@@ -283,6 +288,10 @@ acpi_evaluate_object(acpi_handle handle,
283 288
284 if (ACPI_SUCCESS(status)) { 289 if (ACPI_SUCCESS(status)) {
285 290
291 /* Dereference Index and ref_of references */
292
293 acpi_ns_resolve_references(info);
294
286 /* Get the size of the returned object */ 295 /* Get the size of the returned object */
287 296
288 status = 297 status =
@@ -352,6 +361,74 @@ ACPI_EXPORT_SYMBOL(acpi_evaluate_object)
352 361
353/******************************************************************************* 362/*******************************************************************************
354 * 363 *
364 * FUNCTION: acpi_ns_resolve_references
365 *
366 * PARAMETERS: Info - Evaluation info block
367 *
368 * RETURN: Info->return_object is replaced with the dereferenced object
369 *
370 * DESCRIPTION: Dereference certain reference objects. Called before an
371 * internal return object is converted to an external union acpi_object.
372 *
373 * Performs an automatic dereference of Index and ref_of reference objects.
374 * These reference objects are not supported by the union acpi_object, so this is a
375 * last resort effort to return something useful. Also, provides compatibility
376 * with other ACPI implementations.
377 *
378 * NOTE: does not handle references within returned package objects or nested
379 * references, but this support could be added later if found to be necessary.
380 *
381 ******************************************************************************/
382static void acpi_ns_resolve_references(struct acpi_evaluate_info *info)
383{
384 union acpi_operand_object *obj_desc = NULL;
385 struct acpi_namespace_node *node;
386
387 /* We are interested in reference objects only */
388
389 if (ACPI_GET_OBJECT_TYPE(info->return_object) !=
390 ACPI_TYPE_LOCAL_REFERENCE) {
391 return;
392 }
393
394 /*
395 * Two types of references are supported - those created by Index and
396 * ref_of operators. A name reference (AML_NAMEPATH_OP) can be converted
397 * to an union acpi_object, so it is not dereferenced here. A ddb_handle
398 * (AML_LOAD_OP) cannot be dereferenced, nor can it be converted to
399 * an union acpi_object.
400 */
401 switch (info->return_object->reference.class) {
402 case ACPI_REFCLASS_INDEX:
403
404 obj_desc = *(info->return_object->reference.where);
405 break;
406
407 case ACPI_REFCLASS_REFOF:
408
409 node = info->return_object->reference.object;
410 if (node) {
411 obj_desc = node->object;
412 }
413 break;
414
415 default:
416 return;
417 }
418
419 /* Replace the existing reference object */
420
421 if (obj_desc) {
422 acpi_ut_add_reference(obj_desc);
423 acpi_ut_remove_reference(info->return_object);
424 info->return_object = obj_desc;
425 }
426
427 return;
428}
429
430/*******************************************************************************
431 *
355 * FUNCTION: acpi_walk_namespace 432 * FUNCTION: acpi_walk_namespace
356 * 433 *
357 * PARAMETERS: Type - acpi_object_type to search for 434 * PARAMETERS: Type - acpi_object_type to search for
@@ -379,6 +456,7 @@ ACPI_EXPORT_SYMBOL(acpi_evaluate_object)
379 * function, etc. 456 * function, etc.
380 * 457 *
381 ******************************************************************************/ 458 ******************************************************************************/
459
382acpi_status 460acpi_status
383acpi_walk_namespace(acpi_object_type type, 461acpi_walk_namespace(acpi_object_type type,
384 acpi_handle start_object, 462 acpi_handle start_object,
diff --git a/drivers/acpi/namespace/nsxfname.c b/drivers/acpi/namespace/nsxfname.c
index a287ed550f54..5efa4e7ddb0b 100644
--- a/drivers/acpi/namespace/nsxfname.c
+++ b/drivers/acpi/namespace/nsxfname.c
@@ -253,6 +253,7 @@ acpi_get_object_info(acpi_handle handle, struct acpi_buffer * buffer)
253 node = acpi_ns_map_handle_to_node(handle); 253 node = acpi_ns_map_handle_to_node(handle);
254 if (!node) { 254 if (!node) {
255 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 255 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
256 status = AE_BAD_PARAMETER;
256 goto cleanup; 257 goto cleanup;
257 } 258 }
258 259
@@ -264,6 +265,10 @@ acpi_get_object_info(acpi_handle handle, struct acpi_buffer * buffer)
264 info->name = node->name.integer; 265 info->name = node->name.integer;
265 info->valid = 0; 266 info->valid = 0;
266 267
268 if (node->type == ACPI_TYPE_METHOD) {
269 info->param_count = node->object->method.param_count;
270 }
271
267 status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 272 status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
268 if (ACPI_FAILURE(status)) { 273 if (ACPI_FAILURE(status)) {
269 goto cleanup; 274 goto cleanup;
diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c
index cb9864e39bae..25ceae9191ef 100644
--- a/drivers/acpi/numa.c
+++ b/drivers/acpi/numa.c
@@ -258,7 +258,7 @@ int __init acpi_numa_init(void)
258 258
259int acpi_get_pxm(acpi_handle h) 259int acpi_get_pxm(acpi_handle h)
260{ 260{
261 unsigned long pxm; 261 unsigned long long pxm;
262 acpi_status status; 262 acpi_status status;
263 acpi_handle handle; 263 acpi_handle handle;
264 acpi_handle phandle = h; 264 acpi_handle phandle = h;
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index 235a1386888a..4be252145cb4 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -608,7 +608,7 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */
608 acpi_handle handle; 608 acpi_handle handle;
609 struct acpi_pci_id *pci_id = *id; 609 struct acpi_pci_id *pci_id = *id;
610 acpi_status status; 610 acpi_status status;
611 unsigned long temp; 611 unsigned long long temp;
612 acpi_object_type type; 612 acpi_object_type type;
613 613
614 acpi_get_parent(chandle, &handle); 614 acpi_get_parent(chandle, &handle);
@@ -620,8 +620,7 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */
620 if ((ACPI_FAILURE(status)) || (type != ACPI_TYPE_DEVICE)) 620 if ((ACPI_FAILURE(status)) || (type != ACPI_TYPE_DEVICE))
621 return; 621 return;
622 622
623 status = 623 status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL,
624 acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL,
625 &temp); 624 &temp);
626 if (ACPI_SUCCESS(status)) { 625 if (ACPI_SUCCESS(status)) {
627 u32 val; 626 u32 val;
@@ -682,6 +681,22 @@ static void acpi_os_execute_deferred(struct work_struct *work)
682 return; 681 return;
683} 682}
684 683
684static void acpi_os_execute_hp_deferred(struct work_struct *work)
685{
686 struct acpi_os_dpc *dpc = container_of(work, struct acpi_os_dpc, work);
687 if (!dpc) {
688 printk(KERN_ERR PREFIX "Invalid (NULL) context\n");
689 return;
690 }
691
692 acpi_os_wait_events_complete(NULL);
693
694 dpc->function(dpc->context);
695 kfree(dpc);
696
697 return;
698}
699
685/******************************************************************************* 700/*******************************************************************************
686 * 701 *
687 * FUNCTION: acpi_os_execute 702 * FUNCTION: acpi_os_execute
@@ -697,12 +712,13 @@ static void acpi_os_execute_deferred(struct work_struct *work)
697 * 712 *
698 ******************************************************************************/ 713 ******************************************************************************/
699 714
700acpi_status acpi_os_execute(acpi_execute_type type, 715static acpi_status __acpi_os_execute(acpi_execute_type type,
701 acpi_osd_exec_callback function, void *context) 716 acpi_osd_exec_callback function, void *context, int hp)
702{ 717{
703 acpi_status status = AE_OK; 718 acpi_status status = AE_OK;
704 struct acpi_os_dpc *dpc; 719 struct acpi_os_dpc *dpc;
705 struct workqueue_struct *queue; 720 struct workqueue_struct *queue;
721 int ret;
706 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 722 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
707 "Scheduling function [%p(%p)] for deferred execution.\n", 723 "Scheduling function [%p(%p)] for deferred execution.\n",
708 function, context)); 724 function, context));
@@ -726,19 +742,38 @@ acpi_status acpi_os_execute(acpi_execute_type type,
726 dpc->function = function; 742 dpc->function = function;
727 dpc->context = context; 743 dpc->context = context;
728 744
729 INIT_WORK(&dpc->work, acpi_os_execute_deferred); 745 if (!hp) {
730 queue = (type == OSL_NOTIFY_HANDLER) ? kacpi_notify_wq : kacpid_wq; 746 INIT_WORK(&dpc->work, acpi_os_execute_deferred);
731 if (!queue_work(queue, &dpc->work)) { 747 queue = (type == OSL_NOTIFY_HANDLER) ?
732 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 748 kacpi_notify_wq : kacpid_wq;
733 "Call to queue_work() failed.\n")); 749 ret = queue_work(queue, &dpc->work);
750 } else {
751 INIT_WORK(&dpc->work, acpi_os_execute_hp_deferred);
752 ret = schedule_work(&dpc->work);
753 }
754
755 if (!ret) {
756 printk(KERN_ERR PREFIX
757 "Call to queue_work() failed.\n");
734 status = AE_ERROR; 758 status = AE_ERROR;
735 kfree(dpc); 759 kfree(dpc);
736 } 760 }
737 return_ACPI_STATUS(status); 761 return_ACPI_STATUS(status);
738} 762}
739 763
764acpi_status acpi_os_execute(acpi_execute_type type,
765 acpi_osd_exec_callback function, void *context)
766{
767 return __acpi_os_execute(type, function, context, 0);
768}
740EXPORT_SYMBOL(acpi_os_execute); 769EXPORT_SYMBOL(acpi_os_execute);
741 770
771acpi_status acpi_os_hotplug_execute(acpi_osd_exec_callback function,
772 void *context)
773{
774 return __acpi_os_execute(0, function, context, 1);
775}
776
742void acpi_os_wait_events_complete(void *context) 777void acpi_os_wait_events_complete(void *context)
743{ 778{
744 flush_workqueue(kacpid_wq); 779 flush_workqueue(kacpid_wq);
diff --git a/drivers/acpi/parser/psloop.c b/drivers/acpi/parser/psloop.c
index c06238e55d98..4647039a0d8a 100644
--- a/drivers/acpi/parser/psloop.c
+++ b/drivers/acpi/parser/psloop.c
@@ -719,6 +719,8 @@ acpi_ps_complete_op(struct acpi_walk_state *walk_state,
719 *op = NULL; 719 *op = NULL;
720 } 720 }
721 721
722 ACPI_PREEMPTION_POINT();
723
722 return_ACPI_STATUS(AE_OK); 724 return_ACPI_STATUS(AE_OK);
723} 725}
724 726
diff --git a/drivers/acpi/parser/psparse.c b/drivers/acpi/parser/psparse.c
index 15e1702e48d6..68e932f215ea 100644
--- a/drivers/acpi/parser/psparse.c
+++ b/drivers/acpi/parser/psparse.c
@@ -137,6 +137,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
137 union acpi_parse_object *next; 137 union acpi_parse_object *next;
138 const struct acpi_opcode_info *parent_info; 138 const struct acpi_opcode_info *parent_info;
139 union acpi_parse_object *replacement_op = NULL; 139 union acpi_parse_object *replacement_op = NULL;
140 acpi_status status = AE_OK;
140 141
141 ACPI_FUNCTION_TRACE_PTR(ps_complete_this_op, op); 142 ACPI_FUNCTION_TRACE_PTR(ps_complete_this_op, op);
142 143
@@ -186,7 +187,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
186 replacement_op = 187 replacement_op =
187 acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP); 188 acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP);
188 if (!replacement_op) { 189 if (!replacement_op) {
189 goto allocate_error; 190 status = AE_NO_MEMORY;
190 } 191 }
191 break; 192 break;
192 193
@@ -211,7 +212,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
211 replacement_op = 212 replacement_op =
212 acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP); 213 acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP);
213 if (!replacement_op) { 214 if (!replacement_op) {
214 goto allocate_error; 215 status = AE_NO_MEMORY;
215 } 216 }
216 } else 217 } else
217 if ((op->common.parent->common.aml_opcode == 218 if ((op->common.parent->common.aml_opcode ==
@@ -226,13 +227,13 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
226 acpi_ps_alloc_op(op->common. 227 acpi_ps_alloc_op(op->common.
227 aml_opcode); 228 aml_opcode);
228 if (!replacement_op) { 229 if (!replacement_op) {
229 goto allocate_error; 230 status = AE_NO_MEMORY;
231 } else {
232 replacement_op->named.data =
233 op->named.data;
234 replacement_op->named.length =
235 op->named.length;
230 } 236 }
231
232 replacement_op->named.data =
233 op->named.data;
234 replacement_op->named.length =
235 op->named.length;
236 } 237 }
237 } 238 }
238 break; 239 break;
@@ -242,7 +243,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
242 replacement_op = 243 replacement_op =
243 acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP); 244 acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP);
244 if (!replacement_op) { 245 if (!replacement_op) {
245 goto allocate_error; 246 status = AE_NO_MEMORY;
246 } 247 }
247 } 248 }
248 249
@@ -302,14 +303,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
302 /* Now we can actually delete the subtree rooted at Op */ 303 /* Now we can actually delete the subtree rooted at Op */
303 304
304 acpi_ps_delete_parse_tree(op); 305 acpi_ps_delete_parse_tree(op);
305 return_ACPI_STATUS(AE_OK); 306 return_ACPI_STATUS(status);
306
307 allocate_error:
308
309 /* Always delete the subtree, even on error */
310
311 acpi_ps_delete_parse_tree(op);
312 return_ACPI_STATUS(AE_NO_MEMORY);
313} 307}
314 308
315/******************************************************************************* 309/*******************************************************************************
@@ -641,10 +635,12 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
641 ACPI_WALK_METHOD_RESTART; 635 ACPI_WALK_METHOD_RESTART;
642 } 636 }
643 } else { 637 } else {
644 /* On error, delete any return object */ 638 /* On error, delete any return object or implicit return */
645 639
646 acpi_ut_remove_reference(previous_walk_state-> 640 acpi_ut_remove_reference(previous_walk_state->
647 return_desc); 641 return_desc);
642 acpi_ds_clear_implicit_return
643 (previous_walk_state);
648 } 644 }
649 } 645 }
650 646
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
index 233c40c51684..fcfdef7b4fdd 100644
--- a/drivers/acpi/pci_link.c
+++ b/drivers/acpi/pci_link.c
@@ -113,20 +113,23 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
113 113
114 switch (resource->type) { 114 switch (resource->type) {
115 case ACPI_RESOURCE_TYPE_START_DEPENDENT: 115 case ACPI_RESOURCE_TYPE_START_DEPENDENT:
116 case ACPI_RESOURCE_TYPE_END_TAG:
116 return AE_OK; 117 return AE_OK;
117 case ACPI_RESOURCE_TYPE_IRQ: 118 case ACPI_RESOURCE_TYPE_IRQ:
118 { 119 {
119 struct acpi_resource_irq *p = &resource->data.irq; 120 struct acpi_resource_irq *p = &resource->data.irq;
120 if (!p || !p->interrupt_count) { 121 if (!p || !p->interrupt_count) {
121 printk(KERN_WARNING PREFIX "Blank IRQ resource\n"); 122 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
123 "Blank _PRS IRQ resource\n"));
122 return AE_OK; 124 return AE_OK;
123 } 125 }
124 for (i = 0; 126 for (i = 0;
125 (i < p->interrupt_count 127 (i < p->interrupt_count
126 && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) { 128 && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) {
127 if (!p->interrupts[i]) { 129 if (!p->interrupts[i]) {
128 printk(KERN_WARNING PREFIX "Invalid IRQ %d\n", 130 printk(KERN_WARNING PREFIX
129 p->interrupts[i]); 131 "Invalid _PRS IRQ %d\n",
132 p->interrupts[i]);
130 continue; 133 continue;
131 } 134 }
132 link->irq.possible[i] = p->interrupts[i]; 135 link->irq.possible[i] = p->interrupts[i];
@@ -143,15 +146,16 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
143 &resource->data.extended_irq; 146 &resource->data.extended_irq;
144 if (!p || !p->interrupt_count) { 147 if (!p || !p->interrupt_count) {
145 printk(KERN_WARNING PREFIX 148 printk(KERN_WARNING PREFIX
146 "Blank EXT IRQ resource\n"); 149 "Blank _PRS EXT IRQ resource\n");
147 return AE_OK; 150 return AE_OK;
148 } 151 }
149 for (i = 0; 152 for (i = 0;
150 (i < p->interrupt_count 153 (i < p->interrupt_count
151 && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) { 154 && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) {
152 if (!p->interrupts[i]) { 155 if (!p->interrupts[i]) {
153 printk(KERN_WARNING PREFIX "Invalid IRQ %d\n", 156 printk(KERN_WARNING PREFIX
154 p->interrupts[i]); 157 "Invalid _PRS IRQ %d\n",
158 p->interrupts[i]);
155 continue; 159 continue;
156 } 160 }
157 link->irq.possible[i] = p->interrupts[i]; 161 link->irq.possible[i] = p->interrupts[i];
@@ -163,7 +167,8 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
163 break; 167 break;
164 } 168 }
165 default: 169 default:
166 printk(KERN_ERR PREFIX "Resource is not an IRQ entry\n"); 170 printk(KERN_ERR PREFIX "_PRS resource type 0x%x isn't an IRQ\n",
171 resource->type);
167 return AE_OK; 172 return AE_OK;
168 } 173 }
169 174
@@ -199,6 +204,9 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
199 204
200 205
201 switch (resource->type) { 206 switch (resource->type) {
207 case ACPI_RESOURCE_TYPE_START_DEPENDENT:
208 case ACPI_RESOURCE_TYPE_END_TAG:
209 return AE_OK;
202 case ACPI_RESOURCE_TYPE_IRQ: 210 case ACPI_RESOURCE_TYPE_IRQ:
203 { 211 {
204 struct acpi_resource_irq *p = &resource->data.irq; 212 struct acpi_resource_irq *p = &resource->data.irq;
@@ -208,7 +216,7 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
208 * particularly those those w/ _STA disabled 216 * particularly those those w/ _STA disabled
209 */ 217 */
210 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 218 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
211 "Blank IRQ resource\n")); 219 "Blank _CRS IRQ resource\n"));
212 return AE_OK; 220 return AE_OK;
213 } 221 }
214 *irq = p->interrupts[0]; 222 *irq = p->interrupts[0];
@@ -224,7 +232,7 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
224 * return at least 1 IRQ 232 * return at least 1 IRQ
225 */ 233 */
226 printk(KERN_WARNING PREFIX 234 printk(KERN_WARNING PREFIX
227 "Blank EXT IRQ resource\n"); 235 "Blank _CRS EXT IRQ resource\n");
228 return AE_OK; 236 return AE_OK;
229 } 237 }
230 *irq = p->interrupts[0]; 238 *irq = p->interrupts[0];
@@ -232,10 +240,11 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
232 } 240 }
233 break; 241 break;
234 default: 242 default:
235 printk(KERN_ERR PREFIX "Resource %d isn't an IRQ\n", resource->type); 243 printk(KERN_ERR PREFIX "_CRS resource type 0x%x isn't an IRQ\n",
236 case ACPI_RESOURCE_TYPE_END_TAG: 244 resource->type);
237 return AE_OK; 245 return AE_OK;
238 } 246 }
247
239 return AE_CTRL_TERMINATE; 248 return AE_CTRL_TERMINATE;
240} 249}
241 250
@@ -700,7 +709,7 @@ int acpi_pci_link_free_irq(acpi_handle handle)
700 acpi_device_bid(link->device))); 709 acpi_device_bid(link->device)));
701 710
702 if (link->refcnt == 0) { 711 if (link->refcnt == 0) {
703 acpi_ut_evaluate_object(link->device->handle, "_DIS", 0, NULL); 712 acpi_evaluate_object(link->device->handle, "_DIS", NULL, NULL);
704 } 713 }
705 mutex_unlock(&acpi_link_lock); 714 mutex_unlock(&acpi_link_lock);
706 return (link->irq.active); 715 return (link->irq.active);
@@ -728,7 +737,7 @@ static int acpi_pci_link_add(struct acpi_device *device)
728 link->device = device; 737 link->device = device;
729 strcpy(acpi_device_name(device), ACPI_PCI_LINK_DEVICE_NAME); 738 strcpy(acpi_device_name(device), ACPI_PCI_LINK_DEVICE_NAME);
730 strcpy(acpi_device_class(device), ACPI_PCI_LINK_CLASS); 739 strcpy(acpi_device_class(device), ACPI_PCI_LINK_CLASS);
731 acpi_driver_data(device) = link; 740 device->driver_data = link;
732 741
733 mutex_lock(&acpi_link_lock); 742 mutex_lock(&acpi_link_lock);
734 result = acpi_pci_link_get_possible(link); 743 result = acpi_pci_link_get_possible(link);
@@ -764,7 +773,7 @@ static int acpi_pci_link_add(struct acpi_device *device)
764 773
765 end: 774 end:
766 /* disable all links -- to be activated on use */ 775 /* disable all links -- to be activated on use */
767 acpi_ut_evaluate_object(device->handle, "_DIS", 0, NULL); 776 acpi_evaluate_object(device->handle, "_DIS", NULL, NULL);
768 mutex_unlock(&acpi_link_lock); 777 mutex_unlock(&acpi_link_lock);
769 778
770 if (result) 779 if (result)
@@ -840,7 +849,7 @@ static int __init acpi_irq_penalty_update(char *str, int used)
840 if (irq < 0) 849 if (irq < 0)
841 continue; 850 continue;
842 851
843 if (irq >= ACPI_MAX_IRQS) 852 if (irq >= ARRAY_SIZE(acpi_irq_penalty))
844 continue; 853 continue;
845 854
846 if (used) 855 if (used)
@@ -863,10 +872,12 @@ static int __init acpi_irq_penalty_update(char *str, int used)
863 */ 872 */
864void acpi_penalize_isa_irq(int irq, int active) 873void acpi_penalize_isa_irq(int irq, int active)
865{ 874{
866 if (active) 875 if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) {
867 acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED; 876 if (active)
868 else 877 acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
869 acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING; 878 else
879 acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
880 }
870} 881}
871 882
872/* 883/*
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
index c3fed31166b5..1b8f67d21d53 100644
--- a/drivers/acpi/pci_root.c
+++ b/drivers/acpi/pci_root.c
@@ -190,7 +190,7 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
190 struct acpi_pci_root *root = NULL; 190 struct acpi_pci_root *root = NULL;
191 struct acpi_pci_root *tmp; 191 struct acpi_pci_root *tmp;
192 acpi_status status = AE_OK; 192 acpi_status status = AE_OK;
193 unsigned long value = 0; 193 unsigned long long value = 0;
194 acpi_handle handle = NULL; 194 acpi_handle handle = NULL;
195 struct acpi_device *child; 195 struct acpi_device *child;
196 196
@@ -206,7 +206,7 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
206 root->device = device; 206 root->device = device;
207 strcpy(acpi_device_name(device), ACPI_PCI_ROOT_DEVICE_NAME); 207 strcpy(acpi_device_name(device), ACPI_PCI_ROOT_DEVICE_NAME);
208 strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS); 208 strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS);
209 acpi_driver_data(device) = root; 209 device->driver_data = root;
210 210
211 device->ops.bind = acpi_pci_bind; 211 device->ops.bind = acpi_pci_bind;
212 212
diff --git a/drivers/acpi/pci_slot.c b/drivers/acpi/pci_slot.c
index b9ab030a52d5..cd1f4467be7b 100644
--- a/drivers/acpi/pci_slot.c
+++ b/drivers/acpi/pci_slot.c
@@ -6,8 +6,8 @@
6 * Thanks to Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> for code 6 * Thanks to Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> for code
7 * review and fixes. 7 * review and fixes.
8 * 8 *
9 * Copyright (C) 2007 Alex Chiang <achiang@hp.com> 9 * Copyright (C) 2007-2008 Hewlett-Packard Development Company, L.P.
10 * Copyright (C) 2007 Hewlett-Packard Development Company, L.P. 10 * Alex Chiang <achiang@hp.com>
11 * 11 *
12 * This program is free software; you can redistribute it and/or modify it 12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms and conditions of the GNU General Public License, 13 * under the terms and conditions of the GNU General Public License,
@@ -76,10 +76,10 @@ static struct acpi_pci_driver acpi_pci_slot_driver = {
76}; 76};
77 77
78static int 78static int
79check_slot(acpi_handle handle, int *device, unsigned long *sun) 79check_slot(acpi_handle handle, unsigned long long *sun)
80{ 80{
81 int retval = 0; 81 int device = -1;
82 unsigned long adr, sta; 82 unsigned long long adr, sta;
83 acpi_status status; 83 acpi_status status;
84 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 84 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
85 85
@@ -89,32 +89,27 @@ check_slot(acpi_handle handle, int *device, unsigned long *sun)
89 if (check_sta_before_sun) { 89 if (check_sta_before_sun) {
90 /* If SxFy doesn't have _STA, we just assume it's there */ 90 /* If SxFy doesn't have _STA, we just assume it's there */
91 status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); 91 status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
92 if (ACPI_SUCCESS(status) && !(sta & ACPI_STA_DEVICE_PRESENT)) { 92 if (ACPI_SUCCESS(status) && !(sta & ACPI_STA_DEVICE_PRESENT))
93 retval = -1;
94 goto out; 93 goto out;
95 }
96 } 94 }
97 95
98 status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr); 96 status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr);
99 if (ACPI_FAILURE(status)) { 97 if (ACPI_FAILURE(status)) {
100 dbg("_ADR returned %d on %s\n", status, (char *)buffer.pointer); 98 dbg("_ADR returned %d on %s\n", status, (char *)buffer.pointer);
101 retval = -1;
102 goto out; 99 goto out;
103 } 100 }
104 101
105 *device = (adr >> 16) & 0xffff;
106
107 /* No _SUN == not a slot == bail */ 102 /* No _SUN == not a slot == bail */
108 status = acpi_evaluate_integer(handle, "_SUN", NULL, sun); 103 status = acpi_evaluate_integer(handle, "_SUN", NULL, sun);
109 if (ACPI_FAILURE(status)) { 104 if (ACPI_FAILURE(status)) {
110 dbg("_SUN returned %d on %s\n", status, (char *)buffer.pointer); 105 dbg("_SUN returned %d on %s\n", status, (char *)buffer.pointer);
111 retval = -1;
112 goto out; 106 goto out;
113 } 107 }
114 108
109 device = (adr >> 16) & 0xffff;
115out: 110out:
116 kfree(buffer.pointer); 111 kfree(buffer.pointer);
117 return retval; 112 return device;
118} 113}
119 114
120struct callback_args { 115struct callback_args {
@@ -137,14 +132,15 @@ static acpi_status
137register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) 132register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
138{ 133{
139 int device; 134 int device;
140 unsigned long sun; 135 unsigned long long sun;
141 char name[SLOT_NAME_SIZE]; 136 char name[SLOT_NAME_SIZE];
142 struct acpi_pci_slot *slot; 137 struct acpi_pci_slot *slot;
143 struct pci_slot *pci_slot; 138 struct pci_slot *pci_slot;
144 struct callback_args *parent_context = context; 139 struct callback_args *parent_context = context;
145 struct pci_bus *pci_bus = parent_context->pci_bus; 140 struct pci_bus *pci_bus = parent_context->pci_bus;
146 141
147 if (check_slot(handle, &device, &sun)) 142 device = check_slot(handle, &sun);
143 if (device < 0)
148 return AE_OK; 144 return AE_OK;
149 145
150 slot = kmalloc(sizeof(*slot), GFP_KERNEL); 146 slot = kmalloc(sizeof(*slot), GFP_KERNEL);
@@ -154,10 +150,11 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
154 } 150 }
155 151
156 snprintf(name, sizeof(name), "%u", (u32)sun); 152 snprintf(name, sizeof(name), "%u", (u32)sun);
157 pci_slot = pci_create_slot(pci_bus, device, name); 153 pci_slot = pci_create_slot(pci_bus, device, name, NULL);
158 if (IS_ERR(pci_slot)) { 154 if (IS_ERR(pci_slot)) {
159 err("pci_create_slot returned %ld\n", PTR_ERR(pci_slot)); 155 err("pci_create_slot returned %ld\n", PTR_ERR(pci_slot));
160 kfree(slot); 156 kfree(slot);
157 return AE_OK;
161 } 158 }
162 159
163 slot->root_handle = parent_context->root_handle; 160 slot->root_handle = parent_context->root_handle;
@@ -185,7 +182,7 @@ static acpi_status
185walk_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv) 182walk_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv)
186{ 183{
187 int device, function; 184 int device, function;
188 unsigned long adr; 185 unsigned long long adr;
189 acpi_status status; 186 acpi_status status;
190 acpi_handle dummy_handle; 187 acpi_handle dummy_handle;
191 acpi_walk_callback user_function; 188 acpi_walk_callback user_function;
@@ -242,7 +239,7 @@ static int
242walk_root_bridge(acpi_handle handle, acpi_walk_callback user_function) 239walk_root_bridge(acpi_handle handle, acpi_walk_callback user_function)
243{ 240{
244 int seg, bus; 241 int seg, bus;
245 unsigned long tmp; 242 unsigned long long tmp;
246 acpi_status status; 243 acpi_status status;
247 acpi_handle dummy_handle; 244 acpi_handle dummy_handle;
248 struct pci_bus *pci_bus; 245 struct pci_bus *pci_bus;
diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c
index 4ab21cb1c8c7..a1718e56103b 100644
--- a/drivers/acpi/power.c
+++ b/drivers/acpi/power.c
@@ -54,6 +54,14 @@ ACPI_MODULE_NAME("power");
54#define ACPI_POWER_RESOURCE_STATE_OFF 0x00 54#define ACPI_POWER_RESOURCE_STATE_OFF 0x00
55#define ACPI_POWER_RESOURCE_STATE_ON 0x01 55#define ACPI_POWER_RESOURCE_STATE_ON 0x01
56#define ACPI_POWER_RESOURCE_STATE_UNKNOWN 0xFF 56#define ACPI_POWER_RESOURCE_STATE_UNKNOWN 0xFF
57
58#ifdef MODULE_PARAM_PREFIX
59#undef MODULE_PARAM_PREFIX
60#endif
61#define MODULE_PARAM_PREFIX "acpi."
62int acpi_power_nocheck;
63module_param_named(power_nocheck, acpi_power_nocheck, bool, 000);
64
57static int acpi_power_add(struct acpi_device *device); 65static int acpi_power_add(struct acpi_device *device);
58static int acpi_power_remove(struct acpi_device *device, int type); 66static int acpi_power_remove(struct acpi_device *device, int type);
59static int acpi_power_resume(struct acpi_device *device); 67static int acpi_power_resume(struct acpi_device *device);
@@ -128,16 +136,16 @@ acpi_power_get_context(acpi_handle handle,
128 return 0; 136 return 0;
129} 137}
130 138
131static int acpi_power_get_state(struct acpi_power_resource *resource, int *state) 139static int acpi_power_get_state(acpi_handle handle, int *state)
132{ 140{
133 acpi_status status = AE_OK; 141 acpi_status status = AE_OK;
134 unsigned long sta = 0; 142 unsigned long long sta = 0;
135 143
136 144
137 if (!resource || !state) 145 if (!handle || !state)
138 return -EINVAL; 146 return -EINVAL;
139 147
140 status = acpi_evaluate_integer(resource->device->handle, "_STA", NULL, &sta); 148 status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
141 if (ACPI_FAILURE(status)) 149 if (ACPI_FAILURE(status))
142 return -ENODEV; 150 return -ENODEV;
143 151
@@ -145,7 +153,7 @@ static int acpi_power_get_state(struct acpi_power_resource *resource, int *state
145 ACPI_POWER_RESOURCE_STATE_OFF; 153 ACPI_POWER_RESOURCE_STATE_OFF;
146 154
147 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] is %s\n", 155 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] is %s\n",
148 resource->name, state ? "on" : "off")); 156 acpi_ut_get_node_name(handle), state ? "on" : "off"));
149 157
150 return 0; 158 return 0;
151} 159}
@@ -153,7 +161,6 @@ static int acpi_power_get_state(struct acpi_power_resource *resource, int *state
153static int acpi_power_get_list_state(struct acpi_handle_list *list, int *state) 161static int acpi_power_get_list_state(struct acpi_handle_list *list, int *state)
154{ 162{
155 int result = 0, state1; 163 int result = 0, state1;
156 struct acpi_power_resource *resource = NULL;
157 u32 i = 0; 164 u32 i = 0;
158 165
159 166
@@ -161,12 +168,15 @@ static int acpi_power_get_list_state(struct acpi_handle_list *list, int *state)
161 return -EINVAL; 168 return -EINVAL;
162 169
163 /* The state of the list is 'on' IFF all resources are 'on'. */ 170 /* The state of the list is 'on' IFF all resources are 'on'. */
171 /* */
164 172
165 for (i = 0; i < list->count; i++) { 173 for (i = 0; i < list->count; i++) {
166 result = acpi_power_get_context(list->handles[i], &resource); 174 /*
167 if (result) 175 * The state of the power resource can be obtained by
168 return result; 176 * using the ACPI handle. In such case it is unnecessary to
169 result = acpi_power_get_state(resource, &state1); 177 * get the Power resource first and then get its state again.
178 */
179 result = acpi_power_get_state(list->handles[i], &state1);
170 if (result) 180 if (result)
171 return result; 181 return result;
172 182
@@ -226,12 +236,18 @@ static int acpi_power_on(acpi_handle handle, struct acpi_device *dev)
226 if (ACPI_FAILURE(status)) 236 if (ACPI_FAILURE(status))
227 return -ENODEV; 237 return -ENODEV;
228 238
229 result = acpi_power_get_state(resource, &state); 239 if (!acpi_power_nocheck) {
230 if (result) 240 /*
231 return result; 241 * If acpi_power_nocheck is set, it is unnecessary to check
232 if (state != ACPI_POWER_RESOURCE_STATE_ON) 242 * the power state after power transition.
233 return -ENOEXEC; 243 */
234 244 result = acpi_power_get_state(resource->device->handle,
245 &state);
246 if (result)
247 return result;
248 if (state != ACPI_POWER_RESOURCE_STATE_ON)
249 return -ENOEXEC;
250 }
235 /* Update the power resource's _device_ power state */ 251 /* Update the power resource's _device_ power state */
236 resource->device->power.state = ACPI_STATE_D0; 252 resource->device->power.state = ACPI_STATE_D0;
237 253
@@ -277,11 +293,17 @@ static int acpi_power_off_device(acpi_handle handle, struct acpi_device *dev)
277 if (ACPI_FAILURE(status)) 293 if (ACPI_FAILURE(status))
278 return -ENODEV; 294 return -ENODEV;
279 295
280 result = acpi_power_get_state(resource, &state); 296 if (!acpi_power_nocheck) {
281 if (result) 297 /*
282 return result; 298 * If acpi_power_nocheck is set, it is unnecessary to check
283 if (state != ACPI_POWER_RESOURCE_STATE_OFF) 299 * the power state after power transition.
284 return -ENOEXEC; 300 */
301 result = acpi_power_get_state(handle, &state);
302 if (result)
303 return result;
304 if (state != ACPI_POWER_RESOURCE_STATE_OFF)
305 return -ENOEXEC;
306 }
285 307
286 /* Update the power resource's _device_ power state */ 308 /* Update the power resource's _device_ power state */
287 resource->device->power.state = ACPI_STATE_D3; 309 resource->device->power.state = ACPI_STATE_D3;
@@ -555,7 +577,7 @@ static int acpi_power_seq_show(struct seq_file *seq, void *offset)
555 if (!resource) 577 if (!resource)
556 goto end; 578 goto end;
557 579
558 result = acpi_power_get_state(resource, &state); 580 result = acpi_power_get_state(resource->device->handle, &state);
559 if (result) 581 if (result)
560 goto end; 582 goto end;
561 583
@@ -657,7 +679,7 @@ static int acpi_power_add(struct acpi_device *device)
657 strcpy(resource->name, device->pnp.bus_id); 679 strcpy(resource->name, device->pnp.bus_id);
658 strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME); 680 strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME);
659 strcpy(acpi_device_class(device), ACPI_POWER_CLASS); 681 strcpy(acpi_device_class(device), ACPI_POWER_CLASS);
660 acpi_driver_data(device) = resource; 682 device->driver_data = resource;
661 683
662 /* Evalute the object to get the system level and resource order. */ 684 /* Evalute the object to get the system level and resource order. */
663 status = acpi_evaluate_object(device->handle, NULL, NULL, &buffer); 685 status = acpi_evaluate_object(device->handle, NULL, NULL, &buffer);
@@ -668,7 +690,7 @@ static int acpi_power_add(struct acpi_device *device)
668 resource->system_level = acpi_object.power_resource.system_level; 690 resource->system_level = acpi_object.power_resource.system_level;
669 resource->order = acpi_object.power_resource.resource_order; 691 resource->order = acpi_object.power_resource.resource_order;
670 692
671 result = acpi_power_get_state(resource, &state); 693 result = acpi_power_get_state(device->handle, &state);
672 if (result) 694 if (result)
673 goto end; 695 goto end;
674 696
@@ -733,9 +755,9 @@ static int acpi_power_resume(struct acpi_device *device)
733 if (!device || !acpi_driver_data(device)) 755 if (!device || !acpi_driver_data(device))
734 return -EINVAL; 756 return -EINVAL;
735 757
736 resource = (struct acpi_power_resource *)acpi_driver_data(device); 758 resource = acpi_driver_data(device);
737 759
738 result = acpi_power_get_state(resource, &state); 760 result = acpi_power_get_state(device->handle, &state);
739 if (result) 761 if (result)
740 return result; 762 return result;
741 763
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c
index ec0f2d581ece..24a362f8034c 100644
--- a/drivers/acpi/processor_core.c
+++ b/drivers/acpi/processor_core.c
@@ -123,7 +123,7 @@ struct acpi_processor_errata errata __read_mostly;
123static int set_no_mwait(const struct dmi_system_id *id) 123static int set_no_mwait(const struct dmi_system_id *id)
124{ 124{
125 printk(KERN_NOTICE PREFIX "%s detected - " 125 printk(KERN_NOTICE PREFIX "%s detected - "
126 "disable mwait for CPU C-stetes\n", id->ident); 126 "disabling mwait for CPU C-states\n", id->ident);
127 idle_nomwait = 1; 127 idle_nomwait = 1;
128 return 0; 128 return 0;
129} 129}
@@ -138,7 +138,7 @@ static struct dmi_system_id __cpuinitdata processor_idle_dmi_table[] = {
138 { 138 {
139 set_no_mwait, "Extensa 5220", { 139 set_no_mwait, "Extensa 5220", {
140 DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"), 140 DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
141 DMI_MATCH(DMI_SYS_VENDOR, "ACER"), 141 DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
142 DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), 142 DMI_MATCH(DMI_PRODUCT_VERSION, "0100"),
143 DMI_MATCH(DMI_BOARD_NAME, "Columbia") }, NULL}, 143 DMI_MATCH(DMI_BOARD_NAME, "Columbia") }, NULL},
144 {}, 144 {},
@@ -563,7 +563,7 @@ static int acpi_processor_get_info(struct acpi_processor *pr, unsigned has_uid)
563 563
564 /* Check if it is a Device with HID and UID */ 564 /* Check if it is a Device with HID and UID */
565 if (has_uid) { 565 if (has_uid) {
566 unsigned long value; 566 unsigned long long value;
567 status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID, 567 status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID,
568 NULL, &value); 568 NULL, &value);
569 if (ACPI_FAILURE(status)) { 569 if (ACPI_FAILURE(status)) {
@@ -714,9 +714,8 @@ static int __cpuinit acpi_processor_start(struct acpi_device *device)
714 goto end; 714 goto end;
715 } 715 }
716 716
717 printk(KERN_INFO PREFIX 717 dev_info(&device->dev, "registered as cooling_device%d\n",
718 "%s is registered as cooling_device%d\n", 718 pr->cdev->id);
719 device->dev.bus_id, pr->cdev->id);
720 719
721 result = sysfs_create_link(&device->dev.kobj, 720 result = sysfs_create_link(&device->dev.kobj,
722 &pr->cdev->device.kobj, 721 &pr->cdev->device.kobj,
@@ -819,7 +818,7 @@ static int acpi_processor_add(struct acpi_device *device)
819 pr->handle = device->handle; 818 pr->handle = device->handle;
820 strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME); 819 strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME);
821 strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS); 820 strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS);
822 acpi_driver_data(device) = pr; 821 device->driver_data = pr;
823 822
824 return 0; 823 return 0;
825} 824}
@@ -876,7 +875,7 @@ static int acpi_processor_remove(struct acpi_device *device, int type)
876static int is_processor_present(acpi_handle handle) 875static int is_processor_present(acpi_handle handle)
877{ 876{
878 acpi_status status; 877 acpi_status status;
879 unsigned long sta = 0; 878 unsigned long long sta = 0;
880 879
881 880
882 status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); 881 status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
index d592dbb1d12a..81b40ed5379e 100644
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -41,7 +41,6 @@
41#include <linux/pm_qos_params.h> 41#include <linux/pm_qos_params.h>
42#include <linux/clockchips.h> 42#include <linux/clockchips.h>
43#include <linux/cpuidle.h> 43#include <linux/cpuidle.h>
44#include <linux/cpuidle.h>
45 44
46/* 45/*
47 * Include the apic definitions for x86 to have the APIC timer related defines 46 * Include the apic definitions for x86 to have the APIC timer related defines
@@ -272,6 +271,8 @@ static atomic_t c3_cpu_count;
272/* Common C-state entry for C2, C3, .. */ 271/* Common C-state entry for C2, C3, .. */
273static void acpi_cstate_enter(struct acpi_processor_cx *cstate) 272static void acpi_cstate_enter(struct acpi_processor_cx *cstate)
274{ 273{
274 /* Don't trace irqs off for idle */
275 stop_critical_timings();
275 if (cstate->entry_method == ACPI_CSTATE_FFH) { 276 if (cstate->entry_method == ACPI_CSTATE_FFH) {
276 /* Call into architectural FFH based C-state */ 277 /* Call into architectural FFH based C-state */
277 acpi_processor_ffh_cstate_enter(cstate); 278 acpi_processor_ffh_cstate_enter(cstate);
@@ -284,6 +285,7 @@ static void acpi_cstate_enter(struct acpi_processor_cx *cstate)
284 gets asserted in time to freeze execution properly. */ 285 gets asserted in time to freeze execution properly. */
285 unused = inl(acpi_gbl_FADT.xpm_timer_block.address); 286 unused = inl(acpi_gbl_FADT.xpm_timer_block.address);
286 } 287 }
288 start_critical_timings();
287} 289}
288#endif /* !CONFIG_CPU_IDLE */ 290#endif /* !CONFIG_CPU_IDLE */
289 291
@@ -1329,9 +1331,15 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr)
1329 if (!pr->flags.power_setup_done) 1331 if (!pr->flags.power_setup_done)
1330 return -ENODEV; 1332 return -ENODEV;
1331 1333
1332 /* Fall back to the default idle loop */ 1334 /*
1333 pm_idle = pm_idle_save; 1335 * Fall back to the default idle loop, when pm_idle_save had
1334 synchronize_sched(); /* Relies on interrupts forcing exit from idle. */ 1336 * been initialized.
1337 */
1338 if (pm_idle_save) {
1339 pm_idle = pm_idle_save;
1340 /* Relies on interrupts forcing exit from idle. */
1341 synchronize_sched();
1342 }
1335 1343
1336 pr->flags.power = 0; 1344 pr->flags.power = 0;
1337 result = acpi_processor_get_power_info(pr); 1345 result = acpi_processor_get_power_info(pr);
@@ -1418,6 +1426,8 @@ static inline void acpi_idle_update_bm_rld(struct acpi_processor *pr,
1418 */ 1426 */
1419static inline void acpi_idle_do_entry(struct acpi_processor_cx *cx) 1427static inline void acpi_idle_do_entry(struct acpi_processor_cx *cx)
1420{ 1428{
1429 /* Don't trace irqs off for idle */
1430 stop_critical_timings();
1421 if (cx->entry_method == ACPI_CSTATE_FFH) { 1431 if (cx->entry_method == ACPI_CSTATE_FFH) {
1422 /* Call into architectural FFH based C-state */ 1432 /* Call into architectural FFH based C-state */
1423 acpi_processor_ffh_cstate_enter(cx); 1433 acpi_processor_ffh_cstate_enter(cx);
@@ -1432,6 +1442,7 @@ static inline void acpi_idle_do_entry(struct acpi_processor_cx *cx)
1432 gets asserted in time to freeze execution properly. */ 1442 gets asserted in time to freeze execution properly. */
1433 unused = inl(acpi_gbl_FADT.xpm_timer_block.address); 1443 unused = inl(acpi_gbl_FADT.xpm_timer_block.address);
1434 } 1444 }
1445 start_critical_timings();
1435} 1446}
1436 1447
1437/** 1448/**
@@ -1576,6 +1587,7 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
1576 1587
1577 if (acpi_idle_bm_check()) { 1588 if (acpi_idle_bm_check()) {
1578 if (dev->safe_state) { 1589 if (dev->safe_state) {
1590 dev->last_state = dev->safe_state;
1579 return dev->safe_state->enter(dev, dev->safe_state); 1591 return dev->safe_state->enter(dev, dev->safe_state);
1580 } else { 1592 } else {
1581 local_irq_disable(); 1593 local_irq_disable();
@@ -1890,7 +1902,8 @@ int acpi_processor_power_exit(struct acpi_processor *pr,
1890 1902
1891 /* Unregister the idle handler when processor #0 is removed. */ 1903 /* Unregister the idle handler when processor #0 is removed. */
1892 if (pr->id == 0) { 1904 if (pr->id == 0) {
1893 pm_idle = pm_idle_save; 1905 if (pm_idle_save)
1906 pm_idle = pm_idle_save;
1894 1907
1895 /* 1908 /*
1896 * We are about to unload the current idle thread pm callback 1909 * We are about to unload the current idle thread pm callback
diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c
index b4749969c6b4..dc98f7a6f2c4 100644
--- a/drivers/acpi/processor_perflib.c
+++ b/drivers/acpi/processor_perflib.c
@@ -38,6 +38,7 @@
38 38
39#include <asm/uaccess.h> 39#include <asm/uaccess.h>
40#endif 40#endif
41#include <asm/cpufeature.h>
41 42
42#include <acpi/acpi_bus.h> 43#include <acpi/acpi_bus.h>
43#include <acpi/processor.h> 44#include <acpi/processor.h>
@@ -64,15 +65,21 @@ static DEFINE_MUTEX(performance_mutex);
64 * policy is adjusted accordingly. 65 * policy is adjusted accordingly.
65 */ 66 */
66 67
67static unsigned int ignore_ppc = 0; 68/* ignore_ppc:
68module_param(ignore_ppc, uint, 0644); 69 * -1 -> cpufreq low level drivers not initialized -> _PSS, etc. not called yet
70 * ignore _PPC
71 * 0 -> cpufreq low level drivers initialized -> consider _PPC values
72 * 1 -> ignore _PPC totally -> forced by user through boot param
73 */
74static int ignore_ppc = -1;
75module_param(ignore_ppc, int, 0644);
69MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \ 76MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \
70 "limited by BIOS, this should help"); 77 "limited by BIOS, this should help");
71 78
72#define PPC_REGISTERED 1 79#define PPC_REGISTERED 1
73#define PPC_IN_USE 2 80#define PPC_IN_USE 2
74 81
75static int acpi_processor_ppc_status = 0; 82static int acpi_processor_ppc_status;
76 83
77static int acpi_processor_ppc_notifier(struct notifier_block *nb, 84static int acpi_processor_ppc_notifier(struct notifier_block *nb,
78 unsigned long event, void *data) 85 unsigned long event, void *data)
@@ -81,13 +88,18 @@ static int acpi_processor_ppc_notifier(struct notifier_block *nb,
81 struct acpi_processor *pr; 88 struct acpi_processor *pr;
82 unsigned int ppc = 0; 89 unsigned int ppc = 0;
83 90
84 if (ignore_ppc) 91 if (event == CPUFREQ_START && ignore_ppc <= 0) {
92 ignore_ppc = 0;
85 return 0; 93 return 0;
94 }
86 95
87 mutex_lock(&performance_mutex); 96 if (ignore_ppc)
97 return 0;
88 98
89 if (event != CPUFREQ_INCOMPATIBLE) 99 if (event != CPUFREQ_INCOMPATIBLE)
90 goto out; 100 return 0;
101
102 mutex_lock(&performance_mutex);
91 103
92 pr = per_cpu(processors, policy->cpu); 104 pr = per_cpu(processors, policy->cpu);
93 if (!pr || !pr->performance) 105 if (!pr || !pr->performance)
@@ -115,7 +127,7 @@ static struct notifier_block acpi_ppc_notifier_block = {
115static int acpi_processor_get_platform_limit(struct acpi_processor *pr) 127static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
116{ 128{
117 acpi_status status = 0; 129 acpi_status status = 0;
118 unsigned long ppc = 0; 130 unsigned long long ppc = 0;
119 131
120 132
121 if (!pr) 133 if (!pr)
@@ -323,7 +335,6 @@ static int acpi_processor_get_performance_info(struct acpi_processor *pr)
323 acpi_status status = AE_OK; 335 acpi_status status = AE_OK;
324 acpi_handle handle = NULL; 336 acpi_handle handle = NULL;
325 337
326
327 if (!pr || !pr->performance || !pr->handle) 338 if (!pr || !pr->performance || !pr->handle)
328 return -EINVAL; 339 return -EINVAL;
329 340
@@ -336,13 +347,25 @@ static int acpi_processor_get_performance_info(struct acpi_processor *pr)
336 347
337 result = acpi_processor_get_performance_control(pr); 348 result = acpi_processor_get_performance_control(pr);
338 if (result) 349 if (result)
339 return result; 350 goto update_bios;
340 351
341 result = acpi_processor_get_performance_states(pr); 352 result = acpi_processor_get_performance_states(pr);
342 if (result) 353 if (result)
343 return result; 354 goto update_bios;
344 355
345 return 0; 356 return 0;
357
358 /*
359 * Having _PPC but missing frequencies (_PSS, _PCT) is a very good hint that
360 * the BIOS is older than the CPU and does not know its frequencies
361 */
362 update_bios:
363 if (ACPI_SUCCESS(acpi_get_handle(pr->handle, "_PPC", &handle))){
364 if(boot_cpu_has(X86_FEATURE_EST))
365 printk(KERN_WARNING FW_BUG "BIOS needs update for CPU "
366 "frequency support\n");
367 }
368 return result;
346} 369}
347 370
348int acpi_processor_notify_smm(struct module *calling_module) 371int acpi_processor_notify_smm(struct module *calling_module)
@@ -513,13 +536,13 @@ static int acpi_processor_get_psd(struct acpi_processor *pr)
513 536
514 psd = buffer.pointer; 537 psd = buffer.pointer;
515 if (!psd || (psd->type != ACPI_TYPE_PACKAGE)) { 538 if (!psd || (psd->type != ACPI_TYPE_PACKAGE)) {
516 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _PSD data\n")); 539 printk(KERN_ERR PREFIX "Invalid _PSD data\n");
517 result = -EFAULT; 540 result = -EFAULT;
518 goto end; 541 goto end;
519 } 542 }
520 543
521 if (psd->package.count != 1) { 544 if (psd->package.count != 1) {
522 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _PSD data\n")); 545 printk(KERN_ERR PREFIX "Invalid _PSD data\n");
523 result = -EFAULT; 546 result = -EFAULT;
524 goto end; 547 goto end;
525 } 548 }
@@ -532,19 +555,19 @@ static int acpi_processor_get_psd(struct acpi_processor *pr)
532 status = acpi_extract_package(&(psd->package.elements[0]), 555 status = acpi_extract_package(&(psd->package.elements[0]),
533 &format, &state); 556 &format, &state);
534 if (ACPI_FAILURE(status)) { 557 if (ACPI_FAILURE(status)) {
535 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _PSD data\n")); 558 printk(KERN_ERR PREFIX "Invalid _PSD data\n");
536 result = -EFAULT; 559 result = -EFAULT;
537 goto end; 560 goto end;
538 } 561 }
539 562
540 if (pdomain->num_entries != ACPI_PSD_REV0_ENTRIES) { 563 if (pdomain->num_entries != ACPI_PSD_REV0_ENTRIES) {
541 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unknown _PSD:num_entries\n")); 564 printk(KERN_ERR PREFIX "Unknown _PSD:num_entries\n");
542 result = -EFAULT; 565 result = -EFAULT;
543 goto end; 566 goto end;
544 } 567 }
545 568
546 if (pdomain->revision != ACPI_PSD_REV0_REVISION) { 569 if (pdomain->revision != ACPI_PSD_REV0_REVISION) {
547 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unknown _PSD:revision\n")); 570 printk(KERN_ERR PREFIX "Unknown _PSD:revision\n");
548 result = -EFAULT; 571 result = -EFAULT;
549 goto end; 572 goto end;
550 } 573 }
diff --git a/drivers/acpi/processor_throttling.c b/drivers/acpi/processor_throttling.c
index 0622ace05220..3da2df93d924 100644
--- a/drivers/acpi/processor_throttling.c
+++ b/drivers/acpi/processor_throttling.c
@@ -274,7 +274,7 @@ static int acpi_processor_throttling_notifier(unsigned long event, void *data)
274static int acpi_processor_get_platform_limit(struct acpi_processor *pr) 274static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
275{ 275{
276 acpi_status status = 0; 276 acpi_status status = 0;
277 unsigned long tpc = 0; 277 unsigned long long tpc = 0;
278 278
279 if (!pr) 279 if (!pr)
280 return -EINVAL; 280 return -EINVAL;
@@ -528,13 +528,13 @@ static int acpi_processor_get_tsd(struct acpi_processor *pr)
528 528
529 tsd = buffer.pointer; 529 tsd = buffer.pointer;
530 if (!tsd || (tsd->type != ACPI_TYPE_PACKAGE)) { 530 if (!tsd || (tsd->type != ACPI_TYPE_PACKAGE)) {
531 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _TSD data\n")); 531 printk(KERN_ERR PREFIX "Invalid _TSD data\n");
532 result = -EFAULT; 532 result = -EFAULT;
533 goto end; 533 goto end;
534 } 534 }
535 535
536 if (tsd->package.count != 1) { 536 if (tsd->package.count != 1) {
537 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _TSD data\n")); 537 printk(KERN_ERR PREFIX "Invalid _TSD data\n");
538 result = -EFAULT; 538 result = -EFAULT;
539 goto end; 539 goto end;
540 } 540 }
@@ -547,19 +547,19 @@ static int acpi_processor_get_tsd(struct acpi_processor *pr)
547 status = acpi_extract_package(&(tsd->package.elements[0]), 547 status = acpi_extract_package(&(tsd->package.elements[0]),
548 &format, &state); 548 &format, &state);
549 if (ACPI_FAILURE(status)) { 549 if (ACPI_FAILURE(status)) {
550 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _TSD data\n")); 550 printk(KERN_ERR PREFIX "Invalid _TSD data\n");
551 result = -EFAULT; 551 result = -EFAULT;
552 goto end; 552 goto end;
553 } 553 }
554 554
555 if (pdomain->num_entries != ACPI_TSD_REV0_ENTRIES) { 555 if (pdomain->num_entries != ACPI_TSD_REV0_ENTRIES) {
556 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unknown _TSD:num_entries\n")); 556 printk(KERN_ERR PREFIX "Unknown _TSD:num_entries\n");
557 result = -EFAULT; 557 result = -EFAULT;
558 goto end; 558 goto end;
559 } 559 }
560 560
561 if (pdomain->revision != ACPI_TSD_REV0_REVISION) { 561 if (pdomain->revision != ACPI_TSD_REV0_REVISION) {
562 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unknown _TSD:revision\n")); 562 printk(KERN_ERR PREFIX "Unknown _TSD:revision\n");
563 result = -EFAULT; 563 result = -EFAULT;
564 goto end; 564 goto end;
565 } 565 }
@@ -1013,7 +1013,7 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, int state)
1013 * affected cpu in order to get one proper T-state. 1013 * affected cpu in order to get one proper T-state.
1014 * The notifier event is THROTTLING_PRECHANGE. 1014 * The notifier event is THROTTLING_PRECHANGE.
1015 */ 1015 */
1016 for_each_cpu_mask(i, online_throttling_cpus) { 1016 for_each_cpu_mask_nr(i, online_throttling_cpus) {
1017 t_state.cpu = i; 1017 t_state.cpu = i;
1018 acpi_processor_throttling_notifier(THROTTLING_PRECHANGE, 1018 acpi_processor_throttling_notifier(THROTTLING_PRECHANGE,
1019 &t_state); 1019 &t_state);
@@ -1034,7 +1034,7 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, int state)
1034 * it is necessary to set T-state for every affected 1034 * it is necessary to set T-state for every affected
1035 * cpus. 1035 * cpus.
1036 */ 1036 */
1037 for_each_cpu_mask(i, online_throttling_cpus) { 1037 for_each_cpu_mask_nr(i, online_throttling_cpus) {
1038 match_pr = per_cpu(processors, i); 1038 match_pr = per_cpu(processors, i);
1039 /* 1039 /*
1040 * If the pointer is invalid, we will report the 1040 * If the pointer is invalid, we will report the
@@ -1068,7 +1068,7 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, int state)
1068 * affected cpu to update the T-states. 1068 * affected cpu to update the T-states.
1069 * The notifier event is THROTTLING_POSTCHANGE 1069 * The notifier event is THROTTLING_POSTCHANGE
1070 */ 1070 */
1071 for_each_cpu_mask(i, online_throttling_cpus) { 1071 for_each_cpu_mask_nr(i, online_throttling_cpus) {
1072 t_state.cpu = i; 1072 t_state.cpu = i;
1073 acpi_processor_throttling_notifier(THROTTLING_POSTCHANGE, 1073 acpi_processor_throttling_notifier(THROTTLING_POSTCHANGE,
1074 &t_state); 1074 &t_state);
diff --git a/drivers/acpi/reboot.c b/drivers/acpi/reboot.c
index a6b662c00b67..755baf2ca70a 100644
--- a/drivers/acpi/reboot.c
+++ b/drivers/acpi/reboot.c
@@ -15,9 +15,28 @@ void acpi_reboot(void)
15 15
16 rr = &acpi_gbl_FADT.reset_register; 16 rr = &acpi_gbl_FADT.reset_register;
17 17
18 /* Is the reset register supported? */ 18 /*
19 if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER) || 19 * Is the ACPI reset register supported?
20 rr->bit_width != 8 || rr->bit_offset != 0) 20 *
21 * According to ACPI 3.0, FADT.flags.RESET_REG_SUP indicates
22 * whether the ACPI reset mechanism is supported.
23 *
24 * However, some boxes have this bit clear, yet a valid
25 * ACPI_RESET_REG & RESET_VALUE, and ACPI reboot is the only
26 * mechanism that works for them after S3.
27 *
28 * This suggests that other operating systems may not be checking
29 * the RESET_REG_SUP bit, and are using other means to decide
30 * whether to use the ACPI reboot mechanism or not.
31 *
32 * So when acpi reboot is requested,
33 * only the reset_register is checked. If the following
34 * conditions are met, it indicates that the reset register is supported.
35 * a. reset_register is not zero
36 * b. the access width is eight
37 * c. the bit_offset is zero
38 */
39 if (!(rr->address) || rr->bit_width != 8 || rr->bit_offset != 0)
21 return; 40 return;
22 41
23 reset_value = acpi_gbl_FADT.reset_value; 42 reset_value = acpi_gbl_FADT.reset_value;
diff --git a/drivers/acpi/resources/rscalc.c b/drivers/acpi/resources/rscalc.c
index f61ebc679e66..8eaaecf92009 100644
--- a/drivers/acpi/resources/rscalc.c
+++ b/drivers/acpi/resources/rscalc.c
@@ -43,7 +43,6 @@
43 43
44#include <acpi/acpi.h> 44#include <acpi/acpi.h>
45#include <acpi/acresrc.h> 45#include <acpi/acresrc.h>
46#include <acpi/amlcode.h>
47#include <acpi/acnamesp.h> 46#include <acpi/acnamesp.h>
48 47
49#define _COMPONENT ACPI_RESOURCES 48#define _COMPONENT ACPI_RESOURCES
@@ -560,8 +559,8 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,
560 ACPI_GET_OBJECT_TYPE(*sub_object_list)) || 559 ACPI_GET_OBJECT_TYPE(*sub_object_list)) ||
561 ((ACPI_TYPE_LOCAL_REFERENCE == 560 ((ACPI_TYPE_LOCAL_REFERENCE ==
562 ACPI_GET_OBJECT_TYPE(*sub_object_list)) && 561 ACPI_GET_OBJECT_TYPE(*sub_object_list)) &&
563 ((*sub_object_list)->reference.opcode == 562 ((*sub_object_list)->reference.class ==
564 AML_INT_NAMEPATH_OP)))) { 563 ACPI_REFCLASS_NAME)))) {
565 name_found = TRUE; 564 name_found = TRUE;
566 } else { 565 } else {
567 /* Look at the next element */ 566 /* Look at the next element */
@@ -587,6 +586,9 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,
587 } else { 586 } else {
588 temp_size_needed += 587 temp_size_needed +=
589 acpi_ns_get_pathname_length((*sub_object_list)->reference.node); 588 acpi_ns_get_pathname_length((*sub_object_list)->reference.node);
589 if (!temp_size_needed) {
590 return_ACPI_STATUS(AE_BAD_PARAMETER);
591 }
590 } 592 }
591 } else { 593 } else {
592 /* 594 /*
diff --git a/drivers/acpi/resources/rscreate.c b/drivers/acpi/resources/rscreate.c
index 7804a8c40e7a..c0bbfa2c4193 100644
--- a/drivers/acpi/resources/rscreate.c
+++ b/drivers/acpi/resources/rscreate.c
@@ -43,7 +43,6 @@
43 43
44#include <acpi/acpi.h> 44#include <acpi/acpi.h>
45#include <acpi/acresrc.h> 45#include <acpi/acresrc.h>
46#include <acpi/amlcode.h>
47#include <acpi/acnamesp.h> 46#include <acpi/acnamesp.h>
48 47
49#define _COMPONENT ACPI_RESOURCES 48#define _COMPONENT ACPI_RESOURCES
@@ -310,13 +309,12 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
310 switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { 309 switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
311 case ACPI_TYPE_LOCAL_REFERENCE: 310 case ACPI_TYPE_LOCAL_REFERENCE:
312 311
313 if (obj_desc->reference.opcode != 312 if (obj_desc->reference.class !=
314 AML_INT_NAMEPATH_OP) { 313 ACPI_REFCLASS_NAME) {
315 ACPI_ERROR((AE_INFO, 314 ACPI_ERROR((AE_INFO,
316 "(PRT[%X].Source) Need name, found reference op %X", 315 "(PRT[%X].Source) Need name, found Reference Class %X",
317 index, 316 index,
318 obj_desc->reference. 317 obj_desc->reference.class));
319 opcode));
320 return_ACPI_STATUS(AE_BAD_DATA); 318 return_ACPI_STATUS(AE_BAD_DATA);
321 } 319 }
322 320
diff --git a/drivers/acpi/sbs.c b/drivers/acpi/sbs.c
index 10a36512647c..6050ce481873 100644
--- a/drivers/acpi/sbs.c
+++ b/drivers/acpi/sbs.c
@@ -463,7 +463,7 @@ static ssize_t acpi_battery_alarm_store(struct device *dev,
463} 463}
464 464
465static struct device_attribute alarm_attr = { 465static struct device_attribute alarm_attr = {
466 .attr = {.name = "alarm", .mode = 0644, .owner = THIS_MODULE}, 466 .attr = {.name = "alarm", .mode = 0644},
467 .show = acpi_battery_alarm_show, 467 .show = acpi_battery_alarm_show,
468 .store = acpi_battery_alarm_store, 468 .store = acpi_battery_alarm_store,
469}; 469};
@@ -931,7 +931,7 @@ static int acpi_sbs_add(struct acpi_device *device)
931 sbs->device = device; 931 sbs->device = device;
932 strcpy(acpi_device_name(device), ACPI_SBS_DEVICE_NAME); 932 strcpy(acpi_device_name(device), ACPI_SBS_DEVICE_NAME);
933 strcpy(acpi_device_class(device), ACPI_SBS_CLASS); 933 strcpy(acpi_device_class(device), ACPI_SBS_CLASS);
934 acpi_driver_data(device) = sbs; 934 device->driver_data = sbs;
935 935
936 result = acpi_charger_add(sbs); 936 result = acpi_charger_add(sbs);
937 if (result) 937 if (result)
diff --git a/drivers/acpi/sbshc.c b/drivers/acpi/sbshc.c
index bcf2c70fca87..e53e590252c0 100644
--- a/drivers/acpi/sbshc.c
+++ b/drivers/acpi/sbshc.c
@@ -107,6 +107,13 @@ static int wait_transaction_complete(struct acpi_smb_hc *hc, int timeout)
107 if (wait_event_timeout(hc->wait, smb_check_done(hc), 107 if (wait_event_timeout(hc->wait, smb_check_done(hc),
108 msecs_to_jiffies(timeout))) 108 msecs_to_jiffies(timeout)))
109 return 0; 109 return 0;
110 /*
111 * After the timeout happens, OS will try to check the status of SMbus.
112 * If the status is what OS expected, it will be regarded as the bogus
113 * timeout.
114 */
115 if (smb_check_done(hc))
116 return 0;
110 else 117 else
111 return -ETIME; 118 return -ETIME;
112} 119}
@@ -251,7 +258,7 @@ extern int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
251static int acpi_smbus_hc_add(struct acpi_device *device) 258static int acpi_smbus_hc_add(struct acpi_device *device)
252{ 259{
253 int status; 260 int status;
254 unsigned long val; 261 unsigned long long val;
255 struct acpi_smb_hc *hc; 262 struct acpi_smb_hc *hc;
256 263
257 if (!device) 264 if (!device)
@@ -275,7 +282,7 @@ static int acpi_smbus_hc_add(struct acpi_device *device)
275 hc->ec = acpi_driver_data(device->parent); 282 hc->ec = acpi_driver_data(device->parent);
276 hc->offset = (val >> 8) & 0xff; 283 hc->offset = (val >> 8) & 0xff;
277 hc->query_bit = val & 0xff; 284 hc->query_bit = val & 0xff;
278 acpi_driver_data(device) = hc; 285 device->driver_data = hc;
279 286
280 acpi_ec_add_query_handler(hc->ec, hc->query_bit, NULL, smbus_alarm, hc); 287 acpi_ec_add_query_handler(hc->ec, hc->query_bit, NULL, smbus_alarm, hc);
281 printk(KERN_INFO PREFIX "SBS HC: EC = 0x%p, offset = 0x%0x, query_bit = 0x%0x\n", 288 printk(KERN_INFO PREFIX "SBS HC: EC = 0x%p, offset = 0x%0x, query_bit = 0x%0x\n",
@@ -296,7 +303,7 @@ static int acpi_smbus_hc_remove(struct acpi_device *device, int type)
296 hc = acpi_driver_data(device); 303 hc = acpi_driver_data(device);
297 acpi_ec_remove_query_handler(hc->ec, hc->query_bit); 304 acpi_ec_remove_query_handler(hc->ec, hc->query_bit);
298 kfree(hc); 305 kfree(hc);
299 acpi_driver_data(device) = NULL; 306 device->driver_data = NULL;
300 return 0; 307 return 0;
301} 308}
302 309
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index f3132aa47a69..a9dda8e0f9f9 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -113,16 +113,16 @@ static int acpi_bus_hot_remove_device(void *context)
113 113
114 114
115 if (acpi_bus_trim(device, 1)) { 115 if (acpi_bus_trim(device, 1)) {
116 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 116 printk(KERN_ERR PREFIX
117 "Removing device failed\n")); 117 "Removing device failed\n");
118 return -1; 118 return -1;
119 } 119 }
120 120
121 /* power off device */ 121 /* power off device */
122 status = acpi_evaluate_object(handle, "_PS3", NULL, NULL); 122 status = acpi_evaluate_object(handle, "_PS3", NULL, NULL);
123 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) 123 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND)
124 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 124 printk(KERN_WARNING PREFIX
125 "Power-off device failed\n")); 125 "Power-off device failed\n");
126 126
127 if (device->flags.lockable) { 127 if (device->flags.lockable) {
128 arg_list.count = 1; 128 arg_list.count = 1;
@@ -276,6 +276,13 @@ int acpi_match_device_ids(struct acpi_device *device,
276{ 276{
277 const struct acpi_device_id *id; 277 const struct acpi_device_id *id;
278 278
279 /*
280 * If the device is not present, it is unnecessary to load device
281 * driver for it.
282 */
283 if (!device->status.present)
284 return -ENODEV;
285
279 if (device->flags.hardware_id) { 286 if (device->flags.hardware_id) {
280 for (id = ids; id->id[0]; id++) { 287 for (id = ids; id->id[0]; id++) {
281 if (!strcmp((char*)id->id, device->pnp.hardware_id)) 288 if (!strcmp((char*)id->id, device->pnp.hardware_id))
@@ -384,7 +391,7 @@ static int acpi_device_remove(struct device * dev)
384 acpi_drv->ops.remove(acpi_dev, acpi_dev->removal_type); 391 acpi_drv->ops.remove(acpi_dev, acpi_dev->removal_type);
385 } 392 }
386 acpi_dev->driver = NULL; 393 acpi_dev->driver = NULL;
387 acpi_driver_data(dev) = NULL; 394 acpi_dev->driver_data = NULL;
388 395
389 put_device(dev); 396 put_device(dev);
390 return 0; 397 return 0;
@@ -471,13 +478,13 @@ static int acpi_device_register(struct acpi_device *device,
471 device->dev.release = &acpi_device_release; 478 device->dev.release = &acpi_device_release;
472 result = device_add(&device->dev); 479 result = device_add(&device->dev);
473 if(result) { 480 if(result) {
474 printk(KERN_ERR PREFIX "Error adding device %s", device->dev.bus_id); 481 dev_err(&device->dev, "Error adding device\n");
475 goto end; 482 goto end;
476 } 483 }
477 484
478 result = acpi_device_setup_files(device); 485 result = acpi_device_setup_files(device);
479 if(result) 486 if(result)
480 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error creating sysfs interface for device %s\n", device->dev.bus_id)); 487 printk(KERN_ERR PREFIX "Error creating sysfs interface for device %s\n", device->dev.bus_id);
481 488
482 device->removal_type = ACPI_BUS_REMOVAL_NORMAL; 489 device->removal_type = ACPI_BUS_REMOVAL_NORMAL;
483 return 0; 490 return 0;
@@ -537,7 +544,7 @@ acpi_bus_driver_init(struct acpi_device *device, struct acpi_driver *driver)
537 result = driver->ops.add(device); 544 result = driver->ops.add(device);
538 if (result) { 545 if (result) {
539 device->driver = NULL; 546 device->driver = NULL;
540 acpi_driver_data(device) = NULL; 547 device->driver_data = NULL;
541 return result; 548 return result;
542 } 549 }
543 550
@@ -744,6 +751,16 @@ static int acpi_bus_get_wakeup_device_flags(struct acpi_device *device)
744 if (!acpi_match_device_ids(device, button_device_ids)) 751 if (!acpi_match_device_ids(device, button_device_ids))
745 device->wakeup.flags.run_wake = 1; 752 device->wakeup.flags.run_wake = 1;
746 753
754 /*
755 * Don't set Power button GPE as run_wake
756 * if Fixed Power button is used
757 */
758 if (!strcmp(device->pnp.hardware_id, "PNP0C0C") &&
759 !(acpi_gbl_FADT.flags & ACPI_FADT_POWER_BUTTON)) {
760 device->wakeup.flags.run_wake = 0;
761 device->wakeup.flags.valid = 0;
762 }
763
747 end: 764 end:
748 if (ACPI_FAILURE(status)) 765 if (ACPI_FAILURE(status))
749 device->flags.wake_capable = 0; 766 device->flags.wake_capable = 0;
@@ -807,6 +824,7 @@ static int acpi_bus_get_power_flags(struct acpi_device *device)
807 /* TBD: System wake support and resource requirements. */ 824 /* TBD: System wake support and resource requirements. */
808 825
809 device->power.state = ACPI_STATE_UNKNOWN; 826 device->power.state = ACPI_STATE_UNKNOWN;
827 acpi_bus_get_power(device->handle, &(device->power.state));
810 828
811 return 0; 829 return 0;
812} 830}
@@ -1153,20 +1171,6 @@ static int acpi_bus_remove(struct acpi_device *dev, int rmdevice)
1153} 1171}
1154 1172
1155static int 1173static int
1156acpi_is_child_device(struct acpi_device *device,
1157 int (*matcher)(struct acpi_device *))
1158{
1159 int result = -ENODEV;
1160
1161 do {
1162 if (ACPI_SUCCESS(matcher(device)))
1163 return AE_OK;
1164 } while ((device = device->parent));
1165
1166 return result;
1167}
1168
1169static int
1170acpi_add_single_object(struct acpi_device **child, 1174acpi_add_single_object(struct acpi_device **child,
1171 struct acpi_device *parent, acpi_handle handle, int type, 1175 struct acpi_device *parent, acpi_handle handle, int type,
1172 struct acpi_bus_ops *ops) 1176 struct acpi_bus_ops *ops)
@@ -1221,15 +1225,18 @@ acpi_add_single_object(struct acpi_device **child,
1221 result = -ENODEV; 1225 result = -ENODEV;
1222 goto end; 1226 goto end;
1223 } 1227 }
1224 if (!device->status.present) { 1228 /*
1225 /* Bay and dock should be handled even if absent */ 1229 * When the device is neither present nor functional, the
1226 if (!ACPI_SUCCESS( 1230 * device should not be added to Linux ACPI device tree.
1227 acpi_is_child_device(device, acpi_bay_match)) && 1231 * When the status of the device is not present but functinal,
1228 !ACPI_SUCCESS( 1232 * it should be added to Linux ACPI tree. For example : bay
1229 acpi_is_child_device(device, acpi_dock_match))) { 1233 * device , dock device.
1230 result = -ENODEV; 1234 * In such conditions it is unncessary to check whether it is
1231 goto end; 1235 * bay device or dock device.
1232 } 1236 */
1237 if (!device->status.present && !device->status.functional) {
1238 result = -ENODEV;
1239 goto end;
1233 } 1240 }
1234 break; 1241 break;
1235 default: 1242 default:
@@ -1252,6 +1259,16 @@ acpi_add_single_object(struct acpi_device **child,
1252 acpi_device_set_id(device, parent, handle, type); 1259 acpi_device_set_id(device, parent, handle, type);
1253 1260
1254 /* 1261 /*
1262 * The ACPI device is attached to acpi handle before getting
1263 * the power/wakeup/peformance flags. Otherwise OS can't get
1264 * the corresponding ACPI device by the acpi handle in the course
1265 * of getting the power/wakeup/performance flags.
1266 */
1267 result = acpi_device_set_context(device, type);
1268 if (result)
1269 goto end;
1270
1271 /*
1255 * Power Management 1272 * Power Management
1256 * ---------------- 1273 * ----------------
1257 */ 1274 */
@@ -1281,8 +1298,6 @@ acpi_add_single_object(struct acpi_device **child,
1281 goto end; 1298 goto end;
1282 } 1299 }
1283 1300
1284 if ((result = acpi_device_set_context(device, type)))
1285 goto end;
1286 1301
1287 result = acpi_device_register(device, parent); 1302 result = acpi_device_register(device, parent);
1288 1303
@@ -1402,7 +1417,12 @@ static int acpi_bus_scan(struct acpi_device *start, struct acpi_bus_ops *ops)
1402 * TBD: Need notifications and other detection mechanisms 1417 * TBD: Need notifications and other detection mechanisms
1403 * in place before we can fully implement this. 1418 * in place before we can fully implement this.
1404 */ 1419 */
1405 if (child->status.present) { 1420 /*
1421 * When the device is not present but functional, it is also
1422 * necessary to scan the children of this device.
1423 */
1424 if (child->status.present || (!child->status.present &&
1425 child->status.functional)) {
1406 status = acpi_get_next_object(ACPI_TYPE_ANY, chandle, 1426 status = acpi_get_next_object(ACPI_TYPE_ANY, chandle,
1407 NULL, NULL); 1427 NULL, NULL);
1408 if (ACPI_SUCCESS(status)) { 1428 if (ACPI_SUCCESS(status)) {
@@ -1545,7 +1565,6 @@ static int acpi_bus_scan_fixed(struct acpi_device *root)
1545 return result; 1565 return result;
1546} 1566}
1547 1567
1548int __init acpi_boot_ec_enable(void);
1549 1568
1550static int __init acpi_scan_init(void) 1569static int __init acpi_scan_init(void)
1551{ 1570{
@@ -1579,9 +1598,6 @@ static int __init acpi_scan_init(void)
1579 */ 1598 */
1580 result = acpi_bus_scan_fixed(acpi_root); 1599 result = acpi_bus_scan_fixed(acpi_root);
1581 1600
1582 /* EC region might be needed at bus_scan, so enable it now */
1583 acpi_boot_ec_enable();
1584
1585 if (!result) 1601 if (!result)
1586 result = acpi_bus_scan(acpi_root, &ops); 1602 result = acpi_bus_scan(acpi_root, &ops);
1587 1603
diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c
index 0489a7d1d42c..26571bafb158 100644
--- a/drivers/acpi/sleep/main.c
+++ b/drivers/acpi/sleep/main.c
@@ -15,6 +15,7 @@
15#include <linux/dmi.h> 15#include <linux/dmi.h>
16#include <linux/device.h> 16#include <linux/device.h>
17#include <linux/suspend.h> 17#include <linux/suspend.h>
18#include <linux/reboot.h>
18 19
19#include <asm/io.h> 20#include <asm/io.h>
20 21
@@ -24,6 +25,36 @@
24 25
25u8 sleep_states[ACPI_S_STATE_COUNT]; 26u8 sleep_states[ACPI_S_STATE_COUNT];
26 27
28static void acpi_sleep_tts_switch(u32 acpi_state)
29{
30 union acpi_object in_arg = { ACPI_TYPE_INTEGER };
31 struct acpi_object_list arg_list = { 1, &in_arg };
32 acpi_status status = AE_OK;
33
34 in_arg.integer.value = acpi_state;
35 status = acpi_evaluate_object(NULL, "\\_TTS", &arg_list, NULL);
36 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
37 /*
38 * OS can't evaluate the _TTS object correctly. Some warning
39 * message will be printed. But it won't break anything.
40 */
41 printk(KERN_NOTICE "Failure in evaluating _TTS object\n");
42 }
43}
44
45static int tts_notify_reboot(struct notifier_block *this,
46 unsigned long code, void *x)
47{
48 acpi_sleep_tts_switch(ACPI_STATE_S5);
49 return NOTIFY_DONE;
50}
51
52static struct notifier_block tts_notifier = {
53 .notifier_call = tts_notify_reboot,
54 .next = NULL,
55 .priority = 0,
56};
57
27static int acpi_sleep_prepare(u32 acpi_state) 58static int acpi_sleep_prepare(u32 acpi_state)
28{ 59{
29#ifdef CONFIG_ACPI_SLEEP 60#ifdef CONFIG_ACPI_SLEEP
@@ -45,9 +76,8 @@ static int acpi_sleep_prepare(u32 acpi_state)
45 return 0; 76 return 0;
46} 77}
47 78
48#ifdef CONFIG_PM_SLEEP 79#ifdef CONFIG_ACPI_SLEEP
49static u32 acpi_target_sleep_state = ACPI_STATE_S0; 80static u32 acpi_target_sleep_state = ACPI_STATE_S0;
50
51/* 81/*
52 * ACPI 1.0 wants us to execute _PTS before suspending devices, so we allow the 82 * ACPI 1.0 wants us to execute _PTS before suspending devices, so we allow the
53 * user to request that behavior by using the 'acpi_old_suspend_ordering' 83 * user to request that behavior by using the 'acpi_old_suspend_ordering'
@@ -131,8 +161,9 @@ static void acpi_pm_end(void)
131 * failing transition to a sleep state. 161 * failing transition to a sleep state.
132 */ 162 */
133 acpi_target_sleep_state = ACPI_STATE_S0; 163 acpi_target_sleep_state = ACPI_STATE_S0;
164 acpi_sleep_tts_switch(acpi_target_sleep_state);
134} 165}
135#endif /* CONFIG_PM_SLEEP */ 166#endif /* CONFIG_ACPI_SLEEP */
136 167
137#ifdef CONFIG_SUSPEND 168#ifdef CONFIG_SUSPEND
138extern void do_suspend_lowlevel(void); 169extern void do_suspend_lowlevel(void);
@@ -155,6 +186,7 @@ static int acpi_suspend_begin(suspend_state_t pm_state)
155 186
156 if (sleep_states[acpi_state]) { 187 if (sleep_states[acpi_state]) {
157 acpi_target_sleep_state = acpi_state; 188 acpi_target_sleep_state = acpi_state;
189 acpi_sleep_tts_switch(acpi_target_sleep_state);
158 } else { 190 } else {
159 printk(KERN_ERR "ACPI does not support this state: %d\n", 191 printk(KERN_ERR "ACPI does not support this state: %d\n",
160 pm_state); 192 pm_state);
@@ -200,6 +232,8 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
200 break; 232 break;
201 } 233 }
202 234
235 /* If ACPI is not enabled by the BIOS, we need to enable it here. */
236 acpi_enable();
203 /* Reprogram control registers and execute _BFS */ 237 /* Reprogram control registers and execute _BFS */
204 acpi_leave_sleep_state_prep(acpi_state); 238 acpi_leave_sleep_state_prep(acpi_state);
205 239
@@ -280,12 +314,48 @@ static struct platform_suspend_ops acpi_suspend_ops_old = {
280 .end = acpi_pm_end, 314 .end = acpi_pm_end,
281 .recover = acpi_pm_finish, 315 .recover = acpi_pm_finish,
282}; 316};
317
318static int __init init_old_suspend_ordering(const struct dmi_system_id *d)
319{
320 old_suspend_ordering = true;
321 return 0;
322}
323
324static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
325 {
326 .callback = init_old_suspend_ordering,
327 .ident = "Abit KN9 (nForce4 variant)",
328 .matches = {
329 DMI_MATCH(DMI_BOARD_VENDOR, "http://www.abit.com.tw/"),
330 DMI_MATCH(DMI_BOARD_NAME, "KN9 Series(NF-CK804)"),
331 },
332 },
333 {
334 .callback = init_old_suspend_ordering,
335 .ident = "HP xw4600 Workstation",
336 .matches = {
337 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
338 DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"),
339 },
340 },
341 {},
342};
283#endif /* CONFIG_SUSPEND */ 343#endif /* CONFIG_SUSPEND */
284 344
285#ifdef CONFIG_HIBERNATION 345#ifdef CONFIG_HIBERNATION
346static unsigned long s4_hardware_signature;
347static struct acpi_table_facs *facs;
348static bool nosigcheck;
349
350void __init acpi_no_s4_hw_signature(void)
351{
352 nosigcheck = true;
353}
354
286static int acpi_hibernation_begin(void) 355static int acpi_hibernation_begin(void)
287{ 356{
288 acpi_target_sleep_state = ACPI_STATE_S4; 357 acpi_target_sleep_state = ACPI_STATE_S4;
358 acpi_sleep_tts_switch(acpi_target_sleep_state);
289 return 0; 359 return 0;
290} 360}
291 361
@@ -316,6 +386,12 @@ static void acpi_hibernation_leave(void)
316 acpi_enable(); 386 acpi_enable();
317 /* Reprogram control registers and execute _BFS */ 387 /* Reprogram control registers and execute _BFS */
318 acpi_leave_sleep_state_prep(ACPI_STATE_S4); 388 acpi_leave_sleep_state_prep(ACPI_STATE_S4);
389 /* Check the hardware signature */
390 if (facs && s4_hardware_signature != facs->hardware_signature) {
391 printk(KERN_EMERG "ACPI: Hardware changed while hibernated, "
392 "cannot resume!\n");
393 panic("ACPI S4 hardware signature mismatch");
394 }
319} 395}
320 396
321static void acpi_pm_enable_gpes(void) 397static void acpi_pm_enable_gpes(void)
@@ -343,7 +419,15 @@ static struct platform_hibernation_ops acpi_hibernation_ops = {
343 */ 419 */
344static int acpi_hibernation_begin_old(void) 420static int acpi_hibernation_begin_old(void)
345{ 421{
346 int error = acpi_sleep_prepare(ACPI_STATE_S4); 422 int error;
423 /*
424 * The _TTS object should always be evaluated before the _PTS object.
425 * When the old_suspended_ordering is true, the _PTS object is
426 * evaluated in the acpi_sleep_prepare.
427 */
428 acpi_sleep_tts_switch(ACPI_STATE_S4);
429
430 error = acpi_sleep_prepare(ACPI_STATE_S4);
347 431
348 if (!error) 432 if (!error)
349 acpi_target_sleep_state = ACPI_STATE_S4; 433 acpi_target_sleep_state = ACPI_STATE_S4;
@@ -411,7 +495,7 @@ int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p)
411 acpi_handle handle = DEVICE_ACPI_HANDLE(dev); 495 acpi_handle handle = DEVICE_ACPI_HANDLE(dev);
412 struct acpi_device *adev; 496 struct acpi_device *adev;
413 char acpi_method[] = "_SxD"; 497 char acpi_method[] = "_SxD";
414 unsigned long d_min, d_max; 498 unsigned long long d_min, d_max;
415 499
416 if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &adev))) { 500 if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &adev))) {
417 printk(KERN_DEBUG "ACPI handle has no context!\n"); 501 printk(KERN_DEBUG "ACPI handle has no context!\n");
@@ -516,6 +600,8 @@ int __init acpi_sleep_init(void)
516 u8 type_a, type_b; 600 u8 type_a, type_b;
517#ifdef CONFIG_SUSPEND 601#ifdef CONFIG_SUSPEND
518 int i = 0; 602 int i = 0;
603
604 dmi_check_system(acpisleep_dmi_table);
519#endif 605#endif
520 606
521 if (acpi_disabled) 607 if (acpi_disabled)
@@ -544,6 +630,13 @@ int __init acpi_sleep_init(void)
544 &acpi_hibernation_ops_old : &acpi_hibernation_ops); 630 &acpi_hibernation_ops_old : &acpi_hibernation_ops);
545 sleep_states[ACPI_STATE_S4] = 1; 631 sleep_states[ACPI_STATE_S4] = 1;
546 printk(" S4"); 632 printk(" S4");
633 if (!nosigcheck) {
634 acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS,
635 (struct acpi_table_header **)&facs);
636 if (facs)
637 s4_hardware_signature =
638 facs->hardware_signature;
639 }
547 } 640 }
548#endif 641#endif
549 status = acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b); 642 status = acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b);
@@ -554,5 +647,10 @@ int __init acpi_sleep_init(void)
554 pm_power_off = acpi_power_off; 647 pm_power_off = acpi_power_off;
555 } 648 }
556 printk(")\n"); 649 printk(")\n");
650 /*
651 * Register the tts_notifier to reboot notifier list so that the _TTS
652 * object can also be evaluated when the system enters S5.
653 */
654 register_reboot_notifier(&tts_notifier);
557 return 0; 655 return 0;
558} 656}
diff --git a/drivers/acpi/sleep/proc.c b/drivers/acpi/sleep/proc.c
index 4ebbba2b6b19..631ee2ee2ca0 100644
--- a/drivers/acpi/sleep/proc.c
+++ b/drivers/acpi/sleep/proc.c
@@ -120,13 +120,13 @@ static int acpi_system_alarm_seq_show(struct seq_file *seq, void *offset)
120 spin_unlock_irqrestore(&rtc_lock, flags); 120 spin_unlock_irqrestore(&rtc_lock, flags);
121 121
122 if (!(rtc_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) { 122 if (!(rtc_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
123 BCD_TO_BIN(sec); 123 sec = bcd2bin(sec);
124 BCD_TO_BIN(min); 124 min = bcd2bin(min);
125 BCD_TO_BIN(hr); 125 hr = bcd2bin(hr);
126 BCD_TO_BIN(day); 126 day = bcd2bin(day);
127 BCD_TO_BIN(mo); 127 mo = bcd2bin(mo);
128 BCD_TO_BIN(yr); 128 yr = bcd2bin(yr);
129 BCD_TO_BIN(cent); 129 cent = bcd2bin(cent);
130 } 130 }
131 131
132 /* we're trusting the FADT (see above) */ 132 /* we're trusting the FADT (see above) */
@@ -204,7 +204,7 @@ static u32 cmos_bcd_read(int offset, int rtc_control)
204{ 204{
205 u32 val = CMOS_READ(offset); 205 u32 val = CMOS_READ(offset);
206 if (!(rtc_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) 206 if (!(rtc_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
207 BCD_TO_BIN(val); 207 val = bcd2bin(val);
208 return val; 208 return val;
209} 209}
210 210
@@ -212,7 +212,7 @@ static u32 cmos_bcd_read(int offset, int rtc_control)
212static void cmos_bcd_write(u32 val, int offset, int rtc_control) 212static void cmos_bcd_write(u32 val, int offset, int rtc_control)
213{ 213{
214 if (!(rtc_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) 214 if (!(rtc_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
215 BIN_TO_BCD(val); 215 val = bin2bcd(val);
216 CMOS_WRITE(val, offset); 216 CMOS_WRITE(val, offset);
217} 217}
218 218
@@ -377,6 +377,14 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
377 return 0; 377 return 0;
378} 378}
379 379
380static void physical_device_enable_wakeup(struct acpi_device *adev)
381{
382 struct device *dev = acpi_get_physical_device(adev->handle);
383
384 if (dev && device_can_wakeup(dev))
385 device_set_wakeup_enable(dev, adev->wakeup.state.enabled);
386}
387
380static ssize_t 388static ssize_t
381acpi_system_write_wakeup_device(struct file *file, 389acpi_system_write_wakeup_device(struct file *file,
382 const char __user * buffer, 390 const char __user * buffer,
@@ -411,6 +419,7 @@ acpi_system_write_wakeup_device(struct file *file,
411 } 419 }
412 } 420 }
413 if (found_dev) { 421 if (found_dev) {
422 physical_device_enable_wakeup(found_dev);
414 list_for_each_safe(node, next, &acpi_wakeup_device_list) { 423 list_for_each_safe(node, next, &acpi_wakeup_device_list) {
415 struct acpi_device *dev = container_of(node, 424 struct acpi_device *dev = container_of(node,
416 struct 425 struct
@@ -428,6 +437,7 @@ acpi_system_write_wakeup_device(struct file *file,
428 dev->pnp.bus_id, found_dev->pnp.bus_id); 437 dev->pnp.bus_id, found_dev->pnp.bus_id);
429 dev->wakeup.state.enabled = 438 dev->wakeup.state.enabled =
430 found_dev->wakeup.state.enabled; 439 found_dev->wakeup.state.enabled;
440 physical_device_enable_wakeup(dev);
431 } 441 }
432 } 442 }
433 } 443 }
diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c
index d8e3f153b295..1d74171b7940 100644
--- a/drivers/acpi/system.c
+++ b/drivers/acpi/system.c
@@ -26,6 +26,7 @@
26#include <linux/proc_fs.h> 26#include <linux/proc_fs.h>
27#include <linux/seq_file.h> 27#include <linux/seq_file.h>
28#include <linux/init.h> 28#include <linux/init.h>
29#include <linux/string.h>
29#include <asm/uaccess.h> 30#include <asm/uaccess.h>
30 31
31#include <acpi/acpi_drivers.h> 32#include <acpi/acpi_drivers.h>
@@ -114,7 +115,6 @@ static void acpi_table_attr_init(struct acpi_table_attr *table_attr,
114 table_attr->attr.read = acpi_table_show; 115 table_attr->attr.read = acpi_table_show;
115 table_attr->attr.attr.name = table_attr->name; 116 table_attr->attr.attr.name = table_attr->name;
116 table_attr->attr.attr.mode = 0444; 117 table_attr->attr.attr.mode = 0444;
117 table_attr->attr.attr.owner = THIS_MODULE;
118 118
119 return; 119 return;
120} 120}
@@ -386,8 +386,8 @@ static ssize_t counter_set(struct kobject *kobj,
386 goto end; 386 goto end;
387 387
388 if (!(all_counters[index].flags & ACPI_EVENT_VALID)) { 388 if (!(all_counters[index].flags & ACPI_EVENT_VALID)) {
389 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 389 printk(KERN_WARNING PREFIX
390 "Can not change Invalid GPE/Fixed Event status\n")); 390 "Can not change Invalid GPE/Fixed Event status\n");
391 return -EINVAL; 391 return -EINVAL;
392 } 392 }
393 393
diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
index c3419182c9a7..775c97a282bd 100644
--- a/drivers/acpi/tables.c
+++ b/drivers/acpi/tables.c
@@ -300,6 +300,8 @@ int __init acpi_table_init(void)
300 300
301static int __init acpi_parse_apic_instance(char *str) 301static int __init acpi_parse_apic_instance(char *str)
302{ 302{
303 if (!str)
304 return -EINVAL;
303 305
304 acpi_apic_instance = simple_strtoul(str, NULL, 0); 306 acpi_apic_instance = simple_strtoul(str, NULL, 0);
305 307
diff --git a/drivers/acpi/tables/tbfadt.c b/drivers/acpi/tables/tbfadt.c
index ccb5b64bbef3..2c7885e7ffba 100644
--- a/drivers/acpi/tables/tbfadt.c
+++ b/drivers/acpi/tables/tbfadt.c
@@ -50,7 +50,7 @@ ACPI_MODULE_NAME("tbfadt")
50/* Local prototypes */ 50/* Local prototypes */
51static void inline 51static void inline
52acpi_tb_init_generic_address(struct acpi_generic_address *generic_address, 52acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
53 u8 bit_width, u64 address); 53 u8 byte_width, u64 address);
54 54
55static void acpi_tb_convert_fadt(void); 55static void acpi_tb_convert_fadt(void);
56 56
@@ -111,7 +111,7 @@ static struct acpi_fadt_info fadt_info_table[] = {
111 * FUNCTION: acpi_tb_init_generic_address 111 * FUNCTION: acpi_tb_init_generic_address
112 * 112 *
113 * PARAMETERS: generic_address - GAS struct to be initialized 113 * PARAMETERS: generic_address - GAS struct to be initialized
114 * bit_width - Width of this register 114 * byte_width - Width of this register
115 * Address - Address of the register 115 * Address - Address of the register
116 * 116 *
117 * RETURN: None 117 * RETURN: None
@@ -342,12 +342,21 @@ static void acpi_tb_convert_fadt(void)
342 * useful to calculate them once, here. 342 * useful to calculate them once, here.
343 * 343 *
344 * The PM event blocks are split into two register blocks, first is the 344 * The PM event blocks are split into two register blocks, first is the
345 * PM Status Register block, followed immediately by the PM Enable Register 345 * PM Status Register block, followed immediately by the PM Enable
346 * block. Each is of length (xpm1x_event_block.bit_width/2) 346 * Register block. Each is of length (xpm1x_event_block.bit_width/2).
347 *
348 * On various systems the v2 fields (and particularly the bit widths)
349 * cannot be relied upon, though. Hence resort to using the v1 length
350 * here (and warn about the inconsistency).
347 */ 351 */
348 WARN_ON(ACPI_MOD_16(acpi_gbl_FADT.xpm1a_event_block.bit_width)); 352 if (acpi_gbl_FADT.xpm1a_event_block.bit_width
349 pm1_register_length = (u8) ACPI_DIV_16(acpi_gbl_FADT 353 != acpi_gbl_FADT.pm1_event_length * 8)
350 .xpm1a_event_block.bit_width); 354 printk(KERN_WARNING "FADT: "
355 "X_PM1a_EVT_BLK.bit_width (%u) does not match"
356 " PM1_EVT_LEN (%u)\n",
357 acpi_gbl_FADT.xpm1a_event_block.bit_width,
358 acpi_gbl_FADT.pm1_event_length);
359 pm1_register_length = (u8) ACPI_DIV_2(acpi_gbl_FADT.pm1_event_length);
351 360
352 /* The PM1A register block is required */ 361 /* The PM1A register block is required */
353 362
@@ -362,10 +371,13 @@ static void acpi_tb_convert_fadt(void)
362 /* The PM1B register block is optional, ignore if not present */ 371 /* The PM1B register block is optional, ignore if not present */
363 372
364 if (acpi_gbl_FADT.xpm1b_event_block.address) { 373 if (acpi_gbl_FADT.xpm1b_event_block.address) {
365 WARN_ON(ACPI_MOD_16(acpi_gbl_FADT.xpm1b_event_block.bit_width)); 374 if (acpi_gbl_FADT.xpm1b_event_block.bit_width
366 pm1_register_length = (u8) ACPI_DIV_16(acpi_gbl_FADT 375 != acpi_gbl_FADT.pm1_event_length * 8)
367 .xpm1b_event_block 376 printk(KERN_WARNING "FADT: "
368 .bit_width); 377 "X_PM1b_EVT_BLK.bit_width (%u) does not match"
378 " PM1_EVT_LEN (%u)\n",
379 acpi_gbl_FADT.xpm1b_event_block.bit_width,
380 acpi_gbl_FADT.pm1_event_length);
369 acpi_tb_init_generic_address(&acpi_gbl_xpm1b_enable, 381 acpi_tb_init_generic_address(&acpi_gbl_xpm1b_enable,
370 pm1_register_length, 382 pm1_register_length,
371 (acpi_gbl_FADT.xpm1b_event_block. 383 (acpi_gbl_FADT.xpm1b_event_block.
@@ -373,6 +385,7 @@ static void acpi_tb_convert_fadt(void)
373 /* Don't forget to copy space_id of the GAS */ 385 /* Don't forget to copy space_id of the GAS */
374 acpi_gbl_xpm1b_enable.space_id = 386 acpi_gbl_xpm1b_enable.space_id =
375 acpi_gbl_FADT.xpm1b_event_block.space_id; 387 acpi_gbl_FADT.xpm1b_event_block.space_id;
388
376 } 389 }
377} 390}
378 391
diff --git a/drivers/acpi/tables/tbinstal.c b/drivers/acpi/tables/tbinstal.c
index b22185f55a16..18747ce8dd2f 100644
--- a/drivers/acpi/tables/tbinstal.c
+++ b/drivers/acpi/tables/tbinstal.c
@@ -110,7 +110,6 @@ acpi_status
110acpi_tb_add_table(struct acpi_table_desc *table_desc, u32 *table_index) 110acpi_tb_add_table(struct acpi_table_desc *table_desc, u32 *table_index)
111{ 111{
112 u32 i; 112 u32 i;
113 u32 length;
114 acpi_status status = AE_OK; 113 acpi_status status = AE_OK;
115 114
116 ACPI_FUNCTION_TRACE(tb_add_table); 115 ACPI_FUNCTION_TRACE(tb_add_table);
@@ -145,25 +144,64 @@ acpi_tb_add_table(struct acpi_table_desc *table_desc, u32 *table_index)
145 } 144 }
146 } 145 }
147 146
148 length = ACPI_MIN(table_desc->length, 147 /*
149 acpi_gbl_root_table_list.tables[i].length); 148 * Check for a table match on the entire table length,
149 * not just the header.
150 */
151 if (table_desc->length !=
152 acpi_gbl_root_table_list.tables[i].length) {
153 continue;
154 }
155
150 if (ACPI_MEMCMP(table_desc->pointer, 156 if (ACPI_MEMCMP(table_desc->pointer,
151 acpi_gbl_root_table_list.tables[i].pointer, 157 acpi_gbl_root_table_list.tables[i].pointer,
152 length)) { 158 acpi_gbl_root_table_list.tables[i].length)) {
153 continue; 159 continue;
154 } 160 }
155 161
156 /* Table is already registered */ 162 /*
157 163 * Note: the current mechanism does not unregister a table if it is
164 * dynamically unloaded. The related namespace entries are deleted,
165 * but the table remains in the root table list.
166 *
167 * The assumption here is that the number of different tables that
168 * will be loaded is actually small, and there is minimal overhead
169 * in just keeping the table in case it is needed again.
170 *
171 * If this assumption changes in the future (perhaps on large
172 * machines with many table load/unload operations), tables will
173 * need to be unregistered when they are unloaded, and slots in the
174 * root table list should be reused when empty.
175 */
176
177 /*
178 * Table is already registered.
179 * We can delete the table that was passed as a parameter.
180 */
158 acpi_tb_delete_table(table_desc); 181 acpi_tb_delete_table(table_desc);
159 *table_index = i; 182 *table_index = i;
160 status = AE_ALREADY_EXISTS; 183
161 goto release; 184 if (acpi_gbl_root_table_list.tables[i].
185 flags & ACPI_TABLE_IS_LOADED) {
186
187 /* Table is still loaded, this is an error */
188
189 status = AE_ALREADY_EXISTS;
190 goto release;
191 } else {
192 /* Table was unloaded, allow it to be reloaded */
193
194 table_desc->pointer =
195 acpi_gbl_root_table_list.tables[i].pointer;
196 table_desc->address =
197 acpi_gbl_root_table_list.tables[i].address;
198 status = AE_OK;
199 goto print_header;
200 }
162 } 201 }
163 202
164 /* 203 /* Add the table to the global root table list */
165 * Add the table to the global table list 204
166 */
167 status = acpi_tb_store_table(table_desc->address, table_desc->pointer, 205 status = acpi_tb_store_table(table_desc->address, table_desc->pointer,
168 table_desc->length, table_desc->flags, 206 table_desc->length, table_desc->flags,
169 table_index); 207 table_index);
@@ -171,6 +209,7 @@ acpi_tb_add_table(struct acpi_table_desc *table_desc, u32 *table_index)
171 goto release; 209 goto release;
172 } 210 }
173 211
212 print_header:
174 acpi_tb_print_table_header(table_desc->address, table_desc->pointer); 213 acpi_tb_print_table_header(table_desc->address, table_desc->pointer);
175 214
176 release: 215 release:
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
index 84c795fb9b1e..ad6cae938f0b 100644
--- a/drivers/acpi/thermal.c
+++ b/drivers/acpi/thermal.c
@@ -246,18 +246,18 @@ static const struct file_operations acpi_thermal_polling_fops = {
246static int acpi_thermal_get_temperature(struct acpi_thermal *tz) 246static int acpi_thermal_get_temperature(struct acpi_thermal *tz)
247{ 247{
248 acpi_status status = AE_OK; 248 acpi_status status = AE_OK;
249 249 unsigned long long tmp;
250 250
251 if (!tz) 251 if (!tz)
252 return -EINVAL; 252 return -EINVAL;
253 253
254 tz->last_temperature = tz->temperature; 254 tz->last_temperature = tz->temperature;
255 255
256 status = 256 status = acpi_evaluate_integer(tz->device->handle, "_TMP", NULL, &tmp);
257 acpi_evaluate_integer(tz->device->handle, "_TMP", NULL, &tz->temperature);
258 if (ACPI_FAILURE(status)) 257 if (ACPI_FAILURE(status))
259 return -ENODEV; 258 return -ENODEV;
260 259
260 tz->temperature = tmp;
261 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Temperature is %lu dK\n", 261 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Temperature is %lu dK\n",
262 tz->temperature)); 262 tz->temperature));
263 263
@@ -267,17 +267,16 @@ static int acpi_thermal_get_temperature(struct acpi_thermal *tz)
267static int acpi_thermal_get_polling_frequency(struct acpi_thermal *tz) 267static int acpi_thermal_get_polling_frequency(struct acpi_thermal *tz)
268{ 268{
269 acpi_status status = AE_OK; 269 acpi_status status = AE_OK;
270 270 unsigned long long tmp;
271 271
272 if (!tz) 272 if (!tz)
273 return -EINVAL; 273 return -EINVAL;
274 274
275 status = 275 status = acpi_evaluate_integer(tz->device->handle, "_TZP", NULL, &tmp);
276 acpi_evaluate_integer(tz->device->handle, "_TZP", NULL,
277 &tz->polling_frequency);
278 if (ACPI_FAILURE(status)) 276 if (ACPI_FAILURE(status))
279 return -ENODEV; 277 return -ENODEV;
280 278
279 tz->polling_frequency = tmp;
281 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Polling frequency is %lu dS\n", 280 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Polling frequency is %lu dS\n",
282 tz->polling_frequency)); 281 tz->polling_frequency));
283 282
@@ -356,6 +355,7 @@ do { \
356static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag) 355static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
357{ 356{
358 acpi_status status = AE_OK; 357 acpi_status status = AE_OK;
358 unsigned long long tmp;
359 struct acpi_handle_list devices; 359 struct acpi_handle_list devices;
360 int valid = 0; 360 int valid = 0;
361 int i; 361 int i;
@@ -363,7 +363,8 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
363 /* Critical Shutdown (required) */ 363 /* Critical Shutdown (required) */
364 if (flag & ACPI_TRIPS_CRITICAL) { 364 if (flag & ACPI_TRIPS_CRITICAL) {
365 status = acpi_evaluate_integer(tz->device->handle, 365 status = acpi_evaluate_integer(tz->device->handle,
366 "_CRT", NULL, &tz->trips.critical.temperature); 366 "_CRT", NULL, &tmp);
367 tz->trips.critical.temperature = tmp;
367 /* 368 /*
368 * Treat freezing temperatures as invalid as well; some 369 * Treat freezing temperatures as invalid as well; some
369 * BIOSes return really low values and cause reboots at startup. 370 * BIOSes return really low values and cause reboots at startup.
@@ -388,10 +389,12 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
388 } else if (crt > 0) { 389 } else if (crt > 0) {
389 unsigned long crt_k = CELSIUS_TO_KELVIN(crt); 390 unsigned long crt_k = CELSIUS_TO_KELVIN(crt);
390 /* 391 /*
391 * Allow override to lower critical threshold 392 * Allow override critical threshold
392 */ 393 */
393 if (crt_k < tz->trips.critical.temperature) 394 if (crt_k > tz->trips.critical.temperature)
394 tz->trips.critical.temperature = crt_k; 395 printk(KERN_WARNING PREFIX
396 "Critical threshold %d C\n", crt);
397 tz->trips.critical.temperature = crt_k;
395 } 398 }
396 } 399 }
397 } 400 }
@@ -399,12 +402,13 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
399 /* Critical Sleep (optional) */ 402 /* Critical Sleep (optional) */
400 if (flag & ACPI_TRIPS_HOT) { 403 if (flag & ACPI_TRIPS_HOT) {
401 status = acpi_evaluate_integer(tz->device->handle, 404 status = acpi_evaluate_integer(tz->device->handle,
402 "_HOT", NULL, &tz->trips.hot.temperature); 405 "_HOT", NULL, &tmp);
403 if (ACPI_FAILURE(status)) { 406 if (ACPI_FAILURE(status)) {
404 tz->trips.hot.flags.valid = 0; 407 tz->trips.hot.flags.valid = 0;
405 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 408 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
406 "No hot threshold\n")); 409 "No hot threshold\n"));
407 } else { 410 } else {
411 tz->trips.hot.temperature = tmp;
408 tz->trips.hot.flags.valid = 1; 412 tz->trips.hot.flags.valid = 1;
409 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 413 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
410 "Found hot threshold [%lu]\n", 414 "Found hot threshold [%lu]\n",
@@ -418,33 +422,40 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
418 if (psv == -1) { 422 if (psv == -1) {
419 status = AE_SUPPORT; 423 status = AE_SUPPORT;
420 } else if (psv > 0) { 424 } else if (psv > 0) {
421 tz->trips.passive.temperature = CELSIUS_TO_KELVIN(psv); 425 tmp = CELSIUS_TO_KELVIN(psv);
422 status = AE_OK; 426 status = AE_OK;
423 } else { 427 } else {
424 status = acpi_evaluate_integer(tz->device->handle, 428 status = acpi_evaluate_integer(tz->device->handle,
425 "_PSV", NULL, &tz->trips.passive.temperature); 429 "_PSV", NULL, &tmp);
426 } 430 }
427 431
428 if (ACPI_FAILURE(status)) 432 if (ACPI_FAILURE(status))
429 tz->trips.passive.flags.valid = 0; 433 tz->trips.passive.flags.valid = 0;
430 else { 434 else {
435 tz->trips.passive.temperature = tmp;
431 tz->trips.passive.flags.valid = 1; 436 tz->trips.passive.flags.valid = 1;
432 if (flag == ACPI_TRIPS_INIT) { 437 if (flag == ACPI_TRIPS_INIT) {
433 status = acpi_evaluate_integer( 438 status = acpi_evaluate_integer(
434 tz->device->handle, "_TC1", 439 tz->device->handle, "_TC1",
435 NULL, &tz->trips.passive.tc1); 440 NULL, &tmp);
436 if (ACPI_FAILURE(status)) 441 if (ACPI_FAILURE(status))
437 tz->trips.passive.flags.valid = 0; 442 tz->trips.passive.flags.valid = 0;
443 else
444 tz->trips.passive.tc1 = tmp;
438 status = acpi_evaluate_integer( 445 status = acpi_evaluate_integer(
439 tz->device->handle, "_TC2", 446 tz->device->handle, "_TC2",
440 NULL, &tz->trips.passive.tc2); 447 NULL, &tmp);
441 if (ACPI_FAILURE(status)) 448 if (ACPI_FAILURE(status))
442 tz->trips.passive.flags.valid = 0; 449 tz->trips.passive.flags.valid = 0;
450 else
451 tz->trips.passive.tc2 = tmp;
443 status = acpi_evaluate_integer( 452 status = acpi_evaluate_integer(
444 tz->device->handle, "_TSP", 453 tz->device->handle, "_TSP",
445 NULL, &tz->trips.passive.tsp); 454 NULL, &tmp);
446 if (ACPI_FAILURE(status)) 455 if (ACPI_FAILURE(status))
447 tz->trips.passive.flags.valid = 0; 456 tz->trips.passive.flags.valid = 0;
457 else
458 tz->trips.passive.tsp = tmp;
448 } 459 }
449 } 460 }
450 } 461 }
@@ -479,7 +490,7 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
479 490
480 if (flag & ACPI_TRIPS_ACTIVE) { 491 if (flag & ACPI_TRIPS_ACTIVE) {
481 status = acpi_evaluate_integer(tz->device->handle, 492 status = acpi_evaluate_integer(tz->device->handle,
482 name, NULL, &tz->trips.active[i].temperature); 493 name, NULL, &tmp);
483 if (ACPI_FAILURE(status)) { 494 if (ACPI_FAILURE(status)) {
484 tz->trips.active[i].flags.valid = 0; 495 tz->trips.active[i].flags.valid = 0;
485 if (i == 0) 496 if (i == 0)
@@ -500,8 +511,10 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
500 tz->trips.active[i - 2].temperature : 511 tz->trips.active[i - 2].temperature :
501 CELSIUS_TO_KELVIN(act)); 512 CELSIUS_TO_KELVIN(act));
502 break; 513 break;
503 } else 514 } else {
515 tz->trips.active[i].temperature = tmp;
504 tz->trips.active[i].flags.valid = 1; 516 tz->trips.active[i].flags.valid = 1;
517 }
505 } 518 }
506 519
507 name[2] = 'L'; 520 name[2] = 'L';
@@ -769,6 +782,47 @@ static void acpi_thermal_run(unsigned long data)
769 acpi_os_execute(OSL_GPE_HANDLER, acpi_thermal_check, (void *)data); 782 acpi_os_execute(OSL_GPE_HANDLER, acpi_thermal_check, (void *)data);
770} 783}
771 784
785static void acpi_thermal_active_off(void *data)
786{
787 int result = 0;
788 struct acpi_thermal *tz = data;
789 int i = 0;
790 int j = 0;
791 struct acpi_thermal_active *active = NULL;
792
793 if (!tz) {
794 printk(KERN_ERR PREFIX "Invalid (NULL) context\n");
795 return;
796 }
797
798 result = acpi_thermal_get_temperature(tz);
799 if (result)
800 return;
801
802 for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
803 active = &(tz->trips.active[i]);
804 if (!active || !active->flags.valid)
805 break;
806 if (tz->temperature >= active->temperature) {
807 /*
808 * If the thermal temperature is greater than the
809 * active threshod, unnecessary to turn off the
810 * the active cooling device.
811 */
812 continue;
813 }
814 /*
815 * Below Threshold?
816 * ----------------
817 * Turn OFF all cooling devices associated with this
818 * threshold.
819 */
820 for (j = 0; j < active->devices.count; j++)
821 result = acpi_bus_set_power(active->devices.handles[j],
822 ACPI_STATE_D3);
823 }
824}
825
772static void acpi_thermal_check(void *data) 826static void acpi_thermal_check(void *data)
773{ 827{
774 int result = 0; 828 int result = 0;
@@ -1172,15 +1226,15 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
1172 acpi_bus_private_data_handler, 1226 acpi_bus_private_data_handler,
1173 tz->thermal_zone); 1227 tz->thermal_zone);
1174 if (ACPI_FAILURE(status)) { 1228 if (ACPI_FAILURE(status)) {
1175 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 1229 printk(KERN_ERR PREFIX
1176 "Error attaching device data\n")); 1230 "Error attaching device data\n");
1177 return -ENODEV; 1231 return -ENODEV;
1178 } 1232 }
1179 1233
1180 tz->tz_enabled = 1; 1234 tz->tz_enabled = 1;
1181 1235
1182 printk(KERN_INFO PREFIX "%s is registered as thermal_zone%d\n", 1236 dev_info(&tz->device->dev, "registered as thermal_zone%d\n",
1183 tz->device->dev.bus_id, tz->thermal_zone->id); 1237 tz->thermal_zone->id);
1184 return 0; 1238 return 0;
1185} 1239}
1186 1240
@@ -1606,7 +1660,7 @@ static int acpi_thermal_add(struct acpi_device *device)
1606 strcpy(tz->name, device->pnp.bus_id); 1660 strcpy(tz->name, device->pnp.bus_id);
1607 strcpy(acpi_device_name(device), ACPI_THERMAL_DEVICE_NAME); 1661 strcpy(acpi_device_name(device), ACPI_THERMAL_DEVICE_NAME);
1608 strcpy(acpi_device_class(device), ACPI_THERMAL_CLASS); 1662 strcpy(acpi_device_class(device), ACPI_THERMAL_CLASS);
1609 acpi_driver_data(device) = tz; 1663 device->driver_data = tz;
1610 mutex_init(&tz->lock); 1664 mutex_init(&tz->lock);
1611 1665
1612 1666
@@ -1624,6 +1678,8 @@ static int acpi_thermal_add(struct acpi_device *device)
1624 1678
1625 init_timer(&tz->timer); 1679 init_timer(&tz->timer);
1626 1680
1681 acpi_thermal_active_off(tz);
1682
1627 acpi_thermal_check(tz); 1683 acpi_thermal_check(tz);
1628 1684
1629 status = acpi_install_notify_handler(device->handle, 1685 status = acpi_install_notify_handler(device->handle,
diff --git a/drivers/acpi/toshiba_acpi.c b/drivers/acpi/toshiba_acpi.c
index 0a43c8e0eff3..2a632f8b7a05 100644
--- a/drivers/acpi/toshiba_acpi.c
+++ b/drivers/acpi/toshiba_acpi.c
@@ -3,6 +3,7 @@
3 * 3 *
4 * 4 *
5 * Copyright (C) 2002-2004 John Belmonte 5 * Copyright (C) 2002-2004 John Belmonte
6 * Copyright (C) 2008 Philip Langdale
6 * 7 *
7 * This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
@@ -33,7 +34,7 @@
33 * 34 *
34 */ 35 */
35 36
36#define TOSHIBA_ACPI_VERSION "0.18" 37#define TOSHIBA_ACPI_VERSION "0.19"
37#define PROC_INTERFACE_VERSION 1 38#define PROC_INTERFACE_VERSION 1
38 39
39#include <linux/kernel.h> 40#include <linux/kernel.h>
@@ -42,6 +43,9 @@
42#include <linux/types.h> 43#include <linux/types.h>
43#include <linux/proc_fs.h> 44#include <linux/proc_fs.h>
44#include <linux/backlight.h> 45#include <linux/backlight.h>
46#include <linux/platform_device.h>
47#include <linux/rfkill.h>
48#include <linux/input-polldev.h>
45 49
46#include <asm/uaccess.h> 50#include <asm/uaccess.h>
47 51
@@ -90,6 +94,7 @@ MODULE_LICENSE("GPL");
90#define HCI_VIDEO_OUT 0x001c 94#define HCI_VIDEO_OUT 0x001c
91#define HCI_HOTKEY_EVENT 0x001e 95#define HCI_HOTKEY_EVENT 0x001e
92#define HCI_LCD_BRIGHTNESS 0x002a 96#define HCI_LCD_BRIGHTNESS 0x002a
97#define HCI_WIRELESS 0x0056
93 98
94/* field definitions */ 99/* field definitions */
95#define HCI_LCD_BRIGHTNESS_BITS 3 100#define HCI_LCD_BRIGHTNESS_BITS 3
@@ -98,9 +103,14 @@ MODULE_LICENSE("GPL");
98#define HCI_VIDEO_OUT_LCD 0x1 103#define HCI_VIDEO_OUT_LCD 0x1
99#define HCI_VIDEO_OUT_CRT 0x2 104#define HCI_VIDEO_OUT_CRT 0x2
100#define HCI_VIDEO_OUT_TV 0x4 105#define HCI_VIDEO_OUT_TV 0x4
106#define HCI_WIRELESS_KILL_SWITCH 0x01
107#define HCI_WIRELESS_BT_PRESENT 0x0f
108#define HCI_WIRELESS_BT_ATTACH 0x40
109#define HCI_WIRELESS_BT_POWER 0x80
101 110
102static const struct acpi_device_id toshiba_device_ids[] = { 111static const struct acpi_device_id toshiba_device_ids[] = {
103 {"TOS6200", 0}, 112 {"TOS6200", 0},
113 {"TOS6208", 0},
104 {"TOS1900", 0}, 114 {"TOS1900", 0},
105 {"", 0}, 115 {"", 0},
106}; 116};
@@ -193,7 +203,7 @@ static acpi_status hci_raw(const u32 in[HCI_WORDS], u32 out[HCI_WORDS])
193 return status; 203 return status;
194} 204}
195 205
196/* common hci tasks (get or set one value) 206/* common hci tasks (get or set one or two value)
197 * 207 *
198 * In addition to the ACPI status, the HCI system returns a result which 208 * In addition to the ACPI status, the HCI system returns a result which
199 * may be useful (such as "not supported"). 209 * may be useful (such as "not supported").
@@ -218,6 +228,152 @@ static acpi_status hci_read1(u32 reg, u32 * out1, u32 * result)
218 return status; 228 return status;
219} 229}
220 230
231static acpi_status hci_write2(u32 reg, u32 in1, u32 in2, u32 *result)
232{
233 u32 in[HCI_WORDS] = { HCI_SET, reg, in1, in2, 0, 0 };
234 u32 out[HCI_WORDS];
235 acpi_status status = hci_raw(in, out);
236 *result = (status == AE_OK) ? out[0] : HCI_FAILURE;
237 return status;
238}
239
240static acpi_status hci_read2(u32 reg, u32 *out1, u32 *out2, u32 *result)
241{
242 u32 in[HCI_WORDS] = { HCI_GET, reg, *out1, *out2, 0, 0 };
243 u32 out[HCI_WORDS];
244 acpi_status status = hci_raw(in, out);
245 *out1 = out[2];
246 *out2 = out[3];
247 *result = (status == AE_OK) ? out[0] : HCI_FAILURE;
248 return status;
249}
250
251struct toshiba_acpi_dev {
252 struct platform_device *p_dev;
253 struct rfkill *rfk_dev;
254 struct input_polled_dev *poll_dev;
255
256 const char *bt_name;
257 const char *rfk_name;
258
259 bool last_rfk_state;
260
261 struct mutex mutex;
262};
263
264static struct toshiba_acpi_dev toshiba_acpi = {
265 .bt_name = "Toshiba Bluetooth",
266 .rfk_name = "Toshiba RFKill Switch",
267 .last_rfk_state = false,
268};
269
270/* Bluetooth rfkill handlers */
271
272static u32 hci_get_bt_present(bool *present)
273{
274 u32 hci_result;
275 u32 value, value2;
276
277 value = 0;
278 value2 = 0;
279 hci_read2(HCI_WIRELESS, &value, &value2, &hci_result);
280 if (hci_result == HCI_SUCCESS)
281 *present = (value & HCI_WIRELESS_BT_PRESENT) ? true : false;
282
283 return hci_result;
284}
285
286static u32 hci_get_bt_on(bool *on)
287{
288 u32 hci_result;
289 u32 value, value2;
290
291 value = 0;
292 value2 = 0x0001;
293 hci_read2(HCI_WIRELESS, &value, &value2, &hci_result);
294 if (hci_result == HCI_SUCCESS)
295 *on = (value & HCI_WIRELESS_BT_POWER) &&
296 (value & HCI_WIRELESS_BT_ATTACH);
297
298 return hci_result;
299}
300
301static u32 hci_get_radio_state(bool *radio_state)
302{
303 u32 hci_result;
304 u32 value, value2;
305
306 value = 0;
307 value2 = 0x0001;
308 hci_read2(HCI_WIRELESS, &value, &value2, &hci_result);
309
310 *radio_state = value & HCI_WIRELESS_KILL_SWITCH;
311 return hci_result;
312}
313
314static int bt_rfkill_toggle_radio(void *data, enum rfkill_state state)
315{
316 u32 result1, result2;
317 u32 value;
318 bool radio_state;
319 struct toshiba_acpi_dev *dev = data;
320
321 value = (state == RFKILL_STATE_UNBLOCKED);
322
323 if (hci_get_radio_state(&radio_state) != HCI_SUCCESS)
324 return -EFAULT;
325
326 switch (state) {
327 case RFKILL_STATE_UNBLOCKED:
328 if (!radio_state)
329 return -EPERM;
330 break;
331 case RFKILL_STATE_SOFT_BLOCKED:
332 break;
333 default:
334 return -EINVAL;
335 }
336
337 mutex_lock(&dev->mutex);
338 hci_write2(HCI_WIRELESS, value, HCI_WIRELESS_BT_POWER, &result1);
339 hci_write2(HCI_WIRELESS, value, HCI_WIRELESS_BT_ATTACH, &result2);
340 mutex_unlock(&dev->mutex);
341
342 if (result1 != HCI_SUCCESS || result2 != HCI_SUCCESS)
343 return -EFAULT;
344
345 return 0;
346}
347
348static void bt_poll_rfkill(struct input_polled_dev *poll_dev)
349{
350 bool state_changed;
351 bool new_rfk_state;
352 bool value;
353 u32 hci_result;
354 struct toshiba_acpi_dev *dev = poll_dev->private;
355
356 hci_result = hci_get_radio_state(&value);
357 if (hci_result != HCI_SUCCESS)
358 return; /* Can't do anything useful */
359
360 new_rfk_state = value;
361
362 mutex_lock(&dev->mutex);
363 state_changed = new_rfk_state != dev->last_rfk_state;
364 dev->last_rfk_state = new_rfk_state;
365 mutex_unlock(&dev->mutex);
366
367 if (unlikely(state_changed)) {
368 rfkill_force_state(dev->rfk_dev,
369 new_rfk_state ?
370 RFKILL_STATE_SOFT_BLOCKED :
371 RFKILL_STATE_HARD_BLOCKED);
372 input_report_switch(poll_dev->input, SW_RFKILL_ALL,
373 new_rfk_state);
374 }
375}
376
221static struct proc_dir_entry *toshiba_proc_dir /*= 0*/ ; 377static struct proc_dir_entry *toshiba_proc_dir /*= 0*/ ;
222static struct backlight_device *toshiba_backlight_device; 378static struct backlight_device *toshiba_backlight_device;
223static int force_fan; 379static int force_fan;
@@ -392,7 +548,7 @@ static unsigned long write_video(const char *buffer, unsigned long count)
392 548
393 hci_read1(HCI_VIDEO_OUT, &video_out, &hci_result); 549 hci_read1(HCI_VIDEO_OUT, &video_out, &hci_result);
394 if (hci_result == HCI_SUCCESS) { 550 if (hci_result == HCI_SUCCESS) {
395 int new_video_out = video_out; 551 unsigned int new_video_out = video_out;
396 if (lcd_out != -1) 552 if (lcd_out != -1)
397 _set_bit(&new_video_out, HCI_VIDEO_OUT_LCD, lcd_out); 553 _set_bit(&new_video_out, HCI_VIDEO_OUT_LCD, lcd_out);
398 if (crt_out != -1) 554 if (crt_out != -1)
@@ -547,6 +703,14 @@ static struct backlight_ops toshiba_backlight_data = {
547 703
548static void toshiba_acpi_exit(void) 704static void toshiba_acpi_exit(void)
549{ 705{
706 if (toshiba_acpi.poll_dev) {
707 input_unregister_polled_device(toshiba_acpi.poll_dev);
708 input_free_polled_device(toshiba_acpi.poll_dev);
709 }
710
711 if (toshiba_acpi.rfk_dev)
712 rfkill_unregister(toshiba_acpi.rfk_dev);
713
550 if (toshiba_backlight_device) 714 if (toshiba_backlight_device)
551 backlight_device_unregister(toshiba_backlight_device); 715 backlight_device_unregister(toshiba_backlight_device);
552 716
@@ -555,6 +719,8 @@ static void toshiba_acpi_exit(void)
555 if (toshiba_proc_dir) 719 if (toshiba_proc_dir)
556 remove_proc_entry(PROC_TOSHIBA, acpi_root_dir); 720 remove_proc_entry(PROC_TOSHIBA, acpi_root_dir);
557 721
722 platform_device_unregister(toshiba_acpi.p_dev);
723
558 return; 724 return;
559} 725}
560 726
@@ -562,6 +728,10 @@ static int __init toshiba_acpi_init(void)
562{ 728{
563 acpi_status status = AE_OK; 729 acpi_status status = AE_OK;
564 u32 hci_result; 730 u32 hci_result;
731 bool bt_present;
732 bool bt_on;
733 bool radio_on;
734 int ret = 0;
565 735
566 if (acpi_disabled) 736 if (acpi_disabled)
567 return -ENODEV; 737 return -ENODEV;
@@ -578,6 +748,18 @@ static int __init toshiba_acpi_init(void)
578 TOSHIBA_ACPI_VERSION); 748 TOSHIBA_ACPI_VERSION);
579 printk(MY_INFO " HCI method: %s\n", method_hci); 749 printk(MY_INFO " HCI method: %s\n", method_hci);
580 750
751 mutex_init(&toshiba_acpi.mutex);
752
753 toshiba_acpi.p_dev = platform_device_register_simple("toshiba_acpi",
754 -1, NULL, 0);
755 if (IS_ERR(toshiba_acpi.p_dev)) {
756 ret = PTR_ERR(toshiba_acpi.p_dev);
757 printk(MY_ERR "unable to register platform device\n");
758 toshiba_acpi.p_dev = NULL;
759 toshiba_acpi_exit();
760 return ret;
761 }
762
581 force_fan = 0; 763 force_fan = 0;
582 key_event_valid = 0; 764 key_event_valid = 0;
583 765
@@ -586,19 +768,23 @@ static int __init toshiba_acpi_init(void)
586 768
587 toshiba_proc_dir = proc_mkdir(PROC_TOSHIBA, acpi_root_dir); 769 toshiba_proc_dir = proc_mkdir(PROC_TOSHIBA, acpi_root_dir);
588 if (!toshiba_proc_dir) { 770 if (!toshiba_proc_dir) {
589 status = AE_ERROR; 771 toshiba_acpi_exit();
772 return -ENODEV;
590 } else { 773 } else {
591 toshiba_proc_dir->owner = THIS_MODULE; 774 toshiba_proc_dir->owner = THIS_MODULE;
592 status = add_device(); 775 status = add_device();
593 if (ACPI_FAILURE(status)) 776 if (ACPI_FAILURE(status)) {
594 remove_proc_entry(PROC_TOSHIBA, acpi_root_dir); 777 toshiba_acpi_exit();
778 return -ENODEV;
779 }
595 } 780 }
596 781
597 toshiba_backlight_device = backlight_device_register("toshiba",NULL, 782 toshiba_backlight_device = backlight_device_register("toshiba",
783 &toshiba_acpi.p_dev->dev,
598 NULL, 784 NULL,
599 &toshiba_backlight_data); 785 &toshiba_backlight_data);
600 if (IS_ERR(toshiba_backlight_device)) { 786 if (IS_ERR(toshiba_backlight_device)) {
601 int ret = PTR_ERR(toshiba_backlight_device); 787 ret = PTR_ERR(toshiba_backlight_device);
602 788
603 printk(KERN_ERR "Could not register toshiba backlight device\n"); 789 printk(KERN_ERR "Could not register toshiba backlight device\n");
604 toshiba_backlight_device = NULL; 790 toshiba_backlight_device = NULL;
@@ -607,7 +793,66 @@ static int __init toshiba_acpi_init(void)
607 } 793 }
608 toshiba_backlight_device->props.max_brightness = HCI_LCD_BRIGHTNESS_LEVELS - 1; 794 toshiba_backlight_device->props.max_brightness = HCI_LCD_BRIGHTNESS_LEVELS - 1;
609 795
610 return (ACPI_SUCCESS(status)) ? 0 : -ENODEV; 796 /* Register rfkill switch for Bluetooth */
797 if (hci_get_bt_present(&bt_present) == HCI_SUCCESS && bt_present) {
798 toshiba_acpi.rfk_dev = rfkill_allocate(&toshiba_acpi.p_dev->dev,
799 RFKILL_TYPE_BLUETOOTH);
800 if (!toshiba_acpi.rfk_dev) {
801 printk(MY_ERR "unable to allocate rfkill device\n");
802 toshiba_acpi_exit();
803 return -ENOMEM;
804 }
805
806 toshiba_acpi.rfk_dev->name = toshiba_acpi.bt_name;
807 toshiba_acpi.rfk_dev->toggle_radio = bt_rfkill_toggle_radio;
808 toshiba_acpi.rfk_dev->user_claim_unsupported = 1;
809 toshiba_acpi.rfk_dev->data = &toshiba_acpi;
810
811 if (hci_get_bt_on(&bt_on) == HCI_SUCCESS && bt_on) {
812 toshiba_acpi.rfk_dev->state = RFKILL_STATE_UNBLOCKED;
813 } else if (hci_get_radio_state(&radio_on) == HCI_SUCCESS &&
814 radio_on) {
815 toshiba_acpi.rfk_dev->state = RFKILL_STATE_SOFT_BLOCKED;
816 } else {
817 toshiba_acpi.rfk_dev->state = RFKILL_STATE_HARD_BLOCKED;
818 }
819
820 ret = rfkill_register(toshiba_acpi.rfk_dev);
821 if (ret) {
822 printk(MY_ERR "unable to register rfkill device\n");
823 toshiba_acpi_exit();
824 return -ENOMEM;
825 }
826 }
827
828 /* Register input device for kill switch */
829 toshiba_acpi.poll_dev = input_allocate_polled_device();
830 if (!toshiba_acpi.poll_dev) {
831 printk(MY_ERR "unable to allocate kill-switch input device\n");
832 toshiba_acpi_exit();
833 return -ENOMEM;
834 }
835 toshiba_acpi.poll_dev->private = &toshiba_acpi;
836 toshiba_acpi.poll_dev->poll = bt_poll_rfkill;
837 toshiba_acpi.poll_dev->poll_interval = 1000; /* msecs */
838
839 toshiba_acpi.poll_dev->input->name = toshiba_acpi.rfk_name;
840 toshiba_acpi.poll_dev->input->id.bustype = BUS_HOST;
841 toshiba_acpi.poll_dev->input->id.vendor = 0x0930; /* Toshiba USB ID */
842 set_bit(EV_SW, toshiba_acpi.poll_dev->input->evbit);
843 set_bit(SW_RFKILL_ALL, toshiba_acpi.poll_dev->input->swbit);
844 input_report_switch(toshiba_acpi.poll_dev->input, SW_RFKILL_ALL, TRUE);
845
846 ret = input_register_polled_device(toshiba_acpi.poll_dev);
847 if (ret) {
848 printk(MY_ERR "unable to register kill-switch input device\n");
849 rfkill_free(toshiba_acpi.rfk_dev);
850 toshiba_acpi.rfk_dev = NULL;
851 toshiba_acpi_exit();
852 return ret;
853 }
854
855 return 0;
611} 856}
612 857
613module_init(toshiba_acpi_init); 858module_init(toshiba_acpi_init);
diff --git a/drivers/acpi/utilities/utalloc.c b/drivers/acpi/utilities/utalloc.c
index 3dfb8a442b26..241c535c1753 100644
--- a/drivers/acpi/utilities/utalloc.c
+++ b/drivers/acpi/utilities/utalloc.c
@@ -232,7 +232,7 @@ acpi_status acpi_ut_validate_buffer(struct acpi_buffer * buffer)
232 * RETURN: Status 232 * RETURN: Status
233 * 233 *
234 * DESCRIPTION: Validate that the buffer is of the required length or 234 * DESCRIPTION: Validate that the buffer is of the required length or
235 * allocate a new buffer. Returned buffer is always zeroed. 235 * allocate a new buffer. Returned buffer is always zeroed.
236 * 236 *
237 ******************************************************************************/ 237 ******************************************************************************/
238 238
@@ -240,57 +240,66 @@ acpi_status
240acpi_ut_initialize_buffer(struct acpi_buffer * buffer, 240acpi_ut_initialize_buffer(struct acpi_buffer * buffer,
241 acpi_size required_length) 241 acpi_size required_length)
242{ 242{
243 acpi_status status = AE_OK; 243 acpi_size input_buffer_length;
244 244
245 switch (buffer->length) { 245 /* Parameter validation */
246
247 if (!buffer || !required_length) {
248 return (AE_BAD_PARAMETER);
249 }
250
251 /*
252 * Buffer->Length is used as both an input and output parameter. Get the
253 * input actual length and set the output required buffer length.
254 */
255 input_buffer_length = buffer->length;
256 buffer->length = required_length;
257
258 /*
259 * The input buffer length contains the actual buffer length, or the type
260 * of buffer to be allocated by this routine.
261 */
262 switch (input_buffer_length) {
246 case ACPI_NO_BUFFER: 263 case ACPI_NO_BUFFER:
247 264
248 /* Set the exception and returned the required length */ 265 /* Return the exception (and the required buffer length) */
249 266
250 status = AE_BUFFER_OVERFLOW; 267 return (AE_BUFFER_OVERFLOW);
251 break;
252 268
253 case ACPI_ALLOCATE_BUFFER: 269 case ACPI_ALLOCATE_BUFFER:
254 270
255 /* Allocate a new buffer */ 271 /* Allocate a new buffer */
256 272
257 buffer->pointer = acpi_os_allocate(required_length); 273 buffer->pointer = acpi_os_allocate(required_length);
258 if (!buffer->pointer) {
259 return (AE_NO_MEMORY);
260 }
261
262 /* Clear the buffer */
263
264 ACPI_MEMSET(buffer->pointer, 0, required_length);
265 break; 274 break;
266 275
267 case ACPI_ALLOCATE_LOCAL_BUFFER: 276 case ACPI_ALLOCATE_LOCAL_BUFFER:
268 277
269 /* Allocate a new buffer with local interface to allow tracking */ 278 /* Allocate a new buffer with local interface to allow tracking */
270 279
271 buffer->pointer = ACPI_ALLOCATE_ZEROED(required_length); 280 buffer->pointer = ACPI_ALLOCATE(required_length);
272 if (!buffer->pointer) {
273 return (AE_NO_MEMORY);
274 }
275 break; 281 break;
276 282
277 default: 283 default:
278 284
279 /* Existing buffer: Validate the size of the buffer */ 285 /* Existing buffer: Validate the size of the buffer */
280 286
281 if (buffer->length < required_length) { 287 if (input_buffer_length < required_length) {
282 status = AE_BUFFER_OVERFLOW; 288 return (AE_BUFFER_OVERFLOW);
283 break;
284 } 289 }
290 break;
291 }
285 292
286 /* Clear the buffer */ 293 /* Validate allocation from above or input buffer pointer */
287 294
288 ACPI_MEMSET(buffer->pointer, 0, required_length); 295 if (!buffer->pointer) {
289 break; 296 return (AE_NO_MEMORY);
290 } 297 }
291 298
292 buffer->length = required_length; 299 /* Have a valid buffer, clear it */
293 return (status); 300
301 ACPI_MEMSET(buffer->pointer, 0, required_length);
302 return (AE_OK);
294} 303}
295 304
296#ifdef NOT_USED_BY_LINUX 305#ifdef NOT_USED_BY_LINUX
diff --git a/drivers/acpi/utilities/utcopy.c b/drivers/acpi/utilities/utcopy.c
index 53499ac90988..5b2f7c27b705 100644
--- a/drivers/acpi/utilities/utcopy.c
+++ b/drivers/acpi/utilities/utcopy.c
@@ -42,7 +42,6 @@
42 */ 42 */
43 43
44#include <acpi/acpi.h> 44#include <acpi/acpi.h>
45#include <acpi/amlcode.h>
46#include <acpi/acnamesp.h> 45#include <acpi/acnamesp.h>
47 46
48 47
@@ -176,20 +175,24 @@ acpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object,
176 175
177 /* This is an object reference. */ 176 /* This is an object reference. */
178 177
179 switch (internal_object->reference.opcode) { 178 switch (internal_object->reference.class) {
180 case AML_INT_NAMEPATH_OP: 179 case ACPI_REFCLASS_NAME:
181
182 /* For namepath, return the object handle ("reference") */
183
184 default:
185
186 /* We are referring to the namespace node */
187 180
181 /*
182 * For namepath, return the object handle ("reference")
183 * We are referring to the namespace node
184 */
188 external_object->reference.handle = 185 external_object->reference.handle =
189 internal_object->reference.node; 186 internal_object->reference.node;
190 external_object->reference.actual_type = 187 external_object->reference.actual_type =
191 acpi_ns_get_type(internal_object->reference.node); 188 acpi_ns_get_type(internal_object->reference.node);
192 break; 189 break;
190
191 default:
192
193 /* All other reference types are unsupported */
194
195 return_ACPI_STATUS(AE_TYPE);
193 } 196 }
194 break; 197 break;
195 198
@@ -533,7 +536,7 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object,
533 536
534 /* TBD: should validate incoming handle */ 537 /* TBD: should validate incoming handle */
535 538
536 internal_object->reference.opcode = AML_INT_NAMEPATH_OP; 539 internal_object->reference.class = ACPI_REFCLASS_NAME;
537 internal_object->reference.node = 540 internal_object->reference.node =
538 external_object->reference.handle; 541 external_object->reference.handle;
539 break; 542 break;
@@ -743,11 +746,11 @@ acpi_ut_copy_simple_object(union acpi_operand_object *source_desc,
743 * We copied the reference object, so we now must add a reference 746 * We copied the reference object, so we now must add a reference
744 * to the object pointed to by the reference 747 * to the object pointed to by the reference
745 * 748 *
746 * DDBHandle reference (from Load/load_table is a special reference, 749 * DDBHandle reference (from Load/load_table) is a special reference,
747 * it's Reference.Object is the table index, so does not need to 750 * it does not have a Reference.Object, so does not need to
748 * increase the reference count 751 * increase the reference count
749 */ 752 */
750 if (source_desc->reference.opcode == AML_LOAD_OP) { 753 if (source_desc->reference.class == ACPI_REFCLASS_TABLE) {
751 break; 754 break;
752 } 755 }
753 756
diff --git a/drivers/acpi/utilities/utdelete.c b/drivers/acpi/utilities/utdelete.c
index c5c791a575c9..d197c6b29e17 100644
--- a/drivers/acpi/utilities/utdelete.c
+++ b/drivers/acpi/utilities/utdelete.c
@@ -45,7 +45,6 @@
45#include <acpi/acinterp.h> 45#include <acpi/acinterp.h>
46#include <acpi/acnamesp.h> 46#include <acpi/acnamesp.h>
47#include <acpi/acevents.h> 47#include <acpi/acevents.h>
48#include <acpi/amlcode.h>
49 48
50#define _COMPONENT ACPI_UTILITIES 49#define _COMPONENT ACPI_UTILITIES
51ACPI_MODULE_NAME("utdelete") 50ACPI_MODULE_NAME("utdelete")
@@ -135,6 +134,10 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
135 obj_pointer = object->package.elements; 134 obj_pointer = object->package.elements;
136 break; 135 break;
137 136
137 /*
138 * These objects have a possible list of notify handlers.
139 * Device object also may have a GPE block.
140 */
138 case ACPI_TYPE_DEVICE: 141 case ACPI_TYPE_DEVICE:
139 142
140 if (object->device.gpe_block) { 143 if (object->device.gpe_block) {
@@ -142,9 +145,14 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
142 gpe_block); 145 gpe_block);
143 } 146 }
144 147
145 /* Walk the handler list for this device */ 148 /*lint -fallthrough */
149
150 case ACPI_TYPE_PROCESSOR:
151 case ACPI_TYPE_THERMAL:
152
153 /* Walk the notify handler list for this object */
146 154
147 handler_desc = object->device.handler; 155 handler_desc = object->common_notify.handler;
148 while (handler_desc) { 156 while (handler_desc) {
149 next_desc = handler_desc->address_space.next; 157 next_desc = handler_desc->address_space.next;
150 acpi_ut_remove_reference(handler_desc); 158 acpi_ut_remove_reference(handler_desc);
@@ -539,8 +547,8 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
539 * reference must track changes to the ref count of the index or 547 * reference must track changes to the ref count of the index or
540 * target object. 548 * target object.
541 */ 549 */
542 if ((object->reference.opcode == AML_INDEX_OP) || 550 if ((object->reference.class == ACPI_REFCLASS_INDEX) ||
543 (object->reference.opcode == AML_INT_NAMEPATH_OP)) { 551 (object->reference.class == ACPI_REFCLASS_NAME)) {
544 next_object = object->reference.object; 552 next_object = object->reference.object;
545 } 553 }
546 break; 554 break;
@@ -577,6 +585,13 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
577 ACPI_EXCEPTION((AE_INFO, status, 585 ACPI_EXCEPTION((AE_INFO, status,
578 "Could not update object reference count")); 586 "Could not update object reference count"));
579 587
588 /* Free any stacked Update State objects */
589
590 while (state_list) {
591 state = acpi_ut_pop_generic_state(&state_list);
592 acpi_ut_delete_generic_state(state);
593 }
594
580 return_ACPI_STATUS(status); 595 return_ACPI_STATUS(status);
581} 596}
582 597
diff --git a/drivers/acpi/utilities/utglobal.c b/drivers/acpi/utilities/utglobal.c
index a6e71b801d2d..670551b95e56 100644
--- a/drivers/acpi/utilities/utglobal.c
+++ b/drivers/acpi/utilities/utglobal.c
@@ -281,7 +281,6 @@ struct acpi_bit_register_info acpi_gbl_bit_register_info[ACPI_NUM_BITREG] = {
281 /* ACPI_BITREG_RT_CLOCK_ENABLE */ {ACPI_REGISTER_PM1_ENABLE, 281 /* ACPI_BITREG_RT_CLOCK_ENABLE */ {ACPI_REGISTER_PM1_ENABLE,
282 ACPI_BITPOSITION_RT_CLOCK_ENABLE, 282 ACPI_BITPOSITION_RT_CLOCK_ENABLE,
283 ACPI_BITMASK_RT_CLOCK_ENABLE}, 283 ACPI_BITMASK_RT_CLOCK_ENABLE},
284 /* ACPI_BITREG_WAKE_ENABLE */ {ACPI_REGISTER_PM1_ENABLE, 0, 0},
285 /* ACPI_BITREG_PCIEXP_WAKE_DISABLE */ {ACPI_REGISTER_PM1_ENABLE, 284 /* ACPI_BITREG_PCIEXP_WAKE_DISABLE */ {ACPI_REGISTER_PM1_ENABLE,
286 ACPI_BITPOSITION_PCIEXP_WAKE_DISABLE, 285 ACPI_BITPOSITION_PCIEXP_WAKE_DISABLE,
287 ACPI_BITMASK_PCIEXP_WAKE_DISABLE}, 286 ACPI_BITMASK_PCIEXP_WAKE_DISABLE},
@@ -575,6 +574,47 @@ char *acpi_ut_get_descriptor_name(void *object)
575 574
576} 575}
577 576
577/*******************************************************************************
578 *
579 * FUNCTION: acpi_ut_get_reference_name
580 *
581 * PARAMETERS: Object - An ACPI reference object
582 *
583 * RETURN: Pointer to a string
584 *
585 * DESCRIPTION: Decode a reference object sub-type to a string.
586 *
587 ******************************************************************************/
588
589/* Printable names of reference object sub-types */
590
591static const char *acpi_gbl_ref_class_names[] = {
592 /* 00 */ "Local",
593 /* 01 */ "Argument",
594 /* 02 */ "RefOf",
595 /* 03 */ "Index",
596 /* 04 */ "DdbHandle",
597 /* 05 */ "Named Object",
598 /* 06 */ "Debug"
599};
600
601const char *acpi_ut_get_reference_name(union acpi_operand_object *object)
602{
603 if (!object)
604 return "NULL Object";
605
606 if (ACPI_GET_DESCRIPTOR_TYPE(object) != ACPI_DESC_TYPE_OPERAND)
607 return "Not an Operand object";
608
609 if (object->common.type != ACPI_TYPE_LOCAL_REFERENCE)
610 return "Not a Reference object";
611
612 if (object->reference.class > ACPI_REFCLASS_MAX)
613 return "Unknown Reference class";
614
615 return acpi_gbl_ref_class_names[object->reference.class];
616}
617
578#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) 618#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
579/* 619/*
580 * Strings and procedures used for debug only 620 * Strings and procedures used for debug only
@@ -677,14 +717,14 @@ u8 acpi_ut_valid_object_type(acpi_object_type type)
677 * 717 *
678 * PARAMETERS: None 718 * PARAMETERS: None
679 * 719 *
680 * RETURN: None 720 * RETURN: Status
681 * 721 *
682 * DESCRIPTION: Init library globals. All globals that require specific 722 * DESCRIPTION: Init library globals. All globals that require specific
683 * initialization should be initialized here! 723 * initialization should be initialized here!
684 * 724 *
685 ******************************************************************************/ 725 ******************************************************************************/
686 726
687void acpi_ut_init_globals(void) 727acpi_status acpi_ut_init_globals(void)
688{ 728{
689 acpi_status status; 729 acpi_status status;
690 u32 i; 730 u32 i;
@@ -695,7 +735,7 @@ void acpi_ut_init_globals(void)
695 735
696 status = acpi_ut_create_caches(); 736 status = acpi_ut_create_caches();
697 if (ACPI_FAILURE(status)) { 737 if (ACPI_FAILURE(status)) {
698 return; 738 return_ACPI_STATUS(status);
699 } 739 }
700 740
701 /* Mutex locked flags */ 741 /* Mutex locked flags */
@@ -772,8 +812,8 @@ void acpi_ut_init_globals(void)
772 acpi_gbl_display_final_mem_stats = FALSE; 812 acpi_gbl_display_final_mem_stats = FALSE;
773#endif 813#endif
774 814
775 return_VOID; 815 return_ACPI_STATUS(AE_OK);
776} 816}
777 817
778ACPI_EXPORT_SYMBOL(acpi_dbg_level) 818ACPI_EXPORT_SYMBOL(acpi_dbg_level)
779 ACPI_EXPORT_SYMBOL(acpi_dbg_layer) 819ACPI_EXPORT_SYMBOL(acpi_dbg_layer)
diff --git a/drivers/acpi/utilities/utmisc.c b/drivers/acpi/utilities/utmisc.c
index f34be6773556..9089a158a874 100644
--- a/drivers/acpi/utilities/utmisc.c
+++ b/drivers/acpi/utilities/utmisc.c
@@ -995,6 +995,15 @@ acpi_ut_walk_package_tree(union acpi_operand_object * source_object,
995 state->pkg. 995 state->pkg.
996 this_target_obj, 0); 996 this_target_obj, 0);
997 if (!state) { 997 if (!state) {
998
999 /* Free any stacked Update State objects */
1000
1001 while (state_list) {
1002 state =
1003 acpi_ut_pop_generic_state
1004 (&state_list);
1005 acpi_ut_delete_generic_state(state);
1006 }
998 return_ACPI_STATUS(AE_NO_MEMORY); 1007 return_ACPI_STATUS(AE_NO_MEMORY);
999 } 1008 }
1000 } 1009 }
diff --git a/drivers/acpi/utilities/utobject.c b/drivers/acpi/utilities/utobject.c
index e25484495e65..c354e7a42bcd 100644
--- a/drivers/acpi/utilities/utobject.c
+++ b/drivers/acpi/utilities/utobject.c
@@ -43,7 +43,6 @@
43 43
44#include <acpi/acpi.h> 44#include <acpi/acpi.h>
45#include <acpi/acnamesp.h> 45#include <acpi/acnamesp.h>
46#include <acpi/amlcode.h>
47 46
48#define _COMPONENT ACPI_UTILITIES 47#define _COMPONENT ACPI_UTILITIES
49ACPI_MODULE_NAME("utobject") 48ACPI_MODULE_NAME("utobject")
@@ -425,6 +424,7 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
425 acpi_size * obj_length) 424 acpi_size * obj_length)
426{ 425{
427 acpi_size length; 426 acpi_size length;
427 acpi_size size;
428 acpi_status status = AE_OK; 428 acpi_status status = AE_OK;
429 429
430 ACPI_FUNCTION_TRACE_PTR(ut_get_simple_object_size, internal_object); 430 ACPI_FUNCTION_TRACE_PTR(ut_get_simple_object_size, internal_object);
@@ -477,17 +477,21 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
477 477
478 case ACPI_TYPE_LOCAL_REFERENCE: 478 case ACPI_TYPE_LOCAL_REFERENCE:
479 479
480 switch (internal_object->reference.opcode) { 480 switch (internal_object->reference.class) {
481 case AML_INT_NAMEPATH_OP: 481 case ACPI_REFCLASS_NAME:
482 482
483 /* 483 /*
484 * Get the actual length of the full pathname to this object. 484 * Get the actual length of the full pathname to this object.
485 * The reference will be converted to the pathname to the object 485 * The reference will be converted to the pathname to the object
486 */ 486 */
487 length += 487 size =
488 ACPI_ROUND_UP_TO_NATIVE_WORD 488 acpi_ns_get_pathname_length(internal_object->
489 (acpi_ns_get_pathname_length 489 reference.node);
490 (internal_object->reference.node)); 490 if (!size) {
491 return_ACPI_STATUS(AE_BAD_PARAMETER);
492 }
493
494 length += ACPI_ROUND_UP_TO_NATIVE_WORD(size);
491 break; 495 break;
492 496
493 default: 497 default:
@@ -498,8 +502,10 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
498 * required eventually. 502 * required eventually.
499 */ 503 */
500 ACPI_ERROR((AE_INFO, 504 ACPI_ERROR((AE_INFO,
501 "Unsupported Reference opcode=%X in object %p", 505 "Cannot convert to external object - "
502 internal_object->reference.opcode, 506 "unsupported Reference Class [%s] %X in object %p",
507 acpi_ut_get_reference_name(internal_object),
508 internal_object->reference.class,
503 internal_object)); 509 internal_object));
504 status = AE_TYPE; 510 status = AE_TYPE;
505 break; 511 break;
@@ -508,7 +514,9 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
508 514
509 default: 515 default:
510 516
511 ACPI_ERROR((AE_INFO, "Unsupported type=%X in object %p", 517 ACPI_ERROR((AE_INFO, "Cannot convert to external object - "
518 "unsupported type [%s] %X in object %p",
519 acpi_ut_get_object_type_name(internal_object),
512 ACPI_GET_OBJECT_TYPE(internal_object), 520 ACPI_GET_OBJECT_TYPE(internal_object),
513 internal_object)); 521 internal_object));
514 status = AE_TYPE; 522 status = AE_TYPE;
diff --git a/drivers/acpi/utilities/utxface.c b/drivers/acpi/utilities/utxface.c
index f8bdadf3c32f..c198a4d40583 100644
--- a/drivers/acpi/utilities/utxface.c
+++ b/drivers/acpi/utilities/utxface.c
@@ -81,7 +81,12 @@ acpi_status __init acpi_initialize_subsystem(void)
81 81
82 /* Initialize all globals used by the subsystem */ 82 /* Initialize all globals used by the subsystem */
83 83
84 acpi_ut_init_globals(); 84 status = acpi_ut_init_globals();
85 if (ACPI_FAILURE(status)) {
86 ACPI_EXCEPTION((AE_INFO, status,
87 "During initialization of globals"));
88 return_ACPI_STATUS(status);
89 }
85 90
86 /* Create the default mutex objects */ 91 /* Create the default mutex objects */
87 92
diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c
index 100926143818..e827be36ee8d 100644
--- a/drivers/acpi/utils.c
+++ b/drivers/acpi/utils.c
@@ -256,7 +256,7 @@ EXPORT_SYMBOL(acpi_extract_package);
256acpi_status 256acpi_status
257acpi_evaluate_integer(acpi_handle handle, 257acpi_evaluate_integer(acpi_handle handle,
258 acpi_string pathname, 258 acpi_string pathname,
259 struct acpi_object_list *arguments, unsigned long *data) 259 struct acpi_object_list *arguments, unsigned long long *data)
260{ 260{
261 acpi_status status = AE_OK; 261 acpi_status status = AE_OK;
262 union acpi_object *element; 262 union acpi_object *element;
@@ -288,7 +288,7 @@ acpi_evaluate_integer(acpi_handle handle,
288 *data = element->integer.value; 288 *data = element->integer.value;
289 kfree(element); 289 kfree(element);
290 290
291 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Return value [%lu]\n", *data)); 291 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Return value [%llu]\n", *data));
292 292
293 return AE_OK; 293 return AE_OK;
294} 294}
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
index 64c889331f3b..a29b0ccac65a 100644
--- a/drivers/acpi/video.c
+++ b/drivers/acpi/video.c
@@ -291,20 +291,20 @@ static int acpi_video_device_lcd_set_level(struct acpi_video_device *device,
291 int level); 291 int level);
292static int acpi_video_device_lcd_get_level_current( 292static int acpi_video_device_lcd_get_level_current(
293 struct acpi_video_device *device, 293 struct acpi_video_device *device,
294 unsigned long *level); 294 unsigned long long *level);
295static int acpi_video_get_next_level(struct acpi_video_device *device, 295static int acpi_video_get_next_level(struct acpi_video_device *device,
296 u32 level_current, u32 event); 296 u32 level_current, u32 event);
297static void acpi_video_switch_brightness(struct acpi_video_device *device, 297static void acpi_video_switch_brightness(struct acpi_video_device *device,
298 int event); 298 int event);
299static int acpi_video_device_get_state(struct acpi_video_device *device, 299static int acpi_video_device_get_state(struct acpi_video_device *device,
300 unsigned long *state); 300 unsigned long long *state);
301static int acpi_video_output_get(struct output_device *od); 301static int acpi_video_output_get(struct output_device *od);
302static int acpi_video_device_set_state(struct acpi_video_device *device, int state); 302static int acpi_video_device_set_state(struct acpi_video_device *device, int state);
303 303
304/*backlight device sysfs support*/ 304/*backlight device sysfs support*/
305static int acpi_video_get_brightness(struct backlight_device *bd) 305static int acpi_video_get_brightness(struct backlight_device *bd)
306{ 306{
307 unsigned long cur_level; 307 unsigned long long cur_level;
308 int i; 308 int i;
309 struct acpi_video_device *vd = 309 struct acpi_video_device *vd =
310 (struct acpi_video_device *)bl_get_data(bd); 310 (struct acpi_video_device *)bl_get_data(bd);
@@ -336,7 +336,7 @@ static struct backlight_ops acpi_backlight_ops = {
336/*video output device sysfs support*/ 336/*video output device sysfs support*/
337static int acpi_video_output_get(struct output_device *od) 337static int acpi_video_output_get(struct output_device *od)
338{ 338{
339 unsigned long state; 339 unsigned long long state;
340 struct acpi_video_device *vd = 340 struct acpi_video_device *vd =
341 (struct acpi_video_device *)dev_get_drvdata(&od->dev); 341 (struct acpi_video_device *)dev_get_drvdata(&od->dev);
342 acpi_video_device_get_state(vd, &state); 342 acpi_video_device_get_state(vd, &state);
@@ -370,7 +370,7 @@ static int video_get_cur_state(struct thermal_cooling_device *cdev, char *buf)
370{ 370{
371 struct acpi_device *device = cdev->devdata; 371 struct acpi_device *device = cdev->devdata;
372 struct acpi_video_device *video = acpi_driver_data(device); 372 struct acpi_video_device *video = acpi_driver_data(device);
373 unsigned long level; 373 unsigned long long level;
374 int state; 374 int state;
375 375
376 acpi_video_device_lcd_get_level_current(video, &level); 376 acpi_video_device_lcd_get_level_current(video, &level);
@@ -410,7 +410,7 @@ static struct thermal_cooling_device_ops video_cooling_ops = {
410/* device */ 410/* device */
411 411
412static int 412static int
413acpi_video_device_query(struct acpi_video_device *device, unsigned long *state) 413acpi_video_device_query(struct acpi_video_device *device, unsigned long long *state)
414{ 414{
415 int status; 415 int status;
416 416
@@ -421,7 +421,7 @@ acpi_video_device_query(struct acpi_video_device *device, unsigned long *state)
421 421
422static int 422static int
423acpi_video_device_get_state(struct acpi_video_device *device, 423acpi_video_device_get_state(struct acpi_video_device *device,
424 unsigned long *state) 424 unsigned long long *state)
425{ 425{
426 int status; 426 int status;
427 427
@@ -436,7 +436,7 @@ acpi_video_device_set_state(struct acpi_video_device *device, int state)
436 int status; 436 int status;
437 union acpi_object arg0 = { ACPI_TYPE_INTEGER }; 437 union acpi_object arg0 = { ACPI_TYPE_INTEGER };
438 struct acpi_object_list args = { 1, &arg0 }; 438 struct acpi_object_list args = { 1, &arg0 };
439 unsigned long ret; 439 unsigned long long ret;
440 440
441 441
442 arg0.integer.value = state; 442 arg0.integer.value = state;
@@ -495,7 +495,7 @@ acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level)
495 495
496static int 496static int
497acpi_video_device_lcd_get_level_current(struct acpi_video_device *device, 497acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
498 unsigned long *level) 498 unsigned long long *level)
499{ 499{
500 if (device->cap._BQC) 500 if (device->cap._BQC)
501 return acpi_evaluate_integer(device->dev->handle, "_BQC", NULL, 501 return acpi_evaluate_integer(device->dev->handle, "_BQC", NULL,
@@ -549,7 +549,7 @@ static int
549acpi_video_bus_set_POST(struct acpi_video_bus *video, unsigned long option) 549acpi_video_bus_set_POST(struct acpi_video_bus *video, unsigned long option)
550{ 550{
551 int status; 551 int status;
552 unsigned long tmp; 552 unsigned long long tmp;
553 union acpi_object arg0 = { ACPI_TYPE_INTEGER }; 553 union acpi_object arg0 = { ACPI_TYPE_INTEGER };
554 struct acpi_object_list args = { 1, &arg0 }; 554 struct acpi_object_list args = { 1, &arg0 };
555 555
@@ -564,7 +564,7 @@ acpi_video_bus_set_POST(struct acpi_video_bus *video, unsigned long option)
564} 564}
565 565
566static int 566static int
567acpi_video_bus_get_POST(struct acpi_video_bus *video, unsigned long *id) 567acpi_video_bus_get_POST(struct acpi_video_bus *video, unsigned long long *id)
568{ 568{
569 int status; 569 int status;
570 570
@@ -575,7 +575,7 @@ acpi_video_bus_get_POST(struct acpi_video_bus *video, unsigned long *id)
575 575
576static int 576static int
577acpi_video_bus_POST_options(struct acpi_video_bus *video, 577acpi_video_bus_POST_options(struct acpi_video_bus *video,
578 unsigned long *options) 578 unsigned long long *options)
579{ 579{
580 int status; 580 int status;
581 581
@@ -741,7 +741,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
741 741
742 max_level = acpi_video_init_brightness(device); 742 max_level = acpi_video_init_brightness(device);
743 743
744 if (device->cap._BCL && device->cap._BCM && device->cap._BQC && max_level > 0){ 744 if (device->cap._BCL && device->cap._BCM && max_level > 0) {
745 int result; 745 int result;
746 static int count = 0; 746 static int count = 0;
747 char *name; 747 char *name;
@@ -753,7 +753,17 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
753 device->backlight = backlight_device_register(name, 753 device->backlight = backlight_device_register(name,
754 NULL, device, &acpi_backlight_ops); 754 NULL, device, &acpi_backlight_ops);
755 device->backlight->props.max_brightness = device->brightness->count-3; 755 device->backlight->props.max_brightness = device->brightness->count-3;
756 device->backlight->props.brightness = acpi_video_get_brightness(device->backlight); 756 /*
757 * If there exists the _BQC object, the _BQC object will be
758 * called to get the current backlight brightness. Otherwise
759 * the brightness will be set to the maximum.
760 */
761 if (device->cap._BQC)
762 device->backlight->props.brightness =
763 acpi_video_get_brightness(device->backlight);
764 else
765 device->backlight->props.brightness =
766 device->backlight->props.max_brightness;
757 backlight_update_status(device->backlight); 767 backlight_update_status(device->backlight);
758 kfree(name); 768 kfree(name);
759 769
@@ -762,9 +772,8 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
762 if (IS_ERR(device->cdev)) 772 if (IS_ERR(device->cdev))
763 return; 773 return;
764 774
765 printk(KERN_INFO PREFIX 775 dev_info(&device->dev->dev, "registered as cooling_device%d\n",
766 "%s is registered as cooling_device%d\n", 776 device->cdev->id);
767 device->dev->dev.bus_id, device->cdev->id);
768 result = sysfs_create_link(&device->dev->dev.kobj, 777 result = sysfs_create_link(&device->dev->dev.kobj,
769 &device->cdev->device.kobj, 778 &device->cdev->device.kobj,
770 "thermal_cooling"); 779 "thermal_cooling");
@@ -909,7 +918,7 @@ static int acpi_video_device_state_seq_show(struct seq_file *seq, void *offset)
909{ 918{
910 int status; 919 int status;
911 struct acpi_video_device *dev = seq->private; 920 struct acpi_video_device *dev = seq->private;
912 unsigned long state; 921 unsigned long long state;
913 922
914 923
915 if (!dev) 924 if (!dev)
@@ -918,14 +927,14 @@ static int acpi_video_device_state_seq_show(struct seq_file *seq, void *offset)
918 status = acpi_video_device_get_state(dev, &state); 927 status = acpi_video_device_get_state(dev, &state);
919 seq_printf(seq, "state: "); 928 seq_printf(seq, "state: ");
920 if (ACPI_SUCCESS(status)) 929 if (ACPI_SUCCESS(status))
921 seq_printf(seq, "0x%02lx\n", state); 930 seq_printf(seq, "0x%02llx\n", state);
922 else 931 else
923 seq_printf(seq, "<not supported>\n"); 932 seq_printf(seq, "<not supported>\n");
924 933
925 status = acpi_video_device_query(dev, &state); 934 status = acpi_video_device_query(dev, &state);
926 seq_printf(seq, "query: "); 935 seq_printf(seq, "query: ");
927 if (ACPI_SUCCESS(status)) 936 if (ACPI_SUCCESS(status))
928 seq_printf(seq, "0x%02lx\n", state); 937 seq_printf(seq, "0x%02llx\n", state);
929 else 938 else
930 seq_printf(seq, "<not supported>\n"); 939 seq_printf(seq, "<not supported>\n");
931 940
@@ -1208,7 +1217,7 @@ static int acpi_video_bus_ROM_open_fs(struct inode *inode, struct file *file)
1208static int acpi_video_bus_POST_info_seq_show(struct seq_file *seq, void *offset) 1217static int acpi_video_bus_POST_info_seq_show(struct seq_file *seq, void *offset)
1209{ 1218{
1210 struct acpi_video_bus *video = seq->private; 1219 struct acpi_video_bus *video = seq->private;
1211 unsigned long options; 1220 unsigned long long options;
1212 int status; 1221 int status;
1213 1222
1214 1223
@@ -1223,7 +1232,7 @@ static int acpi_video_bus_POST_info_seq_show(struct seq_file *seq, void *offset)
1223 printk(KERN_WARNING PREFIX 1232 printk(KERN_WARNING PREFIX
1224 "This indicates a BIOS bug. Please contact the manufacturer.\n"); 1233 "This indicates a BIOS bug. Please contact the manufacturer.\n");
1225 } 1234 }
1226 printk("%lx\n", options); 1235 printk("%llx\n", options);
1227 seq_printf(seq, "can POST: <integrated video>"); 1236 seq_printf(seq, "can POST: <integrated video>");
1228 if (options & 2) 1237 if (options & 2)
1229 seq_printf(seq, " <PCI video>"); 1238 seq_printf(seq, " <PCI video>");
@@ -1247,7 +1256,7 @@ static int acpi_video_bus_POST_seq_show(struct seq_file *seq, void *offset)
1247{ 1256{
1248 struct acpi_video_bus *video = seq->private; 1257 struct acpi_video_bus *video = seq->private;
1249 int status; 1258 int status;
1250 unsigned long id; 1259 unsigned long long id;
1251 1260
1252 1261
1253 if (!video) 1262 if (!video)
@@ -1294,7 +1303,7 @@ acpi_video_bus_write_POST(struct file *file,
1294 struct seq_file *m = file->private_data; 1303 struct seq_file *m = file->private_data;
1295 struct acpi_video_bus *video = m->private; 1304 struct acpi_video_bus *video = m->private;
1296 char str[12] = { 0 }; 1305 char str[12] = { 0 };
1297 unsigned long opt, options; 1306 unsigned long long opt, options;
1298 1307
1299 1308
1300 if (!video || count + 1 > sizeof str) 1309 if (!video || count + 1 > sizeof str)
@@ -1464,7 +1473,7 @@ static int
1464acpi_video_bus_get_one_device(struct acpi_device *device, 1473acpi_video_bus_get_one_device(struct acpi_device *device,
1465 struct acpi_video_bus *video) 1474 struct acpi_video_bus *video)
1466{ 1475{
1467 unsigned long device_id; 1476 unsigned long long device_id;
1468 int status; 1477 int status;
1469 struct acpi_video_device *data; 1478 struct acpi_video_device *data;
1470 struct acpi_video_device_attrib* attribute; 1479 struct acpi_video_device_attrib* attribute;
@@ -1482,7 +1491,7 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
1482 1491
1483 strcpy(acpi_device_name(device), ACPI_VIDEO_DEVICE_NAME); 1492 strcpy(acpi_device_name(device), ACPI_VIDEO_DEVICE_NAME);
1484 strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS); 1493 strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS);
1485 acpi_driver_data(device) = data; 1494 device->driver_data = data;
1486 1495
1487 data->device_id = device_id; 1496 data->device_id = device_id;
1488 data->video = video; 1497 data->video = video;
@@ -1521,8 +1530,8 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
1521 acpi_video_device_notify, 1530 acpi_video_device_notify,
1522 data); 1531 data);
1523 if (ACPI_FAILURE(status)) { 1532 if (ACPI_FAILURE(status)) {
1524 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 1533 printk(KERN_ERR PREFIX
1525 "Error installing notify handler\n")); 1534 "Error installing notify handler\n");
1526 if(data->brightness) 1535 if(data->brightness)
1527 kfree(data->brightness->levels); 1536 kfree(data->brightness->levels);
1528 kfree(data->brightness); 1537 kfree(data->brightness);
@@ -1715,7 +1724,7 @@ acpi_video_get_next_level(struct acpi_video_device *device,
1715static void 1724static void
1716acpi_video_switch_brightness(struct acpi_video_device *device, int event) 1725acpi_video_switch_brightness(struct acpi_video_device *device, int event)
1717{ 1726{
1718 unsigned long level_current, level_next; 1727 unsigned long long level_current, level_next;
1719 if (!device->brightness) 1728 if (!device->brightness)
1720 return; 1729 return;
1721 acpi_video_device_lcd_get_level_current(device, &level_current); 1730 acpi_video_device_lcd_get_level_current(device, &level_current);
@@ -1736,8 +1745,8 @@ acpi_video_bus_get_devices(struct acpi_video_bus *video,
1736 1745
1737 status = acpi_video_bus_get_one_device(dev, video); 1746 status = acpi_video_bus_get_one_device(dev, video);
1738 if (ACPI_FAILURE(status)) { 1747 if (ACPI_FAILURE(status)) {
1739 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 1748 printk(KERN_WARNING PREFIX
1740 "Cant attach device")); 1749 "Cant attach device");
1741 continue; 1750 continue;
1742 } 1751 }
1743 } 1752 }
@@ -1973,7 +1982,7 @@ static int acpi_video_bus_add(struct acpi_device *device)
1973 video->device = device; 1982 video->device = device;
1974 strcpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME); 1983 strcpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME);
1975 strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS); 1984 strcpy(acpi_device_class(device), ACPI_VIDEO_CLASS);
1976 acpi_driver_data(device) = video; 1985 device->driver_data = video;
1977 1986
1978 acpi_video_bus_find_cap(video); 1987 acpi_video_bus_find_cap(video);
1979 error = acpi_video_bus_check(video); 1988 error = acpi_video_bus_check(video);
@@ -1994,8 +2003,8 @@ static int acpi_video_bus_add(struct acpi_device *device)
1994 ACPI_DEVICE_NOTIFY, 2003 ACPI_DEVICE_NOTIFY,
1995 acpi_video_bus_notify, video); 2004 acpi_video_bus_notify, video);
1996 if (ACPI_FAILURE(status)) { 2005 if (ACPI_FAILURE(status)) {
1997 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 2006 printk(KERN_ERR PREFIX
1998 "Error installing notify handler\n")); 2007 "Error installing notify handler\n");
1999 error = -ENODEV; 2008 error = -ENODEV;
2000 goto err_stop_video; 2009 goto err_stop_video;
2001 } 2010 }
@@ -2049,7 +2058,7 @@ static int acpi_video_bus_add(struct acpi_device *device)
2049 acpi_video_bus_remove_fs(device); 2058 acpi_video_bus_remove_fs(device);
2050 err_free_video: 2059 err_free_video:
2051 kfree(video); 2060 kfree(video);
2052 acpi_driver_data(device) = NULL; 2061 device->driver_data = NULL;
2053 2062
2054 return error; 2063 return error;
2055} 2064}
diff --git a/drivers/acpi/wmi.c b/drivers/acpi/wmi.c
index c33b1c6e93b1..47cd7baf9b1b 100644
--- a/drivers/acpi/wmi.c
+++ b/drivers/acpi/wmi.c
@@ -217,6 +217,35 @@ static bool find_guid(const char *guid_string, struct wmi_block **out)
217 return 0; 217 return 0;
218} 218}
219 219
220static acpi_status wmi_method_enable(struct wmi_block *wblock, int enable)
221{
222 struct guid_block *block = NULL;
223 char method[5];
224 struct acpi_object_list input;
225 union acpi_object params[1];
226 acpi_status status;
227 acpi_handle handle;
228
229 block = &wblock->gblock;
230 handle = wblock->handle;
231
232 if (!block)
233 return AE_NOT_EXIST;
234
235 input.count = 1;
236 input.pointer = params;
237 params[0].type = ACPI_TYPE_INTEGER;
238 params[0].integer.value = enable;
239
240 snprintf(method, 5, "WE%02X", block->notify_id);
241 status = acpi_evaluate_object(handle, method, &input, NULL);
242
243 if (status != AE_OK && status != AE_NOT_FOUND)
244 return status;
245 else
246 return AE_OK;
247}
248
220/* 249/*
221 * Exported WMI functions 250 * Exported WMI functions
222 */ 251 */
@@ -242,7 +271,7 @@ u32 method_id, const struct acpi_buffer *in, struct acpi_buffer *out)
242 char method[4] = "WM"; 271 char method[4] = "WM";
243 272
244 if (!find_guid(guid_string, &wblock)) 273 if (!find_guid(guid_string, &wblock))
245 return AE_BAD_ADDRESS; 274 return AE_ERROR;
246 275
247 block = &wblock->gblock; 276 block = &wblock->gblock;
248 handle = wblock->handle; 277 handle = wblock->handle;
@@ -304,7 +333,7 @@ struct acpi_buffer *out)
304 return AE_BAD_PARAMETER; 333 return AE_BAD_PARAMETER;
305 334
306 if (!find_guid(guid_string, &wblock)) 335 if (!find_guid(guid_string, &wblock))
307 return AE_BAD_ADDRESS; 336 return AE_ERROR;
308 337
309 block = &wblock->gblock; 338 block = &wblock->gblock;
310 handle = wblock->handle; 339 handle = wblock->handle;
@@ -314,7 +343,7 @@ struct acpi_buffer *out)
314 343
315 /* Check GUID is a data block */ 344 /* Check GUID is a data block */
316 if (block->flags & (ACPI_WMI_EVENT | ACPI_WMI_METHOD)) 345 if (block->flags & (ACPI_WMI_EVENT | ACPI_WMI_METHOD))
317 return AE_BAD_ADDRESS; 346 return AE_ERROR;
318 347
319 input.count = 1; 348 input.count = 1;
320 input.pointer = wq_params; 349 input.pointer = wq_params;
@@ -347,7 +376,7 @@ struct acpi_buffer *out)
347 strcpy(method, "WQ"); 376 strcpy(method, "WQ");
348 strncat(method, block->object_id, 2); 377 strncat(method, block->object_id, 2);
349 378
350 status = acpi_evaluate_object(handle, method, NULL, out); 379 status = acpi_evaluate_object(handle, method, &input, out);
351 380
352 /* 381 /*
353 * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method, even if 382 * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method, even if
@@ -385,7 +414,7 @@ const struct acpi_buffer *in)
385 return AE_BAD_DATA; 414 return AE_BAD_DATA;
386 415
387 if (!find_guid(guid_string, &wblock)) 416 if (!find_guid(guid_string, &wblock))
388 return AE_BAD_ADDRESS; 417 return AE_ERROR;
389 418
390 block = &wblock->gblock; 419 block = &wblock->gblock;
391 handle = wblock->handle; 420 handle = wblock->handle;
@@ -395,7 +424,7 @@ const struct acpi_buffer *in)
395 424
396 /* Check GUID is a data block */ 425 /* Check GUID is a data block */
397 if (block->flags & (ACPI_WMI_EVENT | ACPI_WMI_METHOD)) 426 if (block->flags & (ACPI_WMI_EVENT | ACPI_WMI_METHOD))
398 return AE_BAD_ADDRESS; 427 return AE_ERROR;
399 428
400 input.count = 2; 429 input.count = 2;
401 input.pointer = params; 430 input.pointer = params;
@@ -427,6 +456,7 @@ acpi_status wmi_install_notify_handler(const char *guid,
427wmi_notify_handler handler, void *data) 456wmi_notify_handler handler, void *data)
428{ 457{
429 struct wmi_block *block; 458 struct wmi_block *block;
459 acpi_status status;
430 460
431 if (!guid || !handler) 461 if (!guid || !handler)
432 return AE_BAD_PARAMETER; 462 return AE_BAD_PARAMETER;
@@ -441,7 +471,9 @@ wmi_notify_handler handler, void *data)
441 block->handler = handler; 471 block->handler = handler;
442 block->handler_data = data; 472 block->handler_data = data;
443 473
444 return AE_OK; 474 status = wmi_method_enable(block, 1);
475
476 return status;
445} 477}
446EXPORT_SYMBOL_GPL(wmi_install_notify_handler); 478EXPORT_SYMBOL_GPL(wmi_install_notify_handler);
447 479
@@ -453,6 +485,7 @@ EXPORT_SYMBOL_GPL(wmi_install_notify_handler);
453acpi_status wmi_remove_notify_handler(const char *guid) 485acpi_status wmi_remove_notify_handler(const char *guid)
454{ 486{
455 struct wmi_block *block; 487 struct wmi_block *block;
488 acpi_status status;
456 489
457 if (!guid) 490 if (!guid)
458 return AE_BAD_PARAMETER; 491 return AE_BAD_PARAMETER;
@@ -464,10 +497,12 @@ acpi_status wmi_remove_notify_handler(const char *guid)
464 if (!block->handler) 497 if (!block->handler)
465 return AE_NULL_ENTRY; 498 return AE_NULL_ENTRY;
466 499
500 status = wmi_method_enable(block, 0);
501
467 block->handler = NULL; 502 block->handler = NULL;
468 block->handler_data = NULL; 503 block->handler_data = NULL;
469 504
470 return AE_OK; 505 return status;
471} 506}
472EXPORT_SYMBOL_GPL(wmi_remove_notify_handler); 507EXPORT_SYMBOL_GPL(wmi_remove_notify_handler);
473 508