diff mbox series

[v10,7/7] at24: Support probing while off

Message ID 20210205132505.20173-8-sakari.ailus@linux.intel.com
State Superseded
Headers show
Series Support running driver's probe for a device powered off | expand

Commit Message

Sakari Ailus Feb. 5, 2021, 1:25 p.m. UTC
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>
Reviewed-by: Tomasz Figa <tfiga@chromium.org>
---
 drivers/misc/eeprom/at24.c | 43 +++++++++++++++++++++++---------------
 1 file changed, 26 insertions(+), 17 deletions(-)

Comments

Bartosz Golaszewski Feb. 8, 2021, 4:44 p.m. UTC | #1
On Fri, Feb 5, 2021 at 2:25 PM 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>
> Reviewed-by: Tomasz Figa <tfiga@chromium.org>
> ---

I'll ack this but I still claim that the name
acpi_dev_state_low_power() is super misleading for this use-case and
I've been saying that for 10 versions now with everyone just ignoring
my remarks. :/

Acked-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Bartosz Golaszewski Feb. 9, 2021, 3:49 p.m. UTC | #2
On Mon, Feb 8, 2021 at 5:54 PM Rafael J. Wysocki <rafael@kernel.org> wrote:
>
> On Mon, Feb 8, 2021 at 5:44 PM Bartosz Golaszewski
> <bgolaszewski@baylibre.com> wrote:
> >
> > On Fri, Feb 5, 2021 at 2:25 PM 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>
> > > Reviewed-by: Tomasz Figa <tfiga@chromium.org>
> > > ---
> >
> > I'll ack this but I still claim that the name
> > acpi_dev_state_low_power() is super misleading for this use-case and
> > I've been saying that for 10 versions now with everyone just ignoring
> > my remarks. :/
>
> Well, the function in question simply checks if the current ACPI power
> state of the device is different from "full power", so its name
> appears to be quite adequate to me.
>
> If the way in which it is used is confusing, though, I guess
> explaining what's going on would be welcome.
>

Yes, I have explained it multiple time already - last time at v9 of this series:

    https://www.spinics.net/lists/kernel/msg3816807.html

Bartosz

> > Acked-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Rafael J. Wysocki Feb. 9, 2021, 4:42 p.m. UTC | #3
On Tue, Feb 9, 2021 at 5:23 PM Sakari Ailus
<sakari.ailus@linux.intel.com> wrote:
>
> Hi Bartosz, Rafael,
>
> On Tue, Feb 09, 2021 at 04:49:37PM +0100, Bartosz Golaszewski wrote:
> > On Mon, Feb 8, 2021 at 5:54 PM Rafael J. Wysocki <rafael@kernel.org> wrote:
> > >
> > > On Mon, Feb 8, 2021 at 5:44 PM Bartosz Golaszewski
> > > <bgolaszewski@baylibre.com> wrote:
> > > >
> > > > On Fri, Feb 5, 2021 at 2:25 PM 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>
> > > > > Reviewed-by: Tomasz Figa <tfiga@chromium.org>
> > > > > ---
> > > >
> > > > I'll ack this but I still claim that the name
> > > > acpi_dev_state_low_power() is super misleading for this use-case and
> > > > I've been saying that for 10 versions now with everyone just ignoring
> > > > my remarks. :/
> > >
> > > Well, the function in question simply checks if the current ACPI power
> > > state of the device is different from "full power", so its name
> > > appears to be quite adequate to me.
> > >
> > > If the way in which it is used is confusing, though, I guess
> > > explaining what's going on would be welcome.
> > >
> >
> > Yes, I have explained it multiple time already - last time at v9 of this series:
> >
> >     https://www.spinics.net/lists/kernel/msg3816807.html
>
> How about adding this to the description of acpi_dev_state_low_power():
>
> -----------8<--------------
>  * This function is intended to be used by drivers to tell whether the device
>  * is in low power state (D1--D3cold) in driver's probe or remove function. See
>  * Documentation/firmware-guide/acpi/low-power-probe.rst for more information.
> -----------8<--------------

This information is already there in the kerneldoc description of that
function AFAICS.

