Message ID | 1381327461-10562-3-git-send-email-mika.westerberg@linux.intel.com |
---|---|
State | Awaiting Upstream |
Headers | show |
On Wed, Oct 09, 2013 at 05:04:20PM +0300, Mika Westerberg wrote: > From: Lv Zheng <lv.zheng@intel.com> > > If the I2C client device is enumerated from ACPI namespace it might have > ACPI methods that needs to be called in order to transition the device to > different power states (such as _PSx). > > Implement this for I2C client devices by checking if the device has an ACPI > handle and if that's the case, attach it to the ACPI power domain. In > addition we make sure that the device is fully powered when its ->probe() > function gets called. > > For non-ACPI devices this patch is a no-op. > > Signed-off-by: Lv Zheng <lv.zheng@intel.com> > Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> > --- > drivers/i2c/i2c-core.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c > index 29d3f04..f25dee3 100644 > --- a/drivers/i2c/i2c-core.c > +++ b/drivers/i2c/i2c-core.c > @@ -254,10 +254,16 @@ static int i2c_device_probe(struct device *dev) > client->flags & I2C_CLIENT_WAKE); > dev_dbg(dev, "probe\n"); > > + if (ACPI_HANDLE(&client->dev)) > + acpi_dev_pm_attach(&client->dev, true); I'd prefer to drop the 'if's in case they are checked inside the acpi_* calls anyway. Not a show-stopper, though, so: Acked-by: Wolfram Sang <wsa@the-dreams.de>
On Thu, Oct 10, 2013 at 10:09:19AM +0200, Wolfram Sang wrote: > On Wed, Oct 09, 2013 at 05:04:20PM +0300, Mika Westerberg wrote: > > From: Lv Zheng <lv.zheng@intel.com> > > > > If the I2C client device is enumerated from ACPI namespace it might have > > ACPI methods that needs to be called in order to transition the device to > > different power states (such as _PSx). > > > > Implement this for I2C client devices by checking if the device has an ACPI > > handle and if that's the case, attach it to the ACPI power domain. In > > addition we make sure that the device is fully powered when its ->probe() > > function gets called. > > > > For non-ACPI devices this patch is a no-op. > > > > Signed-off-by: Lv Zheng <lv.zheng@intel.com> > > Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> > > --- > > drivers/i2c/i2c-core.c | 10 ++++++++++ > > 1 file changed, 10 insertions(+) > > > > diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c > > index 29d3f04..f25dee3 100644 > > --- a/drivers/i2c/i2c-core.c > > +++ b/drivers/i2c/i2c-core.c > > @@ -254,10 +254,16 @@ static int i2c_device_probe(struct device *dev) > > client->flags & I2C_CLIENT_WAKE); > > dev_dbg(dev, "probe\n"); > > > > + if (ACPI_HANDLE(&client->dev)) > > + acpi_dev_pm_attach(&client->dev, true); > > I'd prefer to drop the 'if's in case they are checked inside the acpi_* > calls anyway. Not a show-stopper, though, so: OK, I'll drop them then from the final version. > Acked-by: Wolfram Sang <wsa@the-dreams.de> > Thanks! -- To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 29d3f04..f25dee3 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -254,10 +254,16 @@ static int i2c_device_probe(struct device *dev) client->flags & I2C_CLIENT_WAKE); dev_dbg(dev, "probe\n"); + if (ACPI_HANDLE(&client->dev)) + acpi_dev_pm_attach(&client->dev, true); + status = driver->probe(client, i2c_match_id(driver->id_table, client)); if (status) { client->driver = NULL; i2c_set_clientdata(client, NULL); + + if (ACPI_HANDLE(&client->dev)) + acpi_dev_pm_detach(&client->dev, true); } return status; } @@ -283,6 +289,8 @@ static int i2c_device_remove(struct device *dev) client->driver = NULL; i2c_set_clientdata(client, NULL); } + if (ACPI_HANDLE(&client->dev)) + acpi_dev_pm_detach(&client->dev, true); return status; } @@ -1111,8 +1119,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));