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

staging:iio:dac:ad5624r: Convert to channel spec

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Acked-by: Jonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Lars-Peter Clausen and committed by
Greg Kroah-Hartman
275de9f7 a7b15288

+79 -51
+2 -2
drivers/staging/iio/dac/ad5624r.h
··· 32 32 33 33 /** 34 34 * struct ad5624r_chip_info - chip specific information 35 - * @bits: accuracy of the DAC in bits 35 + * @channels: channel spec for the DAC 36 36 * @int_vref_mv: AD5620/40/60: the internal reference voltage 37 37 */ 38 38 39 39 struct ad5624r_chip_info { 40 - u8 bits; 40 + const struct iio_chan_spec *channels; 41 41 u16 int_vref_mv; 42 42 }; 43 43
+77 -49
drivers/staging/iio/dac/ad5624r_spi.c
··· 21 21 #include "dac.h" 22 22 #include "ad5624r.h" 23 23 24 + #define AD5624R_CHANNEL(_chan, _bits) { \ 25 + .type = IIO_VOLTAGE, \ 26 + .indexed = 1, \ 27 + .output = 1, \ 28 + .channel = (_chan), \ 29 + .info_mask = IIO_CHAN_INFO_SCALE_SHARED_BIT, \ 30 + .address = (_chan), \ 31 + .scan_type = IIO_ST('u', (_bits), 16, 16 - (_bits)), \ 32 + } 33 + 34 + #define DECLARE_AD5624R_CHANNELS(_name, _bits) \ 35 + const struct iio_chan_spec _name##_channels[] = { \ 36 + AD5624R_CHANNEL(0, _bits), \ 37 + AD5624R_CHANNEL(1, _bits), \ 38 + AD5624R_CHANNEL(2, _bits), \ 39 + AD5624R_CHANNEL(3, _bits), \ 40 + } 41 + 42 + static DECLARE_AD5624R_CHANNELS(ad5624r, 12); 43 + static DECLARE_AD5624R_CHANNELS(ad5644r, 14); 44 + static DECLARE_AD5624R_CHANNELS(ad5664r, 16); 45 + 24 46 static const struct ad5624r_chip_info ad5624r_chip_info_tbl[] = { 25 47 [ID_AD5624R3] = { 26 - .bits = 12, 27 - .int_vref_mv = 1250, 28 - }, 29 - [ID_AD5644R3] = { 30 - .bits = 14, 31 - .int_vref_mv = 1250, 32 - }, 33 - [ID_AD5664R3] = { 34 - .bits = 16, 48 + .channels = ad5624r_channels, 35 49 .int_vref_mv = 1250, 36 50 }, 37 51 [ID_AD5624R5] = { 38 - .bits = 12, 52 + .channels = ad5624r_channels, 39 53 .int_vref_mv = 2500, 54 + }, 55 + [ID_AD5644R3] = { 56 + .channels = ad5644r_channels, 57 + .int_vref_mv = 1250, 40 58 }, 41 59 [ID_AD5644R5] = { 42 - .bits = 14, 60 + .channels = ad5644r_channels, 43 61 .int_vref_mv = 2500, 44 62 }, 63 + [ID_AD5664R3] = { 64 + .channels = ad5664r_channels, 65 + .int_vref_mv = 1250, 66 + }, 45 67 [ID_AD5664R5] = { 46 - .bits = 16, 68 + .channels = ad5664r_channels, 47 69 .int_vref_mv = 2500, 48 70 }, 49 71 }; ··· 92 70 return spi_write(spi, msg, 3); 93 71 } 94 72 95 - static ssize_t ad5624r_write_dac(struct device *dev, 96 - struct device_attribute *attr, 97 - const char *buf, size_t len) 73 + static int ad5624r_read_raw(struct iio_dev *indio_dev, 74 + struct iio_chan_spec const *chan, 75 + int *val, 76 + int *val2, 77 + long m) 98 78 { 99 - long readin; 100 - int ret; 101 - struct iio_dev *indio_dev = dev_get_drvdata(dev); 102 79 struct ad5624r_state *st = iio_priv(indio_dev); 103 - struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); 80 + unsigned long scale_uv; 104 81 105 - ret = strict_strtol(buf, 10, &readin); 106 - if (ret) 107 - return ret; 82 + switch (m) { 83 + case IIO_CHAN_INFO_SCALE: 84 + scale_uv = (st->vref_mv * 1000) >> chan->scan_type.realbits; 85 + *val = scale_uv / 1000; 86 + *val2 = (scale_uv % 1000) * 1000; 87 + return IIO_VAL_INT_PLUS_MICRO; 108 88 109 - ret = ad5624r_spi_write(st->us, AD5624R_CMD_WRITE_INPUT_N_UPDATE_N, 110 - this_attr->address, readin, 111 - st->chip_info->bits); 112 - return ret ? ret : len; 89 + } 90 + return -EINVAL; 91 + } 92 + 93 + static int ad5624r_write_raw(struct iio_dev *indio_dev, 94 + struct iio_chan_spec const *chan, 95 + int val, 96 + int val2, 97 + long mask) 98 + { 99 + struct ad5624r_state *st = iio_priv(indio_dev); 100 + int ret; 101 + 102 + switch (mask) { 103 + case 0: 104 + if (val >= (1 << chan->scan_type.realbits) || val < 0) 105 + return -EINVAL; 106 + 107 + return ad5624r_spi_write(st->us, 108 + AD5624R_CMD_WRITE_INPUT_N_UPDATE_N, 109 + chan->address, val, 110 + chan->scan_type.shift); 111 + default: 112 + ret = -EINVAL; 113 + } 114 + 115 + return -EINVAL; 113 116 } 114 117 115 118 static ssize_t ad5624r_read_powerdown_mode(struct device *dev, ··· 208 161 return ret ? ret : len; 209 162 } 210 163 211 - static ssize_t ad5624r_show_scale(struct device *dev, 212 - struct device_attribute *attr, 213 - char *buf) 214 - { 215 - struct iio_dev *indio_dev = dev_get_drvdata(dev); 216 - struct ad5624r_state *st = iio_priv(indio_dev); 217 - /* Corresponds to Vref / 2^(bits) */ 218 - unsigned int scale_uv = (st->vref_mv * 1000) >> st->chip_info->bits; 219 - 220 - return sprintf(buf, "%d.%03d\n", scale_uv / 1000, scale_uv % 1000); 221 - } 222 - static IIO_DEVICE_ATTR(out_voltage_scale, S_IRUGO, ad5624r_show_scale, NULL, 0); 223 - 224 - static IIO_DEV_ATTR_OUT_RAW(0, ad5624r_write_dac, AD5624R_ADDR_DAC0); 225 - static IIO_DEV_ATTR_OUT_RAW(1, ad5624r_write_dac, AD5624R_ADDR_DAC1); 226 - static IIO_DEV_ATTR_OUT_RAW(2, ad5624r_write_dac, AD5624R_ADDR_DAC2); 227 - static IIO_DEV_ATTR_OUT_RAW(3, ad5624r_write_dac, AD5624R_ADDR_DAC3); 228 - 229 164 static IIO_DEVICE_ATTR(out_voltage_powerdown_mode, S_IRUGO | 230 165 S_IWUSR, ad5624r_read_powerdown_mode, 231 166 ad5624r_write_powerdown_mode, 0); ··· 229 200 ad5624r_write_dac_powerdown, 3); 230 201 231 202 static struct attribute *ad5624r_attributes[] = { 232 - &iio_dev_attr_out_voltage0_raw.dev_attr.attr, 233 - &iio_dev_attr_out_voltage1_raw.dev_attr.attr, 234 - &iio_dev_attr_out_voltage2_raw.dev_attr.attr, 235 - &iio_dev_attr_out_voltage3_raw.dev_attr.attr, 236 203 &iio_dev_attr_out_voltage0_powerdown.dev_attr.attr, 237 204 &iio_dev_attr_out_voltage1_powerdown.dev_attr.attr, 238 205 &iio_dev_attr_out_voltage2_powerdown.dev_attr.attr, 239 206 &iio_dev_attr_out_voltage3_powerdown.dev_attr.attr, 240 207 &iio_dev_attr_out_voltage_powerdown_mode.dev_attr.attr, 241 208 &iio_const_attr_out_voltage_powerdown_mode_available.dev_attr.attr, 242 - &iio_dev_attr_out_voltage_scale.dev_attr.attr, 243 209 NULL, 244 210 }; 245 211 ··· 243 219 }; 244 220 245 221 static const struct iio_info ad5624r_info = { 222 + .write_raw = ad5624r_write_raw, 223 + .read_raw = ad5624r_read_raw, 246 224 .attrs = &ad5624r_attribute_group, 247 225 .driver_module = THIS_MODULE, 248 226 }; ··· 285 259 indio_dev->name = spi_get_device_id(spi)->name; 286 260 indio_dev->info = &ad5624r_info; 287 261 indio_dev->modes = INDIO_DIRECT_MODE; 262 + indio_dev->channels = st->chip_info->channels; 263 + indio_dev->num_channels = AD5624R_DAC_CHANNELS; 288 264 289 265 ret = ad5624r_spi_write(spi, AD5624R_CMD_INTERNAL_REFER_SETUP, 0, 290 266 !!voltage_uv, 16);