xref: /openbmc/linux/drivers/input/misc/bma150.c (revision 8e8e69d6)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (c) 2011 Bosch Sensortec GmbH
4  * Copyright (c) 2011 Unixphere
5  *
6  * This driver adds support for Bosch Sensortec's digital acceleration
7  * sensors BMA150 and SMB380.
8  * The SMB380 is fully compatible with BMA150 and only differs in packaging.
9  *
10  * The datasheet for the BMA150 chip can be found here:
11  * http://www.bosch-sensortec.com/content/language1/downloads/BST-BMA150-DS000-07.pdf
12  */
13 #include <linux/kernel.h>
14 #include <linux/module.h>
15 #include <linux/i2c.h>
16 #include <linux/input.h>
17 #include <linux/input-polldev.h>
18 #include <linux/interrupt.h>
19 #include <linux/delay.h>
20 #include <linux/slab.h>
21 #include <linux/pm.h>
22 #include <linux/pm_runtime.h>
23 #include <linux/bma150.h>
24 
25 #define ABSMAX_ACC_VAL		0x01FF
26 #define ABSMIN_ACC_VAL		-(ABSMAX_ACC_VAL)
27 
28 /* Each axis is represented by a 2-byte data word */
29 #define BMA150_XYZ_DATA_SIZE	6
30 
31 /* Input poll interval in milliseconds */
32 #define BMA150_POLL_INTERVAL	10
33 #define BMA150_POLL_MAX		200
34 #define BMA150_POLL_MIN		0
35 
36 #define BMA150_MODE_NORMAL	0
37 #define BMA150_MODE_SLEEP	2
38 #define BMA150_MODE_WAKE_UP	3
39 
40 /* Data register addresses */
41 #define BMA150_DATA_0_REG	0x00
42 #define BMA150_DATA_1_REG	0x01
43 #define BMA150_DATA_2_REG	0x02
44 
45 /* Control register addresses */
46 #define BMA150_CTRL_0_REG	0x0A
47 #define BMA150_CTRL_1_REG	0x0B
48 #define BMA150_CTRL_2_REG	0x14
49 #define BMA150_CTRL_3_REG	0x15
50 
51 /* Configuration/Setting register addresses */
52 #define BMA150_CFG_0_REG	0x0C
53 #define BMA150_CFG_1_REG	0x0D
54 #define BMA150_CFG_2_REG	0x0E
55 #define BMA150_CFG_3_REG	0x0F
56 #define BMA150_CFG_4_REG	0x10
57 #define BMA150_CFG_5_REG	0x11
58 
59 #define BMA150_CHIP_ID		2
60 #define BMA150_CHIP_ID_REG	BMA150_DATA_0_REG
61 
62 #define BMA150_ACC_X_LSB_REG	BMA150_DATA_2_REG
63 
64 #define BMA150_SLEEP_POS	0
65 #define BMA150_SLEEP_MSK	0x01
66 #define BMA150_SLEEP_REG	BMA150_CTRL_0_REG
67 
68 #define BMA150_BANDWIDTH_POS	0
69 #define BMA150_BANDWIDTH_MSK	0x07
70 #define BMA150_BANDWIDTH_REG	BMA150_CTRL_2_REG
71 
72 #define BMA150_RANGE_POS	3
73 #define BMA150_RANGE_MSK	0x18
74 #define BMA150_RANGE_REG	BMA150_CTRL_2_REG
75 
76 #define BMA150_WAKE_UP_POS	0
77 #define BMA150_WAKE_UP_MSK	0x01
78 #define BMA150_WAKE_UP_REG	BMA150_CTRL_3_REG
79 
80 #define BMA150_SW_RES_POS	1
81 #define BMA150_SW_RES_MSK	0x02
82 #define BMA150_SW_RES_REG	BMA150_CTRL_0_REG
83 
84 /* Any-motion interrupt register fields */
85 #define BMA150_ANY_MOTION_EN_POS	6
86 #define BMA150_ANY_MOTION_EN_MSK	0x40
87 #define BMA150_ANY_MOTION_EN_REG	BMA150_CTRL_1_REG
88 
89 #define BMA150_ANY_MOTION_DUR_POS	6
90 #define BMA150_ANY_MOTION_DUR_MSK	0xC0
91 #define BMA150_ANY_MOTION_DUR_REG	BMA150_CFG_5_REG
92 
93 #define BMA150_ANY_MOTION_THRES_REG	BMA150_CFG_4_REG
94 
95 /* Advanced interrupt register fields */
96 #define BMA150_ADV_INT_EN_POS		6
97 #define BMA150_ADV_INT_EN_MSK		0x40
98 #define BMA150_ADV_INT_EN_REG		BMA150_CTRL_3_REG
99 
100 /* High-G interrupt register fields */
101 #define BMA150_HIGH_G_EN_POS		1
102 #define BMA150_HIGH_G_EN_MSK		0x02
103 #define BMA150_HIGH_G_EN_REG		BMA150_CTRL_1_REG
104 
105 #define BMA150_HIGH_G_HYST_POS		3
106 #define BMA150_HIGH_G_HYST_MSK		0x38
107 #define BMA150_HIGH_G_HYST_REG		BMA150_CFG_5_REG
108 
109 #define BMA150_HIGH_G_DUR_REG		BMA150_CFG_3_REG
110 #define BMA150_HIGH_G_THRES_REG		BMA150_CFG_2_REG
111 
112 /* Low-G interrupt register fields */
113 #define BMA150_LOW_G_EN_POS		0
114 #define BMA150_LOW_G_EN_MSK		0x01
115 #define BMA150_LOW_G_EN_REG		BMA150_CTRL_1_REG
116 
117 #define BMA150_LOW_G_HYST_POS		0
118 #define BMA150_LOW_G_HYST_MSK		0x07
119 #define BMA150_LOW_G_HYST_REG		BMA150_CFG_5_REG
120 
121 #define BMA150_LOW_G_DUR_REG		BMA150_CFG_1_REG
122 #define BMA150_LOW_G_THRES_REG		BMA150_CFG_0_REG
123 
124 struct bma150_data {
125 	struct i2c_client *client;
126 	struct input_polled_dev *input_polled;
127 	struct input_dev *input;
128 	u8 mode;
129 };
130 
131 /*
132  * The settings for the given range, bandwidth and interrupt features
133  * are stated and verified by Bosch Sensortec where they are configured
134  * to provide a generic sensitivity performance.
135  */
136 static const struct bma150_cfg default_cfg = {
137 	.any_motion_int = 1,
138 	.hg_int = 1,
139 	.lg_int = 1,
140 	.any_motion_dur = 0,
141 	.any_motion_thres = 0,
142 	.hg_hyst = 0,
143 	.hg_dur = 150,
144 	.hg_thres = 160,
145 	.lg_hyst = 0,
146 	.lg_dur = 150,
147 	.lg_thres = 20,
148 	.range = BMA150_RANGE_2G,
149 	.bandwidth = BMA150_BW_50HZ
150 };
151 
152 static int bma150_write_byte(struct i2c_client *client, u8 reg, u8 val)
153 {
154 	s32 ret;
155 
156 	/* As per specification, disable irq in between register writes */
157 	if (client->irq)
158 		disable_irq_nosync(client->irq);
159 
160 	ret = i2c_smbus_write_byte_data(client, reg, val);
161 
162 	if (client->irq)
163 		enable_irq(client->irq);
164 
165 	return ret;
166 }
167 
168 static int bma150_set_reg_bits(struct i2c_client *client,
169 					int val, int shift, u8 mask, u8 reg)
170 {
171 	int data;
172 
173 	data = i2c_smbus_read_byte_data(client, reg);
174 	if (data < 0)
175 		return data;
176 
177 	data = (data & ~mask) | ((val << shift) & mask);
178 	return bma150_write_byte(client, reg, data);
179 }
180 
181 static int bma150_set_mode(struct bma150_data *bma150, u8 mode)
182 {
183 	int error;
184 
185 	error = bma150_set_reg_bits(bma150->client, mode, BMA150_WAKE_UP_POS,
186 				BMA150_WAKE_UP_MSK, BMA150_WAKE_UP_REG);
187 	if (error)
188 		return error;
189 
190 	error = bma150_set_reg_bits(bma150->client, mode, BMA150_SLEEP_POS,
191 				BMA150_SLEEP_MSK, BMA150_SLEEP_REG);
192 	if (error)
193 		return error;
194 
195 	if (mode == BMA150_MODE_NORMAL)
196 		usleep_range(2000, 2100);
197 
198 	bma150->mode = mode;
199 	return 0;
200 }
201 
202 static int bma150_soft_reset(struct bma150_data *bma150)
203 {
204 	int error;
205 
206 	error = bma150_set_reg_bits(bma150->client, 1, BMA150_SW_RES_POS,
207 				BMA150_SW_RES_MSK, BMA150_SW_RES_REG);
208 	if (error)
209 		return error;
210 
211 	usleep_range(2000, 2100);
212 	return 0;
213 }
214 
215 static int bma150_set_range(struct bma150_data *bma150, u8 range)
216 {
217 	return bma150_set_reg_bits(bma150->client, range, BMA150_RANGE_POS,
218 				BMA150_RANGE_MSK, BMA150_RANGE_REG);
219 }
220 
221 static int bma150_set_bandwidth(struct bma150_data *bma150, u8 bw)
222 {
223 	return bma150_set_reg_bits(bma150->client, bw, BMA150_BANDWIDTH_POS,
224 				BMA150_BANDWIDTH_MSK, BMA150_BANDWIDTH_REG);
225 }
226 
227 static int bma150_set_low_g_interrupt(struct bma150_data *bma150,
228 					u8 enable, u8 hyst, u8 dur, u8 thres)
229 {
230 	int error;
231 
232 	error = bma150_set_reg_bits(bma150->client, hyst,
233 				BMA150_LOW_G_HYST_POS, BMA150_LOW_G_HYST_MSK,
234 				BMA150_LOW_G_HYST_REG);
235 	if (error)
236 		return error;
237 
238 	error = bma150_write_byte(bma150->client, BMA150_LOW_G_DUR_REG, dur);
239 	if (error)
240 		return error;
241 
242 	error = bma150_write_byte(bma150->client, BMA150_LOW_G_THRES_REG, thres);
243 	if (error)
244 		return error;
245 
246 	return bma150_set_reg_bits(bma150->client, !!enable,
247 				BMA150_LOW_G_EN_POS, BMA150_LOW_G_EN_MSK,
248 				BMA150_LOW_G_EN_REG);
249 }
250 
251 static int bma150_set_high_g_interrupt(struct bma150_data *bma150,
252 					u8 enable, u8 hyst, u8 dur, u8 thres)
253 {
254 	int error;
255 
256 	error = bma150_set_reg_bits(bma150->client, hyst,
257 				BMA150_HIGH_G_HYST_POS, BMA150_HIGH_G_HYST_MSK,
258 				BMA150_HIGH_G_HYST_REG);
259 	if (error)
260 		return error;
261 
262 	error = bma150_write_byte(bma150->client,
263 				BMA150_HIGH_G_DUR_REG, dur);
264 	if (error)
265 		return error;
266 
267 	error = bma150_write_byte(bma150->client,
268 				BMA150_HIGH_G_THRES_REG, thres);
269 	if (error)
270 		return error;
271 
272 	return bma150_set_reg_bits(bma150->client, !!enable,
273 				BMA150_HIGH_G_EN_POS, BMA150_HIGH_G_EN_MSK,
274 				BMA150_HIGH_G_EN_REG);
275 }
276 
277 
278 static int bma150_set_any_motion_interrupt(struct bma150_data *bma150,
279 						u8 enable, u8 dur, u8 thres)
280 {
281 	int error;
282 
283 	error = bma150_set_reg_bits(bma150->client, dur,
284 				BMA150_ANY_MOTION_DUR_POS,
285 				BMA150_ANY_MOTION_DUR_MSK,
286 				BMA150_ANY_MOTION_DUR_REG);
287 	if (error)
288 		return error;
289 
290 	error = bma150_write_byte(bma150->client,
291 				BMA150_ANY_MOTION_THRES_REG, thres);
292 	if (error)
293 		return error;
294 
295 	error = bma150_set_reg_bits(bma150->client, !!enable,
296 				BMA150_ADV_INT_EN_POS, BMA150_ADV_INT_EN_MSK,
297 				BMA150_ADV_INT_EN_REG);
298 	if (error)
299 		return error;
300 
301 	return bma150_set_reg_bits(bma150->client, !!enable,
302 				BMA150_ANY_MOTION_EN_POS,
303 				BMA150_ANY_MOTION_EN_MSK,
304 				BMA150_ANY_MOTION_EN_REG);
305 }
306 
307 static void bma150_report_xyz(struct bma150_data *bma150)
308 {
309 	u8 data[BMA150_XYZ_DATA_SIZE];
310 	s16 x, y, z;
311 	s32 ret;
312 
313 	ret = i2c_smbus_read_i2c_block_data(bma150->client,
314 			BMA150_ACC_X_LSB_REG, BMA150_XYZ_DATA_SIZE, data);
315 	if (ret != BMA150_XYZ_DATA_SIZE)
316 		return;
317 
318 	x = ((0xc0 & data[0]) >> 6) | (data[1] << 2);
319 	y = ((0xc0 & data[2]) >> 6) | (data[3] << 2);
320 	z = ((0xc0 & data[4]) >> 6) | (data[5] << 2);
321 
322 	x = sign_extend32(x, 9);
323 	y = sign_extend32(y, 9);
324 	z = sign_extend32(z, 9);
325 
326 	input_report_abs(bma150->input, ABS_X, x);
327 	input_report_abs(bma150->input, ABS_Y, y);
328 	input_report_abs(bma150->input, ABS_Z, z);
329 	input_sync(bma150->input);
330 }
331 
332 static irqreturn_t bma150_irq_thread(int irq, void *dev)
333 {
334 	bma150_report_xyz(dev);
335 
336 	return IRQ_HANDLED;
337 }
338 
339 static void bma150_poll(struct input_polled_dev *dev)
340 {
341 	bma150_report_xyz(dev->private);
342 }
343 
344 static int bma150_open(struct bma150_data *bma150)
345 {
346 	int error;
347 
348 	error = pm_runtime_get_sync(&bma150->client->dev);
349 	if (error < 0 && error != -ENOSYS)
350 		return error;
351 
352 	/*
353 	 * See if runtime PM woke up the device. If runtime PM
354 	 * is disabled we need to do it ourselves.
355 	 */
356 	if (bma150->mode != BMA150_MODE_NORMAL) {
357 		error = bma150_set_mode(bma150, BMA150_MODE_NORMAL);
358 		if (error)
359 			return error;
360 	}
361 
362 	return 0;
363 }
364 
365 static void bma150_close(struct bma150_data *bma150)
366 {
367 	pm_runtime_put_sync(&bma150->client->dev);
368 
369 	if (bma150->mode != BMA150_MODE_SLEEP)
370 		bma150_set_mode(bma150, BMA150_MODE_SLEEP);
371 }
372 
373 static int bma150_irq_open(struct input_dev *input)
374 {
375 	struct bma150_data *bma150 = input_get_drvdata(input);
376 
377 	return bma150_open(bma150);
378 }
379 
380 static void bma150_irq_close(struct input_dev *input)
381 {
382 	struct bma150_data *bma150 = input_get_drvdata(input);
383 
384 	bma150_close(bma150);
385 }
386 
387 static void bma150_poll_open(struct input_polled_dev *ipoll_dev)
388 {
389 	struct bma150_data *bma150 = ipoll_dev->private;
390 
391 	bma150_open(bma150);
392 }
393 
394 static void bma150_poll_close(struct input_polled_dev *ipoll_dev)
395 {
396 	struct bma150_data *bma150 = ipoll_dev->private;
397 
398 	bma150_close(bma150);
399 }
400 
401 static int bma150_initialize(struct bma150_data *bma150,
402 				       const struct bma150_cfg *cfg)
403 {
404 	int error;
405 
406 	error = bma150_soft_reset(bma150);
407 	if (error)
408 		return error;
409 
410 	error = bma150_set_bandwidth(bma150, cfg->bandwidth);
411 	if (error)
412 		return error;
413 
414 	error = bma150_set_range(bma150, cfg->range);
415 	if (error)
416 		return error;
417 
418 	if (bma150->client->irq) {
419 		error = bma150_set_any_motion_interrupt(bma150,
420 					cfg->any_motion_int,
421 					cfg->any_motion_dur,
422 					cfg->any_motion_thres);
423 		if (error)
424 			return error;
425 
426 		error = bma150_set_high_g_interrupt(bma150,
427 					cfg->hg_int, cfg->hg_hyst,
428 					cfg->hg_dur, cfg->hg_thres);
429 		if (error)
430 			return error;
431 
432 		error = bma150_set_low_g_interrupt(bma150,
433 					cfg->lg_int, cfg->lg_hyst,
434 					cfg->lg_dur, cfg->lg_thres);
435 		if (error)
436 			return error;
437 	}
438 
439 	return bma150_set_mode(bma150, BMA150_MODE_SLEEP);
440 }
441 
442 static void bma150_init_input_device(struct bma150_data *bma150,
443 						struct input_dev *idev)
444 {
445 	idev->name = BMA150_DRIVER;
446 	idev->phys = BMA150_DRIVER "/input0";
447 	idev->id.bustype = BUS_I2C;
448 	idev->dev.parent = &bma150->client->dev;
449 
450 	idev->evbit[0] = BIT_MASK(EV_ABS);
451 	input_set_abs_params(idev, ABS_X, ABSMIN_ACC_VAL, ABSMAX_ACC_VAL, 0, 0);
452 	input_set_abs_params(idev, ABS_Y, ABSMIN_ACC_VAL, ABSMAX_ACC_VAL, 0, 0);
453 	input_set_abs_params(idev, ABS_Z, ABSMIN_ACC_VAL, ABSMAX_ACC_VAL, 0, 0);
454 }
455 
456 static int bma150_register_input_device(struct bma150_data *bma150)
457 {
458 	struct input_dev *idev;
459 	int error;
460 
461 	idev = input_allocate_device();
462 	if (!idev)
463 		return -ENOMEM;
464 
465 	bma150_init_input_device(bma150, idev);
466 
467 	idev->open = bma150_irq_open;
468 	idev->close = bma150_irq_close;
469 	input_set_drvdata(idev, bma150);
470 
471 	bma150->input = idev;
472 
473 	error = input_register_device(idev);
474 	if (error) {
475 		input_free_device(idev);
476 		return error;
477 	}
478 
479 	return 0;
480 }
481 
482 static int bma150_register_polled_device(struct bma150_data *bma150)
483 {
484 	struct input_polled_dev *ipoll_dev;
485 	int error;
486 
487 	ipoll_dev = input_allocate_polled_device();
488 	if (!ipoll_dev)
489 		return -ENOMEM;
490 
491 	ipoll_dev->private = bma150;
492 	ipoll_dev->open = bma150_poll_open;
493 	ipoll_dev->close = bma150_poll_close;
494 	ipoll_dev->poll = bma150_poll;
495 	ipoll_dev->poll_interval = BMA150_POLL_INTERVAL;
496 	ipoll_dev->poll_interval_min = BMA150_POLL_MIN;
497 	ipoll_dev->poll_interval_max = BMA150_POLL_MAX;
498 
499 	bma150_init_input_device(bma150, ipoll_dev->input);
500 
501 	bma150->input_polled = ipoll_dev;
502 	bma150->input = ipoll_dev->input;
503 
504 	error = input_register_polled_device(ipoll_dev);
505 	if (error) {
506 		input_free_polled_device(ipoll_dev);
507 		return error;
508 	}
509 
510 	return 0;
511 }
512 
513 static int bma150_probe(struct i2c_client *client,
514 				  const struct i2c_device_id *id)
515 {
516 	const struct bma150_platform_data *pdata =
517 			dev_get_platdata(&client->dev);
518 	const struct bma150_cfg *cfg;
519 	struct bma150_data *bma150;
520 	int chip_id;
521 	int error;
522 
523 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
524 		dev_err(&client->dev, "i2c_check_functionality error\n");
525 		return -EIO;
526 	}
527 
528 	chip_id = i2c_smbus_read_byte_data(client, BMA150_CHIP_ID_REG);
529 	if (chip_id != BMA150_CHIP_ID) {
530 		dev_err(&client->dev, "BMA150 chip id error: %d\n", chip_id);
531 		return -EINVAL;
532 	}
533 
534 	bma150 = kzalloc(sizeof(struct bma150_data), GFP_KERNEL);
535 	if (!bma150)
536 		return -ENOMEM;
537 
538 	bma150->client = client;
539 
540 	if (pdata) {
541 		if (pdata->irq_gpio_cfg) {
542 			error = pdata->irq_gpio_cfg();
543 			if (error) {
544 				dev_err(&client->dev,
545 					"IRQ GPIO conf. error %d, error %d\n",
546 					client->irq, error);
547 				goto err_free_mem;
548 			}
549 		}
550 		cfg = &pdata->cfg;
551 	} else {
552 		cfg = &default_cfg;
553 	}
554 
555 	error = bma150_initialize(bma150, cfg);
556 	if (error)
557 		goto err_free_mem;
558 
559 	if (client->irq > 0) {
560 		error = bma150_register_input_device(bma150);
561 		if (error)
562 			goto err_free_mem;
563 
564 		error = request_threaded_irq(client->irq,
565 					NULL, bma150_irq_thread,
566 					IRQF_TRIGGER_RISING | IRQF_ONESHOT,
567 					BMA150_DRIVER, bma150);
568 		if (error) {
569 			dev_err(&client->dev,
570 				"irq request failed %d, error %d\n",
571 				client->irq, error);
572 			input_unregister_device(bma150->input);
573 			goto err_free_mem;
574 		}
575 	} else {
576 		error = bma150_register_polled_device(bma150);
577 		if (error)
578 			goto err_free_mem;
579 	}
580 
581 	i2c_set_clientdata(client, bma150);
582 
583 	pm_runtime_enable(&client->dev);
584 
585 	return 0;
586 
587 err_free_mem:
588 	kfree(bma150);
589 	return error;
590 }
591 
592 static int bma150_remove(struct i2c_client *client)
593 {
594 	struct bma150_data *bma150 = i2c_get_clientdata(client);
595 
596 	pm_runtime_disable(&client->dev);
597 
598 	if (client->irq > 0) {
599 		free_irq(client->irq, bma150);
600 		input_unregister_device(bma150->input);
601 	} else {
602 		input_unregister_polled_device(bma150->input_polled);
603 		input_free_polled_device(bma150->input_polled);
604 	}
605 
606 	kfree(bma150);
607 
608 	return 0;
609 }
610 
611 #ifdef CONFIG_PM
612 static int bma150_suspend(struct device *dev)
613 {
614 	struct i2c_client *client = to_i2c_client(dev);
615 	struct bma150_data *bma150 = i2c_get_clientdata(client);
616 
617 	return bma150_set_mode(bma150, BMA150_MODE_SLEEP);
618 }
619 
620 static int bma150_resume(struct device *dev)
621 {
622 	struct i2c_client *client = to_i2c_client(dev);
623 	struct bma150_data *bma150 = i2c_get_clientdata(client);
624 
625 	return bma150_set_mode(bma150, BMA150_MODE_NORMAL);
626 }
627 #endif
628 
629 static UNIVERSAL_DEV_PM_OPS(bma150_pm, bma150_suspend, bma150_resume, NULL);
630 
631 static const struct i2c_device_id bma150_id[] = {
632 	{ "bma150", 0 },
633 	{ "smb380", 0 },
634 	{ "bma023", 0 },
635 	{ }
636 };
637 
638 MODULE_DEVICE_TABLE(i2c, bma150_id);
639 
640 static struct i2c_driver bma150_driver = {
641 	.driver = {
642 		.name	= BMA150_DRIVER,
643 		.pm	= &bma150_pm,
644 	},
645 	.class		= I2C_CLASS_HWMON,
646 	.id_table	= bma150_id,
647 	.probe		= bma150_probe,
648 	.remove		= bma150_remove,
649 };
650 
651 module_i2c_driver(bma150_driver);
652 
653 MODULE_AUTHOR("Albert Zhang <xu.zhang@bosch-sensortec.com>");
654 MODULE_DESCRIPTION("BMA150 driver");
655 MODULE_LICENSE("GPL");
656