aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/system.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/system.c')
-rw-r--r--drivers/acpi/system.c75
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
35ACPI_MODULE_NAME("system"); 35ACPI_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
44u32 acpi_irq_handled; 40u32 acpi_irq_handled;
41u32 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 -------------------------------------------------------------------------- */
63static LIST_HEAD(acpi_table_attr_list); 60static LIST_HEAD(acpi_table_attr_list);
64static struct kobject *tables_kobj; 61static struct kobject *tables_kobj;
62static struct kobject *dynamic_tables_kobj;
65 63
66struct acpi_table_attr { 64struct 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
129static acpi_status
130acpi_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
131static int acpi_system_sysfs_init(void) 163static 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;
205err_dynamic_tables:
206 kobject_put(tables_kobj);
207err:
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
179struct event_counter { 222struct 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
574static int __init acpi_system_init(void) 622int __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
590subsys_initcall(acpi_system_init);