mfd: Fix pcf50633-regulator drvdata usage
authorLars-Peter Clausen <lars@metafoo.de>
Tue, 13 Oct 2009 22:12:36 +0000 (02:12 +0400)
committerSamuel Ortiz <sameo@linux.intel.com>
Sun, 13 Dec 2009 18:21:20 +0000 (19:21 +0100)
Currently the pcf50633-regulator driver data is set to the pcf50633 core
structure, but the pcf50633-regulator remove handler assumes that it is set to
the regulator device. This patch fixes the issue by accessing the pcf506533
core structure through its parent device and setting the driver data to the
regulator device.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/mfd/pcf50633-core.c
drivers/regulator/pcf50633-regulator.c

index 1774f60b1b2aea604d0aea2c3b9bffa54af1c6ee..f109551eedade6646dde05efc9b69521a18282aa 100644 (file)
@@ -613,7 +613,6 @@ static int __devinit pcf50633_probe(struct i2c_client *client,
                pdev->dev.parent = pcf->dev;
                platform_device_add_data(pdev, &pdata->reg_init_data[i],
                                        sizeof(pdata->reg_init_data[i]));
-               dev_set_drvdata(&pdev->dev, pcf);
                pcf->regulator_pdev[i] = pdev;
 
                platform_device_add(pdev);
index 0803ffe6236d03526c66df8fbf6e9bdba0150b7f..c8f41dc05b76f772aa58d57d85c0ab231672a87f 100644 (file)
@@ -314,13 +314,15 @@ static int __devinit pcf50633_regulator_probe(struct platform_device *pdev)
        struct pcf50633 *pcf;
 
        /* Already set by core driver */
-       pcf = platform_get_drvdata(pdev);
+       pcf = dev_to_pcf50633(pdev->dev.parent);
 
        rdev = regulator_register(&regulators[pdev->id], &pdev->dev,
                                  pdev->dev.platform_data, pcf);
        if (IS_ERR(rdev))
                return PTR_ERR(rdev);
 
+       platform_set_drvdata(pdev, rdev);
+
        if (pcf->pdata->regulator_registered)
                pcf->pdata->regulator_registered(pcf, pdev->id);
 
@@ -331,6 +333,7 @@ static int __devexit pcf50633_regulator_remove(struct platform_device *pdev)
 {
        struct regulator_dev *rdev = platform_get_drvdata(pdev);
 
+       platform_set_drvdata(pdev, NULL);
        regulator_unregister(rdev);
 
        return 0;