lkml.org 
[lkml]   [2020]   [Feb]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH v2] counter: 104-quad-8: Support Differential Encoder Cable Status
Date
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 <vilhelm.gray@gmail.com>
---
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: linux-iio@vger.kernel.org
+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: linux-iio@vger.kernel.org
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
\
 
 \ /
  Last update: 2020-02-23 18:33    [W:0.037 / U:1.964 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site