]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - arch/x86/platform/intel-mid/sfi.c
Merge branches 'pm-core', 'pm-qos', 'pm-domains' and 'pm-opp'
[linux.git] / arch / x86 / platform / intel-mid / sfi.c
index 051d264fce2e607c9841303f6bed94b27b920b85..19b43e3a9f0fe138709ebfcd54a0eda8ce544e4c 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/interrupt.h>
 #include <linux/scatterlist.h>
 #include <linux/sfi.h>
-#include <linux/intel_pmic_gpio.h>
 #include <linux/spi/spi.h>
 #include <linux/i2c.h>
 #include <linux/skbuff.h>
@@ -226,7 +225,7 @@ int get_gpio_by_name(const char *name)
        return -EINVAL;
 }
 
-void __init intel_scu_device_register(struct platform_device *pdev)
+static void __init intel_scu_ipc_device_register(struct platform_device *pdev)
 {
        if (ipc_next_dev == MAX_IPCDEVS)
                pr_err("too many SCU IPC devices");
@@ -335,10 +334,22 @@ static void __init sfi_handle_ipc_dev(struct sfi_device_table_entry *pentry,
 
        pr_debug("IPC bus, name = %16.16s, irq = 0x%2x\n",
                pentry->name, pentry->irq);
+
+       /*
+        * We need to call platform init of IPC devices to fill misc_pdata
+        * structure. It will be used in msic_init for initialization.
+        */
        pdata = intel_mid_sfi_get_pdata(dev, pentry);
        if (IS_ERR(pdata))
                return;
 
+       /*
+        * On Medfield the platform device creation is handled by the MSIC
+        * MFD driver so we don't need to do it here.
+        */
+       if (dev->msic && intel_mid_has_msic())
+               return;
+
        pdev = platform_device_alloc(pentry->name, 0);
        if (pdev == NULL) {
                pr_err("out of memory for SFI platform device '%s'.\n",
@@ -348,7 +359,10 @@ static void __init sfi_handle_ipc_dev(struct sfi_device_table_entry *pentry,
        install_irq_resource(pdev, pentry->irq);
 
        pdev->dev.platform_data = pdata;
-       platform_device_add(pdev);
+       if (dev->delay)
+               intel_scu_ipc_device_register(pdev);
+       else
+               platform_device_add(pdev);
 }
 
 static void __init sfi_handle_spi_dev(struct sfi_device_table_entry *pentry,
@@ -503,27 +517,23 @@ static int __init sfi_parse_devs(struct sfi_table_header *table)
                if (!dev)
                        continue;
 
-               if (dev->device_handler) {
-                       dev->device_handler(pentry, dev);
-               } else {
-                       switch (pentry->type) {
-                       case SFI_DEV_TYPE_IPC:
-                               sfi_handle_ipc_dev(pentry, dev);
-                               break;
-                       case SFI_DEV_TYPE_SPI:
-                               sfi_handle_spi_dev(pentry, dev);
-                               break;
-                       case SFI_DEV_TYPE_I2C:
-                               sfi_handle_i2c_dev(pentry, dev);
-                               break;
-                       case SFI_DEV_TYPE_SD:
-                               sfi_handle_sd_dev(pentry, dev);
-                               break;
-                       case SFI_DEV_TYPE_UART:
-                       case SFI_DEV_TYPE_HSI:
-                       default:
-                               break;
-                       }
+               switch (pentry->type) {
+               case SFI_DEV_TYPE_IPC:
+                       sfi_handle_ipc_dev(pentry, dev);
+                       break;
+               case SFI_DEV_TYPE_SPI:
+                       sfi_handle_spi_dev(pentry, dev);
+                       break;
+               case SFI_DEV_TYPE_I2C:
+                       sfi_handle_i2c_dev(pentry, dev);
+                       break;
+               case SFI_DEV_TYPE_SD:
+                       sfi_handle_sd_dev(pentry, dev);
+                       break;
+               case SFI_DEV_TYPE_UART:
+               case SFI_DEV_TYPE_HSI:
+               default:
+                       break;
                }
        }
        return 0;