Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iio: mcp4531: provide range of available raw values

Example:

$ cat '/sys/bus/iio/devices/iio:device0/out_resistance_raw_available'
[0 1 256]

Meaning: min 0, step 1 and max 256.

Signed-off-by: Peter Rosin <peda@axentia.se>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

authored by

Peter Rosin and committed by
Jonathan Cameron
2704e300 00c5f80c

+71 -42
+8
Documentation/ABI/testing/sysfs-bus-iio-potentiometer-mcp4531
··· 1 + What: /sys/bus/iio/devices/iio:deviceX/out_resistance_raw_available 2 + Date: October 2016 3 + KernelVersion: 4.9 4 + Contact: Peter Rosin <peda@axentia.se> 5 + Description: 6 + The range of available values represented as the minimum value, 7 + the step and the maximum value, all enclosed in square brackets. 8 + Example: [0 1 256]
+1
MAINTAINERS
··· 7709 7709 M: Peter Rosin <peda@axentia.se> 7710 7710 L: linux-iio@vger.kernel.org 7711 7711 S: Maintained 7712 + F: Documentation/ABI/testing/sysfs-bus-iio-potentiometer-mcp4531 7712 7713 F: drivers/iio/potentiometer/mcp4531.c 7713 7714 7714 7715 MEASUREMENT COMPUTING CIO-DAC IIO DRIVER
+62 -42
drivers/iio/potentiometer/mcp4531.c
··· 38 38 39 39 struct mcp4531_cfg { 40 40 int wipers; 41 - int max_pos; 41 + int avail[3]; 42 42 int kohms; 43 43 }; 44 44 ··· 78 78 }; 79 79 80 80 static const struct mcp4531_cfg mcp4531_cfg[] = { 81 - [MCP453x_502] = { .wipers = 1, .max_pos = 128, .kohms = 5, }, 82 - [MCP453x_103] = { .wipers = 1, .max_pos = 128, .kohms = 10, }, 83 - [MCP453x_503] = { .wipers = 1, .max_pos = 128, .kohms = 50, }, 84 - [MCP453x_104] = { .wipers = 1, .max_pos = 128, .kohms = 100, }, 85 - [MCP454x_502] = { .wipers = 1, .max_pos = 128, .kohms = 5, }, 86 - [MCP454x_103] = { .wipers = 1, .max_pos = 128, .kohms = 10, }, 87 - [MCP454x_503] = { .wipers = 1, .max_pos = 128, .kohms = 50, }, 88 - [MCP454x_104] = { .wipers = 1, .max_pos = 128, .kohms = 100, }, 89 - [MCP455x_502] = { .wipers = 1, .max_pos = 256, .kohms = 5, }, 90 - [MCP455x_103] = { .wipers = 1, .max_pos = 256, .kohms = 10, }, 91 - [MCP455x_503] = { .wipers = 1, .max_pos = 256, .kohms = 50, }, 92 - [MCP455x_104] = { .wipers = 1, .max_pos = 256, .kohms = 100, }, 93 - [MCP456x_502] = { .wipers = 1, .max_pos = 256, .kohms = 5, }, 94 - [MCP456x_103] = { .wipers = 1, .max_pos = 256, .kohms = 10, }, 95 - [MCP456x_503] = { .wipers = 1, .max_pos = 256, .kohms = 50, }, 96 - [MCP456x_104] = { .wipers = 1, .max_pos = 256, .kohms = 100, }, 97 - [MCP463x_502] = { .wipers = 2, .max_pos = 128, .kohms = 5, }, 98 - [MCP463x_103] = { .wipers = 2, .max_pos = 128, .kohms = 10, }, 99 - [MCP463x_503] = { .wipers = 2, .max_pos = 128, .kohms = 50, }, 100 - [MCP463x_104] = { .wipers = 2, .max_pos = 128, .kohms = 100, }, 101 - [MCP464x_502] = { .wipers = 2, .max_pos = 128, .kohms = 5, }, 102 - [MCP464x_103] = { .wipers = 2, .max_pos = 128, .kohms = 10, }, 103 - [MCP464x_503] = { .wipers = 2, .max_pos = 128, .kohms = 50, }, 104 - [MCP464x_104] = { .wipers = 2, .max_pos = 128, .kohms = 100, }, 105 - [MCP465x_502] = { .wipers = 2, .max_pos = 256, .kohms = 5, }, 106 - [MCP465x_103] = { .wipers = 2, .max_pos = 256, .kohms = 10, }, 107 - [MCP465x_503] = { .wipers = 2, .max_pos = 256, .kohms = 50, }, 108 - [MCP465x_104] = { .wipers = 2, .max_pos = 256, .kohms = 100, }, 109 - [MCP466x_502] = { .wipers = 2, .max_pos = 256, .kohms = 5, }, 110 - [MCP466x_103] = { .wipers = 2, .max_pos = 256, .kohms = 10, }, 111 - [MCP466x_503] = { .wipers = 2, .max_pos = 256, .kohms = 50, }, 112 - [MCP466x_104] = { .wipers = 2, .max_pos = 256, .kohms = 100, }, 81 + [MCP453x_502] = { .wipers = 1, .avail = { 0, 1, 128 }, .kohms = 5, }, 82 + [MCP453x_103] = { .wipers = 1, .avail = { 0, 1, 128 }, .kohms = 10, }, 83 + [MCP453x_503] = { .wipers = 1, .avail = { 0, 1, 128 }, .kohms = 50, }, 84 + [MCP453x_104] = { .wipers = 1, .avail = { 0, 1, 128 }, .kohms = 100, }, 85 + [MCP454x_502] = { .wipers = 1, .avail = { 0, 1, 128 }, .kohms = 5, }, 86 + [MCP454x_103] = { .wipers = 1, .avail = { 0, 1, 128 }, .kohms = 10, }, 87 + [MCP454x_503] = { .wipers = 1, .avail = { 0, 1, 128 }, .kohms = 50, }, 88 + [MCP454x_104] = { .wipers = 1, .avail = { 0, 1, 128 }, .kohms = 100, }, 89 + [MCP455x_502] = { .wipers = 1, .avail = { 0, 1, 256 }, .kohms = 5, }, 90 + [MCP455x_103] = { .wipers = 1, .avail = { 0, 1, 256 }, .kohms = 10, }, 91 + [MCP455x_503] = { .wipers = 1, .avail = { 0, 1, 256 }, .kohms = 50, }, 92 + [MCP455x_104] = { .wipers = 1, .avail = { 0, 1, 256 }, .kohms = 100, }, 93 + [MCP456x_502] = { .wipers = 1, .avail = { 0, 1, 256 }, .kohms = 5, }, 94 + [MCP456x_103] = { .wipers = 1, .avail = { 0, 1, 256 }, .kohms = 10, }, 95 + [MCP456x_503] = { .wipers = 1, .avail = { 0, 1, 256 }, .kohms = 50, }, 96 + [MCP456x_104] = { .wipers = 1, .avail = { 0, 1, 256 }, .kohms = 100, }, 97 + [MCP463x_502] = { .wipers = 2, .avail = { 0, 1, 128 }, .kohms = 5, }, 98 + [MCP463x_103] = { .wipers = 2, .avail = { 0, 1, 128 }, .kohms = 10, }, 99 + [MCP463x_503] = { .wipers = 2, .avail = { 0, 1, 128 }, .kohms = 50, }, 100 + [MCP463x_104] = { .wipers = 2, .avail = { 0, 1, 128 }, .kohms = 100, }, 101 + [MCP464x_502] = { .wipers = 2, .avail = { 0, 1, 128 }, .kohms = 5, }, 102 + [MCP464x_103] = { .wipers = 2, .avail = { 0, 1, 128 }, .kohms = 10, }, 103 + [MCP464x_503] = { .wipers = 2, .avail = { 0, 1, 128 }, .kohms = 50, }, 104 + [MCP464x_104] = { .wipers = 2, .avail = { 0, 1, 128 }, .kohms = 100, }, 105 + [MCP465x_502] = { .wipers = 2, .avail = { 0, 1, 256 }, .kohms = 5, }, 106 + [MCP465x_103] = { .wipers = 2, .avail = { 0, 1, 256 }, .kohms = 10, }, 107 + [MCP465x_503] = { .wipers = 2, .avail = { 0, 1, 256 }, .kohms = 50, }, 108 + [MCP465x_104] = { .wipers = 2, .avail = { 0, 1, 256 }, .kohms = 100, }, 109 + [MCP466x_502] = { .wipers = 2, .avail = { 0, 1, 256 }, .kohms = 5, }, 110 + [MCP466x_103] = { .wipers = 2, .avail = { 0, 1, 256 }, .kohms = 10, }, 111 + [MCP466x_503] = { .wipers = 2, .avail = { 0, 1, 256 }, .kohms = 50, }, 112 + [MCP466x_104] = { .wipers = 2, .avail = { 0, 1, 256 }, .kohms = 100, }, 113 113 }; 114 114 115 115 #define MCP4531_WRITE (0 << 2) ··· 124 124 const struct mcp4531_cfg *cfg; 125 125 }; 126 126 127 - #define MCP4531_CHANNEL(ch) { \ 128 - .type = IIO_RESISTANCE, \ 129 - .indexed = 1, \ 130 - .output = 1, \ 131 - .channel = (ch), \ 132 - .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ 133 - .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ 127 + #define MCP4531_CHANNEL(ch) { \ 128 + .type = IIO_RESISTANCE, \ 129 + .indexed = 1, \ 130 + .output = 1, \ 131 + .channel = (ch), \ 132 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ 133 + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ 134 + .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_RAW), \ 134 135 } 135 136 136 137 static const struct iio_chan_spec mcp4531_channels[] = { ··· 157 156 return IIO_VAL_INT; 158 157 case IIO_CHAN_INFO_SCALE: 159 158 *val = 1000 * data->cfg->kohms; 160 - *val2 = data->cfg->max_pos; 159 + *val2 = data->cfg->avail[2]; 161 160 return IIO_VAL_FRACTIONAL; 161 + } 162 + 163 + return -EINVAL; 164 + } 165 + 166 + static int mcp4531_read_avail(struct iio_dev *indio_dev, 167 + struct iio_chan_spec const *chan, 168 + const int **vals, int *type, int *length, 169 + long mask) 170 + { 171 + struct mcp4531_data *data = iio_priv(indio_dev); 172 + 173 + switch (mask) { 174 + case IIO_CHAN_INFO_RAW: 175 + *length = ARRAY_SIZE(data->cfg->avail); 176 + *vals = data->cfg->avail; 177 + *type = IIO_VAL_INT; 178 + return IIO_AVAIL_RANGE; 162 179 } 163 180 164 181 return -EINVAL; ··· 191 172 192 173 switch (mask) { 193 174 case IIO_CHAN_INFO_RAW: 194 - if (val > data->cfg->max_pos || val < 0) 175 + if (val > data->cfg->avail[2] || val < 0) 195 176 return -EINVAL; 196 177 break; 197 178 default: ··· 205 186 206 187 static const struct iio_info mcp4531_info = { 207 188 .read_raw = mcp4531_read_raw, 189 + .read_avail = mcp4531_read_avail, 208 190 .write_raw = mcp4531_write_raw, 209 191 .driver_module = THIS_MODULE, 210 192 };