xref: /linux/drivers/iio/magnetometer/als31300.c (revision c26f4fbd58375bd6ef74f95eb73d61762ad97c59)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Driver for the Allegro MicroSystems ALS31300 3-D Linear Hall Effect Sensor
4  *
5  * Copyright (c) 2024 Linaro Limited
6  */
7 
8 #include <linux/bits.h>
9 #include <linux/bitfield.h>
10 #include <linux/delay.h>
11 #include <linux/module.h>
12 #include <linux/i2c.h>
13 #include <linux/regmap.h>
14 #include <linux/pm.h>
15 #include <linux/pm_runtime.h>
16 #include <linux/regulator/consumer.h>
17 #include <linux/types.h>
18 #include <linux/units.h>
19 
20 #include <linux/iio/buffer.h>
21 #include <linux/iio/iio.h>
22 #include <linux/iio/trigger_consumer.h>
23 #include <linux/iio/triggered_buffer.h>
24 
25 /*
26  * The Allegro MicroSystems ALS31300 has an EEPROM space to configure how
27  * the device works and how the interrupt line behaves.
28  * Only the default setup with external trigger is supported.
29  *
30  * While the bindings supports declaring an interrupt line, those
31  * events are not supported.
32  *
33  * It should be possible to adapt the driver to the current
34  * device EEPROM setup at runtime.
35  */
36 
37 #define ALS31300_EEPROM_CONFIG		0x02
38 #define ALS31300_EEPROM_INTERRUPT	0x03
39 #define ALS31300_EEPROM_CUSTOMER_1	0x0d
40 #define ALS31300_EEPROM_CUSTOMER_2	0x0e
41 #define ALS31300_EEPROM_CUSTOMER_3	0x0f
42 #define ALS31300_VOL_MODE		0x27
43 #define ALS31300_VOL_MODE_LPDCM			GENMASK(6, 4)
44 #define   ALS31300_LPDCM_INACTIVE_0_5_MS	0
45 #define   ALS31300_LPDCM_INACTIVE_1_0_MS	1
46 #define   ALS31300_LPDCM_INACTIVE_5_0_MS	2
47 #define   ALS31300_LPDCM_INACTIVE_10_0_MS	3
48 #define   ALS31300_LPDCM_INACTIVE_50_0_MS	4
49 #define   ALS31300_LPDCM_INACTIVE_100_0_MS	5
50 #define   ALS31300_LPDCM_INACTIVE_500_0_MS	6
51 #define   ALS31300_LPDCM_INACTIVE_1000_0_MS	7
52 #define ALS31300_VOL_MODE_SLEEP			GENMASK(1, 0)
53 #define   ALS31300_VOL_MODE_ACTIVE_MODE		0
54 #define   ALS31300_VOL_MODE_SLEEP_MODE		1
55 #define   ALS31300_VOL_MODE_LPDCM_MODE		2
56 #define ALS31300_VOL_MSB		0x28
57 #define ALS31300_VOL_MSB_TEMPERATURE		GENMASK(5, 0)
58 #define ALS31300_VOL_MSB_INTERRUPT		BIT(6)
59 #define ALS31300_VOL_MSB_NEW_DATA		BIT(7)
60 #define ALS31300_VOL_MSB_Z_AXIS			GENMASK(15, 8)
61 #define ALS31300_VOL_MSB_Y_AXIS			GENMASK(23, 16)
62 #define ALS31300_VOL_MSB_X_AXIS			GENMASK(31, 24)
63 #define ALS31300_VOL_LSB		0x29
64 #define ALS31300_VOL_LSB_TEMPERATURE		GENMASK(5, 0)
65 #define ALS31300_VOL_LSB_HALL_STATUS		GENMASK(7, 7)
66 #define ALS31300_VOL_LSB_Z_AXIS			GENMASK(11, 8)
67 #define ALS31300_VOL_LSB_Y_AXIS			GENMASK(15, 12)
68 #define ALS31300_VOL_LSB_X_AXIS			GENMASK(19, 16)
69 #define ALS31300_VOL_LSB_INTERRUPT_WRITE	BIT(20)
70 #define ALS31300_CUSTOMER_ACCESS	0x35
71 
72 #define ALS31300_DATA_X_GET(b)		\
73 		sign_extend32(FIELD_GET(ALS31300_VOL_MSB_X_AXIS, b[0]) << 4 | \
74 			      FIELD_GET(ALS31300_VOL_LSB_X_AXIS, b[1]), 11)
75 #define ALS31300_DATA_Y_GET(b)		\
76 		sign_extend32(FIELD_GET(ALS31300_VOL_MSB_Y_AXIS, b[0]) << 4 | \
77 			      FIELD_GET(ALS31300_VOL_LSB_Y_AXIS, b[1]), 11)
78 #define ALS31300_DATA_Z_GET(b)		\
79 		sign_extend32(FIELD_GET(ALS31300_VOL_MSB_Z_AXIS, b[0]) << 4 | \
80 			      FIELD_GET(ALS31300_VOL_LSB_Z_AXIS, b[1]), 11)
81 #define ALS31300_TEMPERATURE_GET(b)	\
82 		(FIELD_GET(ALS31300_VOL_MSB_TEMPERATURE, b[0]) << 6 | \
83 		 FIELD_GET(ALS31300_VOL_LSB_TEMPERATURE, b[1]))
84 
85 enum als31300_channels {
86 	TEMPERATURE = 0,
87 	AXIS_X,
88 	AXIS_Y,
89 	AXIS_Z,
90 };
91 
92 struct als31300_variant_info {
93 	u8 sensitivity;
94 };
95 
96 struct als31300_data {
97 	struct device *dev;
98 	/* protects power on/off the device and access HW */
99 	struct mutex mutex;
100 	const struct als31300_variant_info *variant_info;
101 	struct regmap *map;
102 };
103 
104 /* The whole measure is split into 2x32-bit registers, we need to read them both at once */
als31300_get_measure(struct als31300_data * data,u16 * t,s16 * x,s16 * y,s16 * z)105 static int als31300_get_measure(struct als31300_data *data,
106 				u16 *t, s16 *x, s16 *y, s16 *z)
107 {
108 	u32 buf[2];
109 	int ret, err;
110 
111 	guard(mutex)(&data->mutex);
112 
113 	ret = pm_runtime_resume_and_get(data->dev);
114 	if (ret)
115 		return ret;
116 
117 	/*
118 	 * Loop until data is valid, new data should have the
119 	 * ALS31300_VOL_MSB_NEW_DATA bit set to 1.
120 	 * Max update rate is 2KHz, wait up to 1ms.
121 	 */
122 	ret = read_poll_timeout(regmap_bulk_read, err,
123 				err || FIELD_GET(ALS31300_VOL_MSB_NEW_DATA, buf[0]),
124 				20, USEC_PER_MSEC, false,
125 				data->map, ALS31300_VOL_MSB, buf, ARRAY_SIZE(buf));
126 	/* Bail out on read_poll_timeout() error */
127 	if (ret)
128 		goto out;
129 
130 	/* Bail out on regmap_bulk_read() error */
131 	if (err) {
132 		dev_err(data->dev, "read data failed, error %d\n", ret);
133 		ret = err;
134 		goto out;
135 	}
136 
137 	*t = ALS31300_TEMPERATURE_GET(buf);
138 	*x = ALS31300_DATA_X_GET(buf);
139 	*y = ALS31300_DATA_Y_GET(buf);
140 	*z = ALS31300_DATA_Z_GET(buf);
141 
142 out:
143 	pm_runtime_mark_last_busy(data->dev);
144 	pm_runtime_put_autosuspend(data->dev);
145 
146 	return ret;
147 }
148 
als31300_read_raw(struct iio_dev * indio_dev,const struct iio_chan_spec * chan,int * val,int * val2,long mask)149 static int als31300_read_raw(struct iio_dev *indio_dev,
150 			     const struct iio_chan_spec *chan, int *val,
151 			     int *val2, long mask)
152 {
153 	struct als31300_data *data = iio_priv(indio_dev);
154 	s16 x, y, z;
155 	u16 t;
156 	int ret;
157 
158 	switch (mask) {
159 	case IIO_CHAN_INFO_PROCESSED:
160 	case IIO_CHAN_INFO_RAW:
161 		ret = als31300_get_measure(data, &t, &x, &y, &z);
162 		if (ret)
163 			return ret;
164 
165 		switch (chan->address) {
166 		case TEMPERATURE:
167 			*val = t;
168 			return IIO_VAL_INT;
169 		case AXIS_X:
170 			*val = x;
171 			return IIO_VAL_INT;
172 		case AXIS_Y:
173 			*val = y;
174 			return IIO_VAL_INT;
175 		case AXIS_Z:
176 			*val = z;
177 			return IIO_VAL_INT;
178 		default:
179 			return -EINVAL;
180 		}
181 	case IIO_CHAN_INFO_SCALE:
182 		switch (chan->type) {
183 		case IIO_TEMP:
184 			/*
185 			 * Fractional part of:
186 			 *         1000 * 302 * (value - 1708)
187 			 * temp = ----------------------------
188 			 *             4096
189 			 * to convert temperature in millicelcius.
190 			 */
191 			*val = MILLI * 302;
192 			*val2 = 4096;
193 			return IIO_VAL_FRACTIONAL;
194 		case IIO_MAGN:
195 			/*
196 			 * Devices are configured in factory
197 			 * with different sensitivities:
198 			 * - 500 GAUSS <-> 4 LSB/Gauss
199 			 * - 1000 GAUSS <-> 2 LSB/Gauss
200 			 * - 2000 GAUSS <-> 1 LSB/Gauss
201 			 * with translates by a division of the returned
202 			 * value to get Gauss value.
203 			 * The sensitivity cannot be read at runtime
204 			 * so the value depends on the model compatible
205 			 * or device id.
206 			 */
207 			*val = 1;
208 			*val2 = data->variant_info->sensitivity;
209 			return IIO_VAL_FRACTIONAL;
210 		default:
211 			return -EINVAL;
212 		}
213 	case IIO_CHAN_INFO_OFFSET:
214 		switch (chan->type) {
215 		case IIO_TEMP:
216 			*val = -1708;
217 			return IIO_VAL_INT;
218 		default:
219 			return -EINVAL;
220 		}
221 	default:
222 		return -EINVAL;
223 	}
224 }
225 
als31300_trigger_handler(int irq,void * p)226 static irqreturn_t als31300_trigger_handler(int irq, void *p)
227 {
228 	struct iio_poll_func *pf = p;
229 	struct iio_dev *indio_dev = pf->indio_dev;
230 	struct als31300_data *data = iio_priv(indio_dev);
231 	struct {
232 		u16 temperature;
233 		s16 channels[3];
234 		aligned_s64 timestamp;
235 	} scan;
236 	s16 x, y, z;
237 	int ret;
238 	u16 t;
239 
240 	ret = als31300_get_measure(data, &t, &x, &y, &z);
241 	if (ret)
242 		goto trigger_out;
243 
244 	scan.temperature = t;
245 	scan.channels[0] = x;
246 	scan.channels[1] = y;
247 	scan.channels[2] = z;
248 	iio_push_to_buffers_with_ts(indio_dev, &scan, sizeof(scan), pf->timestamp);
249 
250 trigger_out:
251 	iio_trigger_notify_done(indio_dev->trig);
252 
253 	return IRQ_HANDLED;
254 }
255 
256 #define ALS31300_AXIS_CHANNEL(axis, index)				     \
257 	{								     \
258 		.type = IIO_MAGN,					     \
259 		.modified = 1,						     \
260 		.channel2 = IIO_MOD_##axis,				     \
261 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |		     \
262 				      BIT(IIO_CHAN_INFO_SCALE),		     \
263 		.address = index,					     \
264 		.scan_index = index,					     \
265 		.scan_type = {						     \
266 			.sign = 's',					     \
267 			.realbits = 12,					     \
268 			.storagebits = 16,				     \
269 			.endianness = IIO_CPU,				     \
270 		},							     \
271 	}
272 
273 static const struct iio_chan_spec als31300_channels[] = {
274 	{
275 		.type = IIO_TEMP,
276 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
277 				      BIT(IIO_CHAN_INFO_SCALE) |
278 				      BIT(IIO_CHAN_INFO_OFFSET),
279 		.address = TEMPERATURE,
280 		.scan_index = TEMPERATURE,
281 		.scan_type = {
282 			.sign = 'u',
283 			.realbits = 16,
284 			.storagebits = 16,
285 			.endianness = IIO_CPU,
286 		},
287 	},
288 	ALS31300_AXIS_CHANNEL(X, AXIS_X),
289 	ALS31300_AXIS_CHANNEL(Y, AXIS_Y),
290 	ALS31300_AXIS_CHANNEL(Z, AXIS_Z),
291 	IIO_CHAN_SOFT_TIMESTAMP(4),
292 };
293 
294 static const struct iio_info als31300_info = {
295 	.read_raw = als31300_read_raw,
296 };
297 
als31300_set_operating_mode(struct als31300_data * data,unsigned int val)298 static int als31300_set_operating_mode(struct als31300_data *data,
299 				       unsigned int val)
300 {
301 	int ret;
302 
303 	ret = regmap_update_bits(data->map, ALS31300_VOL_MODE,
304 				 ALS31300_VOL_MODE_SLEEP, val);
305 	if (ret) {
306 		dev_err(data->dev, "failed to set operating mode (%pe)\n", ERR_PTR(ret));
307 		return ret;
308 	}
309 
310 	/* The time it takes to exit sleep mode is equivalent to Power-On Delay Time */
311 	if (val == ALS31300_VOL_MODE_ACTIVE_MODE)
312 		fsleep(600);
313 
314 	return 0;
315 }
316 
als31300_power_down(void * data)317 static void als31300_power_down(void *data)
318 {
319 	als31300_set_operating_mode(data, ALS31300_VOL_MODE_SLEEP_MODE);
320 }
321 
322 static const struct iio_buffer_setup_ops als31300_setup_ops = {};
323 
324 static const unsigned long als31300_scan_masks[] = { GENMASK(3, 0), 0 };
325 
als31300_volatile_reg(struct device * dev,unsigned int reg)326 static bool als31300_volatile_reg(struct device *dev, unsigned int reg)
327 {
328 	return reg == ALS31300_VOL_MSB || reg == ALS31300_VOL_LSB;
329 }
330 
331 static const struct regmap_config als31300_regmap_config = {
332 	.reg_bits = 8,
333 	.val_bits = 32,
334 	.max_register = ALS31300_CUSTOMER_ACCESS,
335 	.volatile_reg = als31300_volatile_reg,
336 };
337 
als31300_probe(struct i2c_client * i2c)338 static int als31300_probe(struct i2c_client *i2c)
339 {
340 	struct device *dev = &i2c->dev;
341 	struct als31300_data *data;
342 	struct iio_dev *indio_dev;
343 	int ret;
344 
345 	indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
346 	if (!indio_dev)
347 		return -ENOMEM;
348 
349 	data = iio_priv(indio_dev);
350 	data->dev = dev;
351 	i2c_set_clientdata(i2c, indio_dev);
352 
353 	ret = devm_mutex_init(dev, &data->mutex);
354 	if (ret)
355 		return ret;
356 
357 	data->variant_info = i2c_get_match_data(i2c);
358 	if (!data->variant_info)
359 		return -EINVAL;
360 
361 	data->map = devm_regmap_init_i2c(i2c, &als31300_regmap_config);
362 	if (IS_ERR(data->map))
363 		return dev_err_probe(dev, PTR_ERR(data->map),
364 				     "failed to allocate register map\n");
365 
366 	ret = devm_regulator_get_enable(dev, "vcc");
367 	if (ret)
368 		return dev_err_probe(dev, ret, "failed to enable regulator\n");
369 
370 	ret = als31300_set_operating_mode(data, ALS31300_VOL_MODE_ACTIVE_MODE);
371 	if (ret)
372 		return dev_err_probe(dev, ret, "failed to power on device\n");
373 
374 	ret = devm_add_action_or_reset(dev, als31300_power_down, data);
375 	if (ret)
376 		return dev_err_probe(dev, ret, "failed to add powerdown action\n");
377 
378 	indio_dev->info = &als31300_info;
379 	indio_dev->modes = INDIO_DIRECT_MODE;
380 	indio_dev->name = i2c->name;
381 	indio_dev->channels = als31300_channels;
382 	indio_dev->num_channels = ARRAY_SIZE(als31300_channels);
383 	indio_dev->available_scan_masks = als31300_scan_masks;
384 
385 	ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
386 					      iio_pollfunc_store_time,
387 					      als31300_trigger_handler,
388 					      &als31300_setup_ops);
389 	if (ret < 0)
390 		return dev_err_probe(dev, ret, "iio triggered buffer setup failed\n");
391 
392 	ret = pm_runtime_set_active(dev);
393 	if (ret < 0)
394 		return ret;
395 
396 	ret = devm_pm_runtime_enable(dev);
397 	if (ret)
398 		return ret;
399 
400 	pm_runtime_get_noresume(dev);
401 	pm_runtime_set_autosuspend_delay(dev, 200);
402 	pm_runtime_use_autosuspend(dev);
403 
404 	pm_runtime_mark_last_busy(dev);
405 	pm_runtime_put_autosuspend(dev);
406 
407 	ret = devm_iio_device_register(dev, indio_dev);
408 	if (ret)
409 		return dev_err_probe(dev, ret, "device register failed\n");
410 
411 	return 0;
412 }
413 
als31300_runtime_suspend(struct device * dev)414 static int als31300_runtime_suspend(struct device *dev)
415 {
416 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
417 	struct als31300_data *data = iio_priv(indio_dev);
418 
419 	return als31300_set_operating_mode(data, ALS31300_VOL_MODE_SLEEP_MODE);
420 }
421 
als31300_runtime_resume(struct device * dev)422 static int als31300_runtime_resume(struct device *dev)
423 {
424 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
425 	struct als31300_data *data = iio_priv(indio_dev);
426 
427 	return als31300_set_operating_mode(data, ALS31300_VOL_MODE_ACTIVE_MODE);
428 }
429 
430 static DEFINE_RUNTIME_DEV_PM_OPS(als31300_pm_ops,
431 				 als31300_runtime_suspend, als31300_runtime_resume,
432 				 NULL);
433 
434 static const struct als31300_variant_info al31300_variant_500 = {
435 	.sensitivity = 4,
436 };
437 
438 static const struct als31300_variant_info al31300_variant_1000 = {
439 	.sensitivity = 2,
440 };
441 
442 static const struct als31300_variant_info al31300_variant_2000 = {
443 	.sensitivity = 1,
444 };
445 
446 static const struct i2c_device_id als31300_id[] = {
447 	{
448 		.name = "als31300-500",
449 		.driver_data = (kernel_ulong_t)&al31300_variant_500,
450 	},
451 	{
452 		.name = "als31300-1000",
453 		.driver_data = (kernel_ulong_t)&al31300_variant_1000,
454 	},
455 	{
456 		.name = "als31300-2000",
457 		.driver_data = (kernel_ulong_t)&al31300_variant_2000,
458 	},
459 	{ }
460 };
461 MODULE_DEVICE_TABLE(i2c, als31300_id);
462 
463 static const struct of_device_id als31300_of_match[] = {
464 	{
465 		.compatible = "allegromicro,als31300-500",
466 		.data = &al31300_variant_500,
467 	},
468 	{
469 		.compatible = "allegromicro,als31300-1000",
470 		.data = &al31300_variant_1000,
471 	},
472 	{
473 		.compatible = "allegromicro,als31300-2000",
474 		.data = &al31300_variant_2000,
475 	},
476 	{ }
477 };
478 MODULE_DEVICE_TABLE(of, als31300_of_match);
479 
480 static struct i2c_driver als31300_driver = {
481 	.driver	 = {
482 		.name = "als31300",
483 		.of_match_table = als31300_of_match,
484 		.pm = pm_ptr(&als31300_pm_ops),
485 	},
486 	.probe = als31300_probe,
487 	.id_table = als31300_id,
488 };
489 module_i2c_driver(als31300_driver);
490 
491 MODULE_LICENSE("GPL");
492 MODULE_DESCRIPTION("ALS31300 3-D Linear Hall Effect Driver");
493 MODULE_AUTHOR("Neil Armstrong <neil.armstrong@linaro.org>");
494