int ds2746_blocking_notify(unsigned long val, void *v) { int chg_ctl; if (val == DS2746_CHARGING_CONTROL){ chg_ctl = *(int *) v; if (machine_is_passionc()){ if (chg_ctl <= 2){ gpio_direction_output(22, !(!!chg_ctl));/*PNC*/ set_charger_ctrl(chg_ctl); } return 0; }else if (TOGGLE_CHARGER == chg_ctl || ENABLE_MIN_TAPER == chg_ctl || DISABLE_MIN_TAPER == chg_ctl) { if (0 == poweralg.charging_enable) return 0; } else if (poweralg.charge_state != CHARGE_STATE_PREDICTION) { /* only notify at changes */ if (g_first_update_charger_ctl == 1) { printk(DRIVER_ZONE "first update charger control forcely.\n"); g_first_update_charger_ctl = 0; poweralg.charging_enable = chg_ctl; } else if (poweralg.charging_enable == chg_ctl) return 0; else poweralg.charging_enable = chg_ctl; } else { poweralg.charging_enable = DISABLE; v = DISABLE; printk(DRIVER_ZONE "Charging disable due to PREDICTION state\n"); } } return blocking_notifier_call_chain(&ds2746_notifier_list, val, v); }
static int cable_status_handler_func(struct notifier_block *nfb, unsigned long action, void *param) { u32 ctl = (u32)action; pr_info("Switch charger set control%d\n", ctl); set_charger_ctrl(ctl); return NOTIFY_OK; }