static int __devinit request_irqs(struct platform_device *pdev) { struct resource *res; int ret; ret = 0; bitmap_fill(pm8058_chg.enabled_irqs, PMIC_CHG_MAX_INTS); res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "CHGVAL"); if (res == NULL) { dev_err(pm8058_chg.dev, "%s:couldnt find resource CHGVAL\n", __func__); goto err_out; } else { ret = request_any_context_irq(res->start, pm8058_chg_chgval_handler, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, res->name, NULL); if (ret < 0) { dev_err(pm8058_chg.dev, "%s:couldnt request %d %d\n", __func__, res->start, ret); goto err_out; } else { pm8058_chg.pmic_chg_irq[CHGVAL_IRQ] = res->start; } } return 0; err_out: free_irqs(); return -EINVAL; }
static int __devexit pm8058_usb_vbus_remove(struct platform_device *pdev) { struct pm8058_chip *pm_chip = platform_get_drvdata(pdev); free_irqs(); kfree(pm_chip); return 0; }
static int __devexit pm8058_charger_remove(struct platform_device *pdev) { struct msm_hardware_charger *pchg = dev_get_drvdata(&pdev->dev); // container_of(&pdev, struct msm_hardware_charger, pdev); pchg->chg_detection_config(0, pchg->gpio_num); msm_charger_notify_event(pchg, CHG_REMOVED_EVENT); msm_charger_unregister(pchg); // //#ifdef CONFIG_HAS_EARLYSUSPEND // unregister_early_suspend(&pchg->early_suspend); //#endif // free_irqs(pchg); kfree(pchg); return 0; }
static int dev_release(struct inode *inode,struct file *filp) { free_irqs(); return 0; }
static int __devexit pm8058_charger_remove(struct platform_device *pdev) { free_irqs(); return 0; }
static void __exit sbc2410_buttons_exit(void) { devfs_unregister(devfs_handle); free_irqs(); unregister_chrdev(BUTTON_MAJOR, DEVICE_NAME); }
static int __devinit pm8058_charger_probe(struct platform_device *pdev) { int ret; struct pm8058_charger_platform_data *pdata; struct msm_hardware_charger *pchg; pdata = pdev->dev.platform_data; if(!pdata) { pr_err("%s: no platform_data passed in. \n", __func__); return -EFAULT; } pchg = kzalloc(sizeof *pchg, GFP_KERNEL); if (pchg == NULL) { pr_err("%s kzalloc failed\n", __func__); return -ENOMEM; } pchg->chg_detection_config = pdata->chg_detection_config; pchg->get_charger_status = pdata->get_charger_status; pchg->pdev = pdev; pchg->gpio_num = pdata->gpio_num; pchg->rating = pdata->rating; pchg->charger.name = pdata->name; if(pdata->rating == 2) { pchg->charger.type = POWER_SUPPLY_TYPE_MAINS; } else if(pdata->rating == 1) { pchg->charger.type = POWER_SUPPLY_TYPE_USB; } else { goto error_type; } pchg->charger.supplied_to = msm_power_supplied_to; pchg->charger.num_supplicants = ARRAY_SIZE(msm_power_supplied_to); pchg->charger.properties = msm_power_props; pchg->charger.num_properties = ARRAY_SIZE(msm_power_props); pchg->charger.get_property = charger_get_property_s7pro; // //#ifdef CONFIG_HAS_EARLYSUSPEND // pchg->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; // pchg->early_suspend.suspend = s7pro_charger_early_suspend; // pchg->early_suspend.resume = s7pro_charger_late_resume; // register_early_suspend(&pchg->early_suspend); //#endif // dev_set_drvdata(&pdev->dev, pchg); if(pchg->chg_detection_config(1, pchg->gpio_num)) { pr_err("%s, init config fail. \n", __func__); goto error_type; } ret = request_irqs(pchg); if (ret) { pr_err("%s: couldnt register interrupts\n", __func__); goto error_type; } ret = msm_charger_register(pchg); if(ret) { pr_err("%s register charger failed ret=%d\n", __func__, ret); goto register_fail; } /* determine what state the charger is in */ pm8058_chg_determine_initial_state(pchg); return 0; register_fail: free_irqs(pchg); error_type: kfree(pchg); return -EFAULT; }