mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
Merge branches 'acpi-bus', 'acpi-pci', 'acpica' and 'acpi-doc'
* acpi-bus: ACPI / bus: Support for platform initiated graceful shutdown ACPI / bus: Correct the comments about acpi_subsystem_init() ACPI / bus: Use acpi_handle_debug() in acpi_print_osc_error() * acpi-pci: ACPI / PCI: make pci_slot explicitly non-modular ACPI / PCI: pci_slot: Use generic pr_debug utility ACPI / PCI: pci_slot: Use more common logging style * acpica: ACPICA: Linux: Enable ACPI_MUTEX_DEBUG for Linux kernel * acpi-doc: ACPI / debugger: Add AML debugger documentation ACPI: Add documentation describing ACPICA release automation
This commit is contained in:
commit
25474279e8
5 changed files with 407 additions and 44 deletions
|
|
@ -30,6 +30,9 @@
|
|||
#include <linux/acpi.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/delay.h>
|
||||
#ifdef CONFIG_X86
|
||||
#include <asm/mpspec.h>
|
||||
#endif
|
||||
|
|
@ -174,22 +177,17 @@ void acpi_bus_detach_private_data(acpi_handle handle)
|
|||
EXPORT_SYMBOL_GPL(acpi_bus_detach_private_data);
|
||||
|
||||
static void acpi_print_osc_error(acpi_handle handle,
|
||||
struct acpi_osc_context *context, char *error)
|
||||
struct acpi_osc_context *context, char *error)
|
||||
{
|
||||
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER};
|
||||
int i;
|
||||
|
||||
if (ACPI_FAILURE(acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer)))
|
||||
printk(KERN_DEBUG "%s: %s\n", context->uuid_str, error);
|
||||
else {
|
||||
printk(KERN_DEBUG "%s (%s): %s\n",
|
||||
(char *)buffer.pointer, context->uuid_str, error);
|
||||
kfree(buffer.pointer);
|
||||
}
|
||||
printk(KERN_DEBUG "_OSC request data:");
|
||||
acpi_handle_debug(handle, "(%s): %s\n", context->uuid_str, error);
|
||||
|
||||
pr_debug("_OSC request data:");
|
||||
for (i = 0; i < context->cap.length; i += sizeof(u32))
|
||||
printk(" %x", *((u32 *)(context->cap.pointer + i)));
|
||||
printk("\n");
|
||||
pr_debug(" %x", *((u32 *)(context->cap.pointer + i)));
|
||||
|
||||
pr_debug("\n");
|
||||
}
|
||||
|
||||
acpi_status acpi_str_to_uuid(char *str, u8 *uuid)
|
||||
|
|
@ -475,6 +473,56 @@ static void acpi_device_remove_notify_handler(struct acpi_device *device)
|
|||
acpi_device_notify);
|
||||
}
|
||||
|
||||
/* Handle events targeting \_SB device (at present only graceful shutdown) */
|
||||
|
||||
#define ACPI_SB_NOTIFY_SHUTDOWN_REQUEST 0x81
|
||||
#define ACPI_SB_INDICATE_INTERVAL 10000
|
||||
|
||||
static void sb_notify_work(struct work_struct *dummy)
|
||||
{
|
||||
acpi_handle sb_handle;
|
||||
|
||||
orderly_poweroff(true);
|
||||
|
||||
/*
|
||||
* After initiating graceful shutdown, the ACPI spec requires OSPM
|
||||
* to evaluate _OST method once every 10seconds to indicate that
|
||||
* the shutdown is in progress
|
||||
*/
|
||||
acpi_get_handle(NULL, "\\_SB", &sb_handle);
|
||||
while (1) {
|
||||
pr_info("Graceful shutdown in progress.\n");
|
||||
acpi_evaluate_ost(sb_handle, ACPI_OST_EC_OSPM_SHUTDOWN,
|
||||
ACPI_OST_SC_OS_SHUTDOWN_IN_PROGRESS, NULL);
|
||||
msleep(ACPI_SB_INDICATE_INTERVAL);
|
||||
}
|
||||
}
|
||||
|
||||
static void acpi_sb_notify(acpi_handle handle, u32 event, void *data)
|
||||
{
|
||||
static DECLARE_WORK(acpi_sb_work, sb_notify_work);
|
||||
|
||||
if (event == ACPI_SB_NOTIFY_SHUTDOWN_REQUEST) {
|
||||
if (!work_busy(&acpi_sb_work))
|
||||
schedule_work(&acpi_sb_work);
|
||||
} else
|
||||
pr_warn("event %x is not supported by \\_SB device\n", event);
|
||||
}
|
||||
|
||||
static int __init acpi_setup_sb_notify_handler(void)
|
||||
{
|
||||
acpi_handle sb_handle;
|
||||
|
||||
if (ACPI_FAILURE(acpi_get_handle(NULL, "\\_SB", &sb_handle)))
|
||||
return -ENXIO;
|
||||
|
||||
if (ACPI_FAILURE(acpi_install_notify_handler(sb_handle, ACPI_DEVICE_NOTIFY,
|
||||
acpi_sb_notify, NULL)))
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Device Matching
|
||||
-------------------------------------------------------------------------- */
|
||||
|
|
@ -961,8 +1009,7 @@ void __init acpi_early_init(void)
|
|||
/**
|
||||
* acpi_subsystem_init - Finalize the early initialization of ACPI.
|
||||
*
|
||||
* Switch over the platform to the ACPI mode (if possible), initialize the
|
||||
* handling of ACPI events, install the interrupt and global lock handlers.
|
||||
* Switch over the platform to the ACPI mode (if possible).
|
||||
*
|
||||
* Doing this too early is generally unsafe, but at the same time it needs to be
|
||||
* done before all things that really depend on ACPI. The right spot appears to
|
||||
|
|
@ -1133,6 +1180,7 @@ static int __init acpi_init(void)
|
|||
acpi_sleep_proc_init();
|
||||
acpi_wakeup_device_init();
|
||||
acpi_debugger_init();
|
||||
acpi_setup_sb_notify_handler();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,8 +22,9 @@
|
|||
* General Public License for more details.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
|
|
@ -33,30 +34,11 @@
|
|||
#include <linux/dmi.h>
|
||||
#include <linux/pci-acpi.h>
|
||||
|
||||
static bool debug;
|
||||
static int check_sta_before_sun;
|
||||
|
||||
#define DRIVER_VERSION "0.1"
|
||||
#define DRIVER_AUTHOR "Alex Chiang <[email protected]>"
|
||||
#define DRIVER_DESC "ACPI PCI Slot Detection Driver"
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_PARM_DESC(debug, "Debugging mode enabled or not");
|
||||
module_param(debug, bool, 0644);
|
||||
|
||||
#define _COMPONENT ACPI_PCI_COMPONENT
|
||||
ACPI_MODULE_NAME("pci_slot");
|
||||
|
||||
#define MY_NAME "pci_slot"
|
||||
#define err(format, arg...) pr_err("%s: " format , MY_NAME , ## arg)
|
||||
#define info(format, arg...) pr_info("%s: " format , MY_NAME , ## arg)
|
||||
#define dbg(format, arg...) \
|
||||
do { \
|
||||
if (debug) \
|
||||
pr_debug("%s: " format, MY_NAME , ## arg); \
|
||||
} while (0)
|
||||
|
||||
#define SLOT_NAME_SIZE 21 /* Inspired by #define in acpiphp.h */
|
||||
|
||||
struct acpi_pci_slot {
|
||||
|
|
@ -76,7 +58,7 @@ check_slot(acpi_handle handle, unsigned long long *sun)
|
|||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
|
||||
acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
|
||||
dbg("Checking slot on path: %s\n", (char *)buffer.pointer);
|
||||
pr_debug("Checking slot on path: %s\n", (char *)buffer.pointer);
|
||||
|
||||
if (check_sta_before_sun) {
|
||||
/* If SxFy doesn't have _STA, we just assume it's there */
|
||||
|
|
@ -87,14 +69,16 @@ check_slot(acpi_handle handle, unsigned long long *sun)
|
|||
|
||||
status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
dbg("_ADR returned %d on %s\n", status, (char *)buffer.pointer);
|
||||
pr_debug("_ADR returned %d on %s\n",
|
||||
status, (char *)buffer.pointer);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* No _SUN == not a slot == bail */
|
||||
status = acpi_evaluate_integer(handle, "_SUN", NULL, sun);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
dbg("_SUN returned %d on %s\n", status, (char *)buffer.pointer);
|
||||
pr_debug("_SUN returned %d on %s\n",
|
||||
status, (char *)buffer.pointer);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
@ -132,15 +116,13 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
|
|||
}
|
||||
|
||||
slot = kmalloc(sizeof(*slot), GFP_KERNEL);
|
||||
if (!slot) {
|
||||
err("%s: cannot allocate memory\n", __func__);
|
||||
if (!slot)
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
snprintf(name, sizeof(name), "%llu", sun);
|
||||
pci_slot = pci_create_slot(pci_bus, device, name, NULL);
|
||||
if (IS_ERR(pci_slot)) {
|
||||
err("pci_create_slot returned %ld\n", PTR_ERR(pci_slot));
|
||||
pr_err("pci_create_slot returned %ld\n", PTR_ERR(pci_slot));
|
||||
kfree(slot);
|
||||
return AE_OK;
|
||||
}
|
||||
|
|
@ -150,8 +132,8 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
|
|||
|
||||
get_device(&pci_bus->dev);
|
||||
|
||||
dbg("pci_slot: %p, pci_bus: %x, device: %d, name: %s\n",
|
||||
pci_slot, pci_bus->number, device, name);
|
||||
pr_debug("%p, pci_bus: %x, device: %d, name: %s\n",
|
||||
pci_slot, pci_bus->number, device, name);
|
||||
|
||||
return AE_OK;
|
||||
}
|
||||
|
|
@ -186,7 +168,8 @@ void acpi_pci_slot_remove(struct pci_bus *bus)
|
|||
|
||||
static int do_sta_before_sun(const struct dmi_system_id *d)
|
||||
{
|
||||
info("%s detected: will evaluate _STA before calling _SUN\n", d->ident);
|
||||
pr_info("%s detected: will evaluate _STA before calling _SUN\n",
|
||||
d->ident);
|
||||
check_sta_before_sun = 1;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue