Merge tag 'pm+acpi-for-3.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 11 Dec 2012 20:45:35 +0000 (12:45 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 11 Dec 2012 20:45:35 +0000 (12:45 -0800)
Pull ACPI and power management updates from Rafael Wysocki:

 - Introduction of device PM QoS flags.

 - ACPI device power management update allowing subsystems other than
   PCI to use it more easily.

 - ACPI device enumeration rework allowing additional kinds of devices
   to be enumerated via ACPI.  From Mika Westerberg, Adrian Hunter,
   Mathias Nyman, Andy Shevchenko, and Rafael J. Wysocki.

 - ACPICA update to version 20121018 from Bob Moore and Lv Zheng.

 - ACPI memory hotplug update from Wen Congyang and Yasuaki Ishimatsu.

 - Introduction of acpi_handle_<level>() messaging macros and ACPI-based
   CPU hot-remove support from Toshi Kani.

 - ACPI EC updates from Feng Tang.

 - cpufreq updates from Viresh Kumar, Fabio Baltieri and others.

 - cpuidle changes to quickly notice governor prediction failure from
   Youquan Song.

 - Support for using multiple cpuidle drivers at the same time and
   cpuidle cleanups from Daniel Lezcano.

 - devfreq updates from Nishanth Menon and others.

 - cpupower update from Thomas Renninger.

 - Fixes and small cleanups all over the place.

* tag 'pm+acpi-for-3.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (196 commits)
  mmc: sdhci-acpi: enable runtime-pm for device HID INT33C6
  ACPI: add Haswell LPSS devices to acpi_platform_device_ids list
  ACPI: add documentation about ACPI 5 enumeration
  pnpacpi: fix incorrect TEST_ALPHA() test
  ACPI / PM: Fix header of acpi_dev_pm_detach() in acpi.h
  ACPI / video: ignore BIOS initial backlight value for HP Folio 13-2000
  ACPI : do not use Lid and Sleep button for S5 wakeup
  ACPI / PNP: Do not crash due to stale pointer use during system resume
  ACPI / video: Add "Asus UL30VT" to ACPI video detect blacklist
  ACPI: do acpisleep dmi check when CONFIG_ACPI_SLEEP is set
  spi / ACPI: add ACPI enumeration support
  gpio / ACPI: add ACPI support
  PM / devfreq: remove compiler error with module governors (2)
  cpupower: IvyBridge (0x3a and 0x3e models) support
  cpupower: Provide -c param for cpupower monitor to schedule process on all cores
  cpupower tools: Fix warning and a bug with the cpu package count
  cpupower tools: Fix malloc of cpu_info structure
  cpupower tools: Fix issues with sysfs_topology_read_file
  cpupower tools: Fix minor warnings
  cpupower tools: Update .gitignore for files created in the debug directories
  ...

1  2 
arch/arm/Kconfig
drivers/mmc/host/Kconfig
drivers/mmc/host/Makefile
drivers/spi/spi.c

diff --combined arch/arm/Kconfig
@@@ -330,8 -330,6 +330,8 @@@ config ARCH_AT9
        select IRQ_DOMAIN
        select NEED_MACH_GPIO_H
        select NEED_MACH_IO_H if PCCARD
 +      select PINCTRL
 +      select PINCTRL_AT91 if USE_OF
        help
          This enables support for systems based on Atmel
          AT91RM9200 and AT91SAM9* processors.
@@@ -549,7 -547,6 +549,7 @@@ config ARCH_KIRKWOO
        select CPU_FEROCEON
        select GENERIC_CLOCKEVENTS
        select PCI
 +      select PCI_QUIRKS
        select PLAT_ORION_LEGACY
        help
          Support for the following Marvell Kirkwood series SoCs:
@@@ -589,7 -586,6 +589,7 @@@ config ARCH_MM
        select GPIO_PXA
        select IRQ_DOMAIN
        select NEED_MACH_GPIO_H
 +      select PINCTRL
        select PLAT_PXA
        select SPARSE_IRQ
        help
@@@ -908,6 -904,7 +908,7 @@@ config ARCH_NOMADI
  
  config PLAT_SPEAR
        bool "ST SPEAr"
+       select ARCH_HAS_CPUFREQ
        select ARCH_REQUIRE_GPIOLIB
        select ARM_AMBA
        select CLKDEV_LOOKUP
diff --combined drivers/mmc/host/Kconfig
@@@ -81,6 -81,18 +81,18 @@@ config MMC_RICOH_MM
  
          If unsure, say Y.
  
+ config MMC_SDHCI_ACPI
+       tristate "SDHCI support for ACPI enumerated SDHCI controllers"
+       depends on MMC_SDHCI && ACPI
+       help
+         This selects support for ACPI enumerated SDHCI controllers,
+         identified by ACPI Compatibility ID PNP0D40 or specific
+         ACPI Hardware IDs.
+         If you have a controller with this interface, say Y or M here.
+         If unsure, say N.
  config MMC_SDHCI_PLTFM
        tristate "SDHCI platform and OF driver helper"
        depends on MMC_SDHCI
@@@ -270,8 -282,26 +282,8 @@@ config MMC_AU1
  
          If unsure, say N.
  
 -choice
 -      prompt "Atmel SD/MMC Driver"
 -      depends on AVR32 || ARCH_AT91
 -      default MMC_ATMELMCI if AVR32
 -      help
 -        Choose which driver to use for the Atmel MCI Silicon
 -
 -config MMC_AT91
 -      tristate "AT91 SD/MMC Card Interface support (DEPRECATED)"
 -      depends on ARCH_AT91
 -      help
 -        This selects the AT91 MCI controller. This driver will
 -        be removed soon (for more information have a look to
 -        Documentation/feature-removal-schedule.txt). Please use
 -        MMC_ATMEL_MCI.
 -
 -        If unsure, say N.
 -
  config MMC_ATMELMCI
 -      tristate "Atmel Multimedia Card Interface support"
 +      tristate "Atmel SD/MMC Driver (Multimedia Card Interface)"
        depends on AVR32 || ARCH_AT91
        help
          This selects the Atmel Multimedia Card Interface driver. If
  
          If unsure, say N.
  
 -endchoice
 -
  config MMC_ATMELMCI_DMA
        bool "Atmel MCI DMA support"
        depends on MMC_ATMELMCI && (AVR32 || ARCH_AT91SAM9G45) && DMA_ENGINE
@@@ -601,14 -633,3 +613,14 @@@ config MMC_USH
  
          Note: These controllers only support SDIO cards and do not
          support MMC or SD memory cards.
 +
 +config MMC_WMT
 +      tristate "Wondermedia SD/MMC Host Controller support"
 +      depends on ARCH_VT8500
 +      default y
 +      help
 +        This selects support for the SD/MMC Host Controller on
 +        Wondermedia WM8505/WM8650 based SoCs.
 +
 +        To compile this driver as a module, choose M here: the
 +        module will be called wmt-sdmmc.
@@@ -9,6 -9,7 +9,7 @@@ obj-$(CONFIG_MMC_MXS)            += mxs-mmc.
  obj-$(CONFIG_MMC_SDHCI)               += sdhci.o
  obj-$(CONFIG_MMC_SDHCI_PCI)   += sdhci-pci.o
  obj-$(subst m,y,$(CONFIG_MMC_SDHCI_PCI))      += sdhci-pci-data.o
+ obj-$(CONFIG_MMC_SDHCI_ACPI)  += sdhci-acpi.o
  obj-$(CONFIG_MMC_SDHCI_PXAV3) += sdhci-pxav3.o
  obj-$(CONFIG_MMC_SDHCI_PXAV2) += sdhci-pxav2.o
  obj-$(CONFIG_MMC_SDHCI_S3C)   += sdhci-s3c.o
@@@ -17,6 -18,7 +18,6 @@@ obj-$(CONFIG_MMC_WBSD)                += wbsd.
  obj-$(CONFIG_MMC_AU1X)                += au1xmmc.o
  obj-$(CONFIG_MMC_OMAP)                += omap.o
  obj-$(CONFIG_MMC_OMAP_HS)     += omap_hsmmc.o
 -obj-$(CONFIG_MMC_AT91)                += at91_mci.o
  obj-$(CONFIG_MMC_ATMELMCI)    += atmel-mci.o
  obj-$(CONFIG_MMC_TIFM_SD)     += tifm_sd.o
  obj-$(CONFIG_MMC_MSM)         += msm_sdcc.o
@@@ -44,7 -46,6 +45,7 @@@ obj-$(CONFIG_MMC_SH_MMCIF)    += sh_mmcif.
  obj-$(CONFIG_MMC_JZ4740)      += jz4740_mmc.o
  obj-$(CONFIG_MMC_VUB300)      += vub300.o
  obj-$(CONFIG_MMC_USHC)                += ushc.o
 +obj-$(CONFIG_MMC_WMT)         += wmt-sdmmc.o
  
  obj-$(CONFIG_MMC_SDHCI_PLTFM)         += sdhci-pltfm.o
  obj-$(CONFIG_MMC_SDHCI_CNS3XXX)               += sdhci-cns3xxx.o
diff --combined drivers/spi/spi.c
@@@ -35,6 -35,8 +35,8 @@@
  #include <linux/sched.h>
  #include <linux/delay.h>
  #include <linux/kthread.h>
