diff mbox series

[v2,3/3] iio: magnetometer: ak8975: Add AK09118 support

Message ID 20240806-ak09918-v2-3-c300da66c198@mainlining.org (mailing list archive)
State Changes Requested
Headers show
Series Add support for AK09918 | expand

Commit Message

Barnabás Czémán Aug. 6, 2024, 6:10 a.m. UTC
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(-)

Comments

Jonathan Cameron Aug. 6, 2024, 4:26 p.m. UTC | #1
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);
>
Krzysztof Kozlowski Aug. 7, 2024, 6:04 a.m. UTC | #2
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
Barnabás Czémán Aug. 12, 2024, 2:26 p.m. UTC | #3
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
>
diff mbox series

Patch

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);