Linux IIO development
 help / color / mirror / Atom feed
From: Jonathan Cameron <jic23@kernel.org>
To: Joshua Crofts via B4 Relay <devnull+joshua.crofts1.gmail.com@kernel.org>
Cc: joshua.crofts1@gmail.com, "David Lechner" <dlechner@baylibre.com>,
	"Nuno Sá" <nuno.sa@analog.com>,
	"Andy Shevchenko" <andy@kernel.org>,
	linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
	"Andy Shevchenko" <andriy.shevchenko@linux.intel.com>
Subject: Re: [PATCH v5 14/18] iio: magnetometer: ak8975: switch to using managed resources
Date: Wed, 6 May 2026 18:09:25 +0100	[thread overview]
Message-ID: <20260506180925.3fb80edf@jic23-huawei> (raw)
In-Reply-To: <20260505-magnetometer-fixes-v5-14-831b9b5550fc@gmail.com>

On Tue, 05 May 2026 13:46:10 +0200
Joshua Crofts via B4 Relay <devnull+joshua.crofts1.gmail.com@kernel.org> wrote:

> From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> 
> Switch the driver to use managed resources (devm_*) which simplifier
> error handling and allows removing ak8975_remove() method from
> the driver.
> 
> Note, on error path we now also set mode to POWER_DOWN state which is
> fine. Even if the device is in that mode, there is no problem to set
> that mode again, it should be no-op.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Co-developed-by: Joshua Crofts <joshua.crofts1@gmail.com>
> Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
Hi Joshua

Looks fine, but one stale comment needs an update.

Jonathan