I was thinking about adding an explanation comment to the caller.
Rafael J. Wysocki Feb. 9, 2021, 4:58 p.m. UTC | #4
On Tue, Feb 9, 2021 at 5:54 PM Sakari Ailus
<sakari.ailus@linux.intel.com> wrote:
>
> On Tue, Feb 09, 2021 at 05:42:45PM +0100, Rafael J. Wysocki wrote:
> > On Tue, Feb 9, 2021 at 5:23 PM Sakari Ailus
> > <sakari.ailus@linux.intel.com> wrote:
> > >
> > > Hi Bartosz, Rafael,
> > >
> > > On Tue, Feb 09, 2021 at 04:49:37PM +0100, Bartosz Golaszewski wrote:
> > > > On Mon, Feb 8, 2021 at 5:54 PM Rafael J. Wysocki <rafael@kernel.org> wrote:
> > > > >
> > > > > On Mon, Feb 8, 2021 at 5:44 PM Bartosz Golaszewski
> > > > > <bgolaszewski@baylibre.com> wrote:
> > > > > >
> > > > > > On Fri, Feb 5, 2021 at 2:25 PM 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>
> > > > > > > Reviewed-by: Tomasz Figa <tfiga@chromium.org>
> > > > > > > ---
> > > > > >
> > > > > > I'll ack this but I still claim that the name
> > > > > > acpi_dev_state_low_power() is super misleading for this use-case and
> > > > > > I've been saying that for 10 versions now with everyone just ignoring
> > > > > > my remarks. :/
> > > > >
> > > > > Well, the function in question simply checks if the current ACPI power
> > > > > state of the device is different from "full power", so its name
> > > > > appears to be quite adequate to me.
> > > > >
> > > > > If the way in which it is used is confusing, though, I guess
> > > > > explaining what's going on would be welcome.
> > > > >
> > > >
> > > > Yes, I have explained it multiple time already - last time at v9 of this series:
> > > >
> > > >     https://www.spinics.net/lists/kernel/msg3816807.html
> > >
> > > How about adding this to the description of acpi_dev_state_low_power():
> > >
> > > -----------8<--------------
> > >  * This function is intended to be used by drivers to tell whether the device
> > >  * is in low power state (D1--D3cold) in driver's probe or remove function. See
> > >  * Documentation/firmware-guide/acpi/low-power-probe.rst for more information.
> > > -----------8<--------------
> >
> > This information is already there in the kerneldoc description of that
> > function AFAICS.
>
> Ok, the D states are mentioned already. But how to use it is not, nor
> there's a reference to the ReST file. I think that wouldn't hurt.
>
> >
> > I was thinking about adding an explanation comment to the caller.
>
> I think it'd be best if the function name would convey that without a
> comment that should then be added to all callers. How about calling the
> function e.g. acpi_dev_state_d0() and negating the return value? The D0
> state is well defined and we could do this without adding new terms.

That would work for me.
Sakari Ailus Feb. 10, 2021, 8:41 a.m. UTC | #5
On Tue, Feb 09, 2021 at 05:58:12PM +0100, Rafael J. Wysocki wrote:
> On Tue, Feb 9, 2021 at 5:54 PM Sakari Ailus
> <sakari.ailus@linux.intel.com> wrote:
> >
> > On Tue, Feb 09, 2021 at 05:42:45PM +0100, Rafael J. Wysocki wrote:
> > > On Tue, Feb 9, 2021 at 5:23 PM Sakari Ailus
> > > <sakari.ailus@linux.intel.com> wrote:
> > > >
> > > > Hi Bartosz, Rafael,
> > > >
> > > > On Tue, Feb 09, 2021 at 04:49:37PM +0100, Bartosz Golaszewski wrote:
> > > > > On Mon, Feb 8, 2021 at 5:54 PM Rafael J. Wysocki <rafael@kernel.org> wrote:
> > > > > >
> > > > > > On Mon, Feb 8, 2021 at 5:44 PM Bartosz Golaszewski
> > > > > > <bgolaszewski@baylibre.com> wrote:
> > > > > > >
> > > > > > > On Fri, Feb 5, 2021 at 2:25 PM 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>
> > > > > > > > Reviewed-by: Tomasz Figa <tfiga@chromium.org>
> > > > > > > > ---
> > > > > > >
> > > > > > > I'll ack this but I still claim that the name
> > > > > > > acpi_dev_state_low_power() is super misleading for this use-case and
> > > > > > > I've been saying that for 10 versions now with everyone just ignoring
> > > > > > > my remarks. :/
> > > > > >
> > > > > > Well, the function in question simply checks if the current ACPI power
> > > > > > state of the device is different from "full power", so its name
> > > > > > appears to be quite adequate to me.
> > > > > >
> > > > > > If the way in which it is used is confusing, though, I guess
> > > > > > explaining what's going on would be welcome.
> > > > > >
> > > > >
> > > > > Yes, I have explained it multiple time already - last time at v9 of this series:
> > > > >
> > > > >     https://www.spinics.net/lists/kernel/msg3816807.html
> > > >
> > > > How about adding this to the description of acpi_dev_state_low_power():
> > > >
> > > > -----------8<--------------
> > > >  * This function is intended to be used by drivers to tell whether the device
> > > >  * is in low power state (D1--D3cold) in driver's probe or remove function. See
> > > >  * Documentation/firmware-guide/acpi/low-power-probe.rst for more information.
> > > > -----------8<--------------
> > >
> > > This information is already there in the kerneldoc description of that
> > > function AFAICS.
> >
> > Ok, the D states are mentioned already. But how to use it is not, nor
> > there's a reference to the ReST file. I think that wouldn't hurt.
> >
> > >
> > > I was thinking about adding an explanation comment to the caller.
> >
> > I think it'd be best if the function name would convey that without a
> > comment that should then be added to all callers. How about calling the
> > function e.g. acpi_dev_state_d0() and negating the return value? The D0
> > state is well defined and we could do this without adding new terms.
> 
> That would work for me.

