Commit 047f61c5 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6

* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6: (42 commits)
  ACPI: minor printk format change in acpi_pad
  ACPI: make acpi_pad /sys output more readable
  ACPICA: Update version to 20110316
  ACPICA: Header support for SLIC table
  ACPI: Make sure the FADT is at least rev 2 before using the reset register
  ACPI: Bug compatibility for Windows on the ACPI reboot vector
  ACPICA: Fix access width for reset vector
  ACPI battery: fribble sysfs files from a resume notifier
  ACPI button: remove unused procfs I/F
  ACPI, APEI, Add PCIe AER error information printing support
  PCIe, AER, use pre-generated prefix in error information printing
  ACPI, APEI, Add ERST record ID cache
  ACPI: Use syscore_ops instead of sysdev class and sysdev
  ACPI: Remove the unused EC sysdev class
  ACPI: use __cpuinit for the acpi_processor_set_pdc() call tree
  ACPI: use __init where possible in processor driver
  Thermal_Framework-Fix_crash_during_hwmon_unregister
  ACPICA: Update version to 20110211.
  ACPICA: Add mechanism to defer _REG methods for some installed handlers
  ACPICA: Add support for FunctionalFixedHW in acpi_ut_get_region_name
  ...
parents 05061bf6 3d26678e
...@@ -92,6 +92,11 @@ vendor_id: <integer>, device_id: <integer> ...@@ -92,6 +92,11 @@ vendor_id: <integer>, device_id: <integer>
class_code: <integer>] class_code: <integer>]
[serial number: <integer>, <integer>] [serial number: <integer>, <integer>]
[bridge: secondary_status: <integer>, control: <integer>] [bridge: secondary_status: <integer>, control: <integer>]
[aer_status: <integer>, aer_mask: <integer>
<aer status string>
[aer_uncor_severity: <integer>]
aer_layer=<aer layer string>, aer_agent=<aer agent string>
aer_tlp_header: <integer> <integer> <integer> <integer>]
<pcie port type string>* := PCIe end point | legacy PCI end point | \ <pcie port type string>* := PCIe end point | legacy PCI end point | \
unknown | unknown | root port | upstream switch port | \ unknown | unknown | root port | upstream switch port | \
...@@ -99,6 +104,26 @@ downstream switch port | PCIe to PCI/PCI-X bridge | \ ...@@ -99,6 +104,26 @@ downstream switch port | PCIe to PCI/PCI-X bridge | \
PCI/PCI-X to PCIe bridge | root complex integrated endpoint device | \ PCI/PCI-X to PCIe bridge | root complex integrated endpoint device | \
root complex event collector root complex event collector
if section severity is fatal or recoverable
<aer status string># :=
unknown | unknown | unknown | unknown | Data Link Protocol | \
unknown | unknown | unknown | unknown | unknown | unknown | unknown | \
Poisoned TLP | Flow Control Protocol | Completion Timeout | \
Completer Abort | Unexpected Completion | Receiver Overflow | \
Malformed TLP | ECRC | Unsupported Request
else
<aer status string># :=
Receiver Error | unknown | unknown | unknown | unknown | unknown | \
Bad TLP | Bad DLLP | RELAY_NUM Rollover | unknown | unknown | unknown | \
Replay Timer Timeout | Advisory Non-Fatal
fi
<aer layer string> :=
Physical Layer | Data Link Layer | Transaction Layer
<aer agent string> :=
Receiver ID | Requester ID | Completer ID | Transmitter ID
Where, [] designate corresponding content is optional Where, [] designate corresponding content is optional
All <field string> description with * has the following format: All <field string> description with * has the following format:
......
...@@ -270,14 +270,6 @@ Who: Zhang Rui <rui.zhang@intel.com> ...@@ -270,14 +270,6 @@ Who: Zhang Rui <rui.zhang@intel.com>
--------------------------- ---------------------------
What: /proc/acpi/button
When: August 2007
Why: /proc/acpi/button has been replaced by events to the input layer
since 2.6.20.
Who: Len Brown <len.brown@intel.com>
---------------------------
What: /proc/acpi/event What: /proc/acpi/event
When: February 2008 When: February 2008
Why: /proc/acpi/event has been replaced by events via the input layer Why: /proc/acpi/event has been replaced by events via the input layer
......
...@@ -128,9 +128,9 @@ static inline const char *acpi_get_sysname (void) ...@@ -128,9 +128,9 @@ static inline const char *acpi_get_sysname (void)
int acpi_request_vector (u32 int_type); int acpi_request_vector (u32 int_type);
int acpi_gsi_to_irq (u32 gsi, unsigned int *irq); int acpi_gsi_to_irq (u32 gsi, unsigned int *irq);
/* routines for saving/restoring kernel state */ /* Low-level suspend routine. */
extern int acpi_save_state_mem(void); extern int acpi_suspend_lowlevel(void);
extern void acpi_restore_state_mem(void);
extern unsigned long acpi_wakeup_address; extern unsigned long acpi_wakeup_address;
/* /*
......
...@@ -803,7 +803,7 @@ int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi) ...@@ -803,7 +803,7 @@ int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi)
* ACPI based hotplug CPU support * ACPI based hotplug CPU support
*/ */
#ifdef CONFIG_ACPI_HOTPLUG_CPU #ifdef CONFIG_ACPI_HOTPLUG_CPU
static static __cpuinit
int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
{ {
#ifdef CONFIG_ACPI_NUMA #ifdef CONFIG_ACPI_NUMA
...@@ -878,7 +878,7 @@ __init void prefill_possible_map(void) ...@@ -878,7 +878,7 @@ __init void prefill_possible_map(void)
set_cpu_possible(i, true); set_cpu_possible(i, true);
} }
int acpi_map_lsapic(acpi_handle handle, int *pcpu) static int __cpuinit _acpi_map_lsapic(acpi_handle handle, int *pcpu)
{ {
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
union acpi_object *obj; union acpi_object *obj;
...@@ -929,6 +929,11 @@ int acpi_map_lsapic(acpi_handle handle, int *pcpu) ...@@ -929,6 +929,11 @@ int acpi_map_lsapic(acpi_handle handle, int *pcpu)
return (0); return (0);
} }
/* wrapper to silence section mismatch warning */
int __ref acpi_map_lsapic(acpi_handle handle, int *pcpu)
{
return _acpi_map_lsapic(handle, pcpu);
}
EXPORT_SYMBOL(acpi_map_lsapic); EXPORT_SYMBOL(acpi_map_lsapic);
int acpi_unmap_lsapic(int cpu) int acpi_unmap_lsapic(int cpu)
...@@ -1034,18 +1039,8 @@ int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base) ...@@ -1034,18 +1039,8 @@ int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base)
EXPORT_SYMBOL(acpi_unregister_ioapic); EXPORT_SYMBOL(acpi_unregister_ioapic);
/* /*
* acpi_save_state_mem() - save kernel state * acpi_suspend_lowlevel() - save kernel state and suspend.
* *
* TBD when when IA64 starts to support suspend... * TBD when when IA64 starts to support suspend...
*/ */
int acpi_save_state_mem(void) { return 0; } int acpi_suspend_lowlevel(void) { return 0; }
/*
* acpi_restore_state()
*/
void acpi_restore_state_mem(void) {}
/*
* do_suspend_lowlevel()
*/
void do_suspend_lowlevel(void) {}
...@@ -114,9 +114,8 @@ static inline void acpi_disable_pci(void) ...@@ -114,9 +114,8 @@ static inline void acpi_disable_pci(void)
acpi_noirq_set(); acpi_noirq_set();
} }
/* routines for saving/restoring kernel state */ /* Low-level suspend routine. */
extern int acpi_save_state_mem(void); extern int acpi_suspend_lowlevel(void);
extern void acpi_restore_state_mem(void);
extern const unsigned char acpi_wakeup_code[]; extern const unsigned char acpi_wakeup_code[];
#define acpi_wakeup_address (__pa(TRAMPOLINE_SYM(acpi_wakeup_code))) #define acpi_wakeup_address (__pa(TRAMPOLINE_SYM(acpi_wakeup_code)))
......
...@@ -25,12 +25,12 @@ static char temp_stack[4096]; ...@@ -25,12 +25,12 @@ static char temp_stack[4096];
#endif #endif
/** /**
* acpi_save_state_mem - save kernel state * acpi_suspend_lowlevel - save kernel state
* *
* Create an identity mapped page table and copy the wakeup routine to * Create an identity mapped page table and copy the wakeup routine to
* low memory. * low memory.
*/ */
int acpi_save_state_mem(void) int acpi_suspend_lowlevel(void)
{ {
struct wakeup_header *header; struct wakeup_header *header;
/* address in low memory of the wakeup routine. */ /* address in low memory of the wakeup routine. */
...@@ -96,16 +96,10 @@ int acpi_save_state_mem(void) ...@@ -96,16 +96,10 @@ int acpi_save_state_mem(void)
saved_magic = 0x123456789abcdef0L; saved_magic = 0x123456789abcdef0L;
#endif /* CONFIG_64BIT */ #endif /* CONFIG_64BIT */
do_suspend_lowlevel();
return 0; return 0;
} }
/*
* acpi_restore_state - undo effects of acpi_save_state_mem
*/
void acpi_restore_state_mem(void)
{
}
static int __init acpi_sleep_setup(char *str) static int __init acpi_sleep_setup(char *str)
{ {
while ((str != NULL) && (*str != '\0')) { while ((str != NULL) && (*str != '\0')) {
......
...@@ -11,3 +11,5 @@ extern int wakeup_pmode_return; ...@@ -11,3 +11,5 @@ extern int wakeup_pmode_return;
extern unsigned long acpi_copy_wakeup_routine(unsigned long); extern unsigned long acpi_copy_wakeup_routine(unsigned long);
extern void wakeup_long64(void); extern void wakeup_long64(void);
extern void do_suspend_lowlevel(void);
...@@ -106,24 +106,34 @@ int apei_write_mce(struct mce *m) ...@@ -106,24 +106,34 @@ int apei_write_mce(struct mce *m)
ssize_t apei_read_mce(struct mce *m, u64 *record_id) ssize_t apei_read_mce(struct mce *m, u64 *record_id)
{ {
struct cper_mce_record rcd; struct cper_mce_record rcd;
ssize_t len; int rc, pos;
len = erst_read_next(&rcd.hdr, sizeof(rcd)); rc = erst_get_record_id_begin(&pos);
if (len <= 0) if (rc)
return len; return rc;
/* Can not skip other records in storage via ERST unless clear them */ retry:
else if (len != sizeof(rcd) || rc = erst_get_record_id_next(&pos, record_id);
uuid_le_cmp(rcd.hdr.creator_id, CPER_CREATOR_MCE)) { if (rc)
if (printk_ratelimit()) goto out;
pr_warning( /* no more record */
"MCE-APEI: Can not skip the unknown record in ERST"); if (*record_id == APEI_ERST_INVALID_RECORD_ID)
return -EIO; goto out;
} rc = erst_read(*record_id, &rcd.hdr, sizeof(rcd));
/* someone else has cleared the record, try next one */
if (rc == -ENOENT)
goto retry;
else if (rc < 0)
goto out;
/* try to skip other type records in storage */
else if (rc != sizeof(rcd) ||
uuid_le_cmp(rcd.hdr.creator_id, CPER_CREATOR_MCE))
goto retry;
memcpy(m, &rcd.mce, sizeof(*m)); memcpy(m, &rcd.mce, sizeof(*m));
*record_id = rcd.hdr.record_id; rc = sizeof(*m);
out:
erst_get_record_id_end();
return sizeof(*m); return rc;
} }
/* Check whether there is record in ERST */ /* Check whether there is record in ERST */
......
...@@ -298,7 +298,7 @@ static ssize_t acpi_pad_rrtime_store(struct device *dev, ...@@ -298,7 +298,7 @@ static ssize_t acpi_pad_rrtime_store(struct device *dev,
static ssize_t acpi_pad_rrtime_show(struct device *dev, static ssize_t acpi_pad_rrtime_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
return scnprintf(buf, PAGE_SIZE, "%d", round_robin_time); return scnprintf(buf, PAGE_SIZE, "%d\n", round_robin_time);
} }
static DEVICE_ATTR(rrtime, S_IRUGO|S_IWUSR, static DEVICE_ATTR(rrtime, S_IRUGO|S_IWUSR,
acpi_pad_rrtime_show, acpi_pad_rrtime_show,
...@@ -321,7 +321,7 @@ static ssize_t acpi_pad_idlepct_store(struct device *dev, ...@@ -321,7 +321,7 @@ static ssize_t acpi_pad_idlepct_store(struct device *dev,
static ssize_t acpi_pad_idlepct_show(struct device *dev, static ssize_t acpi_pad_idlepct_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
return scnprintf(buf, PAGE_SIZE, "%d", idle_pct); return scnprintf(buf, PAGE_SIZE, "%d\n", idle_pct);
} }
static DEVICE_ATTR(idlepct, S_IRUGO|S_IWUSR, static DEVICE_ATTR(idlepct, S_IRUGO|S_IWUSR,
acpi_pad_idlepct_show, acpi_pad_idlepct_show,
...@@ -342,8 +342,11 @@ static ssize_t acpi_pad_idlecpus_store(struct device *dev, ...@@ -342,8 +342,11 @@ static ssize_t acpi_pad_idlecpus_store(struct device *dev,
static ssize_t acpi_pad_idlecpus_show(struct device *dev, static ssize_t acpi_pad_idlecpus_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
return cpumask_scnprintf(buf, PAGE_SIZE, int n = 0;
to_cpumask(pad_busy_cpus_bits)); n = cpumask_scnprintf(buf, PAGE_SIZE-2, to_cpumask(pad_busy_cpus_bits));
buf[n++] = '\n';
buf[n] = '\0';
return n;
} }
static DEVICE_ATTR(idlecpus, S_IRUGO|S_IWUSR, static DEVICE_ATTR(idlecpus, S_IRUGO|S_IWUSR,
acpi_pad_idlecpus_show, acpi_pad_idlecpus_show,
...@@ -453,7 +456,7 @@ static void acpi_pad_notify(acpi_handle handle, u32 event, ...@@ -453,7 +456,7 @@ static void acpi_pad_notify(acpi_handle handle, u32 event,
dev_name(&device->dev), event, 0); dev_name(&device->dev), event, 0);
break; break;
default: default:
printk(KERN_WARNING"Unsupported event [0x%x]\n", event); printk(KERN_WARNING "Unsupported event [0x%x]\n", event);
break; break;
} }
} }
......
...@@ -10,7 +10,7 @@ obj-y += acpi.o ...@@ -10,7 +10,7 @@ obj-y += acpi.o
acpi-y := dsfield.o dsmthdat.o dsopcode.o dswexec.o dswscope.o \ acpi-y := dsfield.o dsmthdat.o dsopcode.o dswexec.o dswscope.o \
dsmethod.o dsobject.o dsutils.o dswload.o dswstate.o \ dsmethod.o dsobject.o dsutils.o dswload.o dswstate.o \
dsinit.o dsinit.o dsargs.o dscontrol.o dswload2.o
acpi-y += evevent.o evregion.o evsci.o evxfevnt.o \ acpi-y += evevent.o evregion.o evsci.o evxfevnt.o \
evmisc.o evrgnini.o evxface.o evxfregn.o \ evmisc.o evrgnini.o evxface.o evxfregn.o \
...@@ -45,4 +45,4 @@ acpi-y += tbxface.o tbinstal.o tbutils.o tbfind.o tbfadt.o tbxfroot.o ...@@ -45,4 +45,4 @@ acpi-y += tbxface.o tbinstal.o tbutils.o tbfind.o tbfadt.o tbxfroot.o
acpi-y += utalloc.o utdebug.o uteval.o utinit.o utmisc.o utxface.o \ acpi-y += utalloc.o utdebug.o uteval.o utinit.o utmisc.o utxface.o \
utcopy.o utdelete.o utglobal.o utmath.o utobject.o \ utcopy.o utdelete.o utglobal.o utmath.o utobject.o \
utstate.o utmutex.o utobject.o utresrc.o utlock.o utids.o \ utstate.o utmutex.o utobject.o utresrc.o utlock.o utids.o \
utosi.o utxferror.o utosi.o utxferror.o utdecode.o
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
#define NAMEOF_ARG_NTE "__A0" #define NAMEOF_ARG_NTE "__A0"
/* /*
* dsopcode - support for late evaluation * dsargs - execution of dynamic arguments for static objects
*/ */
acpi_status acpi_status
acpi_ds_get_buffer_field_arguments(union acpi_operand_object *obj_desc); acpi_ds_get_buffer_field_arguments(union acpi_operand_object *obj_desc);
...@@ -62,6 +62,20 @@ acpi_status acpi_ds_get_buffer_arguments(union acpi_operand_object *obj_desc); ...@@ -62,6 +62,20 @@ acpi_status acpi_ds_get_buffer_arguments(union acpi_operand_object *obj_desc);
acpi_status acpi_ds_get_package_arguments(union acpi_operand_object *obj_desc); acpi_status acpi_ds_get_package_arguments(union acpi_operand_object *obj_desc);
/*
* dscontrol - support for execution control opcodes
*/
acpi_status
acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state,
union acpi_parse_object *op);
acpi_status
acpi_ds_exec_end_control_op(struct acpi_walk_state *walk_state,
union acpi_parse_object *op);
/*
* dsopcode - support for late operand evaluation
*/
acpi_status acpi_status
acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state, acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state,
union acpi_parse_object *op); union acpi_parse_object *op);
...@@ -85,17 +99,6 @@ acpi_ds_eval_bank_field_operands(struct acpi_walk_state *walk_state, ...@@ -85,17 +99,6 @@ acpi_ds_eval_bank_field_operands(struct acpi_walk_state *walk_state,
acpi_status acpi_ds_initialize_region(acpi_handle obj_handle); acpi_status acpi_ds_initialize_region(acpi_handle obj_handle);
/*
* dsctrl - Parser/Interpreter interface, control stack routines
*/
acpi_status
acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state,
union acpi_parse_object *op);
acpi_status
acpi_ds_exec_end_control_op(struct acpi_walk_state *walk_state,
union acpi_parse_object *op);
/* /*
* dsexec - Parser/Interpreter interface, method execution callbacks * dsexec - Parser/Interpreter interface, method execution callbacks
*/ */
...@@ -136,23 +139,26 @@ acpi_ds_init_field_objects(union acpi_parse_object *op, ...@@ -136,23 +139,26 @@ acpi_ds_init_field_objects(union acpi_parse_object *op,
struct acpi_walk_state *walk_state); struct acpi_walk_state *walk_state);
/* /*
* dsload - Parser/Interpreter interface, namespace load callbacks * dsload - Parser/Interpreter interface, pass 1 namespace load callbacks
*/ */
acpi_status
acpi_ds_init_callbacks(struct acpi_walk_state *walk_state, u32 pass_number);
acpi_status acpi_status
acpi_ds_load1_begin_op(struct acpi_walk_state *walk_state, acpi_ds_load1_begin_op(struct acpi_walk_state *walk_state,
union acpi_parse_object **out_op); union acpi_parse_object **out_op);
acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state); acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state);
/*
* dsload - Parser/Interpreter interface, pass 2 namespace load callbacks
*/
acpi_status acpi_status
acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state, acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
union acpi_parse_object **out_op); union acpi_parse_object **out_op);
acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state); acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state);
acpi_status
acpi_ds_init_callbacks(struct acpi_walk_state *walk_state, u32 pass_number);
/* /*
* dsmthdat - method data (locals/args) * dsmthdat - method data (locals/args)
*/ */
......
...@@ -273,6 +273,10 @@ ACPI_EXTERN u32 acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS]; ...@@ -273,6 +273,10 @@ ACPI_EXTERN u32 acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS];
ACPI_EXTERN u8 acpi_gbl_last_owner_id_index; ACPI_EXTERN u8 acpi_gbl_last_owner_id_index;
ACPI_EXTERN u8 acpi_gbl_next_owner_id_offset; ACPI_EXTERN u8 acpi_gbl_next_owner_id_offset;
/* Initialization sequencing */
ACPI_EXTERN u8 acpi_gbl_reg_methods_executed;
/* Misc */ /* Misc */
ACPI_EXTERN u32 acpi_gbl_original_mode; ACPI_EXTERN u32 acpi_gbl_original_mode;
......
...@@ -89,25 +89,6 @@ union acpi_parse_object; ...@@ -89,25 +89,6 @@ union acpi_parse_object;
#define ACPI_MAX_MUTEX 7 #define ACPI_MAX_MUTEX 7
#define ACPI_NUM_MUTEX ACPI_MAX_MUTEX+1 #define ACPI_NUM_MUTEX ACPI_MAX_MUTEX+1
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
#ifdef DEFINE_ACPI_GLOBALS
/* Debug names for the mutexes above */
static char *acpi_gbl_mutex_names[ACPI_NUM_MUTEX] = {
"ACPI_MTX_Interpreter",
"ACPI_MTX_Namespace",
"ACPI_MTX_Tables",
"ACPI_MTX_Events",
"ACPI_MTX_Caches",
"ACPI_MTX_Memory",
"ACPI_MTX_CommandComplete",
"ACPI_MTX_CommandReady"
};
#endif
#endif
/* Lock structure for reader/writer interfaces */ /* Lock structure for reader/writer interfaces */
struct acpi_rw_lock { struct acpi_rw_lock {
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -373,6 +373,15 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) ...@@ -373,6 +373,15 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
gpe_register_info = &gpe_block->register_info[i]; gpe_register_info = &gpe_block->register_info[i];
/*
* Optimization: If there are no GPEs enabled within this
* register, we can safely ignore the entire register.
*/
if (!(gpe_register_info->enable_for_run |
gpe_register_info->enable_for_wake)) {
continue;
}
/* Read the Status Register */ /* Read the Status Register */
status = status =
......
...@@ -231,6 +231,8 @@ acpi_status acpi_ev_initialize_op_regions(void) ...@@ -231,6 +231,8 @@ acpi_status acpi_ev_initialize_op_regions(void)
} }
} }
acpi_gbl_reg_methods_executed = TRUE;
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
......
...@@ -110,9 +110,39 @@ acpi_install_address_space_handler(acpi_handle device, ...@@ -110,9 +110,39 @@ acpi_install_address_space_handler(acpi_handle device,
goto unlock_and_exit; goto unlock_and_exit;
} }
/* Run all _REG methods for this address space */ /*
* For the default space_iDs, (the IDs for which there are default region handlers
* installed) Only execute the _REG methods if the global initialization _REG
* methods have already been run (via acpi_initialize_objects). In other words,
* we will defer the execution of the _REG methods for these space_iDs until
* execution of acpi_initialize_objects. This is done because we need the handlers
* for the default spaces (mem/io/pci/table) to be installed before we can run
* any control methods (or _REG methods). There is known BIOS code that depends
* on this.
*
* For all other space_iDs, we can safely execute the _REG methods immediately.
* This means that for IDs like embedded_controller, this function should be called
* only after acpi_enable_subsystem has been called.
*/
switch (space_id) {
case ACPI_ADR_SPACE_SYSTEM_MEMORY:
case ACPI_ADR_SPACE_SYSTEM_IO:
case ACPI_ADR_SPACE_PCI_CONFIG:
case ACPI_ADR_SPACE_DATA_TABLE:
if (acpi_gbl_reg_methods_executed) {
/* Run all _REG methods for this address space */
status = acpi_ev_execute_reg_methods(node, space_id);
}
break;
default:
status = acpi_ev_execute_reg_methods(node, space_id); status = acpi_ev_execute_reg_methods(node, space_id);
break;
}
unlock_and_exit: unlock_and_exit:
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
......
...@@ -280,13 +280,13 @@ acpi_ex_access_region(union acpi_operand_object *obj_desc, ...@@ -280,13 +280,13 @@ acpi_ex_access_region(union acpi_operand_object *obj_desc,
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
if (status == AE_NOT_IMPLEMENTED) { if (status == AE_NOT_IMPLEMENTED) {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Region %s(0x%X) not implemented", "Region %s (ID=%u) not implemented",
acpi_ut_get_region_name(rgn_desc->region. acpi_ut_get_region_name(rgn_desc->region.
space_id), space_id),
rgn_desc->region.space_id)); rgn_desc->region.space_id));
} else if (status == AE_NOT_EXIST) { } else if (status == AE_NOT_EXIST) {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Region %s(0x%X) has no handler", "Region %s (ID=%u) has no handler",
acpi_ut_get_region_name(rgn_desc->region. acpi_ut_get_region_name(rgn_desc->region.
space_id), space_id),
rgn_desc->region.space_id)); rgn_desc->region.space_id));
......
...@@ -80,14 +80,14 @@ acpi_status acpi_reset(void) ...@@ -80,14 +80,14 @@ acpi_status acpi_reset(void)
if (reset_reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { if (reset_reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
/* /*
* For I/O space, write directly to the OSL. This bypasses the port * For I/O space, write directly to the OSL. This
* validation mechanism, which may block a valid write to the reset * bypasses the port validation mechanism, which may
* register. * block a valid write to the reset register. Spec
* section 4.7.3.6 requires register width to be 8.
*/ */
status = status =
acpi_os_write_port((acpi_io_address) reset_reg->address, acpi_os_write_port((acpi_io_address) reset_reg->address,
acpi_gbl_FADT.reset_value, acpi_gbl_FADT.reset_value, 8);
reset_reg->bit_width);
} else { } else {
/* Write the reset value to the reset register */ /* Write the reset value to the reset register */
......
...@@ -384,8 +384,11 @@ static void acpi_tb_convert_fadt(void) ...@@ -384,8 +384,11 @@ static void acpi_tb_convert_fadt(void)
* *
* The ACPI 1.0 reserved fields that will be zeroed are the bytes located at * The ACPI 1.0 reserved fields that will be zeroed are the bytes located at
* offset 45, 55, 95, and the word located at offset 109, 110. * offset 45, 55, 95, and the word located at offset 109, 110.
*
* Note: The FADT revision value is unreliable. Only the length can be
* trusted.
*/ */
if (acpi_gbl_FADT.header.revision < FADT2_REVISION_ID) { if (acpi_gbl_FADT.header.length <= ACPI_FADT_V2_SIZE) {
acpi_gbl_FADT.preferred_profile = 0; acpi_gbl_FADT.preferred_profile = 0;
acpi_gbl_FADT.pstate_control = 0; acpi_gbl_FADT.pstate_control = 0;
acpi_gbl_FADT.cst_control = 0; acpi_gbl_FADT.cst_control = 0;
......
This diff is collapsed.
This diff is collapsed.
...@@ -22,6 +22,13 @@ config ACPI_APEI_GHES ...@@ -22,6 +22,13 @@ config ACPI_APEI_GHES
by firmware to produce more valuable hardware error by firmware to produce more valuable hardware error
information for Linux. information for Linux.
config ACPI_APEI_PCIEAER
bool "APEI PCIe AER logging/recovering support"
depends on ACPI_APEI && PCIEAER
help
PCIe AER errors may be reported via APEI firmware first mode.
Turn on this option to enable the corresponding support.
config ACPI_APEI_EINJ config ACPI_APEI_EINJ
tristate "APEI Error INJection (EINJ)" tristate "APEI Error INJection (EINJ)"
depends on ACPI_APEI && DEBUG_FS depends on ACPI_APEI && DEBUG_FS
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <linux/time.h> #include <linux/time.h>
#include <linux/cper.h> #include <linux/cper.h>
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/aer.h>
/* /*
* CPER record ID need to be unique even after reboot, because record * CPER record ID need to be unique even after reboot, because record
...@@ -70,8 +71,8 @@ static const char *cper_severity_str(unsigned int severity) ...@@ -70,8 +71,8 @@ static const char *cper_severity_str(unsigned int severity)
* If the output length is longer than 80, multiple line will be * If the output length is longer than 80, multiple line will be
* printed, with @pfx is printed at the beginning of each line. * printed, with @pfx is printed at the beginning of each line.
*/ */
static void cper_print_bits(const char *pfx, unsigned int bits, void cper_print_bits(const char *pfx, unsigned int bits,
const char *strs[], unsigned int strs_size) const char *strs[], unsigned int strs_size)
{ {
int i, len = 0; int i, len = 0;
const char *str; const char *str;
...@@ -81,6 +82,8 @@ static void cper_print_bits(const char *pfx, unsigned int bits, ...@@ -81,6 +82,8 @@ static void cper_print_bits(const char *pfx, unsigned int bits,
if (!(bits & (1U << i))) if (!(bits & (1U << i)))
continue; continue;
str = strs[i]; str = strs[i];
if (!str)
continue;
if (len && len + strlen(str) + 2 > 80) { if (len && len + strlen(str) + 2 > 80) {
printk("%s\n", buf); printk("%s\n", buf);
len = 0; len = 0;
...@@ -243,7 +246,8 @@ static const char *cper_pcie_port_type_strs[] = { ...@@ -243,7 +246,8 @@ static const char *cper_pcie_port_type_strs[] = {
"root complex event collector", "root complex event collector",
}; };
static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie) static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie,
const struct acpi_hest_generic_data *gdata)
{ {
if (pcie->validation_bits & CPER_PCIE_VALID_PORT_TYPE) if (pcie->validation_bits & CPER_PCIE_VALID_PORT_TYPE)
printk("%s""port_type: %d, %s\n", pfx, pcie->port_type, printk("%s""port_type: %d, %s\n", pfx, pcie->port_type,
...@@ -276,6 +280,12 @@ static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie) ...@@ -276,6 +280,12 @@ static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie)
printk( printk(
"%s""bridge: secondary_status: 0x%04x, control: 0x%04x\n", "%s""bridge: secondary_status: 0x%04x, control: 0x%04x\n",
pfx, pcie->bridge.secondary_status, pcie->bridge.control); pfx, pcie->bridge.secondary_status, pcie->bridge.control);
#ifdef CONFIG_ACPI_APEI_PCIEAER
if (pcie->validation_bits & CPER_PCIE_VALID_AER_INFO) {
struct aer_capability_regs *aer_regs = (void *)pcie->aer_info;
cper_print_aer(pfx, gdata->error_severity, aer_regs);
}
#endif
} }
static const char *apei_estatus_section_flag_strs[] = { static const char *apei_estatus_section_flag_strs[] = {
...@@ -322,7 +332,7 @@ static void apei_estatus_print_section( ...@@ -322,7 +332,7 @@ static void apei_estatus_print_section(
struct cper_sec_pcie *pcie = (void *)(gdata + 1); struct cper_sec_pcie *pcie = (void *)(gdata + 1);
printk("%s""section_type: PCIe error\n", pfx); printk("%s""section_type: PCIe error\n", pfx);
if (gdata->error_data_length >= sizeof(*pcie)) if (gdata->error_data_length >= sizeof(*pcie))
cper_print_pcie(pfx, pcie); cper_print_pcie(pfx, pcie, gdata);
else else
goto err_section_too_small; goto err_section_too_small;
} else } else
......
...@@ -43,12 +43,27 @@ static DEFINE_MUTEX(erst_dbg_mutex); ...@@ -43,12 +43,27 @@ static DEFINE_MUTEX(erst_dbg_mutex);
static int erst_dbg_open(struct inode *inode, struct file *file) static int erst_dbg_open(struct inode *inode, struct file *file)
{ {
int rc, *pos;
if (erst_disable) if (erst_disable)
return -ENODEV; return -ENODEV;
pos = (int *)&file->private_data;
rc = erst_get_record_id_begin(pos);
if (rc)
return rc;
return nonseekable_open(inode, file); return nonseekable_open(inode, file);
} }
static int erst_dbg_release(struct inode *inode, struct file *file)
{
erst_get_record_id_end();
return 0;
}
static long erst_dbg_ioctl(struct file *f, unsigned int cmd, unsigned long arg) static long erst_dbg_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
{ {
int rc; int rc;
...@@ -79,18 +94,20 @@ static long erst_dbg_ioctl(struct file *f, unsigned int cmd, unsigned long arg) ...@@ -79,18 +94,20 @@ static long erst_dbg_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
static ssize_t erst_dbg_read(struct file *filp, char __user *ubuf, static ssize_t erst_dbg_read(struct file *filp, char __user *ubuf,
size_t usize, loff_t *off) size_t usize, loff_t *off)
{ {
int rc; int rc, *pos;
ssize_t len = 0; ssize_t len = 0;
u64 id; u64 id;
if (*off != 0) if (*off)
return -EINVAL; return -EINVAL;
if (mutex_lock_interruptible(&erst_dbg_mutex) != 0) if (mutex_lock_interruptible(&erst_dbg_mutex) != 0)
return -EINTR; return -EINTR;
pos = (int *)&filp->private_data;
retry_next: retry_next:
rc = erst_get_next_record_id(&id); rc = erst_get_record_id_next(pos, &id);
if (rc) if (rc)
goto out; goto out;
/* no more record */ /* no more record */
...@@ -181,6 +198,7 @@ static ssize_t erst_dbg_write(struct file *filp, const char __user *ubuf, ...@@ -181,6 +198,7 @@ static ssize_t erst_dbg_write(struct file *filp, const char __user *ubuf,
static const struct file_operations erst_dbg_ops = { static const struct file_operations erst_dbg_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.open = erst_dbg_open, .open = erst_dbg_open,
.release = erst_dbg_release,
.read = erst_dbg_read, .read = erst_dbg_read,
.write = erst_dbg_write, .write = erst_dbg_write,
.unlocked_ioctl = erst_dbg_ioctl, .unlocked_ioctl = erst_dbg_ioctl,
......
...@@ -430,6 +430,22 @@ ssize_t erst_get_record_count(void) ...@@ -430,6 +430,22 @@ ssize_t erst_get_record_count(void)
} }
EXPORT_SYMBOL_GPL(erst_get_record_count); EXPORT_SYMBOL_GPL(erst_get_record_count);
#define ERST_RECORD_ID_CACHE_SIZE_MIN 16
#define ERST_RECORD_ID_CACHE_SIZE_MAX 1024
struct erst_record_id_cache {
struct mutex lock;
u64 *entries;
int len;
int size;
int refcount;
};
static struct erst_record_id_cache erst_record_id_cache = {
.lock = __MUTEX_INITIALIZER(erst_record_id_cache.lock),
.refcount = 0,
};
static int __erst_get_next_record_id(u64 *record_id) static int __erst_get_next_record_id(u64 *record_id)
{ {
struct apei_exec_context ctx; struct apei_exec_context ctx;
...@@ -444,26 +460,179 @@ static int __erst_get_next_record_id(u64 *record_id) ...@@ -444,26 +460,179 @@ static int __erst_get_next_record_id(u64 *record_id)
return 0; return 0;
} }
int erst_get_record_id_begin(int *pos)
{
int rc;
if (erst_disable)
return -ENODEV;
rc = mutex_lock_interruptible(&erst_record_id_cache.lock);
if (rc)
return rc;
erst_record_id_cache.refcount++;
mutex_unlock(&erst_record_id_cache.lock);
*pos = 0;
return 0;
}
EXPORT_SYMBOL_GPL(erst_get_record_id_begin);
/* erst_record_id_cache.lock must be held by caller */
static int __erst_record_id_cache_add_one(void)
{
u64 id, prev_id, first_id;
int i, rc;
u64 *entries;
unsigned long flags;
id = prev_id = first_id = APEI_ERST_INVALID_RECORD_ID;
retry:
raw_spin_lock_irqsave(&erst_lock, flags);
rc = __erst_get_next_record_id(&id);
raw_spin_unlock_irqrestore(&erst_lock, flags);
if (rc == -ENOENT)
return 0;
if (rc)
return rc;
if (id == APEI_ERST_INVALID_RECORD_ID)
return 0;
/* can not skip current ID, or loop back to first ID */
if (id == prev_id || id == first_id)
return 0;
if (first_id == APEI_ERST_INVALID_RECORD_ID)
first_id = id;
prev_id = id;
entries = erst_record_id_cache.entries;
for (i = 0; i < erst_record_id_cache.len; i++) {
if (entries[i] == id)
break;
}
/* record id already in cache, try next */
if (i < erst_record_id_cache.len)
goto retry;
if (erst_record_id_cache.len >= erst_record_id_cache.size) {
int new_size, alloc_size;
u64 *new_entries;
new_size = erst_record_id_cache.size * 2;
new_size = clamp_val(new_size, ERST_RECORD_ID_CACHE_SIZE_MIN,
ERST_RECORD_ID_CACHE_SIZE_MAX);
if (new_size <= erst_record_id_cache.size) {
if (printk_ratelimit())
pr_warning(FW_WARN ERST_PFX
"too many record ID!\n");
return 0;
}
alloc_size = new_size * sizeof(entries[0]);
if (alloc_size < PAGE_SIZE)
new_entries = kmalloc(alloc_size, GFP_KERNEL);
else
new_entries = vmalloc(alloc_size);
if (!new_entries)
return -ENOMEM;
memcpy(new_entries, entries,
erst_record_id_cache.len * sizeof(entries[0]));
if (erst_record_id_cache.size < PAGE_SIZE)
kfree(entries);
else
vfree(entries);
erst_record_id_cache.entries = entries = new_entries;
erst_record_id_cache.size = new_size;
}
entries[i] = id;
erst_record_id_cache.len++;
return 1;
}
/* /*
* Get the record ID of an existing error record on the persistent * Get the record ID of an existing error record on the persistent
* storage. If there is no error record on the persistent storage, the * storage. If there is no error record on the persistent storage, the
* returned record_id is APEI_ERST_INVALID_RECORD_ID. * returned record_id is APEI_ERST_INVALID_RECORD_ID.
*/ */
int erst_get_next_record_id(u64 *record_id) int erst_get_record_id_next(int *pos, u64 *record_id)
{ {
int rc; int rc = 0;
unsigned long flags; u64 *entries;
if (erst_disable) if (erst_disable)
return -ENODEV; return -ENODEV;
raw_spin_lock_irqsave(&erst_lock, flags); /* must be enclosed by erst_get_record_id_begin/end */
rc = __erst_get_next_record_id(record_id); BUG_ON(!erst_record_id_cache.refcount);
raw_spin_unlock_irqrestore(&erst_lock, flags); BUG_ON(*pos < 0 || *pos > erst_record_id_cache.len);
mutex_lock(&erst_record_id_cache.lock);
entries = erst_record_id_cache.entries;
for (; *pos < erst_record_id_cache.len; (*pos)++)
if (entries[*pos] != APEI_ERST_INVALID_RECORD_ID)
break;
/* found next record id in cache */
if (*pos < erst_record_id_cache.len) {
*record_id = entries[*pos];
(*pos)++;
goto out_unlock;
}
/* Try to add one more record ID to cache */
rc = __erst_record_id_cache_add_one();
if (rc < 0)
goto out_unlock;
/* successfully add one new ID */
if (rc == 1) {
*record_id = erst_record_id_cache.entries[*pos];
(*pos)++;
rc = 0;
} else {
*pos = -1;
*record_id = APEI_ERST_INVALID_RECORD_ID;
}
out_unlock:
mutex_unlock(&erst_record_id_cache.lock);
return rc; return rc;
} }
EXPORT_SYMBOL_GPL(erst_get_next_record_id); EXPORT_SYMBOL_GPL(erst_get_record_id_next);
/* erst_record_id_cache.lock must be held by caller */
static void __erst_record_id_cache_compact(void)
{
int i, wpos = 0;
u64 *entries;
if (erst_record_id_cache.refcount)
return;
entries = erst_record_id_cache.entries;
for (i = 0; i < erst_record_id_cache.len; i++) {
if (entries[i] == APEI_ERST_INVALID_RECORD_ID)
continue;
if (wpos != i)
memcpy(&entries[wpos], &entries[i], sizeof(entries[i]));
wpos++;
}
erst_record_id_cache.len = wpos;
}
void erst_get_record_id_end(void)
{
/*
* erst_disable != 0 should be detected by invoker via the
* return value of erst_get_record_id_begin/next, so this
* function should not be called for erst_disable != 0.
*/
BUG_ON(erst_disable);
mutex_lock(&erst_record_id_cache.lock);
erst_record_id_cache.refcount--;
BUG_ON(erst_record_id_cache.refcount < 0);
__erst_record_id_cache_compact();
mutex_unlock(&erst_record_id_cache.lock);
}
EXPORT_SYMBOL_GPL(erst_get_record_id_end);
static int __erst_write_to_storage(u64 offset) static int __erst_write_to_storage(u64 offset)
{ {
...@@ -704,56 +873,34 @@ ssize_t erst_read(u64 record_id, struct cper_record_header *record, ...@@ -704,56 +873,34 @@ ssize_t erst_read(u64 record_id, struct cper_record_header *record,
} }
EXPORT_SYMBOL_GPL(erst_read); EXPORT_SYMBOL_GPL(erst_read);
/*
* If return value > buflen, the buffer size is not big enough,
* else if return value = 0, there is no more record to read,
* else if return value < 0, something goes wrong,
* else everything is OK, and return value is record length
*/
ssize_t erst_read_next(struct cper_record_header *record, size_t buflen)
{
int rc;
ssize_t len;
unsigned long flags;
u64 record_id;
if (erst_disable)
return -ENODEV;
raw_spin_lock_irqsave(&erst_lock, flags);
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, record, buflen);
raw_spin_unlock_irqrestore(&erst_lock, flags);
return len;
}
EXPORT_SYMBOL_GPL(erst_read_next);
int erst_clear(u64 record_id) int erst_clear(u64 record_id)
{ {
int rc; int rc, i;
unsigned long flags; unsigned long flags;
u64 *entries;
if (erst_disable) if (erst_disable)
return -ENODEV; return -ENODEV;
rc = mutex_lock_interruptible(&erst_record_id_cache.lock);
if (rc)
return rc;
raw_spin_lock_irqsave(&erst_lock, flags); raw_spin_lock_irqsave(&erst_lock, flags);
if (erst_erange.attr & ERST_RANGE_NVRAM) if (erst_erange.attr & ERST_RANGE_NVRAM)
rc = __erst_clear_from_nvram(record_id); rc = __erst_clear_from_nvram(record_id);
else else
rc = __erst_clear_from_storage(record_id); rc = __erst_clear_from_storage(record_id);
raw_spin_unlock_irqrestore(&erst_lock, flags); raw_spin_unlock_irqrestore(&erst_lock, flags);
if (rc)
goto out;
entries = erst_record_id_cache.entries;
for (i = 0; i < erst_record_id_cache.len; i++) {
if (entries[i] == record_id)
entries[i] = APEI_ERST_INVALID_RECORD_ID;
}
__erst_record_id_cache_compact();
out:
mutex_unlock(&erst_record_id_cache.lock);
return rc; return rc;
} }
EXPORT_SYMBOL_GPL(erst_clear); EXPORT_SYMBOL_GPL(erst_clear);
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <linux/async.h> #include <linux/async.h>
#include <linux/dmi.h> #include <linux/dmi.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/suspend.h>
#ifdef CONFIG_ACPI_PROCFS_POWER #ifdef CONFIG_ACPI_PROCFS_POWER
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
...@@ -102,6 +103,7 @@ struct acpi_battery { ...@@ -102,6 +103,7 @@ struct acpi_battery {
struct mutex lock; struct mutex lock;
struct power_supply bat; struct power_supply bat;
struct acpi_device *device; struct acpi_device *device;
struct notifier_block pm_nb;
unsigned long update_time; unsigned long update_time;
int rate_now; int rate_now;
int capacity_now; int capacity_now;
...@@ -940,6 +942,21 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event) ...@@ -940,6 +942,21 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event)
power_supply_changed(&battery->bat); power_supply_changed(&battery->bat);
} }
static int battery_notify(struct notifier_block *nb,
unsigned long mode, void *_unused)
{
struct acpi_battery *battery = container_of(nb, struct acpi_battery,
pm_nb);
switch (mode) {
case PM_POST_SUSPEND:
sysfs_remove_battery(battery);
sysfs_add_battery(battery);
break;
}
return 0;
}
static int acpi_battery_add(struct acpi_device *device) static int acpi_battery_add(struct acpi_device *device)
{ {
int result = 0; int result = 0;
...@@ -972,6 +989,10 @@ static int acpi_battery_add(struct acpi_device *device) ...@@ -972,6 +989,10 @@ static int acpi_battery_add(struct acpi_device *device)
#endif #endif
kfree(battery); kfree(battery);
} }
battery->pm_nb.notifier_call = battery_notify;
register_pm_notifier(&battery->pm_nb);
return result; return result;
} }
...@@ -982,6 +1003,7 @@ static int acpi_battery_remove(struct acpi_device *device, int type) ...@@ -982,6 +1003,7 @@ static int acpi_battery_remove(struct acpi_device *device, int type)
if (!device || !acpi_driver_data(device)) if (!device || !acpi_driver_data(device))
return -EINVAL; return -EINVAL;
battery = acpi_driver_data(device); battery = acpi_driver_data(device);
unregister_pm_notifier(&battery->pm_nb);
#ifdef CONFIG_ACPI_PROCFS_POWER #ifdef CONFIG_ACPI_PROCFS_POWER
acpi_battery_remove_fs(device); acpi_battery_remove_fs(device);
#endif #endif
......
This diff is collapsed.
...@@ -24,10 +24,6 @@ MODULE_PARM_DESC(write_support, "Dangerous, reboot and removal of battery may " ...@@ -24,10 +24,6 @@ MODULE_PARM_DESC(write_support, "Dangerous, reboot and removal of battery may "
#define EC_SPACE_SIZE 256 #define EC_SPACE_SIZE 256
struct sysdev_class acpi_ec_sysdev_class = {
.name = "ec",
};
static struct dentry *acpi_ec_debugfs_dir; static struct dentry *acpi_ec_debugfs_dir;
static int acpi_ec_open_io(struct inode *i, struct file *f) static int acpi_ec_open_io(struct inode *i, struct file *f)
......
...@@ -21,8 +21,6 @@ ...@@ -21,8 +21,6 @@
#ifndef _ACPI_INTERNAL_H_ #ifndef _ACPI_INTERNAL_H_
#define _ACPI_INTERNAL_H_ #define _ACPI_INTERNAL_H_
#include <linux/sysdev.h>
#define PREFIX "ACPI: " #define PREFIX "ACPI: "
int init_acpi_device_notify(void); int init_acpi_device_notify(void);
...@@ -64,7 +62,6 @@ struct acpi_ec { ...@@ -64,7 +62,6 @@ struct acpi_ec {
struct list_head list; struct list_head list;
struct transaction *curr; struct transaction *curr;
spinlock_t curr_lock; spinlock_t curr_lock;
struct sys_device sysdev;
}; };
extern struct acpi_ec *first_ec; extern struct acpi_ec *first_ec;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -635,8 +635,8 @@ int acpi_processor_device_add(acpi_handle handle, struct acpi_device **device) ...@@ -635,8 +635,8 @@ int acpi_processor_device_add(acpi_handle handle, struct acpi_device **device)
return 0; return 0;
} }
static void __ref acpi_processor_hotplug_notify(acpi_handle handle, static void acpi_processor_hotplug_notify(acpi_handle handle,
u32 event, void *data) u32 event, void *data)
{ {
struct acpi_processor *pr; struct acpi_processor *pr;
struct acpi_device *device = NULL; struct acpi_device *device = NULL;
......
This diff is collapsed.
...@@ -797,7 +797,6 @@ static void acpi_bus_set_run_wake_flags(struct acpi_device *device) ...@@ -797,7 +797,6 @@ static void acpi_bus_set_run_wake_flags(struct acpi_device *device)
acpi_status status; acpi_status status;
acpi_event_status event_status; acpi_event_status event_status;
device->wakeup.run_wake_count = 0;
device->wakeup.flags.notifier_present = 0; device->wakeup.flags.notifier_present = 0;
/* Power button, Lid switch always enable wakeup */ /* Power button, Lid switch always enable wakeup */
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -250,7 +250,6 @@ struct acpi_device_wakeup { ...@@ -250,7 +250,6 @@ struct acpi_device_wakeup {
struct acpi_handle_list resources; struct acpi_handle_list resources;
struct acpi_device_wakeup_flags flags; struct acpi_device_wakeup_flags flags;
int prepare_count; int prepare_count;
int run_wake_count;
}; };
/* Device */ /* Device */
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment