Skip to content

Commit

Permalink
Merge branch 'release-2.6.27' of git://git.kernel.org/pub/scm/linux/k…
Browse files Browse the repository at this point in the history
…ernel/git/ak/linux-acpi-2.6

* 'release-2.6.27' of git://git.kernel.org/pub/scm/linux/kernel/git/ak/linux-acpi-2.6:
  acpi: fix crash in core ACPI code, triggered by CONFIG_ACPI_PCI_SLOT=y
  ACPI: thinkpad-acpi: don't misdetect in get_thinkpad_model_data() on -ENOMEM
  ACPI: thinkpad-acpi: bump up version to 0.21
  ACPI: thinkpad-acpi: add bluetooth and WWAN rfkill support
  ACPI: thinkpad-acpi: WLSW overrides other rfkill switches
  ACPI: thinkpad-acpi: prepare for bluetooth and wwan rfkill support
  ACPI: thinkpad-acpi: consolidate wlsw notification function
  ACPI: thinkpad-acpi: minor refactor on radio switch init
  Revert "ACPI: don't walk tables if ACPI was disabled"
  Revert "dock: bay: Don't call acpi_walk_namespace() when ACPI is disabled."
  Revert "Fix FADT parsing"
  ACPI : Set FAN device to correct state in boot phase
  ACPI: Ignore _BQC object when registering backlight device
  ACPI: stop complaints about interrupt link End Tags and blank IRQ descriptors
  • Loading branch information
Linus Torvalds committed Jul 24, 2008
2 parents 5042d99 + f88133d commit 1481b91
Show file tree
Hide file tree
Showing 9 changed files with 446 additions and 174 deletions.
26 changes: 18 additions & 8 deletions Documentation/laptops/thinkpad-acpi.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
ThinkPad ACPI Extras Driver

Version 0.20
April 09th, 2008
Version 0.21
May 29th, 2008

Borislav Deianov <borislav@users.sf.net>
Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Expand Down Expand Up @@ -621,7 +621,8 @@ Bluetooth
---------

procfs: /proc/acpi/ibm/bluetooth
sysfs device attribute: bluetooth_enable
sysfs device attribute: bluetooth_enable (deprecated)
sysfs rfkill class: switch "tpacpi_bluetooth_sw"

This feature shows the presence and current state of a ThinkPad
Bluetooth device in the internal ThinkPad CDC slot.
Expand All @@ -643,8 +644,12 @@ Sysfs notes:
0: disables Bluetooth / Bluetooth is disabled
1: enables Bluetooth / Bluetooth is enabled.

Note: this interface will be probably be superseded by the
generic rfkill class, so it is NOT to be considered stable yet.
Note: this interface has been superseded by the generic rfkill
class. It has been deprecated, and it will be removed in year
2010.

rfkill controller switch "tpacpi_bluetooth_sw": refer to
Documentation/rfkill.txt for details.

Video output control -- /proc/acpi/ibm/video
--------------------------------------------
Expand Down Expand Up @@ -1374,7 +1379,8 @@ EXPERIMENTAL: WAN
-----------------

procfs: /proc/acpi/ibm/wan
sysfs device attribute: wwan_enable
sysfs device attribute: wwan_enable (deprecated)
sysfs rfkill class: switch "tpacpi_wwan_sw"

This feature is marked EXPERIMENTAL because the implementation
directly accesses hardware registers and may not work as expected. USE
Expand Down Expand Up @@ -1404,8 +1410,12 @@ Sysfs notes:
0: disables WWAN card / WWAN card is disabled
1: enables WWAN card / WWAN card is enabled.

Note: this interface will be probably be superseded by the
generic rfkill class, so it is NOT to be considered stable yet.
Note: this interface has been superseded by the generic rfkill
class. It has been deprecated, and it will be removed in year
2010.

rfkill controller switch "tpacpi_wwan_sw": refer to
Documentation/rfkill.txt for details.

Multiple Commands, Module Parameters
------------------------------------
Expand Down
8 changes: 8 additions & 0 deletions drivers/acpi/namespace/nsnames.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,10 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
/* Calculate required buffer size based on depth below root */

size = acpi_ns_get_pathname_length(node);
if (!size) {
ACPI_ERROR((AE_INFO, "Invalid node failure"));
return_PTR(NULL);
}

/* Allocate a buffer to be returned to caller */

Expand Down Expand Up @@ -229,6 +233,10 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle,
/* Determine size required for the caller buffer */

required_size = acpi_ns_get_pathname_length(node);
if (!required_size) {
ACPI_ERROR((AE_INFO, "Invalid node failure"));
return_ACPI_STATUS(AE_ERROR);
}