> ---
>  drivers/iio/magnetometer/ak8975.c | 77 ++++++++++++++++++++++-----------------
>  1 file changed, 44 insertions(+), 33 deletions(-)
> 
> diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
> index 1c05e380a4d4f968f505a7d5c0acbec86ad949e1..84ccbca758b0121a9c4930a368cb113471d389da 100644
> --- a/drivers/iio/magnetometer/ak8975.c
> +++ b/drivers/iio/magnetometer/ak8975.c
> @@ -900,9 +900,27 @@ static irqreturn_t ak8975_handle_trigger(int irq, void *p)
>  	return IRQ_HANDLED;
>  }
>  
> +static void devm_ak8975_power_off(void *data)
> +{
> +	struct ak8975_data *ak = data;
> +	struct device *dev = &ak->client->dev;
> +
> +	/* Only power down if currently active */
> +	if (pm_runtime_status_suspended(dev))
> +		return;
> +	/*
> +	 * The device may not be runtime suspended when the driver is

If we get here it's definitely not runtime suspended.  Hence
this comment needs a rewrite.

> +	 * removed, so we soft-stop the chip before hard-stopping the
> +	 * regulators.
> +	 */
> +	ak8975_set_mode(data, POWER_DOWN);
I went looking into how we get into different modes...
This deals with a latent bug in ak8975_setup() in that it can be in fuse mode
in some exit paths.  Arguably if we had an i2c bus fail we probably can't
change the mode anyway, but we should be trying from point of view
of no side effects. I wonder if we should fix that in a precursor to this
patch (given the amount of churn from earlier patches an obscure corner
case of the bug - I don't plan to mark it for backports either way!)

Maybe it's just not worth the bother given this is now here anyway.

> +	ak8975_power_off(data);
> +}
> +
>  static int ak8975_probe(struct i2c_client *client)
>  {
>  	const struct i2c_device_id *id = i2c_client_get_device_id(client);
> +	struct device *dev = &client->dev;
>  	struct ak8975_data *data;
>  	struct iio_dev *indio_dev;
>  	struct gpio_desc *eoc_gpiod;
> @@ -970,10 +988,21 @@ static int ak8975_probe(struct i2c_client *client)
>  	if (ret)
>  		return ret;
>  
> +	/*
> +	 * Set device as active early so pm_runtime_status_suspended() works
> +	 * correctly if probe fails before pm_runtime is enabled. Do not attempt
> +	 * to move this line lower.
> +	 */
> +	pm_runtime_set_active(dev);
> +
> +	ret = devm_add_action_or_reset(dev, devm_ak8975_power_off, data);
> +	if (ret)
> +		return ret;
> +
>  	ret = ak8975_who_i_am(client, data->def->type);
>  	if (ret) {
>  		dev_err(&client->dev, "Unexpected device\n");
> -		goto power_off;
> +		return ret;
>  	}
>  	dev_dbg(&client->dev, "Asahi compass chip %s\n", name);
>  
> @@ -981,10 +1010,13 @@ static int ak8975_probe(struct i2c_client *client)
>  	ret = ak8975_setup(client);
>  	if (ret) {
>  		dev_err(&client->dev, "%s initialization fails\n", name);
> -		goto power_off;
> +		return ret;
>  	}
>  
> -	mutex_init(&data->lock);
> +	ret = devm_mutex_init(dev, &data->lock);
> +	if (ret)
> +		return ret;
> +
>  	indio_dev->channels = ak8975_channels;
>  	indio_dev->num_channels = ARRAY_SIZE(ak8975_channels);
>  	indio_dev->info = &ak8975_info;
> @@ -992,52 +1024,32 @@ static int ak8975_probe(struct i2c_client *client)
>  	indio_dev->modes = INDIO_DIRECT_MODE;
>  	indio_dev->name = name;
>  
> -	ret = iio_triggered_buffer_setup(indio_dev, NULL, ak8975_handle_trigger,
> -					 NULL);
> +	ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,
> +					      ak8975_handle_trigger, NULL);
>  	if (ret) {
>  		dev_err(&client->dev, "triggered buffer setup failed\n");
> -		goto power_off;
> +		return ret;
>  	}
>  
> -	ret = iio_device_register(indio_dev);
> +	ret = devm_iio_device_register(dev, indio_dev);
>  	if (ret) {
>  		dev_err(&client->dev, "device register failed\n");
> -		goto cleanup_buffer;
> +		return ret;
>  	}
>  
>  	/* Enable runtime PM */
> -	pm_runtime_get_noresume(&client->dev);

huh. Not sure what this was doing in original code.
I guess forced an immediate power down rather that after an autosuspend
period.  I think that's fine to change - however perhaps do a bit
of analysis on whether my assumption is correct on what this did
and then mention it in the commit message.


> -	pm_runtime_set_active(&client->dev);

> -	pm_runtime_enable(&client->dev);
> +	ret = devm_pm_runtime_enable(dev);
> +	if (ret)
> +		return ret;
> +
>  	/*
>  	 * The device comes online in 500us, so add two orders of magnitude
>  	 * of delay before autosuspending: 50 ms.
>  	 */
>  	pm_runtime_set_autosuspend_delay(&client->dev, 50);
>  	pm_runtime_use_autosuspend(&client->dev);
> -	pm_runtime_put(&client->dev);
>  
>  	return 0;


  parent reply	other threads:[~2026-05-06 17:09 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-05 11:45 [PATCH v5 00/18] iio: magnetometer: ak8975: modernize and cleanup driver Joshua Crofts via B4 Relay
2026-05-05 11:45 ` [PATCH v5 01/18] iio: magnetometer: ak8975: sort headers alphabetically Joshua Crofts via B4 Relay
2026-05-05 23:46   ` Maxwell Doose
2026-05-06 16:36     ` Jonathan Cameron
2026-05-05 11:45 ` [PATCH v5 02/18] iio: magnetometer: ak8975: update headers per IWYU principle Joshua Crofts via B4 Relay
2026-05-06  0:38   ` Maxwell Doose
2026-05-06 16:37     ` Jonathan Cameron
2026-05-05 11:45 ` [PATCH v5 03/18] iio: magnetometer: ak8975: replace usleep_range() with fsleep() Joshua Crofts via B4 Relay
2026-05-05 20:30   ` Maxwell Doose
2026-05-05 21:26     ` Joshua Crofts
2026-05-05 21:42       ` Maxwell Doose
2026-05-05 21:59         ` Joshua Crofts
2026-05-05 22:12           ` Maxwell Doose
2026-05-06  6:19       ` Andy Shevchenko
2026-05-06  6:35         ` Maxwell Doose
2026-05-06 16:39           ` Jonathan Cameron
2026-05-05 11:46 ` [PATCH v5 04/18] iio: magnetometer: ak8975: change 'u8*' to 'u8 *' in cast Joshua Crofts via B4 Relay
2026-05-06  0:47   ` Maxwell Doose
2026-05-06  6:30   ` Andy Shevchenko
2026-05-06 16:40     ` Jonathan Cameron
2026-05-05 11:46 ` [PATCH v5 05/18] iio: magnetometer: ak8975: fix wrong errno on return Joshua Crofts via B4 Relay
2026-05-06 16:41   ` Jonathan Cameron
2026-05-05 11:46 ` [PATCH v5 06/18] iio: magnetometer: ak8975: pass conversion timeouts as arguments Joshua Crofts via B4 Relay
2026-05-06  6:34   ` Andy Shevchenko
2026-05-06  7:02     ` Joshua Crofts
2026-05-06  7:20       ` Andy Shevchenko
2026-05-06  7:28         ` Joshua Crofts
2026-05-06  7:32           ` Andy Shevchenko
2026-05-06 16:51             ` Jonathan Cameron
2026-05-05 11:46 ` [PATCH v5 07/18] iio: magnetometer: ak8975: modernize polling loops with iopoll() macros Joshua Crofts via B4 Relay
2026-05-06  6:53   ` Andy Shevchenko
2026-05-06  7:01     ` Joshua Crofts
2026-05-06 10:50       ` Joshua Crofts
2026-05-06 13:08         ` Andy Shevchenko
2026-05-06 16:52           ` Jonathan Cameron
2026-05-05 11:46 ` [PATCH v5 08/18] iio: magnetometer: ak8975: check if gpiod read was successful Joshua Crofts via B4 Relay
2026-05-06  1:09   ` Maxwell Doose
2026-05-06  1:42     ` Maxwell Doose
2026-05-06  7:11       ` Andy Shevchenko
2026-05-06  7:13         ` Maxwell Doose
2026-05-06  7:16           ` Andy Shevchenko
2026-05-06  7:21             ` Maxwell Doose
2026-05-06  7:31             ` Joshua Crofts
2026-05-06  7:05     ` Joshua Crofts
2026-05-06 16:48       ` Jonathan Cameron
2026-05-06  7:07     ` Andy Shevchenko
2026-05-06  7:11       ` Maxwell Doose
2026-05-06  6:53   ` Andy Shevchenko
2026-05-06  7:07     ` Joshua Crofts
2026-05-05 11:46 ` [PATCH v5 09/18] iio: magnetometer: ak8975: avoid using temporary variable Joshua Crofts via B4 Relay
2026-05-06 16:54   ` Jonathan Cameron
2026-05-05 11:46 ` [PATCH v5 10/18] iio: magnetometer: ak8975: drop duplicate NULL check Joshua Crofts via B4 Relay
2026-05-06 16:55   ` Jonathan Cameron
2026-05-05 11:46 ` [PATCH v5 11/18] iio: magnetometer: ak8975: remove duplicate error message Joshua Crofts via B4 Relay
2026-05-06 16:56   ` Jonathan Cameron
2026-05-05 11:46 ` [PATCH v5 12/18] iio: magnetometer: ak8975: reduce usage of magic lengths of the buffer Joshua Crofts via B4 Relay
2026-05-06 16:56   ` Jonathan Cameron
2026-05-05 11:46 ` [PATCH v5 13/18] iio: magnetometer: ak8975: unify return code variable name Joshua Crofts via B4 Relay
2026-05-06 16:57   ` Jonathan Cameron
2026-05-05 11:46 ` [PATCH v5 14/18] iio: magnetometer: ak8975: switch to using managed resources Joshua Crofts via B4 Relay
2026-05-05 14:34   ` Joshua Crofts
2026-05-06  8:21     ` Andy Shevchenko
2026-05-06 17:09   ` Jonathan Cameron [this message]
2026-05-07  9:19     ` Joshua Crofts
2026-05-07 10:09       ` Andy Shevchenko
2026-05-07 10:14         ` Joshua Crofts
2026-05-07 12:11           ` Andy Shevchenko
2026-05-07 12:24             ` Joshua Crofts
2026-05-05 11:46 ` [PATCH v5 15/18] iio: magnetometer: ak8975: consistently use 'data' parameter Joshua Crofts via B4 Relay
2026-05-05 11:46 ` [PATCH v5 16/18] iio: magnetometer: ak8975: unify messages with help of dev_err_probe() Joshua Crofts via B4 Relay
2026-05-05 11:46 ` [PATCH v5 17/18] iio: magnetometer: ak8975: use temporary variable for struct device Joshua Crofts via B4 Relay
2026-05-05 11:46 ` [PATCH v5 18/18] iio: magnetometer: ak8975: make use of the macros from bits.h Joshua Crofts via B4 Relay
2026-05-06 17:12   ` Jonathan Cameron
2026-05-06 21:25     ` Andy Shevchenko
2026-05-07 10:06       ` Joshua Crofts

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260506180925.3fb80edf@jic23-huawei \
    --to=jic23@kernel.org \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=andy@kernel.org \
    --cc=devnull+joshua.crofts1.gmail.com@kernel.org \
    --cc=dlechner@baylibre.com \
    --cc=joshua.crofts1@gmail.com \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nuno.sa@analog.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox