2022-05-23 07:18:13

by LI Qingwu

[permalink] [raw]
Subject: [PATCH V7 0/5] iio: accel: sca3300: add compatible for scl3300

The current driver support sca3300 only, modified to support SCL3300.
Verified with SCL3300 on IMX8MM.

SCL3300 is a three-axis accelerometer sensor with angle output,
the change adds the support of scl3300 and inclination data output.


Changes in v7:
- Add comments inline for non-obvious code.
- Documentation for sca3300_data change.
- Small refactor function sca3300_set_frequency.


LI Qingwu (5):
dt-bindings: iio: accel: sca3300: Document murata,scl3300
iio: accel: sca3300: add define for temp channel for reuse.
iio: accel: sca3300: modified to support multi chips
iio: accel: sca3300: Add support for SCL3300
iio: accel: sca3300: Add inclination channels

.../bindings/iio/accel/murata,sca3300.yaml | 1 +
drivers/iio/accel/sca3300.c | 323 +++++++++++++++---
2 files changed, 269 insertions(+), 55 deletions(-)

--
2.25.1



2022-05-23 07:21:38

by LI Qingwu

[permalink] [raw]
Subject: [PATCH V7 2/5] iio: accel: sca3300: add define for temp channel for reuse.

Add define of SCA3300_TEMP_CHANNEL for reuse.

Signed-off-by: LI Qingwu <[email protected]>
---
drivers/iio/accel/sca3300.c | 26 ++++++++++++++------------
1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/drivers/iio/accel/sca3300.c b/drivers/iio/accel/sca3300.c
index f7ef8ecfd34a..ff16d2cc8c70 100644
--- a/drivers/iio/accel/sca3300.c
+++ b/drivers/iio/accel/sca3300.c
@@ -72,22 +72,24 @@ enum sca3300_scan_indexes {
}, \
}

+#define SCA3300_TEMP_CHANNEL(index, reg) { \
+ .type = IIO_TEMP, \
+ .address = reg, \
+ .scan_index = index, \
+ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
+ .scan_type = { \
+ .sign = 's', \
+ .realbits = 16, \
+ .storagebits = 16, \
+ .endianness = IIO_CPU, \
+ }, \
+}
+
static const struct iio_chan_spec sca3300_channels[] = {
SCA3300_ACCEL_CHANNEL(SCA3300_ACC_X, 0x1, X),
SCA3300_ACCEL_CHANNEL(SCA3300_ACC_Y, 0x2, Y),
SCA3300_ACCEL_CHANNEL(SCA3300_ACC_Z, 0x3, Z),
- {
- .type = IIO_TEMP,
- .address = 0x5,
- .scan_index = SCA3300_TEMP,
- .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
- .scan_type = {
- .sign = 's',
- .realbits = 16,
- .storagebits = 16,
- .endianness = IIO_CPU,
- },
- },
+ SCA3300_TEMP_CHANNEL(SCA3300_TEMP, 0x05),
IIO_CHAN_SOFT_TIMESTAMP(4),
};

--
2.25.1


2022-05-23 07:41:18

by LI Qingwu

[permalink] [raw]
Subject: [PATCH V7 4/5] iio: accel: sca3300: Add support for SCL3300

Add support for Murata SCL3300, a 3-axis MEMS accelerometer.
Same as SCA3300, it has the accelerometer and temperature output.

Datasheet: http://www.murata.com/en-us/products/sensor/inclinometer/overview/lineup/scl3300
Signed-off-by: LI Qingwu <[email protected]>
---
drivers/iio/accel/sca3300.c | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/accel/sca3300.c b/drivers/iio/accel/sca3300.c
index e57aba79c32b..10bedb14d4f0 100644
--- a/drivers/iio/accel/sca3300.c
+++ b/drivers/iio/accel/sca3300.c
@@ -38,6 +38,7 @@
/* Device ID */
#define SCA3300_REG_WHOAMI 0x10
#define SCA3300_WHOAMI_ID 0x51
+#define SCL3300_WHOAMI_ID 0xC1

/* Device return status and mask */
#define SCA3300_VALUE_RS_ERROR 0x3
@@ -96,10 +97,18 @@ static const struct iio_chan_spec sca3300_channels[] = {
static const int sca3300_lp_freq[] = {70, 10};
static const int sca3300_lp_freq_map[] = {0, 0, 0, 1};

+static const int scl3300_lp_freq[] = {40, 70, 10};
+static const int scl3300_lp_freq_map[] = {0, 1, 2};
+
static const int sca3300_accel_scale[][2] = {{0, 370}, {0, 741}, {0, 185}};
static const int sca3300_accel_scale_map[] = {0, 1, 2, 2};

+static const int scl3300_accel_scale[][2] = {{0, 167}, {0, 333}, {0, 83}};
+static const int scl3300_accel_scale_map[] = {0, 1, 2};
+
static const int sca3300_avail_modes_map[] = {0, 1, 2, 3};
+static const int scl3300_avail_modes_map[] = {0, 1, 3};
+
static const unsigned long sca3300_scan_masks[] = {
BIT(SCA3300_ACC_X) | BIT(SCA3300_ACC_Y) | BIT(SCA3300_ACC_Z) |
BIT(SCA3300_TEMP),
@@ -159,6 +168,20 @@ static const struct sca3300_chip_info sca3300_chip_tbl[] = {
.num_avail_modes = 4,
.chip_id = SCA3300_WHOAMI_ID,
},
+ { .scan_masks = sca3300_scan_masks,
+ .channels = sca3300_channels,
+ .num_channels = ARRAY_SIZE(sca3300_channels),
+ .num_accel_scales = ARRAY_SIZE(scl3300_accel_scale)*2,
+ .accel_scale = scl3300_accel_scale,
+ .accel_scale_map = scl3300_accel_scale_map,
+ .num_freqs = ARRAY_SIZE(scl3300_lp_freq),
+ .freq_table = scl3300_lp_freq,
+ .freq_map = scl3300_lp_freq_map,
+ .name = "scl3300",
+ .avail_modes_table = scl3300_avail_modes_map,
+ .num_avail_modes = 3,
+ .chip_id = SCL3300_WHOAMI_ID,
+ },
};

DECLARE_CRC8_TABLE(sca3300_crc_table);
@@ -444,9 +467,9 @@ static int sca3300_init(struct sca3300_data *sca_data,

/*
* Wait 1ms after SW-reset command.
- * Wait 15ms for settling of signal paths.
+ * Wait 25ms for settling of signal paths.
*/
- usleep_range(16e3, 50e3);
+ usleep_range(26e3, 50e3);

ret = sca3300_read_reg(sca_data, SCA3300_REG_WHOAMI, &value);
if (ret)
@@ -573,6 +596,7 @@ static int sca3300_probe(struct spi_device *spi)

static const struct of_device_id sca3300_dt_ids[] = {
{ .compatible = "murata,sca3300"},
+ { .compatible = "murata,scl3300"},
{}
};
MODULE_DEVICE_TABLE(of, sca3300_dt_ids);
--
2.25.1