counter: Introduce the Signal polarity component
authorWilliam Breathitt Gray <william.gray@linaro.org>
Tue, 27 Sep 2022 22:53:38 +0000 (18:53 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 30 Sep 2022 12:32:35 +0000 (14:32 +0200)
The Signal polarity component represents the active level of a
respective Signal. There are two possible states: positive (rising edge)
and negative (falling edge); enum counter_signal_polarity represents
these states. A convenience macro COUNTER_COMP_POLARITY() is provided
for driver authors to declare a Signal polarity component.

Cc: Julien Panis <jpanis@baylibre.com>
Link: https://lore.kernel.org/r/8f47d6e1db71a11bb1e2666f8e2a6e9d256d4131.1664204990.git.william.gray@linaro.org/
Signed-off-by: William Breathitt Gray <william.gray@linaro.org>
Link: https://lore.kernel.org/r/b6e53438badcb6318997d13dd2fc052f97d808ac.1664318353.git.william.gray@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Documentation/ABI/testing/sysfs-bus-counter
drivers/counter/counter-chrdev.c
drivers/counter/counter-sysfs.c
include/linux/counter.h
include/uapi/linux/counter.h

index 06c2b3e27e0bf5a4a0dc3a3bf51482f8473ea00c..2a996deabe9ed4bb35c96f08135cbda57335e077 100644 (file)
@@ -217,6 +217,7 @@ What:               /sys/bus/counter/devices/counterX/signalY/cable_fault_component_id
 What:          /sys/bus/counter/devices/counterX/signalY/cable_fault_enable_component_id
 What:          /sys/bus/counter/devices/counterX/signalY/filter_clock_prescaler_component_id
 What:          /sys/bus/counter/devices/counterX/signalY/index_polarity_component_id
+What:          /sys/bus/counter/devices/counterX/signalY/polarity_component_id
 What:          /sys/bus/counter/devices/counterX/signalY/synchronous_mode_component_id
 KernelVersion: 5.16
 Contact:       linux-iio@vger.kernel.org
@@ -303,6 +304,19 @@ Description:
                Discrete set of available values for the respective Signal Y
                configuration are listed in this file.
 
+What:          /sys/bus/counter/devices/counterX/signalY/polarity
+KernelVersion: 6.1
+Contact:       linux-iio@vger.kernel.org
+Description:
+               Active level of Signal Y. The following polarity values are
+               available:
+
+               positive:
+                       Signal high state considered active level (rising edge).
+
+               negative:
+                       Signal low state considered active level (falling edge).
+
 What:          /sys/bus/counter/devices/counterX/signalY/name
 KernelVersion: 5.2
 Contact:       linux-iio@vger.kernel.org
index 4e71a19d7e6a3fc8dd11ad640252adb827317c05..120879ee2e87ddea407961f336f907072c5aa60c 100644 (file)
@@ -487,6 +487,7 @@ static int counter_get_data(struct counter_device *const counter,
        case COUNTER_COMP_ENUM:
        case COUNTER_COMP_COUNT_DIRECTION:
        case COUNTER_COMP_COUNT_MODE:
+       case COUNTER_COMP_SIGNAL_POLARITY:
                switch (comp_node->component.scope) {
                case COUNTER_SCOPE_DEVICE:
                        ret = comp->device_u32_read(counter, &value_u32);
index 04eac41dad33e9227647cbd54a28cdf2468a67f7..e5dd36e1a45f49ef7a9113a9c1d1c676f49fbd6b 100644 (file)
@@ -91,6 +91,11 @@ static const char *const counter_count_mode_str[] = {
        [COUNTER_COUNT_MODE_MODULO_N] = "modulo-n"
 };
 
+static const char *const counter_signal_polarity_str[] = {
+       [COUNTER_SIGNAL_POLARITY_POSITIVE] = "positive",
+       [COUNTER_SIGNAL_POLARITY_NEGATIVE] = "negative"
+};
+
 static ssize_t counter_comp_u8_show(struct device *dev,
                                    struct device_attribute *attr, char *buf)
 {
@@ -201,6 +206,8 @@ static ssize_t counter_comp_u32_show(struct device *dev,
                return sysfs_emit(buf, "%s\n", counter_count_direction_str[data]);
        case COUNTER_COMP_COUNT_MODE:
                return sysfs_emit(buf, "%s\n", counter_count_mode_str[data]);
+       case COUNTER_COMP_SIGNAL_POLARITY:
+               return sysfs_emit(buf, "%s\n", counter_signal_polarity_str[data]);
        default:
                return sysfs_emit(buf, "%u\n", (unsigned int)data);
        }
@@ -252,6 +259,10 @@ static ssize_t counter_comp_u32_store(struct device *dev,
                err = counter_find_enum(&data, avail->enums, avail->num_items,
                                        buf, counter_count_mode_str);
                break;
+       case COUNTER_COMP_SIGNAL_POLARITY:
+               err = counter_find_enum(&data, avail->enums, avail->num_items,
+                                       buf, counter_signal_polarity_str);
+               break;
        default:
                err = kstrtou32(buf, 0, &data);
                break;
@@ -469,6 +480,7 @@ static int counter_attr_create(struct device *const dev,
        case COUNTER_COMP_ENUM:
        case COUNTER_COMP_COUNT_DIRECTION:
        case COUNTER_COMP_COUNT_MODE:
+       case COUNTER_COMP_SIGNAL_POLARITY:
                if (comp->device_u32_read) {
                        dev_attr->attr.mode |= 0444;
                        dev_attr->show = counter_comp_u32_show;
index a81234bc8ea8e927a7f7d5d232727660a6b0b5a1..b3fb6b68881a872c96a843f37bd5f10020896c35 100644 (file)
@@ -31,6 +31,7 @@ enum counter_comp_type {
        COUNTER_COMP_ENUM,
        COUNTER_COMP_COUNT_DIRECTION,
        COUNTER_COMP_COUNT_MODE,
+       COUNTER_COMP_SIGNAL_POLARITY,
 };
 
 /**
@@ -477,6 +478,15 @@ struct counter_available {
 #define COUNTER_COMP_FLOOR(_read, _write) \
        COUNTER_COMP_COUNT_U64("floor", _read, _write)
 
+#define COUNTER_COMP_POLARITY(_read, _write, _available) \
+{ \
+       .type = COUNTER_COMP_SIGNAL_POLARITY, \
+       .name = "polarity", \
+       .signal_u32_read = (_read), \
+       .signal_u32_write = (_write), \
+       .priv = &(_available), \
+}
+
 #define COUNTER_COMP_PRESET(_read, _write) \
        COUNTER_COMP_COUNT_U64("preset", _read, _write)
 
index 96c5ffd368adc76b360110911486042a85f08e1d..e9610e1944dced61e24ca0a49949c888ca1a690b 100644 (file)
@@ -153,4 +153,10 @@ enum counter_synapse_action {
        COUNTER_SYNAPSE_ACTION_BOTH_EDGES,
 };
 
+/* Signal polarity values */
+enum counter_signal_polarity {
+       COUNTER_SIGNAL_POLARITY_POSITIVE,
+       COUNTER_SIGNAL_POLARITY_NEGATIVE,
+};
+
 #endif /* _UAPI_COUNTER_H_ */