aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/platform/intel-mid/intel-mid.c
diff options
context:
space:
mode:
authorKuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>2013-10-17 18:35:31 -0400
committerH. Peter Anvin <hpa@linux.intel.com>2013-10-17 19:40:49 -0400
commit3fd79ae4275001f293dbd170479e89df6c433226 (patch)
tree9631bf5f11c69a67381531dadc12079f594cc7ad /arch/x86/platform/intel-mid/intel-mid.c
parent661b01076500e364c68dd9fdf0ef4216a75e8375 (diff)
intel_mid: Added custom device_handler support
This patch provides a means to add custom handler for SFI devices. If you set device_handler as NULL in device_id table standard SFI device handler will be used. If its not NULL custom handler will be called. Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> Link: http://lkml.kernel.org/r/1382049336-21316-8-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/platform/intel-mid/intel-mid.c')
-rw-r--r--arch/x86/platform/intel-mid/intel-mid.c74
1 files changed, 40 insertions, 34 deletions
diff --git a/arch/x86/platform/intel-mid/intel-mid.c b/arch/x86/platform/intel-mid/intel-mid.c
index d24c729b24ad..7bfd7847a7a6 100644
--- a/arch/x86/platform/intel-mid/intel-mid.c
+++ b/arch/x86/platform/intel-mid/intel-mid.c
@@ -396,6 +396,9 @@ struct devs_id {
396 u8 type; 396 u8 type;
397 u8 delay; 397 u8 delay;
398 void *(*get_platform_data)(void *info); 398 void *(*get_platform_data)(void *info);
399 /* Custom handler for devices */
400 void (*device_handler)(struct sfi_device_table_entry *pentry,
401 struct devs_id *dev);
399}; 402};
400 403
401/* the offset for the mapping of global gpio pin to irq */ 404/* the offset for the mapping of global gpio pin to irq */
@@ -690,28 +693,27 @@ static void *tc35876x_platform_data(void *data)
690} 693}
691 694
692static const struct devs_id __initconst device_ids[] = { 695static const struct devs_id __initconst device_ids[] = {
693 {"bma023", SFI_DEV_TYPE_I2C, 1, &no_platform_data}, 696 {"bma023", SFI_DEV_TYPE_I2C, 1, &no_platform_data, NULL},
694 {"pmic_gpio", SFI_DEV_TYPE_SPI, 1, &pmic_gpio_platform_data}, 697 {"pmic_gpio", SFI_DEV_TYPE_SPI, 1, &pmic_gpio_platform_data, NULL},
695 {"pmic_gpio", SFI_DEV_TYPE_IPC, 1, &pmic_gpio_platform_data}, 698 {"pmic_gpio", SFI_DEV_TYPE_IPC, 1, &pmic_gpio_platform_data, NULL},
696 {"spi_max3111", SFI_DEV_TYPE_SPI, 0, &max3111_platform_data}, 699 {"spi_max3111", SFI_DEV_TYPE_SPI, 0, &max3111_platform_data, NULL},
697 {"i2c_max7315", SFI_DEV_TYPE_I2C, 1, &max7315_platform_data}, 700 {"i2c_max7315", SFI_DEV_TYPE_I2C, 1, &max7315_platform_data, NULL},
698 {"i2c_max7315_2", SFI_DEV_TYPE_I2C, 1, &max7315_platform_data}, 701 {"i2c_max7315_2", SFI_DEV_TYPE_I2C, 1, &max7315_platform_data, NULL},
699 {"tca6416", SFI_DEV_TYPE_I2C, 1, &tca6416_platform_data}, 702 {"tca6416", SFI_DEV_TYPE_I2C, 1, &tca6416_platform_data, NULL},
700 {"emc1403", SFI_DEV_TYPE_I2C, 1, &emc1403_platform_data}, 703 {"emc1403", SFI_DEV_TYPE_I2C, 1, &emc1403_platform_data, NULL},
701 {"i2c_accel", SFI_DEV_TYPE_I2C, 0, &lis331dl_platform_data}, 704 {"i2c_accel", SFI_DEV_TYPE_I2C, 0, &lis331dl_platform_data, NULL},
702 {"pmic_audio", SFI_DEV_TYPE_IPC, 1, &no_platform_data}, 705 {"pmic_audio", SFI_DEV_TYPE_IPC, 1, &no_platform_data, NULL},
703 {"mpu3050", SFI_DEV_TYPE_I2C, 1, &mpu3050_platform_data}, 706 {"mpu3050", SFI_DEV_TYPE_I2C, 1, &mpu3050_platform_data, NULL},
704 {"i2c_disp_brig", SFI_DEV_TYPE_I2C, 0, &tc35876x_platform_data}, 707 {"i2c_disp_brig", SFI_DEV_TYPE_I2C, 0, &tc35876x_platform_data, NULL},
705 708
706 /* MSIC subdevices */ 709 /* MSIC subdevices */
707 {"msic_battery", SFI_DEV_TYPE_IPC, 1, &msic_battery_platform_data}, 710 {"msic_battery", SFI_DEV_TYPE_IPC, 1, &msic_battery_platform_data, NULL},
708 {"msic_gpio", SFI_DEV_TYPE_IPC, 1, &msic_gpio_platform_data}, 711 {"msic_gpio", SFI_DEV_TYPE_IPC, 1, &msic_gpio_platform_data, NULL},
709 {"msic_audio", SFI_DEV_TYPE_IPC, 1, &msic_audio_platform_data}, 712 {"msic_audio", SFI_DEV_TYPE_IPC, 1, &msic_audio_platform_data, NULL},
710 {"msic_power_btn", SFI_DEV_TYPE_IPC, 1, &msic_power_btn_platform_data}, 713 {"msic_power_btn", SFI_DEV_TYPE_IPC, 1, &msic_power_btn_platform_data, NULL},
711 {"msic_ocd", SFI_DEV_TYPE_IPC, 1, &msic_ocd_platform_data}, 714 {"msic_ocd", SFI_DEV_TYPE_IPC, 1, &msic_ocd_platform_data, NULL},
712 {"msic_thermal", SFI_DEV_TYPE_IPC, 1, &msic_thermal_platform_data}, 715 {"msic_thermal", SFI_DEV_TYPE_IPC, 1, &msic_thermal_platform_data, NULL},
713 716 { 0 }
714 {},
715}; 717};
716 718
717#define MAX_IPCDEVS 24 719#define MAX_IPCDEVS 24
@@ -965,20 +967,24 @@ static int __init sfi_parse_devs(struct sfi_table_header *table)
965 if ((dev == NULL) || (dev->get_platform_data == NULL)) 967 if ((dev == NULL) || (dev->get_platform_data == NULL))
966 continue; 968 continue;
967 969
968 switch (pentry->type) { 970 if (dev->device_handler) {
969 case SFI_DEV_TYPE_IPC: 971 dev->device_handler(pentry, dev);
970 sfi_handle_ipc_dev(pentry, dev); 972 } else {
971 break; 973 switch (pentry->type) {
972 case SFI_DEV_TYPE_SPI: 974 case SFI_DEV_TYPE_IPC:
973 sfi_handle_spi_dev(pentry, dev); 975 sfi_handle_ipc_dev(pentry, dev);
974 break; 976 break;
975 case SFI_DEV_TYPE_I2C: 977 case SFI_DEV_TYPE_SPI:
976 sfi_handle_i2c_dev(pentry, dev); 978 sfi_handle_spi_dev(pentry, dev);
977 break; 979 break;
978 case SFI_DEV_TYPE_UART: 980 case SFI_DEV_TYPE_I2C:
979 case SFI_DEV_TYPE_HSI: 981 sfi_handle_i2c_dev(pentry, dev);
980 default: 982 break;
981 ; 983 case SFI_DEV_TYPE_UART:
984 case SFI_DEV_TYPE_HSI:
985 default:
986 break;
987 }
982 } 988 }
983 } 989 }
984 return 0; 990 return 0;