Ejemplo n.º 1
0
static int pm8901_probe(struct i2c_client *client,
                        const struct i2c_device_id *id)
{
    int	i, rc;
    struct	pm8901_platform_data *pdata = client->dev.platform_data;
    struct	pm8901_chip *chip;

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

    if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) {
        pr_err("%s: i2c_check_functionality failed.\n", __func__);
        return -ENODEV;
    }

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

    chip->dev = client;

    /* Read PMIC chip revision */
    rc = ssbi_read(chip->dev, SSBI_REG_REV, &chip->revision, 1);
    if (rc)
        pr_err("%s: Failed on ssbi_read for revision: rc=%d.\n",
               __func__, rc);
    pr_info("%s: PMIC revision: %X\n", __func__, chip->revision);

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

    set_irq_data(chip->dev->irq, (void *)chip);
    set_irq_wake(chip->dev->irq, 1);

    chip->pm_max_irq = 0;
    chip->pm_max_blocks = 0;
    chip->pm_max_masters = 0;

    i2c_set_clientdata(client, chip);

    pmic_chip = chip;
    spin_lock_init(&chip->pm_lock);

    /* Register for all reserved IRQs */
    for (i = pdata->irq_base; i < (pdata->irq_base + MAX_PM_IRQ); i++) {
        set_irq_chip(i, &pm8901_irq_chip);
        set_irq_handler(i, handle_edge_irq);
        set_irq_flags(i, IRQF_VALID);
        set_irq_data(i, (void *)chip);
    }

    /* Add sub devices with the chip parameter as driver data */
    for (i = 0; i < pdata->num_subdevs; i++)
        pdata->sub_devices[i].driver_data = chip;
    rc = mfd_add_devices(&chip->dev->dev, 0, pdata->sub_devices,
                         pdata->num_subdevs, NULL, 0);
    if (rc) {
        pr_err("%s: could not add devices %d\n", __func__, rc);
        return rc;
    }

    rc = request_threaded_irq(chip->dev->irq, NULL, pm8901_isr_thread,
                              IRQF_ONESHOT | IRQF_DISABLED | pdata->irq_trigger_flags,
                              "pm8901-irq", chip);
    if (rc)
        pr_err("%s: could not request irq %d: %d\n", __func__,
               chip->dev->irq, rc);

    rc = pmic8901_dbg_probe(chip);
    if (rc < 0)
        pr_err("%s: could not set up debugfs: %d\n", __func__, rc);

    pm8901_preload_dVdd();

    return rc;
}
Ejemplo n.º 2
0
static int pm8901_probe(struct i2c_client *client,
			const struct i2c_device_id *id)
{
	int	i, rc;
	struct	pm8901_platform_data *pdata = client->dev.platform_data;
	struct	pm8901_chip *chip;

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

	if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) {
		pr_err("%s: i2c_check_functionality failed.\n", __func__);
		return -ENODEV;
	}

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

	chip->dev = client;

	/* Read PMIC chip revision */
	rc = ssbi_read(chip->dev, SSBI_REG_REV, &chip->revision, 1);
	if (rc)
		pr_err("%s: Failed on ssbi_read for revision: rc=%d.\n",
			__func__, rc);
	pr_info("%s: PMIC revision: %X\n", __func__, chip->revision);

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

	set_irq_data(chip->dev->irq, (void *)chip);
	set_irq_wake(chip->dev->irq, 1);

	chip->pm_max_irq = 0;
	chip->pm_max_blocks = 0;
	chip->pm_max_masters = 0;

	i2c_set_clientdata(client, chip);

	pmic_chip = chip;
	spin_lock_init(&chip->pm_lock);

        // kmj_el15.pm8901_patch
        // 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();
	

	/* Register for all reserved IRQs */
	for (i = pdata->irq_base; i < (pdata->irq_base + MAX_PM_IRQ); i++) {
		set_irq_chip(i, &pm8901_irq_chip);
		set_irq_handler(i, handle_edge_irq);
		set_irq_flags(i, IRQF_VALID);
		set_irq_data(i, (void *)chip);
	}

	/* Add sub devices with the chip parameter as driver data */
	for (i = 0; i < pdata->num_subdevs; i++)
		pdata->sub_devices[i].driver_data = chip;
	rc = mfd_add_devices(&chip->dev->dev, 0, pdata->sub_devices,
			     pdata->num_subdevs, NULL, 0);
	if (rc) {
		pr_err("%s: could not add devices %d\n", __func__, rc);
		return rc;
	}

	rc = request_threaded_irq(chip->dev->irq, NULL, pm8901_isr_thread,
			IRQF_ONESHOT | IRQF_DISABLED | pdata->irq_trigger_flags,
			"pm8901-irq", chip);
	if (rc)
		pr_err("%s: could not request irq %d: %d\n", __func__,
				chip->dev->irq, rc);

	rc = pmic8901_dbg_probe(chip);
	if (rc < 0)
		pr_err("%s: could not set up debugfs: %d\n", __func__, rc);

	return rc;
}
Ejemplo n.º 3
0
static int pm8901_probe(struct platform_device *pdev)
{
	int i, rc;
	struct pm8901_platform_data *pdata = pdev->dev.platform_data;
	struct pm8901_chip *chip;

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

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

	chip->dev = &pdev->dev;

	/* Read PMIC chip revision */
	rc = ssbi_read(chip->dev, SSBI_REG_REV, &chip->revision, 1);
	if (rc)
		pr_err("%s: Failed on ssbi_read for revision: rc=%d.\n",
			__func__, rc);
	pr_info("%s: PMIC revision: %X\n", __func__, chip->revision);

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

	irq_set_handler_data(pdata->irq, (void *)chip);
	irq_set_irq_wake(pdata->irq, 1);

	chip->pm_max_irq = 0;
	chip->pm_max_blocks = 0;
	chip->pm_max_masters = 0;

	platform_set_drvdata(pdev, chip);

	pmic_chip = chip;
	spin_lock_init(&chip->pm_lock);

	/* Register for all reserved IRQs */
	for (i = pdata->irq_base; i < (pdata->irq_base + MAX_PM_IRQ); i++) {
		irq_set_chip(i, &pm8901_irq_chip);
		irq_set_handler(i, handle_edge_irq);
		set_irq_flags(i, IRQF_VALID);
		irq_set_handler_data(i, (void *)chip);
	}

	rc = mfd_add_devices(chip->dev, 0, pdata->sub_devices,
			     pdata->num_subdevs, NULL, 0);
	if (rc) {
		pr_err("%s: could not add devices %d\n", __func__, rc);
		return rc;
	}

	rc = request_threaded_irq(pdata->irq, NULL, pm8901_isr_thread,
			IRQF_ONESHOT | IRQF_DISABLED | pdata->irq_trigger_flags,
			"pm8901-irq", chip);
	if (rc)
		pr_err("%s: could not request irq %d: %d\n", __func__,
				pdata->irq, rc);

	rc = pmic8901_dbg_probe(chip);
	if (rc < 0)
		pr_err("%s: could not set up debugfs: %d\n", __func__, rc);

	return rc;
}