x86/platform/intel-mid: Get rid of duplication of IPC handler
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Thu, 5 Jan 2017 13:02:35 +0000 (15:02 +0200)
committerIngo Molnar <mingo@kernel.org>
Fri, 6 Jan 2017 07:35:27 +0000 (08:35 +0100)
There is no other device handler than ipc_device_handler() and sfi.c already
has a handler for IPC devices.

Replace a pointer to custom handler by a flag. Due to this change adjust
sfi_handle_ipc_dev() to handle it instead of ipc_device_handler().

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/20170105130235.177792-2-andriy.shevchenko@linux.intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/include/asm/intel-mid.h
arch/x86/platform/intel-mid/device_libs/Makefile
arch/x86/platform/intel-mid/device_libs/platform_ipc.c [deleted file]
arch/x86/platform/intel-mid/device_libs/platform_ipc.h [deleted file]
arch/x86/platform/intel-mid/device_libs/platform_msic_audio.c
arch/x86/platform/intel-mid/device_libs/platform_msic_battery.c
arch/x86/platform/intel-mid/device_libs/platform_msic_gpio.c
arch/x86/platform/intel-mid/device_libs/platform_msic_ocd.c
arch/x86/platform/intel-mid/device_libs/platform_msic_power_btn.c
arch/x86/platform/intel-mid/device_libs/platform_msic_thermal.c
arch/x86/platform/intel-mid/sfi.c

index 49da9f497b908b676d9ec0c22c8646817bf1f52b..91ead0cefa76dabe41f15396ce8ea9e572494252 100644 (file)
@@ -42,10 +42,8 @@ struct devs_id {
        char name[SFI_NAME_LEN + 1];
        u8 type;
        u8 delay;
+       u8 msic;
        void *(*get_platform_data)(void *info);
-       /* Custom handler for devices */
-       void (*device_handler)(struct sfi_device_table_entry *pentry,
-                              struct devs_id *dev);
 };
 
 #define sfi_device(i)                                                          \
index 4d8c14a783d5bb3d1f836a003a340395c87f0de2..d4af7785844ebffb5dcc7697e72d44cf91fb766f 100644 (file)
@@ -5,7 +5,6 @@ obj-$(subst m,y,$(CONFIG_MMC_SDHCI_PCI)) += platform_mrfld_sd.o
 # WiFi
 obj-$(subst m,y,$(CONFIG_BRCMFMAC_SDIO)) += platform_bcm43xx.o
 # IPC Devices
-obj-y += platform_ipc.o
 obj-$(subst m,y,$(CONFIG_MFD_INTEL_MSIC)) += platform_msic.o
 obj-$(subst m,y,$(CONFIG_SND_MFLD_MACHINE)) += platform_msic_audio.o
 obj-$(subst m,y,$(CONFIG_GPIO_MSIC)) += platform_msic_gpio.o
diff --git a/arch/x86/platform/intel-mid/device_libs/platform_ipc.c b/arch/x86/platform/intel-mid/device_libs/platform_ipc.c
deleted file mode 100644 (file)
index a428c05..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * platform_ipc.c: IPC platform library file
- *
- * (C) Copyright 2013 Intel Corporation
- * Author: Sathyanarayanan Kuppuswamy <sathyanarayanan.kuppuswamy@intel.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; version 2
- * of the License.
- */
-
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/interrupt.h>
-#include <linux/sfi.h>
-#include <linux/gpio.h>
-#include <asm/intel-mid.h>
-#include "platform_ipc.h"
-
-void __init ipc_device_handler(struct sfi_device_table_entry *pentry,
-                               struct devs_id *dev)
-{
-       struct platform_device *pdev;
-       void *pdata = NULL;
-       static struct resource res __initdata = {
-               .name = "IRQ",
-               .flags = IORESOURCE_IRQ,
-       };
-
-       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.
-        */
-       if (dev != NULL)
-               pdata = dev->get_platform_data(pentry);
-
-       /*
-        * On Medfield the platform device creation is handled by the MSIC
-        * MFD driver so we don't need to do it here.
-        */
-       if (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",
-                       pentry->name);
-               return;
-       }
-       res.start = pentry->irq;
-       platform_device_add_resources(pdev, &res, 1);
-
-       pdev->dev.platform_data = pdata;
-       intel_scu_device_register(pdev);
-}
diff --git a/arch/x86/platform/intel-mid/device_libs/platform_ipc.h b/arch/x86/platform/intel-mid/device_libs/platform_ipc.h
deleted file mode 100644 (file)
index 79bb09d..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * platform_ipc.h: IPC platform library header file
- *
- * (C) Copyright 2013 Intel Corporation
- * Author: Sathyanarayanan Kuppuswamy <sathyanarayanan.kuppuswamy@intel.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; version 2
- * of the License.
- */
-#ifndef _PLATFORM_IPC_H_
-#define _PLATFORM_IPC_H_
-
-void __init
-ipc_device_handler(struct sfi_device_table_entry *pentry, struct devs_id *dev);
-
-#endif
index cb3490ecb341227062125e12f28b8bcdc47f07e2..d4dc744dd5a54876843bb6326128a253eebc0d87 100644 (file)
@@ -20,7 +20,6 @@
 #include <asm/intel-mid.h>
 
 #include "platform_msic.h"
