Commit 3e0283a5 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'pm+acpi-4.1-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull power management and ACPI fixes from Rafael Wysocki:
 "These include three regression fixes (PCI resources management,
  ACPI/PNP device enumeration, ACPI SBS on MacBook) and two ACPI
  documentation fixes related to GPIO.

  Specifics:

   - Fix for a PCI resources management regression introduced during the
     4.0 cycle and related to the handling of ACPI resources'
     Producer/Consumer flags that turn out to be useless (Jiang Liu)

   - Fix for a MacBook regression related to the Smart Battery Subsystem
     (SBS) driver causing various problems (stalls on boot, failure to
     detect or report battery) to happen and introduced during the 3.18
     cycle (Chris Bainbridge)

   - Fix for an ACPI/PNP device enumeration regression introduced during
     the 3.16 cycle caused by failing to include two PNP device IDs into
     the list of IDs that PNP device objects need to be created for
     (Witold Szczeponik)

   - Fixes for two minor mistakes in the ACPI GPIO properties
     documentation (Antonio Ospite, Rafael J Wysocki)"

* tag 'pm+acpi-4.1-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  ACPI / PNP: add two IDs to list for PNPACPI device enumeration
  ACPI / documentation: Fix ambiguity in the GPIO properties document
  ACPI / documentation: fix a sentence about GPIO resources
  ACPI / SBS: Add 5 us delay to fix SBS hangs on MacBook
  x86/PCI/ACPI: Make all resources except [io 0xcf8-0xcff] available on PCI bus
parents 68c2f356 9a5d9315
...@@ -253,7 +253,7 @@ input driver: ...@@ -253,7 +253,7 @@ input driver:
GPIO support GPIO support
~~~~~~~~~~~~ ~~~~~~~~~~~~
ACPI 5 introduced two new resources to describe GPIO connections: GpioIo ACPI 5 introduced two new resources to describe GPIO connections: GpioIo
and GpioInt. These resources are used be used to pass GPIO numbers used by and GpioInt. These resources can be used to pass GPIO numbers used by
the device to the driver. ACPI 5.1 extended this with _DSD (Device the device to the driver. ACPI 5.1 extended this with _DSD (Device
Specific Data) which made it possible to name the GPIOs among other things. Specific Data) which made it possible to name the GPIOs among other things.
......
_DSD Device Properties Related to GPIO _DSD Device Properties Related to GPIO
-------------------------------------- --------------------------------------
With the release of ACPI 5.1 and the _DSD configuration objecte names With the release of ACPI 5.1, the _DSD configuration object finally
can finally be given to GPIOs (and other things as well) returned by allows names to be given to GPIOs (and other things as well) returned
_CRS. Previously, we were only able to use an integer index to find by _CRS. Previously, we were only able to use an integer index to find
the corresponding GPIO, which is pretty error prone (it depends on the corresponding GPIO, which is pretty error prone (it depends on
the _CRS output ordering, for example). the _CRS output ordering, for example).
......
...@@ -325,6 +325,26 @@ static void release_pci_root_info(struct pci_host_bridge *bridge) ...@@ -325,6 +325,26 @@ static void release_pci_root_info(struct pci_host_bridge *bridge)
kfree(info); kfree(info);
} }
/*
* An IO port or MMIO resource assigned to a PCI host bridge may be
* consumed by the host bridge itself or available to its child
* bus/devices. The ACPI specification defines a bit (Producer/Consumer)
* to tell whether the resource is consumed by the host bridge itself,
* but firmware hasn't used that bit consistently, so we can't rely on it.
*
* On x86 and IA64 platforms, all IO port and MMIO resources are assumed
* to be available to child bus/devices except one special case:
* IO port [0xCF8-0xCFF] is consumed by the host bridge itself
* to access PCI configuration space.
*
* So explicitly filter out PCI CFG IO ports[0xCF8-0xCFF].
*/
static bool resource_is_pcicfg_ioport(struct resource *res)
{
return (res->flags & IORESOURCE_IO) &&
res->start == 0xCF8 && res->end == 0xCFF;
}
static void probe_pci_root_info(struct pci_root_info *info, static void probe_pci_root_info(struct pci_root_info *info,
struct acpi_device *device, struct acpi_device *device,
int busnum, int domain, int busnum, int domain,
...@@ -346,8 +366,8 @@ static void probe_pci_root_info(struct pci_root_info *info, ...@@ -346,8 +366,8 @@ static void probe_pci_root_info(struct pci_root_info *info,
"no IO and memory resources present in _CRS\n"); "no IO and memory resources present in _CRS\n");
else else
resource_list_for_each_entry_safe(entry, tmp, list) { resource_list_for_each_entry_safe(entry, tmp, list) {
if ((entry->res->flags & IORESOURCE_WINDOW) == 0 || if ((entry->res->flags & IORESOURCE_DISABLED) ||
(entry->res->flags & IORESOURCE_DISABLED)) resource_is_pcicfg_ioport(entry->res))
resource_list_destroy_entry(entry); resource_list_destroy_entry(entry);
else else
entry->res->name = info->name; entry->res->name = info->name;
......
...@@ -304,6 +304,8 @@ static const struct acpi_device_id acpi_pnp_device_ids[] = { ...@@ -304,6 +304,8 @@ static const struct acpi_device_id acpi_pnp_device_ids[] = {
{"PNPb006"}, {"PNPb006"},
/* cs423x-pnpbios */ /* cs423x-pnpbios */
{"CSC0100"}, {"CSC0100"},
{"CSC0103"},
{"CSC0110"},
{"CSC0000"}, {"CSC0000"},
{"GIM0100"}, /* Guillemot Turtlebeach something appears to be cs4232 compatible */ {"GIM0100"}, /* Guillemot Turtlebeach something appears to be cs4232 compatible */
/* es18xx-pnpbios */ /* es18xx-pnpbios */
......
...@@ -573,7 +573,7 @@ EXPORT_SYMBOL_GPL(acpi_dev_get_resources); ...@@ -573,7 +573,7 @@ EXPORT_SYMBOL_GPL(acpi_dev_get_resources);
* @ares: Input ACPI resource object. * @ares: Input ACPI resource object.
* @types: Valid resource types of IORESOURCE_XXX * @types: Valid resource types of IORESOURCE_XXX
* *
* This is a hepler function to support acpi_dev_get_resources(), which filters * This is a helper function to support acpi_dev_get_resources(), which filters
* ACPI resource objects according to resource types. * ACPI resource objects according to resource types.
*/ */
int acpi_dev_filter_resource_type(struct acpi_resource *ares, int acpi_dev_filter_resource_type(struct acpi_resource *ares,
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/dmi.h>
#include "sbshc.h" #include "sbshc.h"
#define PREFIX "ACPI: " #define PREFIX "ACPI: "
...@@ -87,6 +88,8 @@ enum acpi_smb_offset { ...@@ -87,6 +88,8 @@ enum acpi_smb_offset {
ACPI_SMB_ALARM_DATA = 0x26, /* 2 bytes alarm data */ ACPI_SMB_ALARM_DATA = 0x26, /* 2 bytes alarm data */
}; };
static bool macbook;
static inline int smb_hc_read(struct acpi_smb_hc *hc, u8 address, u8 *data) static inline int smb_hc_read(struct acpi_smb_hc *hc, u8 address, u8 *data)
{ {
return ec_read(hc->offset + address, data); return ec_read(hc->offset + address, data);
...@@ -132,6 +135,8 @@ static int acpi_smbus_transaction(struct acpi_smb_hc *hc, u8 protocol, ...@@ -132,6 +135,8 @@ static int acpi_smbus_transaction(struct acpi_smb_hc *hc, u8 protocol,
} }
mutex_lock(&hc->lock); mutex_lock(&hc->lock);
if (macbook)
udelay(5);
if (smb_hc_read(hc, ACPI_SMB_PROTOCOL, &temp)) if (smb_hc_read(hc, ACPI_SMB_PROTOCOL, &temp))
goto end; goto end;
if (temp) { if (temp) {
...@@ -257,12 +262,29 @@ extern int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit, ...@@ -257,12 +262,29 @@ extern int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
acpi_handle handle, acpi_ec_query_func func, acpi_handle handle, acpi_ec_query_func func,
void *data); void *data);
static int macbook_dmi_match(const struct dmi_system_id *d)
{
pr_debug("Detected MacBook, enabling workaround\n");
macbook = true;
return 0;
}
static struct dmi_system_id acpi_smbus_dmi_table[] = {
{ macbook_dmi_match, "Apple MacBook", {
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
DMI_MATCH(DMI_PRODUCT_NAME, "MacBook") },
},
{ },
};
static int acpi_smbus_hc_add(struct acpi_device *device) static int acpi_smbus_hc_add(struct acpi_device *device)
{ {
int status; int status;
unsigned long long val; unsigned long long val;
struct acpi_smb_hc *hc; struct acpi_smb_hc *hc;
dmi_check_system(acpi_smbus_dmi_table);
if (!device) if (!device)
return -EINVAL; return -EINVAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment