forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/drivers/iio/magnetometer/st_magn_core.c
....@@ -1,11 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * STMicroelectronics magnetometers driver
34 *
45 * Copyright 2012-2013 STMicroelectronics Inc.
56 *
67 * Denis Ciocca <denis.ciocca@st.com>
7
- *
8
- * Licensed under the GPL-2.
98 */
109
1110 #include <linux/kernel.h>
....@@ -13,10 +12,8 @@
1312 #include <linux/slab.h>
1413 #include <linux/errno.h>
1514 #include <linux/types.h>
16
-#include <linux/mutex.h>
1715 #include <linux/interrupt.h>
1816 #include <linux/i2c.h>
19
-#include <linux/gpio.h>
2017 #include <linux/irq.h>
2118 #include <linux/delay.h>
2219 #include <linux/iio/iio.h>
....@@ -29,9 +26,9 @@
2926 #define ST_MAGN_NUMBER_DATA_CHANNELS 3
3027
3128 /* DEFAULT VALUE FOR SENSORS */
32
-#define ST_MAGN_DEFAULT_OUT_X_H_ADDR 0X03
33
-#define ST_MAGN_DEFAULT_OUT_Y_H_ADDR 0X07
34
-#define ST_MAGN_DEFAULT_OUT_Z_H_ADDR 0X05
29
+#define ST_MAGN_DEFAULT_OUT_X_H_ADDR 0x03
30
+#define ST_MAGN_DEFAULT_OUT_Y_H_ADDR 0x07
31
+#define ST_MAGN_DEFAULT_OUT_Z_H_ADDR 0x05
3532
3633 /* FULLSCALE */
3734 #define ST_MAGN_FS_AVL_1300MG 1300
....@@ -267,6 +264,7 @@
267264 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
268265 .sensors_supported = {
269266 [0] = LIS3MDL_MAGN_DEV_NAME,
267
+ [1] = LSM9DS1_MAGN_DEV_NAME,
270268 },
271269 .ch = (struct iio_chan_spec *)st_magn_2_16bit_channels,
272270 .odr = {
....@@ -314,6 +312,10 @@
314312 .gain = 584,
315313 },
316314 },
315
+ },
316
+ .bdu = {
317
+ .addr = 0x24,
318
+ .mask = 0x40,
317319 },
318320 .drdy_irq = {
319321 /* drdy line is routed drdy pin */
....@@ -466,44 +468,52 @@
466468 #define ST_MAGN_TRIGGER_OPS NULL
467469 #endif
468470
471
+/*
472
+ * st_magn_get_settings() - get sensor settings from device name
473
+ * @name: device name buffer reference.
474
+ *
475
+ * Return: valid reference on success, NULL otherwise.
476
+ */
477
+const struct st_sensor_settings *st_magn_get_settings(const char *name)
478
+{
479
+ int index = st_sensors_get_settings_index(name,
480
+ st_magn_sensors_settings,
481
+ ARRAY_SIZE(st_magn_sensors_settings));
482
+ if (index < 0)
483
+ return NULL;
484
+
485
+ return &st_magn_sensors_settings[index];
486
+}
487
+EXPORT_SYMBOL(st_magn_get_settings);
488
+
469489 int st_magn_common_probe(struct iio_dev *indio_dev)
470490 {
471491 struct st_sensor_data *mdata = iio_priv(indio_dev);
472
- int irq = mdata->get_irq_data_ready(indio_dev);
473492 int err;
474493
475494 indio_dev->modes = INDIO_DIRECT_MODE;
476495 indio_dev->info = &magn_info;
477
- mutex_init(&mdata->tb.buf_lock);
478496
479
- err = st_sensors_power_enable(indio_dev);
480
- if (err)
497
+ err = st_sensors_verify_id(indio_dev);
498
+ if (err < 0)
481499 return err;
482500
483
- err = st_sensors_check_device_support(indio_dev,
484
- ARRAY_SIZE(st_magn_sensors_settings),
485
- st_magn_sensors_settings);
486
- if (err < 0)
487
- goto st_magn_power_off;
488
-
489501 mdata->num_data_channels = ST_MAGN_NUMBER_DATA_CHANNELS;
490
- mdata->multiread_bit = mdata->sensor_settings->multi_read_bit;
491502 indio_dev->channels = mdata->sensor_settings->ch;
492503 indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS;
493504
494
- mdata->current_fullscale = (struct st_sensor_fullscale_avl *)
495
- &mdata->sensor_settings->fs.fs_avl[0];
505
+ mdata->current_fullscale = &mdata->sensor_settings->fs.fs_avl[0];
496506 mdata->odr = mdata->sensor_settings->odr.odr_avl[0].hz;
497507
498508 err = st_sensors_init_sensor(indio_dev, NULL);
499509 if (err < 0)
500
- goto st_magn_power_off;
510
+ return err;
501511
502512 err = st_magn_allocate_ring(indio_dev);
503513 if (err < 0)
504
- goto st_magn_power_off;
514
+ return err;
505515
506
- if (irq > 0) {
516
+ if (mdata->irq > 0) {
507517 err = st_sensors_allocate_trigger(indio_dev,
508518 ST_MAGN_TRIGGER_OPS);
509519 if (err < 0)
....@@ -520,13 +530,10 @@
520530 return 0;
521531
522532 st_magn_device_register_error:
523
- if (irq > 0)
533
+ if (mdata->irq > 0)
524534 st_sensors_deallocate_trigger(indio_dev);
525535 st_magn_probe_trigger_error:
526536 st_magn_deallocate_ring(indio_dev);
527
-st_magn_power_off:
528
- st_sensors_power_disable(indio_dev);
529
-
530537 return err;
531538 }
532539 EXPORT_SYMBOL(st_magn_common_probe);
....@@ -535,10 +542,8 @@
535542 {
536543 struct st_sensor_data *mdata = iio_priv(indio_dev);
537544
538
- st_sensors_power_disable(indio_dev);
539
-
540545 iio_device_unregister(indio_dev);
541
- if (mdata->get_irq_data_ready(indio_dev) > 0)
546
+ if (mdata->irq > 0)
542547 st_sensors_deallocate_trigger(indio_dev);
543548
544549 st_magn_deallocate_ring(indio_dev);