-#include "platform_ipc.h"
 
 static void *msic_audio_platform_data(void *info)
 {
@@ -40,8 +39,8 @@ static const struct devs_id msic_audio_dev_id __initconst = {
        .name = "msic_audio",
        .type = SFI_DEV_TYPE_IPC,
        .delay = 1,
+       .msic = 1,
        .get_platform_data = &msic_audio_platform_data,
-       .device_handler = &ipc_device_handler,
 };
 
 sfi_device(msic_audio_dev_id);
index 4f72193939a68c668cba48eed07a2f6d236fd4b7..5c3e9919633fa0885224f35be92f1f6316e0fe88 100644 (file)
@@ -19,7 +19,6 @@
 #include <asm/intel-mid.h>
 
 #include "platform_msic.h"
-#include "platform_ipc.h"
 
 static void __init *msic_battery_platform_data(void *info)
 {
@@ -30,8 +29,8 @@ static const struct devs_id msic_battery_dev_id __initconst = {
        .name = "msic_battery",
        .type = SFI_DEV_TYPE_IPC,
        .delay = 1,
+       .msic = 1,
        .get_platform_data = &msic_battery_platform_data,
-       .device_handler = &ipc_device_handler,
 };
 
 sfi_device(msic_battery_dev_id);
index 70de5b531ba0b7959eb8b4b26afc436b5aae300a..9fdb88d460d79da8ce15ab4953da8588e82e9f40 100644 (file)
@@ -20,7 +20,6 @@
 #include <asm/intel-mid.h>
 
 #include "platform_msic.h"
-#include "platform_ipc.h"
 
 static void __init *msic_gpio_platform_data(void *info)
 {
@@ -41,8 +40,8 @@ static const struct devs_id msic_gpio_dev_id __initconst = {
        .name = "msic_gpio",
        .type = SFI_DEV_TYPE_IPC,
        .delay = 1,
+       .msic = 1,
        .get_platform_data = &msic_gpio_platform_data,
-       .device_handler = &ipc_device_handler,
 };
 
 sfi_device(msic_gpio_dev_id);
index 3d7c2011b6cfe41b431ae108041e5615cf157d98..7ae37cdbf256733c02c900e73e0ff4a15eddf471 100644 (file)
@@ -20,7 +20,6 @@
 #include <asm/intel-mid.h>
 
 #include "platform_msic.h"
-#include "platform_ipc.h"
 
 static void __init *msic_ocd_platform_data(void *info)
 {
@@ -42,8 +41,8 @@ static const struct devs_id msic_ocd_dev_id __initconst = {
        .name = "msic_ocd",
        .type = SFI_DEV_TYPE_IPC,
        .delay = 1,
+       .msic = 1,
        .get_platform_data = &msic_ocd_platform_data,
-       .device_handler = &ipc_device_handler,
 };
 
 sfi_device(msic_ocd_dev_id);
index 038f618fbc525592dc269e08658d3c47b6868771..96809b98cf693df3910e3cce00181ad6cb2f7303 100644 (file)
@@ -18,7 +18,6 @@
 #include <asm/intel-mid.h>
 
 #include "platform_msic.h"
-#include "platform_ipc.h"
 
 static void __init *msic_power_btn_platform_data(void *info)
 {
@@ -29,8 +28,8 @@ static const struct devs_id msic_power_btn_dev_id __initconst = {
        .name = "msic_power_btn",
        .type = SFI_DEV_TYPE_IPC,
        .delay = 1,
+       .msic = 1,
        .get_platform_data = &msic_power_btn_platform_data,
-       .device_handler = &ipc_device_handler,
 };
 
 sfi_device(msic_power_btn_dev_id);
index 114a5755b1e49a181f0577c93164518106aa4dfd..3e4167d246cdd98cb2978d0c799004816c026736 100644 (file)
@@ -19,7 +19,6 @@
 #include <asm/intel-mid.h>
 
 #include "platform_msic.h"
-#include "platform_ipc.h"
 
 static void __init *msic_thermal_platform_data(void *info)
 {
@@ -30,8 +29,8 @@ static const struct devs_id msic_thermal_dev_id __initconst = {
        .name = "msic_thermal",
        .type = SFI_DEV_TYPE_IPC,
        .delay = 1,
+       .msic = 1,
        .get_platform_data = &msic_thermal_platform_data,
-       .device_handler = &ipc_device_handler,
 };
 
 sfi_device(msic_thermal_dev_id);
index 051d264fce2e607c9841303f6bed94b27b920b85..e8f68f65208778c9c5aefa2a1e1dc0f6d5185829 100644 (file)
@@ -335,10 +335,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 +360,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_device_register(pdev);
+       else
+               platform_device_add(pdev);
 }
 
 static void __init sfi_handle_spi_dev(struct sfi_device_table_entry *pentry,
@@ -503,27 +518,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;