static int sim_state_init(struct hisi_sim_hotplug_info *info, struct device *dev) { int err = 0; info->pctrl = devm_pinctrl_get(dev); if (IS_ERR(info->pctrl)) { dev_err(dev, "failed to devm pinctrl get\n"); err = -EINVAL; return err; } info->sim_default = pinctrl_lookup_state(info->pctrl, PINCTRL_STATE_DEFAULT); if (IS_ERR(info->sim_default)) { dev_err(dev, "failed to pinctrl lookup state default\n"); err = -EINVAL; return err; } info->sim_idle = pinctrl_lookup_state(info->pctrl, PINCTRL_STATE_IDLE); if (IS_ERR(info->sim_idle)) { dev_err(dev, "failed to pinctrl lookup state idle\n"); err = -EINVAL; return err; } if (!gpio_get_value(info->det_gpio)) { info->old_det_gpio_state = 0; if (NORMAL_CLOSE == info->det_direction) { info->sim_pluged = SIM_CARD_OUT; sim_set_inactive(info); set_sim_status(info, info->sim_id, info->sim_pluged, 3, NO_NOTIFY); } else { info->sim_pluged = SIM_CARD_IN; sim_set_active(info); set_sim_status(info, info->sim_id, info->sim_pluged, 2, NO_NOTIFY); } } else { info->old_det_gpio_state = 1; if (NORMAL_CLOSE == info->det_direction) { info->sim_pluged = SIM_CARD_IN; sim_set_active(info); set_sim_status(info, info->sim_id, info->sim_pluged, 2, NO_NOTIFY); } else { info->sim_pluged = SIM_CARD_OUT; sim_set_inactive(info); set_sim_status(info, info->sim_id, info->sim_pluged, 3, NO_NOTIFY); } } mutex_init(&(info->sim_hotplug_lock)); wake_lock_init(&info->sim_hotplug_wklock, WAKE_LOCK_SUSPEND, "android-simhotplug"); return 0; }
static void sim_det_irq_set_active(struct hisi_sim_hotplug_info *sim_hotplug_info) { sim_hotplug_info->sim_pluged = SIM_CARD_IN; sim_set_active(sim_hotplug_info); pr_info("%s, %d, sim_hotplug_info->sim_id=%d, SIM_CARD_IN \n", __func__, __LINE__, sim_hotplug_info->sim_id); hisi_sim_det_msg_to_ccore(sim_hotplug_info, SIM_CARD_IN); set_sim_status(sim_hotplug_info, sim_hotplug_info->sim_id, sim_hotplug_info->sim_pluged, 0, NO_NOTIFY); }
static void inquiry_sim_det_irq_reg(struct work_struct *work) { struct hisi_sim_hotplug_info *sim_hotplug_info = container_of(work, struct hisi_sim_hotplug_info, sim_hotplug_det_wk1); int det_gpio_state = 0; #ifdef CONFIG_HISI_RPROC int ret = 0; #endif det_gpio_state = gpio_get_value(sim_hotplug_info->det_gpio); pr_info("%s, %d, det_gpio_state:%d, sim_pluged:%d, g_send_msg_to_lpm3:%d\n", __func__, __LINE__, det_gpio_state, sim_hotplug_info->sim_pluged, g_send_msg_to_lpm3); if (!det_gpio_state) { if (sim_hotplug_info->sim_pluged == SIM_LEAVE_POSITION) { sim_hotplug_info->sim_pluged = SIM_IN_POSITION; sim_set_active(sim_hotplug_info); pr_info("%s, %d, sim_hotplug_info->sim_id=%d, SIM_IN_POSITION \n", __func__, __LINE__, sim_hotplug_info->sim_id); #ifdef CONFIG_HISI_RPROC if (g_send_msg_to_lpm3) { ret = hisi_sim_sem_msg_to_lpm3(sim_hotplug_info, sim_hotplug_info->sim_id, SIM_IN_POSITION); if (ret) { pr_err("%s:, input sim card[%d]: ap send mesage to lpm3 fail!\n", __func__, sim_hotplug_info->sim_id); } } #endif set_sim_status(sim_hotplug_info, sim_hotplug_info->sim_id, sim_hotplug_info->sim_pluged, 0, NO_NOTIFY); } } else if (det_gpio_state) { if (sim_hotplug_info->sim_pluged == SIM_IN_POSITION) { sim_hotplug_info->sim_pluged = SIM_LEAVE_POSITION; sim_set_inactive(sim_hotplug_info); pr_info("%s, %d, sim_hotplug_info->sim_id=%d, SIM_LEAVE_POSITION \n", __func__, __LINE__, sim_hotplug_info->sim_id); #ifdef CONFIG_HISI_RPROC if (g_send_msg_to_lpm3) { ret = hisi_sim_sem_msg_to_lpm3(sim_hotplug_info, sim_hotplug_info->sim_id, SIM_LEAVE_POSITION); if (ret) { pr_err("%s:, output sim card[%d]: ap send mesage to lpm3 fail!\n", __func__, sim_hotplug_info->sim_id); } } #endif set_sim_status(sim_hotplug_info, sim_hotplug_info->sim_id, sim_hotplug_info->sim_pluged, 1, NO_NOTIFY); } } else { set_sim_status(sim_hotplug_info, -1, -1, -1, NO_NOTIFY); } }