* [PATCH v2 0/3] Add support for AK09918
@ 2024-08-06 6:10 Barnabás Czémán
2024-08-06 6:10 ` [PATCH v2 1/3] iio: magnetometer: ak8975: Fix reading for ak099xx sensors Barnabás Czémán
` (2 more replies)
0 siblings, 3 replies; 14+ messages in thread
From: Barnabás Czémán @ 2024-08-06 6:10 UTC (permalink / raw)
To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jonathan Albrieux
Cc: linux-iio, linux-kernel, devicetree, linux,
Barnabás Czémán, Danila Tikhonov
Add support for AK09918 which is register and scaling compatible with
AK09912.
It was tested in Xiaomi Redmi 5 Plus (vince).
magnetometer@c {
compatible = "asahi-kasei,ak09918";
reg = <0x0c>;
vdd-supply = <&pm8953_l6>;
mount-matrix = "1", "0", "0",
"0", "1", "0",
"0", "0", "1";
};
Add a fix for data reading according to datasheet [1] (9.4.3.2.)
ST2 register should be read out after read measurment data as third step.
ST2 read out is required and get correct value during measurment data
read.
[1] https://www.akm.com/content/dam/documents/products/electronic-compass/ak09918c/ak09918c-en-datasheet.pdf
Signed-off-by: Barnabás Czémán <barnabas.czeman@mainlining.org>
---
Changes in v2:
- Remove unnecessary ak09918 compatbile.
- Link to v1: https://lore.kernel.org/r/20240805-ak09918-v1-0-70837eebd7d8@mainlining.org
---
Barnabás Czémán (1):
iio: magnetometer: ak8975: Fix reading for ak099xx sensors
Danila Tikhonov (2):
dt-bindings: iio: imu: magnetometer: Add ak09118
iio: magnetometer: ak8975: Add AK09118 support
.../iio/magnetometer/asahi-kasei,ak8975.yaml | 1 +
drivers/iio/magnetometer/Kconfig | 2 +-
drivers/iio/magnetometer/ak8975.c | 65 ++++++++++++++++------
3 files changed, 51 insertions(+), 17 deletions(-)
---
base-commit: d6dbc9f56c3a70e915625b6f1887882c23dc5c91
change-id: 20240805-ak09918-4a6cfef91c32
Best regards,
--
Barnabás Czémán <barnabas.czeman@mainlining.org>
^ permalink raw reply [flat|nested] 14+ messages in thread* [PATCH v2 1/3] iio: magnetometer: ak8975: Fix reading for ak099xx sensors 2024-08-06 6:10 [PATCH v2 0/3] Add support for AK09918 Barnabás Czémán @ 2024-08-06 6:10 ` Barnabás Czémán 2024-08-06 16:19 ` Jonathan Cameron 2024-08-06 6:10 ` [PATCH v2 2/3] dt-bindings: iio: imu: magnetometer: Add ak09118 Barnabás Czémán 2024-08-06 6:10 ` [PATCH v2 3/3] iio: magnetometer: ak8975: Add AK09118 support Barnabás Czémán 2 siblings, 1 reply; 14+ messages in thread From: Barnabás Czémán @ 2024-08-06 6:10 UTC (permalink / raw) To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Albrieux Cc: linux-iio, linux-kernel, devicetree, linux, Barnabás Czémán ST2 register read should be placed after read measurment data, because it will get correct values after it. Signed-off-by: Barnabás Czémán <barnabas.czeman@mainlining.org> --- drivers/iio/magnetometer/ak8975.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c index dd466c5fa621..925d76062b3e 100644 --- a/drivers/iio/magnetometer/ak8975.c +++ b/drivers/iio/magnetometer/ak8975.c @@ -692,22 +692,7 @@ static int ak8975_start_read_axis(struct ak8975_data *data, if (ret < 0) return ret; - /* This will be executed only for non-interrupt based waiting case */ - if (ret & data->def->ctrl_masks[ST1_DRDY]) { - ret = i2c_smbus_read_byte_data(client, - data->def->ctrl_regs[ST2]); - if (ret < 0) { - dev_err(&client->dev, "Error in reading ST2\n"); - return ret; - } - 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); - return -EINVAL; - } - } - - return 0; + return !(ret & data->def->ctrl_masks[ST1_DRDY]); } /* Retrieve raw flux value for one of the x, y, or z axis. */ @@ -731,6 +716,20 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val) ret = i2c_smbus_read_i2c_block_data_or_emulated( client, def->data_regs[index], sizeof(rval), (u8*)&rval); + ret = i2c_smbus_read_byte_data(client, + data->def->ctrl_regs[ST2]); + if (ret < 0) { + dev_err(&client->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); + ret = -EINVAL; + goto exit; + } + if (ret < 0) goto exit; -- 2.46.0 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v2 1/3] iio: magnetometer: ak8975: Fix reading for ak099xx sensors 2024-08-06 6:10 ` [PATCH v2 1/3] iio: magnetometer: ak8975: Fix reading for ak099xx sensors Barnabás Czémán @ 2024-08-06 16:19 ` Jonathan Cameron 2024-08-06 17:54 ` Barnabás Czémán 2024-08-07 15:15 ` barnabas.czeman 0 siblings, 2 replies; 14+ messages in thread From: Jonathan Cameron @ 2024-08-06 16:19 UTC (permalink / raw) To: Barnabás Czémán Cc: Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Albrieux, linux-iio, linux-kernel, devicetree, linux On Tue, 06 Aug 2024 08:10:18 +0200 Barnabás Czémán <barnabas.czeman@mainlining.org> wrote: Hi Barnabás, Welcome to IIO. > ST2 register read should be placed after read measurment data, > because it will get correct values after it. What is the user visible result of this? Do we detect errors when none are there? Do we have a datasheet reference for the status being update on the read command, not after the trigger? > Needs a Fixes tag to let us know how far to backport the fix. A few comments inline. > Signed-off-by: Barnabás Czémán <barnabas.czeman@mainlining.org> > --- > drivers/iio/magnetometer/ak8975.c | 31 +++++++++++++++---------------- > 1 file changed, 15 insertions(+), 16 deletions(-) > > diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c > index dd466c5fa621..925d76062b3e 100644 > --- a/drivers/iio/magnetometer/ak8975.c > +++ b/drivers/iio/magnetometer/ak8975.c > @@ -692,22 +692,7 @@ static int ak8975_start_read_axis(struct ak8975_data *data, > if (ret < 0) > return ret; > > - /* This will be executed only for non-interrupt based waiting case */ > - if (ret & data->def->ctrl_masks[ST1_DRDY]) { > - ret = i2c_smbus_read_byte_data(client, > - data->def->ctrl_regs[ST2]); > - if (ret < 0) { > - dev_err(&client->dev, "Error in reading ST2\n"); > - return ret; > - } > - 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); > - return -EINVAL; > - } > - } > - This completely removes the check from the _fill_buffer() path > - return 0; > + return !(ret & data->def->ctrl_masks[ST1_DRDY]); returning a positive value here is unusual enough you should add a comment for the function + use that return value. > } > > /* Retrieve raw flux value for one of the x, y, or z axis. */ > @@ -731,6 +716,20 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val) > ret = i2c_smbus_read_i2c_block_data_or_emulated( > client, def->data_regs[index], > sizeof(rval), (u8*)&rval); No longer gated on ret & data->def->ctrl_masks[ST1_DRDY] which seems unintentional. Still need a check on ret here. > + ret = i2c_smbus_read_byte_data(client, > + data->def->ctrl_regs[ST2]); > + if (ret < 0) { > + dev_err(&client->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); > + ret = -EINVAL; > + goto exit; > + } > + > if (ret < 0) > goto exit; And this one ends up redundant I think which suggests to me the code is inserted a few lines early. > > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 1/3] iio: magnetometer: ak8975: Fix reading for ak099xx sensors 2024-08-06 16:19 ` Jonathan Cameron @ 2024-08-06 17:54 ` Barnabás Czémán 2024-08-10 10:27 ` Jonathan Cameron 2024-08-07 15:15 ` barnabas.czeman 1 sibling, 1 reply; 14+ messages in thread From: Barnabás Czémán @ 2024-08-06 17:54 UTC (permalink / raw) To: Jonathan Cameron Cc: Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Albrieux, linux-iio, linux-kernel, devicetree, linux On August 6, 2024 6:19:25 PM GMT+02:00, Jonathan Cameron <jic23@kernel.org> wrote: >On Tue, 06 Aug 2024 08:10:18 +0200 >Barnabás Czémán <barnabas.czeman@mainlining.org> wrote: > >Hi Barnabás, > >Welcome to IIO. > >> ST2 register read should be placed after read measurment data, >> because it will get correct values after it. > >What is the user visible result of this? Do we detect errors when none >are there? Do we have a datasheet reference for the status being >update on the read command, not after the trigger? Second read will fail. In the datasheet ST2 comes after measurment data read. Here is some explanation from datasheet. "When ST2 register is read, AK09918 judges that data reading is finished. Stored measurement data is protected during data reading and data is not updated. By reading ST2 register, this protection is released. It is required to read ST2 register after data reading." So if ST2 is read before measurment it will stuck at protected mode. >> >Needs a Fixes tag to let us know how far to backport the fix. I think it is broken since 09912 was added but i cannot verify i have only devices with 09918. > >A few comments inline. > >> Signed-off-by: Barnabás Czémán <barnabas.czeman@mainlining.org> >> --- >> drivers/iio/magnetometer/ak8975.c | 31 +++++++++++++++---------------- >> 1 file changed, 15 insertions(+), 16 deletions(-) >> >> diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c >> index dd466c5fa621..925d76062b3e 100644 >> --- a/drivers/iio/magnetometer/ak8975.c >> +++ b/drivers/iio/magnetometer/ak8975.c >> @@ -692,22 +692,7 @@ static int ak8975_start_read_axis(struct ak8975_data *data, >> if (ret < 0) >> return ret; >> >> - /* This will be executed only for non-interrupt based waiting case */ >> - if (ret & data->def->ctrl_masks[ST1_DRDY]) { >> - ret = i2c_smbus_read_byte_data(client, >> - data->def->ctrl_regs[ST2]); >> - if (ret < 0) { >> - dev_err(&client->dev, "Error in reading ST2\n"); >> - return ret; >> - } >> - 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); >> - return -EINVAL; >> - } >> - } >> - >This completely removes the check from the _fill_buffer() path > >> - return 0; >> + return !(ret & data->def->ctrl_masks[ST1_DRDY]); >returning a positive value here is unusual enough you should add a comment for >the function + use that return value. > >> } >> >> /* Retrieve raw flux value for one of the x, y, or z axis. */ >> @@ -731,6 +716,20 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val) >> ret = i2c_smbus_read_i2c_block_data_or_emulated( >> client, def->data_regs[index], >> sizeof(rval), (u8*)&rval); >No longer gated on ret & data->def->ctrl_masks[ST1_DRDY] which seems unintentional. > >Still need a check on ret here. > >> + ret = i2c_smbus_read_byte_data(client, >> + data->def->ctrl_regs[ST2]); >> + if (ret < 0) { >> + dev_err(&client->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); >> + ret = -EINVAL; >> + goto exit; >> + } >> + >> if (ret < 0) >> goto exit; > >And this one ends up redundant I think which suggests to me the >code is inserted a few lines early. > >> >> > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 1/3] iio: magnetometer: ak8975: Fix reading for ak099xx sensors 2024-08-06 17:54 ` Barnabás Czémán @ 2024-08-10 10:27 ` Jonathan Cameron 0 siblings, 0 replies; 14+ messages in thread From: Jonathan Cameron @ 2024-08-10 10:27 UTC (permalink / raw) To: Barnabás Czémán Cc: Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Albrieux, linux-iio, linux-kernel, devicetree, linux On Tue, 06 Aug 2024 19:54:56 +0200 Barnabás Czémán <barnabas.czeman@mainlining.org> wrote: > On August 6, 2024 6:19:25 PM GMT+02:00, Jonathan Cameron <jic23@kernel.org> wrote: > >On Tue, 06 Aug 2024 08:10:18 +0200 > >Barnabás Czémán <barnabas.czeman@mainlining.org> wrote: > > > >Hi Barnabás, > > > >Welcome to IIO. > > > >> ST2 register read should be placed after read measurment data, > >> because it will get correct values after it. > > > >What is the user visible result of this? Do we detect errors when none > >are there? Do we have a datasheet reference for the status being > >update on the read command, not after the trigger? > > Second read will fail. In the datasheet ST2 comes after measurment data read. Here is some explanation from datasheet. > > "When ST2 register is read, AK09918 judges that data reading is finished. Stored measurement data is > protected during data reading and data is not updated. By reading ST2 register, this protection is > released. It is required to read ST2 register after data reading." > Thanks. Please add more of that detail to the patch description for v3. > So if ST2 is read before measurment it will stuck at protected mode. > >> > >Needs a Fixes tag to let us know how far to backport the fix. > I think it is broken since 09912 was added but i cannot verify i have only devices with 09918. > > I wasn't meaning devices, but rather what patch broke the kernel code. It might be the original driver introduction. If we can add a Fixes tag that makes it much easier for stable + distributions to work out whether to pick the fix up or not. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 1/3] iio: magnetometer: ak8975: Fix reading for ak099xx sensors 2024-08-06 16:19 ` Jonathan Cameron 2024-08-06 17:54 ` Barnabás Czémán @ 2024-08-07 15:15 ` barnabas.czeman 1 sibling, 0 replies; 14+ messages in thread From: barnabas.czeman @ 2024-08-07 15:15 UTC (permalink / raw) To: Jonathan Cameron Cc: Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Albrieux, linux-iio, linux-kernel, devicetree, linux On 2024-08-06 18:19, Jonathan Cameron wrote: > On Tue, 06 Aug 2024 08:10:18 +0200 > Barnabás Czémán <barnabas.czeman@mainlining.org> wrote: > > Hi Barnabás, > > Welcome to IIO. > >> ST2 register read should be placed after read measurment data, >> because it will get correct values after it. > > What is the user visible result of this? Do we detect errors when none > are there? Do we have a datasheet reference for the status being > update on the read command, not after the trigger? >> > Needs a Fixes tag to let us know how far to backport the fix. > > A few comments inline. > >> Signed-off-by: Barnabás Czémán <barnabas.czeman@mainlining.org> >> --- >> drivers/iio/magnetometer/ak8975.c | 31 >> +++++++++++++++---------------- >> 1 file changed, 15 insertions(+), 16 deletions(-) >> >> diff --git a/drivers/iio/magnetometer/ak8975.c >> b/drivers/iio/magnetometer/ak8975.c >> index dd466c5fa621..925d76062b3e 100644 >> --- a/drivers/iio/magnetometer/ak8975.c >> +++ b/drivers/iio/magnetometer/ak8975.c >> @@ -692,22 +692,7 @@ static int ak8975_start_read_axis(struct >> ak8975_data *data, >> if (ret < 0) >> return ret; >> >> - /* This will be executed only for non-interrupt based waiting case >> */ >> - if (ret & data->def->ctrl_masks[ST1_DRDY]) { >> - ret = i2c_smbus_read_byte_data(client, >> - data->def->ctrl_regs[ST2]); >> - if (ret < 0) { >> - dev_err(&client->dev, "Error in reading ST2\n"); >> - return ret; >> - } >> - 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); >> - return -EINVAL; >> - } >> - } >> - > This completely removes the check from the _fill_buffer() path > >> - return 0; >> + return !(ret & data->def->ctrl_masks[ST1_DRDY]); > returning a positive value here is unusual enough you should add a > comment for > the function + use that return value. > >> } >> >> /* Retrieve raw flux value for one of the x, y, or z axis. */ >> @@ -731,6 +716,20 @@ static int ak8975_read_axis(struct iio_dev >> *indio_dev, int index, int *val) >> ret = i2c_smbus_read_i2c_block_data_or_emulated( >> client, def->data_regs[index], >> sizeof(rval), (u8*)&rval); > No longer gated on ret & data->def->ctrl_masks[ST1_DRDY] which seems > unintentional. It is checked exactly before the measurement data read, it is the return value of ak8975_start_read_axis. The read section should be ST1 -> measurement -> ST2, exactly the same can be found in the datasheets. > > Still need a check on ret here. > >> + ret = i2c_smbus_read_byte_data(client, >> + data->def->ctrl_regs[ST2]); >> + if (ret < 0) { >> + dev_err(&client->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); >> + ret = -EINVAL; >> + goto exit; >> + } >> + >> if (ret < 0) >> goto exit; > > And this one ends up redundant I think which suggests to me the > code is inserted a few lines early. > >> >> ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v2 2/3] dt-bindings: iio: imu: magnetometer: Add ak09118 2024-08-06 6:10 [PATCH v2 0/3] Add support for AK09918 Barnabás Czémán 2024-08-06 6:10 ` [PATCH v2 1/3] iio: magnetometer: ak8975: Fix reading for ak099xx sensors Barnabás Czémán @ 2024-08-06 6:10 ` Barnabás Czémán 2024-08-06 16:00 ` Conor Dooley 2024-08-07 6:03 ` Krzysztof Kozlowski 2024-08-06 6:10 ` [PATCH v2 3/3] iio: magnetometer: ak8975: Add AK09118 support Barnabás Czémán 2 siblings, 2 replies; 14+ messages in thread From: Barnabás Czémán @ 2024-08-06 6:10 UTC (permalink / raw) To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Albrieux Cc: linux-iio, linux-kernel, devicetree, linux, Barnabás Czémán, Danila Tikhonov From: Danila Tikhonov <danila@jiaxyga.com> Document asahi-kasei,ak09918 compatible. Signed-off-by: Danila Tikhonov <danila@jiaxyga.com> Signed-off-by: Barnabás Czémán <barnabas.czeman@mainlining.org> --- .../devicetree/bindings/iio/magnetometer/asahi-kasei,ak8975.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/iio/magnetometer/asahi-kasei,ak8975.yaml b/Documentation/devicetree/bindings/iio/magnetometer/asahi-kasei,ak8975.yaml index 9790f75fc669..583cdd2fad7e 100644 --- a/Documentation/devicetree/bindings/iio/magnetometer/asahi-kasei,ak8975.yaml +++ b/Documentation/devicetree/bindings/iio/magnetometer/asahi-kasei,ak8975.yaml @@ -18,6 +18,7 @@ properties: - asahi-kasei,ak09911 - asahi-kasei,ak09912 - asahi-kasei,ak09916 + - asahi-kasei,ak09918 - enum: - ak8975 - ak8963 -- 2.46.0 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v2 2/3] dt-bindings: iio: imu: magnetometer: Add ak09118 2024-08-06 6:10 ` [PATCH v2 2/3] dt-bindings: iio: imu: magnetometer: Add ak09118 Barnabás Czémán @ 2024-08-06 16:00 ` Conor Dooley 2024-08-06 16:01 ` Conor Dooley 2024-08-07 6:03 ` Krzysztof Kozlowski 1 sibling, 1 reply; 14+ messages in thread From: Conor Dooley @ 2024-08-06 16:00 UTC (permalink / raw) To: Barnabás Czémán Cc: Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Albrieux, linux-iio, linux-kernel, devicetree, linux, Danila Tikhonov [-- Attachment #1: Type: text/plain, Size: 1206 bytes --] On Tue, Aug 06, 2024 at 08:10:19AM +0200, Barnabás Czémán wrote: > From: Danila Tikhonov <danila@jiaxyga.com> > > Document asahi-kasei,ak09918 compatible. Please explain what makes this device incompatible with those already in the binding and why a fallback is not suitable. Thanks, Conor. > > Signed-off-by: Danila Tikhonov <danila@jiaxyga.com> > Signed-off-by: Barnabás Czémán <barnabas.czeman@mainlining.org> > --- > .../devicetree/bindings/iio/magnetometer/asahi-kasei,ak8975.yaml | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/Documentation/devicetree/bindings/iio/magnetometer/asahi-kasei,ak8975.yaml b/Documentation/devicetree/bindings/iio/magnetometer/asahi-kasei,ak8975.yaml > index 9790f75fc669..583cdd2fad7e 100644 > --- a/Documentation/devicetree/bindings/iio/magnetometer/asahi-kasei,ak8975.yaml > +++ b/Documentation/devicetree/bindings/iio/magnetometer/asahi-kasei,ak8975.yaml > @@ -18,6 +18,7 @@ properties: > - asahi-kasei,ak09911 > - asahi-kasei,ak09912 > - asahi-kasei,ak09916 > + - asahi-kasei,ak09918 > - enum: > - ak8975 > - ak8963 > > -- > 2.46.0 > [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 2/3] dt-bindings: iio: imu: magnetometer: Add ak09118 2024-08-06 16:00 ` Conor Dooley @ 2024-08-06 16:01 ` Conor Dooley 0 siblings, 0 replies; 14+ messages in thread From: Conor Dooley @ 2024-08-06 16:01 UTC (permalink / raw) To: Barnabás Czémán Cc: Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Albrieux, linux-iio, linux-kernel, devicetree, linux, Danila Tikhonov [-- Attachment #1: Type: text/plain, Size: 555 bytes --] On Tue, Aug 06, 2024 at 05:00:44PM +0100, Conor Dooley wrote: > On Tue, Aug 06, 2024 at 08:10:19AM +0200, Barnabás Czémán wrote: > > From: Danila Tikhonov <danila@jiaxyga.com> > > > > Document asahi-kasei,ak09918 compatible. > > Please explain what makes this device incompatible with those already in > the binding and why a fallback is not suitable. From the driver patch: | Add additional AK09118 to the magnetometer driver which has the same | register mapping and scaling as the AK09112 device. Why isnt a fallback suitable here? [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 2/3] dt-bindings: iio: imu: magnetometer: Add ak09118 2024-08-06 6:10 ` [PATCH v2 2/3] dt-bindings: iio: imu: magnetometer: Add ak09118 Barnabás Czémán 2024-08-06 16:00 ` Conor Dooley @ 2024-08-07 6:03 ` Krzysztof Kozlowski 1 sibling, 0 replies; 14+ messages in thread From: Krzysztof Kozlowski @ 2024-08-07 6:03 UTC (permalink / raw) To: Barnabás Czémán, Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Albrieux Cc: linux-iio, linux-kernel, devicetree, linux, Danila Tikhonov On 06/08/2024 08:10, Barnabás Czémán wrote: > From: Danila Tikhonov <danila@jiaxyga.com> > > Document asahi-kasei,ak09918 compatible. > > Signed-off-by: Danila Tikhonov <danila@jiaxyga.com> > Signed-off-by: Barnabás Czémán <barnabas.czeman@mainlining.org> Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Best regards, Krzysztof ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v2 3/3] iio: magnetometer: ak8975: Add AK09118 support 2024-08-06 6:10 [PATCH v2 0/3] Add support for AK09918 Barnabás Czémán 2024-08-06 6:10 ` [PATCH v2 1/3] iio: magnetometer: ak8975: Fix reading for ak099xx sensors Barnabás Czémán 2024-08-06 6:10 ` [PATCH v2 2/3] dt-bindings: iio: imu: magnetometer: Add ak09118 Barnabás Czémán @ 2024-08-06 6:10 ` Barnabás Czémán 2024-08-06 16:26 ` Jonathan Cameron 2024-08-07 6:04 ` Krzysztof Kozlowski 2 siblings, 2 replies; 14+ messages in thread From: Barnabás Czémán @ 2024-08-06 6:10 UTC (permalink / raw) To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Albrieux Cc: linux-iio, linux-kernel, devicetree, linux, Barnabás Czémán, Danila Tikhonov From: Danila Tikhonov <danila@jiaxyga.com> Add additional AK09118 to the magnetometer driver which has the same register mapping and scaling as the AK09112 device. Signed-off-by: Danila Tikhonov <danila@jiaxyga.com> Signed-off-by: Barnabás Czémán <barnabas.czeman@mainlining.org> --- drivers/iio/magnetometer/Kconfig | 2 +- drivers/iio/magnetometer/ak8975.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/drivers/iio/magnetometer/Kconfig b/drivers/iio/magnetometer/Kconfig index cd2917d71904..8eb718f5e50f 100644 --- a/drivers/iio/magnetometer/Kconfig +++ b/drivers/iio/magnetometer/Kconfig @@ -39,7 +39,7 @@ config AK8975 select IIO_TRIGGERED_BUFFER help Say yes here to build support for Asahi Kasei AK8975, AK8963, - AK09911, AK09912 or AK09916 3-Axis Magnetometer. + AK09911, AK09912, AK09916 or AK09918 3-Axis Magnetometer. To compile this driver as a module, choose M here: the module will be called ak8975. diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c index 925d76062b3e..9871fea67ae3 100644 --- a/drivers/iio/magnetometer/ak8975.c +++ b/drivers/iio/magnetometer/ak8975.c @@ -78,6 +78,7 @@ */ #define AK09912_REG_WIA1 0x00 #define AK09912_REG_WIA2 0x01 +#define AK09918_DEVICE_ID 0x0C #define AK09916_DEVICE_ID 0x09 #define AK09912_DEVICE_ID 0x04 #define AK09911_DEVICE_ID 0x05 @@ -209,6 +210,7 @@ enum asahi_compass_chipset { AK09911, AK09912, AK09916, + AK09918, }; enum ak_ctrl_reg_addr { @@ -371,6 +373,31 @@ static const struct ak_def ak_def_array[] = { AK09912_REG_HXL, AK09912_REG_HYL, AK09912_REG_HZL}, + }, + [AK09918] = { + .type = AK09918, + .raw_to_gauss = ak09912_raw_to_gauss, + .range = 32752, + .ctrl_regs = { + AK09912_REG_ST1, + AK09912_REG_ST2, + AK09912_REG_CNTL2, + AK09912_REG_ASAX, + AK09912_MAX_REGS}, + .ctrl_masks = { + AK09912_REG_ST1_DRDY_MASK, + AK09912_REG_ST2_HOFL_MASK, + 0, + AK09912_REG_CNTL2_MODE_MASK}, + .ctrl_modes = { + AK09912_REG_CNTL_MODE_POWER_DOWN, + AK09912_REG_CNTL_MODE_ONCE, + AK09912_REG_CNTL_MODE_SELF_TEST, + AK09912_REG_CNTL_MODE_FUSE_ROM}, + .data_regs = { + AK09912_REG_HXL, + AK09912_REG_HYL, + AK09912_REG_HZL}, } }; @@ -452,6 +479,7 @@ static int ak8975_who_i_am(struct i2c_client *client, /* * Signature for each device: * Device | WIA1 | WIA2 + * AK09918 | DEVICE_ID_| AK09918_DEVICE_ID * AK09916 | DEVICE_ID_| AK09916_DEVICE_ID * AK09912 | DEVICE_ID | AK09912_DEVICE_ID * AK09911 | DEVICE_ID | AK09911_DEVICE_ID @@ -484,6 +512,10 @@ static int ak8975_who_i_am(struct i2c_client *client, if (wia_val[1] == AK09916_DEVICE_ID) return 0; break; + case AK09918: + if (wia_val[1] == AK09918_DEVICE_ID) + return 0; + break; default: dev_err(&client->dev, "Type %d unknown\n", type); } @@ -1066,6 +1098,7 @@ static const struct i2c_device_id ak8975_id[] = { {"ak09911", (kernel_ulong_t)&ak_def_array[AK09911] }, {"ak09912", (kernel_ulong_t)&ak_def_array[AK09912] }, {"ak09916", (kernel_ulong_t)&ak_def_array[AK09916] }, + {"ak09918", (kernel_ulong_t)&ak_def_array[AK09918] }, {} }; MODULE_DEVICE_TABLE(i2c, ak8975_id); @@ -1081,6 +1114,7 @@ static const struct of_device_id ak8975_of_match[] = { { .compatible = "ak09912", .data = &ak_def_array[AK09912] }, { .compatible = "asahi-kasei,ak09916", .data = &ak_def_array[AK09916] }, { .compatible = "ak09916", .data = &ak_def_array[AK09916] }, + { .compatible = "asahi-kasei,ak09918", .data = &ak_def_array[AK09918] }, {} }; MODULE_DEVICE_TABLE(of, ak8975_of_match); -- 2.46.0 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v2 3/3] iio: magnetometer: ak8975: Add AK09118 support 2024-08-06 6:10 ` [PATCH v2 3/3] iio: magnetometer: ak8975: Add AK09118 support Barnabás Czémán @ 2024-08-06 16:26 ` Jonathan Cameron 2024-08-07 6:04 ` Krzysztof Kozlowski 1 sibling, 0 replies; 14+ messages in thread From: Jonathan Cameron @ 2024-08-06 16:26 UTC (permalink / raw) To: Barnabás Czémán Cc: Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Albrieux, linux-iio, linux-kernel, devicetree, linux, Danila Tikhonov On Tue, 06 Aug 2024 08:10:20 +0200 Barnabás Czémán <barnabas.czeman@mainlining.org> wrote: > From: Danila Tikhonov <danila@jiaxyga.com> > > Add additional AK09118 to the magnetometer driver which has the same > register mapping and scaling as the AK09112 device. > > Signed-off-by: Danila Tikhonov <danila@jiaxyga.com> > Signed-off-by: Barnabás Czémán <barnabas.czeman@mainlining.org> It definitely seems like a fallback compatible is suitable, but we will still want the more precise match in the driver so that we can avoid printing an info message to say we saw an unexpected ID. Comments on that inline. > --- > drivers/iio/magnetometer/Kconfig | 2 +- > drivers/iio/magnetometer/ak8975.c | 34 ++++++++++++++++++++++++++++++++++ > 2 files changed, 35 insertions(+), 1 deletion(-) > > diff --git a/drivers/iio/magnetometer/Kconfig b/drivers/iio/magnetometer/Kconfig > index cd2917d71904..8eb718f5e50f 100644 > --- a/drivers/iio/magnetometer/Kconfig > +++ b/drivers/iio/magnetometer/Kconfig > @@ -39,7 +39,7 @@ config AK8975 > select IIO_TRIGGERED_BUFFER > help > Say yes here to build support for Asahi Kasei AK8975, AK8963, > - AK09911, AK09912 or AK09916 3-Axis Magnetometer. > + AK09911, AK09912, AK09916 or AK09918 3-Axis Magnetometer. > > To compile this driver as a module, choose M here: the module > will be called ak8975. > diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c > index 925d76062b3e..9871fea67ae3 100644 > --- a/drivers/iio/magnetometer/ak8975.c > +++ b/drivers/iio/magnetometer/ak8975.c > @@ -78,6 +78,7 @@ > */ > #define AK09912_REG_WIA1 0x00 > #define AK09912_REG_WIA2 0x01 > +#define AK09918_DEVICE_ID 0x0C > #define AK09916_DEVICE_ID 0x09 > #define AK09912_DEVICE_ID 0x04 > #define AK09911_DEVICE_ID 0x05 > @@ -209,6 +210,7 @@ enum asahi_compass_chipset { > AK09911, > AK09912, > AK09916, > + AK09918, > }; > > enum ak_ctrl_reg_addr { > @@ -371,6 +373,31 @@ static const struct ak_def ak_def_array[] = { > AK09912_REG_HXL, > AK09912_REG_HYL, > AK09912_REG_HZL}, > + }, > + [AK09918] = { > + .type = AK09918, > + .raw_to_gauss = ak09912_raw_to_gauss, > + .range = 32752, > + .ctrl_regs = { > + AK09912_REG_ST1, > + AK09912_REG_ST2, > + AK09912_REG_CNTL2, > + AK09912_REG_ASAX, > + AK09912_MAX_REGS}, > + .ctrl_masks = { > + AK09912_REG_ST1_DRDY_MASK, > + AK09912_REG_ST2_HOFL_MASK, > + 0, > + AK09912_REG_CNTL2_MODE_MASK}, > + .ctrl_modes = { > + AK09912_REG_CNTL_MODE_POWER_DOWN, > + AK09912_REG_CNTL_MODE_ONCE, > + AK09912_REG_CNTL_MODE_SELF_TEST, > + AK09912_REG_CNTL_MODE_FUSE_ROM}, > + .data_regs = { > + AK09912_REG_HXL, > + AK09912_REG_HYL, > + AK09912_REG_HZL}, > } > }; > > @@ -452,6 +479,7 @@ static int ak8975_who_i_am(struct i2c_client *client, > /* > * Signature for each device: > * Device | WIA1 | WIA2 > + * AK09918 | DEVICE_ID_| AK09918_DEVICE_ID > * AK09916 | DEVICE_ID_| AK09916_DEVICE_ID > * AK09912 | DEVICE_ID | AK09912_DEVICE_ID > * AK09911 | DEVICE_ID | AK09911_DEVICE_ID > @@ -484,6 +512,10 @@ static int ak8975_who_i_am(struct i2c_client *client, > if (wia_val[1] == AK09916_DEVICE_ID) > return 0; > break; > + case AK09918: > + if (wia_val[1] == AK09918_DEVICE_ID) > + return 0; > + break; Whilst you are changing this code, please make it accept an unknown ID with at most a dev_info() print. We used to get this wrong in IIO, but this flexibility in matching Who Am I values is necessary to enable fallback compatibles in DT. Those allow you to use a newer DT with an older driver. It will use the fallback ID to probe, so will get the ak09912 who am I value and fail to probe currently. We want it to succeed if they are completely compatible other than this ID. > default: > dev_err(&client->dev, "Type %d unknown\n", type); > } > @@ -1066,6 +1098,7 @@ static const struct i2c_device_id ak8975_id[] = { > {"ak09911", (kernel_ulong_t)&ak_def_array[AK09911] }, > {"ak09912", (kernel_ulong_t)&ak_def_array[AK09912] }, > {"ak09916", (kernel_ulong_t)&ak_def_array[AK09916] }, > + {"ak09918", (kernel_ulong_t)&ak_def_array[AK09918] }, > {} > }; > MODULE_DEVICE_TABLE(i2c, ak8975_id); > @@ -1081,6 +1114,7 @@ static const struct of_device_id ak8975_of_match[] = { > { .compatible = "ak09912", .data = &ak_def_array[AK09912] }, > { .compatible = "asahi-kasei,ak09916", .data = &ak_def_array[AK09916] }, > { .compatible = "ak09916", .data = &ak_def_array[AK09916] }, > + { .compatible = "asahi-kasei,ak09918", .data = &ak_def_array[AK09918] }, > {} > }; > MODULE_DEVICE_TABLE(of, ak8975_of_match); > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 3/3] iio: magnetometer: ak8975: Add AK09118 support 2024-08-06 6:10 ` [PATCH v2 3/3] iio: magnetometer: ak8975: Add AK09118 support Barnabás Czémán 2024-08-06 16:26 ` Jonathan Cameron @ 2024-08-07 6:04 ` Krzysztof Kozlowski 2024-08-12 14:26 ` Barnabás Czémán 1 sibling, 1 reply; 14+ messages in thread From: Krzysztof Kozlowski @ 2024-08-07 6:04 UTC (permalink / raw) To: Barnabás Czémán, Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Albrieux Cc: linux-iio, linux-kernel, devicetree, linux, Danila Tikhonov On 06/08/2024 08:10, Barnabás Czémán wrote: > }; > MODULE_DEVICE_TABLE(i2c, ak8975_id); > @@ -1081,6 +1114,7 @@ static const struct of_device_id ak8975_of_match[] = { > { .compatible = "ak09912", .data = &ak_def_array[AK09912] }, > { .compatible = "asahi-kasei,ak09916", .data = &ak_def_array[AK09916] }, > { .compatible = "ak09916", .data = &ak_def_array[AK09916] }, > + { .compatible = "asahi-kasei,ak09918", .data = &ak_def_array[AK09918] }, I think you might need to rebase on top of Jonathan's branches... Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Best regards, Krzysztof ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 3/3] iio: magnetometer: ak8975: Add AK09118 support 2024-08-07 6:04 ` Krzysztof Kozlowski @ 2024-08-12 14:26 ` Barnabás Czémán 0 siblings, 0 replies; 14+ messages in thread From: Barnabás Czémán @ 2024-08-12 14:26 UTC (permalink / raw) To: Krzysztof Kozlowski, Jonathan Cameron, Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Albrieux Cc: linux-iio, linux-kernel, devicetree, linux, Danila Tikhonov On August 7, 2024 8:04:19 AM GMT+02:00, Krzysztof Kozlowski <krzk@kernel.org> wrote: >On 06/08/2024 08:10, Barnabás Czémán wrote: >> }; >> MODULE_DEVICE_TABLE(i2c, ak8975_id); >> @@ -1081,6 +1114,7 @@ static const struct of_device_id ak8975_of_match[] = { >> { .compatible = "ak09912", .data = &ak_def_array[AK09912] }, >> { .compatible = "asahi-kasei,ak09916", .data = &ak_def_array[AK09916] }, >> { .compatible = "ak09916", .data = &ak_def_array[AK09916] }, >> + { .compatible = "asahi-kasei,ak09918", .data = &ak_def_array[AK09918] }, > >I think you might need to rebase on top of Jonathan's branches... > Which barnch? >Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> > >Best regards, >Krzysztof > ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2024-08-12 14:26 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-08-06 6:10 [PATCH v2 0/3] Add support for AK09918 Barnabás Czémán 2024-08-06 6:10 ` [PATCH v2 1/3] iio: magnetometer: ak8975: Fix reading for ak099xx sensors Barnabás Czémán 2024-08-06 16:19 ` Jonathan Cameron 2024-08-06 17:54 ` Barnabás Czémán 2024-08-10 10:27 ` Jonathan Cameron 2024-08-07 15:15 ` barnabas.czeman 2024-08-06 6:10 ` [PATCH v2 2/3] dt-bindings: iio: imu: magnetometer: Add ak09118 Barnabás Czémán 2024-08-06 16:00 ` Conor Dooley 2024-08-06 16:01 ` Conor Dooley 2024-08-07 6:03 ` Krzysztof Kozlowski 2024-08-06 6:10 ` [PATCH v2 3/3] iio: magnetometer: ak8975: Add AK09118 support Barnabás Czémán 2024-08-06 16:26 ` Jonathan Cameron 2024-08-07 6:04 ` Krzysztof Kozlowski 2024-08-12 14:26 ` Barnabás Czémán
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox