iio: adc: mcp320x: support more differential voltage measurement
authorAkinobu Mita <akinobu.mita@gmail.com>
Thu, 7 Jan 2016 15:40:30 +0000 (00:40 +0900)
committerJonathan Cameron <jic23@kernel.org>
Sat, 16 Jan 2016 13:04:05 +0000 (13:04 +0000)
mcp320x driver supports the pseudo-differential mode by
in_voltage'IN+'-voltage'IN-'_raw where (IN+, IN-) = (0, 1), (2, 3), ...

mcp320x chips except MCP3X01 can also select swapped IN+ and IN-
pairs in the pseudo-differential mode.
i.e. in_voltage'IN+'-voltage'IN-'_raw where (IN+, IN-) = (1, 0),
(3, 2), ...

If the voltage level of IN+ is equal to or less than IN-, the
resultant code will be 000h.  So it is useful to provide these, too.

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Oskar Andero <oskar.andero@gmail.com>
Cc: Jonathan Cameron <jic23@kernel.org>
Cc: Hartmut Knaack <knaack.h@gmx.de>
Cc: Lars-Peter Clausen <lars@metafoo.de>
Cc: Peter Meerwald <pmeerw@pmeerw.net>
Cc: linux-iio@vger.kernel.org
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/adc/mcp320x.c

index d1c05f6eed18124a907ab4e04fd255b1677c280b..a850ca7d1edacd38ef572234ff06b4613d2a74bd 100644 (file)
@@ -187,26 +187,27 @@ out:
                .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) \
        }
 
-#define MCP320X_VOLTAGE_CHANNEL_DIFF(num)                      \
+#define MCP320X_VOLTAGE_CHANNEL_DIFF(chan1, chan2)             \
        {                                                       \
                .type = IIO_VOLTAGE,                            \
                .indexed = 1,                                   \
-               .channel = (num * 2),                           \
-               .channel2 = (num * 2 + 1),                      \
-               .address = (num * 2),                           \
+               .channel = (chan1),                             \
+               .channel2 = (chan2),                            \
+               .address = (chan1),                             \
                .differential = 1,                              \
                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),   \
                .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) \
        }
 
 static const struct iio_chan_spec mcp3201_channels[] = {
-       MCP320X_VOLTAGE_CHANNEL_DIFF(0),
+       MCP320X_VOLTAGE_CHANNEL_DIFF(0, 1),
 };
 
 static const struct iio_chan_spec mcp3202_channels[] = {
        MCP320X_VOLTAGE_CHANNEL(0),
        MCP320X_VOLTAGE_CHANNEL(1),
-       MCP320X_VOLTAGE_CHANNEL_DIFF(0),
+       MCP320X_VOLTAGE_CHANNEL_DIFF(0, 1),
+       MCP320X_VOLTAGE_CHANNEL_DIFF(1, 0),
 };
 
 static const struct iio_chan_spec mcp3204_channels[] = {
@@ -214,8 +215,10 @@ static const struct iio_chan_spec mcp3204_channels[] = {
        MCP320X_VOLTAGE_CHANNEL(1),
        MCP320X_VOLTAGE_CHANNEL(2),
        MCP320X_VOLTAGE_CHANNEL(3),
-       MCP320X_VOLTAGE_CHANNEL_DIFF(0),
-       MCP320X_VOLTAGE_CHANNEL_DIFF(1),
+       MCP320X_VOLTAGE_CHANNEL_DIFF(0, 1),
+       MCP320X_VOLTAGE_CHANNEL_DIFF(1, 0),
+       MCP320X_VOLTAGE_CHANNEL_DIFF(2, 3),
+       MCP320X_VOLTAGE_CHANNEL_DIFF(3, 2),
 };
 
 static const struct iio_chan_spec mcp3208_channels[] = {
@@ -227,10 +230,14 @@ static const struct iio_chan_spec mcp3208_channels[] = {
        MCP320X_VOLTAGE_CHANNEL(5),
        MCP320X_VOLTAGE_CHANNEL(6),
        MCP320X_VOLTAGE_CHANNEL(7),
-       MCP320X_VOLTAGE_CHANNEL_DIFF(0),
-       MCP320X_VOLTAGE_CHANNEL_DIFF(1),
-       MCP320X_VOLTAGE_CHANNEL_DIFF(2),
-       MCP320X_VOLTAGE_CHANNEL_DIFF(3),
+       MCP320X_VOLTAGE_CHANNEL_DIFF(0, 1),
+       MCP320X_VOLTAGE_CHANNEL_DIFF(1, 0),
+       MCP320X_VOLTAGE_CHANNEL_DIFF(2, 3),
+       MCP320X_VOLTAGE_CHANNEL_DIFF(3, 2),
+       MCP320X_VOLTAGE_CHANNEL_DIFF(4, 5),
+       MCP320X_VOLTAGE_CHANNEL_DIFF(5, 4),
+       MCP320X_VOLTAGE_CHANNEL_DIFF(6, 7),
+       MCP320X_VOLTAGE_CHANNEL_DIFF(7, 6),
 };
 
 static const struct iio_info mcp320x_info = {