mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 21:54:11 +08:00
iio: light: cm32181: Fix PM support on system with 2 I2C resources
Commitc1e62062ff
("iio: light: cm32181: Handle CM3218 ACPI devices with 2 I2C resources") creates a second client for the actual I2C address, but the "struct device" passed to PM ops is the first I2C client that can't talk to the sensor. That means the I2C transfers in both suspend and resume routines can fail and blocking the whole suspend process. Instead of using the first client for I2C transfer, use the I2C client stored in the cm32181 private struct so the PM ops can get the correct I2C client to really talk to the sensor device. Fixes:68c1b3dd5c
("iio: light: cm32181: Add PM support") BugLink: https://bugs.launchpad.net/bugs/1988346 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2152281 Tested-by: Wahaj <wahajaved@protonmail.com> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> Reviewed-by: Hans de Goede <hdegoede@redhat.com> Link: https://lore.kernel.org/r/20230118170422.339619-1-kai.heng.feng@canonical.com Cc: <Stable@vger.kernel.org> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
eb50cd5bfd
commit
ee3c5b644a
@ -440,6 +440,8 @@ static int cm32181_probe(struct i2c_client *client)
|
|||||||
if (!indio_dev)
|
if (!indio_dev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
i2c_set_clientdata(client, indio_dev);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some ACPI systems list 2 I2C resources for the CM3218 sensor, the
|
* Some ACPI systems list 2 I2C resources for the CM3218 sensor, the
|
||||||
* SMBus Alert Response Address (ARA, 0x0c) and the actual I2C address.
|
* SMBus Alert Response Address (ARA, 0x0c) and the actual I2C address.
|
||||||
@ -460,8 +462,6 @@ static int cm32181_probe(struct i2c_client *client)
|
|||||||
return PTR_ERR(client);
|
return PTR_ERR(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_set_clientdata(client, indio_dev);
|
|
||||||
|
|
||||||
cm32181 = iio_priv(indio_dev);
|
cm32181 = iio_priv(indio_dev);
|
||||||
cm32181->client = client;
|
cm32181->client = client;
|
||||||
cm32181->dev = dev;
|
cm32181->dev = dev;
|
||||||
@ -490,7 +490,8 @@ static int cm32181_probe(struct i2c_client *client)
|
|||||||
|
|
||||||
static int cm32181_suspend(struct device *dev)
|
static int cm32181_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
struct i2c_client *client = to_i2c_client(dev);
|
struct cm32181_chip *cm32181 = iio_priv(dev_get_drvdata(dev));
|
||||||
|
struct i2c_client *client = cm32181->client;
|
||||||
|
|
||||||
return i2c_smbus_write_word_data(client, CM32181_REG_ADDR_CMD,
|
return i2c_smbus_write_word_data(client, CM32181_REG_ADDR_CMD,
|
||||||
CM32181_CMD_ALS_DISABLE);
|
CM32181_CMD_ALS_DISABLE);
|
||||||
@ -498,8 +499,8 @@ static int cm32181_suspend(struct device *dev)
|
|||||||
|
|
||||||
static int cm32181_resume(struct device *dev)
|
static int cm32181_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
struct i2c_client *client = to_i2c_client(dev);
|
|
||||||
struct cm32181_chip *cm32181 = iio_priv(dev_get_drvdata(dev));
|
struct cm32181_chip *cm32181 = iio_priv(dev_get_drvdata(dev));
|
||||||
|
struct i2c_client *client = cm32181->client;
|
||||||
|
|
||||||
return i2c_smbus_write_word_data(client, CM32181_REG_ADDR_CMD,
|
return i2c_smbus_write_word_data(client, CM32181_REG_ADDR_CMD,
|
||||||
cm32181->conf_regs[CM32181_REG_ADDR_CMD]);
|
cm32181->conf_regs[CM32181_REG_ADDR_CMD]);
|
||||||
|
Loading…
Reference in New Issue
Block a user