* [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup
@ 2026-05-11 11:26 Joshua Crofts via B4 Relay
2026-05-11 11:26 ` [PATCH v7 1/8] iio: magnetometer: ak8975: modernize polling loops with iopoll() macros Joshua Crofts via B4 Relay
` (8 more replies)
0 siblings, 9 replies; 20+ messages in thread
From: Joshua Crofts via B4 Relay @ 2026-05-11 11:26 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko
Cc: linux-iio, linux-kernel, Joshua Crofts, Andy Shevchenko
This series is a continuation of the previous ak8975 driver cleanup
effort, as most of the patches were picked.
Changes include:
- using BIT() and GENMASK() macros
- moving to devm_* resource management
- adding a scan index enum
- moving from using wait loops to iopoll functions
- various code style changes
Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
---
Changes in v7:
- Changed revision to v7 as series is a continuation of previous series
- Added Nuno's Reviewed-by tag
- PATCH 3: change order of pm_runtime initialization
- Link to v6: https://lore.kernel.org/r/20260507-magnetometer-fixes-post-pickup-v1-0-37827ca68fb3@gmail.com
---
Andy Shevchenko (5):
iio: magnetometer: ak8975: switch to using managed resources
iio: magnetometer: ak8975: consistently use 'data' parameter
iio: magnetometer: ak8975: unify messages with help of dev_err_probe()
iio: magnetometer: ak8975: use temporary variable for struct device
iio: magnetometer: ak8975: make use of the macros from bits.h
Joshua Crofts (3):
iio: magnetometer: ak8975: modernize polling loops with iopoll() macros
iio: magnetometer: ak8975: check if gpiod read was successful
iio: magnetometer: ak8975: add scan mask index enum
drivers/iio/magnetometer/ak8975.c | 269 +++++++++++++++++++-------------------
1 file changed, 134 insertions(+), 135 deletions(-)
---
base-commit: 74d173f29572951629d1e0b7456b424006e51b87
change-id: 20260507-magnetometer-fixes-post-pickup-c6dabdd66f54
Best regards,
--
Joshua Crofts <joshua.crofts1@gmail.com>
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v7 1/8] iio: magnetometer: ak8975: modernize polling loops with iopoll() macros
2026-05-11 11:26 [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup Joshua Crofts via B4 Relay
@ 2026-05-11 11:26 ` Joshua Crofts via B4 Relay
2026-05-12 14:53 ` Jonathan Cameron
2026-05-11 11:26 ` [PATCH v7 2/8] iio: magnetometer: ak8975: check if gpiod read was successful Joshua Crofts via B4 Relay
` (7 subsequent siblings)
8 siblings, 1 reply; 20+ messages in thread
From: Joshua Crofts via B4 Relay @ 2026-05-11 11:26 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko
Cc: linux-iio, linux-kernel, Joshua Crofts, Andy Shevchenko
From: Joshua Crofts <joshua.crofts1@gmail.com>
The driver currently uses while loops and msleep() for polling during
conversion waits.
Replace the custom polling loops with readx_poll_timeout() and
read_poll_timeout() macros from <linux/iopoll.h>. This reduces
boilerplate, standardizes timeout handling and improves overall code
readability, keeping the original timing and error behaviour. Add
<linux/time.h> for USEC_PER_MSEC macro instead of using magic numbers.
Assisted-by: Gemini:3.1-Pro
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
---
drivers/iio/magnetometer/ak8975.c | 43 ++++++++++++++++-----------------------
1 file changed, 18 insertions(+), 25 deletions(-)
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
index 6be72e1cc0a8321e767da5e65d54c0fe88712304..b990c123e2808c2078abcfaf6b2ef86c09393e6b 100644
--- a/drivers/iio/magnetometer/ak8975.c
+++ b/drivers/iio/magnetometer/ak8975.c
@@ -24,6 +24,7 @@
#include <linux/pm_runtime.h>
#include <linux/property.h>
#include <linux/regulator/consumer.h>
+#include <linux/time.h>
#include <linux/types.h>
#include <linux/wait.h>
@@ -649,16 +650,14 @@ static int wait_conversion_complete_gpio(struct ak8975_data *data,
{
struct i2c_client *client = data->client;
int ret;
+ int val;
/* Wait for the conversion to complete. */
- while (timeout_ms) {
- msleep(poll_ms);
- if (gpiod_get_value(data->eoc_gpiod))
- break;
- timeout_ms -= poll_ms;
- }
- if (!timeout_ms)
- return -ETIMEDOUT;
+ ret = readx_poll_timeout(gpiod_get_value, data->eoc_gpiod, val, val != 0,
+ poll_ms * USEC_PER_MSEC,
+ timeout_ms * USEC_PER_MSEC);
+ if (ret)
+ return ret;
ret = i2c_smbus_read_byte_data(client, data->def->ctrl_regs[ST1]);
if (ret < 0)
@@ -672,27 +671,21 @@ static int wait_conversion_complete_polled(struct ak8975_data *data,
unsigned int timeout_ms)
{
struct i2c_client *client = data->client;
- u8 read_status;
int ret;
+ int val;
/* Wait for the conversion to complete. */
- while (timeout_ms) {
- msleep(poll_ms);
- ret = i2c_smbus_read_byte_data(client,
- data->def->ctrl_regs[ST1]);
- if (ret < 0) {
- dev_err(&client->dev, "Error in reading ST1\n");
- return ret;
- }
- read_status = ret;
- if (read_status)
- break;
- timeout_ms -= poll_ms;
- }
- if (!timeout_ms)
- return -ETIMEDOUT;
+ ret = read_poll_timeout(i2c_smbus_read_byte_data, val, val != 0,
+ poll_ms * USEC_PER_MSEC,
+ timeout_ms * USEC_PER_MSEC,
+ true,
+ client, data->def->ctrl_regs[ST1]);
+ if (ret)
+ return ret;
+ if (val < 0)
+ dev_err(&client->dev, "Error in reading ST1\n");
- return read_status;
+ return val;
}
/* Returns 0 if the end of conversion interrupt occurred or -ETIMEDOUT otherwise */
--
2.47.3
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v7 2/8] iio: magnetometer: ak8975: check if gpiod read was successful
2026-05-11 11:26 [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup Joshua Crofts via B4 Relay
2026-05-11 11:26 ` [PATCH v7 1/8] iio: magnetometer: ak8975: modernize polling loops with iopoll() macros Joshua Crofts via B4 Relay
@ 2026-05-11 11:26 ` Joshua Crofts via B4 Relay
2026-05-12 14:54 ` Jonathan Cameron
2026-05-11 11:26 ` [PATCH v7 3/8] iio: magnetometer: ak8975: switch to using managed resources Joshua Crofts via B4 Relay
` (6 subsequent siblings)
8 siblings, 1 reply; 20+ messages in thread
From: Joshua Crofts via B4 Relay @ 2026-05-11 11:26 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko
Cc: linux-iio, linux-kernel, Joshua Crofts
From: Joshua Crofts <joshua.crofts1@gmail.com>
Add a check that ensures that valid data has been read from GPIOD. If
not, log an error and return the negative read value.
Suggested-by: Jonathan Cameron <jic23@kernel.org>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
---
drivers/iio/magnetometer/ak8975.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
index b990c123e2808c2078abcfaf6b2ef86c09393e6b..63b6e8465f5f3873841550a1cd03ce86b95d1d67 100644
--- a/drivers/iio/magnetometer/ak8975.c
+++ b/drivers/iio/magnetometer/ak8975.c
@@ -658,6 +658,10 @@ static int wait_conversion_complete_gpio(struct ak8975_data *data,
timeout_ms * USEC_PER_MSEC);
if (ret)
return ret;
+ if (val < 0) {
+ dev_err(&client->dev, "Error in reading GPIOD\n");
+ return val;
+ }
ret = i2c_smbus_read_byte_data(client, data->def->ctrl_regs[ST1]);
if (ret < 0)
--
2.47.3
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v7 3/8] iio: magnetometer: ak8975: switch to using managed resources
2026-05-11 11:26 [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup Joshua Crofts via B4 Relay
2026-05-11 11:26 ` [PATCH v7 1/8] iio: magnetometer: ak8975: modernize polling loops with iopoll() macros Joshua Crofts via B4 Relay
2026-05-11 11:26 ` [PATCH v7 2/8] iio: magnetometer: ak8975: check if gpiod read was successful Joshua Crofts via B4 Relay
@ 2026-05-11 11:26 ` Joshua Crofts via B4 Relay
2026-05-11 11:26 ` [PATCH v7 4/8] iio: magnetometer: ak8975: consistently use 'data' parameter Joshua Crofts via B4 Relay
` (5 subsequent siblings)
8 siblings, 0 replies; 20+ messages in thread
From: Joshua Crofts via B4 Relay @ 2026-05-11 11:26 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko
Cc: linux-iio, linux-kernel, Joshua Crofts, Andy Shevchenko
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.
Additionally, remove any pm_runtime_get/put*() function calls that
dummy cycled the counter to autosuspend the device.
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>
---
drivers/iio/magnetometer/ak8975.c | 75 +++++++++++++++++++++------------------
1 file changed, 41 insertions(+), 34 deletions(-)
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
index 63b6e8465f5f3873841550a1cd03ce86b95d1d67..82ba6f6d7891acf34a3178c185e28238ae63ea3a 100644
--- a/drivers/iio/magnetometer/ak8975.c
+++ b/drivers/iio/magnetometer/ak8975.c
@@ -898,9 +898,24 @@ 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_suspended(dev))
+ return;
+
+ /* Soft-stop the chip before hard-stopping the regulators */
+ ak8975_set_mode(data, POWER_DOWN);
+ 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;
@@ -968,10 +983,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);
@@ -979,10 +1005,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;
@@ -990,52 +1019,31 @@ 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_pm_runtime_enable(dev);
+ if (ret)
+ return ret;
+
+ 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);
- pm_runtime_set_active(&client->dev);
- pm_runtime_enable(&client->dev);
/*
* 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;
-
-cleanup_buffer:
- iio_triggered_buffer_cleanup(indio_dev);
-power_off:
- ak8975_power_off(data);
- return ret;
-}
-
-static void ak8975_remove(struct i2c_client *client)
-{
- struct iio_dev *indio_dev = i2c_get_clientdata(client);
- struct ak8975_data *data = iio_priv(indio_dev);
-
- pm_runtime_get_sync(&client->dev);
- pm_runtime_put_noidle(&client->dev);
- pm_runtime_disable(&client->dev);
- iio_device_unregister(indio_dev);
- iio_triggered_buffer_cleanup(indio_dev);
- ak8975_set_mode(data, POWER_DOWN);
- ak8975_power_off(data);
}
static int ak8975_runtime_suspend(struct device *dev)
@@ -1129,7 +1137,6 @@ static struct i2c_driver ak8975_driver = {
.acpi_match_table = ak_acpi_match,
},
.probe = ak8975_probe,
- .remove = ak8975_remove,
.id_table = ak8975_id,
};
module_i2c_driver(ak8975_driver);
--
2.47.3
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v7 4/8] iio: magnetometer: ak8975: consistently use 'data' parameter
2026-05-11 11:26 [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup Joshua Crofts via B4 Relay
` (2 preceding siblings ...)
2026-05-11 11:26 ` [PATCH v7 3/8] iio: magnetometer: ak8975: switch to using managed resources Joshua Crofts via B4 Relay
@ 2026-05-11 11:26 ` Joshua Crofts via B4 Relay
2026-05-12 14:56 ` Jonathan Cameron
2026-05-12 15:03 ` Jonathan Cameron
2026-05-11 11:26 ` [PATCH v7 5/8] iio: magnetometer: ak8975: unify messages with help of dev_err_probe() Joshua Crofts via B4 Relay
` (4 subsequent siblings)
8 siblings, 2 replies; 20+ messages in thread
From: Joshua Crofts via B4 Relay @ 2026-05-11 11:26 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko
Cc: linux-iio, linux-kernel, Joshua Crofts, Andy Shevchenko
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Some of the functions use 'client', some use 'data', and some use both.
Refactor the driver to consistently use 'data' in all cases.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
---
drivers/iio/magnetometer/ak8975.c | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
index 82ba6f6d7891acf34a3178c185e28238ae63ea3a..43259ad4990e2a7a40a0fa60a6ee040c42426b70 100644
--- a/drivers/iio/magnetometer/ak8975.c
+++ b/drivers/iio/magnetometer/ak8975.c
@@ -474,9 +474,10 @@ static void ak8975_power_off(const struct ak8975_data *data)
* Return 0 if the i2c device is the one we expect.
* return a negative error number otherwise
*/
-static int ak8975_who_i_am(struct i2c_client *client,
+static int ak8975_who_i_am(const struct ak8975_data *data,
enum asahi_compass_chipset type)
{
+ struct i2c_client *client = data->client;
u8 wia_val[2];
int ret;
@@ -598,10 +599,9 @@ static int ak8975_setup_irq(struct ak8975_data *data)
* Perform some start-of-day setup, including reading the asa calibration
* values and caching them.
*/
-static int ak8975_setup(struct i2c_client *client)
+static int ak8975_setup(struct ak8975_data *data)
{
- struct iio_dev *indio_dev = i2c_get_clientdata(client);
- struct ak8975_data *data = iio_priv(indio_dev);
+ struct i2c_client *client = data->client;
int ret;
/* Write the fused rom access mode. */
@@ -706,12 +706,13 @@ static int wait_conversion_complete_interrupt(struct ak8975_data *data,
return ret > 0 ? 0 : -ETIMEDOUT;
}
-static int ak8975_start_read_axis(struct ak8975_data *data,
- const struct i2c_client *client)
+static int ak8975_start_read_axis(struct ak8975_data *data)
{
- /* Set up the device for taking a sample. */
- int ret = ak8975_set_mode(data, MODE_ONCE);
+ struct i2c_client *client = data->client;
+ int ret;
+ /* Set up the device for taking a sample. */
+ ret = ak8975_set_mode(data, MODE_ONCE);
if (ret < 0) {
dev_err(&client->dev, "Error in setting operating mode\n");
return ret;
@@ -744,7 +745,7 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
mutex_lock(&data->lock);
- ret = ak8975_start_read_axis(data, client);
+ ret = ak8975_start_read_axis(data);
if (ret)
goto exit;
@@ -856,7 +857,7 @@ static void ak8975_fill_buffer(struct iio_dev *indio_dev)
mutex_lock(&data->lock);
- ret = ak8975_start_read_axis(data, client);
+ ret = ak8975_start_read_axis(data);
if (ret)
goto unlock;
@@ -994,7 +995,7 @@ static int ak8975_probe(struct i2c_client *client)
if (ret)
return ret;
- ret = ak8975_who_i_am(client, data->def->type);
+ ret = ak8975_who_i_am(data, data->def->type);
if (ret) {
dev_err(&client->dev, "Unexpected device\n");
return ret;
@@ -1002,7 +1003,7 @@ static int ak8975_probe(struct i2c_client *client)
dev_dbg(&client->dev, "Asahi compass chip %s\n", name);
/* Perform some basic start-of-day setup of the device. */
- ret = ak8975_setup(client);
+ ret = ak8975_setup(data);
if (ret) {
dev_err(&client->dev, "%s initialization fails\n", name);
return ret;
--
2.47.3
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v7 5/8] iio: magnetometer: ak8975: unify messages with help of dev_err_probe()
2026-05-11 11:26 [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup Joshua Crofts via B4 Relay
` (3 preceding siblings ...)
2026-05-11 11:26 ` [PATCH v7 4/8] iio: magnetometer: ak8975: consistently use 'data' parameter Joshua Crofts via B4 Relay
@ 2026-05-11 11:26 ` Joshua Crofts via B4 Relay
2026-05-12 15:04 ` Jonathan Cameron
2026-05-11 11:26 ` [PATCH v7 6/8] iio: magnetometer: ak8975: use temporary variable for struct device Joshua Crofts via B4 Relay
` (3 subsequent siblings)
8 siblings, 1 reply; 20+ messages in thread
From: Joshua Crofts via B4 Relay @ 2026-05-11 11:26 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko
Cc: linux-iio, linux-kernel, Joshua Crofts, Andy Shevchenko
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Unify error messages that might appear during probe phase by
switching to use dev_err_probe().
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
---
drivers/iio/magnetometer/ak8975.c | 30 ++++++++++--------------------
1 file changed, 10 insertions(+), 20 deletions(-)
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
index 43259ad4990e2a7a40a0fa60a6ee040c42426b70..2f1442e71607873e869351c379a40dae713a1c84 100644
--- a/drivers/iio/magnetometer/ak8975.c
+++ b/drivers/iio/magnetometer/ak8975.c
@@ -495,10 +495,8 @@ static int ak8975_who_i_am(const struct ak8975_data *data,
AK09912_REG_WIA1,
sizeof(wia_val),
wia_val);
- if (ret < 0) {
- dev_err(&client->dev, "Error reading WIA\n");
- return ret;
- }
+ if (ret < 0)
+ return dev_err_probe(&client->dev, ret, "Error reading WIA\n");
if (wia_val[0] != AK8975_DEVICE_ID)
return -ENODEV;
@@ -996,18 +994,14 @@ static int ak8975_probe(struct i2c_client *client)
return ret;
ret = ak8975_who_i_am(data, data->def->type);
- if (ret) {
- dev_err(&client->dev, "Unexpected device\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(dev, ret, "Unexpected device\n");
dev_dbg(&client->dev, "Asahi compass chip %s\n", name);
/* Perform some basic start-of-day setup of the device. */
ret = ak8975_setup(data);
- if (ret) {
- dev_err(&client->dev, "%s initialization fails\n", name);
- return ret;
- }
+ if (ret)
+ return dev_err_probe(dev, ret, "%s initialization fails\n", name);
ret = devm_mutex_init(dev, &data->lock);
if (ret)
@@ -1022,20 +1016,16 @@ static int ak8975_probe(struct i2c_client *client)
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");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(dev, ret, "triggered buffer setup failed\n");
ret = devm_pm_runtime_enable(dev);
if (ret)
return ret;
ret = devm_iio_device_register(dev, indio_dev);
- if (ret) {
- dev_err(&client->dev, "device register failed\n");
- return ret;
- }
+ if (ret)
+ return dev_err_probe(dev, ret, "device register failed\n");
/*
* The device comes online in 500us, so add two orders of magnitude
--
2.47.3
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v7 6/8] iio: magnetometer: ak8975: use temporary variable for struct device
2026-05-11 11:26 [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup Joshua Crofts via B4 Relay
` (4 preceding siblings ...)
2026-05-11 11:26 ` [PATCH v7 5/8] iio: magnetometer: ak8975: unify messages with help of dev_err_probe() Joshua Crofts via B4 Relay
@ 2026-05-11 11:26 ` Joshua Crofts via B4 Relay
2026-05-11 11:26 ` [PATCH v7 7/8] iio: magnetometer: ak8975: add scan mask index enum Joshua Crofts via B4 Relay
` (2 subsequent siblings)
8 siblings, 0 replies; 20+ messages in thread
From: Joshua Crofts via B4 Relay @ 2026-05-11 11:26 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko
Cc: linux-iio, linux-kernel, Joshua Crofts, Andy Shevchenko
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Use temporary variable for struct device to make code neater.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
---
drivers/iio/magnetometer/ak8975.c | 63 +++++++++++++++++++--------------------
1 file changed, 31 insertions(+), 32 deletions(-)
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
index 2f1442e71607873e869351c379a40dae713a1c84..2267928a136912c901e604fe938e9a17c8cd5607 100644
--- a/drivers/iio/magnetometer/ak8975.c
+++ b/drivers/iio/magnetometer/ak8975.c
@@ -433,18 +433,17 @@ struct ak8975_data {
/* Enable attached power regulator if any. */
static int ak8975_power_on(const struct ak8975_data *data)
{
+ struct device *dev = &data->client->dev;
int ret;
ret = regulator_enable(data->vdd);
if (ret) {
- dev_warn(&data->client->dev,
- "Failed to enable specified Vdd supply\n");
+ dev_warn(dev, "Failed to enable specified Vdd supply\n");
return ret;
}
ret = regulator_enable(data->vid);
if (ret) {
- dev_warn(&data->client->dev,
- "Failed to enable specified Vid supply\n");
+ dev_warn(dev, "Failed to enable specified Vid supply\n");
regulator_disable(data->vdd);
return ret;
}
@@ -572,6 +571,7 @@ static irqreturn_t ak8975_irq_handler(int irq, void *data)
static int ak8975_setup_irq(struct ak8975_data *data)
{
struct i2c_client *client = data->client;
+ struct device *dev = &client->dev;
int irq;
int ret;
@@ -582,9 +582,8 @@ static int ak8975_setup_irq(struct ak8975_data *data)
else
irq = gpiod_to_irq(data->eoc_gpiod);
- ret = devm_request_irq(&client->dev, irq, ak8975_irq_handler,
- IRQF_TRIGGER_RISING,
- dev_name(&client->dev), data);
+ ret = devm_request_irq(dev, irq, ak8975_irq_handler, IRQF_TRIGGER_RISING,
+ dev_name(dev), data);
if (ret)
return ret;
@@ -600,12 +599,13 @@ static int ak8975_setup_irq(struct ak8975_data *data)
static int ak8975_setup(struct ak8975_data *data)
{
struct i2c_client *client = data->client;
+ struct device *dev = &client->dev;
int ret;
/* Write the fused rom access mode. */
ret = ak8975_set_mode(data, FUSE_ROM);
if (ret < 0) {
- dev_err(&client->dev, "Error in setting fuse access mode\n");
+ dev_err(dev, "Error in setting fuse access mode\n");
return ret;
}
@@ -615,22 +615,21 @@ static int ak8975_setup(struct ak8975_data *data)
sizeof(data->asa),
data->asa);
if (ret < 0) {
- dev_err(&client->dev, "Not able to read asa data\n");
+ dev_err(dev, "Not able to read asa data\n");
return ret;
}
/* After reading fuse ROM data set power-down mode */
ret = ak8975_set_mode(data, POWER_DOWN);
if (ret < 0) {
- dev_err(&client->dev, "Error in setting power-down mode\n");
+ dev_err(dev, "Error in setting power-down mode\n");
return ret;
}
if (data->eoc_gpiod || client->irq > 0) {
ret = ak8975_setup_irq(data);
if (ret < 0) {
- dev_err(&client->dev,
- "Error setting data ready interrupt\n");
+ dev_err(dev, "Error setting data ready interrupt\n");
return ret;
}
}
@@ -736,10 +735,11 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
struct ak8975_data *data = iio_priv(indio_dev);
const struct i2c_client *client = data->client;
const struct ak_def *def = data->def;
+ struct device *dev = &data->client->dev;
__le16 rval;
int ret;
- pm_runtime_get_sync(&data->client->dev);
+ pm_runtime_get_sync(dev);
mutex_lock(&data->lock);
@@ -757,20 +757,20 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
/* Read out ST2 for release lock on measurement data. */
ret = i2c_smbus_read_byte_data(client, data->def->ctrl_regs[ST2]);
if (ret < 0) {
- dev_err(&client->dev, "Error in reading ST2\n");
+ dev_err(dev, "Error in reading ST2\n");
goto exit;
}
if (ret & (data->def->ctrl_masks[ST2_DERR] |
data->def->ctrl_masks[ST2_HOFL])) {
- dev_err(&client->dev, "ST2 status error 0x%x\n", ret);
+ dev_err(dev, "ST2 status error 0x%x\n", ret);
ret = -EINVAL;
goto exit;
}
mutex_unlock(&data->lock);
- pm_runtime_put_autosuspend(&data->client->dev);
+ pm_runtime_put_autosuspend(dev);
/* Swap bytes and convert to valid range. */
*val = clamp_t(s16, le16_to_cpu(rval), -def->range, def->range);
@@ -779,8 +779,8 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
exit:
mutex_unlock(&data->lock);
- pm_runtime_put_autosuspend(&data->client->dev);
- dev_err(&client->dev, "Error in reading axis\n");
+ pm_runtime_put_autosuspend(dev);
+ dev_err(dev, "Error in reading axis\n");
return ret;
}
@@ -927,7 +927,7 @@ static int ak8975_probe(struct i2c_client *client)
* We may not have a GPIO based IRQ to scan, that is fine, we will
* poll if so.
*/
- eoc_gpiod = devm_gpiod_get_optional(&client->dev, NULL, GPIOD_IN);
+ eoc_gpiod = devm_gpiod_get_optional(dev, NULL, GPIOD_IN);
if (IS_ERR(eoc_gpiod))
return PTR_ERR(eoc_gpiod);
gpiod_set_consumer_name(eoc_gpiod, "ak_8975");
@@ -937,13 +937,12 @@ static int ak8975_probe(struct i2c_client *client)
* deassert reset on ak8975_power_on() and assert reset on
* ak8975_power_off().
*/
- reset_gpiod = devm_gpiod_get_optional(&client->dev,
- "reset", GPIOD_OUT_HIGH);
+ reset_gpiod = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
if (IS_ERR(reset_gpiod))
return PTR_ERR(reset_gpiod);
/* Register with IIO */
- indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
+ indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
if (indio_dev == NULL)
return -ENOMEM;
@@ -955,7 +954,7 @@ static int ak8975_probe(struct i2c_client *client)
data->reset_gpiod = reset_gpiod;
data->eoc_irq = 0;
- ret = iio_read_mount_matrix(&client->dev, &data->orientation);
+ ret = iio_read_mount_matrix(dev, &data->orientation);
if (ret)
return ret;
@@ -965,16 +964,16 @@ static int ak8975_probe(struct i2c_client *client)
return -ENODEV;
/* If enumerated via firmware node, fix the ABI */
- if (dev_fwnode(&client->dev))
- name = dev_name(&client->dev);
+ if (dev_fwnode(dev))
+ name = dev_name(dev);
else
name = id->name;
/* Fetch the regulators */
- data->vdd = devm_regulator_get(&client->dev, "vdd");
+ data->vdd = devm_regulator_get(dev, "vdd");
if (IS_ERR(data->vdd))
return PTR_ERR(data->vdd);
- data->vid = devm_regulator_get(&client->dev, "vid");
+ data->vid = devm_regulator_get(dev, "vid");
if (IS_ERR(data->vid))
return PTR_ERR(data->vid);
@@ -996,7 +995,7 @@ static int ak8975_probe(struct i2c_client *client)
ret = ak8975_who_i_am(data, data->def->type);
if (ret)
return dev_err_probe(dev, ret, "Unexpected device\n");
- dev_dbg(&client->dev, "Asahi compass chip %s\n", name);
+ dev_dbg(dev, "Asahi compass chip %s\n", name);
/* Perform some basic start-of-day setup of the device. */
ret = ak8975_setup(data);
@@ -1031,8 +1030,8 @@ static int ak8975_probe(struct i2c_client *client)
* 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_set_autosuspend_delay(dev, 50);
+ pm_runtime_use_autosuspend(dev);
return 0;
}
@@ -1047,7 +1046,7 @@ static int ak8975_runtime_suspend(struct device *dev)
/* Set the device in power down if it wasn't already */
ret = ak8975_set_mode(data, POWER_DOWN);
if (ret < 0) {
- dev_err(&client->dev, "Error in setting power-down mode\n");
+ dev_err(dev, "Error in setting power-down mode\n");
return ret;
}
/* Next cut the regulators */
@@ -1071,7 +1070,7 @@ static int ak8975_runtime_resume(struct device *dev)
*/
ret = ak8975_set_mode(data, POWER_DOWN);
if (ret < 0) {
- dev_err(&client->dev, "Error in setting power-down mode\n");
+ dev_err(dev, "Error in setting power-down mode\n");
return ret;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v7 7/8] iio: magnetometer: ak8975: add scan mask index enum
2026-05-11 11:26 [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup Joshua Crofts via B4 Relay
` (5 preceding siblings ...)
2026-05-11 11:26 ` [PATCH v7 6/8] iio: magnetometer: ak8975: use temporary variable for struct device Joshua Crofts via B4 Relay
@ 2026-05-11 11:26 ` Joshua Crofts via B4 Relay
2026-05-11 11:26 ` [PATCH v7 8/8] iio: magnetometer: ak8975: make use of the macros from bits.h Joshua Crofts via B4 Relay
2026-05-12 9:12 ` [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup Andy Shevchenko
8 siblings, 0 replies; 20+ messages in thread
From: Joshua Crofts via B4 Relay @ 2026-05-11 11:26 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko
Cc: linux-iio, linux-kernel, Joshua Crofts
From: Joshua Crofts <joshua.crofts1@gmail.com>
Add an enum to explicitly define scan mask indexes for the X, Y, Z and
timestamp channels. Also, update the struct iio_chan_spec to use said
enum for the .scan_index parameter.
This prevents magic numbers from obscuring the hardware channel mapping
and improves code style.
No functional change.
Suggested-by: Jonathan Cameron <jic23@kernel.org>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
---
drivers/iio/magnetometer/ak8975.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
index 2267928a136912c901e604fe938e9a17c8cd5607..d87a98090c991508ac835839286da0371d689cd8 100644
--- a/drivers/iio/magnetometer/ak8975.c
+++ b/drivers/iio/magnetometer/ak8975.c
@@ -238,6 +238,13 @@ enum ak_ctrl_mode {
MODE_END,
};
+enum ak_scan_index {
+ AK8975_SCAN_X,
+ AK8975_SCAN_Y,
+ AK8975_SCAN_Z,
+ AK8975_SCAN_TS,
+};
+
struct ak_def {
enum asahi_compass_chipset type;
long (*raw_to_gauss)(u16 data);
@@ -835,8 +842,10 @@ static const struct iio_chan_spec_ext_info ak8975_ext_info[] = {
}
static const struct iio_chan_spec ak8975_channels[] = {
- AK8975_CHANNEL(X, 0), AK8975_CHANNEL(Y, 1), AK8975_CHANNEL(Z, 2),
- IIO_CHAN_SOFT_TIMESTAMP(3),
+ AK8975_CHANNEL(X, AK8975_SCAN_X),
+ AK8975_CHANNEL(Y, AK8975_SCAN_Y),
+ AK8975_CHANNEL(Z, AK8975_SCAN_Z),
+ IIO_CHAN_SOFT_TIMESTAMP(AK8975_SCAN_TS),
};
static const unsigned long ak8975_scan_masks[] = { 0x7, 0 };
--
2.47.3
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v7 8/8] iio: magnetometer: ak8975: make use of the macros from bits.h
2026-05-11 11:26 [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup Joshua Crofts via B4 Relay
` (6 preceding siblings ...)
2026-05-11 11:26 ` [PATCH v7 7/8] iio: magnetometer: ak8975: add scan mask index enum Joshua Crofts via B4 Relay
@ 2026-05-11 11:26 ` Joshua Crofts via B4 Relay
2026-05-12 9:12 ` [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup Andy Shevchenko
8 siblings, 0 replies; 20+ messages in thread
From: Joshua Crofts via B4 Relay @ 2026-05-11 11:26 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko
Cc: linux-iio, linux-kernel, Joshua Crofts, Andy Shevchenko
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Make use of BIT() and GENMASK() where it makes sense.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Co-developed-by: Joshua Crofts <joshua.crofts1@gmail.com>
Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
---
drivers/iio/magnetometer/ak8975.c | 26 +++++++++++---------------
1 file changed, 11 insertions(+), 15 deletions(-)
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
index d87a98090c991508ac835839286da0371d689cd8..d8fbdc5debc1cc65ea6e86167a79c860d019cc32 100644
--- a/drivers/iio/magnetometer/ak8975.c
+++ b/drivers/iio/magnetometer/ak8975.c
@@ -45,8 +45,7 @@
#define AK8975_REG_INFO 0x01
#define AK8975_REG_ST1 0x02
-#define AK8975_REG_ST1_DRDY_SHIFT 0
-#define AK8975_REG_ST1_DRDY_MASK (1 << AK8975_REG_ST1_DRDY_SHIFT)
+#define AK8975_REG_ST1_DRDY_MASK BIT(0)
#define AK8975_REG_HXL 0x03
#define AK8975_REG_HXH 0x04
@@ -55,15 +54,12 @@
#define AK8975_REG_HZL 0x07
#define AK8975_REG_HZH 0x08
#define AK8975_REG_ST2 0x09
-#define AK8975_REG_ST2_DERR_SHIFT 2
-#define AK8975_REG_ST2_DERR_MASK (1 << AK8975_REG_ST2_DERR_SHIFT)
+#define AK8975_REG_ST2_DERR_MASK BIT(2)
-#define AK8975_REG_ST2_HOFL_SHIFT 3
-#define AK8975_REG_ST2_HOFL_MASK (1 << AK8975_REG_ST2_HOFL_SHIFT)
+#define AK8975_REG_ST2_HOFL_MASK BIT(3)
#define AK8975_REG_CNTL 0x0A
-#define AK8975_REG_CNTL_MODE_SHIFT 0
-#define AK8975_REG_CNTL_MODE_MASK (0xF << AK8975_REG_CNTL_MODE_SHIFT)
+#define AK8975_REG_CNTL_MODE_MASK GENMASK(3, 0)
#define AK8975_REG_CNTL_MODE_POWER_DOWN 0x00
#define AK8975_REG_CNTL_MODE_ONCE 0x01
#define AK8975_REG_CNTL_MODE_SELF_TEST 0x08
@@ -95,8 +91,7 @@
#define AK09912_REG_ST1 0x10
-#define AK09912_REG_ST1_DRDY_SHIFT 0
-#define AK09912_REG_ST1_DRDY_MASK (1 << AK09912_REG_ST1_DRDY_SHIFT)
+#define AK09912_REG_ST1_DRDY_MASK BIT(0)
#define AK09912_REG_HXL 0x11
#define AK09912_REG_HXH 0x12
@@ -107,8 +102,7 @@
#define AK09912_REG_TMPS 0x17
#define AK09912_REG_ST2 0x18
-#define AK09912_REG_ST2_HOFL_SHIFT 3
-#define AK09912_REG_ST2_HOFL_MASK (1 << AK09912_REG_ST2_HOFL_SHIFT)
+#define AK09912_REG_ST2_HOFL_MASK BIT(3)
#define AK09912_REG_CNTL1 0x30
@@ -117,8 +111,7 @@
#define AK09912_REG_CNTL_MODE_ONCE 0x01
#define AK09912_REG_CNTL_MODE_SELF_TEST 0x10
#define AK09912_REG_CNTL_MODE_FUSE_ROM 0x1F
-#define AK09912_REG_CNTL2_MODE_SHIFT 0
-#define AK09912_REG_CNTL2_MODE_MASK (0x1F << AK09912_REG_CNTL2_MODE_SHIFT)
+#define AK09912_REG_CNTL2_MODE_MASK GENMASK(4, 0)
#define AK09912_REG_CNTL3 0x32
@@ -848,7 +841,10 @@ static const struct iio_chan_spec ak8975_channels[] = {
IIO_CHAN_SOFT_TIMESTAMP(AK8975_SCAN_TS),
};
-static const unsigned long ak8975_scan_masks[] = { 0x7, 0 };
+static const unsigned long ak8975_scan_masks[] = {
+ BIT(AK8975_SCAN_X) | BIT(AK8975_SCAN_Y) | BIT(AK8975_SCAN_Z),
+ 0
+};
static const struct iio_info ak8975_info = {
.read_raw = &ak8975_read_raw,
--
2.47.3
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup
2026-05-11 11:26 [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup Joshua Crofts via B4 Relay
` (7 preceding siblings ...)
2026-05-11 11:26 ` [PATCH v7 8/8] iio: magnetometer: ak8975: make use of the macros from bits.h Joshua Crofts via B4 Relay
@ 2026-05-12 9:12 ` Andy Shevchenko
2026-05-12 9:16 ` Joshua Crofts
8 siblings, 1 reply; 20+ messages in thread
From: Andy Shevchenko @ 2026-05-12 9:12 UTC (permalink / raw)
To: joshua.crofts1
Cc: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
linux-iio, linux-kernel
On Mon, May 11, 2026 at 01:26:09PM +0200, Joshua Crofts via B4 Relay wrote:
> This series is a continuation of the previous ak8975 driver cleanup
> effort, as most of the patches were picked.
>
> Changes include:
> - using BIT() and GENMASK() macros
> - moving to devm_* resource management
> - adding a scan index enum
> - moving from using wait loops to iopoll functions
> - various code style changes
Thanks for doing this!
Jonathan, the same Q I had in previous version round, can we get some patches
applied to reduce the burden of the series? (I think of 1, 2, 7, 8 and might be
more.) As for the series, I think if this version is still not good enough
(patch 3) we need to rearrange it so that patch is going to the end (as much as
possible) of the series, so we want delay the 'good' ones to be applied.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup
2026-05-12 9:12 ` [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup Andy Shevchenko
@ 2026-05-12 9:16 ` Joshua Crofts
2026-05-12 14:44 ` Andy Shevchenko
2026-05-12 14:55 ` Jonathan Cameron
0 siblings, 2 replies; 20+ messages in thread
From: Joshua Crofts @ 2026-05-12 9:16 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
linux-iio, linux-kernel
On Tue, 12 May 2026 at 11:12, Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
>
> On Mon, May 11, 2026 at 01:26:09PM +0200, Joshua Crofts via B4 Relay wrote:
> > This series is a continuation of the previous ak8975 driver cleanup
> > effort, as most of the patches were picked.
> >
> > Changes include:
> > - using BIT() and GENMASK() macros
> > - moving to devm_* resource management
> > - adding a scan index enum
> > - moving from using wait loops to iopoll functions
> > - various code style changes
>
> Thanks for doing this!
>
> Jonathan, the same Q I had in previous version round, can we get some patches
> applied to reduce the burden of the series? (I think of 1, 2, 7, 8 and might be
> more.) As for the series, I think if this version is still not good enough
> (patch 3) we need to rearrange it so that patch is going to the end (as much as
> possible) of the series, so we want delay the 'good' ones to be applied.
IMO all patches excluding the shared resource management patch are good
to go. I can send a new version reordered to reduce the headache.
--
Kind regards
CJD
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup
2026-05-12 9:16 ` Joshua Crofts
@ 2026-05-12 14:44 ` Andy Shevchenko
2026-05-12 14:55 ` Jonathan Cameron
1 sibling, 0 replies; 20+ messages in thread
From: Andy Shevchenko @ 2026-05-12 14:44 UTC (permalink / raw)
To: Joshua Crofts
Cc: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
linux-iio, linux-kernel
On Tue, May 12, 2026 at 11:16:17AM +0200, Joshua Crofts wrote:
> On Tue, 12 May 2026 at 11:12, Andy Shevchenko
> <andriy.shevchenko@linux.intel.com> wrote:
> > On Mon, May 11, 2026 at 01:26:09PM +0200, Joshua Crofts via B4 Relay wrote:
> > > This series is a continuation of the previous ak8975 driver cleanup
> > > effort, as most of the patches were picked.
> > >
> > > Changes include:
> > > - using BIT() and GENMASK() macros
> > > - moving to devm_* resource management
> > > - adding a scan index enum
> > > - moving from using wait loops to iopoll functions
> > > - various code style changes
> >
> > Thanks for doing this!
> >
> > Jonathan, the same Q I had in previous version round, can we get some patches
> > applied to reduce the burden of the series? (I think of 1, 2, 7, 8 and might be
> > more.) As for the series, I think if this version is still not good enough
> > (patch 3) we need to rearrange it so that patch is going to the end (as much as
> > possible) of the series, so we want delay the 'good' ones to be applied.
>
> IMO all patches excluding the shared resource management patch are good
> to go. I can send a new version reordered to reduce the headache.
Let's wait for Jonathan. Whatever he prefers.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 1/8] iio: magnetometer: ak8975: modernize polling loops with iopoll() macros
2026-05-11 11:26 ` [PATCH v7 1/8] iio: magnetometer: ak8975: modernize polling loops with iopoll() macros Joshua Crofts via B4 Relay
@ 2026-05-12 14:53 ` Jonathan Cameron
0 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2026-05-12 14:53 UTC (permalink / raw)
To: Joshua Crofts via B4 Relay
Cc: joshua.crofts1, David Lechner, Nuno Sá, Andy Shevchenko,
linux-iio, linux-kernel, Andy Shevchenko
On Mon, 11 May 2026 13:26:10 +0200
Joshua Crofts via B4 Relay <devnull+joshua.crofts1.gmail.com@kernel.org> wrote:
> From: Joshua Crofts <joshua.crofts1@gmail.com>
>
> The driver currently uses while loops and msleep() for polling during
> conversion waits.
>
> Replace the custom polling loops with readx_poll_timeout() and
> read_poll_timeout() macros from <linux/iopoll.h>. This reduces
> boilerplate, standardizes timeout handling and improves overall code
> readability, keeping the original timing and error behaviour. Add
> <linux/time.h> for USEC_PER_MSEC macro instead of using magic numbers.
>
> Assisted-by: Gemini:3.1-Pro
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Reviewed-by: Nuno Sá <nuno.sa@analog.com>
> Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
As per discussion on the cover letter thread, lets pick up the easy stuff.
Applied this one.
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 2/8] iio: magnetometer: ak8975: check if gpiod read was successful
2026-05-11 11:26 ` [PATCH v7 2/8] iio: magnetometer: ak8975: check if gpiod read was successful Joshua Crofts via B4 Relay
@ 2026-05-12 14:54 ` Jonathan Cameron
0 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2026-05-12 14:54 UTC (permalink / raw)
To: Joshua Crofts via B4 Relay
Cc: joshua.crofts1, David Lechner, Nuno Sá, Andy Shevchenko,
linux-iio, linux-kernel
On Mon, 11 May 2026 13:26:11 +0200
Joshua Crofts via B4 Relay <devnull+joshua.crofts1.gmail.com@kernel.org> wrote:
> From: Joshua Crofts <joshua.crofts1@gmail.com>
>
> Add a check that ensures that valid data has been read from GPIOD. If
> not, log an error and return the negative read value.
>
> Suggested-by: Jonathan Cameron <jic23@kernel.org>
> Reviewed-by: Nuno Sá <nuno.sa@analog.com>
> Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
Sashiko had comments but they were all 'whilst I was here I noticed' style
so applied.
> ---
> drivers/iio/magnetometer/ak8975.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
> index b990c123e2808c2078abcfaf6b2ef86c09393e6b..63b6e8465f5f3873841550a1cd03ce86b95d1d67 100644
> --- a/drivers/iio/magnetometer/ak8975.c
> +++ b/drivers/iio/magnetometer/ak8975.c
> @@ -658,6 +658,10 @@ static int wait_conversion_complete_gpio(struct ak8975_data *data,
> timeout_ms * USEC_PER_MSEC);
> if (ret)
> return ret;
> + if (val < 0) {
> + dev_err(&client->dev, "Error in reading GPIOD\n");
> + return val;
> + }
>
> ret = i2c_smbus_read_byte_data(client, data->def->ctrl_regs[ST1]);
> if (ret < 0)
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup
2026-05-12 9:16 ` Joshua Crofts
2026-05-12 14:44 ` Andy Shevchenko
@ 2026-05-12 14:55 ` Jonathan Cameron
1 sibling, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2026-05-12 14:55 UTC (permalink / raw)
To: Joshua Crofts
Cc: Andy Shevchenko, David Lechner, Nuno Sá, Andy Shevchenko,
linux-iio, linux-kernel
On Tue, 12 May 2026 11:16:17 +0200
Joshua Crofts <joshua.crofts1@gmail.com> wrote:
> On Tue, 12 May 2026 at 11:12, Andy Shevchenko
> <andriy.shevchenko@linux.intel.com> wrote:
> >
> > On Mon, May 11, 2026 at 01:26:09PM +0200, Joshua Crofts via B4 Relay wrote:
> > > This series is a continuation of the previous ak8975 driver cleanup
> > > effort, as most of the patches were picked.
> > >
> > > Changes include:
> > > - using BIT() and GENMASK() macros
> > > - moving to devm_* resource management
> > > - adding a scan index enum
> > > - moving from using wait loops to iopoll functions
> > > - various code style changes
> >
> > Thanks for doing this!
> >
> > Jonathan, the same Q I had in previous version round, can we get some patches
> > applied to reduce the burden of the series? (I think of 1, 2, 7, 8 and might be
> > more.) As for the series, I think if this version is still not good enough
> > (patch 3) we need to rearrange it so that patch is going to the end (as much as
> > possible) of the series, so we want delay the 'good' ones to be applied.
>
> IMO all patches excluding the shared resource management patch are good
> to go. I can send a new version reordered to reduce the headache.
>
I'll see what picks up easily then you can reorder the rest.
Sashiko indeed not happy with patch 3 and the issues around runtime pm.
Jonathan
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 4/8] iio: magnetometer: ak8975: consistently use 'data' parameter
2026-05-11 11:26 ` [PATCH v7 4/8] iio: magnetometer: ak8975: consistently use 'data' parameter Joshua Crofts via B4 Relay
@ 2026-05-12 14:56 ` Jonathan Cameron
2026-05-12 15:03 ` Jonathan Cameron
1 sibling, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2026-05-12 14:56 UTC (permalink / raw)
To: Joshua Crofts via B4 Relay
Cc: joshua.crofts1, David Lechner, Nuno Sá, Andy Shevchenko,
linux-iio, linux-kernel, Andy Shevchenko
On Mon, 11 May 2026 13:26:13 +0200
Joshua Crofts via B4 Relay <devnull+joshua.crofts1.gmail.com@kernel.org> wrote:
> From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
>
> Some of the functions use 'client', some use 'data', and some use both.
> Refactor the driver to consistently use 'data' in all cases.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Reviewed-by: Nuno Sá <nuno.sa@analog.com>
> Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
A bit of fuzz on this one but looks minor so applied anyway (leaving
patch 3 for now)
Jonathan
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 4/8] iio: magnetometer: ak8975: consistently use 'data' parameter
2026-05-11 11:26 ` [PATCH v7 4/8] iio: magnetometer: ak8975: consistently use 'data' parameter Joshua Crofts via B4 Relay
2026-05-12 14:56 ` Jonathan Cameron
@ 2026-05-12 15:03 ` Jonathan Cameron
2026-05-12 15:13 ` Joshua Crofts
1 sibling, 1 reply; 20+ messages in thread
From: Jonathan Cameron @ 2026-05-12 15:03 UTC (permalink / raw)
To: Joshua Crofts via B4 Relay
Cc: joshua.crofts1, David Lechner, Nuno Sá, Andy Shevchenko,
linux-iio, linux-kernel, Andy Shevchenko
On Mon, 11 May 2026 13:26:13 +0200
Joshua Crofts via B4 Relay <devnull+joshua.crofts1.gmail.com@kernel.org> wrote:
> From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
>
> Some of the functions use 'client', some use 'data', and some use both.
> Refactor the driver to consistently use 'data' in all cases.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Reviewed-by: Nuno Sá <nuno.sa@analog.com>
> Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
Note that whilst I've applied this sashiko pointed out some more
while I was here issues.
The one about not ensuring the power is on for buffered captures
is a pretty major bug :(
https://sashiko.dev/#/patchset/20260511-magnetometer-fixes-post-pickup-v7-0-9d910faa28b6%40gmail.com
Which is a pain because we have lots of cleanup on this driver already
and I don't want to rip it out. The fix is pretty simple though
(add a preenable, postdissable pair of opts and pm_runtime_get_sync()
/ put_autosuspend() as appropriate.
So if you don't mind please put together that patch and I'll apply it
via the testing/togreg tree and we'll do a manual backport later.
Jonathan
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 5/8] iio: magnetometer: ak8975: unify messages with help of dev_err_probe()
2026-05-11 11:26 ` [PATCH v7 5/8] iio: magnetometer: ak8975: unify messages with help of dev_err_probe() Joshua Crofts via B4 Relay
@ 2026-05-12 15:04 ` Jonathan Cameron
2026-05-12 15:08 ` Joshua Crofts
0 siblings, 1 reply; 20+ messages in thread
From: Jonathan Cameron @ 2026-05-12 15:04 UTC (permalink / raw)
To: Joshua Crofts via B4 Relay
Cc: joshua.crofts1, David Lechner, Nuno Sá, Andy Shevchenko,
linux-iio, linux-kernel, Andy Shevchenko
On Mon, 11 May 2026 13:26:14 +0200
Joshua Crofts via B4 Relay <devnull+joshua.crofts1.gmail.com@kernel.org> wrote:
> From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
>
> Unify error messages that might appear during probe phase by
> switching to use dev_err_probe().
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Reviewed-by: Nuno Sá <nuno.sa@analog.com>
> Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
At this point things have become non trivial enough that I won't pick up
any more today and will wait for a reorder with any fixes etc.
Thanks
Jonathan
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 5/8] iio: magnetometer: ak8975: unify messages with help of dev_err_probe()
2026-05-12 15:04 ` Jonathan Cameron
@ 2026-05-12 15:08 ` Joshua Crofts
0 siblings, 0 replies; 20+ messages in thread
From: Joshua Crofts @ 2026-05-12 15:08 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Joshua Crofts via B4 Relay, David Lechner, Nuno Sá,
Andy Shevchenko, linux-iio, linux-kernel, Andy Shevchenko
On Tue, 12 May 2026 at 17:04, Jonathan Cameron <jic23@kernel.org> wrote:
>
> On Mon, 11 May 2026 13:26:14 +0200
> Joshua Crofts via B4 Relay <devnull+joshua.crofts1.gmail.com@kernel.org> wrote:
>
> > From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> >
> > Unify error messages that might appear during probe phase by
> > switching to use dev_err_probe().
> >
> > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > Reviewed-by: Nuno Sá <nuno.sa@analog.com>
> > Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
> At this point things have become non trivial enough that I won't pick up
> any more today and will wait for a reorder with any fixes etc.
Fine by me, thanks for picking up a partial set. Will send a follow up soon.
--
Kind regards
CJD
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 4/8] iio: magnetometer: ak8975: consistently use 'data' parameter
2026-05-12 15:03 ` Jonathan Cameron
@ 2026-05-12 15:13 ` Joshua Crofts
0 siblings, 0 replies; 20+ messages in thread
From: Joshua Crofts @ 2026-05-12 15:13 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Joshua Crofts via B4 Relay, David Lechner, Nuno Sá,
Andy Shevchenko, linux-iio, linux-kernel, Andy Shevchenko
On Tue, 12 May 2026 at 17:03, Jonathan Cameron <jic23@kernel.org> wrote:
>
> On Mon, 11 May 2026 13:26:13 +0200
> Joshua Crofts via B4 Relay <devnull+joshua.crofts1.gmail.com@kernel.org> wrote:
>
> > From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> >
> > Some of the functions use 'client', some use 'data', and some use both.
> > Refactor the driver to consistently use 'data' in all cases.
> >
> > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > Reviewed-by: Nuno Sá <nuno.sa@analog.com>
> > Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
> Note that whilst I've applied this sashiko pointed out some more
> while I was here issues.
>
> The one about not ensuring the power is on for buffered captures
> is a pretty major bug :(
>
> https://sashiko.dev/#/patchset/20260511-magnetometer-fixes-post-pickup-v7-0-9d910faa28b6%40gmail.com
>
> Which is a pain because we have lots of cleanup on this driver already
> and I don't want to rip it out. The fix is pretty simple though
> (add a preenable, postdissable pair of opts and pm_runtime_get_sync()
> / put_autosuspend() as appropriate.
>
> So if you don't mind please put together that patch and I'll apply it
> via the testing/togreg tree and we'll do a manual backport later.
Oh well, at least Sashiko caught it. Thanks for the heads up.
--
Kind regards
CJD
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2026-05-12 15:14 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-11 11:26 [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup Joshua Crofts via B4 Relay
2026-05-11 11:26 ` [PATCH v7 1/8] iio: magnetometer: ak8975: modernize polling loops with iopoll() macros Joshua Crofts via B4 Relay
2026-05-12 14:53 ` Jonathan Cameron
2026-05-11 11:26 ` [PATCH v7 2/8] iio: magnetometer: ak8975: check if gpiod read was successful Joshua Crofts via B4 Relay
2026-05-12 14:54 ` Jonathan Cameron
2026-05-11 11:26 ` [PATCH v7 3/8] iio: magnetometer: ak8975: switch to using managed resources Joshua Crofts via B4 Relay
2026-05-11 11:26 ` [PATCH v7 4/8] iio: magnetometer: ak8975: consistently use 'data' parameter Joshua Crofts via B4 Relay
2026-05-12 14:56 ` Jonathan Cameron
2026-05-12 15:03 ` Jonathan Cameron
2026-05-12 15:13 ` Joshua Crofts
2026-05-11 11:26 ` [PATCH v7 5/8] iio: magnetometer: ak8975: unify messages with help of dev_err_probe() Joshua Crofts via B4 Relay
2026-05-12 15:04 ` Jonathan Cameron
2026-05-12 15:08 ` Joshua Crofts
2026-05-11 11:26 ` [PATCH v7 6/8] iio: magnetometer: ak8975: use temporary variable for struct device Joshua Crofts via B4 Relay
2026-05-11 11:26 ` [PATCH v7 7/8] iio: magnetometer: ak8975: add scan mask index enum Joshua Crofts via B4 Relay
2026-05-11 11:26 ` [PATCH v7 8/8] iio: magnetometer: ak8975: make use of the macros from bits.h Joshua Crofts via B4 Relay
2026-05-12 9:12 ` [PATCH v7 0/8] iio: magnetometer: ak8975: driver cleanup Andy Shevchenko
2026-05-12 9:16 ` Joshua Crofts
2026-05-12 14:44 ` Andy Shevchenko
2026-05-12 14:55 ` Jonathan Cameron
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox