int m74xx_init_modemctl_device(struct modem_ctl *mc, struct modem_data *pdata) { int ret = 0; #ifdef CONFIG_OF ret = dt_gpio_config(mc, pdata); if (ret < 0) return ret; #endif mc->gpio_cp_on = pdata->gpio_cp_on; mc->gpio_cp_reset = pdata->gpio_cp_reset; mc->gpio_ap_dump_int = pdata->gpio_ap_dump_int; mc->gpio_cp_dump_int = pdata->gpio_cp_dump_int; mc->gpio_phone_active = pdata->gpio_phone_active; mc->gpio_pda_active = pdata->gpio_pda_active; ret = verify_gpios(mc); if (ret < 0) return ret; mc->cp_crash_nfb.notifier_call = cp_crash_notify_call; register_cp_crash_notifier(&mc->cp_crash_nfb); m74xx_get_ops(mc); mc->irq_phone_active = gpio_to_irq(mc->gpio_phone_active); ret = request_irq(mc->irq_phone_active, phone_active_irq_handler, IRQF_NO_SUSPEND | IRQF_TRIGGER_RISING, "phone_active", mc); if (ret) { mif_err("failed to request_irq:%d\n", ret); goto err_phone_active_request_irq; } ret = enable_irq_wake(mc->irq_phone_active); if (ret) { mif_err("failed to enable_irq_wake:%d\n", ret); goto err_phone_active_set_wake_irq; } mif_info("success\n"); return ret; err_phone_active_set_wake_irq: free_irq(mc->irq_phone_active, mc); err_phone_active_request_irq: return ret; }
int ss300_init_modemctl_device(struct modem_ctl *mc, struct modem_data *pdata) { int ret = 0; unsigned int irq = 0; unsigned long flag = 0; char name[MAX_NAME_LEN]; mif_err("+++\n"); ret = dt_gpio_config(mc, pdata); if (ret < 0) return ret; if (!pdata->gpio_cp_on || !pdata->gpio_cp_reset || !pdata->gpio_pda_active || !pdata->gpio_phone_active || !pdata->gpio_ap_wakeup || !pdata->gpio_ap_status || !pdata->gpio_cp_wakeup || !pdata->gpio_cp_status) { mif_err("ERR! no GPIO data\n"); mif_err("xxx\n"); return -ENXIO; } mc->gpio_cp_on = pdata->gpio_cp_on; 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_ap_wakeup = pdata->gpio_ap_wakeup; mc->gpio_ap_status = pdata->gpio_ap_status; mc->gpio_cp_wakeup = pdata->gpio_cp_wakeup; mc->gpio_cp_status = pdata->gpio_cp_status; mc->gpio_ap_dump_int = pdata->gpio_ap_dump_int; gpio_set_value(mc->gpio_cp_reset, 0); gpio_set_value(mc->gpio_cp_on, 0); print_mc_state(mc); ss300_get_ops(mc); dev_set_drvdata(mc->dev, mc); wake_lock_init(&mc_wake_lock, WAKE_LOCK_SUSPEND, "ss300_wake_lock"); mc->wake_lock = &mc_wake_lock; irq = gpio_to_irq(mc->gpio_phone_active); if (!irq) { mif_err("ERR! no irq_cp_active\n"); mif_err("xxx\n"); return -EINVAL; } mif_err("PHONE_ACTIVE IRQ# = %d\n", irq); mc->event_nfb.notifier_call = modemctl_notify_call; register_cp_crash_notifier(&mc->event_nfb); flag = IRQF_TRIGGER_RISING | IRQF_NO_THREAD | IRQF_NO_SUSPEND; snprintf(name, MAX_NAME_LEN, "%s_active", mc->name); mif_init_irq(&mc->irq_cp_active, irq, name, flag); ret = mif_request_irq(&mc->irq_cp_active, cp_active_handler, mc); if (ret) { mif_err("%s: ERR! request_irq(%s#%d) fail (%d)\n", mc->name, mc->irq_cp_active.name, mc->irq_cp_active.num, ret); mif_err("xxx\n"); return ret; } mif_err("---\n"); return 0; }
noinline int xmm7260_init_modemctl_device(struct modem_ctl *mc, struct modem_data *pdata) { int ret; #ifdef CONFIG_OF ret = dt_gpio_config(mc, pdata); if (ret < 0) return ret; #endif 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_ap_dump_int = pdata->gpio_ap_dump_int; mc->gpio_cp_dump_int = pdata->gpio_cp_dump_int; mc->gpio_sim_detect = pdata->gpio_sim_detect; mc->gpio_ap_wakeup = pdata->gpio_ap_wakeup; mc->gpio_ap_status = pdata->gpio_ap_status; mc->gpio_cp_wakeup = pdata->gpio_cp_wakeup; mc->gpio_cp_status = pdata->gpio_cp_status; mif_info("cp_on=%d, reset_req_n=%d, cp_reset=%d, pda_active=%d\n", mc->gpio_cp_on, mc->gpio_reset_req_n, mc->gpio_cp_reset, mc->gpio_pda_active); mif_info("phone_active=%d, ap_dump_int=%d, cp_dump_int=%d," \ " sim_detect=%d\n", mc->gpio_phone_active, mc->gpio_ap_dump_int, mc->gpio_cp_dump_int, mc->gpio_sim_detect); mif_info("ap_wakeup=%d, ap_status=%d, cp_wakeup=%d, cp_status=%d,", mc->gpio_ap_wakeup, mc->gpio_ap_status, mc->gpio_cp_wakeup, mc->gpio_cp_status); 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); mc->event_nfb.notifier_call = modemctl_notify_call; register_cp_crash_notifier(&mc->event_nfb); xmm7260_get_ops(mc); ret = request_irq(mc->irq_phone_active, phone_active_irq_handler, /* IRQF_NO_SUSPEND | IRQF_TRIGGER_HIGH, */ IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING, "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; }