Exemplo n.º 1
0
int xmm6260_init_modemctl_device(struct modem_ctl *mc,
			struct modem_data *pdata)
{
	int ret = 0;

	mc->gpio_cp_on        = pdata->gpio_cp_on;
	mc->gpio_cp_reset     = pdata->gpio_cp_reset;
	mc->gpio_reset_req_n  = pdata->gpio_reset_req_n;
	mc->gpio_cp_reset_int = pdata->gpio_cp_reset_int;

	xmm6260_get_ops(mc);
	mc->set_ehci_power = pdata->ehci_power;
	mc->modem_state_changed = xmm6260_state_changed;

	if (mc->gpio_cp_reset_int) {
		mc->irq_modem_reset = gpio_to_irq(mc->gpio_cp_reset_int);
		ret = request_threaded_irq(mc->irq_modem_reset, NULL,
			modem_cpreset_irq, IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
			"CP_RESET_INT", mc);
		if (ret) {
			pr_err("Failed register gpio_cp_reset_int irq(%d)!\n",
					mc->irq_modem_reset);
			goto err_cp_reset_irq;
		}
		ret = enable_irq_wake(mc->irq_modem_reset);
		if (ret) {
			MIF_ERR("failed to enable_irq_wake of modem reset:%d\n",
					ret);
			goto err_reset_irq_enable_wake;
		}

	}

	init_waitqueue_head(&mc->read_wq);
	init_waitqueue_head(&mc->conn_wq);
	mc->miscdev.minor = MISC_DYNAMIC_MINOR;
	mc->miscdev.name = "modemctl";
	mc->miscdev.fops = &modem_pm_fops;

	ret = misc_register(&mc->miscdev);
	if(ret) {
		pr_err("Failed to register modem control device\n");
		goto err_misc_register;
	}

	ret = device_create_file(mc->miscdev.this_device, &attr_modem_debug);
	if (ret) {
		pr_err("failed to create sysfs file:attr_modem_debug!\n");
		goto err_device_create_file;
	}

	return ret;

err_device_create_file:
	misc_deregister(&mc->miscdev);
err_misc_register:
err_reset_irq_enable_wake:
	free_irq(mc->irq_modem_reset, mc);
err_cp_reset_irq:
	return ret;
}
int xmm6260_init_modemctl_device(struct modem_ctl *mc,
			struct modem_data *pdata)
{
	int ret;

	mc->gpio_cp_on = pdata->gpio_cp_on;
	mc->gpio_reset_req_n = pdata->gpio_reset_req_n;
	mc->gpio_cp_reset = pdata->gpio_cp_reset;
	mc->gpio_pda_active = pdata->gpio_pda_active;
	mc->gpio_phone_active = pdata->gpio_phone_active;
	mc->gpio_cp_dump_int = pdata->gpio_cp_dump_int;
	mc->gpio_sim_detect = pdata->gpio_sim_detect;

	mc->irq_phone_active = gpio_to_irq(mc->gpio_phone_active);

	if (mc->gpio_sim_detect)
		mc->irq_sim_detect = gpio_to_irq(mc->gpio_sim_detect);

	xmm6260_get_ops(mc);

	ret = request_irq(mc->irq_phone_active, phone_active_irq_handler,
				IRQF_NO_SUSPEND | IRQF_TRIGGER_HIGH,
				"phone_active", mc);
	if (ret) {
		mif_err("failed to request_irq:%d\n", ret);
		return ret;
	}

	ret = enable_irq_wake(mc->irq_phone_active);
	if (ret) {
		mif_err("failed to enable_irq_wake:%d\n", ret);
		goto err_exit;
	}

	/* initialize sim_state if gpio_sim_detect exists */
	mc->sim_state.online = false;
	mc->sim_state.changed = false;
	if (mc->gpio_sim_detect) {
		ret = request_irq(mc->irq_sim_detect, sim_detect_irq_handler,
				IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
				"sim_detect", mc);
		if (ret) {
			mif_err("failed to SD request_irq:%d\n", ret);
			goto err_exit;
		}

		ret = enable_irq_wake(mc->irq_sim_detect);
		if (ret) {
			mif_err("failed to SD enable_irq:%d\n", ret);
			free_irq(mc->irq_sim_detect, mc);
			goto err_exit;
		}

		/* initialize sim_state => insert: gpio=0, remove: gpio=1 */
		mc->sim_state.online = !gpio_get_value(mc->gpio_sim_detect);
		mif_info("SIM detected online=%d\n", mc->sim_state.online);
	}

	return ret;

err_exit:
	free_irq(mc->irq_phone_active, mc);
	return ret;
}