Message ID | 20210128232729.16064-7-sakari.ailus@linux.intel.com |
---|---|
State | Superseded |
Headers | show |
Series | None | expand |
On Fri, Jan 29, 2021 at 1:20 PM Sakari Ailus <sakari.ailus@linux.intel.com> wrote: > > Hi Bartosz, > > Thanks for the review. > > On Fri, Jan 29, 2021 at 11:56:00AM +0100, Bartosz Golaszewski wrote: > > On Fri, Jan 29, 2021 at 12:27 AM Sakari Ailus > > <sakari.ailus@linux.intel.com> wrote: > > > > > > In certain use cases (where the chip is part of a camera module, and the > > > camera module is wired together with a camera privacy LED), powering on > > > the device during probe is undesirable. Add support for the at24 to > > > execute probe while being powered off. For this to happen, a hint in form > > > of a device property is required from the firmware. > > > > > > Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> > > > --- > > > drivers/misc/eeprom/at24.c | 43 +++++++++++++++++++++++--------------- > > > 1 file changed, 26 insertions(+), 17 deletions(-) > > > > > > diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c > > > index 926408b41270c..dd0b3f24e3808 100644 > > > --- a/drivers/misc/eeprom/at24.c > > > +++ b/drivers/misc/eeprom/at24.c > > > @@ -595,6 +595,7 @@ static int at24_probe(struct i2c_client *client) > > > bool i2c_fn_i2c, i2c_fn_block; > > > unsigned int i, num_addresses; > > > struct at24_data *at24; > > > + bool low_power; > > > struct regmap *regmap; > > > bool writable; > > > u8 test_byte; > > > @@ -750,14 +751,16 @@ static int at24_probe(struct i2c_client *client) > > > > > > i2c_set_clientdata(client, at24); > > > > > > - err = regulator_enable(at24->vcc_reg); > > > - if (err) { > > > - dev_err(dev, "Failed to enable vcc regulator\n"); > > > - return err; > > > - } > > > + low_power = acpi_dev_state_low_power(&client->dev); > > > > I've raised my concern about the naming of this before but no > > discussion followed. Do we really want to name it: "low power"? This > > is misleading as the device can actually be powered off at probe(). > > "Low power" suggests some low-power state or even low battery IMO. > > This was suggested by Rafael in place of "powered off" as it's not know the > device is powered off. The same terms should be used in all contexts (ACPI > and I²C frameworks and drivers). Others haven't expressed concerns. > So we're describing a situation where "device may be powered off" by calling it "low_power". This doesn't make sense. Why not something like: acpi_dev_may_be_off(), acpi_dev_powerdown_possible(), acpi_dev_possibly_off(). If I'm reading a driver's code an see "acpi_dev_state_low_power()", I would have never guessed it refers to a situation where the device may be potentially powered-down. > ACPI spec appears to be using terms "on" and "off". > > The use of the function is not limited to driver probe time. > > > > > If anything: I'd prefer the 'low_power' local variable be changed to > > "no_test_read". > > That misses the power management related suggestion now present in the name > --- the device needs to be suspended using runtime PM if probe fails and > it's not in "low power state". > > How about "off_during_probe"? > Yes, this is much better than low_power. Bartosz > -- > Kind regards, > > Sakari Ailus
diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c index 926408b41270c..dd0b3f24e3808 100644 --- a/drivers/misc/eeprom/at24.c +++ b/drivers/misc/eeprom/at24.c @@ -595,6 +595,7 @@ static int at24_probe(struct i2c_client *client) bool i2c_fn_i2c, i2c_fn_block; unsigned int i, num_addresses; struct at24_data *at24; + bool low_power; struct regmap *regmap; bool writable; u8 test_byte; @@ -750,14 +751,16 @@ static int at24_probe(struct i2c_client *client) i2c_set_clientdata(client, at24); - err = regulator_enable(at24->vcc_reg); - if (err) { - dev_err(dev, "Failed to enable vcc regulator\n"); - return err; - } + low_power = acpi_dev_state_low_power(&client->dev); + if (!low_power) { + err = regulator_enable(at24->vcc_reg); + if (err) { + dev_err(dev, "Failed to enable vcc regulator\n"); + return err; + } - /* enable runtime pm */ - pm_runtime_set_active(dev); + pm_runtime_set_active(dev); + } pm_runtime_enable(dev); at24->nvmem = devm_nvmem_register(dev, &nvmem_config); @@ -768,14 +771,17 @@ static int at24_probe(struct i2c_client *client) } /* - * Perform a one-byte test read to verify that the - * chip is functional. + * Perform a one-byte test read to verify that the chip is functional, + * unless powering on the device is to be avoided during probe (i.e. + * it's powered off right now). */ - err = at24_read(at24, 0, &test_byte, 1); - if (err) { - pm_runtime_disable(dev); - regulator_disable(at24->vcc_reg); - return -ENODEV; + if (!low_power) { + err = at24_read(at24, 0, &test_byte, 1); + if (err) { + pm_runtime_disable(dev); + regulator_disable(at24->vcc_reg); + return -ENODEV; + } } pm_runtime_idle(dev); @@ -795,9 +801,11 @@ static int at24_remove(struct i2c_client *client) struct at24_data *at24 = i2c_get_clientdata(client); pm_runtime_disable(&client->dev); - if (!pm_runtime_status_suspended(&client->dev)) - regulator_disable(at24->vcc_reg); - pm_runtime_set_suspended(&client->dev); + if (!acpi_dev_state_low_power(&client->dev)) { + if (!pm_runtime_status_suspended(&client->dev)) + regulator_disable(at24->vcc_reg); + pm_runtime_set_suspended(&client->dev); + } return 0; } @@ -834,6 +842,7 @@ static struct i2c_driver at24_driver = { .probe_new = at24_probe, .remove = at24_remove, .id_table = at24_ids, + .flags = I2C_DRV_FL_ALLOW_LOW_POWER_PROBE, }; static int __init at24_init(void)
In certain use cases (where the chip is part of a camera module, and the camera module is wired together with a camera privacy LED), powering on the device during probe is undesirable. Add support for the at24 to execute probe while being powered off. For this to happen, a hint in form of a device property is required from the firmware. Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> --- drivers/misc/eeprom/at24.c | 43 +++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 17 deletions(-)