mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux
Pul ACPI & Power Management updates from Len Brown: - acpidump utility added - intel_idle driver now supports IVB Xeon - turbostat utility can now count SMIs - ACPI can now bind to USB3 hubs - misc fixes * 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux: (49 commits) ACPI: Add new sysfs interface to export device description ACPI: Harden acpi_table_parse_entries() against BIOS bug tools/power/turbostat: add option to count SMIs, re-name some options tools/power turbostat: add [-d MSR#][-D MSR#] options to print counter deltas intel_idle: enable IVB Xeon support tools/power turbostat: add [-m MSR#] option tools/power turbostat: make -M output pretty tools/power turbostat: print more turbo-limit information tools/power turbostat: delete unused line tools/power turbostat: run on IVB Xeon tools/power/acpi/acpidump: create acpidump(8), local make install targets tools/power/acpi/acpidump: version 20101221 - find dynamic tables in sysfs ACPI: run _OSC after ACPI_FULL_INITIALIZATION tools/power/acpi/acpidump: create acpidump(8), local make install targets tools/power/acpi/acpidump: version 20101221 - find dynamic tables in sysfs tools/power/acpi/acpidump: version 20071116 tools/power/acpi/acpidump: version 20070714 tools/power/acpi/acpidump: version 20060606 tools/power/acpi/acpidump: version 20051111 xo15-ebook: convert to module_acpi_driver() ...
This commit is contained in:
commit
d8dc91b753
51 changed files with 2073 additions and 737 deletions
|
|
@ -158,5 +158,6 @@ acpi-y += \
|
|||
utresrc.o \
|
||||
utstate.o \
|
||||
utxface.o \
|
||||
utxfinit.o \
|
||||
utxferror.o \
|
||||
utxfmutex.o
|
||||
|
|
|
|||
|
|
@ -110,8 +110,7 @@ acpi_status acpi_hw_write_port(acpi_io_address address, u32 value, u32 width);
|
|||
/*
|
||||
* hwgpe - GPE support
|
||||
*/
|
||||
u32 acpi_hw_get_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info,
|
||||
struct acpi_gpe_register_info *gpe_register_info);
|
||||
u32 acpi_hw_get_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info);
|
||||
|
||||
acpi_status
|
||||
acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u32 action);
|
||||
|
|
|
|||
|
|
@ -707,15 +707,18 @@ union acpi_parse_value {
|
|||
u8 disasm_opcode; /* Subtype used for disassembly */\
|
||||
char aml_op_name[16]) /* Op name (debug only) */
|
||||
|
||||
#define ACPI_DASM_BUFFER 0x00
|
||||
#define ACPI_DASM_RESOURCE 0x01
|
||||
#define ACPI_DASM_STRING 0x02
|
||||
#define ACPI_DASM_UNICODE 0x03
|
||||
#define ACPI_DASM_EISAID 0x04
|
||||
#define ACPI_DASM_MATCHOP 0x05
|
||||
#define ACPI_DASM_LNOT_PREFIX 0x06
|
||||
#define ACPI_DASM_LNOT_SUFFIX 0x07
|
||||
#define ACPI_DASM_IGNORE 0x08
|
||||
/* Flags for disasm_flags field above */
|
||||
|
||||
#define ACPI_DASM_BUFFER 0x00 /* Buffer is a simple data buffer */
|
||||
#define ACPI_DASM_RESOURCE 0x01 /* Buffer is a Resource Descriptor */
|
||||
#define ACPI_DASM_STRING 0x02 /* Buffer is a ASCII string */
|
||||
#define ACPI_DASM_UNICODE 0x03 /* Buffer is a Unicode string */
|
||||
#define ACPI_DASM_PLD_METHOD 0x04 /* Buffer is a _PLD method bit-packed buffer */
|
||||
#define ACPI_DASM_EISAID 0x05 /* Integer is an EISAID */
|
||||
#define ACPI_DASM_MATCHOP 0x06 /* Parent opcode is a Match() operator */
|
||||
#define ACPI_DASM_LNOT_PREFIX 0x07 /* Start of a Lnot_equal (etc.) pair of opcodes */
|
||||
#define ACPI_DASM_LNOT_SUFFIX 0x08 /* End of a Lnot_equal (etc.) pair of opcodes */
|
||||
#define ACPI_DASM_IGNORE 0x09 /* Not used at this time */
|
||||
|
||||
/*
|
||||
* Generic operation (for example: If, While, Store)
|
||||
|
|
@ -932,6 +935,7 @@ struct acpi_bit_register_info {
|
|||
#define ACPI_OSI_WIN_VISTA_SP1 0x09
|
||||
#define ACPI_OSI_WIN_VISTA_SP2 0x0A
|
||||
#define ACPI_OSI_WIN_7 0x0B
|
||||
#define ACPI_OSI_WIN_8 0x0C
|
||||
|
||||
#define ACPI_ALWAYS_ILLEGAL 0x00
|
||||
|
||||
|
|
@ -1024,6 +1028,7 @@ struct acpi_port_info {
|
|||
****************************************************************************/
|
||||
|
||||
struct acpi_db_method_info {
|
||||
acpi_handle method;
|
||||
acpi_handle main_thread_gate;
|
||||
acpi_handle thread_complete_gate;
|
||||
acpi_thread_id *threads;
|
||||
|
|
|
|||
|
|
@ -277,10 +277,33 @@
|
|||
|
||||
/* Bitfields within ACPI registers */
|
||||
|
||||
#define ACPI_REGISTER_PREPARE_BITS(val, pos, mask) ((val << pos) & mask)
|
||||
#define ACPI_REGISTER_INSERT_VALUE(reg, pos, mask, val) reg = (reg & (~(mask))) | ACPI_REGISTER_PREPARE_BITS(val, pos, mask)
|
||||
#define ACPI_REGISTER_PREPARE_BITS(val, pos, mask) \
|
||||
((val << pos) & mask)
|
||||
|
||||
#define ACPI_INSERT_BITS(target, mask, source) target = ((target & (~(mask))) | (source & mask))
|
||||
#define ACPI_REGISTER_INSERT_VALUE(reg, pos, mask, val) \
|
||||
reg = (reg & (~(mask))) | ACPI_REGISTER_PREPARE_BITS(val, pos, mask)
|
||||
|
||||
#define ACPI_INSERT_BITS(target, mask, source) \
|
||||
target = ((target & (~(mask))) | (source & mask))
|
||||
|
||||
/* Generic bitfield macros and masks */
|
||||
|
||||
#define ACPI_GET_BITS(source_ptr, position, mask) \
|
||||
((*source_ptr >> position) & mask)
|
||||
|
||||
#define ACPI_SET_BITS(target_ptr, position, mask, value) \
|
||||
(*target_ptr |= ((value & mask) << position))
|
||||
|
||||
#define ACPI_1BIT_MASK 0x00000001
|
||||
#define ACPI_2BIT_MASK 0x00000003
|
||||
#define ACPI_3BIT_MASK 0x00000007
|
||||
#define ACPI_4BIT_MASK 0x0000000F
|
||||
#define ACPI_5BIT_MASK 0x0000001F
|
||||
#define ACPI_6BIT_MASK 0x0000003F
|
||||
#define ACPI_7BIT_MASK 0x0000007F
|
||||
#define ACPI_8BIT_MASK 0x000000FF
|
||||
#define ACPI_16BIT_MASK 0x0000FFFF
|
||||
#define ACPI_24BIT_MASK 0x00FFFFFF
|
||||
|
||||
/*
|
||||
* An object of type struct acpi_namespace_node can appear in some contexts
|
||||
|
|
|
|||
|
|
@ -230,6 +230,20 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
|
|||
walk_state->scope_info->common.value = ACPI_TYPE_ANY;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_METHOD:
|
||||
|
||||
/*
|
||||
* Allow scope change to root during execution of module-level
|
||||
* code. Root is typed METHOD during this time.
|
||||
*/
|
||||
if ((node == acpi_gbl_root_node) &&
|
||||
(walk_state->
|
||||
parse_flags & ACPI_PARSE_MODULE_LEVEL)) {
|
||||
break;
|
||||
}
|
||||
|
||||
/*lint -fallthrough */
|
||||
|
||||
default:
|
||||
|
||||
/* All other types are an error */
|
||||
|
|
|
|||
|
|
@ -230,6 +230,20 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
|
|||
walk_state->scope_info->common.value = ACPI_TYPE_ANY;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_METHOD:
|
||||
|
||||
/*
|
||||
* Allow scope change to root during execution of module-level
|
||||
* code. Root is typed METHOD during this time.
|
||||
*/
|
||||
if ((node == acpi_gbl_root_node) &&
|
||||
(walk_state->
|
||||
parse_flags & ACPI_PARSE_MODULE_LEVEL)) {
|
||||
break;
|
||||
}
|
||||
|
||||
/*lint -fallthrough */
|
||||
|
||||
default:
|
||||
|
||||
/* All other types are an error */
|
||||
|
|
|
|||
|
|
@ -80,8 +80,7 @@ acpi_ev_update_gpe_enable_mask(struct acpi_gpe_event_info *gpe_event_info)
|
|||
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info,
|
||||
gpe_register_info);
|
||||
register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info);
|
||||
|
||||
/* Clear the run bit up front */
|
||||
|
||||
|
|
@ -379,6 +378,18 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
|
|||
*/
|
||||
if (!(gpe_register_info->enable_for_run |
|
||||
gpe_register_info->enable_for_wake)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INTERRUPTS,
|
||||
"Ignore disabled registers for GPE%02X-GPE%02X: "
|
||||
"RunEnable=%02X, WakeEnable=%02X\n",
|
||||
gpe_register_info->
|
||||
base_gpe_number,
|
||||
gpe_register_info->
|
||||
base_gpe_number +
|
||||
(ACPI_GPE_REGISTER_WIDTH - 1),
|
||||
gpe_register_info->
|
||||
enable_for_run,
|
||||
gpe_register_info->
|
||||
enable_for_wake));
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -401,9 +412,14 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
|
|||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INTERRUPTS,
|
||||
"Read GPE Register at GPE%02X: Status=%02X, Enable=%02X\n",
|
||||
"Read registers for GPE%02X-GPE%02X: Status=%02X, Enable=%02X, "
|
||||
"RunEnable=%02X, WakeEnable=%02X\n",
|
||||
gpe_register_info->base_gpe_number,
|
||||
status_reg, enable_reg));
|
||||
gpe_register_info->base_gpe_number +
|
||||
(ACPI_GPE_REGISTER_WIDTH - 1),
|
||||
status_reg, enable_reg,
|
||||
gpe_register_info->enable_for_run,
|
||||
gpe_register_info->enable_for_wake));
|
||||
|
||||
/* Check if there is anything active at all in this register */
|
||||
|
||||
|
|
|
|||
|
|
@ -357,8 +357,7 @@ acpi_status acpi_set_gpe_wake_mask(acpi_handle gpe_device, u32 gpe_number, u8 ac
|
|||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
register_bit =
|
||||
acpi_hw_get_gpe_register_bit(gpe_event_info, gpe_register_info);
|
||||
register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info);
|
||||
|
||||
/* Perform the action */
|
||||
|
||||
|
|
|
|||
|
|
@ -60,7 +60,6 @@ acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
|||
* FUNCTION: acpi_hw_get_gpe_register_bit
|
||||
*
|
||||
* PARAMETERS: gpe_event_info - Info block for the GPE
|
||||
* gpe_register_info - Info block for the GPE register
|
||||
*
|
||||
* RETURN: Register mask with a one in the GPE bit position
|
||||
*
|
||||
|
|
@ -69,11 +68,10 @@ acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
|||
*
|
||||
******************************************************************************/
|
||||
|
||||
u32 acpi_hw_get_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info,
|
||||
struct acpi_gpe_register_info *gpe_register_info)
|
||||
u32 acpi_hw_get_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info)
|
||||
{
|
||||
return (u32)1 << (gpe_event_info->gpe_number -
|
||||
gpe_register_info->base_gpe_number);
|
||||
gpe_event_info->register_info->base_gpe_number);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
|
@ -115,8 +113,7 @@ acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u32 action)
|
|||
|
||||
/* Set or clear just the bit that corresponds to this GPE */
|
||||
|
||||
register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info,
|
||||
gpe_register_info);
|
||||
register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info);
|
||||
switch (action) {
|
||||
case ACPI_GPE_CONDITIONAL_ENABLE:
|
||||
|
||||
|
|
@ -178,8 +175,7 @@ acpi_status acpi_hw_clear_gpe(struct acpi_gpe_event_info * gpe_event_info)
|
|||
* Write a one to the appropriate bit in the status register to
|
||||
* clear this GPE.
|
||||
*/
|
||||
register_bit =
|
||||
acpi_hw_get_gpe_register_bit(gpe_event_info, gpe_register_info);
|
||||
register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info);
|
||||
|
||||
status = acpi_hw_write(register_bit,
|
||||
&gpe_register_info->status_address);
|
||||
|
|
@ -222,8 +218,7 @@ acpi_hw_get_gpe_status(struct acpi_gpe_event_info * gpe_event_info,
|
|||
|
||||
/* Get the register bitmask for this GPE */
|
||||
|
||||
register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info,
|
||||
gpe_register_info);
|
||||
register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info);
|
||||
|
||||
/* GPE currently enabled? (enabled for runtime?) */
|
||||
|
||||
|
|
|
|||
|
|
@ -381,7 +381,6 @@ ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state)
|
|||
* FUNCTION: acpi_leave_sleep_state_prep
|
||||
*
|
||||
* PARAMETERS: sleep_state - Which sleep state we are exiting
|
||||
* flags - ACPI_EXECUTE_BFS to run optional method
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
|
|
|
|||
|
|
@ -264,7 +264,7 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
|
|||
switch (type) {
|
||||
case ACPI_TYPE_PROCESSOR:
|
||||
|
||||
acpi_os_printf("ID %X Len %.4X Addr %p\n",
|
||||
acpi_os_printf("ID %02X Len %02X Addr %p\n",
|
||||
obj_desc->processor.proc_id,
|
||||
obj_desc->processor.length,
|
||||
ACPI_CAST_PTR(void,
|
||||
|
|
|
|||
|
|
@ -350,6 +350,7 @@ struct acpi_table_header *acpi_tb_table_override(struct acpi_table_header
|
|||
acpi_status acpi_tb_resize_root_table_list(void)
|
||||
{
|
||||
struct acpi_table_desc *tables;
|
||||
u32 table_count;
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_resize_root_table_list);
|
||||
|
||||
|
|
@ -363,8 +364,13 @@ acpi_status acpi_tb_resize_root_table_list(void)
|
|||
|
||||
/* Increase the Table Array size */
|
||||
|
||||
tables = ACPI_ALLOCATE_ZEROED(((acpi_size) acpi_gbl_root_table_list.
|
||||
max_table_count +
|
||||
if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
|
||||
table_count = acpi_gbl_root_table_list.max_table_count;
|
||||
} else {
|
||||
table_count = acpi_gbl_root_table_list.current_table_count;
|
||||
}
|
||||
|
||||
tables = ACPI_ALLOCATE_ZEROED(((acpi_size) table_count +
|
||||
ACPI_ROOT_TABLE_SIZE_INCREMENT) *
|
||||
sizeof(struct acpi_table_desc));
|
||||
if (!tables) {
|
||||
|
|
@ -377,8 +383,8 @@ acpi_status acpi_tb_resize_root_table_list(void)
|
|||
|
||||
if (acpi_gbl_root_table_list.tables) {
|
||||
ACPI_MEMCPY(tables, acpi_gbl_root_table_list.tables,
|
||||
(acpi_size) acpi_gbl_root_table_list.
|
||||
max_table_count * sizeof(struct acpi_table_desc));
|
||||
(acpi_size) table_count *
|
||||
sizeof(struct acpi_table_desc));
|
||||
|
||||
if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
|
||||
ACPI_FREE(acpi_gbl_root_table_list.tables);
|
||||
|
|
@ -386,9 +392,9 @@ acpi_status acpi_tb_resize_root_table_list(void)
|
|||
}
|
||||
|
||||
acpi_gbl_root_table_list.tables = tables;
|
||||
acpi_gbl_root_table_list.max_table_count +=
|
||||
ACPI_ROOT_TABLE_SIZE_INCREMENT;
|
||||
acpi_gbl_root_table_list.flags |= (u8)ACPI_ROOT_ORIGIN_ALLOCATED;
|
||||
acpi_gbl_root_table_list.max_table_count =
|
||||
table_count + ACPI_ROOT_TABLE_SIZE_INCREMENT;
|
||||
acpi_gbl_root_table_list.flags |= ACPI_ROOT_ORIGIN_ALLOCATED;
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -159,14 +159,12 @@ acpi_initialize_tables(struct acpi_table_desc * initial_table_array,
|
|||
* DESCRIPTION: Reallocate Root Table List into dynamic memory. Copies the
|
||||
* root list from the previously provided scratch area. Should
|
||||
* be called once dynamic memory allocation is available in the
|
||||
* kernel
|
||||
* kernel.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_reallocate_root_table(void)
|
||||
{
|
||||
struct acpi_table_desc *tables;
|
||||
acpi_size new_size;
|
||||
acpi_size current_size;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_reallocate_root_table);
|
||||
|
||||
|
|
@ -178,39 +176,10 @@ acpi_status acpi_reallocate_root_table(void)
|
|||
return_ACPI_STATUS(AE_SUPPORT);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the current size of the root table and add the default
|
||||
* increment to create the new table size.
|
||||
*/
|
||||
current_size = (acpi_size)
|
||||
acpi_gbl_root_table_list.current_table_count *
|
||||
sizeof(struct acpi_table_desc);
|
||||
acpi_gbl_root_table_list.flags |= ACPI_ROOT_ALLOW_RESIZE;
|
||||
|
||||
new_size = current_size +
|
||||
(ACPI_ROOT_TABLE_SIZE_INCREMENT * sizeof(struct acpi_table_desc));
|
||||
|
||||
/* Create new array and copy the old array */
|
||||
|
||||
tables = ACPI_ALLOCATE_ZEROED(new_size);
|
||||
if (!tables) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
ACPI_MEMCPY(tables, acpi_gbl_root_table_list.tables, current_size);
|
||||
|
||||
/*
|
||||
* Update the root table descriptor. The new size will be the current
|
||||
* number of tables plus the increment, independent of the reserved
|
||||
* size of the original table list.
|
||||
*/
|
||||
acpi_gbl_root_table_list.tables = tables;
|
||||
acpi_gbl_root_table_list.max_table_count =
|
||||
acpi_gbl_root_table_list.current_table_count +
|
||||
ACPI_ROOT_TABLE_SIZE_INCREMENT;
|
||||
acpi_gbl_root_table_list.flags =
|
||||
ACPI_ROOT_ORIGIN_ALLOCATED | ACPI_ROOT_ALLOW_RESIZE;
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
status = acpi_tb_resize_root_table_list();
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@ static struct acpi_interface_info acpi_default_supported_interfaces[] = {
|
|||
{"Windows 2006 SP1", NULL, 0, ACPI_OSI_WIN_VISTA_SP1}, /* Windows Vista SP1 - Added 09/2009 */
|
||||
{"Windows 2006 SP2", NULL, 0, ACPI_OSI_WIN_VISTA_SP2}, /* Windows Vista SP2 - Added 09/2010 */
|
||||
{"Windows 2009", NULL, 0, ACPI_OSI_WIN_7}, /* Windows 7 and Server 2008 R2 - Added 09/2009 */
|
||||
{"Windows 2012", NULL, 0, ACPI_OSI_WIN_8}, /* Windows 8 and Server 2012 - Added 08/2012 */
|
||||
|
||||
/* Feature Group Strings */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Module Name: utxface - External interfaces for "global" ACPI functions
|
||||
* Module Name: utxface - External interfaces, miscellaneous utility functions
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
|
@ -53,271 +53,6 @@
|
|||
#define _COMPONENT ACPI_UTILITIES
|
||||
ACPI_MODULE_NAME("utxface")
|
||||
|
||||
#ifndef ACPI_ASL_COMPILER
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_initialize_subsystem
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Initializes all global variables. This is the first function
|
||||
* called, so any early initialization belongs here.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status __init acpi_initialize_subsystem(void)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_initialize_subsystem);
|
||||
|
||||
acpi_gbl_startup_flags = ACPI_SUBSYSTEM_INITIALIZE;
|
||||
ACPI_DEBUG_EXEC(acpi_ut_init_stack_ptr_trace());
|
||||
|
||||
/* Initialize the OS-Dependent layer */
|
||||
|
||||
status = acpi_os_initialize();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status, "During OSL initialization"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Initialize all globals used by the subsystem */
|
||||
|
||||
status = acpi_ut_init_globals();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"During initialization of globals"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Create the default mutex objects */
|
||||
|
||||
status = acpi_ut_mutex_initialize();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"During Global Mutex creation"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the namespace manager and
|
||||
* the root of the namespace tree
|
||||
*/
|
||||
status = acpi_ns_root_initialize();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"During Namespace initialization"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Initialize the global OSI interfaces list with the static names */
|
||||
|
||||
status = acpi_ut_initialize_interfaces();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"During OSI interfaces initialization"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* If configured, initialize the AML debugger */
|
||||
|
||||
ACPI_DEBUGGER_EXEC(status = acpi_db_initialize());
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_enable_subsystem
|
||||
*
|
||||
* PARAMETERS: flags - Init/enable Options
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Completes the subsystem initialization including hardware.
|
||||
* Puts system into ACPI mode if it isn't already.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_enable_subsystem(u32 flags)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_enable_subsystem);
|
||||
|
||||
#if (!ACPI_REDUCED_HARDWARE)
|
||||
|
||||
/* Enable ACPI mode */
|
||||
|
||||
if (!(flags & ACPI_NO_ACPI_ENABLE)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Going into ACPI mode\n"));
|
||||
|
||||
acpi_gbl_original_mode = acpi_hw_get_mode();
|
||||
|
||||
status = acpi_enable();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_WARNING((AE_INFO, "AcpiEnable failed"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Obtain a permanent mapping for the FACS. This is required for the
|
||||
* Global Lock and the Firmware Waking Vector
|
||||
*/
|
||||
status = acpi_tb_initialize_facs();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_WARNING((AE_INFO, "Could not map the FACS table"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||
|
||||
/*
|
||||
* Install the default op_region handlers. These are installed unless
|
||||
* other handlers have already been installed via the
|
||||
* install_address_space_handler interface.
|
||||
*/
|
||||
if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Installing default address space handlers\n"));
|
||||
|
||||
status = acpi_ev_install_region_handlers();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
#if (!ACPI_REDUCED_HARDWARE)
|
||||
/*
|
||||
* Initialize ACPI Event handling (Fixed and General Purpose)
|
||||
*
|
||||
* Note1: We must have the hardware and events initialized before we can
|
||||
* execute any control methods safely. Any control method can require
|
||||
* ACPI hardware support, so the hardware must be fully initialized before
|
||||
* any method execution!
|
||||
*
|
||||
* Note2: Fixed events are initialized and enabled here. GPEs are
|
||||
* initialized, but cannot be enabled until after the hardware is
|
||||
* completely initialized (SCI and global_lock activated)
|
||||
*/
|
||||
if (!(flags & ACPI_NO_EVENT_INIT)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Initializing ACPI events\n"));
|
||||
|
||||
status = acpi_ev_initialize_events();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Install the SCI handler and Global Lock handler. This completes the
|
||||
* hardware initialization.
|
||||
*/
|
||||
if (!(flags & ACPI_NO_HANDLER_INIT)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Installing SCI/GL handlers\n"));
|
||||
|
||||
status = acpi_ev_install_xrupt_handlers();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_enable_subsystem)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_initialize_objects
|
||||
*
|
||||
* PARAMETERS: flags - Init/enable Options
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Completes namespace initialization by initializing device
|
||||
* objects and executing AML code for Regions, buffers, etc.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_initialize_objects(u32 flags)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_initialize_objects);
|
||||
|
||||
/*
|
||||
* Run all _REG methods
|
||||
*
|
||||
* Note: Any objects accessed by the _REG methods will be automatically
|
||||
* initialized, even if they contain executable AML (see the call to
|
||||
* acpi_ns_initialize_objects below).
|
||||
*/
|
||||
if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Executing _REG OpRegion methods\n"));
|
||||
|
||||
status = acpi_ev_initialize_op_regions();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Execute any module-level code that was detected during the table load
|
||||
* phase. Although illegal since ACPI 2.0, there are many machines that
|
||||
* contain this type of code. Each block of detected executable AML code
|
||||
* outside of any control method is wrapped with a temporary control
|
||||
* method object and placed on a global list. The methods on this list
|
||||
* are executed below.
|
||||
*/
|
||||
acpi_ns_exec_module_code_list();
|
||||
|
||||
/*
|
||||
* Initialize the objects that remain uninitialized. This runs the
|
||||
* executable AML that may be part of the declaration of these objects:
|
||||
* operation_regions, buffer_fields, Buffers, and Packages.
|
||||
*/
|
||||
if (!(flags & ACPI_NO_OBJECT_INIT)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Completing Initialization of ACPI Objects\n"));
|
||||
|
||||
status = acpi_ns_initialize_objects();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize all device objects in the namespace. This runs the device
|
||||
* _STA and _INI methods.
|
||||
*/
|
||||
if (!(flags & ACPI_NO_DEVICE_INIT)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Initializing ACPI Devices\n"));
|
||||
|
||||
status = acpi_ns_initialize_devices();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Empty the caches (delete the cached objects) on the assumption that
|
||||
* the table load filled them up more than they will be at runtime --
|
||||
* thus wasting non-paged memory.
|
||||
*/
|
||||
status = acpi_purge_cached_objects();
|
||||
|
||||
acpi_gbl_startup_flags |= ACPI_INITIALIZED_OK;
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_initialize_objects)
|
||||
|
||||
#endif
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_terminate
|
||||
|
|
@ -683,3 +418,90 @@ acpi_check_address_range(acpi_adr_space_type space_id,
|
|||
|
||||
ACPI_EXPORT_SYMBOL(acpi_check_address_range)
|
||||
#endif /* !ACPI_ASL_COMPILER */
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_decode_pld_buffer
|
||||
*
|
||||
* PARAMETERS: in_buffer - Buffer returned by _PLD method
|
||||
* length - Length of the in_buffer
|
||||
* return_buffer - Where the decode buffer is returned
|
||||
*
|
||||
* RETURN: Status and the decoded _PLD buffer. User must deallocate
|
||||
* the buffer via ACPI_FREE.
|
||||
*
|
||||
* DESCRIPTION: Decode the bit-packed buffer returned by the _PLD method into
|
||||
* a local struct that is much more useful to an ACPI driver.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status
|
||||
acpi_decode_pld_buffer(u8 *in_buffer,
|
||||
acpi_size length, struct acpi_pld_info ** return_buffer)
|
||||
{
|
||||
struct acpi_pld_info *pld_info;
|
||||
u32 *buffer = ACPI_CAST_PTR(u32, in_buffer);
|
||||
u32 dword;
|
||||
|
||||
/* Parameter validation */
|
||||
|
||||
if (!in_buffer || !return_buffer || (length < 16)) {
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
pld_info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_pld_info));
|
||||
if (!pld_info) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/* First 32-bit DWord */
|
||||
|
||||
ACPI_MOVE_32_TO_32(&dword, &buffer[0]);
|
||||
pld_info->revision = ACPI_PLD_GET_REVISION(&dword);
|
||||
pld_info->ignore_color = ACPI_PLD_GET_IGNORE_COLOR(&dword);
|
||||
pld_info->color = ACPI_PLD_GET_COLOR(&dword);
|
||||
|
||||
/* Second 32-bit DWord */
|
||||
|
||||
ACPI_MOVE_32_TO_32(&dword, &buffer[1]);
|
||||
pld_info->width = ACPI_PLD_GET_WIDTH(&dword);
|
||||
pld_info->height = ACPI_PLD_GET_HEIGHT(&dword);
|
||||
|
||||
/* Third 32-bit DWord */
|
||||
|
||||
ACPI_MOVE_32_TO_32(&dword, &buffer[2]);
|
||||
pld_info->user_visible = ACPI_PLD_GET_USER_VISIBLE(&dword);
|
||||
pld_info->dock = ACPI_PLD_GET_DOCK(&dword);
|
||||
pld_info->lid = ACPI_PLD_GET_LID(&dword);
|
||||
pld_info->panel = ACPI_PLD_GET_PANEL(&dword);
|
||||
pld_info->vertical_position = ACPI_PLD_GET_VERTICAL(&dword);
|
||||
pld_info->horizontal_position = ACPI_PLD_GET_HORIZONTAL(&dword);
|
||||
pld_info->shape = ACPI_PLD_GET_SHAPE(&dword);
|
||||
pld_info->group_orientation = ACPI_PLD_GET_ORIENTATION(&dword);
|
||||
pld_info->group_token = ACPI_PLD_GET_TOKEN(&dword);
|
||||
pld_info->group_position = ACPI_PLD_GET_POSITION(&dword);
|
||||
pld_info->bay = ACPI_PLD_GET_BAY(&dword);
|
||||
|
||||
/* Fourth 32-bit DWord */
|
||||
|
||||
ACPI_MOVE_32_TO_32(&dword, &buffer[3]);
|
||||
pld_info->ejectable = ACPI_PLD_GET_EJECTABLE(&dword);
|
||||
pld_info->ospm_eject_required = ACPI_PLD_GET_OSPM_EJECT(&dword);
|
||||
pld_info->cabinet_number = ACPI_PLD_GET_CABINET(&dword);
|
||||
pld_info->card_cage_number = ACPI_PLD_GET_CARD_CAGE(&dword);
|
||||
pld_info->reference = ACPI_PLD_GET_REFERENCE(&dword);
|
||||
pld_info->rotation = ACPI_PLD_GET_ROTATION(&dword);
|
||||
pld_info->order = ACPI_PLD_GET_ORDER(&dword);
|
||||
|
||||
if (length >= ACPI_PLD_BUFFER_SIZE) {
|
||||
|
||||
/* Fifth 32-bit DWord (Revision 2 of _PLD) */
|
||||
|
||||
ACPI_MOVE_32_TO_32(&dword, &buffer[4]);
|
||||
pld_info->vertical_offset = ACPI_PLD_GET_VERT_OFFSET(&dword);
|
||||
pld_info->horizontal_offset = ACPI_PLD_GET_HORIZ_OFFSET(&dword);
|
||||
}
|
||||
|
||||
*return_buffer = pld_info;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_decode_pld_buffer)
|
||||
|
|
|
|||
317
drivers/acpi/acpica/utxfinit.c
Normal file
317
drivers/acpi/acpica/utxfinit.c
Normal file
|
|
@ -0,0 +1,317 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Module Name: utxfinit - External interfaces for ACPICA initialization
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2012, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acevents.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acdebug.h"
|
||||
#include "actables.h"
|
||||
|
||||
#define _COMPONENT ACPI_UTILITIES
|
||||
ACPI_MODULE_NAME("utxfinit")
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_initialize_subsystem
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Initializes all global variables. This is the first function
|
||||
* called, so any early initialization belongs here.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_initialize_subsystem(void)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_initialize_subsystem);
|
||||
|
||||
acpi_gbl_startup_flags = ACPI_SUBSYSTEM_INITIALIZE;
|
||||
ACPI_DEBUG_EXEC(acpi_ut_init_stack_ptr_trace());
|
||||
|
||||
/* Initialize the OS-Dependent layer */
|
||||
|
||||
status = acpi_os_initialize();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status, "During OSL initialization"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Initialize all globals used by the subsystem */
|
||||
|
||||
status = acpi_ut_init_globals();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"During initialization of globals"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Create the default mutex objects */
|
||||
|
||||
status = acpi_ut_mutex_initialize();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"During Global Mutex creation"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the namespace manager and
|
||||
* the root of the namespace tree
|
||||
*/
|
||||
status = acpi_ns_root_initialize();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"During Namespace initialization"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Initialize the global OSI interfaces list with the static names */
|
||||
|
||||
status = acpi_ut_initialize_interfaces();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"During OSI interfaces initialization"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* If configured, initialize the AML debugger */
|
||||
|
||||
ACPI_DEBUGGER_EXEC(status = acpi_db_initialize());
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
ACPI_EXPORT_SYMBOL(acpi_initialize_subsystem)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_enable_subsystem
|
||||
*
|
||||
* PARAMETERS: flags - Init/enable Options
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Completes the subsystem initialization including hardware.
|
||||
* Puts system into ACPI mode if it isn't already.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_enable_subsystem(u32 flags)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_enable_subsystem);
|
||||
|
||||
#if (!ACPI_REDUCED_HARDWARE)
|
||||
|
||||
/* Enable ACPI mode */
|
||||
|
||||
if (!(flags & ACPI_NO_ACPI_ENABLE)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Going into ACPI mode\n"));
|
||||
|
||||
acpi_gbl_original_mode = acpi_hw_get_mode();
|
||||
|
||||
status = acpi_enable();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_WARNING((AE_INFO, "AcpiEnable failed"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Obtain a permanent mapping for the FACS. This is required for the
|
||||
* Global Lock and the Firmware Waking Vector
|
||||
*/
|
||||
status = acpi_tb_initialize_facs();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_WARNING((AE_INFO, "Could not map the FACS table"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||
|
||||
/*
|
||||
* Install the default op_region handlers. These are installed unless
|
||||
* other handlers have already been installed via the
|
||||
* install_address_space_handler interface.
|
||||
*/
|
||||
if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Installing default address space handlers\n"));
|
||||
|
||||
status = acpi_ev_install_region_handlers();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
#if (!ACPI_REDUCED_HARDWARE)
|
||||
/*
|
||||
* Initialize ACPI Event handling (Fixed and General Purpose)
|
||||
*
|
||||
* Note1: We must have the hardware and events initialized before we can
|
||||
* execute any control methods safely. Any control method can require
|
||||
* ACPI hardware support, so the hardware must be fully initialized before
|
||||
* any method execution!
|
||||
*
|
||||
* Note2: Fixed events are initialized and enabled here. GPEs are
|
||||
* initialized, but cannot be enabled until after the hardware is
|
||||
* completely initialized (SCI and global_lock activated) and the various
|
||||
* initialization control methods are run (_REG, _STA, _INI) on the
|
||||
* entire namespace.
|
||||
*/
|
||||
if (!(flags & ACPI_NO_EVENT_INIT)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Initializing ACPI events\n"));
|
||||
|
||||
status = acpi_ev_initialize_events();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Install the SCI handler and Global Lock handler. This completes the
|
||||
* hardware initialization.
|
||||
*/
|
||||
if (!(flags & ACPI_NO_HANDLER_INIT)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Installing SCI/GL handlers\n"));
|
||||
|
||||
status = acpi_ev_install_xrupt_handlers();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
ACPI_EXPORT_SYMBOL(acpi_enable_subsystem)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_initialize_objects
|
||||
*
|
||||
* PARAMETERS: flags - Init/enable Options
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Completes namespace initialization by initializing device
|
||||
* objects and executing AML code for Regions, buffers, etc.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_initialize_objects(u32 flags)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_initialize_objects);
|
||||
|
||||
/*
|
||||
* Run all _REG methods
|
||||
*
|
||||
* Note: Any objects accessed by the _REG methods will be automatically
|
||||
* initialized, even if they contain executable AML (see the call to
|
||||
* acpi_ns_initialize_objects below).
|
||||
*/
|
||||
if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Executing _REG OpRegion methods\n"));
|
||||
|
||||
status = acpi_ev_initialize_op_regions();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Execute any module-level code that was detected during the table load
|
||||
* phase. Although illegal since ACPI 2.0, there are many machines that
|
||||
* contain this type of code. Each block of detected executable AML code
|
||||
* outside of any control method is wrapped with a temporary control
|
||||
* method object and placed on a global list. The methods on this list
|
||||
* are executed below.
|
||||
*/
|
||||
acpi_ns_exec_module_code_list();
|
||||
|
||||
/*
|
||||
* Initialize the objects that remain uninitialized. This runs the
|
||||
* executable AML that may be part of the declaration of these objects:
|
||||
* operation_regions, buffer_fields, Buffers, and Packages.
|
||||
*/
|
||||
if (!(flags & ACPI_NO_OBJECT_INIT)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Completing Initialization of ACPI Objects\n"));
|
||||
|
||||
status = acpi_ns_initialize_objects();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize all device objects in the namespace. This runs the device
|
||||
* _STA and _INI methods.
|
||||
*/
|
||||
if (!(flags & ACPI_NO_DEVICE_INIT)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Initializing ACPI Devices\n"));
|
||||
|
||||
status = acpi_ns_initialize_devices();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Empty the caches (delete the cached objects) on the assumption that
|
||||
* the table load filled them up more than they will be at runtime --
|
||||
* thus wasting non-paged memory.
|
||||
*/
|
||||
status = acpi_purge_cached_objects();
|
||||
|
||||
acpi_gbl_startup_flags |= ACPI_INITIALIZED_OK;
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
ACPI_EXPORT_SYMBOL(acpi_initialize_objects)
|
||||
|
|
@ -994,14 +994,18 @@ static int __init acpi_bus_init(void)
|
|||
status = acpi_ec_ecdt_probe();
|
||||
/* Ignore result. Not having an ECDT is not fatal. */
|
||||
|
||||
acpi_bus_osc_support();
|
||||
|
||||
status = acpi_initialize_objects(ACPI_FULL_INITIALIZATION);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
printk(KERN_ERR PREFIX "Unable to initialize ACPI objects\n");
|
||||
goto error1;
|
||||
}
|
||||
|
||||
/*
|
||||
* _OSC method may exist in module level code,
|
||||
* so it must be run after ACPI_FULL_INITIALIZATION
|
||||
*/
|
||||
acpi_bus_osc_support();
|
||||
|
||||
/*
|
||||
* _PDC control method may load dynamic SSDT tables,
|
||||
* and we need to install the table handler before that.
|
||||
|
|
|
|||
|
|
@ -450,15 +450,4 @@ static int acpi_button_remove(struct acpi_device *device, int type)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __init acpi_button_init(void)
|
||||
{
|
||||
return acpi_bus_register_driver(&acpi_button_driver);
|
||||
}
|
||||
|
||||
static void __exit acpi_button_exit(void)
|
||||
{
|
||||
acpi_bus_unregister_driver(&acpi_button_driver);
|
||||
}
|
||||
|
||||
module_init(acpi_button_init);
|
||||
module_exit(acpi_button_exit);
|
||||
module_acpi_driver(acpi_button_driver);
|
||||
|
|
|
|||
|
|
@ -212,24 +212,4 @@ static int acpi_fan_resume(struct device *dev)
|
|||
}
|
||||
#endif
|
||||
|
||||
static int __init acpi_fan_init(void)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
result = acpi_bus_register_driver(&acpi_fan_driver);
|
||||
if (result < 0)
|
||||
return -ENODEV;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit acpi_fan_exit(void)
|
||||
{
|
||||
|
||||
acpi_bus_unregister_driver(&acpi_fan_driver);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
module_init(acpi_fan_init);
|
||||
module_exit(acpi_fan_exit);
|
||||
module_acpi_driver(acpi_fan_driver);
|
||||
|
|
|
|||
|
|
@ -25,6 +25,8 @@
|
|||
static LIST_HEAD(bus_type_list);
|
||||
static DECLARE_RWSEM(bus_type_sem);
|
||||
|
||||
#define PHYSICAL_NODE_STRING "physical_node"
|
||||
|
||||
int register_acpi_bus_type(struct acpi_bus_type *type)
|
||||
{
|
||||
if (acpi_disabled)
|
||||
|
|
@ -124,84 +126,119 @@ acpi_handle acpi_get_child(acpi_handle parent, u64 address)
|
|||
|
||||
EXPORT_SYMBOL(acpi_get_child);
|
||||
|
||||
/* Link ACPI devices with physical devices */
|
||||
static void acpi_glue_data_handler(acpi_handle handle,
|
||||
void *context)
|
||||
{
|
||||
/* we provide an empty handler */
|
||||
}
|
||||
|
||||
/* Note: a success call will increase reference count by one */
|
||||
struct device *acpi_get_physical_device(acpi_handle handle)
|
||||
{
|
||||
acpi_status status;
|
||||
struct device *dev;
|
||||
|
||||
status = acpi_get_data(handle, acpi_glue_data_handler, (void **)&dev);
|
||||
if (ACPI_SUCCESS(status))
|
||||
return get_device(dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(acpi_get_physical_device);
|
||||
|
||||
static int acpi_bind_one(struct device *dev, acpi_handle handle)
|
||||
{
|
||||
struct acpi_device *acpi_dev;
|
||||
acpi_status status;
|
||||
struct acpi_device_physical_node *physical_node;
|
||||
char physical_node_name[sizeof(PHYSICAL_NODE_STRING) + 2];
|
||||
int retval = -EINVAL;
|
||||
|
||||
if (dev->archdata.acpi_handle) {
|
||||
dev_warn(dev, "Drivers changed 'acpi_handle'\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
get_device(dev);
|
||||
status = acpi_attach_data(handle, acpi_glue_data_handler, dev);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
put_device(dev);
|
||||
return -EINVAL;
|
||||
status = acpi_bus_get_device(handle, &acpi_dev);
|
||||
if (ACPI_FAILURE(status))
|
||||
goto err;
|
||||
|
||||
physical_node = kzalloc(sizeof(struct acpi_device_physical_node),
|
||||
GFP_KERNEL);
|
||||
if (!physical_node) {
|
||||
retval = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
mutex_lock(&acpi_dev->physical_node_lock);
|
||||
/* allocate physical node id according to physical_node_id_bitmap */
|
||||
physical_node->node_id =
|
||||
find_first_zero_bit(acpi_dev->physical_node_id_bitmap,
|
||||
ACPI_MAX_PHYSICAL_NODE);
|
||||
if (physical_node->node_id >= ACPI_MAX_PHYSICAL_NODE) {
|
||||
retval = -ENOSPC;
|
||||
mutex_unlock(&acpi_dev->physical_node_lock);
|
||||
goto err;
|
||||
}
|
||||
|
||||
set_bit(physical_node->node_id, acpi_dev->physical_node_id_bitmap);
|
||||
physical_node->dev = dev;
|
||||
list_add_tail(&physical_node->node, &acpi_dev->physical_node_list);
|
||||
acpi_dev->physical_node_count++;
|
||||
mutex_unlock(&acpi_dev->physical_node_lock);
|
||||
|
||||
dev->archdata.acpi_handle = handle;
|
||||
|
||||
status = acpi_bus_get_device(handle, &acpi_dev);
|
||||
if (!ACPI_FAILURE(status)) {
|
||||
int ret;
|
||||
if (!physical_node->node_id)
|
||||
strcpy(physical_node_name, PHYSICAL_NODE_STRING);
|
||||
else
|
||||
sprintf(physical_node_name,
|
||||
"physical_node%d", physical_node->node_id);
|
||||
retval = sysfs_create_link(&acpi_dev->dev.kobj, &dev->kobj,
|
||||
physical_node_name);
|
||||
retval = sysfs_create_link(&dev->kobj, &acpi_dev->dev.kobj,
|
||||
"firmware_node");
|
||||
|
||||
ret = sysfs_create_link(&dev->kobj, &acpi_dev->dev.kobj,
|
||||
"firmware_node");
|
||||
ret = sysfs_create_link(&acpi_dev->dev.kobj, &dev->kobj,
|
||||
"physical_node");
|
||||
if (acpi_dev->wakeup.flags.valid)
|
||||
device_set_wakeup_capable(dev, true);
|
||||
}
|
||||
if (acpi_dev->wakeup.flags.valid)
|
||||
device_set_wakeup_capable(dev, true);
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
put_device(dev);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int acpi_unbind_one(struct device *dev)
|
||||
{
|
||||
struct acpi_device_physical_node *entry;
|
||||
struct acpi_device *acpi_dev;
|
||||
acpi_status status;
|
||||
struct list_head *node, *next;
|
||||
|
||||
if (!dev->archdata.acpi_handle)
|
||||
return 0;
|
||||
if (dev == acpi_get_physical_device(dev->archdata.acpi_handle)) {
|
||||
struct acpi_device *acpi_dev;
|
||||
|
||||
/* acpi_get_physical_device increase refcnt by one */
|
||||
put_device(dev);
|
||||
status = acpi_bus_get_device(dev->archdata.acpi_handle,
|
||||
&acpi_dev);
|
||||
if (ACPI_FAILURE(status))
|
||||
goto err;
|
||||
|
||||
if (!acpi_bus_get_device(dev->archdata.acpi_handle,
|
||||
&acpi_dev)) {
|
||||
sysfs_remove_link(&dev->kobj, "firmware_node");
|
||||
sysfs_remove_link(&acpi_dev->dev.kobj, "physical_node");
|
||||
}
|
||||
mutex_lock(&acpi_dev->physical_node_lock);
|
||||
list_for_each_safe(node, next, &acpi_dev->physical_node_list) {
|
||||
char physical_node_name[sizeof(PHYSICAL_NODE_STRING) + 2];
|
||||
|
||||
acpi_detach_data(dev->archdata.acpi_handle,
|
||||
acpi_glue_data_handler);
|
||||
entry = list_entry(node, struct acpi_device_physical_node,
|
||||
node);
|
||||
if (entry->dev != dev)
|
||||
continue;
|
||||
|
||||
list_del(node);
|
||||
clear_bit(entry->node_id, acpi_dev->physical_node_id_bitmap);
|
||||
|
||||
acpi_dev->physical_node_count--;
|
||||
|
||||
if (!entry->node_id)
|
||||
strcpy(physical_node_name, PHYSICAL_NODE_STRING);
|
||||
else
|
||||
sprintf(physical_node_name,
|
||||
"physical_node%d", entry->node_id);
|
||||
|
||||
sysfs_remove_link(&acpi_dev->dev.kobj, physical_node_name);
|
||||
sysfs_remove_link(&dev->kobj, "firmware_node");
|
||||
dev->archdata.acpi_handle = NULL;
|
||||
/* acpi_bind_one increase refcnt by one */
|
||||
put_device(dev);
|
||||
} else {
|
||||
dev_err(dev, "Oops, 'acpi_handle' corrupt\n");
|
||||
kfree(entry);
|
||||
}
|
||||
mutex_unlock(&acpi_dev->physical_node_lock);
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
dev_err(dev, "Oops, 'acpi_handle' corrupt\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int acpi_platform_notify(struct device *dev)
|
||||
|
|
|
|||
|
|
@ -86,25 +86,7 @@ static struct acpi_driver acpi_hed_driver = {
|
|||
.notify = acpi_hed_notify,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init acpi_hed_init(void)
|
||||
{
|
||||
if (acpi_disabled)
|
||||
return -ENODEV;
|
||||
|
||||
if (acpi_bus_register_driver(&acpi_hed_driver) < 0)
|
||||
return -ENODEV;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit acpi_hed_exit(void)
|
||||
{
|
||||
acpi_bus_unregister_driver(&acpi_hed_driver);
|
||||
}
|
||||
|
||||
module_init(acpi_hed_init);
|
||||
module_exit(acpi_hed_exit);
|
||||
module_acpi_driver(acpi_hed_driver);
|
||||
|
||||
ACPI_MODULE_NAME("hed");
|
||||
MODULE_AUTHOR("Huang Ying");
|
||||
|
|
|
|||
|
|
@ -302,26 +302,41 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
|
|||
list_for_each_safe(node, next, &acpi_wakeup_device_list) {
|
||||
struct acpi_device *dev =
|
||||
container_of(node, struct acpi_device, wakeup_list);
|
||||
struct device *ldev;
|
||||
struct acpi_device_physical_node *entry;
|
||||
|
||||
if (!dev->wakeup.flags.valid)
|
||||
continue;
|
||||
|
||||
ldev = acpi_get_physical_device(dev->handle);
|
||||
seq_printf(seq, "%s\t S%d\t%c%-8s ",
|
||||
seq_printf(seq, "%s\t S%d\t",
|
||||
dev->pnp.bus_id,
|
||||
(u32) dev->wakeup.sleep_state,
|
||||
dev->wakeup.flags.run_wake ? '*' : ' ',
|
||||
(device_may_wakeup(&dev->dev)
|
||||
|| (ldev && device_may_wakeup(ldev))) ?
|
||||
"enabled" : "disabled");
|
||||
if (ldev)
|
||||
seq_printf(seq, "%s:%s",
|
||||
ldev->bus ? ldev->bus->name : "no-bus",
|
||||
dev_name(ldev));
|
||||
seq_printf(seq, "\n");
|
||||
put_device(ldev);
|
||||
(u32) dev->wakeup.sleep_state);
|
||||
|
||||
if (!dev->physical_node_count)
|
||||
seq_printf(seq, "%c%-8s\n",
|
||||
dev->wakeup.flags.run_wake ?
|
||||
'*' : ' ', "disabled");
|
||||
else {
|
||||
struct device *ldev;
|
||||
list_for_each_entry(entry, &dev->physical_node_list,
|
||||
node) {
|
||||
ldev = get_device(entry->dev);
|
||||
if (!ldev)
|
||||
continue;
|
||||
|
||||
if (&entry->node !=
|
||||
dev->physical_node_list.next)
|
||||
seq_printf(seq, "\t\t");
|
||||
|
||||
seq_printf(seq, "%c%-8s %s:%s\n",
|
||||
dev->wakeup.flags.run_wake ? '*' : ' ',
|
||||
(device_may_wakeup(&dev->dev) ||
|
||||
(ldev && device_may_wakeup(ldev))) ?
|
||||
"enabled" : "disabled",
|
||||
ldev->bus ? ldev->bus->name :
|
||||
"no-bus", dev_name(ldev));
|
||||
put_device(ldev);
|
||||
}
|
||||
}
|
||||
}
|
||||
mutex_unlock(&acpi_device_lock);
|
||||
return 0;
|
||||
|
|
@ -329,12 +344,14 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
|
|||
|
||||
static void physical_device_enable_wakeup(struct acpi_device *adev)
|
||||
{
|
||||
struct device *dev = acpi_get_physical_device(adev->handle);
|
||||
struct acpi_device_physical_node *entry;
|
||||
|
||||
if (dev && device_can_wakeup(dev)) {
|
||||
bool enable = !device_may_wakeup(dev);
|
||||
device_set_wakeup_enable(dev, enable);
|
||||
}
|
||||
list_for_each_entry(entry,
|
||||
&adev->physical_node_list, node)
|
||||
if (entry->dev && device_can_wakeup(entry->dev)) {
|
||||
bool enable = !device_may_wakeup(entry->dev);
|
||||
device_set_wakeup_enable(entry->dev, enable);
|
||||
}
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
|
|
|
|||
|
|
@ -310,23 +310,7 @@ static int acpi_smbus_hc_remove(struct acpi_device *device, int type)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __init acpi_smb_hc_init(void)
|
||||
{
|
||||
int result;
|
||||
|
||||
result = acpi_bus_register_driver(&acpi_smb_hc_driver);
|
||||
if (result < 0)
|
||||
return -ENODEV;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit acpi_smb_hc_exit(void)
|
||||
{
|
||||
acpi_bus_unregister_driver(&acpi_smb_hc_driver);
|
||||
}
|
||||
|
||||
module_init(acpi_smb_hc_init);
|
||||
module_exit(acpi_smb_hc_exit);
|
||||
module_acpi_driver(acpi_smb_hc_driver);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Alexey Starikovskiy");
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/signal.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/nls.h>
|
||||
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
|
|
@ -232,8 +233,35 @@ end:
|
|||
}
|
||||
static DEVICE_ATTR(path, 0444, acpi_device_path_show, NULL);
|
||||
|
||||
/* sysfs file that shows description text from the ACPI _STR method */
|
||||
static ssize_t description_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf) {
|
||||
struct acpi_device *acpi_dev = to_acpi_device(dev);
|
||||
int result;
|
||||
|
||||
if (acpi_dev->pnp.str_obj == NULL)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* The _STR object contains a Unicode identifier for a device.
|
||||
* We need to convert to utf-8 so it can be displayed.
|
||||
*/
|
||||
result = utf16s_to_utf8s(
|
||||
(wchar_t *)acpi_dev->pnp.str_obj->buffer.pointer,
|
||||
acpi_dev->pnp.str_obj->buffer.length,
|
||||
UTF16_LITTLE_ENDIAN, buf,
|
||||
PAGE_SIZE);
|
||||
|
||||
buf[result++] = '\n';
|
||||
|
||||
return result;
|
||||
}
|
||||
static DEVICE_ATTR(description, 0444, description_show, NULL);
|
||||
|
||||
static int acpi_device_setup_files(struct acpi_device *dev)
|
||||
{
|
||||
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
|
||||
acpi_status status;
|
||||
acpi_handle temp;
|
||||
int result = 0;
|
||||
|
|
@ -257,6 +285,21 @@ static int acpi_device_setup_files(struct acpi_device *dev)
|
|||
goto end;
|
||||
}
|
||||
|
||||
/*
|
||||
* If device has _STR, 'description' file is created
|
||||
*/
|
||||
status = acpi_get_handle(dev->handle, "_STR", &temp);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
status = acpi_evaluate_object(dev->handle, "_STR",
|
||||
NULL, &buffer);
|
||||
if (ACPI_FAILURE(status))
|
||||
buffer.pointer = NULL;
|
||||
dev->pnp.str_obj = buffer.pointer;
|
||||
result = device_create_file(&dev->dev, &dev_attr_description);
|
||||
if (result)
|
||||
goto end;
|
||||
}
|
||||
|
||||
/*
|
||||
* If device has _EJ0, 'eject' file is created that is used to trigger
|
||||
* hot-removal function from userland.
|
||||
|
|
@ -274,8 +317,15 @@ static void acpi_device_remove_files(struct acpi_device *dev)
|
|||
acpi_handle temp;
|
||||
|
||||
/*
|
||||
* If device has _EJ0, 'eject' file is created that is used to trigger
|
||||
* hot-removal function from userland.
|
||||
* If device has _STR, remove 'description' file
|
||||
*/
|
||||
status = acpi_get_handle(dev->handle, "_STR", &temp);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
kfree(dev->pnp.str_obj);
|
||||
device_remove_file(&dev->dev, &dev_attr_description);
|
||||
}
|
||||
/*
|
||||
* If device has _EJ0, remove 'eject' file.
|
||||
*/
|
||||
status = acpi_get_handle(dev->handle, "_EJ0", &temp);
|
||||
if (ACPI_SUCCESS(status))
|
||||
|
|
@ -481,6 +531,8 @@ static int acpi_device_register(struct acpi_device *device)
|
|||
INIT_LIST_HEAD(&device->children);
|
||||
INIT_LIST_HEAD(&device->node);
|
||||
INIT_LIST_HEAD(&device->wakeup_list);
|
||||
INIT_LIST_HEAD(&device->physical_node_list);
|
||||
mutex_init(&device->physical_node_lock);
|
||||
|
||||
new_bus_id = kzalloc(sizeof(struct acpi_device_bus_id), GFP_KERNEL);
|
||||
if (!new_bus_id) {
|
||||
|
|
|
|||
|
|
@ -240,10 +240,17 @@ acpi_table_parse_entries(char *id,
|
|||
table_end) {
|
||||
if (entry->type == entry_id
|
||||
&& (!max_entries || count++ < max_entries))
|
||||
if (handler(entry, table_end)) {
|
||||
early_acpi_os_unmap_memory((char *)table_header, tbl_size);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (handler(entry, table_end))
|
||||
goto err;
|
||||
|
||||
/*
|
||||
* If entry->length is 0, break from this loop to avoid
|
||||
* infinite loop.
|
||||
*/
|
||||
if (entry->length == 0) {
|
||||
pr_err(PREFIX "[%4.4s:0x%02x] Invalid zero length\n", id, entry_id);
|
||||
goto err;
|
||||
}
|
||||
|
||||
entry = (struct acpi_subtable_header *)
|
||||
((unsigned long)entry + entry->length);
|
||||
|
|
@ -255,6 +262,9 @@ acpi_table_parse_entries(char *id,
|
|||
|
||||
early_acpi_os_unmap_memory((char *)table_header, tbl_size);
|
||||
return count;
|
||||
err:
|
||||
early_acpi_os_unmap_memory((char *)table_header, tbl_size);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
int __init
|
||||
|
|
|
|||
|
|
@ -384,7 +384,7 @@ acpi_evaluate_reference(acpi_handle handle,
|
|||
EXPORT_SYMBOL(acpi_evaluate_reference);
|
||||
|
||||
acpi_status
|
||||
acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld *pld)
|
||||
acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
|
|
@ -400,13 +400,16 @@ acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld *pld)
|
|||
if (!output || output->type != ACPI_TYPE_PACKAGE
|
||||
|| !output->package.count
|
||||
|| output->package.elements[0].type != ACPI_TYPE_BUFFER
|
||||
|| output->package.elements[0].buffer.length > sizeof(*pld)) {
|
||||
|| output->package.elements[0].buffer.length < ACPI_PLD_REV1_BUFFER_SIZE) {
|
||||
status = AE_TYPE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
memcpy(pld, output->package.elements[0].buffer.pointer,
|
||||
output->package.elements[0].buffer.length);
|
||||
status = acpi_decode_pld_buffer(
|
||||
output->package.elements[0].buffer.pointer,
|
||||
output->package.elements[0].buffer.length,
|
||||
pld);
|
||||
|
||||
out:
|
||||
kfree(buffer.pointer);
|
||||
return status;
|
||||
|
|
|
|||
Loading…
Reference in a new issue