xref: /linux/drivers/iio/magnetometer/tlv493d.c (revision ec2e0fb07d789976c601bec19ecced7a501c3705)
1*106511d2SDixit Parmar // SPDX-License-Identifier: GPL-2.0-only
2*106511d2SDixit Parmar /*
3*106511d2SDixit Parmar  * Driver for the Infineon TLV493D Low-Power 3D Magnetic Sensor
4*106511d2SDixit Parmar  *
5*106511d2SDixit Parmar  * Copyright (C) 2025 Dixit Parmar <dixitparmar19@gmail.com>
6*106511d2SDixit Parmar  */
7*106511d2SDixit Parmar 
8*106511d2SDixit Parmar #include <linux/array_size.h>
9*106511d2SDixit Parmar #include <linux/bits.h>
10*106511d2SDixit Parmar #include <linux/bitfield.h>
11*106511d2SDixit Parmar #include <linux/cleanup.h>
12*106511d2SDixit Parmar #include <linux/delay.h>
13*106511d2SDixit Parmar #include <linux/dev_printk.h>
14*106511d2SDixit Parmar #include <linux/i2c.h>
15*106511d2SDixit Parmar #include <linux/iopoll.h>
16*106511d2SDixit Parmar #include <linux/module.h>
17*106511d2SDixit Parmar #include <linux/mod_devicetable.h>
18*106511d2SDixit Parmar #include <linux/pm.h>
19*106511d2SDixit Parmar #include <linux/pm_runtime.h>
20*106511d2SDixit Parmar #include <linux/regulator/consumer.h>
21*106511d2SDixit Parmar #include <linux/types.h>
22*106511d2SDixit Parmar #include <linux/units.h>
23*106511d2SDixit Parmar 
24*106511d2SDixit Parmar #include <linux/iio/buffer.h>
25*106511d2SDixit Parmar #include <linux/iio/iio.h>
26*106511d2SDixit Parmar #include <linux/iio/trigger_consumer.h>
27*106511d2SDixit Parmar #include <linux/iio/triggered_buffer.h>
28*106511d2SDixit Parmar 
29*106511d2SDixit Parmar /*
30*106511d2SDixit Parmar  * TLV493D sensor I2C communication note:
31*106511d2SDixit Parmar  *
32*106511d2SDixit Parmar  * The sensor supports only direct byte-stream write starting from the
33*106511d2SDixit Parmar  * register address 0x0. So for any modification to be made to any write
34*106511d2SDixit Parmar  * registers, it must be written starting from the register address  0x0.
35*106511d2SDixit Parmar  * I2C write operation should not contain the register address in the I2C
36*106511d2SDixit Parmar  * frame, it should contain only raw byte stream for the write registers.
37*106511d2SDixit Parmar  * I2C Frame: |S|SlaveAddr Wr|Ack|Byte[0]|Ack|Byte[1]|Ack|.....|Sp|
38*106511d2SDixit Parmar  *
39*106511d2SDixit Parmar  * Same as the write operation, reading from the sensor registers is also
40*106511d2SDixit Parmar  * performed starting from the register address 0x0 for as many bytes as
41*106511d2SDixit Parmar  * need to be read.
42*106511d2SDixit Parmar  * I2C read operation should not contain the register address in the I2C frame.
43*106511d2SDixit Parmar  * I2C Frame: |S|SlaveAddr Rd|Ack|Byte[0]|Ack|Byte[1]|Ack|.....|Sp|
44*106511d2SDixit Parmar  */
45*106511d2SDixit Parmar 
46*106511d2SDixit Parmar #define TLV493D_RD_REG_BX	0x00
47*106511d2SDixit Parmar #define TLV493D_RD_REG_BY	0x01
48*106511d2SDixit Parmar #define TLV493D_RD_REG_BZ	0x02
49*106511d2SDixit Parmar #define TLV493D_RD_REG_TEMP	0x03
50*106511d2SDixit Parmar #define TLV493D_RD_REG_BX2	0x04
51*106511d2SDixit Parmar #define TLV493D_RD_REG_BZ2	0x05
52*106511d2SDixit Parmar #define TLV493D_RD_REG_TEMP2	0x06
53*106511d2SDixit Parmar #define TLV493D_RD_REG_RES1	0x07
54*106511d2SDixit Parmar #define TLV493D_RD_REG_RES2	0x08
55*106511d2SDixit Parmar #define TLV493D_RD_REG_RES3	0x09
56*106511d2SDixit Parmar #define TLV493D_RD_REG_MAX	0x0a
57*106511d2SDixit Parmar 
58*106511d2SDixit Parmar #define TLV493D_WR_REG_MODE1	0x01
59*106511d2SDixit Parmar #define TLV493D_WR_REG_MODE2	0x03
60*106511d2SDixit Parmar #define TLV493D_WR_REG_MAX	0x04
61*106511d2SDixit Parmar 
62*106511d2SDixit Parmar #define TLV493D_BX_MAG_X_AXIS_MSB	GENMASK(7, 0)
63*106511d2SDixit Parmar #define TLV493D_BX2_MAG_X_AXIS_LSB	GENMASK(7, 4)
64*106511d2SDixit Parmar #define TLV493D_BY_MAG_Y_AXIS_MSB	GENMASK(7, 0)
65*106511d2SDixit Parmar #define TLV493D_BX2_MAG_Y_AXIS_LSB	GENMASK(3, 0)
66*106511d2SDixit Parmar #define TLV493D_BZ_MAG_Z_AXIS_MSB	GENMASK(7, 0)
67*106511d2SDixit Parmar #define TLV493D_BZ2_MAG_Z_AXIS_LSB	GENMASK(3, 0)
68*106511d2SDixit Parmar #define TLV493D_TEMP_TEMP_MSB		GENMASK(7, 4)
69*106511d2SDixit Parmar #define TLV493D_TEMP2_TEMP_LSB		GENMASK(7, 0)
70*106511d2SDixit Parmar #define TLV493D_TEMP_CHANNEL		GENMASK(1, 0)
71*106511d2SDixit Parmar #define TLV493D_MODE1_MOD_LOWFAST	GENMASK(1, 0)
72*106511d2SDixit Parmar #define TLV493D_MODE2_LP_PERIOD	BIT(6)
73*106511d2SDixit Parmar #define TLV493D_RD_REG_RES1_WR_MASK	GENMASK(4, 3)
74*106511d2SDixit Parmar #define TLV493D_RD_REG_RES2_WR_MASK	GENMASK(7, 0)
75*106511d2SDixit Parmar #define TLV493D_RD_REG_RES3_WR_MASK	GENMASK(4, 0)
76*106511d2SDixit Parmar 
77*106511d2SDixit Parmar enum tlv493d_channels {
78*106511d2SDixit Parmar 	TLV493D_AXIS_X,
79*106511d2SDixit Parmar 	TLV493D_AXIS_Y,
80*106511d2SDixit Parmar 	TLV493D_AXIS_Z,
81*106511d2SDixit Parmar 	TLV493D_TEMPERATURE,
82*106511d2SDixit Parmar };
83*106511d2SDixit Parmar 
84*106511d2SDixit Parmar enum tlv493d_op_mode {
85*106511d2SDixit Parmar 	TLV493D_OP_MODE_POWERDOWN,
86*106511d2SDixit Parmar 	TLV493D_OP_MODE_FAST,
87*106511d2SDixit Parmar 	TLV493D_OP_MODE_LOWPOWER,
88*106511d2SDixit Parmar 	TLV493D_OP_MODE_ULTRA_LOWPOWER,
89*106511d2SDixit Parmar 	TLV493D_OP_MODE_MASTERCONTROLLED,
90*106511d2SDixit Parmar };
91*106511d2SDixit Parmar 
92*106511d2SDixit Parmar struct tlv493d_data {
93*106511d2SDixit Parmar 	struct i2c_client *client;
94*106511d2SDixit Parmar 	/* protects from simultaneous sensor access and register readings */
95*106511d2SDixit Parmar 	struct mutex lock;
96*106511d2SDixit Parmar 	enum tlv493d_op_mode mode;
97*106511d2SDixit Parmar 	u8 wr_regs[TLV493D_WR_REG_MAX];
98*106511d2SDixit Parmar };
99*106511d2SDixit Parmar 
100*106511d2SDixit Parmar /*
101*106511d2SDixit Parmar  * Different mode has different measurement sampling time, this time is
102*106511d2SDixit Parmar  * used in deriving the sleep and timeout while reading the data from
103*106511d2SDixit Parmar  * sensor in polling.
104*106511d2SDixit Parmar  * Power-down mode: No measurement.
105*106511d2SDixit Parmar  * Fast mode: Freq:3.3 KHz. Measurement time:305 usec.
106*106511d2SDixit Parmar  * Low-power mode: Freq:100 Hz. Measurement time:10 msec.
107*106511d2SDixit Parmar  * Ultra low-power mode: Freq:10 Hz. Measurement time:100 msec.
108*106511d2SDixit Parmar  * Master controlled mode: Freq:3.3 Khz. Measurement time:305 usec.
109*106511d2SDixit Parmar  */
110*106511d2SDixit Parmar static const u32 tlv493d_sample_rate_us[] = {
111*106511d2SDixit Parmar 	[TLV493D_OP_MODE_POWERDOWN] = 0,
112*106511d2SDixit Parmar 	[TLV493D_OP_MODE_FAST] = 305,
113*106511d2SDixit Parmar 	[TLV493D_OP_MODE_LOWPOWER] = 10 * USEC_PER_MSEC,
114*106511d2SDixit Parmar 	[TLV493D_OP_MODE_ULTRA_LOWPOWER] = 100 * USEC_PER_MSEC,
115*106511d2SDixit Parmar 	[TLV493D_OP_MODE_MASTERCONTROLLED] = 305,
116*106511d2SDixit Parmar };
117*106511d2SDixit Parmar 
tlv493d_write_all_regs(struct tlv493d_data * data)118*106511d2SDixit Parmar static int tlv493d_write_all_regs(struct tlv493d_data *data)
119*106511d2SDixit Parmar {
120*106511d2SDixit Parmar 	int ret;
121*106511d2SDixit Parmar 	struct device *dev = &data->client->dev;
122*106511d2SDixit Parmar 
123*106511d2SDixit Parmar 	ret = i2c_master_send(data->client, data->wr_regs, ARRAY_SIZE(data->wr_regs));
124*106511d2SDixit Parmar 	if (ret < 0) {
125*106511d2SDixit Parmar 		dev_err(dev, "i2c write registers failed, error: %d\n", ret);
126*106511d2SDixit Parmar 		return ret;
127*106511d2SDixit Parmar 	}
128*106511d2SDixit Parmar 
129*106511d2SDixit Parmar 	return 0;
130*106511d2SDixit Parmar }
131*106511d2SDixit Parmar 
tlv493d_set_operating_mode(struct tlv493d_data * data,enum tlv493d_op_mode mode)132*106511d2SDixit Parmar static int tlv493d_set_operating_mode(struct tlv493d_data *data, enum tlv493d_op_mode mode)
133*106511d2SDixit Parmar {
134*106511d2SDixit Parmar 	u8 *mode1_cfg = &data->wr_regs[TLV493D_WR_REG_MODE1];
135*106511d2SDixit Parmar 	u8 *mode2_cfg = &data->wr_regs[TLV493D_WR_REG_MODE2];
136*106511d2SDixit Parmar 
137*106511d2SDixit Parmar 	switch (mode) {
138*106511d2SDixit Parmar 	case TLV493D_OP_MODE_POWERDOWN:
139*106511d2SDixit Parmar 		FIELD_MODIFY(TLV493D_MODE1_MOD_LOWFAST, mode1_cfg, 0);
140*106511d2SDixit Parmar 		FIELD_MODIFY(TLV493D_MODE2_LP_PERIOD, mode2_cfg, 0);
141*106511d2SDixit Parmar 		break;
142*106511d2SDixit Parmar 
143*106511d2SDixit Parmar 	case TLV493D_OP_MODE_FAST:
144*106511d2SDixit Parmar 		FIELD_MODIFY(TLV493D_MODE1_MOD_LOWFAST, mode1_cfg, 1);
145*106511d2SDixit Parmar 		FIELD_MODIFY(TLV493D_MODE2_LP_PERIOD, mode2_cfg, 0);
146*106511d2SDixit Parmar 		break;
147*106511d2SDixit Parmar 
148*106511d2SDixit Parmar 	case TLV493D_OP_MODE_LOWPOWER:
149*106511d2SDixit Parmar 		FIELD_MODIFY(TLV493D_MODE1_MOD_LOWFAST, mode1_cfg, 2);
150*106511d2SDixit Parmar 		FIELD_MODIFY(TLV493D_MODE2_LP_PERIOD, mode2_cfg, 1);
151*106511d2SDixit Parmar 		break;
152*106511d2SDixit Parmar 
153*106511d2SDixit Parmar 	case TLV493D_OP_MODE_ULTRA_LOWPOWER:
154*106511d2SDixit Parmar 		FIELD_MODIFY(TLV493D_MODE1_MOD_LOWFAST, mode1_cfg, 2);
155*106511d2SDixit Parmar 		FIELD_MODIFY(TLV493D_MODE2_LP_PERIOD, mode2_cfg, 0);
156*106511d2SDixit Parmar 		break;
157*106511d2SDixit Parmar 
158*106511d2SDixit Parmar 	case TLV493D_OP_MODE_MASTERCONTROLLED:
159*106511d2SDixit Parmar 		FIELD_MODIFY(TLV493D_MODE1_MOD_LOWFAST, mode1_cfg, 3);
160*106511d2SDixit Parmar 		FIELD_MODIFY(TLV493D_MODE2_LP_PERIOD, mode2_cfg, 0);
161*106511d2SDixit Parmar 		break;
162*106511d2SDixit Parmar 	}
163*106511d2SDixit Parmar 
164*106511d2SDixit Parmar 	return tlv493d_write_all_regs(data);
165*106511d2SDixit Parmar }
166*106511d2SDixit Parmar 
tlv493d_get_channel_data(u8 * b,enum tlv493d_channels ch)167*106511d2SDixit Parmar static s16 tlv493d_get_channel_data(u8 *b, enum tlv493d_channels ch)
168*106511d2SDixit Parmar {
169*106511d2SDixit Parmar 	u16 val;
170*106511d2SDixit Parmar 
171*106511d2SDixit Parmar 	switch (ch) {
172*106511d2SDixit Parmar 	case TLV493D_AXIS_X:
173*106511d2SDixit Parmar 		val = FIELD_GET(TLV493D_BX_MAG_X_AXIS_MSB, b[TLV493D_RD_REG_BX]) << 4 |
174*106511d2SDixit Parmar 		      FIELD_GET(TLV493D_BX2_MAG_X_AXIS_LSB, b[TLV493D_RD_REG_BX2]) >> 4;
175*106511d2SDixit Parmar 		break;
176*106511d2SDixit Parmar 	case TLV493D_AXIS_Y:
177*106511d2SDixit Parmar 		val = FIELD_GET(TLV493D_BY_MAG_Y_AXIS_MSB, b[TLV493D_RD_REG_BY]) << 4 |
178*106511d2SDixit Parmar 		      FIELD_GET(TLV493D_BX2_MAG_Y_AXIS_LSB, b[TLV493D_RD_REG_BX2]);
179*106511d2SDixit Parmar 		break;
180*106511d2SDixit Parmar 	case TLV493D_AXIS_Z:
181*106511d2SDixit Parmar 		val = FIELD_GET(TLV493D_BZ_MAG_Z_AXIS_MSB, b[TLV493D_RD_REG_BZ]) << 4 |
182*106511d2SDixit Parmar 		      FIELD_GET(TLV493D_BZ2_MAG_Z_AXIS_LSB, b[TLV493D_RD_REG_BZ2]);
183*106511d2SDixit Parmar 		break;
184*106511d2SDixit Parmar 	case TLV493D_TEMPERATURE:
185*106511d2SDixit Parmar 		val = FIELD_GET(TLV493D_TEMP_TEMP_MSB, b[TLV493D_RD_REG_TEMP]) << 8 |
186*106511d2SDixit Parmar 		      FIELD_GET(TLV493D_TEMP2_TEMP_LSB, b[TLV493D_RD_REG_TEMP2]);
187*106511d2SDixit Parmar 		break;
188*106511d2SDixit Parmar 	}
189*106511d2SDixit Parmar 
190*106511d2SDixit Parmar 	return sign_extend32(val, 11);
191*106511d2SDixit Parmar }
192*106511d2SDixit Parmar 
tlv493d_get_measurements(struct tlv493d_data * data,s16 * x,s16 * y,s16 * z,s16 * t)193*106511d2SDixit Parmar static int tlv493d_get_measurements(struct tlv493d_data *data, s16 *x, s16 *y,
194*106511d2SDixit Parmar 				    s16 *z, s16 *t)
195*106511d2SDixit Parmar {
196*106511d2SDixit Parmar 	u8 buff[7] = {};
197*106511d2SDixit Parmar 	int err, ret;
198*106511d2SDixit Parmar 	struct device *dev = &data->client->dev;
199*106511d2SDixit Parmar 	u32 sleep_us = tlv493d_sample_rate_us[data->mode];
200*106511d2SDixit Parmar 
201*106511d2SDixit Parmar 	guard(mutex)(&data->lock);
202*106511d2SDixit Parmar 
203*106511d2SDixit Parmar 	ret = pm_runtime_resume_and_get(dev);
204*106511d2SDixit Parmar 	if (ret < 0)
205*106511d2SDixit Parmar 		return ret;
206*106511d2SDixit Parmar 
207*106511d2SDixit Parmar 	/*
208*106511d2SDixit Parmar 	 * Poll until data is valid.
209*106511d2SDixit Parmar 	 * For a valid data TLV493D_TEMP_CHANNEL bit of TLV493D_RD_REG_TEMP
210*106511d2SDixit Parmar 	 * should be set to 0. The sampling time depends on the sensor mode.
211*106511d2SDixit Parmar 	 * Poll 3x the time of the sampling time.
212*106511d2SDixit Parmar 	 */
213*106511d2SDixit Parmar 	ret = read_poll_timeout(i2c_master_recv, err,
214*106511d2SDixit Parmar 			err || !FIELD_GET(TLV493D_TEMP_CHANNEL, buff[TLV493D_RD_REG_TEMP]),
215*106511d2SDixit Parmar 			sleep_us, 3 * sleep_us, false, data->client, buff,
216*106511d2SDixit Parmar 			ARRAY_SIZE(buff));
217*106511d2SDixit Parmar 	if (ret) {
218*106511d2SDixit Parmar 		dev_err(dev, "i2c read poll timeout, error:%d\n", ret);
219*106511d2SDixit Parmar 		goto out_put_autosuspend;
220*106511d2SDixit Parmar 	}
221*106511d2SDixit Parmar 	if (err < 0) {
222*106511d2SDixit Parmar 		dev_err(dev, "i2c read data failed, error:%d\n", err);
223*106511d2SDixit Parmar 		ret = err;
224*106511d2SDixit Parmar 		goto out_put_autosuspend;
225*106511d2SDixit Parmar 	}
226*106511d2SDixit Parmar 
227*106511d2SDixit Parmar 	*x = tlv493d_get_channel_data(buff, TLV493D_AXIS_X);
228*106511d2SDixit Parmar 	*y = tlv493d_get_channel_data(buff, TLV493D_AXIS_Y);
229*106511d2SDixit Parmar 	*z = tlv493d_get_channel_data(buff, TLV493D_AXIS_Z);
230*106511d2SDixit Parmar 	*t = tlv493d_get_channel_data(buff, TLV493D_TEMPERATURE);
231*106511d2SDixit Parmar 
232*106511d2SDixit Parmar out_put_autosuspend:
233*106511d2SDixit Parmar 	pm_runtime_put_autosuspend(dev);
234*106511d2SDixit Parmar 	return ret;
235*106511d2SDixit Parmar }
236*106511d2SDixit Parmar 
tlv493d_init(struct tlv493d_data * data)237*106511d2SDixit Parmar static int tlv493d_init(struct tlv493d_data *data)
238*106511d2SDixit Parmar {
239*106511d2SDixit Parmar 	int ret;
240*106511d2SDixit Parmar 	u8 buff[TLV493D_RD_REG_MAX];
241*106511d2SDixit Parmar 	struct device *dev = &data->client->dev;
242*106511d2SDixit Parmar 
243*106511d2SDixit Parmar 	/*
244*106511d2SDixit Parmar 	 * The sensor initialization requires below steps to be followed,
245*106511d2SDixit Parmar 	 * 1. Power-up sensor.
246*106511d2SDixit Parmar 	 * 2. Read and store read-registers map (0x0-0x9).
247*106511d2SDixit Parmar 	 * 3. Copy values from read reserved registers to write reserved fields
248*106511d2SDixit Parmar 	 *    (0x0-0x3).
249*106511d2SDixit Parmar 	 * 4. Set operating mode.
250*106511d2SDixit Parmar 	 * 5. Write to all registers.
251*106511d2SDixit Parmar 	 */
252*106511d2SDixit Parmar 	ret = i2c_master_recv(data->client, buff, ARRAY_SIZE(buff));
253*106511d2SDixit Parmar 	if (ret < 0)
254*106511d2SDixit Parmar 		return dev_err_probe(dev, ret, "i2c read failed\n");
255*106511d2SDixit Parmar 
256*106511d2SDixit Parmar 	/* Write register 0x0 is reserved. Does not require to be updated.*/
257*106511d2SDixit Parmar 	data->wr_regs[0] = 0;
258*106511d2SDixit Parmar 	data->wr_regs[1] = buff[TLV493D_RD_REG_RES1] & TLV493D_RD_REG_RES1_WR_MASK;
259*106511d2SDixit Parmar 	data->wr_regs[2] = buff[TLV493D_RD_REG_RES2] & TLV493D_RD_REG_RES2_WR_MASK;
260*106511d2SDixit Parmar 	data->wr_regs[3] = buff[TLV493D_RD_REG_RES3] & TLV493D_RD_REG_RES3_WR_MASK;
261*106511d2SDixit Parmar 
262*106511d2SDixit Parmar 	ret = tlv493d_set_operating_mode(data, data->mode);
263*106511d2SDixit Parmar 	if (ret < 0)
264*106511d2SDixit Parmar 		return dev_err_probe(dev, ret, "failed to set operating mode\n");
265*106511d2SDixit Parmar 
266*106511d2SDixit Parmar 	return 0;
267*106511d2SDixit Parmar }
268*106511d2SDixit Parmar 
tlv493d_read_raw(struct iio_dev * indio_dev,const struct iio_chan_spec * chan,int * val,int * val2,long mask)269*106511d2SDixit Parmar static int tlv493d_read_raw(struct iio_dev *indio_dev,
270*106511d2SDixit Parmar 			const struct iio_chan_spec *chan, int *val,
271*106511d2SDixit Parmar 			int *val2, long mask)
272*106511d2SDixit Parmar {
273*106511d2SDixit Parmar 	struct tlv493d_data *data = iio_priv(indio_dev);
274*106511d2SDixit Parmar 	s16 x, y, z, t;
275*106511d2SDixit Parmar 	int ret;
276*106511d2SDixit Parmar 
277*106511d2SDixit Parmar 	switch (mask) {
278*106511d2SDixit Parmar 	case IIO_CHAN_INFO_RAW:
279*106511d2SDixit Parmar 		ret = tlv493d_get_measurements(data, &x, &y, &z, &t);
280*106511d2SDixit Parmar 		if (ret)
281*106511d2SDixit Parmar 			return ret;
282*106511d2SDixit Parmar 
283*106511d2SDixit Parmar 		switch (chan->address) {
284*106511d2SDixit Parmar 		case TLV493D_AXIS_X:
285*106511d2SDixit Parmar 			*val = x;
286*106511d2SDixit Parmar 			return IIO_VAL_INT;
287*106511d2SDixit Parmar 		case TLV493D_AXIS_Y:
288*106511d2SDixit Parmar 			*val = y;
289*106511d2SDixit Parmar 			return IIO_VAL_INT;
290*106511d2SDixit Parmar 		case TLV493D_AXIS_Z:
291*106511d2SDixit Parmar 			*val = z;
292*106511d2SDixit Parmar 			return IIO_VAL_INT;
293*106511d2SDixit Parmar 		case TLV493D_TEMPERATURE:
294*106511d2SDixit Parmar 			*val = t;
295*106511d2SDixit Parmar 			return IIO_VAL_INT;
296*106511d2SDixit Parmar 		default:
297*106511d2SDixit Parmar 			return -EINVAL;
298*106511d2SDixit Parmar 		}
299*106511d2SDixit Parmar 	case IIO_CHAN_INFO_SCALE:
300*106511d2SDixit Parmar 		switch (chan->type) {
301*106511d2SDixit Parmar 		case IIO_MAGN:
302*106511d2SDixit Parmar 			/*
303*106511d2SDixit Parmar 			 * Magnetic field scale: 0.0098 mTesla (i.e. 9.8 µT)
304*106511d2SDixit Parmar 			 * Magnetic field in Gauss: mT * 10 = 0.098.
305*106511d2SDixit Parmar 			 */
306*106511d2SDixit Parmar 			*val = 98;
307*106511d2SDixit Parmar 			*val2 = 1000;
308*106511d2SDixit Parmar 			return IIO_VAL_FRACTIONAL;
309*106511d2SDixit Parmar 		case IIO_TEMP:
310*106511d2SDixit Parmar 			/*
311*106511d2SDixit Parmar 			 * Temperature scale: 1.1 °C per LSB, expressed as 1100 m°C
312*106511d2SDixit Parmar 			 * Returned as integer for IIO core to apply:
313*106511d2SDixit Parmar 			 * temp = (raw + offset) * scale
314*106511d2SDixit Parmar 			 */
315*106511d2SDixit Parmar 			*val = 1100;
316*106511d2SDixit Parmar 			return IIO_VAL_INT;
317*106511d2SDixit Parmar 		default:
318*106511d2SDixit Parmar 			return -EINVAL;
319*106511d2SDixit Parmar 		}
320*106511d2SDixit Parmar 	case IIO_CHAN_INFO_OFFSET:
321*106511d2SDixit Parmar 		switch (chan->type) {
322*106511d2SDixit Parmar 		case IIO_TEMP:
323*106511d2SDixit Parmar 			/*
324*106511d2SDixit Parmar 			 * Temperature offset includes sensor-specific raw offset
325*106511d2SDixit Parmar 			 * plus compensation for +25°C bias in formula.
326*106511d2SDixit Parmar 			 * offset = -raw_offset + (25000 / 1100)
327*106511d2SDixit Parmar 			 * -340 + 22.72 = -317.28
328*106511d2SDixit Parmar 			 */
329*106511d2SDixit Parmar 			*val = -31728;
330*106511d2SDixit Parmar 			*val2 = 100;
331*106511d2SDixit Parmar 			return IIO_VAL_FRACTIONAL;
332*106511d2SDixit Parmar 		default:
333*106511d2SDixit Parmar 			return -EINVAL;
334*106511d2SDixit Parmar 		}
335*106511d2SDixit Parmar 	default:
336*106511d2SDixit Parmar 		return -EINVAL;
337*106511d2SDixit Parmar 	}
338*106511d2SDixit Parmar }
339*106511d2SDixit Parmar 
tlv493d_trigger_handler(int irq,void * ptr)340*106511d2SDixit Parmar static irqreturn_t tlv493d_trigger_handler(int irq, void *ptr)
341*106511d2SDixit Parmar {
342*106511d2SDixit Parmar 	int ret;
343*106511d2SDixit Parmar 	s16 x, y, z, t;
344*106511d2SDixit Parmar 	struct iio_poll_func *pf = ptr;
345*106511d2SDixit Parmar 	struct iio_dev *indio_dev = pf->indio_dev;
346*106511d2SDixit Parmar 	struct tlv493d_data *data = iio_priv(indio_dev);
347*106511d2SDixit Parmar 	struct device *dev = &data->client->dev;
348*106511d2SDixit Parmar 	struct {
349*106511d2SDixit Parmar 		s16 channels[3];
350*106511d2SDixit Parmar 		s16 temperature;
351*106511d2SDixit Parmar 		aligned_s64 timestamp;
352*106511d2SDixit Parmar 	} scan;
353*106511d2SDixit Parmar 
354*106511d2SDixit Parmar 	ret = tlv493d_get_measurements(data, &x, &y, &z, &t);
355*106511d2SDixit Parmar 	if (ret) {
356*106511d2SDixit Parmar 		dev_err(dev, "failed to read sensor data\n");
357*106511d2SDixit Parmar 		goto out_trigger_notify;
358*106511d2SDixit Parmar 	}
359*106511d2SDixit Parmar 
360*106511d2SDixit Parmar 	scan.channels[0] = x;
361*106511d2SDixit Parmar 	scan.channels[1] = y;
362*106511d2SDixit Parmar 	scan.channels[2] = z;
363*106511d2SDixit Parmar 	scan.temperature = t;
364*106511d2SDixit Parmar 	iio_push_to_buffers_with_ts(indio_dev, &scan, sizeof(scan), pf->timestamp);
365*106511d2SDixit Parmar 
366*106511d2SDixit Parmar out_trigger_notify:
367*106511d2SDixit Parmar 	iio_trigger_notify_done(indio_dev->trig);
368*106511d2SDixit Parmar 
369*106511d2SDixit Parmar 	return IRQ_HANDLED;
370*106511d2SDixit Parmar }
371*106511d2SDixit Parmar 
372*106511d2SDixit Parmar #define TLV493D_AXIS_CHANNEL(axis, index)			\
373*106511d2SDixit Parmar 	{							\
374*106511d2SDixit Parmar 		.type = IIO_MAGN,				\
375*106511d2SDixit Parmar 		.modified = 1,					\
376*106511d2SDixit Parmar 		.channel2 = IIO_MOD_##axis,			\
377*106511d2SDixit Parmar 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |	\
378*106511d2SDixit Parmar 				BIT(IIO_CHAN_INFO_SCALE),	\
379*106511d2SDixit Parmar 		.address = index,				\
380*106511d2SDixit Parmar 		.scan_index = index,				\
381*106511d2SDixit Parmar 		.scan_type = {					\
382*106511d2SDixit Parmar 			.sign = 's',				\
383*106511d2SDixit Parmar 			.realbits = 12,				\
384*106511d2SDixit Parmar 			.storagebits = 16,			\
385*106511d2SDixit Parmar 			.endianness = IIO_CPU,			\
386*106511d2SDixit Parmar 		},						\
387*106511d2SDixit Parmar 	}
388*106511d2SDixit Parmar 
389*106511d2SDixit Parmar static const struct iio_chan_spec tlv493d_channels[] = {
390*106511d2SDixit Parmar 	TLV493D_AXIS_CHANNEL(X, TLV493D_AXIS_X),
391*106511d2SDixit Parmar 	TLV493D_AXIS_CHANNEL(Y, TLV493D_AXIS_Y),
392*106511d2SDixit Parmar 	TLV493D_AXIS_CHANNEL(Z, TLV493D_AXIS_Z),
393*106511d2SDixit Parmar 	{
394*106511d2SDixit Parmar 		.type = IIO_TEMP,
395*106511d2SDixit Parmar 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
396*106511d2SDixit Parmar 				BIT(IIO_CHAN_INFO_SCALE) |
397*106511d2SDixit Parmar 				BIT(IIO_CHAN_INFO_OFFSET),
398*106511d2SDixit Parmar 		.address = TLV493D_TEMPERATURE,
399*106511d2SDixit Parmar 		.scan_index = TLV493D_TEMPERATURE,
400*106511d2SDixit Parmar 		.scan_type = {
401*106511d2SDixit Parmar 			.sign = 's',
402*106511d2SDixit Parmar 			.realbits = 12,
403*106511d2SDixit Parmar 			.storagebits = 16,
404*106511d2SDixit Parmar 			.endianness = IIO_CPU,
405*106511d2SDixit Parmar 		},
406*106511d2SDixit Parmar 	},
407*106511d2SDixit Parmar 	IIO_CHAN_SOFT_TIMESTAMP(4),
408*106511d2SDixit Parmar };
409*106511d2SDixit Parmar 
410*106511d2SDixit Parmar static const struct iio_info tlv493d_info = {
411*106511d2SDixit Parmar 	.read_raw = tlv493d_read_raw,
412*106511d2SDixit Parmar };
413*106511d2SDixit Parmar 
414*106511d2SDixit Parmar static const unsigned long tlv493d_scan_masks[] = { GENMASK(3, 0), 0 };
415*106511d2SDixit Parmar 
tlv493d_probe(struct i2c_client * client)416*106511d2SDixit Parmar static int tlv493d_probe(struct i2c_client *client)
417*106511d2SDixit Parmar {
418*106511d2SDixit Parmar 	struct device *dev = &client->dev;
419*106511d2SDixit Parmar 	struct iio_dev *indio_dev;
420*106511d2SDixit Parmar 	struct tlv493d_data *data;
421*106511d2SDixit Parmar 	int ret;
422*106511d2SDixit Parmar 
423*106511d2SDixit Parmar 	indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
424*106511d2SDixit Parmar 	if (!indio_dev)
425*106511d2SDixit Parmar 		return -ENOMEM;
426*106511d2SDixit Parmar 
427*106511d2SDixit Parmar 	data = iio_priv(indio_dev);
428*106511d2SDixit Parmar 	data->client = client;
429*106511d2SDixit Parmar 	i2c_set_clientdata(client, indio_dev);
430*106511d2SDixit Parmar 
431*106511d2SDixit Parmar 	ret = devm_mutex_init(dev, &data->lock);
432*106511d2SDixit Parmar 	if (ret)
433*106511d2SDixit Parmar 		return ret;
434*106511d2SDixit Parmar 
435*106511d2SDixit Parmar 	ret = devm_regulator_get_enable(dev, "vdd");
436*106511d2SDixit Parmar 	if (ret)
437*106511d2SDixit Parmar 		return dev_err_probe(dev, ret, "failed to enable regulator\n");
438*106511d2SDixit Parmar 
439*106511d2SDixit Parmar 	/*
440*106511d2SDixit Parmar 	 * Setting Sensor default operating mode to Master-Controlled mode since
441*106511d2SDixit Parmar 	 * it performs measurement cycle only on-request and stays in Power-Down
442*106511d2SDixit Parmar 	 * state until next cycle is initiated.
443*106511d2SDixit Parmar 	 */
444*106511d2SDixit Parmar 	data->mode = TLV493D_OP_MODE_MASTERCONTROLLED;
445*106511d2SDixit Parmar 	ret = tlv493d_init(data);
446*106511d2SDixit Parmar 	if (ret)
447*106511d2SDixit Parmar 		return dev_err_probe(dev, ret, "failed to initialize\n");
448*106511d2SDixit Parmar 
449*106511d2SDixit Parmar 	indio_dev->info = &tlv493d_info;
450*106511d2SDixit Parmar 	indio_dev->modes = INDIO_DIRECT_MODE;
451*106511d2SDixit Parmar 	indio_dev->name = client->name;
452*106511d2SDixit Parmar 	indio_dev->channels = tlv493d_channels;
453*106511d2SDixit Parmar 	indio_dev->num_channels = ARRAY_SIZE(tlv493d_channels);
454*106511d2SDixit Parmar 	indio_dev->available_scan_masks = tlv493d_scan_masks;
455*106511d2SDixit Parmar 
456*106511d2SDixit Parmar 	ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
457*106511d2SDixit Parmar 					      iio_pollfunc_store_time,
458*106511d2SDixit Parmar 					      tlv493d_trigger_handler,
459*106511d2SDixit Parmar 					      NULL);
460*106511d2SDixit Parmar 	if (ret)
461*106511d2SDixit Parmar 		return dev_err_probe(dev, ret, "iio triggered buffer setup failed\n");
462*106511d2SDixit Parmar 
463*106511d2SDixit Parmar 	ret = pm_runtime_set_active(dev);
464*106511d2SDixit Parmar 	if (ret)
465*106511d2SDixit Parmar 		return ret;
466*106511d2SDixit Parmar 
467*106511d2SDixit Parmar 	ret = devm_pm_runtime_enable(dev);
468*106511d2SDixit Parmar 	if (ret)
469*106511d2SDixit Parmar 		return ret;
470*106511d2SDixit Parmar 
471*106511d2SDixit Parmar 	pm_runtime_get_noresume(dev);
472*106511d2SDixit Parmar 	pm_runtime_set_autosuspend_delay(dev, 500);
473*106511d2SDixit Parmar 	pm_runtime_use_autosuspend(dev);
474*106511d2SDixit Parmar 
475*106511d2SDixit Parmar 	pm_runtime_put_autosuspend(dev);
476*106511d2SDixit Parmar 
477*106511d2SDixit Parmar 	ret = devm_iio_device_register(dev, indio_dev);
478*106511d2SDixit Parmar 	if (ret)
479*106511d2SDixit Parmar 		return dev_err_probe(dev, ret, "iio device register failed\n");
480*106511d2SDixit Parmar 
481*106511d2SDixit Parmar 	return 0;
482*106511d2SDixit Parmar }
483*106511d2SDixit Parmar 
tlv493d_runtime_suspend(struct device * dev)484*106511d2SDixit Parmar static int tlv493d_runtime_suspend(struct device *dev)
485*106511d2SDixit Parmar {
486*106511d2SDixit Parmar 	struct tlv493d_data *data = iio_priv(dev_get_drvdata(dev));
487*106511d2SDixit Parmar 
488*106511d2SDixit Parmar 	return tlv493d_set_operating_mode(data, TLV493D_OP_MODE_POWERDOWN);
489*106511d2SDixit Parmar }
490*106511d2SDixit Parmar 
tlv493d_runtime_resume(struct device * dev)491*106511d2SDixit Parmar static int tlv493d_runtime_resume(struct device *dev)
492*106511d2SDixit Parmar {
493*106511d2SDixit Parmar 	struct tlv493d_data *data = iio_priv(dev_get_drvdata(dev));
494*106511d2SDixit Parmar 
495*106511d2SDixit Parmar 	return tlv493d_set_operating_mode(data, data->mode);
496*106511d2SDixit Parmar }
497*106511d2SDixit Parmar 
498*106511d2SDixit Parmar static DEFINE_RUNTIME_DEV_PM_OPS(tlv493d_pm_ops, tlv493d_runtime_suspend,
499*106511d2SDixit Parmar 				 tlv493d_runtime_resume, NULL);
500*106511d2SDixit Parmar 
501*106511d2SDixit Parmar static const struct i2c_device_id tlv493d_id[] = {
502*106511d2SDixit Parmar 	{ "tlv493d" },
503*106511d2SDixit Parmar 	{ }
504*106511d2SDixit Parmar };
505*106511d2SDixit Parmar MODULE_DEVICE_TABLE(i2c, tlv493d_id);
506*106511d2SDixit Parmar 
507*106511d2SDixit Parmar static const struct of_device_id tlv493d_of_match[] = {
508*106511d2SDixit Parmar 	{ .compatible = "infineon,tlv493d-a1b6" },
509*106511d2SDixit Parmar 	{ }
510*106511d2SDixit Parmar };
511*106511d2SDixit Parmar MODULE_DEVICE_TABLE(of, tlv493d_of_match);
512*106511d2SDixit Parmar 
513*106511d2SDixit Parmar static struct i2c_driver tlv493d_driver = {
514*106511d2SDixit Parmar 	.driver = {
515*106511d2SDixit Parmar 		.name = "tlv493d",
516*106511d2SDixit Parmar 		.of_match_table = tlv493d_of_match,
517*106511d2SDixit Parmar 		.pm = pm_ptr(&tlv493d_pm_ops),
518*106511d2SDixit Parmar 	},
519*106511d2SDixit Parmar 	.probe = tlv493d_probe,
520*106511d2SDixit Parmar 	.id_table = tlv493d_id,
521*106511d2SDixit Parmar };
522*106511d2SDixit Parmar module_i2c_driver(tlv493d_driver);
523*106511d2SDixit Parmar 
524*106511d2SDixit Parmar MODULE_LICENSE("GPL");
525*106511d2SDixit Parmar MODULE_DESCRIPTION("Infineon TLV493D Low-Power 3D Magnetic Sensor");
526*106511d2SDixit Parmar MODULE_AUTHOR("Dixit Parmar <dixitparmar19@gmail.com>");
527