Bartosz, would that work for you?

I'd call the temporary variable in the at24 driver e.g. "full_power".
Bartosz Golaszewski Feb. 10, 2021, 12:26 p.m. UTC | #6
On Wed, Feb 10, 2021 at 9:41 AM Sakari Ailus
<sakari.ailus@linux.intel.com> wrote:
>
> On Tue, Feb 09, 2021 at 05:58:12PM +0100, Rafael J. Wysocki wrote:
> > On Tue, Feb 9, 2021 at 5:54 PM Sakari Ailus
> > <sakari.ailus@linux.intel.com> wrote:
> > >
> > > On Tue, Feb 09, 2021 at 05:42:45PM +0100, Rafael J. Wysocki wrote:
> > > > On Tue, Feb 9, 2021 at 5:23 PM Sakari Ailus
> > > > <sakari.ailus@linux.intel.com> wrote:
> > > > >
> > > > > Hi Bartosz, Rafael,
> > > > >
> > > > > On Tue, Feb 09, 2021 at 04:49:37PM +0100, Bartosz Golaszewski wrote:
> > > > > > On Mon, Feb 8, 2021 at 5:54 PM Rafael J. Wysocki <rafael@kernel.org> wrote:
> > > > > > >
> > > > > > > On Mon, Feb 8, 2021 at 5:44 PM Bartosz Golaszewski
> > > > > > > <bgolaszewski@baylibre.com> wrote:
> > > > > > > >
> > > > > > > > On Fri, Feb 5, 2021 at 2:25 PM 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>
> > > > > > > > > Reviewed-by: Tomasz Figa <tfiga@chromium.org>
> > > > > > > > > ---
> > > > > > > >
> > > > > > > > I'll ack this but I still claim that the name
> > > > > > > > acpi_dev_state_low_power() is super misleading for this use-case and
> > > > > > > > I've been saying that for 10 versions now with everyone just ignoring
> > > > > > > > my remarks. :/
> > > > > > >
> > > > > > > Well, the function in question simply checks if the current ACPI power
> > > > > > > state of the device is different from "full power", so its name
> > > > > > > appears to be quite adequate to me.
> > > > > > >
> > > > > > > If the way in which it is used is confusing, though, I guess
> > > > > > > explaining what's going on would be welcome.
> > > > > > >
> > > > > >
> > > > > > Yes, I have explained it multiple time already - last time at v9 of this series:
> > > > > >
> > > > > >     https://www.spinics.net/lists/kernel/msg3816807.html
> > > > >
> > > > > How about adding this to the description of acpi_dev_state_low_power():
> > > > >
> > > > > -----------8<--------------
> > > > >  * This function is intended to be used by drivers to tell whether the device
> > > > >  * is in low power state (D1--D3cold) in driver's probe or remove function. See
> > > > >  * Documentation/firmware-guide/acpi/low-power-probe.rst for more information.
> > > > > -----------8<--------------
> > > >
> > > > This information is already there in the kerneldoc description of that
> > > > function AFAICS.
> > >
> > > Ok, the D states are mentioned already. But how to use it is not, nor
> > > there's a reference to the ReST file. I think that wouldn't hurt.
> > >
> > > >
> > > > I was thinking about adding an explanation comment to the caller.
> > >
> > > I think it'd be best if the function name would convey that without a
> > > comment that should then be added to all callers. How about calling the
> > > function e.g. acpi_dev_state_d0() and negating the return value? The D0
> > > state is well defined and we could do this without adding new terms.
> >
> > That would work for me.
>
> Bartosz, would that work for you?
>
> I'd call the temporary variable in the at24 driver e.g. "full_power".
>

