The ACCES 104-QUAD-8 series provides status information about the
connection state of the differential encoder cable inputs. This patch
implements support to expose such information from these devices.
Signed-off-by: William Breathitt Gray <[email protected]>
---
Changes in v2:
- Set num_ext so quad8_device_ext is actually read
.../ABI/testing/sysfs-bus-counter-104-quad-8 | 12 ++++++
drivers/counter/104-quad-8.c | 39 +++++++++++++++++++
2 files changed, 51 insertions(+)
diff --git a/Documentation/ABI/testing/sysfs-bus-counter-104-quad-8 b/Documentation/ABI/testing/sysfs-bus-counter-104-quad-8
index 46b1f33b2fce..492b3e98f369 100644
--- a/Documentation/ABI/testing/sysfs-bus-counter-104-quad-8
+++ b/Documentation/ABI/testing/sysfs-bus-counter-104-quad-8
@@ -1,3 +1,15 @@
+What: /sys/bus/counter/devices/counterX/cable_status
+KernelVersion: 5.7
+Contact: [email protected]
+Description:
+ Differential encoder cable status; bits 0 through 7
+ correspond to channels 1 through 8. Writing a 0 to the
+ corresponding bit will enable the status of the
+ respective channel.
+
+ Logic 0 = cable fault (not connected or loose wires)
+ Logic 1 = cable connection good or cable fault disabled
+
What: /sys/bus/counter/devices/counterX/signalY/index_polarity
KernelVersion: 5.2
Contact: [email protected]
diff --git a/drivers/counter/104-quad-8.c b/drivers/counter/104-quad-8.c
index 17e67a84777d..cd911e223b48 100644
--- a/drivers/counter/104-quad-8.c
+++ b/drivers/counter/104-quad-8.c
@@ -56,6 +56,7 @@ struct quad8_iio {
#define QUAD8_REG_CHAN_OP 0x11
#define QUAD8_REG_INDEX_INPUT_LEVELS 0x16
+#define QUAD8_DIFF_ENCODER_CABLE_STATUS 0x17
/* Borrow Toggle flip-flop */
#define QUAD8_FLAG_BT BIT(0)
/* Carry Toggle flip-flop */
@@ -1268,6 +1269,42 @@ static struct counter_count quad8_counts[] = {
QUAD8_COUNT(7, "Channel 8 Count")
};
+static ssize_t quad8_cable_status_read(struct counter_device *counter,
+ void *private, char *buf)
+{
+ const struct quad8_iio *const priv = counter->priv;
+ unsigned int status;
+
+ status = inb(priv->base + QUAD8_DIFF_ENCODER_CABLE_STATUS);
+
+ return sprintf(buf, "0x%X\n", status);
+}
+
+static ssize_t quad8_cable_status_write(struct counter_device *counter,
+ void *private, const char *buf,
+ size_t len)
+{
+ struct quad8_iio *const priv = counter->priv;
+ u8 enable;
+ int ret;
+
+ ret = kstrtou8(buf, 0, &enable);
+ if (ret)
+ return ret;
+
+ outb(enable, priv->base + QUAD8_DIFF_ENCODER_CABLE_STATUS);
+
+ return len;
+}
+
+static const struct counter_device_ext quad8_device_ext[] = {
+ {
+ .name = "cable_status",
+ .read = quad8_cable_status_read,
+ .write = quad8_cable_status_write
+ }
+};
+
static int quad8_probe(struct device *dev, unsigned int id)
{
struct iio_dev *indio_dev;
@@ -1304,6 +1341,8 @@ static int quad8_probe(struct device *dev, unsigned int id)
quad8iio->counter.num_counts = ARRAY_SIZE(quad8_counts);
quad8iio->counter.signals = quad8_signals;
quad8iio->counter.num_signals = ARRAY_SIZE(quad8_signals);
+ quad8iio->counter.ext = quad8_device_ext;
+ quad8iio->counter.num_ext = ARRAY_SIZE(quad8_device_ext);
quad8iio->counter.priv = quad8iio;
quad8iio->base = base[id];
--
2.24.1