mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge branch 'linus' into release
Conflicts: arch/x86/kernel/acpi/sleep.c Signed-off-by: Len Brown <[email protected]>
This commit is contained in:
commit
02e2407858
6711 changed files with 449251 additions and 224171 deletions
|
|
@ -7,7 +7,6 @@ menuconfig ACPI
|
|||
depends on !IA64_HP_SIM
|
||||
depends on IA64 || X86
|
||||
depends on PCI
|
||||
depends on PM
|
||||
select PNP
|
||||
default y
|
||||
help
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
config ACPI_APEI
|
||||
bool "ACPI Platform Error Interface (APEI)"
|
||||
select PSTORE
|
||||
depends on X86
|
||||
help
|
||||
APEI allows to report errors (for example from the chipset)
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
#include <linux/cper.h>
|
||||
#include <linux/nmi.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/pstore.h>
|
||||
#include <acpi/apei.h>
|
||||
|
||||
#include "apei-internal.h"
|
||||
|
|
@ -928,6 +929,128 @@ static int erst_check_table(struct acpi_table_erst *erst_tab)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static size_t erst_reader(u64 *id, enum pstore_type_id *type,
|
||||
struct timespec *time);
|
||||
static u64 erst_writer(enum pstore_type_id type, size_t size);
|
||||
|
||||
static struct pstore_info erst_info = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "erst",
|
||||
.read = erst_reader,
|
||||
.write = erst_writer,
|
||||
.erase = erst_clear
|
||||
};
|
||||
|
||||
#define CPER_CREATOR_PSTORE \
|
||||
UUID_LE(0x75a574e3, 0x5052, 0x4b29, 0x8a, 0x8e, 0xbe, 0x2c, \
|
||||
0x64, 0x90, 0xb8, 0x9d)
|
||||
#define CPER_SECTION_TYPE_DMESG \
|
||||
UUID_LE(0xc197e04e, 0xd545, 0x4a70, 0x9c, 0x17, 0xa5, 0x54, \
|
||||
0x94, 0x19, 0xeb, 0x12)
|
||||
#define CPER_SECTION_TYPE_MCE \
|
||||
UUID_LE(0xfe08ffbe, 0x95e4, 0x4be7, 0xbc, 0x73, 0x40, 0x96, \
|
||||
0x04, 0x4a, 0x38, 0xfc)
|
||||
|
||||
struct cper_pstore_record {
|
||||
struct cper_record_header hdr;
|
||||
struct cper_section_descriptor sec_hdr;
|
||||
char data[];
|
||||
} __packed;
|
||||
|
||||
static size_t erst_reader(u64 *id, enum pstore_type_id *type,
|
||||
struct timespec *time)
|
||||
{
|
||||
int rc;
|
||||
ssize_t len;
|
||||
unsigned long flags;
|
||||
u64 record_id;
|
||||
struct cper_pstore_record *rcd = (struct cper_pstore_record *)
|
||||
(erst_info.buf - sizeof(*rcd));
|
||||
|
||||
if (erst_disable)
|
||||
return -ENODEV;
|
||||
|
||||
raw_spin_lock_irqsave(&erst_lock, flags);
|
||||
skip:
|
||||
rc = __erst_get_next_record_id(&record_id);
|
||||
if (rc) {
|
||||
raw_spin_unlock_irqrestore(&erst_lock, flags);
|
||||
return rc;
|
||||
}
|
||||
/* no more record */
|
||||
if (record_id == APEI_ERST_INVALID_RECORD_ID) {
|
||||
raw_spin_unlock_irqrestore(&erst_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
len = __erst_read(record_id, &rcd->hdr, sizeof(*rcd) +
|
||||
erst_erange.size);
|
||||
if (uuid_le_cmp(rcd->hdr.creator_id, CPER_CREATOR_PSTORE) != 0)
|
||||
goto skip;
|
||||
raw_spin_unlock_irqrestore(&erst_lock, flags);
|
||||
|
||||
*id = record_id;
|
||||
if (uuid_le_cmp(rcd->sec_hdr.section_type,
|
||||
CPER_SECTION_TYPE_DMESG) == 0)
|
||||
*type = PSTORE_TYPE_DMESG;
|
||||
else if (uuid_le_cmp(rcd->sec_hdr.section_type,
|
||||
CPER_SECTION_TYPE_MCE) == 0)
|
||||
*type = PSTORE_TYPE_MCE;
|
||||
else
|
||||
*type = PSTORE_TYPE_UNKNOWN;
|
||||
|
||||
if (rcd->hdr.validation_bits & CPER_VALID_TIMESTAMP)
|
||||
time->tv_sec = rcd->hdr.timestamp;
|
||||
else
|
||||
time->tv_sec = 0;
|
||||
time->tv_nsec = 0;
|
||||
|
||||
return len - sizeof(*rcd);
|
||||
}
|
||||
|
||||
static u64 erst_writer(enum pstore_type_id type, size_t size)
|
||||
{
|
||||
struct cper_pstore_record *rcd = (struct cper_pstore_record *)
|
||||
(erst_info.buf - sizeof(*rcd));
|
||||
|
||||
memset(rcd, 0, sizeof(*rcd));
|
||||
memcpy(rcd->hdr.signature, CPER_SIG_RECORD, CPER_SIG_SIZE);
|
||||
rcd->hdr.revision = CPER_RECORD_REV;
|
||||
rcd->hdr.signature_end = CPER_SIG_END;
|
||||
rcd->hdr.section_count = 1;
|
||||
rcd->hdr.error_severity = CPER_SEV_FATAL;
|
||||
/* timestamp valid. platform_id, partition_id are invalid */
|
||||
rcd->hdr.validation_bits = CPER_VALID_TIMESTAMP;
|
||||
rcd->hdr.timestamp = get_seconds();
|
||||
rcd->hdr.record_length = sizeof(*rcd) + size;
|
||||
rcd->hdr.creator_id = CPER_CREATOR_PSTORE;
|
||||
rcd->hdr.notification_type = CPER_NOTIFY_MCE;
|
||||
rcd->hdr.record_id = cper_next_record_id();
|
||||
rcd->hdr.flags = CPER_HW_ERROR_FLAGS_PREVERR;
|
||||
|
||||
rcd->sec_hdr.section_offset = sizeof(*rcd);
|
||||
rcd->sec_hdr.section_length = size;
|
||||
rcd->sec_hdr.revision = CPER_SEC_REV;
|
||||
/* fru_id and fru_text is invalid */
|
||||
rcd->sec_hdr.validation_bits = 0;
|
||||
rcd->sec_hdr.flags = CPER_SEC_PRIMARY;
|
||||
switch (type) {
|
||||
case PSTORE_TYPE_DMESG:
|
||||
rcd->sec_hdr.section_type = CPER_SECTION_TYPE_DMESG;
|
||||
break;
|
||||
case PSTORE_TYPE_MCE:
|
||||
rcd->sec_hdr.section_type = CPER_SECTION_TYPE_MCE;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
rcd->sec_hdr.section_severity = CPER_SEV_FATAL;
|
||||
|
||||
erst_write(&rcd->hdr);
|
||||
|
||||
return rcd->hdr.record_id;
|
||||
}
|
||||
|
||||
static int __init erst_init(void)
|
||||
{
|
||||
int rc = 0;
|
||||
|
|
@ -935,6 +1058,7 @@ static int __init erst_init(void)
|
|||
struct apei_exec_context ctx;
|
||||
struct apei_resources erst_resources;
|
||||
struct resource *r;
|
||||
char *buf;
|
||||
|
||||
if (acpi_disabled)
|
||||
goto err;
|
||||
|
|
@ -1001,6 +1125,18 @@ static int __init erst_init(void)
|
|||
if (!erst_erange.vaddr)
|
||||
goto err_release_erange;
|
||||
|
||||
buf = kmalloc(erst_erange.size, GFP_KERNEL);
|
||||
mutex_init(&erst_info.buf_mutex);
|
||||
if (buf) {
|
||||
erst_info.buf = buf + sizeof(struct cper_pstore_record);
|
||||
erst_info.bufsize = erst_erange.size -
|
||||
sizeof(struct cper_pstore_record);
|
||||
if (pstore_register(&erst_info)) {
|
||||
pr_info(ERST_PFX "Could not register with persistent store\n");
|
||||
kfree(buf);
|
||||
}
|
||||
}
|
||||
|
||||
pr_info(ERST_PFX
|
||||
"Error Record Serialization Table (ERST) support is initialized.\n");
|
||||
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@
|
|||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/suspend.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
|
@ -1006,8 +1007,7 @@ struct kobject *acpi_kobj;
|
|||
|
||||
static int __init acpi_init(void)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
int result;
|
||||
|
||||
if (acpi_disabled) {
|
||||
printk(KERN_INFO PREFIX "Interpreter disabled.\n");
|
||||
|
|
@ -1022,29 +1022,18 @@ static int __init acpi_init(void)
|
|||
|
||||
init_acpi_device_notify();
|
||||
result = acpi_bus_init();
|
||||
|
||||
if (!result) {
|
||||
pci_mmcfg_late_init();
|
||||
if (!(pm_flags & PM_APM))
|
||||
pm_flags |= PM_ACPI;
|
||||
else {
|
||||
printk(KERN_INFO PREFIX
|
||||
"APM is already active, exiting\n");
|
||||
disable_acpi();
|
||||
result = -ENODEV;
|
||||
}
|
||||
} else
|
||||
if (result) {
|
||||
disable_acpi();
|
||||
|
||||
if (acpi_disabled)
|
||||
return result;
|
||||
}
|
||||
|
||||
pci_mmcfg_late_init();
|
||||
acpi_scan_init();
|
||||
acpi_ec_init();
|
||||
acpi_debugfs_init();
|
||||
acpi_sleep_proc_init();
|
||||
acpi_wakeup_device_init();
|
||||
return result;
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(acpi_init);
|
||||
|
|
|
|||
|
|
@ -274,7 +274,7 @@ acpi_table_parse_srat(enum acpi_srat_type id,
|
|||
|
||||
int __init acpi_numa_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
int cnt = 0;
|
||||
|
||||
/*
|
||||
* Should not limit number with cpu num that is from NR_CPUS or nr_cpus=
|
||||
|
|
@ -288,7 +288,7 @@ int __init acpi_numa_init(void)
|
|||
acpi_parse_x2apic_affinity, 0);
|
||||
acpi_table_parse_srat(ACPI_SRAT_TYPE_CPU_AFFINITY,
|
||||
acpi_parse_processor_affinity, 0);
|
||||
ret = acpi_table_parse_srat(ACPI_SRAT_TYPE_MEMORY_AFFINITY,
|
||||
cnt = acpi_table_parse_srat(ACPI_SRAT_TYPE_MEMORY_AFFINITY,
|
||||
acpi_parse_memory_affinity,
|
||||
NR_NODE_MEMBLKS);
|
||||
}
|
||||
|
|
@ -297,7 +297,10 @@ int __init acpi_numa_init(void)
|
|||
acpi_table_parse(ACPI_SIG_SLIT, acpi_parse_slit);
|
||||
|
||||
acpi_numa_arch_fixup();
|
||||
return ret;
|
||||
|
||||
if (cnt <= 0)
|
||||
return cnt ?: -ENOENT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int acpi_get_pxm(acpi_handle h)
|
||||
|
|
|
|||
|
|
@ -1608,9 +1608,9 @@ acpi_status __init acpi_os_initialize(void)
|
|||
|
||||
acpi_status __init acpi_os_initialize1(void)
|
||||
{
|
||||
kacpid_wq = create_workqueue("kacpid");
|
||||
kacpi_notify_wq = create_workqueue("kacpi_notify");
|
||||
kacpi_hotplug_wq = create_workqueue("kacpi_hotplug");
|
||||
kacpid_wq = alloc_workqueue("kacpid", 0, 1);
|
||||
kacpi_notify_wq = alloc_workqueue("kacpi_notify", 0, 1);
|
||||
kacpi_hotplug_wq = alloc_workqueue("kacpi_hotplug", 0, 1);
|
||||
BUG_ON(!kacpid_wq);
|
||||
BUG_ON(!kacpi_notify_wq);
|
||||
BUG_ON(!kacpi_hotplug_wq);
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/device.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/acpi.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
|
|
@ -567,7 +568,7 @@ int acpi_suspend(u32 acpi_state)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_OPS
|
||||
#ifdef CONFIG_PM
|
||||
/**
|
||||
* acpi_pm_device_sleep_state - return preferred power state of ACPI device
|
||||
* in the system sleep state given by %acpi_target_sleep_state
|
||||
|
|
@ -653,7 +654,7 @@ int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p)
|
|||
*d_min_p = d_min;
|
||||
return d_max;
|
||||
}
|
||||
#endif /* CONFIG_PM_OPS */
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -782,6 +782,9 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
|
|||
|
||||
if (acpi_video_backlight_support()) {
|
||||
struct backlight_properties props;
|
||||
struct pci_dev *pdev;
|
||||
acpi_handle acpi_parent;
|
||||
struct device *parent = NULL;
|
||||
int result;
|
||||
static int count = 0;
|
||||
char *name;
|
||||
|
|
@ -794,9 +797,20 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
|
|||
return;
|
||||
count++;
|
||||
|
||||
acpi_get_parent(device->dev->handle, &acpi_parent);
|
||||
|
||||
pdev = acpi_get_pci_dev(acpi_parent);
|
||||
if (pdev) {
|
||||
parent = &pdev->dev;
|
||||
pci_dev_put(pdev);
|
||||
}
|
||||
|
||||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
props.type = BACKLIGHT_FIRMWARE;
|
||||
props.max_brightness = device->brightness->count - 3;
|
||||
device->backlight = backlight_device_register(name, NULL, device,
|
||||
device->backlight = backlight_device_register(name,
|
||||
parent,
|
||||
device,
|
||||
&acpi_backlight_ops,
|
||||
&props);
|
||||
kfree(name);
|
||||
|
|
|
|||
Loading…
Reference in a new issue