mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
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: (34 commits) ACPI: processor: push file static MADT pointer into internal map_madt_entry() ACPI: processor: refactor internal map_lsapic_id() ACPI: processor: refactor internal map_x2apic_id() ACPI: processor: refactor internal map_lapic_id() ACPI: processor: driver doesn't need to evaluate _PDC ACPI: processor: remove early _PDC optin quirks ACPI: processor: add internal processor_physically_present() ACPI: processor: move acpi_get_cpuid into processor_core.c ACPI: processor: export acpi_get_cpuid() ACPI: processor: mv processor_pdc.c processor_core.c ACPI: processor: mv processor_core.c processor_driver.c ACPI: plan to delete "acpi=ht" boot option ACPI: remove "acpi=ht" DMI blacklist PNPACPI: add bus number support PNPACPI: add window support resource: add window support resource: add bus number support resource: expand IORESOURCE_TYPE_BITS to make room for bus resource type acpiphp: Execute ACPI _REG method for hotadded devices ACPI video: Be more liberal in validating _BQC behaviour ...
This commit is contained in:
@@ -582,3 +582,10 @@ Why: The paravirt mmu host support is slower than non-paravirt mmu, both
|
||||
Who: Avi Kivity <avi@redhat.com>
|
||||
|
||||
----------------------------
|
||||
|
||||
What: "acpi=ht" boot option
|
||||
When: 2.6.35
|
||||
Why: Useful in 2003, implementation is a hack.
|
||||
Generally invoked by accident today.
|
||||
Seen as doing more harm than good.
|
||||
Who: Len Brown <len.brown@intel.com>
|
||||
|
||||
@@ -200,10 +200,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
acpi_display_output=video
|
||||
See above.
|
||||
|
||||
acpi_early_pdc_eval [HW,ACPI] Evaluate processor _PDC methods
|
||||
early. Needed on some platforms to properly
|
||||
initialize the EC.
|
||||
|
||||
acpi_irq_balance [HW,ACPI]
|
||||
ACPI will balance active IRQs
|
||||
default in APIC mode
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
#include <linux/efi.h>
|
||||
#include <linux/mmzone.h>
|
||||
#include <linux/nodemask.h>
|
||||
#include <acpi/processor.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/iosapic.h>
|
||||
#include <asm/machvec.h>
|
||||
@@ -907,6 +908,8 @@ int acpi_map_lsapic(acpi_handle handle, int *pcpu)
|
||||
cpu_set(cpu, cpu_present_map);
|
||||
ia64_cpu_to_sapicid[cpu] = physid;
|
||||
|
||||
acpi_processor_set_pdc(handle);
|
||||
|
||||
*pcpu = cpu;
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -490,6 +490,7 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity)
|
||||
* ACPI based hotplug support for CPU
|
||||
*/
|
||||
#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
||||
#include <acpi/processor.h>
|
||||
|
||||
static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
|
||||
{
|
||||
@@ -567,6 +568,8 @@ static int __cpuinit _acpi_map_lsapic(acpi_handle handle, int *pcpu)
|
||||
goto free_new_map;
|
||||
}
|
||||
|
||||
acpi_processor_set_pdc(handle);
|
||||
|
||||
cpu = cpumask_first(new_map);
|
||||
acpi_map_cpu2node(handle, cpu, physid);
|
||||
|
||||
@@ -1292,23 +1295,6 @@ static int __init dmi_disable_acpi(const struct dmi_system_id *d)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Limit ACPI to CPU enumeration for HT
|
||||
*/
|
||||
static int __init force_acpi_ht(const struct dmi_system_id *d)
|
||||
{
|
||||
if (!acpi_force) {
|
||||
printk(KERN_NOTICE "%s detected: force use of acpi=ht\n",
|
||||
d->ident);
|
||||
disable_acpi();
|
||||
acpi_ht = 1;
|
||||
} else {
|
||||
printk(KERN_NOTICE
|
||||
"Warning: acpi=force overrules DMI blacklist: acpi=ht\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Force ignoring BIOS IRQ0 pin2 override
|
||||
*/
|
||||
@@ -1344,82 +1330,6 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = {
|
||||
},
|
||||
},
|
||||
|
||||
/*
|
||||
* Boxes that need acpi=ht
|
||||
*/
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "FSC Primergy T850",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "HP VISUALIZE NT Workstation",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "Compaq Workstation W8000",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Workstation W8000"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "ASUS CUR-DLS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "CUR-DLS"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "ABIT i440BX-W83977",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "ABIT <http://www.abit.com>"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "IBM Bladecenter",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "IBM eServer xSeries 360",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "eServer xSeries 360"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "IBM eserver xSeries 330",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "eserver xSeries 330"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "IBM eserver xSeries 440",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"),
|
||||
},
|
||||
},
|
||||
|
||||
/*
|
||||
* Boxes that need ACPI PCI IRQ routing disabled
|
||||
*/
|
||||
@@ -1652,8 +1562,10 @@ static int __init parse_acpi(char *arg)
|
||||
}
|
||||
/* Limit ACPI just to boot-time to enable HT */
|
||||
else if (strcmp(arg, "ht") == 0) {
|
||||
if (!acpi_force)
|
||||
if (!acpi_force) {
|
||||
printk(KERN_WARNING "acpi=ht will be removed in Linux-2.6.35\n");
|
||||
disable_acpi();
|
||||
}
|
||||
acpi_ht = 1;
|
||||
}
|
||||
/* acpi=rsdt use RSDT instead of XSDT */
|
||||
|
||||
@@ -32,7 +32,7 @@ acpi-$(CONFIG_ACPI_SLEEP) += proc.o
|
||||
#
|
||||
acpi-y += bus.o glue.o
|
||||
acpi-y += scan.o
|
||||
acpi-y += processor_pdc.o
|
||||
acpi-y += processor_core.o
|
||||
acpi-y += ec.o
|
||||
acpi-$(CONFIG_ACPI_DOCK) += dock.o
|
||||
acpi-y += pci_root.o pci_link.o pci_irq.o pci_bind.o
|
||||
@@ -61,7 +61,7 @@ obj-$(CONFIG_ACPI_SBS) += sbs.o
|
||||
obj-$(CONFIG_ACPI_POWER_METER) += power_meter.o
|
||||
|
||||
# processor has its own "processor." module_param namespace
|
||||
processor-y := processor_core.o processor_throttling.o
|
||||
processor-y := processor_driver.o processor_throttling.o
|
||||
processor-y += processor_idle.o processor_thermal.o
|
||||
processor-$(CONFIG_CPU_FREQ) += processor_perflib.o
|
||||
|
||||
|
||||
@@ -375,8 +375,7 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
|
||||
return_ACPI_STATUS(AE_AML_MUTEX_NOT_ACQUIRED);
|
||||
}
|
||||
|
||||
/* Must have a valid thread ID */
|
||||
|
||||
/* Must have a valid thread. */
|
||||
if (!walk_state->thread) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Cannot release Mutex [%4.4s], null thread info",
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
#define ACPI_BATTERY_DEVICE_NAME "Battery"
|
||||
#define ACPI_BATTERY_NOTIFY_STATUS 0x80
|
||||
#define ACPI_BATTERY_NOTIFY_INFO 0x81
|
||||
#define ACPI_BATTERY_NOTIFY_THRESHOLD 0x82
|
||||
|
||||
#define _COMPONENT ACPI_BATTERY_COMPONENT
|
||||
|
||||
@@ -88,10 +89,15 @@ static const struct acpi_device_id battery_device_ids[] = {
|
||||
|
||||
MODULE_DEVICE_TABLE(acpi, battery_device_ids);
|
||||
|
||||
/* For buggy DSDTs that report negative 16-bit values for either charging
|
||||
* or discharging current and/or report 0 as 65536 due to bad math.
|
||||
*/
|
||||
#define QUIRK_SIGNED16_CURRENT 0x0001
|
||||
enum {
|
||||
ACPI_BATTERY_ALARM_PRESENT,
|
||||
ACPI_BATTERY_XINFO_PRESENT,
|
||||
/* For buggy DSDTs that report negative 16-bit values for either
|
||||
* charging or discharging current and/or report 0 as 65536
|
||||
* due to bad math.
|
||||
*/
|
||||
ACPI_BATTERY_QUIRK_SIGNED16_CURRENT,
|
||||
};
|
||||
|
||||
struct acpi_battery {
|
||||
struct mutex lock;
|
||||
@@ -109,6 +115,12 @@ struct acpi_battery {
|
||||
int design_voltage;
|
||||
int design_capacity_warning;
|
||||
int design_capacity_low;
|
||||
int cycle_count;
|
||||
int measurement_accuracy;
|
||||
int max_sampling_time;
|
||||
int min_sampling_time;
|
||||
int max_averaging_interval;
|
||||
int min_averaging_interval;
|
||||
int capacity_granularity_1;
|
||||
int capacity_granularity_2;
|
||||
int alarm;
|
||||
@@ -118,8 +130,7 @@ struct acpi_battery {
|
||||
char oem_info[32];
|
||||
int state;
|
||||
int power_unit;
|
||||
u8 alarm_present;
|
||||
long quirks;
|
||||
unsigned long flags;
|
||||
};
|
||||
|
||||
#define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
|
||||
@@ -198,6 +209,9 @@ static int acpi_battery_get_property(struct power_supply *psy,
|
||||
case POWER_SUPPLY_PROP_TECHNOLOGY:
|
||||
val->intval = acpi_battery_technology(battery);
|
||||
break;
|
||||
case POWER_SUPPLY_PROP_CYCLE_COUNT:
|
||||
val->intval = battery->cycle_count;
|
||||
break;
|
||||
case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
|
||||
val->intval = battery->design_voltage * 1000;
|
||||
break;
|
||||
@@ -239,6 +253,7 @@ static enum power_supply_property charge_battery_props[] = {
|
||||
POWER_SUPPLY_PROP_STATUS,
|
||||
POWER_SUPPLY_PROP_PRESENT,
|
||||
POWER_SUPPLY_PROP_TECHNOLOGY,
|
||||
POWER_SUPPLY_PROP_CYCLE_COUNT,
|
||||
POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
|
||||
POWER_SUPPLY_PROP_VOLTAGE_NOW,
|
||||
POWER_SUPPLY_PROP_CURRENT_NOW,
|
||||
@@ -254,6 +269,7 @@ static enum power_supply_property energy_battery_props[] = {
|
||||
POWER_SUPPLY_PROP_STATUS,
|
||||
POWER_SUPPLY_PROP_PRESENT,
|
||||
POWER_SUPPLY_PROP_TECHNOLOGY,
|
||||
POWER_SUPPLY_PROP_CYCLE_COUNT,
|
||||
POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
|
||||
POWER_SUPPLY_PROP_VOLTAGE_NOW,
|
||||
POWER_SUPPLY_PROP_CURRENT_NOW,
|
||||
@@ -305,6 +321,28 @@ static struct acpi_offsets info_offsets[] = {
|
||||
{offsetof(struct acpi_battery, oem_info), 1},
|
||||
};
|
||||
|
||||
static struct acpi_offsets extended_info_offsets[] = {
|
||||
{offsetof(struct acpi_battery, power_unit), 0},
|
||||
{offsetof(struct acpi_battery, design_capacity), 0},
|
||||
{offsetof(struct acpi_battery, full_charge_capacity), 0},
|
||||
{offsetof(struct acpi_battery, technology), 0},
|
||||
{offsetof(struct acpi_battery, design_voltage), 0},
|
||||
{offsetof(struct acpi_battery, design_capacity_warning), 0},
|
||||
{offsetof(struct acpi_battery, design_capacity_low), 0},
|
||||
{offsetof(struct acpi_battery, cycle_count), 0},
|
||||
{offsetof(struct acpi_battery, measurement_accuracy), 0},
|
||||
{offsetof(struct acpi_battery, max_sampling_time), 0},
|
||||
{offsetof(struct acpi_battery, min_sampling_time), 0},
|
||||
{offsetof(struct acpi_battery, max_averaging_interval), 0},
|
||||
{offsetof(struct acpi_battery, min_averaging_interval), 0},
|
||||
{offsetof(struct acpi_battery, capacity_granularity_1), 0},
|
||||
{offsetof(struct acpi_battery, capacity_granularity_2), 0},
|
||||
{offsetof(struct acpi_battery, model_number), 1},
|
||||
{offsetof(struct acpi_battery, serial_number), 1},
|
||||
{offsetof(struct acpi_battery, type), 1},
|
||||
{offsetof(struct acpi_battery, oem_info), 1},
|
||||
};
|
||||
|
||||
static int extract_package(struct acpi_battery *battery,
|
||||
union acpi_object *package,
|
||||
struct acpi_offsets *offsets, int num)
|
||||
@@ -350,22 +388,29 @@ static int acpi_battery_get_info(struct acpi_battery *battery)
|
||||
{
|
||||
int result = -EFAULT;
|
||||
acpi_status status = 0;
|
||||
char *name = test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags)?
|
||||
"_BIX" : "_BIF";
|
||||
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
|
||||
if (!acpi_battery_present(battery))
|
||||
return 0;
|
||||
mutex_lock(&battery->lock);
|
||||
status = acpi_evaluate_object(battery->device->handle, "_BIF",
|
||||
NULL, &buffer);
|
||||
status = acpi_evaluate_object(battery->device->handle, name,
|
||||
NULL, &buffer);
|
||||
mutex_unlock(&battery->lock);
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status, "Evaluating _BIF"));
|
||||
ACPI_EXCEPTION((AE_INFO, status, "Evaluating %s", name));
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
result = extract_package(battery, buffer.pointer,
|
||||
info_offsets, ARRAY_SIZE(info_offsets));
|
||||
if (test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags))
|
||||
result = extract_package(battery, buffer.pointer,
|
||||
extended_info_offsets,
|
||||
ARRAY_SIZE(extended_info_offsets));
|
||||
else
|
||||
result = extract_package(battery, buffer.pointer,
|
||||
info_offsets, ARRAY_SIZE(info_offsets));
|
||||
kfree(buffer.pointer);
|
||||
return result;
|
||||
}
|
||||
@@ -399,7 +444,7 @@ static int acpi_battery_get_state(struct acpi_battery *battery)
|
||||
battery->update_time = jiffies;
|
||||
kfree(buffer.pointer);
|
||||
|
||||
if ((battery->quirks & QUIRK_SIGNED16_CURRENT) &&
|
||||
if (test_bit(ACPI_BATTERY_QUIRK_SIGNED16_CURRENT, &battery->flags) &&
|
||||
battery->rate_now != -1)
|
||||
battery->rate_now = abs((s16)battery->rate_now);
|
||||
|
||||
@@ -412,7 +457,8 @@ static int acpi_battery_set_alarm(struct acpi_battery *battery)
|
||||
union acpi_object arg0 = { .type = ACPI_TYPE_INTEGER };
|
||||
struct acpi_object_list arg_list = { 1, &arg0 };
|
||||
|
||||
if (!acpi_battery_present(battery)|| !battery->alarm_present)
|
||||
if (!acpi_battery_present(battery) ||
|
||||
!test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags))
|
||||
return -ENODEV;
|
||||
|
||||
arg0.integer.value = battery->alarm;
|
||||
@@ -437,10 +483,10 @@ static int acpi_battery_init_alarm(struct acpi_battery *battery)
|
||||
/* See if alarms are supported, and if so, set default */
|
||||
status = acpi_get_handle(battery->device->handle, "_BTP", &handle);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
battery->alarm_present = 0;
|
||||
clear_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags);
|
||||
return 0;
|
||||
}
|
||||
battery->alarm_present = 1;
|
||||
set_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags);
|
||||
if (!battery->alarm)
|
||||
battery->alarm = battery->design_capacity_warning;
|
||||
return acpi_battery_set_alarm(battery);
|
||||
@@ -510,9 +556,8 @@ static void sysfs_remove_battery(struct acpi_battery *battery)
|
||||
|
||||
static void acpi_battery_quirks(struct acpi_battery *battery)
|
||||
{
|
||||
battery->quirks = 0;
|
||||
if (dmi_name_in_vendors("Acer") && battery->power_unit) {
|
||||
battery->quirks |= QUIRK_SIGNED16_CURRENT;
|
||||
set_bit(ACPI_BATTERY_QUIRK_SIGNED16_CURRENT, &battery->flags);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -590,6 +635,7 @@ static int acpi_battery_print_info(struct seq_file *seq, int result)
|
||||
seq_printf(seq, "design capacity low: %d %sh\n",
|
||||
battery->design_capacity_low,
|
||||
acpi_battery_units(battery));
|
||||
seq_printf(seq, "cycle count: %i\n", battery->cycle_count);
|
||||
seq_printf(seq, "capacity granularity 1: %d %sh\n",
|
||||
battery->capacity_granularity_1,
|
||||
acpi_battery_units(battery));
|
||||
@@ -841,6 +887,7 @@ static int acpi_battery_add(struct acpi_device *device)
|
||||
{
|
||||
int result = 0;
|
||||
struct acpi_battery *battery = NULL;
|
||||
acpi_handle handle;
|
||||
if (!device)
|
||||
return -EINVAL;
|
||||
battery = kzalloc(sizeof(struct acpi_battery), GFP_KERNEL);
|
||||
@@ -851,6 +898,9 @@ static int acpi_battery_add(struct acpi_device *device)
|
||||
strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS);
|
||||
device->driver_data = battery;
|
||||
mutex_init(&battery->lock);
|
||||
if (ACPI_SUCCESS(acpi_get_handle(battery->device->handle,
|
||||
"_BIX", &handle)))
|
||||
set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags);
|
||||
acpi_battery_update(battery);
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
result = acpi_battery_add_fs(device);
|
||||
|
||||
@@ -190,16 +190,16 @@ int acpi_bus_get_power(acpi_handle handle, int *state)
|
||||
* Get the device's power state either directly (via _PSC) or
|
||||
* indirectly (via power resources).
|
||||
*/
|
||||
if (device->power.flags.explicit_get) {
|
||||
if (device->power.flags.power_resources) {
|
||||
result = acpi_power_get_inferred_state(device);
|
||||
if (result)
|
||||
return result;
|
||||
} else if (device->power.flags.explicit_get) {
|
||||
status = acpi_evaluate_integer(device->handle, "_PSC",
|
||||
NULL, &psc);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
device->power.state = (int)psc;
|
||||
} else if (device->power.flags.power_resources) {
|
||||
result = acpi_power_get_inferred_state(device);
|
||||
if (result)
|
||||
return result;
|
||||
}
|
||||
|
||||
*state = device->power.state;
|
||||
|
||||
@@ -76,8 +76,9 @@ enum ec_command {
|
||||
enum {
|
||||
EC_FLAGS_QUERY_PENDING, /* Query is pending */
|
||||
EC_FLAGS_GPE_STORM, /* GPE storm detected */
|
||||
EC_FLAGS_HANDLERS_INSTALLED /* Handlers for GPE and
|
||||
EC_FLAGS_HANDLERS_INSTALLED, /* Handlers for GPE and
|
||||
* OpReg are installed */
|
||||
EC_FLAGS_FROZEN, /* Transactions are suspended */
|
||||
};
|
||||
|
||||
/* If we find an EC via the ECDT, we need to keep a ptr to its context */
|
||||
@@ -291,6 +292,10 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
|
||||
if (t->rdata)
|
||||
memset(t->rdata, 0, t->rlen);
|
||||
mutex_lock(&ec->lock);
|
||||
if (test_bit(EC_FLAGS_FROZEN, &ec->flags)) {
|
||||
status = -EINVAL;
|
||||
goto unlock;
|
||||
}
|
||||
if (ec->global_lock) {
|
||||
status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
@@ -453,6 +458,32 @@ int ec_transaction(u8 command,
|
||||
|
||||
EXPORT_SYMBOL(ec_transaction);
|
||||
|
||||
void acpi_ec_suspend_transactions(void)
|
||||
{
|
||||
struct acpi_ec *ec = first_ec;
|
||||
|
||||
if (!ec)
|
||||
return;
|
||||
|
||||
mutex_lock(&ec->lock);
|
||||
/* Prevent transactions from being carried out */
|
||||
set_bit(EC_FLAGS_FROZEN, &ec->flags);
|
||||
mutex_unlock(&ec->lock);
|
||||
}
|
||||
|
||||
void acpi_ec_resume_transactions(void)
|
||||
{
|
||||
struct acpi_ec *ec = first_ec;
|
||||
|
||||
if (!ec)
|
||||
return;
|
||||
|
||||
mutex_lock(&ec->lock);
|
||||
/* Allow transactions to be carried out again */
|
||||
clear_bit(EC_FLAGS_FROZEN, &ec->flags);
|
||||
mutex_unlock(&ec->lock);
|
||||
}
|
||||
|
||||
static int acpi_ec_query_unlocked(struct acpi_ec *ec, u8 * data)
|
||||
{
|
||||
int result;
|
||||
|
||||
@@ -49,6 +49,8 @@ void acpi_early_processor_set_pdc(void);
|
||||
int acpi_ec_init(void);
|
||||
int acpi_ec_ecdt_probe(void);
|
||||
int acpi_boot_ec_enable(void);
|
||||
void acpi_ec_suspend_transactions(void);
|
||||
void acpi_ec_resume_transactions(void);
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
Suspend/Resume
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
978
drivers/acpi/processor_driver.c
Normal file
978
drivers/acpi/processor_driver.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,209 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2005 Intel Corporation
|
||||
* Copyright (C) 2009 Hewlett-Packard Development Company, L.P.
|
||||
*
|
||||
* Alex Chiang <achiang@hp.com>
|
||||
* - Unified x86/ia64 implementations
|
||||
* Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
|
||||
* - Added _PDC for platforms with Intel CPUs
|
||||
*/
|
||||
#include <linux/dmi.h>
|
||||
|
||||
#include <acpi/acpi_drivers.h>
|
||||
#include <acpi/processor.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
#define PREFIX "ACPI: "
|
||||
#define _COMPONENT ACPI_PROCESSOR_COMPONENT
|
||||
ACPI_MODULE_NAME("processor_pdc");
|
||||
|
||||
static int set_no_mwait(const struct dmi_system_id *id)
|
||||
{
|
||||
printk(KERN_NOTICE PREFIX "%s detected - "
|
||||
"disabling mwait for CPU C-states\n", id->ident);
|
||||
idle_nomwait = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dmi_system_id __cpuinitdata processor_idle_dmi_table[] = {
|
||||
{
|
||||
set_no_mwait, "IFL91 board", {
|
||||
DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"),
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ZEPTO"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "3215W"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "IFL91") }, NULL},
|
||||
{
|
||||
set_no_mwait, "Extensa 5220", {
|
||||
DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "0100"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "Columbia") }, NULL},
|
||||
{},
|
||||
};
|
||||
|
||||
static void acpi_set_pdc_bits(u32 *buf)
|
||||
{
|
||||
buf[0] = ACPI_PDC_REVISION_ID;
|
||||
buf[1] = 1;
|
||||
|
||||
/* Enable coordination with firmware's _TSD info */
|
||||
buf[2] = ACPI_PDC_SMP_T_SWCOORD;
|
||||
|
||||
/* Twiddle arch-specific bits needed for _PDC */
|
||||
arch_acpi_set_pdc_bits(buf);
|
||||
}
|
||||
|
||||
static struct acpi_object_list *acpi_processor_alloc_pdc(void)
|
||||
{
|
||||
struct acpi_object_list *obj_list;
|
||||
union acpi_object *obj;
|
||||
u32 *buf;
|
||||
|
||||
/* allocate and initialize pdc. It will be used later. */
|
||||
obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
|
||||
if (!obj_list) {
|
||||
printk(KERN_ERR "Memory allocation error\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
|
||||
if (!obj) {
|
||||
printk(KERN_ERR "Memory allocation error\n");
|
||||
kfree(obj_list);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buf = kmalloc(12, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
printk(KERN_ERR "Memory allocation error\n");
|
||||
kfree(obj);
|
||||
kfree(obj_list);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
acpi_set_pdc_bits(buf);
|
||||
|
||||
obj->type = ACPI_TYPE_BUFFER;
|
||||
obj->buffer.length = 12;
|
||||
obj->buffer.pointer = (u8 *) buf;
|
||||
obj_list->count = 1;
|
||||
obj_list->pointer = obj;
|
||||
|
||||
return obj_list;
|
||||
}
|
||||
|
||||
/*
|
||||
* _PDC is required for a BIOS-OS handshake for most of the newer
|
||||
* ACPI processor features.
|
||||
*/
|
||||
static int
|
||||
acpi_processor_eval_pdc(acpi_handle handle, struct acpi_object_list *pdc_in)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
|
||||
if (idle_nomwait) {
|
||||
/*
|
||||
* If mwait is disabled for CPU C-states, the C2C3_FFH access
|
||||
* mode will be disabled in the parameter of _PDC object.
|
||||
* Of course C1_FFH access mode will also be disabled.
|
||||
*/
|
||||
union acpi_object *obj;
|
||||
u32 *buffer = NULL;
|
||||
|
||||
obj = pdc_in->pointer;
|
||||
buffer = (u32 *)(obj->buffer.pointer);
|
||||
buffer[2] &= ~(ACPI_PDC_C_C2C3_FFH | ACPI_PDC_C_C1_FFH);
|
||||
|
||||
}
|
||||
status = acpi_evaluate_object(handle, "_PDC", pdc_in, NULL);
|
||||
|
||||
if (ACPI_FAILURE(status))
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Could not evaluate _PDC, using legacy perf. control.\n"));
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static int early_pdc_done;
|
||||
|
||||
void acpi_processor_set_pdc(acpi_handle handle)
|
||||
{
|
||||
struct acpi_object_list *obj_list;
|
||||
|
||||
if (arch_has_acpi_pdc() == false)
|
||||
return;
|
||||
|
||||
if (early_pdc_done)
|
||||
return;
|
||||
|
||||
obj_list = acpi_processor_alloc_pdc();
|
||||
if (!obj_list)
|
||||
return;
|
||||
|
||||
acpi_processor_eval_pdc(handle, obj_list);
|
||||
|
||||
kfree(obj_list->pointer->buffer.pointer);
|
||||
kfree(obj_list->pointer);
|
||||
kfree(obj_list);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_processor_set_pdc);
|
||||
|
||||
static int early_pdc_optin;
|
||||
static int set_early_pdc_optin(const struct dmi_system_id *id)
|
||||
{
|
||||
early_pdc_optin = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int param_early_pdc_optin(char *s)
|
||||
{
|
||||
early_pdc_optin = 1;
|
||||
return 1;
|
||||
}
|
||||
__setup("acpi_early_pdc_eval", param_early_pdc_optin);
|
||||
|
||||
static struct dmi_system_id __cpuinitdata early_pdc_optin_table[] = {
|
||||
{
|
||||
set_early_pdc_optin, "HP Envy", {
|
||||
DMI_MATCH(DMI_BIOS_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Envy") }, NULL},
|
||||
{
|
||||
set_early_pdc_optin, "HP Pavilion dv6", {
|
||||
DMI_MATCH(DMI_BIOS_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv6") }, NULL},
|
||||
{
|
||||
set_early_pdc_optin, "HP Pavilion dv7", {
|
||||
DMI_MATCH(DMI_BIOS_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv7") }, NULL},
|
||||
{},
|
||||
};
|
||||
|
||||
static acpi_status
|
||||
early_init_pdc(acpi_handle handle, u32 lvl, void *context, void **rv)
|
||||
{
|
||||
acpi_processor_set_pdc(handle);
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
void __init acpi_early_processor_set_pdc(void)
|
||||
{
|
||||
/*
|
||||
* Check whether the system is DMI table. If yes, OSPM
|
||||
* should not use mwait for CPU-states.
|
||||
*/
|
||||
dmi_check_system(processor_idle_dmi_table);
|
||||
|
||||
/*
|
||||
* Allow systems to opt-in to early _PDC evaluation.
|
||||
*/
|
||||
dmi_check_system(early_pdc_optin_table);
|
||||
if (!early_pdc_optin)
|
||||
return;
|
||||
|
||||
acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
|
||||
ACPI_UINT32_MAX,
|
||||
early_init_pdc, NULL, NULL, NULL);
|
||||
|
||||
early_pdc_done = 1;
|
||||
}
|
||||
@@ -1133,9 +1133,6 @@ int acpi_processor_get_throttling_info(struct acpi_processor *pr)
|
||||
int result = 0;
|
||||
struct acpi_processor_throttling *pthrottling;
|
||||
|
||||
if (!pr)
|
||||
return -EINVAL;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"pblk_address[0x%08x] duty_offset[%d] duty_width[%d]\n",
|
||||
pr->throttling.address,
|
||||
|
||||
@@ -217,6 +217,9 @@ static int acpi_sbs_battery_get_property(struct power_supply *psy,
|
||||
case POWER_SUPPLY_PROP_TECHNOLOGY:
|
||||
val->intval = acpi_battery_technology(battery);
|
||||
break;
|
||||
case POWER_SUPPLY_PROP_CYCLE_COUNT:
|
||||
val->intval = battery->cycle_count;
|
||||
break;
|
||||
case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
|
||||
val->intval = battery->design_voltage *
|
||||
acpi_battery_vscale(battery) * 1000;
|
||||
@@ -276,6 +279,7 @@ static enum power_supply_property sbs_charge_battery_props[] = {
|
||||
POWER_SUPPLY_PROP_STATUS,
|
||||
POWER_SUPPLY_PROP_PRESENT,
|
||||
POWER_SUPPLY_PROP_TECHNOLOGY,
|
||||
POWER_SUPPLY_PROP_CYCLE_COUNT,
|
||||
POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
|
||||
POWER_SUPPLY_PROP_VOLTAGE_NOW,
|
||||
POWER_SUPPLY_PROP_CURRENT_NOW,
|
||||
@@ -560,6 +564,7 @@ static int acpi_battery_read_info(struct seq_file *seq, void *offset)
|
||||
battery->design_voltage * acpi_battery_vscale(battery));
|
||||
seq_printf(seq, "design capacity warning: unknown\n");
|
||||
seq_printf(seq, "design capacity low: unknown\n");
|
||||
seq_printf(seq, "cycle count: %i\n", battery->cycle_count);
|
||||
seq_printf(seq, "capacity granularity 1: unknown\n");
|
||||
seq_printf(seq, "capacity granularity 2: unknown\n");
|
||||
seq_printf(seq, "model number: %s\n", battery->device_name);
|
||||
|
||||
@@ -552,8 +552,17 @@ static void acpi_hibernation_leave(void)
|
||||
hibernate_nvs_restore();
|
||||
}
|
||||
|
||||
static void acpi_pm_enable_gpes(void)
|
||||
static int acpi_pm_pre_restore(void)
|
||||
{
|
||||
acpi_disable_all_gpes();
|
||||
acpi_os_wait_events_complete(NULL);
|
||||
acpi_ec_suspend_transactions();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void acpi_pm_restore_cleanup(void)
|
||||
{
|
||||
acpi_ec_resume_transactions();
|
||||
acpi_enable_all_runtime_gpes();
|
||||
}
|
||||
|
||||
@@ -565,8 +574,8 @@ static struct platform_hibernation_ops acpi_hibernation_ops = {
|
||||
.prepare = acpi_pm_prepare,
|
||||
.enter = acpi_hibernation_enter,
|
||||
.leave = acpi_hibernation_leave,
|
||||
.pre_restore = acpi_pm_disable_gpes,
|
||||
.restore_cleanup = acpi_pm_enable_gpes,
|
||||
.pre_restore = acpi_pm_pre_restore,
|
||||
.restore_cleanup = acpi_pm_restore_cleanup,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -618,8 +627,8 @@ static struct platform_hibernation_ops acpi_hibernation_ops_old = {
|
||||
.prepare = acpi_pm_disable_gpes,
|
||||
.enter = acpi_hibernation_enter,
|
||||
.leave = acpi_hibernation_leave,
|
||||
.pre_restore = acpi_pm_disable_gpes,
|
||||
.restore_cleanup = acpi_pm_enable_gpes,
|
||||
.pre_restore = acpi_pm_pre_restore,
|
||||
.restore_cleanup = acpi_pm_restore_cleanup,
|
||||
.recover = acpi_pm_finish,
|
||||
};
|
||||
#endif /* CONFIG_HIBERNATION */
|
||||
|
||||
@@ -368,7 +368,7 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
|
||||
int valid = 0;
|
||||
int i;
|
||||
|
||||
/* Critical Shutdown (required) */
|
||||
/* Critical Shutdown */
|
||||
if (flag & ACPI_TRIPS_CRITICAL) {
|
||||
status = acpi_evaluate_integer(tz->device->handle,
|
||||
"_CRT", NULL, &tmp);
|
||||
@@ -379,17 +379,19 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
|
||||
* Below zero (Celsius) values clearly aren't right for sure..
|
||||
* ... so lets discard those as invalid.
|
||||
*/
|
||||
if (ACPI_FAILURE(status) ||
|
||||
tz->trips.critical.temperature <= 2732) {
|
||||
if (ACPI_FAILURE(status)) {
|
||||
tz->trips.critical.flags.valid = 0;
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"No critical threshold\n"));
|
||||
} else if (tmp <= 2732) {
|
||||
printk(KERN_WARNING FW_BUG "Invalid critical threshold "
|
||||
"(%llu)\n", tmp);
|
||||
tz->trips.critical.flags.valid = 0;
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"No or invalid critical threshold"));
|
||||
return -ENODEV;
|
||||
} else {
|
||||
tz->trips.critical.flags.valid = 1;
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Found critical threshold [%lu]\n",
|
||||
tz->trips.critical.temperature));
|
||||
"Found critical threshold [%lu]\n",
|
||||
tz->trips.critical.temperature));
|
||||
}
|
||||
if (tz->trips.critical.flags.valid == 1) {
|
||||
if (crt == -1) {
|
||||
@@ -575,7 +577,23 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
|
||||
|
||||
static int acpi_thermal_get_trip_points(struct acpi_thermal *tz)
|
||||
{
|
||||
return acpi_thermal_trips_update(tz, ACPI_TRIPS_INIT);
|
||||
int i, valid, ret = acpi_thermal_trips_update(tz, ACPI_TRIPS_INIT);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
valid = tz->trips.critical.flags.valid |
|
||||
tz->trips.hot.flags.valid |
|
||||
tz->trips.passive.flags.valid;
|
||||
|
||||
for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++)
|
||||
valid |= tz->trips.active[i].flags.valid;
|
||||
|
||||
if (!valid) {
|
||||
printk(KERN_WARNING FW_BUG "No valid trip found\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void acpi_thermal_check(void *data)
|
||||
|
||||
@@ -289,51 +289,6 @@ acpi_evaluate_integer(acpi_handle handle,
|
||||
|
||||
EXPORT_SYMBOL(acpi_evaluate_integer);
|
||||
|
||||
#if 0
|
||||
acpi_status
|
||||
acpi_evaluate_string(acpi_handle handle,
|
||||
acpi_string pathname,
|
||||
acpi_object_list * arguments, acpi_string * data)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
acpi_object *element = NULL;
|
||||
acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
|
||||
|
||||
if (!data)
|
||||
return AE_BAD_PARAMETER;
|
||||
|
||||
status = acpi_evaluate_object(handle, pathname, arguments, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_util_eval_error(handle, pathname, status);
|
||||
return status;
|
||||
}
|
||||
|
||||
element = (acpi_object *) buffer.pointer;
|
||||
|
||||
if ((element->type != ACPI_TYPE_STRING)
|
||||
|| (element->type != ACPI_TYPE_BUFFER)
|
||||
|| !element->string.length) {
|
||||
acpi_util_eval_error(handle, pathname, AE_BAD_DATA);
|
||||
return AE_BAD_DATA;
|
||||
}
|
||||
|
||||
*data = kzalloc(element->string.length + 1, GFP_KERNEL);
|
||||
if (!data) {
|
||||
printk(KERN_ERR PREFIX "Memory allocation\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memcpy(*data, element->string.pointer, element->string.length);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Return value [%s]\n", *data));
|
||||
|
||||
kfree(buffer.pointer);
|
||||
|
||||
return AE_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
acpi_status
|
||||
acpi_evaluate_reference(acpi_handle handle,
|
||||
acpi_string pathname,
|
||||
|
||||
@@ -327,7 +327,7 @@ static int acpi_video_device_lcd_set_level(struct acpi_video_device *device,
|
||||
int level);
|
||||
static int acpi_video_device_lcd_get_level_current(
|
||||
struct acpi_video_device *device,
|
||||
unsigned long long *level);
|
||||
unsigned long long *level, int init);
|
||||
static int acpi_video_get_next_level(struct acpi_video_device *device,
|
||||
u32 level_current, u32 event);
|
||||
static int acpi_video_switch_brightness(struct acpi_video_device *device,
|
||||
@@ -345,7 +345,7 @@ static int acpi_video_get_brightness(struct backlight_device *bd)
|
||||
struct acpi_video_device *vd =
|
||||
(struct acpi_video_device *)bl_get_data(bd);
|
||||
|
||||
if (acpi_video_device_lcd_get_level_current(vd, &cur_level))
|
||||
if (acpi_video_device_lcd_get_level_current(vd, &cur_level, 0))
|
||||
return -EINVAL;
|
||||
for (i = 2; i < vd->brightness->count; i++) {
|
||||
if (vd->brightness->levels[i] == cur_level)
|
||||
@@ -414,7 +414,7 @@ static int video_get_cur_state(struct thermal_cooling_device *cooling_dev, unsig
|
||||
unsigned long long level;
|
||||
int offset;
|
||||
|
||||
if (acpi_video_device_lcd_get_level_current(video, &level))
|
||||
if (acpi_video_device_lcd_get_level_current(video, &level, 0))
|
||||
return -EINVAL;
|
||||
for (offset = 2; offset < video->brightness->count; offset++)
|
||||
if (level == video->brightness->levels[offset]) {
|
||||
@@ -609,7 +609,7 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
|
||||
|
||||
static int
|
||||
acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
|
||||
unsigned long long *level)
|
||||
unsigned long long *level, int init)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
int i;
|
||||
@@ -633,10 +633,16 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
|
||||
device->brightness->curr = *level;
|
||||
return 0;
|
||||
}
|
||||
/* BQC returned an invalid level. Stop using it. */
|
||||
ACPI_WARNING((AE_INFO, "%s returned an invalid level",
|
||||
buf));
|
||||
device->cap._BQC = device->cap._BCQ = 0;
|
||||
if (!init) {
|
||||
/*
|
||||
* BQC returned an invalid level.
|
||||
* Stop using it.
|
||||
*/
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"%s returned an invalid level",
|
||||
buf));
|
||||
device->cap._BQC = device->cap._BCQ = 0;
|
||||
}
|
||||
} else {
|
||||
/* Fixme:
|
||||
* should we return an error or ignore this failure?
|
||||
@@ -892,7 +898,7 @@ acpi_video_init_brightness(struct acpi_video_device *device)
|
||||
if (!device->cap._BQC)
|
||||
goto set_level;
|
||||
|
||||
result = acpi_video_device_lcd_get_level_current(device, &level_old);
|
||||
result = acpi_video_device_lcd_get_level_current(device, &level_old, 1);
|
||||
if (result)
|
||||
goto out_free_levels;
|
||||
|
||||
@@ -903,7 +909,7 @@ acpi_video_init_brightness(struct acpi_video_device *device)
|
||||
if (result)
|
||||
goto out_free_levels;
|
||||
|
||||
result = acpi_video_device_lcd_get_level_current(device, &level);
|
||||
result = acpi_video_device_lcd_get_level_current(device, &level, 0);
|
||||
if (result)
|
||||
goto out_free_levels;
|
||||
|
||||
@@ -1996,7 +2002,7 @@ acpi_video_switch_brightness(struct acpi_video_device *device, int event)
|
||||
goto out;
|
||||
|
||||
result = acpi_video_device_lcd_get_level_current(device,
|
||||
&level_current);
|
||||
&level_current, 0);
|
||||
if (result)
|
||||
goto out;
|
||||
|
||||
|
||||
@@ -749,6 +749,24 @@ static int acpiphp_bus_trim(acpi_handle handle)
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void acpiphp_set_acpi_region(struct acpiphp_slot *slot)
|
||||
{
|
||||
struct acpiphp_func *func;
|
||||
union acpi_object params[2];
|
||||
struct acpi_object_list arg_list;
|
||||
|
||||
list_for_each_entry(func, &slot->funcs, sibling) {
|
||||
arg_list.count = 2;
|
||||
arg_list.pointer = params;
|
||||
params[0].type = ACPI_TYPE_INTEGER;
|
||||
params[0].integer.value = ACPI_ADR_SPACE_PCI_CONFIG;
|
||||
params[1].type = ACPI_TYPE_INTEGER;
|
||||
params[1].integer.value = 1;
|
||||
/* _REG is optional, we don't care about if there is failure */
|
||||
acpi_evaluate_object(func->handle, "_REG", &arg_list, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* enable_device - enable, configure a slot
|
||||
* @slot: slot to be enabled
|
||||
@@ -805,6 +823,7 @@ static int __ref enable_device(struct acpiphp_slot *slot)
|
||||
pci_bus_assign_resources(bus);
|
||||
acpiphp_sanitize_bus(bus);
|
||||
acpiphp_set_hpp_values(bus);
|
||||
acpiphp_set_acpi_region(slot);
|
||||
pci_enable_bridges(bus);
|
||||
pci_bus_add_devices(bus);
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user