Merge branch 'i2c/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa...
[linux-drm-fsl-dcu.git] / drivers / i2c / i2c-core.c
index 430c001b3f1e6e0bbca7b372b340241a9a9b558a..5923cfa390c86de6528559c229ace0a4b39b402c 100644 (file)
@@ -254,10 +254,12 @@ static int i2c_device_probe(struct device *dev)
                                        client->flags & I2C_CLIENT_WAKE);
        dev_dbg(dev, "probe\n");
 
+       acpi_dev_pm_attach(&client->dev, true);
        status = driver->probe(client, i2c_match_id(driver->id_table, client));
-       if (status)
+       if (status) {
                i2c_set_clientdata(client, NULL);
-
+               acpi_dev_pm_detach(&client->dev, true);
+       }
        return status;
 }
 
@@ -280,7 +282,7 @@ static int i2c_device_remove(struct device *dev)
        }
        if (status == 0)
                i2c_set_clientdata(client, NULL);
-
+       acpi_dev_pm_detach(&client->dev, true);
        return status;
 }
 
@@ -1109,8 +1111,10 @@ static acpi_status acpi_i2c_add_device(acpi_handle handle, u32 level,
        if (ret < 0 || !info.addr)
                return AE_OK;
 
+       adev->power.flags.ignore_parent = true;
        strlcpy(info.type, dev_name(&adev->dev), sizeof(info.type));
        if (!i2c_new_device(adapter, &info)) {
+               adev->power.flags.ignore_parent = false;
                dev_err(&adapter->dev,
                        "failed to add I2C device %s from ACPI\n",
                        dev_name(&adev->dev));
@@ -1132,6 +1136,9 @@ static void acpi_i2c_register_devices(struct i2c_adapter *adap)
        acpi_handle handle;
        acpi_status status;
 
+       if (!adap->dev.parent)
+               return;
+
        handle = ACPI_HANDLE(adap->dev.parent);
        if (!handle)
                return;