^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * A sensor driver for the magnetometer AK8975.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Magnetic compass sensor driver for monitoring magnetic flux information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (c) 2010, NVIDIA Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/mod_devicetable.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/bitops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/gpio/consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/regulator/consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/pm_runtime.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/iio/iio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/iio/sysfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/iio/buffer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/iio/trigger.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/iio/trigger_consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/iio/triggered_buffer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * Register definitions, as well as various shifts and masks to get at the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * individual fields of the registers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define AK8975_REG_WIA 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define AK8975_DEVICE_ID 0x48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define AK8975_REG_INFO 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define AK8975_REG_ST1 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define AK8975_REG_ST1_DRDY_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define AK8975_REG_ST1_DRDY_MASK (1 << AK8975_REG_ST1_DRDY_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define AK8975_REG_HXL 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define AK8975_REG_HXH 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define AK8975_REG_HYL 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define AK8975_REG_HYH 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define AK8975_REG_HZL 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define AK8975_REG_HZH 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define AK8975_REG_ST2 0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define AK8975_REG_ST2_DERR_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define AK8975_REG_ST2_DERR_MASK (1 << AK8975_REG_ST2_DERR_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define AK8975_REG_ST2_HOFL_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define AK8975_REG_ST2_HOFL_MASK (1 << AK8975_REG_ST2_HOFL_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define AK8975_REG_CNTL 0x0A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define AK8975_REG_CNTL_MODE_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define AK8975_REG_CNTL_MODE_MASK (0xF << AK8975_REG_CNTL_MODE_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define AK8975_REG_CNTL_MODE_POWER_DOWN 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define AK8975_REG_CNTL_MODE_ONCE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define AK8975_REG_CNTL_MODE_SELF_TEST 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define AK8975_REG_CNTL_MODE_FUSE_ROM 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define AK8975_REG_RSVC 0x0B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define AK8975_REG_ASTC 0x0C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define AK8975_REG_TS1 0x0D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define AK8975_REG_TS2 0x0E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define AK8975_REG_I2CDIS 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define AK8975_REG_ASAX 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define AK8975_REG_ASAY 0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define AK8975_REG_ASAZ 0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define AK8975_MAX_REGS AK8975_REG_ASAZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * AK09912 Register definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define AK09912_REG_WIA1 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define AK09912_REG_WIA2 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define AK09912_DEVICE_ID 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define AK09911_DEVICE_ID 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define AK09911_REG_INFO1 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define AK09911_REG_INFO2 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define AK09912_REG_ST1 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define AK09912_REG_ST1_DRDY_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define AK09912_REG_ST1_DRDY_MASK (1 << AK09912_REG_ST1_DRDY_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define AK09912_REG_HXL 0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define AK09912_REG_HXH 0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define AK09912_REG_HYL 0x13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define AK09912_REG_HYH 0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define AK09912_REG_HZL 0x15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define AK09912_REG_HZH 0x16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define AK09912_REG_TMPS 0x17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define AK09912_REG_ST2 0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define AK09912_REG_ST2_HOFL_SHIFT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define AK09912_REG_ST2_HOFL_MASK (1 << AK09912_REG_ST2_HOFL_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define AK09912_REG_CNTL1 0x30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define AK09912_REG_CNTL2 0x31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define AK09912_REG_CNTL_MODE_POWER_DOWN 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define AK09912_REG_CNTL_MODE_ONCE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define AK09912_REG_CNTL_MODE_SELF_TEST 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define AK09912_REG_CNTL_MODE_FUSE_ROM 0x1F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define AK09912_REG_CNTL2_MODE_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define AK09912_REG_CNTL2_MODE_MASK (0x1F << AK09912_REG_CNTL2_MODE_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define AK09912_REG_CNTL3 0x32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define AK09912_REG_TS1 0x33
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define AK09912_REG_TS2 0x34
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define AK09912_REG_TS3 0x35
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define AK09912_REG_I2CDIS 0x36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define AK09912_REG_TS4 0x37
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define AK09912_REG_ASAX 0x60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define AK09912_REG_ASAY 0x61
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define AK09912_REG_ASAZ 0x62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define AK09912_MAX_REGS AK09912_REG_ASAZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) * Miscellaneous values.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define AK8975_MAX_CONVERSION_TIMEOUT 500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define AK8975_CONVERSION_DONE_POLL_TIME 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define AK8975_DATA_READY_TIMEOUT ((100*HZ)/1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) * Precalculate scale factor (in Gauss units) for each axis and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) * store in the device data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) * This scale factor is axis-dependent, and is derived from 3 calibration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) * factors ASA(x), ASA(y), and ASA(z).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) * These ASA values are read from the sensor device at start of day, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) * cached in the device context struct.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) * Adjusting the flux value with the sensitivity adjustment value should be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) * done via the following formula:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) * Hadj = H * ( ( ( (ASA-128)*0.5 ) / 128 ) + 1 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * where H is the raw value, ASA is the sensitivity adjustment, and Hadj
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) * is the resultant adjusted value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) * We reduce the formula to:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) * Hadj = H * (ASA + 128) / 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) * H is in the range of -4096 to 4095. The magnetometer has a range of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) * +-1229uT. To go from the raw value to uT is:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) * HuT = H * 1229/4096, or roughly, 3/10.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) * Since 1uT = 0.01 gauss, our final scale factor becomes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * Hadj = H * ((ASA + 128) / 256) * 3/10 * 1/100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * Hadj = H * ((ASA + 128) * 0.003) / 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) * Since ASA doesn't change, we cache the resultant scale factor into the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) * device context in ak8975_setup().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) * Given we use IIO_VAL_INT_PLUS_MICRO bit when displaying the scale, we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) * multiply the stored scale value by 1e6.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) static long ak8975_raw_to_gauss(u16 data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) return (((long)data + 128) * 3000) / 256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) * For AK8963 and AK09911, same calculation, but the device is less sensitive:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) * H is in the range of +-8190. The magnetometer has a range of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) * +-4912uT. To go from the raw value to uT is:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) * HuT = H * 4912/8190, or roughly, 6/10, instead of 3/10.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) static long ak8963_09911_raw_to_gauss(u16 data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) return (((long)data + 128) * 6000) / 256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) * For AK09912, same calculation, except the device is more sensitive:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) * H is in the range of -32752 to 32752. The magnetometer has a range of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) * +-4912uT. To go from the raw value to uT is:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) * HuT = H * 4912/32752, or roughly, 3/20, instead of 3/10.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) static long ak09912_raw_to_gauss(u16 data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) return (((long)data + 128) * 1500) / 256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) /* Compatible Asahi Kasei Compass parts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) enum asahi_compass_chipset {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) AKXXXX = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) AK8975,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) AK8963,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) AK09911,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) AK09912,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) enum ak_ctrl_reg_addr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) ST1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) ST2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) CNTL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) ASA_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) MAX_REGS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) REGS_END,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) enum ak_ctrl_reg_mask {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) ST1_DRDY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) ST2_HOFL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) ST2_DERR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) CNTL_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) MASK_END,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) enum ak_ctrl_mode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) POWER_DOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) MODE_ONCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) SELF_TEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) FUSE_ROM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) MODE_END,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) struct ak_def {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) enum asahi_compass_chipset type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) long (*raw_to_gauss)(u16 data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) u16 range;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) u8 ctrl_regs[REGS_END];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) u8 ctrl_masks[MASK_END];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) u8 ctrl_modes[MODE_END];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) u8 data_regs[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) static const struct ak_def ak_def_array[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) .type = AK8975,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) .raw_to_gauss = ak8975_raw_to_gauss,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) .range = 4096,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) .ctrl_regs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) AK8975_REG_ST1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) AK8975_REG_ST2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) AK8975_REG_CNTL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) AK8975_REG_ASAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) AK8975_MAX_REGS},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) .ctrl_masks = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) AK8975_REG_ST1_DRDY_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) AK8975_REG_ST2_HOFL_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) AK8975_REG_ST2_DERR_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) AK8975_REG_CNTL_MODE_MASK},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) .ctrl_modes = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) AK8975_REG_CNTL_MODE_POWER_DOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) AK8975_REG_CNTL_MODE_ONCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) AK8975_REG_CNTL_MODE_SELF_TEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) AK8975_REG_CNTL_MODE_FUSE_ROM},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) .data_regs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) AK8975_REG_HXL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) AK8975_REG_HYL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) AK8975_REG_HZL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) .type = AK8963,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) .raw_to_gauss = ak8963_09911_raw_to_gauss,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) .range = 8190,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) .ctrl_regs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) AK8975_REG_ST1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) AK8975_REG_ST2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) AK8975_REG_CNTL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) AK8975_REG_ASAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) AK8975_MAX_REGS},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) .ctrl_masks = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) AK8975_REG_ST1_DRDY_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) AK8975_REG_ST2_HOFL_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) AK8975_REG_CNTL_MODE_MASK},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) .ctrl_modes = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) AK8975_REG_CNTL_MODE_POWER_DOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) AK8975_REG_CNTL_MODE_ONCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) AK8975_REG_CNTL_MODE_SELF_TEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) AK8975_REG_CNTL_MODE_FUSE_ROM},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) .data_regs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) AK8975_REG_HXL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) AK8975_REG_HYL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) AK8975_REG_HZL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) .type = AK09911,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) .raw_to_gauss = ak8963_09911_raw_to_gauss,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) .range = 8192,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) .ctrl_regs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) AK09912_REG_ST1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) AK09912_REG_ST2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) AK09912_REG_CNTL2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) AK09912_REG_ASAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) AK09912_MAX_REGS},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) .ctrl_masks = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) AK09912_REG_ST1_DRDY_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) AK09912_REG_ST2_HOFL_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) AK09912_REG_CNTL2_MODE_MASK},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) .ctrl_modes = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) AK09912_REG_CNTL_MODE_POWER_DOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) AK09912_REG_CNTL_MODE_ONCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) AK09912_REG_CNTL_MODE_SELF_TEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) AK09912_REG_CNTL_MODE_FUSE_ROM},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) .data_regs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) AK09912_REG_HXL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) AK09912_REG_HYL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) AK09912_REG_HZL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) .type = AK09912,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) .raw_to_gauss = ak09912_raw_to_gauss,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) .range = 32752,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) .ctrl_regs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) AK09912_REG_ST1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) AK09912_REG_ST2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) AK09912_REG_CNTL2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) AK09912_REG_ASAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) AK09912_MAX_REGS},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) .ctrl_masks = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) AK09912_REG_ST1_DRDY_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) AK09912_REG_ST2_HOFL_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) AK09912_REG_CNTL2_MODE_MASK},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) .ctrl_modes = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) AK09912_REG_CNTL_MODE_POWER_DOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) AK09912_REG_CNTL_MODE_ONCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) AK09912_REG_CNTL_MODE_SELF_TEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) AK09912_REG_CNTL_MODE_FUSE_ROM},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) .data_regs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) AK09912_REG_HXL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) AK09912_REG_HYL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) AK09912_REG_HZL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) * Per-instance context data for the device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) struct ak8975_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) const struct ak_def *def;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) struct mutex lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) u8 asa[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) long raw_to_gauss[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) struct gpio_desc *eoc_gpiod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) struct gpio_desc *reset_gpiod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) int eoc_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) wait_queue_head_t data_ready_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) u8 cntl_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) struct iio_mount_matrix orientation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) struct regulator *vdd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) struct regulator *vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) /* Ensure natural alignment of timestamp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) s16 channels[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) s64 ts __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) } scan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) /* Enable attached power regulator if any. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) static int ak8975_power_on(const struct ak8975_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) ret = regulator_enable(data->vdd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) dev_warn(&data->client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) "Failed to enable specified Vdd supply\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) ret = regulator_enable(data->vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) dev_warn(&data->client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) "Failed to enable specified Vid supply\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) gpiod_set_value_cansleep(data->reset_gpiod, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) * According to the datasheet the power supply rise time is 200us
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) * and the minimum wait time before mode setting is 100us, in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) * total 300us. Add some margin and say minimum 500us here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) usleep_range(500, 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) /* Disable attached power regulator if any. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) static void ak8975_power_off(const struct ak8975_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) gpiod_set_value_cansleep(data->reset_gpiod, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) regulator_disable(data->vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) regulator_disable(data->vdd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) * Return 0 if the i2c device is the one we expect.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) * return a negative error number otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) static int ak8975_who_i_am(struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) enum asahi_compass_chipset type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) u8 wia_val[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) * Signature for each device:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) * Device | WIA1 | WIA2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) * AK09912 | DEVICE_ID | AK09912_DEVICE_ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) * AK09911 | DEVICE_ID | AK09911_DEVICE_ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) * AK8975 | DEVICE_ID | NA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) * AK8963 | DEVICE_ID | NA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) ret = i2c_smbus_read_i2c_block_data_or_emulated(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) client, AK09912_REG_WIA1, 2, wia_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) dev_err(&client->dev, "Error reading WIA\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) if (wia_val[0] != AK8975_DEVICE_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) case AK8975:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) case AK8963:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) case AK09911:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) if (wia_val[1] == AK09911_DEVICE_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) case AK09912:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) if (wia_val[1] == AK09912_DEVICE_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) dev_err(&client->dev, "Type %d unknown\n", type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) * Helper function to write to CNTL register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) static int ak8975_set_mode(struct ak8975_data *data, enum ak_ctrl_mode mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) u8 regval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) regval = (data->cntl_cache & ~data->def->ctrl_masks[CNTL_MODE]) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) data->def->ctrl_modes[mode];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) ret = i2c_smbus_write_byte_data(data->client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) data->def->ctrl_regs[CNTL], regval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) data->cntl_cache = regval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) /* After mode change wait atleast 100us */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) usleep_range(100, 500);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) * Handle data ready irq
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) static irqreturn_t ak8975_irq_handler(int irq, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) struct ak8975_data *ak8975 = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) set_bit(0, &ak8975->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) wake_up(&ak8975->data_ready_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) * Install data ready interrupt handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) static int ak8975_setup_irq(struct ak8975_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) int irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) init_waitqueue_head(&data->data_ready_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) clear_bit(0, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) if (client->irq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) irq = client->irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) irq = gpiod_to_irq(data->eoc_gpiod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) rc = devm_request_irq(&client->dev, irq, ak8975_irq_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) IRQF_TRIGGER_RISING | IRQF_ONESHOT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) dev_name(&client->dev), data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) if (rc < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) dev_err(&client->dev, "irq %d request failed: %d\n", irq, rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) data->eoc_irq = irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) * Perform some start-of-day setup, including reading the asa calibration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) * values and caching them.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) static int ak8975_setup(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) struct iio_dev *indio_dev = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) struct ak8975_data *data = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) /* Write the fused rom access mode. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) ret = ak8975_set_mode(data, FUSE_ROM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) dev_err(&client->dev, "Error in setting fuse access mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) /* Get asa data and store in the device data. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) ret = i2c_smbus_read_i2c_block_data_or_emulated(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) client, data->def->ctrl_regs[ASA_BASE],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 3, data->asa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) dev_err(&client->dev, "Not able to read asa data\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) /* After reading fuse ROM data set power-down mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) ret = ak8975_set_mode(data, POWER_DOWN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) dev_err(&client->dev, "Error in setting power-down mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) if (data->eoc_gpiod || client->irq > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) ret = ak8975_setup_irq(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) dev_err(&client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) "Error setting data ready interrupt\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) data->raw_to_gauss[0] = data->def->raw_to_gauss(data->asa[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) data->raw_to_gauss[1] = data->def->raw_to_gauss(data->asa[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) data->raw_to_gauss[2] = data->def->raw_to_gauss(data->asa[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) static int wait_conversion_complete_gpio(struct ak8975_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) u32 timeout_ms = AK8975_MAX_CONVERSION_TIMEOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) /* Wait for the conversion to complete. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) while (timeout_ms) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) msleep(AK8975_CONVERSION_DONE_POLL_TIME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) if (gpiod_get_value(data->eoc_gpiod))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) timeout_ms -= AK8975_CONVERSION_DONE_POLL_TIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) if (!timeout_ms) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) dev_err(&client->dev, "Conversion timeout happened\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) ret = i2c_smbus_read_byte_data(client, data->def->ctrl_regs[ST1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) dev_err(&client->dev, "Error in reading ST1\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) static int wait_conversion_complete_polled(struct ak8975_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) u8 read_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) u32 timeout_ms = AK8975_MAX_CONVERSION_TIMEOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) /* Wait for the conversion to complete. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) while (timeout_ms) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) msleep(AK8975_CONVERSION_DONE_POLL_TIME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) ret = i2c_smbus_read_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) data->def->ctrl_regs[ST1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) dev_err(&client->dev, "Error in reading ST1\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) read_status = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) if (read_status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) timeout_ms -= AK8975_CONVERSION_DONE_POLL_TIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) if (!timeout_ms) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) dev_err(&client->dev, "Conversion timeout happened\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) return read_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) /* Returns 0 if the end of conversion interrupt occured or -ETIME otherwise */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) static int wait_conversion_complete_interrupt(struct ak8975_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) ret = wait_event_timeout(data->data_ready_queue,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) test_bit(0, &data->flags),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) AK8975_DATA_READY_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) clear_bit(0, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) return ret > 0 ? 0 : -ETIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) static int ak8975_start_read_axis(struct ak8975_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) const struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) /* Set up the device for taking a sample. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) int ret = ak8975_set_mode(data, MODE_ONCE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) dev_err(&client->dev, "Error in setting operating mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) /* Wait for the conversion to complete. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) if (data->eoc_irq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) ret = wait_conversion_complete_interrupt(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) else if (data->eoc_gpiod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) ret = wait_conversion_complete_gpio(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) ret = wait_conversion_complete_polled(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) /* This will be executed only for non-interrupt based waiting case */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) if (ret & data->def->ctrl_masks[ST1_DRDY]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) ret = i2c_smbus_read_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) data->def->ctrl_regs[ST2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) dev_err(&client->dev, "Error in reading ST2\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) if (ret & (data->def->ctrl_masks[ST2_DERR] |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) data->def->ctrl_masks[ST2_HOFL])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) dev_err(&client->dev, "ST2 status error 0x%x\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) /* Retrieve raw flux value for one of the x, y, or z axis. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) struct ak8975_data *data = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) const struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) const struct ak_def *def = data->def;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) __le16 rval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) u16 buff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) pm_runtime_get_sync(&data->client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) ret = ak8975_start_read_axis(data, client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) ret = i2c_smbus_read_i2c_block_data_or_emulated(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) client, def->data_regs[index],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) sizeof(rval), (u8*)&rval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) pm_runtime_mark_last_busy(&data->client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) pm_runtime_put_autosuspend(&data->client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) /* Swap bytes and convert to valid range. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) buff = le16_to_cpu(rval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) *val = clamp_t(s16, buff, -def->range, def->range);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) return IIO_VAL_INT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) dev_err(&client->dev, "Error in reading axis\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) static int ak8975_read_raw(struct iio_dev *indio_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) struct iio_chan_spec const *chan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) int *val, int *val2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) long mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) struct ak8975_data *data = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) switch (mask) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) case IIO_CHAN_INFO_RAW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) return ak8975_read_axis(indio_dev, chan->address, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) case IIO_CHAN_INFO_SCALE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) *val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) *val2 = data->raw_to_gauss[chan->address];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) return IIO_VAL_INT_PLUS_MICRO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) static const struct iio_mount_matrix *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) ak8975_get_mount_matrix(const struct iio_dev *indio_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) const struct iio_chan_spec *chan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) struct ak8975_data *data = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) return &data->orientation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) static const struct iio_chan_spec_ext_info ak8975_ext_info[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) IIO_MOUNT_MATRIX(IIO_SHARED_BY_DIR, ak8975_get_mount_matrix),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) #define AK8975_CHANNEL(axis, index) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) .type = IIO_MAGN, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) .modified = 1, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) .channel2 = IIO_MOD_##axis, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) BIT(IIO_CHAN_INFO_SCALE), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) .address = index, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) .scan_index = index, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) .scan_type = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) .sign = 's', \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) .realbits = 16, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) .storagebits = 16, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) .endianness = IIO_CPU \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) }, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) .ext_info = ak8975_ext_info, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) static const struct iio_chan_spec ak8975_channels[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) AK8975_CHANNEL(X, 0), AK8975_CHANNEL(Y, 1), AK8975_CHANNEL(Z, 2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) IIO_CHAN_SOFT_TIMESTAMP(3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) static const unsigned long ak8975_scan_masks[] = { 0x7, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) static const struct iio_info ak8975_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) .read_raw = &ak8975_read_raw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) static const struct acpi_device_id ak_acpi_match[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) {"AK8975", AK8975},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) {"AK8963", AK8963},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) {"INVN6500", AK8963},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) {"AK009911", AK09911},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) {"AK09911", AK09911},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) {"AKM9911", AK09911},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) {"AK09912", AK09912},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) MODULE_DEVICE_TABLE(acpi, ak_acpi_match);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) static void ak8975_fill_buffer(struct iio_dev *indio_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) struct ak8975_data *data = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) const struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) const struct ak_def *def = data->def;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) __le16 fval[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) ret = ak8975_start_read_axis(data, client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) * For each axis, read the flux value from the appropriate register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) * (the register is specified in the iio device attributes).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) ret = i2c_smbus_read_i2c_block_data_or_emulated(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) def->data_regs[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) 3 * sizeof(fval[0]),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) (u8 *)fval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) /* Clamp to valid range. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) data->scan.channels[0] = clamp_t(s16, le16_to_cpu(fval[0]), -def->range, def->range);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) data->scan.channels[1] = clamp_t(s16, le16_to_cpu(fval[1]), -def->range, def->range);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) data->scan.channels[2] = clamp_t(s16, le16_to_cpu(fval[2]), -def->range, def->range);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) iio_get_time_ns(indio_dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) dev_err(&client->dev, "Error in reading axes block\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) static irqreturn_t ak8975_handle_trigger(int irq, void *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) const struct iio_poll_func *pf = p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) struct iio_dev *indio_dev = pf->indio_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) ak8975_fill_buffer(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) iio_trigger_notify_done(indio_dev->trig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) static int ak8975_probe(struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) const struct i2c_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) struct ak8975_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) struct iio_dev *indio_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) struct gpio_desc *eoc_gpiod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) struct gpio_desc *reset_gpiod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) const void *match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) enum asahi_compass_chipset chipset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) const char *name = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) * Grab and set up the supplied GPIO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) * We may not have a GPIO based IRQ to scan, that is fine, we will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) * poll if so.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) eoc_gpiod = devm_gpiod_get_optional(&client->dev, NULL, GPIOD_IN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) if (IS_ERR(eoc_gpiod))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) return PTR_ERR(eoc_gpiod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) if (eoc_gpiod)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) gpiod_set_consumer_name(eoc_gpiod, "ak_8975");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) * According to AK09911 datasheet, if reset GPIO is provided then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) * deassert reset on ak8975_power_on() and assert reset on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) * ak8975_power_off().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) reset_gpiod = devm_gpiod_get_optional(&client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) "reset", GPIOD_OUT_HIGH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) if (IS_ERR(reset_gpiod))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) return PTR_ERR(reset_gpiod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) /* Register with IIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) if (indio_dev == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) data = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) i2c_set_clientdata(client, indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) data->client = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) data->eoc_gpiod = eoc_gpiod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) data->reset_gpiod = reset_gpiod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) data->eoc_irq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) err = iio_read_mount_matrix(&client->dev, "mount-matrix", &data->orientation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) /* id will be NULL when enumerated via ACPI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) match = device_get_match_data(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) if (match) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) chipset = (enum asahi_compass_chipset)(match);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) name = dev_name(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) } else if (id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) chipset = (enum asahi_compass_chipset)(id->driver_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) name = id->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) for (i = 0; i < ARRAY_SIZE(ak_def_array); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) if (ak_def_array[i].type == chipset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) if (i == ARRAY_SIZE(ak_def_array)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) dev_err(&client->dev, "AKM device type unsupported: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) chipset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) data->def = &ak_def_array[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) /* Fetch the regulators */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) data->vdd = devm_regulator_get(&client->dev, "vdd");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) if (IS_ERR(data->vdd))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) return PTR_ERR(data->vdd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) data->vid = devm_regulator_get(&client->dev, "vid");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) if (IS_ERR(data->vid))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) return PTR_ERR(data->vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) err = ak8975_power_on(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) err = ak8975_who_i_am(client, data->def->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) dev_err(&client->dev, "Unexpected device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) goto power_off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) dev_dbg(&client->dev, "Asahi compass chip %s\n", name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) /* Perform some basic start-of-day setup of the device. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) err = ak8975_setup(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) dev_err(&client->dev, "%s initialization fails\n", name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) goto power_off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) mutex_init(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) indio_dev->channels = ak8975_channels;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) indio_dev->num_channels = ARRAY_SIZE(ak8975_channels);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) indio_dev->info = &ak8975_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) indio_dev->available_scan_masks = ak8975_scan_masks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) indio_dev->modes = INDIO_DIRECT_MODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) indio_dev->name = name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) err = iio_triggered_buffer_setup(indio_dev, NULL, ak8975_handle_trigger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) dev_err(&client->dev, "triggered buffer setup failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) goto power_off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) err = iio_device_register(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) dev_err(&client->dev, "device register failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) goto cleanup_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) /* Enable runtime PM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) pm_runtime_get_noresume(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) pm_runtime_set_active(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) pm_runtime_enable(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) * The device comes online in 500us, so add two orders of magnitude
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) * of delay before autosuspending: 50 ms.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) pm_runtime_set_autosuspend_delay(&client->dev, 50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) pm_runtime_use_autosuspend(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) pm_runtime_put(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) cleanup_buffer:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) iio_triggered_buffer_cleanup(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) power_off:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) ak8975_power_off(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) static int ak8975_remove(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) struct iio_dev *indio_dev = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) struct ak8975_data *data = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) pm_runtime_get_sync(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) pm_runtime_put_noidle(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) pm_runtime_disable(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) iio_device_unregister(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) iio_triggered_buffer_cleanup(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) ak8975_set_mode(data, POWER_DOWN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) ak8975_power_off(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) static int ak8975_runtime_suspend(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) struct i2c_client *client = to_i2c_client(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) struct iio_dev *indio_dev = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) struct ak8975_data *data = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) /* Set the device in power down if it wasn't already */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) ret = ak8975_set_mode(data, POWER_DOWN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) dev_err(&client->dev, "Error in setting power-down mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) /* Next cut the regulators */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) ak8975_power_off(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) static int ak8975_runtime_resume(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) struct i2c_client *client = to_i2c_client(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) struct iio_dev *indio_dev = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) struct ak8975_data *data = iio_priv(indio_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) /* Take up the regulators */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) ak8975_power_on(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) * We come up in powered down mode, the reading routines will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) * put us in the mode to read values later.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) ret = ak8975_set_mode(data, POWER_DOWN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) dev_err(&client->dev, "Error in setting power-down mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) #endif /* CONFIG_PM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) static const struct dev_pm_ops ak8975_dev_pm_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) pm_runtime_force_resume)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) SET_RUNTIME_PM_OPS(ak8975_runtime_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) ak8975_runtime_resume, NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) static const struct i2c_device_id ak8975_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) {"ak8975", AK8975},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) {"ak8963", AK8963},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) {"AK8963", AK8963},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) {"ak09911", AK09911},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) {"ak09912", AK09912},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) MODULE_DEVICE_TABLE(i2c, ak8975_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) static const struct of_device_id ak8975_of_match[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) { .compatible = "asahi-kasei,ak8975", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) { .compatible = "ak8975", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) { .compatible = "asahi-kasei,ak8963", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) { .compatible = "ak8963", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) { .compatible = "asahi-kasei,ak09911", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) { .compatible = "ak09911", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) { .compatible = "asahi-kasei,ak09912", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) { .compatible = "ak09912", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) MODULE_DEVICE_TABLE(of, ak8975_of_match);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) static struct i2c_driver ak8975_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) .name = "ak8975",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) .pm = &ak8975_dev_pm_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) .of_match_table = ak8975_of_match,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) .acpi_match_table = ak_acpi_match,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) .probe = ak8975_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) .remove = ak8975_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) .id_table = ak8975_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) module_i2c_driver(ak8975_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) MODULE_DESCRIPTION("AK8975 magnetometer driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) MODULE_LICENSE("GPL");