diff options
author | Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> | 2013-10-17 18:35:30 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2013-10-17 19:40:48 -0400 |
commit | 661b01076500e364c68dd9fdf0ef4216a75e8375 (patch) | |
tree | cdca7b9be99822e60994229061e1a399e3b13f45 /arch/x86 | |
parent | 712b6aa8731a7e148298c58cea66a5209c659e3c (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.c | 141 |
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 | ||
834 | static void __init sfi_handle_ipc_dev(struct sfi_device_table_entry *entry) | 834 | static 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 | ||
868 | static void __init sfi_handle_spi_dev(struct spi_board_info *spi_info) | 863 | static 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 | ||
889 | static void __init sfi_handle_i2c_dev(int bus, struct i2c_board_info *i2c_info) | 891 | static 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 | |||
915 | static 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 | |||
911 | static int __init sfi_parse_devs(struct sfi_table_header *table) | 933 | static 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: |