diff options
Diffstat (limited to 'drivers/acpi/system.c')
-rw-r--r-- | drivers/acpi/system.c | 75 |
1 files changed, 59 insertions, 16 deletions
diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c index 391d0358a592..0944daec064f 100644 --- a/drivers/acpi/system.c +++ b/drivers/acpi/system.c | |||
@@ -33,15 +33,12 @@ | |||
33 | 33 | ||
34 | #define _COMPONENT ACPI_SYSTEM_COMPONENT | 34 | #define _COMPONENT ACPI_SYSTEM_COMPONENT |
35 | ACPI_MODULE_NAME("system"); | 35 | ACPI_MODULE_NAME("system"); |
36 | #ifdef MODULE_PARAM_PREFIX | ||
37 | #undef MODULE_PARAM_PREFIX | ||
38 | #endif | ||
39 | #define MODULE_PARAM_PREFIX "acpi." | ||
40 | 36 | ||
41 | #define ACPI_SYSTEM_CLASS "system" | 37 | #define ACPI_SYSTEM_CLASS "system" |
42 | #define ACPI_SYSTEM_DEVICE_NAME "System" | 38 | #define ACPI_SYSTEM_DEVICE_NAME "System" |
43 | 39 | ||
44 | u32 acpi_irq_handled; | 40 | u32 acpi_irq_handled; |
41 | u32 acpi_irq_not_handled; | ||
45 | 42 | ||
46 | /* | 43 | /* |
47 | * Make ACPICA version work as module param | 44 | * Make ACPICA version work as module param |
@@ -62,6 +59,7 @@ module_param_call(acpica_version, NULL, param_get_acpica_version, NULL, 0444); | |||
62 | -------------------------------------------------------------------------- */ | 59 | -------------------------------------------------------------------------- */ |
63 | static LIST_HEAD(acpi_table_attr_list); | 60 | static LIST_HEAD(acpi_table_attr_list); |
64 | static struct kobject *tables_kobj; | 61 | static struct kobject *tables_kobj; |
62 | static struct kobject *dynamic_tables_kobj; | ||
65 | 63 | ||
66 | struct acpi_table_attr { | 64 | struct acpi_table_attr { |
67 | struct bin_attribute attr; | 65 | struct bin_attribute attr; |
@@ -128,6 +126,40 @@ static void acpi_table_attr_init(struct acpi_table_attr *table_attr, | |||
128 | return; | 126 | return; |
129 | } | 127 | } |
130 | 128 | ||
129 | static acpi_status | ||
130 | acpi_sysfs_table_handler(u32 event, void *table, void *context) | ||
131 | { | ||
132 | struct acpi_table_attr *table_attr; | ||
133 | |||
134 | switch (event) { | ||
135 | case ACPI_TABLE_EVENT_LOAD: | ||
136 | table_attr = | ||
137 | kzalloc(sizeof(struct acpi_table_attr), GFP_KERNEL); | ||
138 | if (!table_attr) | ||
139 | return AE_NO_MEMORY; | ||
140 | |||
141 | acpi_table_attr_init(table_attr, table); | ||
142 | if (sysfs_create_bin_file(dynamic_tables_kobj, | ||
143 | &table_attr->attr)) { | ||
144 | kfree(table_attr); | ||
145 | return AE_ERROR; | ||
146 | } else | ||
147 | list_add_tail(&table_attr->node, | ||
148 | &acpi_table_attr_list); | ||
149 | break; | ||
150 | case ACPI_TABLE_EVENT_UNLOAD: | ||
151 | /* | ||
152 | * we do not need to do anything right now | ||
153 | * because the table is not deleted from the | ||
154 | * global table list when unloading it. | ||
155 | */ | ||
156 | break; | ||
157 | default: | ||
158 | return AE_BAD_PARAMETER; | ||
159 | } | ||
160 | return AE_OK; | ||
161 | } | ||
162 | |||
131 | static int acpi_system_sysfs_init(void) | 163 | static int acpi_system_sysfs_init(void) |
132 | { | 164 | { |
133 | struct acpi_table_attr *table_attr; | 165 | struct acpi_table_attr *table_attr; |
@@ -137,7 +169,11 @@ static int acpi_system_sysfs_init(void) | |||
137 | 169 | ||
138 | tables_kobj = kobject_create_and_add("tables", acpi_kobj); | 170 | tables_kobj = kobject_create_and_add("tables", acpi_kobj); |
139 | if (!tables_kobj) | 171 | if (!tables_kobj) |
140 | return -ENOMEM; | 172 | goto err; |
173 | |||
174 | dynamic_tables_kobj = kobject_create_and_add("dynamic", tables_kobj); | ||
175 | if (!dynamic_tables_kobj) | ||
176 | goto err_dynamic_tables; | ||
141 | 177 | ||
142 | do { | 178 | do { |
143 | result = acpi_get_table_by_index(table_index, &table_header); | 179 | result = acpi_get_table_by_index(table_index, &table_header); |
@@ -162,8 +198,14 @@ static int acpi_system_sysfs_init(void) | |||
162 | } | 198 | } |
163 | } while (!result); | 199 | } while (!result); |
164 | kobject_uevent(tables_kobj, KOBJ_ADD); | 200 | kobject_uevent(tables_kobj, KOBJ_ADD); |
165 | 201 | kobject_uevent(dynamic_tables_kobj, KOBJ_ADD); | |
166 | return 0; | 202 | result = acpi_install_table_handler(acpi_sysfs_table_handler, NULL); |
203 | |||
204 | return result == AE_OK ? 0 : -EINVAL; | ||
205 | err_dynamic_tables: | ||
206 | kobject_put(tables_kobj); | ||
207 | err: | ||
208 | return -ENOMEM; | ||
167 | } | 209 | } |
168 | 210 | ||
169 | /* | 211 | /* |
@@ -173,8 +215,9 @@ static int acpi_system_sysfs_init(void) | |||
173 | 215 | ||
174 | #define COUNT_GPE 0 | 216 | #define COUNT_GPE 0 |
175 | #define COUNT_SCI 1 /* acpi_irq_handled */ | 217 | #define COUNT_SCI 1 /* acpi_irq_handled */ |
176 | #define COUNT_ERROR 2 /* other */ | 218 | #define COUNT_SCI_NOT 2 /* acpi_irq_not_handled */ |
177 | #define NUM_COUNTERS_EXTRA 3 | 219 | #define COUNT_ERROR 3 /* other */ |
220 | #define NUM_COUNTERS_EXTRA 4 | ||
178 | 221 | ||
179 | struct event_counter { | 222 | struct event_counter { |
180 | u32 count; | 223 | u32 count; |
@@ -276,6 +319,8 @@ static ssize_t counter_show(struct kobject *kobj, | |||
276 | 319 | ||
277 | all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI].count = | 320 | all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI].count = |
278 | acpi_irq_handled; | 321 | acpi_irq_handled; |
322 | all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI_NOT].count = | ||
323 | acpi_irq_not_handled; | ||
279 | all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_GPE].count = | 324 | all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_GPE].count = |
280 | acpi_gpe_count; | 325 | acpi_gpe_count; |
281 | 326 | ||
@@ -322,6 +367,7 @@ static ssize_t counter_set(struct kobject *kobj, | |||
322 | all_counters[i].count = 0; | 367 | all_counters[i].count = 0; |
323 | acpi_gpe_count = 0; | 368 | acpi_gpe_count = 0; |
324 | acpi_irq_handled = 0; | 369 | acpi_irq_handled = 0; |
370 | acpi_irq_not_handled = 0; | ||
325 | goto end; | 371 | goto end; |
326 | } | 372 | } |
327 | 373 | ||
@@ -415,6 +461,8 @@ void acpi_irq_stats_init(void) | |||
415 | sprintf(buffer, "gpe_all"); | 461 | sprintf(buffer, "gpe_all"); |
416 | else if (i == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI) | 462 | else if (i == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI) |
417 | sprintf(buffer, "sci"); | 463 | sprintf(buffer, "sci"); |
464 | else if (i == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI_NOT) | ||
465 | sprintf(buffer, "sci_not"); | ||
418 | else if (i == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_ERROR) | 466 | else if (i == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_ERROR) |
419 | sprintf(buffer, "error"); | 467 | sprintf(buffer, "error"); |
420 | else | 468 | else |
@@ -571,12 +619,9 @@ static int acpi_system_procfs_init(void) | |||
571 | } | 619 | } |
572 | #endif | 620 | #endif |
573 | 621 | ||
574 | static int __init acpi_system_init(void) | 622 | int __init acpi_system_init(void) |
575 | { | 623 | { |
576 | int result = 0; | 624 | int result; |
577 | |||
578 | if (acpi_disabled) | ||
579 | return 0; | ||
580 | 625 | ||
581 | result = acpi_system_procfs_init(); | 626 | result = acpi_system_procfs_init(); |
582 | if (result) | 627 | if (result) |
@@ -586,5 +631,3 @@ static int __init acpi_system_init(void) | |||
586 | 631 | ||
587 | return result; | 632 | return result; |
588 | } | 633 | } |
589 | |||
590 | subsys_initcall(acpi_system_init); | ||