aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorKuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>2013-10-17 18:35:30 -0400
committerH. Peter Anvin <hpa@linux.intel.com>2013-10-17 19:40:48 -0400
commit661b01076500e364c68dd9fdf0ef4216a75e8375 (patch)
treecdca7b9be99822e60994229061e1a399e3b13f45 /arch/x86
parent712b6aa8731a7e148298c58cea66a5209c659e3c (diff)
intel_mid: Refactored sfi_parse_devs() function
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. Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> Link: http://lkml.kernel.org/r/1382049336-21316-7-git-send-email-david.a.cohen@linux.intel.com Signed-off-by: David Cohen <david.a.cohen@linux.intel.com> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/platform/intel-mid/intel-mid.c141
1 files 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 94689ac55374..d24c729b24ad 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)
831 platform_device_add_resources(pdev, &res, 1); 831 platform_device_add_resources(pdev, &res, 1);
832} 832}
833 833
834static void __init sfi_handle_ipc_dev(struct sfi_device_table_entry *entry) 834static void __init sfi_handle_ipc_dev(struct sfi_device_table_entry *pentry,
835 struct devs_id *dev)
835{ 836{
836 const struct devs_id *dev = device_ids;
837 struct platform_device *pdev; 837 struct platform_device *pdev;
838 void *pdata = NULL; 838 void *pdata = NULL;
839 839
840 while (dev->name[0]) { 840 pr_debug("IPC bus, name = %16.16s, irq = 0x%2x\n",
841 if (dev->type == SFI_DEV_TYPE_IPC && 841 pentry->name, pentry->irq);
842 !strncmp(dev->name, entry->name, SFI_NAME_LEN)) { 842 pdata = dev->get_platform_data(pentry);
843 pdata = dev->get_platform_data(entry);
844 break;
845 }
846 dev++;
847 }
848 843
849 /* 844 /*
850 * On Medfield the platform device creation is handled by the MSIC 845 * 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)
853 if (intel_mid_has_msic()) 848 if (intel_mid_has_msic())
854 return; 849 return;
855 850
856 pdev = platform_device_alloc(entry->name, 0); 851 pdev = platform_device_alloc(pentry->name, 0);
857 if (pdev == NULL) { 852 if (pdev == NULL) {
858 pr_err("out of memory for SFI platform device '%s'.\n", 853 pr_err("out of memory for SFI platform device '%s'.\n",
859 entry->name); 854 pentry->name);
860 return; 855 return;
861 } 856 }
862 install_irq_resource(pdev, entry->irq); 857 install_irq_resource(pdev, pentry->irq);
863 858
864 pdev->dev.platform_data = pdata; 859 pdev->dev.platform_data = pdata;
865 intel_scu_device_register(pdev); 860 intel_scu_device_register(pdev);
866} 861}
867 862
868static void __init sfi_handle_spi_dev(struct spi_board_info *spi_info) 863static void __init sfi_handle_spi_dev(struct sfi_device_table_entry *pentry,
864 struct devs_id *dev)
869{ 865{
870 const struct devs_id *dev = device_ids; 866 struct spi_board_info spi_info;
871 void *pdata = NULL; 867 void *pdata = NULL;
872 868
873 while (dev->name[0]) { 869 memset(&spi_info, 0, sizeof(spi_info));
874 if (dev->type == SFI_DEV_TYPE_SPI && 870 strncpy(spi_info.modalias, pentry->name, SFI_NAME_LEN);
875 !strncmp(dev->name, spi_info->modalias, 871 spi_info.irq = ((pentry->irq == (u8)0xff) ? 0 : pentry->irq);
876 SFI_NAME_LEN)) { 872 spi_info.bus_num = pentry->host_num;
877 pdata = dev->get_platform_data(spi_info); 873 spi_info.chip_select = pentry->addr;
878 break; 874 spi_info.max_speed_hz = pentry->max_freq;
879 } 875 pr_debug("SPI bus=%d, name=%16.16s, irq=0x%2x, max_freq=%d, cs=%d\n",
880 dev++; 876 spi_info.bus_num,
881 } 877 spi_info.modalias,
882 spi_info->platform_data = pdata; 878 spi_info.irq,
879 spi_info.max_speed_hz,
880 spi_info.chip_select);
881
882 pdata = dev->get_platform_data(&spi_info);
883
884 spi_info.platform_data = pdata;
883 if (dev->delay) 885 if (dev->delay)
884 intel_scu_spi_device_register(spi_info); 886 intel_scu_spi_device_register(&spi_info);
885 else 887 else
886 spi_register_board_info(spi_info, 1); 888 spi_register_board_info(&spi_info, 1);
887} 889}
888 890
889static void __init sfi_handle_i2c_dev(int bus, struct i2c_board_info *i2c_info) 891static void __init sfi_handle_i2c_dev(struct sfi_device_table_entry *pentry,
892 struct devs_id *dev)
890{ 893{
891 const struct devs_id *dev = device_ids; 894 struct i2c_board_info i2c_info;
892 void *pdata = NULL; 895 void *pdata = NULL;
893 896
897 memset(&i2c_info, 0, sizeof(i2c_info));
898 strncpy(i2c_info.type, pentry->name, SFI_NAME_LEN);
899 i2c_info.irq = ((pentry->irq == (u8)0xff) ? 0 : pentry->irq);
900 i2c_info.addr = pentry->addr;
901 pr_debug("I2C bus = %d, name = %16.16s, irq = 0x%2x, addr = 0x%x\n",
902 pentry->host_num,
903 i2c_info.type,
904 i2c_info.irq,
905 i2c_info.addr);
906 pdata = dev->get_platform_data(&i2c_info);
907 i2c_info.platform_data = pdata;
908
909 if (dev->delay)
910 intel_scu_i2c_device_register(pentry->host_num, &i2c_info);
911 else
912 i2c_register_board_info(pentry->host_num, &i2c_info, 1);
913}
914
915static struct devs_id __init *get_device_id(u8 type, char *name)
916{
917 struct devs_id *dev = device_ids;
918
919 if (device_ids == NULL)
920 return NULL;
921
894 while (dev->name[0]) { 922 while (dev->name[0]) {
895 if (dev->type == SFI_DEV_TYPE_I2C && 923 if (dev->type == type &&
896 !strncmp(dev->name, i2c_info->type, SFI_NAME_LEN)) { 924 !strncmp(dev->name, name, SFI_NAME_LEN)) {
897 pdata = dev->get_platform_data(i2c_info); 925 return dev;
898 break;
899 } 926 }
900 dev++; 927 dev++;
901 } 928 }
902 i2c_info->platform_data = pdata;
903 929
904 if (dev->delay) 930 return NULL;
905 intel_scu_i2c_device_register(bus, i2c_info);
906 else
907 i2c_register_board_info(bus, i2c_info, 1);
908} 931}
909 932
910
911static int __init sfi_parse_devs(struct sfi_table_header *table) 933static int __init sfi_parse_devs(struct sfi_table_header *table)
912{ 934{
913 struct sfi_table_simple *sb; 935 struct sfi_table_simple *sb;
914 struct sfi_device_table_entry *pentry; 936 struct sfi_device_table_entry *pentry;
915 struct spi_board_info spi_info; 937 struct devs_id *dev = NULL;
916 struct i2c_board_info i2c_info; 938 int num, i;
917 int num, i, bus;
918 int ioapic; 939 int ioapic;
919 struct io_apic_irq_attr irq_attr; 940 struct io_apic_irq_attr irq_attr;
920 941
@@ -939,40 +960,20 @@ static int __init sfi_parse_devs(struct sfi_table_header *table)
939 } else 960 } else
940 irq = 0; /* No irq */ 961 irq = 0; /* No irq */
941 962
963 dev = get_device_id(pentry->type, pentry->name);
964
965 if ((dev == NULL) || (dev->get_platform_data == NULL))
966 continue;
967
942 switch (pentry->type) { 968 switch (pentry->type) {
943 case SFI_DEV_TYPE_IPC: 969 case SFI_DEV_TYPE_IPC:
944 pr_debug("info[%2d]: IPC bus, name = %16.16s, " 970 sfi_handle_ipc_dev(pentry, dev);
945 "irq = 0x%2x\n", i, pentry->name, pentry->irq);
946 sfi_handle_ipc_dev(pentry);
947 break; 971 break;
948 case SFI_DEV_TYPE_SPI: 972 case SFI_DEV_TYPE_SPI:
949 memset(&spi_info, 0, sizeof(spi_info)); 973 sfi_handle_spi_dev(pentry, dev);
950 strncpy(spi_info.modalias, pentry->name, SFI_NAME_LEN);
951 spi_info.irq = irq;
952 spi_info.bus_num = pentry->host_num;
953 spi_info.chip_select = pentry->addr;
954 spi_info.max_speed_hz = pentry->max_freq;
955 pr_debug("info[%2d]: SPI bus = %d, name = %16.16s, "
956 "irq = 0x%2x, max_freq = %d, cs = %d\n", i,
957 spi_info.bus_num,
958 spi_info.modalias,
959 spi_info.irq,
960 spi_info.max_speed_hz,
961 spi_info.chip_select);
962 sfi_handle_spi_dev(&spi_info);
963 break; 974 break;
964 case SFI_DEV_TYPE_I2C: 975 case SFI_DEV_TYPE_I2C:
965 memset(&i2c_info, 0, sizeof(i2c_info)); 976 sfi_handle_i2c_dev(pentry, dev);
966 bus = pentry->host_num;
967 strncpy(i2c_info.type, pentry->name, SFI_NAME_LEN);
968 i2c_info.irq = irq;
969 i2c_info.addr = pentry->addr;
970 pr_debug("info[%2d]: I2C bus = %d, name = %16.16s, "
971 "irq = 0x%2x, addr = 0x%x\n", i, bus,
972 i2c_info.type,
973 i2c_info.irq,
974 i2c_info.addr);
975 sfi_handle_i2c_dev(bus, &i2c_info);
976 break; 977 break;
977 case SFI_DEV_TYPE_UART: 978 case SFI_DEV_TYPE_UART:
978 case SFI_DEV_TYPE_HSI: 979 case SFI_DEV_TYPE_HSI: