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; }
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; }
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; }