@@ -120,6 +120,7 @@
#define ADXL345_INT2 1
#define ADXL345_REG_TAP_AXIS_MSK GENMASK(2, 0)
+#define ADXL345_REG_TAP_SUPPRESS_MSK BIT(3)
enum adxl345_axis {
ADXL345_Z_EN = BIT(0),
@@ -167,6 +168,7 @@ struct adxl345_state {
u32 tap_duration_us;
u32 tap_latent_us;
u32 tap_window_us;
+ bool tap_suppressed;
__le16 fifo_buf[ADXL345_DIRS * ADXL345_FIFO_SIZE + 1] __aligned(IIO_DMA_MINALIGN);
};
@@ -346,6 +348,22 @@ static int adxl345_set_doubletap_en(struct adxl345_state *st, bool en)
return _adxl345_set_tap_int(st, ADXL345_DOUBLE_TAP, en);
}
+static int adxl345_is_suppressed_en(struct adxl345_state *st, bool *en)
+{
+ *en = st->tap_suppressed;
+
+ return 0;
+}
+
+static int adxl345_set_suppressed_en(struct adxl345_state *st, bool en)
+{
+ st->tap_suppressed = en;
+
+ return regmap_update_bits(st->regmap, ADXL345_REG_TAP_AXIS,
+ ADXL345_REG_TAP_SUPPRESS_MSK,
+ en ? ADXL345_TAP_SUPPRESS : ~ADXL345_TAP_SUPPRESS);
+}
+
static int adxl345_set_tap_value(struct adxl345_state *st, u8 val)
{
st->tap_threshold = val;
@@ -693,6 +711,52 @@ static int adxl345_write_raw_get_fmt(struct iio_dev *indio_dev,
}
}
+#define ADXL345_generate_iio_dev_attr_EN(A, B) \
+ static ssize_t in_accel_##A##_##B##_en_show(struct device *dev, \
+ struct device_attribute *attr, \
+ char *buf) \
+ { \
+ struct iio_dev *indio_dev = dev_to_iio_dev(dev); \
+ struct adxl345_state *st = iio_priv(indio_dev); \
+ bool en; \
+ int val, ret; \
+ \
+ ret = adxl345_is_##B##_en(st, &en); \
+ if (ret) \
+ return ret; \
+ val = en ? 1 : 0; \
+ \
+ return iio_format_value(buf, IIO_VAL_INT, 1, &val); \
+ } \
+ \
+ static ssize_t in_accel_##A##_##B##_en_store(struct device *dev, \
+ struct device_attribute *attr, \
+ const char *buf, size_t len) \
+ { \
+ struct iio_dev *indio_dev = dev_to_iio_dev(dev); \
+ struct adxl345_state *st = iio_priv(indio_dev); \
+ int val, ret; \
+ \
+ ret = kstrtoint(buf, 0, &val); \
+ if (ret) \
+ return ret; \
+ \
+ ret = adxl345_set_measure_en(st, false); \
+ if (ret) \
+ return ret; \
+ \
+ ret = adxl345_set_##B##_en(st, val > 0); \
+ if (ret) \
+ return ret; \
+ \
+ ret = adxl345_set_measure_en(st, true); \
+ if (ret) \
+ return ret; \
+ \
+ return len; \
+ } \
+ static IIO_DEVICE_ATTR_RW(in_accel_##A##_##B##_en, 0)
+
#define ADXL345_generate_iio_dev_attr_FRACTIONAL(A, B, C, D, E) \
static ssize_t in_accel_##A##_##C##_##E##_show(struct device *dev, \
struct device_attribute *attr, \
@@ -738,8 +802,11 @@ ADXL345_generate_iio_dev_attr_FRACTIONAL(gesture_singletap, tap, duration, MICRO
ADXL345_generate_iio_dev_attr_FRACTIONAL(gesture_doubletap, tap, window, MICRO, us);
ADXL345_generate_iio_dev_attr_FRACTIONAL(gesture_doubletap, tap, latent, MICRO, us);
+ADXL345_generate_iio_dev_attr_EN(gesture_doubletap, suppressed);
+
static struct attribute *adxl345_event_attrs[] = {
&iio_dev_attr_in_accel_gesture_singletap_duration_us.dev_attr.attr,
+ &iio_dev_attr_in_accel_gesture_doubletap_suppressed_en.dev_attr.attr,
&iio_dev_attr_in_accel_gesture_doubletap_latent_us.dev_attr.attr,
&iio_dev_attr_in_accel_gesture_doubletap_window_us.dev_attr.attr,
NULL
Add the suppress bit feature to make double tap (in)sensitive to the configured threshold value for the tap feature. The feature is being enabled by a sysfs handle for enabling. This is also needed for further features in follow up patches. Signed-off-by: Lothar Rubusch <l.rubusch@gmail.com> --- drivers/iio/accel/adxl345_core.c | 67 ++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+)