iio: magnetometer: ak8975: Add AK09118 support
authorDanila Tikhonov <danila@jiaxyga.com>
Sun, 18 Aug 2024 22:29:42 +0000 (00:29 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Tue, 3 Sep 2024 17:49:43 +0000 (18:49 +0100)
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>
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Signed-off-by: Barnabás Czémán <barnabas.czeman@mainlining.org>
Link: https://patch.msgid.link/20240819-ak09918-v4-4-f0734d14cfb9@mainlining.org
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/magnetometer/Kconfig
drivers/iio/magnetometer/ak8975.c

index cd2917d719047bf81384bc3048c052f8368a67f2..8eb718f5e50f3591082d33618b680ea22608fde8 100644 (file)
@@ -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.
index 1d5f79b7005bd412f11529e5f5d9ee2f5708bfff..18077fb463a9127c35eb1d8ab9654c69ec285c4a 100644 (file)
@@ -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,34 @@ static const struct ak_def ak_def_array[] = {
                        AK09912_REG_HXL,
                        AK09912_REG_HYL,
                        AK09912_REG_HZL},
+       },
+       [AK09918] = {
+               /* ak09918 is register compatible with ak09912 this is for avoid
+                * unknown id messages.
+                */
+               .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 +482,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 +515,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;
        }
 
        dev_info(&client->dev, "Device ID %x is unknown.\n", wia_val[1]);
@@ -1071,6 +1106,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);
@@ -1085,6 +1121,7 @@ static const struct of_device_id ak8975_of_match[] = {
        { .compatible = "asahi-kasei,ak09912", .data = &ak_def_array[AK09912] },
        { .compatible = "ak09912", .data = &ak_def_array[AK09912] },
        { .compatible = "asahi-kasei,ak09916", .data = &ak_def_array[AK09916] },
+       { .compatible = "asahi-kasei,ak09918", .data = &ak_def_array[AK09918] },
        {}
 };
 MODULE_DEVICE_TABLE(of, ak8975_of_match);