/* Validate/Allocate/Clear caller buffer */

Expand Down
31 changes: 20 additions & 11 deletions drivers/acpi/pci_link.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,20 +113,23 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)

switch (resource->type) {
case ACPI_RESOURCE_TYPE_START_DEPENDENT:
case ACPI_RESOURCE_TYPE_END_TAG:
return AE_OK;
case ACPI_RESOURCE_TYPE_IRQ:
{
struct acpi_resource_irq *p = &resource->data.irq;
if (!p || !p->interrupt_count) {
printk(KERN_WARNING PREFIX "Blank IRQ resource\n");
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Blank _PRS IRQ resource\n"));
return AE_OK;
}
for (i = 0;
(i < p->interrupt_count
&& i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) {
if (!p->interrupts[i]) {
printk(KERN_WARNING PREFIX "Invalid IRQ %d\n",
p->interrupts[i]);
printk(KERN_WARNING PREFIX
"Invalid _PRS IRQ %d\n",
p->interrupts[i]);
continue;
}
link->irq.possible[i] = p->interrupts[i];
Expand All @@ -143,15 +146,16 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
&resource->data.extended_irq;
if (!p || !p->interrupt_count) {
printk(KERN_WARNING PREFIX
"Blank EXT IRQ resource\n");
"Blank _PRS EXT IRQ resource\n");
return AE_OK;
}
for (i = 0;
(i < p->interrupt_count
&& i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) {
if (!p->interrupts[i]) {
printk(KERN_WARNING PREFIX "Invalid IRQ %d\n",
p->interrupts[i]);
printk(KERN_WARNING PREFIX
"Invalid _PRS IRQ %d\n",
p->interrupts[i]);
continue;
}
link->irq.possible[i] = p->interrupts[i];
Expand All @@ -163,7 +167,8 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
break;
}
default:
printk(KERN_ERR PREFIX "Resource is not an IRQ entry\n");
printk(KERN_ERR PREFIX "_PRS resource type 0x%x isn't an IRQ\n",
resource->type);
return AE_OK;
}

Expand Down Expand Up @@ -199,6 +204,9 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)


switch (resource->type) {
case ACPI_RESOURCE_TYPE_START_DEPENDENT:
case ACPI_RESOURCE_TYPE_END_TAG:
return AE_OK;
case ACPI_RESOURCE_TYPE_IRQ:
{
struct acpi_resource_irq *p = &resource->data.irq;
Expand All @@ -208,7 +216,7 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
* particularly those those w/ _STA disabled
*/
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Blank IRQ resource\n"));
"Blank _CRS IRQ resource\n"));
return AE_OK;
}
*irq = p->interrupts[0];
Expand All @@ -224,18 +232,19 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
* return at least 1 IRQ
*/
printk(KERN_WARNING PREFIX
"Blank EXT IRQ resource\n");
"Blank _CRS EXT IRQ resource\n");
return AE_OK;
}
*irq = p->interrupts[0];
break;
}
break;
default:
printk(KERN_ERR PREFIX "Resource %d isn't an IRQ\n", resource->type);
case ACPI_RESOURCE_TYPE_END_TAG:
printk(KERN_ERR PREFIX "_CRS resource type 0x%x isn't an IRQ\n",
resource->type);
return AE_OK;
}

return AE_CTRL_TERMINATE;
}

Expand Down
17 changes: 6 additions & 11 deletions drivers/acpi/tables/tbfadt.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ static struct acpi_fadt_info fadt_info_table[] = {

static void inline
acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
u8 byte_width, u64 address)
u8 bit_width, u64 address)
{

/*
Expand All @@ -136,7 +136,7 @@ acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
/* All other fields are byte-wide */

generic_address->space_id = ACPI_ADR_SPACE_SYSTEM_IO;
generic_address->bit_width = byte_width << 3;
generic_address->bit_width = bit_width;
generic_address->bit_offset = 0;
generic_address->access_width = 0;
}
Expand Down Expand Up @@ -343,11 +343,9 @@ static void acpi_tb_convert_fadt(void)
*
* The PM event blocks are split into two register blocks, first is the
* PM Status Register block, followed immediately by the PM Enable Register
* block. Each is of length (xpm1x_event_block.bit_width/2)
* block. Each is of length (pm1_event_length/2)
*/
WARN_ON(ACPI_MOD_16(acpi_gbl_FADT.xpm1a_event_block.bit_width));
pm1_register_length = (u8) ACPI_DIV_16(acpi_gbl_FADT
.xpm1a_event_block.bit_width);
pm1_register_length = (u8) ACPI_DIV_2(acpi_gbl_FADT.pm1_event_length);

/* The PM1A register block is required */

Expand All @@ -362,17 +360,14 @@ static void acpi_tb_convert_fadt(void)
/* The PM1B register block is optional, ignore if not present */

if (acpi_gbl_FADT.xpm1b_event_block.address) {
WARN_ON(ACPI_MOD_16(acpi_gbl_FADT.xpm1b_event_block.bit_width));
pm1_register_length = (u8) ACPI_DIV_16(acpi_gbl_FADT
.xpm1b_event_block
.bit_width);
acpi_tb_init_generic_address(&acpi_gbl_xpm1b_enable,
pm1_register_length,
(acpi_gbl_FADT.xpm1b_event_block.
address + pm1_register_length));
/* Don't forget to copy space_id of the GAS */
acpi_gbl_xpm1b_enable.space_id =
acpi_gbl_FADT.xpm1b_event_block.space_id;
acpi_gbl_FADT.xpm1a_event_block.space_id;

}
}

Expand Down
43 changes: 43 additions & 0 deletions drivers/acpi/thermal.c
Original file line number Diff line number Diff line change
Expand Up @@ -769,6 +769,47 @@ static void acpi_thermal_run(unsigned long data)
acpi_os_execute(OSL_GPE_HANDLER, acpi_thermal_check, (void *)data);
}

static void acpi_thermal_active_off(void *data)
{
int result = 0;
struct acpi_thermal *tz = data;
int i = 0;
int j = 0;
struct acpi_thermal_active *active = NULL;

if (!tz) {
printk(KERN_ERR PREFIX "Invalid (NULL) context\n");
return;
}

result = acpi_thermal_get_temperature(tz);
if (result)
return;

for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
active = &(tz->trips.active[i]);
if (!active || !active->flags.valid)
break;
if (tz->temperature >= active->temperature) {
/*
* If the thermal temperature is greater than the
* active threshod, unnecessary to turn off the
* the active cooling device.
*/
continue;
}
/*
* Below Threshold?
* ----------------
* Turn OFF all cooling devices associated with this
* threshold.
*/
for (j = 0; j < active->devices.count; j++)
result = acpi_bus_set_power(active->devices.handles[j],
ACPI_STATE_D3);
}
}

static void acpi_thermal_check(void *data)
{
int result = 0;
Expand Down Expand Up @@ -1624,6 +1665,8 @@ static int acpi_thermal_add(struct acpi_device *device)

init_timer(&tz->timer);

acpi_thermal_active_off(tz);

acpi_thermal_check(tz);

status = acpi_install_notify_handler(device->handle,
Expand Down
4 changes: 4 additions & 0 deletions drivers/acpi/utilities/utalloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,10 @@ acpi_ut_initialize_buffer(struct acpi_buffer * buffer,
{
acpi_status status = AE_OK;

if (!required_length) {
WARN_ON(1);
return AE_ERROR;
}
switch (buffer->length) {
case ACPI_NO_BUFFER:

Expand Down
14 changes: 12 additions & 2 deletions drivers/acpi/video.c
Original file line number Diff line number Diff line change
Expand Up @@ -741,7 +741,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)

max_level = acpi_video_init_brightness(device);

if (device->cap._BCL && device->cap._BCM && device->cap._BQC && max_level > 0){
if (device->cap._BCL && device->cap._BCM && max_level > 0) {
int result;
static int count = 0;
char *name;
Expand All @@ -753,7 +753,17 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
device->backlight = backlight_device_register(name,
NULL, device, &acpi_backlight_ops);
device->backlight->props.max_brightness = device->brightness->count-3;
device->backlight->props.brightness = acpi_video_get_brightness(device->backlight);
/*
* If there exists the _BQC object, the _BQC object will be
* called to get the current backlight brightness. Otherwise
* the brightness will be set to the maximum.
*/
if (device->cap._BQC)
device->backlight->props.brightness =
acpi_video_get_brightness(device->backlight);
else
device->backlight->props.brightness =
device->backlight->props.max_brightness;
backlight_update_status(device->backlight);
kfree(name);

Expand Down
2 changes: 2 additions & 0 deletions drivers/misc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,8 @@ config THINKPAD_ACPI
select INPUT
select NEW_LEDS
select LEDS_CLASS
select NET
select RFKILL
---help---
This is a driver for the IBM and Lenovo ThinkPad laptops. It adds
support for Fn-Fx key combinations, Bluetooth control, video
Expand Down
Loading

0 comments on commit 1481b91

Please sign in to comment.