cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

yamaha-yas530.c (28919B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Driver for the Yamaha YAS magnetic sensors, often used in Samsung
      4 * mobile phones. While all are not yet handled because of lacking
      5 * hardware, expand this driver to handle the different variants:
      6 *
      7 * YAS530 MS-3E (2011 Samsung Galaxy S Advance)
      8 * YAS532 MS-3R (2011 Samsung Galaxy S4)
      9 * YAS533 MS-3F (Vivo 1633, 1707, V3, Y21L)
     10 * (YAS534 is a magnetic switch, not handled)
     11 * YAS535 MS-6C
     12 * YAS536 MS-3W
     13 * YAS537 MS-3T (2015 Samsung Galaxy S6, Note 5, Xiaomi)
     14 * YAS539 MS-3S (2018 Samsung Galaxy A7 SM-A750FN)
     15 *
     16 * Code functions found in the MPU3050 YAS530 and YAS532 drivers
     17 * named "inv_compass" in the Tegra Android kernel tree.
     18 * Copyright (C) 2012 InvenSense Corporation
     19 *
     20 * Author: Linus Walleij <linus.walleij@linaro.org>
     21 */
     22#include <linux/bitfield.h>
     23#include <linux/bitops.h>
     24#include <linux/delay.h>
     25#include <linux/err.h>
     26#include <linux/gpio/consumer.h>
     27#include <linux/i2c.h>
     28#include <linux/module.h>
     29#include <linux/mod_devicetable.h>
     30#include <linux/mutex.h>
     31#include <linux/pm_runtime.h>
     32#include <linux/regmap.h>
     33#include <linux/regulator/consumer.h>
     34#include <linux/random.h>
     35
     36#include <linux/iio/buffer.h>
     37#include <linux/iio/iio.h>
     38#include <linux/iio/trigger_consumer.h>
     39#include <linux/iio/triggered_buffer.h>
     40
     41#include <asm/unaligned.h>
     42
     43/* This register map covers YAS530 and YAS532 but differs in YAS 537 and YAS539 */
     44#define YAS5XX_DEVICE_ID		0x80
     45#define YAS5XX_ACTUATE_INIT_COIL	0x81
     46#define YAS5XX_MEASURE			0x82
     47#define YAS5XX_CONFIG			0x83
     48#define YAS5XX_MEASURE_INTERVAL		0x84
     49#define YAS5XX_OFFSET_X			0x85 /* [-31 .. 31] */
     50#define YAS5XX_OFFSET_Y1		0x86 /* [-31 .. 31] */
     51#define YAS5XX_OFFSET_Y2		0x87 /* [-31 .. 31] */
     52#define YAS5XX_TEST1			0x88
     53#define YAS5XX_TEST2			0x89
     54#define YAS5XX_CAL			0x90
     55#define YAS5XX_MEASURE_DATA		0xB0
     56
     57/* Bits in the YAS5xx config register */
     58#define YAS5XX_CONFIG_INTON		BIT(0) /* Interrupt on? */
     59#define YAS5XX_CONFIG_INTHACT		BIT(1) /* Interrupt active high? */
     60#define YAS5XX_CONFIG_CCK_MASK		GENMASK(4, 2)
     61#define YAS5XX_CONFIG_CCK_SHIFT		2
     62
     63/* Bits in the measure command register */
     64#define YAS5XX_MEASURE_START		BIT(0)
     65#define YAS5XX_MEASURE_LDTC		BIT(1)
     66#define YAS5XX_MEASURE_FORS		BIT(2)
     67#define YAS5XX_MEASURE_DLYMES		BIT(4)
     68
     69/* Bits in the measure data register */
     70#define YAS5XX_MEASURE_DATA_BUSY	BIT(7)
     71
     72#define YAS530_DEVICE_ID		0x01 /* YAS530 (MS-3E) */
     73#define YAS530_VERSION_A		0 /* YAS530 (MS-3E A) */
     74#define YAS530_VERSION_B		1 /* YAS530B (MS-3E B) */
     75#define YAS530_VERSION_A_COEF		380
     76#define YAS530_VERSION_B_COEF		550
     77#define YAS530_DATA_BITS		12
     78#define YAS530_DATA_CENTER		BIT(YAS530_DATA_BITS - 1)
     79#define YAS530_DATA_OVERFLOW		(BIT(YAS530_DATA_BITS) - 1)
     80
     81#define YAS532_DEVICE_ID		0x02 /* YAS532/YAS533 (MS-3R/F) */
     82#define YAS532_VERSION_AB		0 /* YAS532/533 AB (MS-3R/F AB) */
     83#define YAS532_VERSION_AC		1 /* YAS532/533 AC (MS-3R/F AC) */
     84#define YAS532_VERSION_AB_COEF		1800
     85#define YAS532_VERSION_AC_COEF_X	850
     86#define YAS532_VERSION_AC_COEF_Y1	750
     87#define YAS532_VERSION_AC_COEF_Y2	750
     88#define YAS532_DATA_BITS		13
     89#define YAS532_DATA_CENTER		BIT(YAS532_DATA_BITS - 1)
     90#define YAS532_DATA_OVERFLOW		(BIT(YAS532_DATA_BITS) - 1)
     91#define YAS532_20DEGREES		390 /* Looks like Kelvin */
     92
     93/* These variant IDs are known from code dumps */
     94#define YAS537_DEVICE_ID		0x07 /* YAS537 (MS-3T) */
     95#define YAS539_DEVICE_ID		0x08 /* YAS539 (MS-3S) */
     96
     97/* Turn off device regulators etc after 5 seconds of inactivity */
     98#define YAS5XX_AUTOSUSPEND_DELAY_MS	5000
     99
    100struct yas5xx_calibration {
    101	/* Linearization calibration x, y1, y2 */
    102	s32 r[3];
    103	u32 f[3];
    104	/* Temperature compensation calibration */
    105	s32 Cx, Cy1, Cy2;
    106	/* Misc calibration coefficients */
    107	s32 a2, a3, a4, a5, a6, a7, a8, a9, k;
    108	/* clock divider */
    109	u8 dck;
    110};
    111
    112/**
    113 * struct yas5xx - state container for the YAS5xx driver
    114 * @dev: parent device pointer
    115 * @devid: device ID number
    116 * @version: device version
    117 * @name: device name
    118 * @calibration: calibration settings from the OTP storage
    119 * @hard_offsets: offsets for each axis measured with initcoil actuated
    120 * @orientation: mounting matrix, flipped axis etc
    121 * @map: regmap to access the YAX5xx registers over I2C
    122 * @regs: the vdd and vddio power regulators
    123 * @reset: optional GPIO line used for handling RESET
    124 * @lock: locks the magnetometer for exclusive use during a measurement (which
    125 * involves several register transactions so the regmap lock is not enough)
    126 * so that measurements get serialized in a first-come-first serve manner
    127 * @scan: naturally aligned measurements
    128 */
    129struct yas5xx {
    130	struct device *dev;
    131	unsigned int devid;
    132	unsigned int version;
    133	char name[16];
    134	struct yas5xx_calibration calibration;
    135	u8 hard_offsets[3];
    136	struct iio_mount_matrix orientation;
    137	struct regmap *map;
    138	struct regulator_bulk_data regs[2];
    139	struct gpio_desc *reset;
    140	struct mutex lock;
    141	/*
    142	 * The scanout is 4 x 32 bits in CPU endianness.
    143	 * Ensure timestamp is naturally aligned
    144	 */
    145	struct {
    146		s32 channels[4];
    147		s64 ts __aligned(8);
    148	} scan;
    149};
    150
    151/* On YAS530 the x, y1 and y2 values are 12 bits */
    152static u16 yas530_extract_axis(u8 *data)
    153{
    154	u16 val;
    155
    156	/*
    157	 * These are the bits used in a 16bit word:
    158	 * 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
    159	 *    x  x  x  x  x  x  x  x  x  x  x  x
    160	 */
    161	val = get_unaligned_be16(&data[0]);
    162	val = FIELD_GET(GENMASK(14, 3), val);
    163	return val;
    164}
    165
    166/* On YAS532 the x, y1 and y2 values are 13 bits */
    167static u16 yas532_extract_axis(u8 *data)
    168{
    169	u16 val;
    170
    171	/*
    172	 * These are the bits used in a 16bit word:
    173	 * 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
    174	 *    x  x  x  x  x  x  x  x  x  x  x  x  x
    175	 */
    176	val = get_unaligned_be16(&data[0]);
    177	val = FIELD_GET(GENMASK(14, 2), val);
    178	return val;
    179}
    180
    181/**
    182 * yas5xx_measure() - Make a measure from the hardware
    183 * @yas5xx: The device state
    184 * @t: the raw temperature measurement
    185 * @x: the raw x axis measurement
    186 * @y1: the y1 axis measurement
    187 * @y2: the y2 axis measurement
    188 * @return: 0 on success or error code
    189 */
    190static int yas5xx_measure(struct yas5xx *yas5xx, u16 *t, u16 *x, u16 *y1, u16 *y2)
    191{
    192	unsigned int busy;
    193	u8 data[8];
    194	int ret;
    195	u16 val;
    196
    197	mutex_lock(&yas5xx->lock);
    198	ret = regmap_write(yas5xx->map, YAS5XX_MEASURE, YAS5XX_MEASURE_START);
    199	if (ret < 0)
    200		goto out_unlock;
    201
    202	/*
    203	 * Typical time to measure 1500 us, max 2000 us so wait min 500 us
    204	 * and at most 20000 us (one magnitude more than the datsheet max)
    205	 * before timeout.
    206	 */
    207	ret = regmap_read_poll_timeout(yas5xx->map, YAS5XX_MEASURE_DATA, busy,
    208				       !(busy & YAS5XX_MEASURE_DATA_BUSY),
    209				       500, 20000);
    210	if (ret) {
    211		dev_err(yas5xx->dev, "timeout waiting for measurement\n");
    212		goto out_unlock;
    213	}
    214
    215	ret = regmap_bulk_read(yas5xx->map, YAS5XX_MEASURE_DATA,
    216			       data, sizeof(data));
    217	if (ret)
    218		goto out_unlock;
    219
    220	mutex_unlock(&yas5xx->lock);
    221
    222	switch (yas5xx->devid) {
    223	case YAS530_DEVICE_ID:
    224		/*
    225		 * The t value is 9 bits in big endian format
    226		 * These are the bits used in a 16bit word:
    227		 * 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
    228		 *    x  x  x  x  x  x  x  x  x
    229		 */
    230		val = get_unaligned_be16(&data[0]);
    231		val = FIELD_GET(GENMASK(14, 6), val);
    232		*t = val;
    233		*x = yas530_extract_axis(&data[2]);
    234		*y1 = yas530_extract_axis(&data[4]);
    235		*y2 = yas530_extract_axis(&data[6]);
    236		break;
    237	case YAS532_DEVICE_ID:
    238		/*
    239		 * The t value is 10 bits in big endian format
    240		 * These are the bits used in a 16bit word:
    241		 * 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
    242		 *    x  x  x  x  x  x  x  x  x  x
    243		 */
    244		val = get_unaligned_be16(&data[0]);
    245		val = FIELD_GET(GENMASK(14, 5), val);
    246		*t = val;
    247		*x = yas532_extract_axis(&data[2]);
    248		*y1 = yas532_extract_axis(&data[4]);
    249		*y2 = yas532_extract_axis(&data[6]);
    250		break;
    251	default:
    252		dev_err(yas5xx->dev, "unknown data format\n");
    253		ret = -EINVAL;
    254		break;
    255	}
    256
    257	return ret;
    258
    259out_unlock:
    260	mutex_unlock(&yas5xx->lock);
    261	return ret;
    262}
    263
    264static s32 yas5xx_linearize(struct yas5xx *yas5xx, u16 val, int axis)
    265{
    266	struct yas5xx_calibration *c = &yas5xx->calibration;
    267	static const s32 yas532ac_coef[] = {
    268		YAS532_VERSION_AC_COEF_X,
    269		YAS532_VERSION_AC_COEF_Y1,
    270		YAS532_VERSION_AC_COEF_Y2,
    271	};
    272	s32 coef;
    273
    274	/* Select coefficients */
    275	switch (yas5xx->devid) {
    276	case YAS530_DEVICE_ID:
    277		if (yas5xx->version == YAS530_VERSION_A)
    278			coef = YAS530_VERSION_A_COEF;
    279		else
    280			coef = YAS530_VERSION_B_COEF;
    281		break;
    282	case YAS532_DEVICE_ID:
    283		if (yas5xx->version == YAS532_VERSION_AB)
    284			coef = YAS532_VERSION_AB_COEF;
    285		else
    286			/* Elaborate coefficients */
    287			coef = yas532ac_coef[axis];
    288		break;
    289	default:
    290		dev_err(yas5xx->dev, "unknown device type\n");
    291		return val;
    292	}
    293	/*
    294	 * Linearization formula:
    295	 *
    296	 * x' = x - (3721 + 50 * f) + (xoffset - r) * c
    297	 *
    298	 * Where f and r are calibration values, c is a per-device
    299	 * and sometimes per-axis coefficient.
    300	 */
    301	return val - (3721 + 50 * c->f[axis]) +
    302		(yas5xx->hard_offsets[axis] - c->r[axis]) * coef;
    303}
    304
    305/**
    306 * yas5xx_get_measure() - Measure a sample of all axis and process
    307 * @yas5xx: The device state
    308 * @to: Temperature out
    309 * @xo: X axis out
    310 * @yo: Y axis out
    311 * @zo: Z axis out
    312 * @return: 0 on success or error code
    313 *
    314 * Returned values are in nanotesla according to some code.
    315 */
    316static int yas5xx_get_measure(struct yas5xx *yas5xx, s32 *to, s32 *xo, s32 *yo, s32 *zo)
    317{
    318	struct yas5xx_calibration *c = &yas5xx->calibration;
    319	u16 t, x, y1, y2;
    320	/* These are "signed x, signed y1 etc */
    321	s32 sx, sy1, sy2, sy, sz;
    322	int ret;
    323
    324	/* We first get raw data that needs to be translated to [x,y,z] */
    325	ret = yas5xx_measure(yas5xx, &t, &x, &y1, &y2);
    326	if (ret)
    327		return ret;
    328
    329	/* Do some linearization if available */
    330	sx = yas5xx_linearize(yas5xx, x, 0);
    331	sy1 = yas5xx_linearize(yas5xx, y1, 1);
    332	sy2 = yas5xx_linearize(yas5xx, y2, 2);
    333
    334	/*
    335	 * Temperature compensation for x, y1, y2 respectively:
    336	 *
    337	 *          Cx * t
    338	 * x' = x - ------
    339	 *           100
    340	 */
    341	sx = sx - (c->Cx * t) / 100;
    342	sy1 = sy1 - (c->Cy1 * t) / 100;
    343	sy2 = sy2 - (c->Cy2 * t) / 100;
    344
    345	/*
    346	 * Break y1 and y2 into y and z, y1 and y2 are apparently encoding
    347	 * y and z.
    348	 */
    349	sy = sy1 - sy2;
    350	sz = -sy1 - sy2;
    351
    352	/*
    353	 * FIXME: convert to Celsius? Just guessing this is given
    354	 * as 1/10:s of degrees so multiply by 100 to get millicentigrades.
    355	 */
    356	*to = t * 100;
    357	/*
    358	 * Calibrate [x,y,z] with some formulas like this:
    359	 *
    360	 *            100 * x + a_2 * y + a_3 * z
    361	 *  x' = k *  ---------------------------
    362	 *                        10
    363	 *
    364	 *           a_4 * x + a_5 * y + a_6 * z
    365	 *  y' = k * ---------------------------
    366	 *                        10
    367	 *
    368	 *           a_7 * x + a_8 * y + a_9 * z
    369	 *  z' = k * ---------------------------
    370	 *                        10
    371	 */
    372	*xo = c->k * ((100 * sx + c->a2 * sy + c->a3 * sz) / 10);
    373	*yo = c->k * ((c->a4 * sx + c->a5 * sy + c->a6 * sz) / 10);
    374	*zo = c->k * ((c->a7 * sx + c->a8 * sy + c->a9 * sz) / 10);
    375
    376	return 0;
    377}
    378
    379static int yas5xx_read_raw(struct iio_dev *indio_dev,
    380			   struct iio_chan_spec const *chan,
    381			   int *val, int *val2,
    382			   long mask)
    383{
    384	struct yas5xx *yas5xx = iio_priv(indio_dev);
    385	s32 t, x, y, z;
    386	int ret;
    387
    388	switch (mask) {
    389	case IIO_CHAN_INFO_RAW:
    390		pm_runtime_get_sync(yas5xx->dev);
    391		ret = yas5xx_get_measure(yas5xx, &t, &x, &y, &z);
    392		pm_runtime_mark_last_busy(yas5xx->dev);
    393		pm_runtime_put_autosuspend(yas5xx->dev);
    394		if (ret)
    395			return ret;
    396		switch (chan->address) {
    397		case 0:
    398			*val = t;
    399			break;
    400		case 1:
    401			*val = x;
    402			break;
    403		case 2:
    404			*val = y;
    405			break;
    406		case 3:
    407			*val = z;
    408			break;
    409		default:
    410			dev_err(yas5xx->dev, "unknown channel\n");
    411			return -EINVAL;
    412		}
    413		return IIO_VAL_INT;
    414	case IIO_CHAN_INFO_SCALE:
    415		if (chan->address == 0) {
    416			/* Temperature is unscaled */
    417			*val = 1;
    418			return IIO_VAL_INT;
    419		}
    420		/*
    421		 * The axis values are in nanotesla according to the vendor
    422		 * drivers, but is clearly in microtesla according to
    423		 * experiments. Since 1 uT = 0.01 Gauss, we need to divide
    424		 * by 100000000 (10^8) to get to Gauss from the raw value.
    425		 */
    426		*val = 1;
    427		*val2 = 100000000;
    428		return IIO_VAL_FRACTIONAL;
    429	default:
    430		/* Unknown request */
    431		return -EINVAL;
    432	}
    433}
    434
    435static void yas5xx_fill_buffer(struct iio_dev *indio_dev)
    436{
    437	struct yas5xx *yas5xx = iio_priv(indio_dev);
    438	s32 t, x, y, z;
    439	int ret;
    440
    441	pm_runtime_get_sync(yas5xx->dev);
    442	ret = yas5xx_get_measure(yas5xx, &t, &x, &y, &z);
    443	pm_runtime_mark_last_busy(yas5xx->dev);
    444	pm_runtime_put_autosuspend(yas5xx->dev);
    445	if (ret) {
    446		dev_err(yas5xx->dev, "error refilling buffer\n");
    447		return;
    448	}
    449	yas5xx->scan.channels[0] = t;
    450	yas5xx->scan.channels[1] = x;
    451	yas5xx->scan.channels[2] = y;
    452	yas5xx->scan.channels[3] = z;
    453	iio_push_to_buffers_with_timestamp(indio_dev, &yas5xx->scan,
    454					   iio_get_time_ns(indio_dev));
    455}
    456
    457static irqreturn_t yas5xx_handle_trigger(int irq, void *p)
    458{
    459	const struct iio_poll_func *pf = p;
    460	struct iio_dev *indio_dev = pf->indio_dev;
    461
    462	yas5xx_fill_buffer(indio_dev);
    463	iio_trigger_notify_done(indio_dev->trig);
    464
    465	return IRQ_HANDLED;
    466}
    467
    468
    469static const struct iio_mount_matrix *
    470yas5xx_get_mount_matrix(const struct iio_dev *indio_dev,
    471			const struct iio_chan_spec *chan)
    472{
    473	struct yas5xx *yas5xx = iio_priv(indio_dev);
    474
    475	return &yas5xx->orientation;
    476}
    477
    478static const struct iio_chan_spec_ext_info yas5xx_ext_info[] = {
    479	IIO_MOUNT_MATRIX(IIO_SHARED_BY_DIR, yas5xx_get_mount_matrix),
    480	{ }
    481};
    482
    483#define YAS5XX_AXIS_CHANNEL(axis, index)				\
    484	{								\
    485		.type = IIO_MAGN,					\
    486		.modified = 1,						\
    487		.channel2 = IIO_MOD_##axis,				\
    488		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |		\
    489			BIT(IIO_CHAN_INFO_SCALE),			\
    490		.ext_info = yas5xx_ext_info,				\
    491		.address = index,					\
    492		.scan_index = index,					\
    493		.scan_type = {						\
    494			.sign = 's',					\
    495			.realbits = 32,					\
    496			.storagebits = 32,				\
    497			.endianness = IIO_CPU,				\
    498		},							\
    499	}
    500
    501static const struct iio_chan_spec yas5xx_channels[] = {
    502	{
    503		.type = IIO_TEMP,
    504		.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
    505		.address = 0,
    506		.scan_index = 0,
    507		.scan_type = {
    508			.sign = 'u',
    509			.realbits = 32,
    510			.storagebits = 32,
    511			.endianness = IIO_CPU,
    512		},
    513	},
    514	YAS5XX_AXIS_CHANNEL(X, 1),
    515	YAS5XX_AXIS_CHANNEL(Y, 2),
    516	YAS5XX_AXIS_CHANNEL(Z, 3),
    517	IIO_CHAN_SOFT_TIMESTAMP(4),
    518};
    519
    520static const unsigned long yas5xx_scan_masks[] = { GENMASK(3, 0), 0 };
    521
    522static const struct iio_info yas5xx_info = {
    523	.read_raw = &yas5xx_read_raw,
    524};
    525
    526static bool yas5xx_volatile_reg(struct device *dev, unsigned int reg)
    527{
    528	return reg == YAS5XX_ACTUATE_INIT_COIL ||
    529		reg == YAS5XX_MEASURE ||
    530		(reg >= YAS5XX_MEASURE_DATA && reg <= YAS5XX_MEASURE_DATA + 8);
    531}
    532
    533/* TODO: enable regmap cache, using mark dirty and sync at runtime resume */
    534static const struct regmap_config yas5xx_regmap_config = {
    535	.reg_bits = 8,
    536	.val_bits = 8,
    537	.max_register = 0xff,
    538	.volatile_reg = yas5xx_volatile_reg,
    539};
    540
    541/**
    542 * yas53x_extract_calibration() - extracts the a2-a9 and k calibration
    543 * @data: the bitfield to use
    544 * @c: the calibration to populate
    545 */
    546static void yas53x_extract_calibration(u8 *data, struct yas5xx_calibration *c)
    547{
    548	u64 val = get_unaligned_be64(data);
    549
    550	/*
    551	 * Bitfield layout for the axis calibration data, for factor
    552	 * a2 = 2 etc, k = k, c = clock divider
    553	 *
    554	 * n   7 6 5 4 3 2 1 0
    555	 * 0 [ 2 2 2 2 2 2 3 3 ] bits 63 .. 56
    556	 * 1 [ 3 3 4 4 4 4 4 4 ] bits 55 .. 48
    557	 * 2 [ 5 5 5 5 5 5 6 6 ] bits 47 .. 40
    558	 * 3 [ 6 6 6 6 7 7 7 7 ] bits 39 .. 32
    559	 * 4 [ 7 7 7 8 8 8 8 8 ] bits 31 .. 24
    560	 * 5 [ 8 9 9 9 9 9 9 9 ] bits 23 .. 16
    561	 * 6 [ 9 k k k k k c c ] bits 15 .. 8
    562	 * 7 [ c x x x x x x x ] bits  7 .. 0
    563	 */
    564	c->a2 = FIELD_GET(GENMASK_ULL(63, 58), val) - 32;
    565	c->a3 = FIELD_GET(GENMASK_ULL(57, 54), val) - 8;
    566	c->a4 = FIELD_GET(GENMASK_ULL(53, 48), val) - 32;
    567	c->a5 = FIELD_GET(GENMASK_ULL(47, 42), val) + 38;
    568	c->a6 = FIELD_GET(GENMASK_ULL(41, 36), val) - 32;
    569	c->a7 = FIELD_GET(GENMASK_ULL(35, 29), val) - 64;
    570	c->a8 = FIELD_GET(GENMASK_ULL(28, 23), val) - 32;
    571	c->a9 = FIELD_GET(GENMASK_ULL(22, 15), val);
    572	c->k = FIELD_GET(GENMASK_ULL(14, 10), val) + 10;
    573	c->dck = FIELD_GET(GENMASK_ULL(9, 7), val);
    574}
    575
    576static int yas530_get_calibration_data(struct yas5xx *yas5xx)
    577{
    578	struct yas5xx_calibration *c = &yas5xx->calibration;
    579	u8 data[16];
    580	u32 val;
    581	int ret;
    582
    583	/* Dummy read, first read is ALWAYS wrong */
    584	ret = regmap_bulk_read(yas5xx->map, YAS5XX_CAL, data, sizeof(data));
    585	if (ret)
    586		return ret;
    587
    588	/* Actual calibration readout */
    589	ret = regmap_bulk_read(yas5xx->map, YAS5XX_CAL, data, sizeof(data));
    590	if (ret)
    591		return ret;
    592	dev_dbg(yas5xx->dev, "calibration data: %*ph\n", 14, data);
    593
    594	add_device_randomness(data, sizeof(data));
    595	yas5xx->version = data[15] & GENMASK(1, 0);
    596
    597	/* Extract the calibration from the bitfield */
    598	c->Cx = data[0] * 6 - 768;
    599	c->Cy1 = data[1] * 6 - 768;
    600	c->Cy2 = data[2] * 6 - 768;
    601	yas53x_extract_calibration(&data[3], c);
    602
    603	/*
    604	 * Extract linearization:
    605	 * Linearization layout in the 32 bits at byte 11:
    606	 * The r factors are 6 bit values where bit 5 is the sign
    607	 *
    608	 * n    7  6  5  4  3  2  1  0
    609	 * 0 [ xx xx xx r0 r0 r0 r0 r0 ] bits 31 .. 24
    610	 * 1 [ r0 f0 f0 r1 r1 r1 r1 r1 ] bits 23 .. 16
    611	 * 2 [ r1 f1 f1 r2 r2 r2 r2 r2 ] bits 15 .. 8
    612	 * 3 [ r2 f2 f2 xx xx xx xx xx ] bits  7 .. 0
    613	 */
    614	val = get_unaligned_be32(&data[11]);
    615	c->f[0] = FIELD_GET(GENMASK(22, 21), val);
    616	c->f[1] = FIELD_GET(GENMASK(14, 13), val);
    617	c->f[2] = FIELD_GET(GENMASK(6, 5), val);
    618	c->r[0] = sign_extend32(FIELD_GET(GENMASK(28, 23), val), 5);
    619	c->r[1] = sign_extend32(FIELD_GET(GENMASK(20, 15), val), 5);
    620	c->r[2] = sign_extend32(FIELD_GET(GENMASK(12, 7), val), 5);
    621	return 0;
    622}
    623
    624static int yas532_get_calibration_data(struct yas5xx *yas5xx)
    625{
    626	struct yas5xx_calibration *c = &yas5xx->calibration;
    627	u8 data[14];
    628	u32 val;
    629	int ret;
    630
    631	/* Dummy read, first read is ALWAYS wrong */
    632	ret = regmap_bulk_read(yas5xx->map, YAS5XX_CAL, data, sizeof(data));
    633	if (ret)
    634		return ret;
    635	/* Actual calibration readout */
    636	ret = regmap_bulk_read(yas5xx->map, YAS5XX_CAL, data, sizeof(data));
    637	if (ret)
    638		return ret;
    639	dev_dbg(yas5xx->dev, "calibration data: %*ph\n", 14, data);
    640
    641	/* Sanity check, is this all zeroes? */
    642	if (memchr_inv(data, 0x00, 13) == NULL) {
    643		if (!(data[13] & BIT(7)))
    644			dev_warn(yas5xx->dev, "calibration is blank!\n");
    645	}
    646
    647	add_device_randomness(data, sizeof(data));
    648	/* Only one bit of version info reserved here as far as we know */
    649	yas5xx->version = data[13] & BIT(0);
    650
    651	/* Extract calibration from the bitfield */
    652	c->Cx = data[0] * 10 - 1280;
    653	c->Cy1 = data[1] * 10 - 1280;
    654	c->Cy2 = data[2] * 10 - 1280;
    655	yas53x_extract_calibration(&data[3], c);
    656	/*
    657	 * Extract linearization:
    658	 * Linearization layout in the 32 bits at byte 10:
    659	 * The r factors are 6 bit values where bit 5 is the sign
    660	 *
    661	 * n    7  6  5  4  3  2  1  0
    662	 * 0 [ xx r0 r0 r0 r0 r0 r0 f0 ] bits 31 .. 24
    663	 * 1 [ f0 r1 r1 r1 r1 r1 r1 f1 ] bits 23 .. 16
    664	 * 2 [ f1 r2 r2 r2 r2 r2 r2 f2 ] bits 15 .. 8
    665	 * 3 [ f2 xx xx xx xx xx xx xx ] bits  7 .. 0
    666	 */
    667	val = get_unaligned_be32(&data[10]);
    668	c->f[0] = FIELD_GET(GENMASK(24, 23), val);
    669	c->f[1] = FIELD_GET(GENMASK(16, 15), val);
    670	c->f[2] = FIELD_GET(GENMASK(8, 7), val);
    671	c->r[0] = sign_extend32(FIELD_GET(GENMASK(30, 25), val), 5);
    672	c->r[1] = sign_extend32(FIELD_GET(GENMASK(22, 17), val), 5);
    673	c->r[2] = sign_extend32(FIELD_GET(GENMASK(14, 7), val), 5);
    674
    675	return 0;
    676}
    677
    678static void yas5xx_dump_calibration(struct yas5xx *yas5xx)
    679{
    680	struct yas5xx_calibration *c = &yas5xx->calibration;
    681
    682	dev_dbg(yas5xx->dev, "f[] = [%d, %d, %d]\n",
    683		c->f[0], c->f[1], c->f[2]);
    684	dev_dbg(yas5xx->dev, "r[] = [%d, %d, %d]\n",
    685		c->r[0], c->r[1], c->r[2]);
    686	dev_dbg(yas5xx->dev, "Cx = %d\n", c->Cx);
    687	dev_dbg(yas5xx->dev, "Cy1 = %d\n", c->Cy1);
    688	dev_dbg(yas5xx->dev, "Cy2 = %d\n", c->Cy2);
    689	dev_dbg(yas5xx->dev, "a2 = %d\n", c->a2);
    690	dev_dbg(yas5xx->dev, "a3 = %d\n", c->a3);
    691	dev_dbg(yas5xx->dev, "a4 = %d\n", c->a4);
    692	dev_dbg(yas5xx->dev, "a5 = %d\n", c->a5);
    693	dev_dbg(yas5xx->dev, "a6 = %d\n", c->a6);
    694	dev_dbg(yas5xx->dev, "a7 = %d\n", c->a7);
    695	dev_dbg(yas5xx->dev, "a8 = %d\n", c->a8);
    696	dev_dbg(yas5xx->dev, "a9 = %d\n", c->a9);
    697	dev_dbg(yas5xx->dev, "k = %d\n", c->k);
    698	dev_dbg(yas5xx->dev, "dck = %d\n", c->dck);
    699}
    700
    701static int yas5xx_set_offsets(struct yas5xx *yas5xx, s8 ox, s8 oy1, s8 oy2)
    702{
    703	int ret;
    704
    705	ret = regmap_write(yas5xx->map, YAS5XX_OFFSET_X, ox);
    706	if (ret)
    707		return ret;
    708	ret = regmap_write(yas5xx->map, YAS5XX_OFFSET_Y1, oy1);
    709	if (ret)
    710		return ret;
    711	return regmap_write(yas5xx->map, YAS5XX_OFFSET_Y2, oy2);
    712}
    713
    714static s8 yas5xx_adjust_offset(s8 old, int bit, u16 center, u16 measure)
    715{
    716	if (measure > center)
    717		return old + BIT(bit);
    718	if (measure < center)
    719		return old - BIT(bit);
    720	return old;
    721}
    722
    723static int yas5xx_meaure_offsets(struct yas5xx *yas5xx)
    724{
    725	int ret;
    726	u16 center;
    727	u16 t, x, y1, y2;
    728	s8 ox, oy1, oy2;
    729	int i;
    730
    731	/* Actuate the init coil and measure offsets */
    732	ret = regmap_write(yas5xx->map, YAS5XX_ACTUATE_INIT_COIL, 0);
    733	if (ret)
    734		return ret;
    735
    736	/* When the initcoil is active this should be around the center */
    737	switch (yas5xx->devid) {
    738	case YAS530_DEVICE_ID:
    739		center = YAS530_DATA_CENTER;
    740		break;
    741	case YAS532_DEVICE_ID:
    742		center = YAS532_DATA_CENTER;
    743		break;
    744	default:
    745		dev_err(yas5xx->dev, "unknown device type\n");
    746		return -EINVAL;
    747	}
    748
    749	/*
    750	 * We set offsets in the interval +-31 by iterating
    751	 * +-16, +-8, +-4, +-2, +-1 adjusting the offsets each
    752	 * time, then writing the final offsets into the
    753	 * registers.
    754	 *
    755	 * NOTE: these offsets are NOT in the same unit or magnitude
    756	 * as the values for [x, y1, y2]. The value is +/-31
    757	 * but the effect on the raw values is much larger.
    758	 * The effect of the offset is to bring the measure
    759	 * rougly to the center.
    760	 */
    761	ox = 0;
    762	oy1 = 0;
    763	oy2 = 0;
    764
    765	for (i = 4; i >= 0; i--) {
    766		ret = yas5xx_set_offsets(yas5xx, ox, oy1, oy2);
    767		if (ret)
    768			return ret;
    769
    770		ret = yas5xx_measure(yas5xx, &t, &x, &y1, &y2);
    771		if (ret)
    772			return ret;
    773		dev_dbg(yas5xx->dev, "measurement %d: x=%d, y1=%d, y2=%d\n",
    774			5-i, x, y1, y2);
    775
    776		ox = yas5xx_adjust_offset(ox, i, center, x);
    777		oy1 = yas5xx_adjust_offset(oy1, i, center, y1);
    778		oy2 = yas5xx_adjust_offset(oy2, i, center, y2);
    779	}
    780
    781	/* Needed for calibration algorithm */
    782	yas5xx->hard_offsets[0] = ox;
    783	yas5xx->hard_offsets[1] = oy1;
    784	yas5xx->hard_offsets[2] = oy2;
    785	ret = yas5xx_set_offsets(yas5xx, ox, oy1, oy2);
    786	if (ret)
    787		return ret;
    788
    789	dev_info(yas5xx->dev, "discovered hard offsets: x=%d, y1=%d, y2=%d\n",
    790		 ox, oy1, oy2);
    791	return 0;
    792}
    793
    794static int yas5xx_power_on(struct yas5xx *yas5xx)
    795{
    796	unsigned int val;
    797	int ret;
    798
    799	/* Zero the test registers */
    800	ret = regmap_write(yas5xx->map, YAS5XX_TEST1, 0);
    801	if (ret)
    802		return ret;
    803	ret = regmap_write(yas5xx->map, YAS5XX_TEST2, 0);
    804	if (ret)
    805		return ret;
    806
    807	/* Set up for no interrupts, calibrated clock divider */
    808	val = FIELD_PREP(YAS5XX_CONFIG_CCK_MASK, yas5xx->calibration.dck);
    809	ret = regmap_write(yas5xx->map, YAS5XX_CONFIG, val);
    810	if (ret)
    811		return ret;
    812
    813	/* Measure interval 0 (back-to-back?)  */
    814	return regmap_write(yas5xx->map, YAS5XX_MEASURE_INTERVAL, 0);
    815}
    816
    817static int yas5xx_probe(struct i2c_client *i2c,
    818			const struct i2c_device_id *id)
    819{
    820	struct iio_dev *indio_dev;
    821	struct device *dev = &i2c->dev;
    822	struct yas5xx *yas5xx;
    823	int ret;
    824
    825	indio_dev = devm_iio_device_alloc(dev, sizeof(*yas5xx));
    826	if (!indio_dev)
    827		return -ENOMEM;
    828
    829	yas5xx = iio_priv(indio_dev);
    830	i2c_set_clientdata(i2c, indio_dev);
    831	yas5xx->dev = dev;
    832	mutex_init(&yas5xx->lock);
    833
    834	ret = iio_read_mount_matrix(dev, &yas5xx->orientation);
    835	if (ret)
    836		return ret;
    837
    838	yas5xx->regs[0].supply = "vdd";
    839	yas5xx->regs[1].supply = "iovdd";
    840	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(yas5xx->regs),
    841				      yas5xx->regs);
    842	if (ret)
    843		return dev_err_probe(dev, ret, "cannot get regulators\n");
    844
    845	ret = regulator_bulk_enable(ARRAY_SIZE(yas5xx->regs), yas5xx->regs);
    846	if (ret) {
    847		dev_err(dev, "cannot enable regulators\n");
    848		return ret;
    849	}
    850
    851	/* See comment in runtime resume callback */
    852	usleep_range(31000, 40000);
    853
    854	/* This will take the device out of reset if need be */
    855	yas5xx->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
    856	if (IS_ERR(yas5xx->reset)) {
    857		ret = dev_err_probe(dev, PTR_ERR(yas5xx->reset),
    858				    "failed to get reset line\n");
    859		goto reg_off;
    860	}
    861
    862	yas5xx->map = devm_regmap_init_i2c(i2c, &yas5xx_regmap_config);
    863	if (IS_ERR(yas5xx->map)) {
    864		dev_err(dev, "failed to allocate register map\n");
    865		ret = PTR_ERR(yas5xx->map);
    866		goto assert_reset;
    867	}
    868
    869	ret = regmap_read(yas5xx->map, YAS5XX_DEVICE_ID, &yas5xx->devid);
    870	if (ret)
    871		goto assert_reset;
    872
    873	switch (yas5xx->devid) {
    874	case YAS530_DEVICE_ID:
    875		ret = yas530_get_calibration_data(yas5xx);
    876		if (ret)
    877			goto assert_reset;
    878		dev_info(dev, "detected YAS530 MS-3E %s",
    879			 yas5xx->version ? "B" : "A");
    880		strncpy(yas5xx->name, "yas530", sizeof(yas5xx->name));
    881		break;
    882	case YAS532_DEVICE_ID:
    883		ret = yas532_get_calibration_data(yas5xx);
    884		if (ret)
    885			goto assert_reset;
    886		dev_info(dev, "detected YAS532/YAS533 MS-3R/F %s",
    887			 yas5xx->version ? "AC" : "AB");
    888		strncpy(yas5xx->name, "yas532", sizeof(yas5xx->name));
    889		break;
    890	default:
    891		ret = -ENODEV;
    892		dev_err(dev, "unhandled device ID %02x\n", yas5xx->devid);
    893		goto assert_reset;
    894	}
    895
    896	yas5xx_dump_calibration(yas5xx);
    897	ret = yas5xx_power_on(yas5xx);
    898	if (ret)
    899		goto assert_reset;
    900	ret = yas5xx_meaure_offsets(yas5xx);
    901	if (ret)
    902		goto assert_reset;
    903
    904	indio_dev->info = &yas5xx_info;
    905	indio_dev->available_scan_masks = yas5xx_scan_masks;
    906	indio_dev->modes = INDIO_DIRECT_MODE;
    907	indio_dev->name = yas5xx->name;
    908	indio_dev->channels = yas5xx_channels;
    909	indio_dev->num_channels = ARRAY_SIZE(yas5xx_channels);
    910
    911	ret = iio_triggered_buffer_setup(indio_dev, NULL,
    912					 yas5xx_handle_trigger,
    913					 NULL);
    914	if (ret) {
    915		dev_err(dev, "triggered buffer setup failed\n");
    916		goto assert_reset;
    917	}
    918
    919	ret = iio_device_register(indio_dev);
    920	if (ret) {
    921		dev_err(dev, "device register failed\n");
    922		goto cleanup_buffer;
    923	}
    924
    925	/* Take runtime PM online */
    926	pm_runtime_get_noresume(dev);
    927	pm_runtime_set_active(dev);
    928	pm_runtime_enable(dev);
    929
    930	pm_runtime_set_autosuspend_delay(dev, YAS5XX_AUTOSUSPEND_DELAY_MS);
    931	pm_runtime_use_autosuspend(dev);
    932	pm_runtime_put(dev);
    933
    934	return 0;
    935
    936cleanup_buffer:
    937	iio_triggered_buffer_cleanup(indio_dev);
    938assert_reset:
    939	gpiod_set_value_cansleep(yas5xx->reset, 1);
    940reg_off:
    941	regulator_bulk_disable(ARRAY_SIZE(yas5xx->regs), yas5xx->regs);
    942
    943	return ret;
    944}
    945
    946static int yas5xx_remove(struct i2c_client *i2c)
    947{
    948	struct iio_dev *indio_dev = i2c_get_clientdata(i2c);
    949	struct yas5xx *yas5xx = iio_priv(indio_dev);
    950	struct device *dev = &i2c->dev;
    951
    952	iio_device_unregister(indio_dev);
    953	iio_triggered_buffer_cleanup(indio_dev);
    954	/*
    955	 * Now we can't get any more reads from the device, which would
    956	 * also call pm_runtime* functions and race with our disable
    957	 * code. Disable PM runtime in orderly fashion and power down.
    958	 */
    959	pm_runtime_get_sync(dev);
    960	pm_runtime_put_noidle(dev);
    961	pm_runtime_disable(dev);
    962	gpiod_set_value_cansleep(yas5xx->reset, 1);
    963	regulator_bulk_disable(ARRAY_SIZE(yas5xx->regs), yas5xx->regs);
    964
    965	return 0;
    966}
    967
    968static int __maybe_unused yas5xx_runtime_suspend(struct device *dev)
    969{
    970	struct iio_dev *indio_dev = dev_get_drvdata(dev);
    971	struct yas5xx *yas5xx = iio_priv(indio_dev);
    972
    973	gpiod_set_value_cansleep(yas5xx->reset, 1);
    974	regulator_bulk_disable(ARRAY_SIZE(yas5xx->regs), yas5xx->regs);
    975
    976	return 0;
    977}
    978
    979static int __maybe_unused yas5xx_runtime_resume(struct device *dev)
    980{
    981	struct iio_dev *indio_dev = dev_get_drvdata(dev);
    982	struct yas5xx *yas5xx = iio_priv(indio_dev);
    983	int ret;
    984
    985	ret = regulator_bulk_enable(ARRAY_SIZE(yas5xx->regs), yas5xx->regs);
    986	if (ret) {
    987		dev_err(dev, "cannot enable regulators\n");
    988		return ret;
    989	}
    990
    991	/*
    992	 * The YAS530 datasheet says TVSKW is up to 30 ms, after that 1 ms
    993	 * for all voltages to settle. The YAS532 is 10ms then 4ms for the
    994	 * I2C to come online. Let's keep it safe and put this at 31ms.
    995	 */
    996	usleep_range(31000, 40000);
    997	gpiod_set_value_cansleep(yas5xx->reset, 0);
    998
    999	ret = yas5xx_power_on(yas5xx);
   1000	if (ret) {
   1001		dev_err(dev, "cannot power on\n");
   1002		goto out_reset;
   1003	}
   1004
   1005	return 0;
   1006
   1007out_reset:
   1008	gpiod_set_value_cansleep(yas5xx->reset, 1);
   1009	regulator_bulk_disable(ARRAY_SIZE(yas5xx->regs), yas5xx->regs);
   1010
   1011	return ret;
   1012}
   1013
   1014static const struct dev_pm_ops yas5xx_dev_pm_ops = {
   1015	SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
   1016				pm_runtime_force_resume)
   1017	SET_RUNTIME_PM_OPS(yas5xx_runtime_suspend,
   1018			   yas5xx_runtime_resume, NULL)
   1019};
   1020
   1021static const struct i2c_device_id yas5xx_id[] = {
   1022	{"yas530", },
   1023	{"yas532", },
   1024	{"yas533", },
   1025	{}
   1026};
   1027MODULE_DEVICE_TABLE(i2c, yas5xx_id);
   1028
   1029static const struct of_device_id yas5xx_of_match[] = {
   1030	{ .compatible = "yamaha,yas530", },
   1031	{ .compatible = "yamaha,yas532", },
   1032	{ .compatible = "yamaha,yas533", },
   1033	{}
   1034};
   1035MODULE_DEVICE_TABLE(of, yas5xx_of_match);
   1036
   1037static struct i2c_driver yas5xx_driver = {
   1038	.driver	 = {
   1039		.name	= "yas5xx",
   1040		.of_match_table = yas5xx_of_match,
   1041		.pm = &yas5xx_dev_pm_ops,
   1042	},
   1043	.probe	  = yas5xx_probe,
   1044	.remove	  = yas5xx_remove,
   1045	.id_table = yas5xx_id,
   1046};
   1047module_i2c_driver(yas5xx_driver);
   1048
   1049MODULE_DESCRIPTION("Yamaha YAS53x 3-axis magnetometer driver");
   1050MODULE_AUTHOR("Linus Walleij");
   1051MODULE_LICENSE("GPL v2");