示例#1
0
static int __devinit pm8901_probe(struct platform_device *pdev)
{
	int rc;
	struct pm8901_platform_data *pdata = pdev->dev.platform_data;
	const char *revision_name = "unknown";
	struct pm8901_chip *pmic;
	int revision;

	if (pdata == NULL) {
		pr_err("%s: No platform_data or IRQ.\n", __func__);
		return -ENODEV;
	}

	pmic = kzalloc(sizeof *pmic, GFP_KERNEL);
	if (pmic == NULL) {
		pr_err("%s: kzalloc() failed.\n", __func__);
		return -ENOMEM;
	}

	pmic->dev = &pdev->dev;

	pm8901_drvdata.pm_chip_data = pmic;
	platform_set_drvdata(pdev, &pm8901_drvdata);

	/* Read PMIC chip revision */
	rc = pm8901_readb(pmic->dev, PM8901_REG_REV, &pmic->revision);
	if (rc)
		pr_err("%s: Failed reading version register rc=%d.\n",
			__func__, rc);

	pr_info("%s: PMIC revision reg: %02X\n", __func__, pmic->revision);
	revision =  pm8xxx_get_revision(pmic->dev);
	if (revision >= 0 && revision < ARRAY_SIZE(pm8901_rev_names))
		revision_name = pm8901_rev_names[revision];
	pr_info("%s: PMIC version: PM8901 rev %s\n", __func__, revision_name);

	(void) memcpy((void *)&pmic->pdata, (const void *)pdata,
		      sizeof(pmic->pdata));

	rc = pm8901_add_subdevices(pdata, pmic);
	if (rc) {
		pr_err("Cannot add subdevices rc=%d\n", rc);
		goto err;
	}

	return 0;

err:
	platform_set_drvdata(pdev, NULL);
	kfree(pmic);
	return rc;
}
示例#2
0
static int pm8901_probe(struct platform_device *pdev)
{
    int rc;
    struct pm8901_platform_data *pdata = pdev->dev.platform_data;
    struct pm8901_chip *pmic;

    if (pdata == NULL) {
        pr_err("%s: No platform_data or IRQ.\n", __func__);
        return -ENODEV;
    }

    pmic = kzalloc(sizeof *pmic, GFP_KERNEL);
    if (pmic == NULL) {
        pr_err("%s: kzalloc() failed.\n", __func__);
        return -ENOMEM;
    }

    pmic->dev = &pdev->dev;

    pm8901_drvdata.pm_chip_data = pmic;
    platform_set_drvdata(pdev, &pm8901_drvdata);

    /* Read PMIC chip revision */
    rc = pm8901_readb(pmic->dev, PM8901_REG_REV, &pmic->revision);
    if (rc)
        pr_err("%s: Failed reading version register rc=%d.\n",
               __func__, rc);

    pr_info("%s: PMIC REVISION = %X\n", __func__, pmic->revision);

    (void) memcpy((void *)&pmic->pdata, (const void *)pdata,
                  sizeof(pmic->pdata));

    rc = pm8901_add_subdevices(pdata, pmic);
    if (rc) {
        pr_err("Cannot add subdevices rc=%d\n", rc);
        goto err;
    }

//20120917. CR326086
    rc = pm8xxx_preload_dVdd();

    return 0;

err:
    platform_set_drvdata(pdev, NULL);
    kfree(pmic);
    return rc;
}
示例#3
0
static int __devinit pm8901_probe(struct platform_device *pdev)
{
	int rc;
	struct pm8901_platform_data *pdata = pdev->dev.platform_data;
	const char *revision_name = "unknown";
	struct pm8901_chip *pmic;
	int revision;

	if (pdata == NULL) {
		pr_err("%s: No platform_data or IRQ.\n", __func__);
		return -ENODEV;
	}

	pmic = kzalloc(sizeof *pmic, GFP_KERNEL);
	if (pmic == NULL) {
		pr_err("%s: kzalloc() failed.\n", __func__);
		return -ENOMEM;
	}

	pmic->dev = &pdev->dev;

	pm8901_drvdata.pm_chip_data = pmic;
	platform_set_drvdata(pdev, &pm8901_drvdata);

	/* Read PMIC chip revision */
	rc = pm8901_readb(pmic->dev, PM8901_REG_REV, &pmic->revision);
	if (rc)
		pr_err("%s: Failed reading version register rc=%d.\n",
			__func__, rc);

	pr_info("%s: PMIC revision reg: %02X\n", __func__, pmic->revision);
	revision =  pm8xxx_get_revision(pmic->dev);
	if (revision >= 0 && revision < ARRAY_SIZE(pm8901_rev_names))
		revision_name = pm8901_rev_names[revision];
	pr_info("%s: PMIC version: PM8901 rev %s\n", __func__, revision_name);

        // This api is s/w workaround for PM8901's abnormal spike which could
        // cause DDR problem on PCB. Because of the spike SS made new PCB for
        // h/w workaround. This s/w workaround is for old PCBs. And If a target
        // is new PCB,  you should call a api to drop bypass voltage
        // to 1.725 originally. But you don't need that here, bacause you've done
        // that already at SBL3. So instead of calling api to drop bypass voltage 
        // here you just need to check if SBL3 bootloader includes the api.
        // In other words this api has dependency with SBL3 change
        if( pm8901_is_old_PCB_with_PM8901()==1 )
                pm8901_preload_dVdd_old();
                
	(void) memcpy((void *)&pmic->pdata, (const void *)pdata,
		      sizeof(pmic->pdata));

	rc = pm8901_add_subdevices(pdata, pmic);
	if (rc) {
		pr_err("Cannot add subdevices rc=%d\n", rc);
		goto err;
	}

	return 0;

err:
	platform_set_drvdata(pdev, NULL);
	kfree(pmic);
	return rc;
}