diff --git a/drivers/misc/sx937x/sx937x_sar.c b/drivers/misc/sx937x/sx937x_sar.c index 804f24da791e..26b1b5151e64 100644 --- a/drivers/misc/sx937x/sx937x_sar.c +++ b/drivers/misc/sx937x/sx937x_sar.c @@ -1174,6 +1174,16 @@ static int capsensor_set_enable(struct sensors_classdev *sensors_cdev, } #ifdef CONFIG_CAPSENSE_USB_CAL +static void ps_notify_callback_work(struct work_struct *work) +{ + u32 temp = 0; + sx937x_i2c_read_16bit(global_sx937x, SX937X_GENERAL_SETUP, &temp); + if (temp & 0x000000FF) { + LOG_DBG("USB state change, Going to force calibrate\n"); + manual_offset_calibration(global_sx937x); + } +} + static int ps_get_state(struct power_supply *psy, bool *present) { union power_supply_propval pval = {0}; @@ -1204,63 +1214,14 @@ static int ps_get_state(struct power_supply *psy, bool *present) return 0; } -static void ps_notify_callback_work(struct work_struct *work) -{ - u32 temp = 0; - bool present; - int retval; - struct sx937x_platform_data *data = - container_of(work, struct sx937x_platform_data, ps_notify_work); - - - if (global_sx937x->psy_event == SX93XX_PSY_EVENT_USB) - { - retval = ps_get_state(global_sx937x->psy, &present); - if (retval) { - return; - } - - if (data->ps_is_present == present) { - LOG_DBG("ps present state not change\n"); - return; - } - data->ps_is_present = present; - sx937x_i2c_read_16bit(global_sx937x, SX937X_GENERAL_SETUP, &temp); - if (temp & 0x000000FF) { - LOG_ERR("USB state change, Going to force calibrate\n"); - manual_offset_calibration(global_sx937x); - } - global_sx937x->psy_event = SX93XX_PSY_EVENT_UNKNOWN; - } - -#ifdef CONFIG_CAPSENSE_ATTACH_CAL - if (global_sx937x->psy_event == SX93XX_PSY_EVENT_PHONE) - { - retval = ps_get_state(global_sx937x->psy, &present); - if (retval) - return retval; - - if (data->phone_is_present != present) { - data->phone_is_present = present; - sx937x_i2c_read_16bit(global_sx937x, SX937X_GENERAL_SETUP, &temp); - if (temp & 0x000000FF) { - LOG_ERR("Phone state change, Going to force calibrate\n"); - manual_offset_calibration(global_sx937x); - } - } - global_sx937x->psy_event = SX93XX_PSY_EVENT_UNKNOWN; - } -#endif -} - static int ps_notify_callback(struct notifier_block *self, unsigned long event, void *p) { struct sx937x_platform_data *data = container_of(self, struct sx937x_platform_data, ps_notif); struct power_supply *psy = p; - global_sx937x->psy = p; - global_sx937x->psy_event = SX93XX_PSY_EVENT_UNKNOWN; + bool present; + int retval; #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,9,0) if (event == PSY_EVENT_PROP_CHANGED @@ -1270,7 +1231,18 @@ static int ps_notify_callback(struct notifier_block *self, && psy && psy->desc->get_property && psy->desc->name && !strncmp(psy->desc->name, "usb", sizeof("usb")) && data) { LOG_DBG("ps notification: event = %lu\n", event); - global_sx937x->psy_event = SX93XX_PSY_EVENT_USB; + retval = ps_get_state(psy, &present); + if (retval) { + return retval; + } + + if (event == PSY_EVENT_PROP_CHANGED) { + if (data->ps_is_present == present) { + LOG_DBG("ps present state not change\n"); + return 0; + } + } + data->ps_is_present = present; schedule_work(&data->ps_notify_work); } @@ -1279,8 +1251,15 @@ static int ps_notify_callback(struct notifier_block *self, && psy && psy->desc->get_property && psy->desc->name && !strncmp(psy->desc->name, "phone", sizeof("phone")) && data) { LOG_DBG("phone ps notification: event = %lu\n", event); - global_sx937x->psy_event = SX93XX_PSY_EVENT_PHONE; - schedule_work(&data->ps_notify_work); + + retval = ps_get_state(psy, &present); + if (retval) + return retval; + + if (data->phone_is_present != present) { + data->phone_is_present = present; + schedule_work(&data->ps_notify_work); + } } #endif diff --git a/include/linux/input/sx937x.h b/include/linux/input/sx937x.h index 1e28de43040c..6051507ae186 100644 --- a/include/linux/input/sx937x.h +++ b/include/linux/input/sx937x.h @@ -481,15 +481,6 @@ typedef struct sx937x_platform_data *psx937x_platform_data_t; #define MAX_NUM_STATUS_BITS (8) - -typedef enum{ - SX93XX_PSY_EVENT_UNKNOWN = 0, - SX93XX_PSY_EVENT_USB, -#ifdef CONFIG_CAPSENSE_ATTACH_CAL - SX93XX_PSY_EVENT_PHONE, -#endif -}sx93xx_psy_supply_type_t; - typedef struct sx93XX sx93XX_t, *psx93XX_t; struct sx93XX { @@ -539,9 +530,6 @@ struct sx93XX atomic_t init_busy; struct delayed_work i2c_watchdog_work; int suspended; - - struct power_supply *psy; - sx93xx_psy_supply_type_t psy_event; }; int sx93XX_IRQ_init(psx93XX_t this);