static void __exit modem_exit(void) { if(GPIO_OEM_VALID(GPIO_VIATEL_MDM_PWR_IND)){ modem_unregister_notifier(&vmdata->pwr_ntf); } if(GPIO_OEM_VALID(GPIO_VIATEL_MDM_RST_IND)){ modem_unregister_notifier(&vmdata->pwr_ntf); } modem_unregister_notifier(&vmdata->err_ntf); if(vmdata) wake_lock_destroy(&vmdata->wlock); }
static int __devexit pil_modem_driver_exit(struct platform_device *pdev) { struct modem_data *drv = platform_get_drvdata(pdev); destroy_ramdump_device(drv->ramdump_dev); subsys_unregister(drv->subsys); modem_unregister_notifier(&drv->notifier); pil_desc_release(&drv->pil_desc); return 0; }
static int modem_boot_remove(struct platform_device *dev) { if(GPIO_OEM_VALID(cbp_rst_ind_gpio)){ oem_gpio_free(cbp_rst_ind_gpio); modem_unregister_notifier(&vmdata->rst_ntf); } if(vmdata) wake_lock_destroy(&vmdata->wlock); return 0; }
static void modem_crash_shutdown(const struct subsys_desc *subsys) { struct modem_data *drv; /* If modem hasn't already crashed, send SMSM_RESET. */ drv = container_of(subsys, struct modem_data, subsys_desc); if (!(smsm_get_state(SMSM_MODEM_STATE) & SMSM_RESET)) { modem_unregister_notifier(&drv->notifier); smsm_reset_modem(SMSM_RESET); } /* Wait to allow the modem to clean up caches etc. */ mdelay(5); }
static void modem_crash_shutdown(const struct subsys_desc *subsys) { struct modem_data *drv; drv = container_of(subsys, struct modem_data, subsys_desc); if (!(smsm_get_state(SMSM_MODEM_STATE) & SMSM_RESET)) { modem_unregister_notifier(&drv->notifier); smsm_reset_modem(SMSM_RESET); } mdelay(5); }
static int __devinit pil_modem_driver_probe(struct platform_device *pdev) { struct modem_data *drv; struct resource *res; struct pil_desc *desc; int ret; drv = devm_kzalloc(&pdev->dev, sizeof(*drv), GFP_KERNEL); if (!drv) return -ENOMEM; platform_set_drvdata(pdev, drv); drv->irq = platform_get_irq(pdev, 0); if (drv->irq < 0) return drv->irq; drv->xo = devm_clk_get(&pdev->dev, "xo"); if (IS_ERR(drv->xo)) return PTR_ERR(drv->xo); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); drv->base = devm_request_and_ioremap(&pdev->dev, res); if (!drv->base) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 1); drv->wdog = devm_request_and_ioremap(&pdev->dev, res); if (!drv->wdog) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 2); if (!res) return -EINVAL; drv->cbase = devm_ioremap(&pdev->dev, res->start, resource_size(res)); if (!drv->cbase) return -ENOMEM; desc = &drv->pil_desc; desc->name = "modem"; desc->dev = &pdev->dev; desc->owner = THIS_MODULE; desc->proxy_timeout = 10000; if (pas_supported(PAS_MODEM) > 0) { desc->ops = &pil_modem_ops_trusted; dev_info(&pdev->dev, "using secure boot\n"); } else { desc->ops = &pil_modem_ops; dev_info(&pdev->dev, "using non-secure boot\n"); } ret = pil_desc_init(desc); if (ret) return ret; drv->notifier.notifier_call = modem_notif_handler, ret = modem_register_notifier(&drv->notifier); if (ret) goto err_notify; drv->subsys_desc.name = "modem"; drv->subsys_desc.depends_on = "adsp"; drv->subsys_desc.dev = &pdev->dev; drv->subsys_desc.owner = THIS_MODULE; drv->subsys_desc.start = modem_start; drv->subsys_desc.stop = modem_stop; drv->subsys_desc.shutdown = modem_shutdown; drv->subsys_desc.powerup = modem_powerup; drv->subsys_desc.ramdump = modem_ramdump; drv->subsys_desc.crash_shutdown = modem_crash_shutdown; INIT_WORK(&drv->fatal_work, modem_fatal_fn); INIT_DELAYED_WORK(&drv->unlock_work, modem_unlock_timeout); drv->subsys = subsys_register(&drv->subsys_desc); if (IS_ERR(drv->subsys)) { ret = PTR_ERR(drv->subsys); goto err_subsys; } drv->ramdump_dev = create_ramdump_device("modem", &pdev->dev); if (!drv->ramdump_dev) { ret = -ENOMEM; goto err_ramdump; } ret = devm_request_irq(&pdev->dev, drv->irq, modem_wdog_bite_irq, IRQF_TRIGGER_RISING, "modem_watchdog", drv); if (ret) goto err_irq; return 0; err_irq: destroy_ramdump_device(drv->ramdump_dev); err_ramdump: subsys_unregister(drv->subsys); err_subsys: modem_unregister_notifier(&drv->notifier); err_notify: pil_desc_release(desc); return ret; }