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);
}
コード例 #3
0
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);
	}
}