Merge branch 'pm-cpufreq'
[firefly-linux-kernel-4.4.55.git] / drivers / acpi / osl.c
index e8baa408faef7cb417426444d9d9c4f7c116c25f..e5f416c7f66e9e92e1ed988c3a709bc2820d56f4 100644 (file)
@@ -52,6 +52,7 @@
 #include <acpi/acpi.h>
 #include <acpi/acpi_bus.h>
 #include <acpi/processor.h>
+#include "internal.h"
 
 #define _COMPONENT             ACPI_OS_SERVICES
 ACPI_MODULE_NAME("osl");
@@ -79,6 +80,8 @@ extern char line_buf[80];
 
 static int (*__acpi_os_prepare_sleep)(u8 sleep_state, u32 pm1a_ctrl,
                                      u32 pm1b_ctrl);
+static int (*__acpi_os_prepare_extended_sleep)(u8 sleep_state, u32 val_a,
+                                     u32 val_b);
 
 static acpi_osd_handler acpi_irq_handler;
 static void *acpi_irq_context;
@@ -564,10 +567,6 @@ static const char * const table_sigs[] = {
        ACPI_SIG_WDRT, ACPI_SIG_DSDT, ACPI_SIG_FADT, ACPI_SIG_PSDT,
        ACPI_SIG_RSDT, ACPI_SIG_XSDT, ACPI_SIG_SSDT, NULL };
 
-/* Non-fatal errors: Affected tables/files are ignored */
-#define INVALID_TABLE(x, path, name)                                   \
-       { pr_err("ACPI OVERRIDE: " x " [%s%s]\n", path, name); continue; }
-
 #define ACPI_HEADER_SIZE sizeof(struct acpi_table_header)
 
 /* Must not increase 10 or needs code modification below */
@@ -594,9 +593,11 @@ void __init acpi_initrd_override(void *data, size_t size)
                data += offset;
                size -= offset;
 
-               if (file.size < sizeof(struct acpi_table_header))
-                       INVALID_TABLE("Table smaller than ACPI header",
-                                     cpio_path, file.name);
+               if (file.size < sizeof(struct acpi_table_header)) {
+                       pr_err("ACPI OVERRIDE: Table smaller than ACPI header [%s%s]\n",
+                               cpio_path, file.name);
+                       continue;
+               }
 
                table = file.data;
 
@@ -604,15 +605,21 @@ void __init acpi_initrd_override(void *data, size_t size)
                        if (!memcmp(table->signature, table_sigs[sig], 4))
                                break;
 
-               if (!table_sigs[sig])
-                       INVALID_TABLE("Unknown signature",
-                                     cpio_path, file.name);
-               if (file.size != table->length)
-                       INVALID_TABLE("File length does not match table length",
-                                     cpio_path, file.name);
-               if (acpi_table_checksum(file.data, table->length))
-                       INVALID_TABLE("Bad table checksum",
-                                     cpio_path, file.name);
+               if (!table_sigs[sig]) {
+                       pr_err("ACPI OVERRIDE: Unknown signature [%s%s]\n",
+                               cpio_path, file.name);
+                       continue;
+               }
+               if (file.size != table->length) {
+                       pr_err("ACPI OVERRIDE: File length does not match table length [%s%s]\n",
+                               cpio_path, file.name);
+                       continue;
+               }
+               if (acpi_table_checksum(file.data, table->length)) {
+                       pr_err("ACPI OVERRIDE: Bad table checksum [%s%s]\n",
+                               cpio_path, file.name);
+                       continue;
+               }
 
                pr_info("%4.4s ACPI table found in initrd [%s%s][0x%x]\n",
                        table->signature, cpio_path, file.name, table->length);
@@ -1352,8 +1359,8 @@ struct osi_setup_entry {
        bool enable;
 };
 
-static struct osi_setup_entry __initdata
-               osi_setup_entries[OSI_STRING_ENTRIES_MAX] = {
+static struct osi_setup_entry
+               osi_setup_entries[OSI_STRING_ENTRIES_MAX] __initdata = {
        {"Module Device", true},
        {"Processor Device", true},
        {"3.0 _SCP Extensions", true},
@@ -1380,6 +1387,13 @@ void __init acpi_osi_setup(char *str)
                if (*str == '\0') {
                        osi_linux.default_disabling = 1;
                        return;
+               } else if (*str == '*') {
+                       acpi_update_interfaces(ACPI_DISABLE_ALL_STRINGS);
+                       for (i = 0; i < OSI_STRING_ENTRIES_MAX; i++) {
+                               osi = &osi_setup_entries[i];
+                               osi->enable = false;
+                       }
+                       return;
                }
                enable = false;
        }
@@ -1791,6 +1805,28 @@ void acpi_os_set_prepare_sleep(int (*func)(u8 sleep_state,
        __acpi_os_prepare_sleep = func;
 }
 
+acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state, u32 val_a,
+                                 u32 val_b)
+{
+       int rc = 0;
+       if (__acpi_os_prepare_extended_sleep)
+               rc = __acpi_os_prepare_extended_sleep(sleep_state,
+                                            val_a, val_b);
+       if (rc < 0)
+               return AE_ERROR;
+       else if (rc > 0)
+               return AE_CTRL_SKIP;
+
+       return AE_OK;
+}
+
+void acpi_os_set_prepare_extended_sleep(int (*func)(u8 sleep_state,
+                              u32 val_a, u32 val_b))
+{
+       __acpi_os_prepare_extended_sleep = func;
+}
+
+
 void alloc_acpi_hp_work(acpi_handle handle, u32 type, void *context,
                        void (*func)(struct work_struct *work))
 {