0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <linux/iio/iio.h>
0016 #include <linux/module.h>
0017 #include <linux/mod_devicetable.h>
0018 #include <linux/regulator/consumer.h>
0019 #include <linux/spi/spi.h>
0020
0021 enum { dual_8bit, dual_10bit, dual_12bit, quad_8bit, quad_10bit, quad_12bit };
0022
0023 struct ti_dac_spec {
0024 u8 num_channels;
0025 u8 resolution;
0026 };
0027
0028 static const struct ti_dac_spec ti_dac_spec[] = {
0029 [dual_8bit] = { .num_channels = 2, .resolution = 8 },
0030 [dual_10bit] = { .num_channels = 2, .resolution = 10 },
0031 [dual_12bit] = { .num_channels = 2, .resolution = 12 },
0032 [quad_8bit] = { .num_channels = 4, .resolution = 8 },
0033 [quad_10bit] = { .num_channels = 4, .resolution = 10 },
0034 [quad_12bit] = { .num_channels = 4, .resolution = 12 },
0035 };
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049 struct ti_dac_chip {
0050 struct mutex lock;
0051 struct regulator *vref;
0052 struct spi_message mesg;
0053 struct spi_transfer xfer;
0054 u16 val[4];
0055 bool powerdown;
0056 u8 powerdown_mode;
0057 u8 resolution;
0058 u8 buf[2] __aligned(IIO_DMA_MINALIGN);
0059 };
0060
0061 #define WRITE_NOT_UPDATE(chan) (0x00 | (chan) << 6)
0062 #define WRITE_AND_UPDATE(chan) (0x10 | (chan) << 6)
0063 #define WRITE_ALL_UPDATE 0x20
0064 #define POWERDOWN(mode) (0x30 | ((mode) + 1) << 6)
0065
0066 static int ti_dac_cmd(struct ti_dac_chip *ti_dac, u8 cmd, u16 val)
0067 {
0068 u8 shift = 12 - ti_dac->resolution;
0069
0070 ti_dac->buf[0] = cmd | (val >> (8 - shift));
0071 ti_dac->buf[1] = (val << shift) & 0xff;
0072 return spi_sync(ti_dac->mesg.spi, &ti_dac->mesg);
0073 }
0074
0075 static const char * const ti_dac_powerdown_modes[] = {
0076 "2.5kohm_to_gnd", "100kohm_to_gnd", "three_state",
0077 };
0078
0079 static int ti_dac_get_powerdown_mode(struct iio_dev *indio_dev,
0080 const struct iio_chan_spec *chan)
0081 {
0082 struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
0083
0084 return ti_dac->powerdown_mode;
0085 }
0086
0087 static int ti_dac_set_powerdown_mode(struct iio_dev *indio_dev,
0088 const struct iio_chan_spec *chan,
0089 unsigned int mode)
0090 {
0091 struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
0092 int ret = 0;
0093
0094 if (ti_dac->powerdown_mode == mode)
0095 return 0;
0096
0097 mutex_lock(&ti_dac->lock);
0098 if (ti_dac->powerdown) {
0099 ret = ti_dac_cmd(ti_dac, POWERDOWN(mode), 0);
0100 if (ret)
0101 goto out;
0102 }
0103 ti_dac->powerdown_mode = mode;
0104
0105 out:
0106 mutex_unlock(&ti_dac->lock);
0107 return ret;
0108 }
0109
0110 static const struct iio_enum ti_dac_powerdown_mode = {
0111 .items = ti_dac_powerdown_modes,
0112 .num_items = ARRAY_SIZE(ti_dac_powerdown_modes),
0113 .get = ti_dac_get_powerdown_mode,
0114 .set = ti_dac_set_powerdown_mode,
0115 };
0116
0117 static ssize_t ti_dac_read_powerdown(struct iio_dev *indio_dev,
0118 uintptr_t private,
0119 const struct iio_chan_spec *chan,
0120 char *buf)
0121 {
0122 struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
0123
0124 return sysfs_emit(buf, "%d\n", ti_dac->powerdown);
0125 }
0126
0127 static ssize_t ti_dac_write_powerdown(struct iio_dev *indio_dev,
0128 uintptr_t private,
0129 const struct iio_chan_spec *chan,
0130 const char *buf, size_t len)
0131 {
0132 struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
0133 bool powerdown;
0134 int ret;
0135
0136 ret = kstrtobool(buf, &powerdown);
0137 if (ret)
0138 return ret;
0139
0140 if (ti_dac->powerdown == powerdown)
0141 return len;
0142
0143 mutex_lock(&ti_dac->lock);
0144 if (powerdown)
0145 ret = ti_dac_cmd(ti_dac, POWERDOWN(ti_dac->powerdown_mode), 0);
0146 else
0147 ret = ti_dac_cmd(ti_dac, WRITE_AND_UPDATE(0), ti_dac->val[0]);
0148 if (!ret)
0149 ti_dac->powerdown = powerdown;
0150 mutex_unlock(&ti_dac->lock);
0151
0152 return ret ? ret : len;
0153 }
0154
0155 static const struct iio_chan_spec_ext_info ti_dac_ext_info[] = {
0156 {
0157 .name = "powerdown",
0158 .read = ti_dac_read_powerdown,
0159 .write = ti_dac_write_powerdown,
0160 .shared = IIO_SHARED_BY_TYPE,
0161 },
0162 IIO_ENUM("powerdown_mode", IIO_SHARED_BY_TYPE, &ti_dac_powerdown_mode),
0163 IIO_ENUM_AVAILABLE("powerdown_mode", IIO_SHARED_BY_TYPE, &ti_dac_powerdown_mode),
0164 { },
0165 };
0166
0167 #define TI_DAC_CHANNEL(chan) { \
0168 .type = IIO_VOLTAGE, \
0169 .channel = (chan), \
0170 .address = (chan), \
0171 .indexed = true, \
0172 .output = true, \
0173 .datasheet_name = (const char[]){ 'A' + (chan), 0 }, \
0174 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
0175 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
0176 .ext_info = ti_dac_ext_info, \
0177 }
0178
0179 static const struct iio_chan_spec ti_dac_channels[] = {
0180 TI_DAC_CHANNEL(0),
0181 TI_DAC_CHANNEL(1),
0182 TI_DAC_CHANNEL(2),
0183 TI_DAC_CHANNEL(3),
0184 };
0185
0186 static int ti_dac_read_raw(struct iio_dev *indio_dev,
0187 struct iio_chan_spec const *chan,
0188 int *val, int *val2, long mask)
0189 {
0190 struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
0191 int ret;
0192
0193 switch (mask) {
0194 case IIO_CHAN_INFO_RAW:
0195 *val = ti_dac->val[chan->channel];
0196 ret = IIO_VAL_INT;
0197 break;
0198
0199 case IIO_CHAN_INFO_SCALE:
0200 ret = regulator_get_voltage(ti_dac->vref);
0201 if (ret < 0)
0202 return ret;
0203
0204 *val = ret / 1000;
0205 *val2 = ti_dac->resolution;
0206 ret = IIO_VAL_FRACTIONAL_LOG2;
0207 break;
0208
0209 default:
0210 ret = -EINVAL;
0211 }
0212
0213 return ret;
0214 }
0215
0216 static int ti_dac_write_raw(struct iio_dev *indio_dev,
0217 struct iio_chan_spec const *chan,
0218 int val, int val2, long mask)
0219 {
0220 struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
0221 int ret;
0222
0223 switch (mask) {
0224 case IIO_CHAN_INFO_RAW:
0225 if (ti_dac->val[chan->channel] == val)
0226 return 0;
0227
0228 if (val >= (1 << ti_dac->resolution) || val < 0)
0229 return -EINVAL;
0230
0231 if (ti_dac->powerdown)
0232 return -EBUSY;
0233
0234 mutex_lock(&ti_dac->lock);
0235 ret = ti_dac_cmd(ti_dac, WRITE_AND_UPDATE(chan->channel), val);
0236 if (!ret)
0237 ti_dac->val[chan->channel] = val;
0238 mutex_unlock(&ti_dac->lock);
0239 break;
0240
0241 default:
0242 ret = -EINVAL;
0243 }
0244
0245 return ret;
0246 }
0247
0248 static int ti_dac_write_raw_get_fmt(struct iio_dev *indio_dev,
0249 struct iio_chan_spec const *chan, long mask)
0250 {
0251 return IIO_VAL_INT;
0252 }
0253
0254 static const struct iio_info ti_dac_info = {
0255 .read_raw = ti_dac_read_raw,
0256 .write_raw = ti_dac_write_raw,
0257 .write_raw_get_fmt = ti_dac_write_raw_get_fmt,
0258 };
0259
0260 static int ti_dac_probe(struct spi_device *spi)
0261 {
0262 struct device *dev = &spi->dev;
0263 const struct ti_dac_spec *spec;
0264 struct ti_dac_chip *ti_dac;
0265 struct iio_dev *indio_dev;
0266 int ret;
0267
0268 indio_dev = devm_iio_device_alloc(dev, sizeof(*ti_dac));
0269 if (!indio_dev)
0270 return -ENOMEM;
0271
0272 indio_dev->info = &ti_dac_info;
0273 indio_dev->name = spi->modalias;
0274 indio_dev->modes = INDIO_DIRECT_MODE;
0275 indio_dev->channels = ti_dac_channels;
0276 spi_set_drvdata(spi, indio_dev);
0277
0278 ti_dac = iio_priv(indio_dev);
0279 ti_dac->xfer.tx_buf = &ti_dac->buf;
0280 ti_dac->xfer.len = sizeof(ti_dac->buf);
0281 spi_message_init_with_transfers(&ti_dac->mesg, &ti_dac->xfer, 1);
0282 ti_dac->mesg.spi = spi;
0283
0284 spec = &ti_dac_spec[spi_get_device_id(spi)->driver_data];
0285 indio_dev->num_channels = spec->num_channels;
0286 ti_dac->resolution = spec->resolution;
0287
0288 ti_dac->vref = devm_regulator_get(dev, "vref");
0289 if (IS_ERR(ti_dac->vref))
0290 return PTR_ERR(ti_dac->vref);
0291
0292 ret = regulator_enable(ti_dac->vref);
0293 if (ret < 0)
0294 return ret;
0295
0296 mutex_init(&ti_dac->lock);
0297
0298 ret = ti_dac_cmd(ti_dac, WRITE_ALL_UPDATE, 0);
0299 if (ret) {
0300 dev_err(dev, "failed to initialize outputs to 0\n");
0301 goto err;
0302 }
0303
0304 ret = iio_device_register(indio_dev);
0305 if (ret)
0306 goto err;
0307
0308 return 0;
0309
0310 err:
0311 mutex_destroy(&ti_dac->lock);
0312 regulator_disable(ti_dac->vref);
0313 return ret;
0314 }
0315
0316 static void ti_dac_remove(struct spi_device *spi)
0317 {
0318 struct iio_dev *indio_dev = spi_get_drvdata(spi);
0319 struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
0320
0321 iio_device_unregister(indio_dev);
0322 mutex_destroy(&ti_dac->lock);
0323 regulator_disable(ti_dac->vref);
0324 }
0325
0326 static const struct of_device_id ti_dac_of_id[] = {
0327 { .compatible = "ti,dac082s085" },
0328 { .compatible = "ti,dac102s085" },
0329 { .compatible = "ti,dac122s085" },
0330 { .compatible = "ti,dac084s085" },
0331 { .compatible = "ti,dac104s085" },
0332 { .compatible = "ti,dac124s085" },
0333 { }
0334 };
0335 MODULE_DEVICE_TABLE(of, ti_dac_of_id);
0336
0337 static const struct spi_device_id ti_dac_spi_id[] = {
0338 { "dac082s085", dual_8bit },
0339 { "dac102s085", dual_10bit },
0340 { "dac122s085", dual_12bit },
0341 { "dac084s085", quad_8bit },
0342 { "dac104s085", quad_10bit },
0343 { "dac124s085", quad_12bit },
0344 { }
0345 };
0346 MODULE_DEVICE_TABLE(spi, ti_dac_spi_id);
0347
0348 static struct spi_driver ti_dac_driver = {
0349 .driver = {
0350 .name = "ti-dac082s085",
0351 .of_match_table = ti_dac_of_id,
0352 },
0353 .probe = ti_dac_probe,
0354 .remove = ti_dac_remove,
0355 .id_table = ti_dac_spi_id,
0356 };
0357 module_spi_driver(ti_dac_driver);
0358
0359 MODULE_AUTHOR("Lukas Wunner <lukas@wunner.de>");
0360 MODULE_DESCRIPTION("Texas Instruments 8/10/12-bit 2/4-channel DAC driver");
0361 MODULE_LICENSE("GPL v2");