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;
}
예제 #2
0
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;
}
예제 #4
0
파일: misc_key.c 프로젝트: houstar/driver
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;
}
예제 #6
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;
 
}