[PATCH v1 06/13] intel_mid: Refactored sfi_parse_devs() function

2013-05-29 Thread Sathyanarayanan Kuppuswamy
SFI device_id[] table parsing code is duplicated in every SFI
device handler. This patch removes this code duplication, by
adding a seperate function get_device_id() to parse through the
device table. Also this patch moves the SPI, I2C, IPC info code from
sfi_parse_devs() to respective device handlers.

Change-Id: I995bcf6ab872272d4a08a900231ddc5f3110c8a6
Signed-off-by: Sathyanarayanan Kuppuswamy 
---
 arch/x86/platform/intel-mid/intel-mid.c |  141 ---
 1 file changed, 71 insertions(+), 70 deletions(-)

diff --git a/arch/x86/platform/intel-mid/intel-mid.c 
b/arch/x86/platform/intel-mid/intel-mid.c
index 38071c1..ef94c7d 100644
--- a/arch/x86/platform/intel-mid/intel-mid.c
+++ b/arch/x86/platform/intel-mid/intel-mid.c
@@ -831,20 +831,15 @@ static void __init install_irq_resource(struct 
platform_device *pdev, int irq)
platform_device_add_resources(pdev, , 1);
 }
 
-static void __init sfi_handle_ipc_dev(struct sfi_device_table_entry *entry)
+static void __init sfi_handle_ipc_dev(struct sfi_device_table_entry *pentry,
+   struct devs_id *dev)
 {
-   const struct devs_id *dev = device_ids;
struct platform_device *pdev;
void *pdata = NULL;
 
-   while (dev->name[0]) {
-   if (dev->type == SFI_DEV_TYPE_IPC &&
-   !strncmp(dev->name, entry->name, SFI_NAME_LEN)) {
-   pdata = dev->get_platform_data(entry);
-   break;
-   }
-   dev++;
-   }
+   pr_debug("IPC bus, name = %16.16s, irq = 0x%2x\n",
+   pentry->name, pentry->irq);
+   pdata = dev->get_platform_data(pentry);
 
/*
 * On Medfield the platform device creation is handled by the MSIC
@@ -853,68 +848,94 @@ static void __init sfi_handle_ipc_dev(struct 
sfi_device_table_entry *entry)
if (intel_mid_has_msic())
return;
 
-   pdev = platform_device_alloc(entry->name, 0);
+   pdev = platform_device_alloc(pentry->name, 0);
if (pdev == NULL) {
pr_err("out of memory for SFI platform device '%s'.\n",
-   entry->name);
+   pentry->name);
return;
}
-   install_irq_resource(pdev, entry->irq);
+   install_irq_resource(pdev, pentry->irq);
 
pdev->dev.platform_data = pdata;
intel_scu_device_register(pdev);
 }
 
-static void __init sfi_handle_spi_dev(struct spi_board_info *spi_info)
+static void __init sfi_handle_spi_dev(struct sfi_device_table_entry *pentry,
+   struct devs_id *dev)
 {
-   const struct devs_id *dev = device_ids;
+   struct spi_board_info spi_info;
void *pdata = NULL;
 
-   while (dev->name[0]) {
-   if (dev->type == SFI_DEV_TYPE_SPI &&
-   !strncmp(dev->name, spi_info->modalias,
-   SFI_NAME_LEN)) {
-   pdata = dev->get_platform_data(spi_info);
-   break;
-   }
-   dev++;
-   }
-   spi_info->platform_data = pdata;
+   memset(_info, 0, sizeof(spi_info));
+   strncpy(spi_info.modalias, pentry->name, SFI_NAME_LEN);
+   spi_info.irq = ((pentry->irq == (u8)0xff) ? 0 : pentry->irq);
+   spi_info.bus_num = pentry->host_num;
+   spi_info.chip_select = pentry->addr;
+   spi_info.max_speed_hz = pentry->max_freq;
+   pr_debug("SPI bus=%d, name=%16.16s, irq=0x%2x, max_freq=%d, cs=%d\n",
+   spi_info.bus_num,
+   spi_info.modalias,
+   spi_info.irq,
+   spi_info.max_speed_hz,
+   spi_info.chip_select);
+
+   pdata = dev->get_platform_data(_info);
+
+   spi_info.platform_data = pdata;
if (dev->delay)
-   intel_scu_spi_device_register(spi_info);
+   intel_scu_spi_device_register(_info);
else
-   spi_register_board_info(spi_info, 1);
+   spi_register_board_info(_info, 1);
 }
 
-static void __init sfi_handle_i2c_dev(int bus, struct i2c_board_info *i2c_info)
+static void __init sfi_handle_i2c_dev(struct sfi_device_table_entry *pentry,
+   struct devs_id *dev)
 {
-   const struct devs_id *dev = device_ids;
+   struct i2c_board_info i2c_info;
void *pdata = NULL;
 
+   memset(_info, 0, sizeof(i2c_info));
+   strncpy(i2c_info.type, pentry->name, SFI_NAME_LEN);
+   i2c_info.irq = ((pentry->irq == (u8)0xff) ? 0 : pentry->irq);
+   i2c_info.addr = pentry->addr;
+   pr_debug("I2C bus = %d, name = %16.16s, irq = 0x%2x, addr = 0x%x\n",
+   pentry->host_num,
+   i2c_info.type,
+   i2c_info.irq,
+   i2c_info.addr);
+   pdata = dev->get_platform_data(_info);
+   i2c_info.platform_data = pdata;
+
+   if (dev->delay)
+   

[PATCH v1 06/13] intel_mid: Refactored sfi_parse_devs() function

2013-05-29 Thread Sathyanarayanan Kuppuswamy
SFI device_id[] table parsing code is duplicated in every SFI
device handler. This patch removes this code duplication, by
adding a seperate function get_device_id() to parse through the
device table. Also this patch moves the SPI, I2C, IPC info code from
sfi_parse_devs() to respective device handlers.

Change-Id: I995bcf6ab872272d4a08a900231ddc5f3110c8a6
Signed-off-by: Sathyanarayanan Kuppuswamy sathyanarayanan.kuppusw...@intel.com
---
 arch/x86/platform/intel-mid/intel-mid.c |  141 ---
 1 file changed, 71 insertions(+), 70 deletions(-)

diff --git a/arch/x86/platform/intel-mid/intel-mid.c 
b/arch/x86/platform/intel-mid/intel-mid.c
index 38071c1..ef94c7d 100644
--- a/arch/x86/platform/intel-mid/intel-mid.c
+++ b/arch/x86/platform/intel-mid/intel-mid.c
@@ -831,20 +831,15 @@ static void __init install_irq_resource(struct 
platform_device *pdev, int irq)
platform_device_add_resources(pdev, res, 1);
 }
 
-static void __init sfi_handle_ipc_dev(struct sfi_device_table_entry *entry)
+static void __init sfi_handle_ipc_dev(struct sfi_device_table_entry *pentry,
+   struct devs_id *dev)
 {
-   const struct devs_id *dev = device_ids;
struct platform_device *pdev;
void *pdata = NULL;
 
-   while (dev-name[0]) {
-   if (dev-type == SFI_DEV_TYPE_IPC 
-   !strncmp(dev-name, entry-name, SFI_NAME_LEN)) {
-   pdata = dev-get_platform_data(entry);
-   break;
-   }
-   dev++;
-   }
+   pr_debug(IPC bus, name = %16.16s, irq = 0x%2x\n,
+   pentry-name, pentry-irq);
+   pdata = dev-get_platform_data(pentry);
 
/*
 * On Medfield the platform device creation is handled by the MSIC
@@ -853,68 +848,94 @@ static void __init sfi_handle_ipc_dev(struct 
sfi_device_table_entry *entry)
if (intel_mid_has_msic())
return;
 
-   pdev = platform_device_alloc(entry-name, 0);
+   pdev = platform_device_alloc(pentry-name, 0);
if (pdev == NULL) {
pr_err(out of memory for SFI platform device '%s'.\n,
-   entry-name);
+   pentry-name);
return;
}
-   install_irq_resource(pdev, entry-irq);
+   install_irq_resource(pdev, pentry-irq);
 
pdev-dev.platform_data = pdata;
intel_scu_device_register(pdev);
 }
 
-static void __init sfi_handle_spi_dev(struct spi_board_info *spi_info)
+static void __init sfi_handle_spi_dev(struct sfi_device_table_entry *pentry,
+   struct devs_id *dev)
 {
-   const struct devs_id *dev = device_ids;
+   struct spi_board_info spi_info;
void *pdata = NULL;
 
-   while (dev-name[0]) {
-   if (dev-type == SFI_DEV_TYPE_SPI 
-   !strncmp(dev-name, spi_info-modalias,
-   SFI_NAME_LEN)) {
-   pdata = dev-get_platform_data(spi_info);
-   break;
-   }
-   dev++;
-   }
-   spi_info-platform_data = pdata;
+   memset(spi_info, 0, sizeof(spi_info));
+   strncpy(spi_info.modalias, pentry-name, SFI_NAME_LEN);
+   spi_info.irq = ((pentry-irq == (u8)0xff) ? 0 : pentry-irq);
+   spi_info.bus_num = pentry-host_num;
+   spi_info.chip_select = pentry-addr;
+   spi_info.max_speed_hz = pentry-max_freq;
+   pr_debug(SPI bus=%d, name=%16.16s, irq=0x%2x, max_freq=%d, cs=%d\n,
+   spi_info.bus_num,
+   spi_info.modalias,
+   spi_info.irq,
+   spi_info.max_speed_hz,
+   spi_info.chip_select);
+
+   pdata = dev-get_platform_data(spi_info);
+
+   spi_info.platform_data = pdata;
if (dev-delay)
-   intel_scu_spi_device_register(spi_info);
+   intel_scu_spi_device_register(spi_info);
else
-   spi_register_board_info(spi_info, 1);
+   spi_register_board_info(spi_info, 1);
 }
 
-static void __init sfi_handle_i2c_dev(int bus, struct i2c_board_info *i2c_info)
+static void __init sfi_handle_i2c_dev(struct sfi_device_table_entry *pentry,
+   struct devs_id *dev)
 {
-   const struct devs_id *dev = device_ids;
+   struct i2c_board_info i2c_info;
void *pdata = NULL;
 
+   memset(i2c_info, 0, sizeof(i2c_info));
+   strncpy(i2c_info.type, pentry-name, SFI_NAME_LEN);
+   i2c_info.irq = ((pentry-irq == (u8)0xff) ? 0 : pentry-irq);
+   i2c_info.addr = pentry-addr;
+   pr_debug(I2C bus = %d, name = %16.16s, irq = 0x%2x, addr = 0x%x\n,
+   pentry-host_num,
+   i2c_info.type,
+   i2c_info.irq,
+   i2c_info.addr);
+   pdata = dev-get_platform_data(i2c_info);
+   i2c_info.platform_data = pdata;
+
+   if (dev-delay)
+