+ #include <linux/ioport.h>
+ #include <linux/acpi.h>
  
  static void spidev_release(struct device *dev)
  {
@@@ -93,6 -95,10 +95,10 @@@ static int spi_match_device(struct devi
        if (of_driver_match_device(dev, drv))
                return 1;
  
+       /* Then try ACPI */
+       if (acpi_driver_match_device(dev, drv))
+               return 1;
        if (sdrv->id_table)
                return !!spi_match_id(sdrv->id_table, spi);
  
@@@ -819,7 -825,7 +825,7 @@@ static void of_register_spi_devices(str
        if (!master->dev.of_node)
                return;
  
 -      for_each_child_of_node(master->dev.of_node, nc) {
 +      for_each_available_child_of_node(master->dev.of_node, nc) {
                /* Alloc an spi_device */
                spi = spi_alloc_device(master);
                if (!spi) {
  static void of_register_spi_devices(struct spi_master *master) { }
  #endif
  
+ #ifdef CONFIG_ACPI
+ static int acpi_spi_add_resource(struct acpi_resource *ares, void *data)
+ {
+       struct spi_device *spi = data;
+       if (ares->type == ACPI_RESOURCE_TYPE_SERIAL_BUS) {
+               struct acpi_resource_spi_serialbus *sb;
+               sb = &ares->data.spi_serial_bus;
+               if (sb->type == ACPI_RESOURCE_SERIAL_TYPE_SPI) {
+                       spi->chip_select = sb->device_selection;
+                       spi->max_speed_hz = sb->connection_speed;
+                       if (sb->clock_phase == ACPI_SPI_SECOND_PHASE)
+                               spi->mode |= SPI_CPHA;
+                       if (sb->clock_polarity == ACPI_SPI_START_HIGH)
+                               spi->mode |= SPI_CPOL;
+                       if (sb->device_polarity == ACPI_SPI_ACTIVE_HIGH)
+                               spi->mode |= SPI_CS_HIGH;
+               }
+       } else if (spi->irq < 0) {
+               struct resource r;
+               if (acpi_dev_resource_interrupt(ares, 0, &r))
+                       spi->irq = r.start;
+       }
+       /* Always tell the ACPI core to skip this resource */
+       return 1;
+ }
+ static acpi_status acpi_spi_add_device(acpi_handle handle, u32 level,
+                                      void *data, void **return_value)
+ {
+       struct spi_master *master = data;
+       struct list_head resource_list;
+       struct acpi_device *adev;
+       struct spi_device *spi;
+       int ret;
+       if (acpi_bus_get_device(handle, &adev))
+               return AE_OK;
+       if (acpi_bus_get_status(adev) || !adev->status.present)
+               return AE_OK;
+       spi = spi_alloc_device(master);
+       if (!spi) {
+               dev_err(&master->dev, "failed to allocate SPI device for %s\n",
+                       dev_name(&adev->dev));
+               return AE_NO_MEMORY;
+       }
+       ACPI_HANDLE_SET(&spi->dev, handle);
+       spi->irq = -1;
+       INIT_LIST_HEAD(&resource_list);
+       ret = acpi_dev_get_resources(adev, &resource_list,
+                                    acpi_spi_add_resource, spi);
+       acpi_dev_free_resource_list(&resource_list);
+       if (ret < 0 || !spi->max_speed_hz) {
+               spi_dev_put(spi);
+               return AE_OK;
+       }
+       strlcpy(spi->modalias, dev_name(&adev->dev), sizeof(spi->modalias));
+       if (spi_add_device(spi)) {
+               dev_err(&master->dev, "failed to add SPI device %s from ACPI\n",
+                       dev_name(&adev->dev));
+               spi_dev_put(spi);
+       }
+       return AE_OK;
+ }
+ static void acpi_register_spi_devices(struct spi_master *master)
+ {
+       acpi_status status;
+       acpi_handle handle;
+       handle = ACPI_HANDLE(&master->dev);
+       if (!handle)
+               return;
+       status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1,
+                                    acpi_spi_add_device, NULL,
+                                    master, NULL);
+       if (ACPI_FAILURE(status))
+               dev_warn(&master->dev, "failed to enumerate SPI slaves\n");
+ }
+ #else
+ static inline void acpi_register_spi_devices(struct spi_master *master) {}
+ #endif /* CONFIG_ACPI */
  static void spi_master_release(struct device *dev)
  {
        struct spi_master *master;
@@@ -1023,8 -1123,9 +1123,9 @@@ int spi_register_master(struct spi_mast
                spi_match_master_to_boardinfo(master, &bi->board_info);
        mutex_unlock(&board_lock);
  
-       /* Register devices from the device tree */
+       /* Register devices from the device tree and ACPI */
        of_register_spi_devices(master);
+       acpi_register_spi_devices(master);
  done:
        return status;
  }