Yes, that works, go ahead and thank you.

Bartosz
Sakari Ailus Feb. 10, 2021, 8:46 p.m. UTC | #7
On Wed, Feb 10, 2021 at 01:26:51PM +0100, Bartosz Golaszewski wrote:
> On Wed, Feb 10, 2021 at 9:41 AM Sakari Ailus

> <sakari.ailus@linux.intel.com> wrote:

> >

> > On Tue, Feb 09, 2021 at 05:58:12PM +0100, Rafael J. Wysocki wrote:

> > > On Tue, Feb 9, 2021 at 5:54 PM Sakari Ailus

> > > <sakari.ailus@linux.intel.com> wrote:

> > > >

> > > > On Tue, Feb 09, 2021 at 05:42:45PM +0100, Rafael J. Wysocki wrote:

> > > > > On Tue, Feb 9, 2021 at 5:23 PM Sakari Ailus

> > > > > <sakari.ailus@linux.intel.com> wrote:

> > > > > >

> > > > > > Hi Bartosz, Rafael,

> > > > > >

> > > > > > On Tue, Feb 09, 2021 at 04:49:37PM +0100, Bartosz Golaszewski wrote:

> > > > > > > On Mon, Feb 8, 2021 at 5:54 PM Rafael J. Wysocki <rafael@kernel.org> wrote:

> > > > > > > >

> > > > > > > > On Mon, Feb 8, 2021 at 5:44 PM Bartosz Golaszewski

> > > > > > > > <bgolaszewski@baylibre.com> wrote:

> > > > > > > > >

> > > > > > > > > On Fri, Feb 5, 2021 at 2:25 PM 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>

> > > > > > > > > > Reviewed-by: Tomasz Figa <tfiga@chromium.org>

> > > > > > > > > > ---

> > > > > > > > >

> > > > > > > > > I'll ack this but I still claim that the name

> > > > > > > > > acpi_dev_state_low_power() is super misleading for this use-case and

> > > > > > > > > I've been saying that for 10 versions now with everyone just ignoring

> > > > > > > > > my remarks. :/

> > > > > > > >

> > > > > > > > Well, the function in question simply checks if the current ACPI power

> > > > > > > > state of the device is different from "full power", so its name

> > > > > > > > appears to be quite adequate to me.

> > > > > > > >

> > > > > > > > If the way in which it is used is confusing, though, I guess

> > > > > > > > explaining what's going on would be welcome.

> > > > > > > >

> > > > > > >

> > > > > > > Yes, I have explained it multiple time already - last time at v9 of this series:

> > > > > > >

> > > > > > >     https://www.spinics.net/lists/kernel/msg3816807.html

> > > > > >

> > > > > > How about adding this to the description of acpi_dev_state_low_power():

> > > > > >

> > > > > > -----------8<--------------

> > > > > >  * This function is intended to be used by drivers to tell whether the device

> > > > > >  * is in low power state (D1--D3cold) in driver's probe or remove function. See

> > > > > >  * Documentation/firmware-guide/acpi/low-power-probe.rst for more information.

> > > > > > -----------8<--------------

> > > > >

> > > > > This information is already there in the kerneldoc description of that

> > > > > function AFAICS.

> > > >

> > > > Ok, the D states are mentioned already. But how to use it is not, nor

> > > > there's a reference to the ReST file. I think that wouldn't hurt.

> > > >

> > > > >

> > > > > I was thinking about adding an explanation comment to the caller.

> > > >

> > > > I think it'd be best if the function name would convey that without a

> > > > comment that should then be added to all callers. How about calling the

> > > > function e.g. acpi_dev_state_d0() and negating the return value? The D0

> > > > state is well defined and we could do this without adding new terms.

> > >

> > > That would work for me.

> >

> > Bartosz, would that work for you?

> >

> > I'd call the temporary variable in the at24 driver e.g. "full_power".

> >

> 

> Yes, that works, go ahead and thank you.


Thanks!

I'll send v11 soon.

-- 
Sakari Ailus
diff mbox series

Patch

diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
index 926408b41270c..69a5e4023d9e1 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 off_during_probe;
 	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;
-	}
+	off_during_probe = acpi_dev_state_low_power(&client->dev);
+	if (!off_during_probe) {
+		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 (!off_during_probe) {
+		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)