]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'dynamic-ssdt' into release
authorLen Brown <len.brown@intel.com>
Sun, 5 Apr 2009 05:39:00 +0000 (01:39 -0400)
committerLen Brown <len.brown@intel.com>
Sun, 5 Apr 2009 05:39:00 +0000 (01:39 -0400)
1  2 
drivers/acpi/system.c

diff --combined drivers/acpi/system.c
index 3b88981dd21539c4f82b6558dab621be037d590e,c8859047acfe0e0dd9cfcef34ea08e6276bea082..44be75ee7264dfaf64bf985dab67979d9ce04602
@@@ -62,6 -62,7 +62,7 @@@ module_param_call(acpica_version, NULL
     -------------------------------------------------------------------------- */
  static LIST_HEAD(acpi_table_attr_list);
  static struct kobject *tables_kobj;
+ static struct kobject *dynamic_tables_kobj;
  
  struct acpi_table_attr {
        struct bin_attribute attr;
@@@ -128,6 -129,40 +129,40 @@@ static void acpi_table_attr_init(struc
        return;
  }
  
+ static acpi_status
+ acpi_sysfs_table_handler(u32 event, void *table, void *context)
+ {
+       struct acpi_table_attr *table_attr;
+       switch (event) {
+       case ACPI_TABLE_EVENT_LOAD:
+               table_attr =
+                       kzalloc(sizeof(struct acpi_table_attr), GFP_KERNEL);
+               if (!table_attr)
+                       return AE_NO_MEMORY;
+               acpi_table_attr_init(table_attr, table);
+               if (sysfs_create_bin_file(dynamic_tables_kobj,
+                                       &table_attr->attr)) {
+                       kfree(table_attr);
+                       return AE_ERROR;
+               } else
+                       list_add_tail(&table_attr->node,
+                                       &acpi_table_attr_list);
+               break;
+       case ACPI_TABLE_EVENT_UNLOAD:
+               /*
+                * we do not need to do anything right now
+                * because the table is not deleted from the
+                * global table list when unloading it.
+                */
+               break;
+       default:
+               return AE_BAD_PARAMETER;
+       }
+       return AE_OK;
+ }
  static int acpi_system_sysfs_init(void)
  {
        struct acpi_table_attr *table_attr;
  
        tables_kobj = kobject_create_and_add("tables", acpi_kobj);
        if (!tables_kobj)
-               return -ENOMEM;
+               goto err;
+       dynamic_tables_kobj = kobject_create_and_add("dynamic", tables_kobj);
+       if (!dynamic_tables_kobj)
+               goto err_dynamic_tables;
  
        do {
                result = acpi_get_table_by_index(table_index, &table_header);
                }
        } while (!result);
        kobject_uevent(tables_kobj, KOBJ_ADD);
-       return 0;
+       kobject_uevent(dynamic_tables_kobj, KOBJ_ADD);
+       result = acpi_install_table_handler(acpi_sysfs_table_handler, NULL);
+       return result == AE_OK ? 0 : -EINVAL;
+ err_dynamic_tables:
+       kobject_put(tables_kobj);
+ err:
+       return -ENOMEM;
  }
  
  /*
@@@ -571,9 -616,12 +616,9 @@@ static int acpi_system_procfs_init(void
  }
  #endif
  
 -static int __init acpi_system_init(void)
 +int __init acpi_system_init(void)
  {
 -      int result = 0;
 -
 -      if (acpi_disabled)
 -              return 0;
 +      int result;
  
        result = acpi_system_procfs_init();
        if (result)
  
        return result;
  }
 -
 -subsys_initcall(acpi_system_init);