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; }