0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/module.h>
0009 #include <linux/slab.h>
0010 #include <linux/jiffies.h>
0011 #include <linux/i2c.h>
0012 #include <linux/err.h>
0013
0014 #include <linux/iio/iio.h>
0015 #include <linux/iio/sysfs.h>
0016 #include <linux/iio/dac/max517.h>
0017
0018 #define MAX517_DRV_NAME "max517"
0019
0020
0021 #define COMMAND_CHANNEL0 0x00
0022 #define COMMAND_CHANNEL1 0x01
0023 #define COMMAND_PD 0x08
0024
0025 enum max517_device_ids {
0026 ID_MAX517,
0027 ID_MAX518,
0028 ID_MAX519,
0029 ID_MAX520,
0030 ID_MAX521,
0031 };
0032
0033 struct max517_data {
0034 struct i2c_client *client;
0035 unsigned short vref_mv[8];
0036 };
0037
0038
0039
0040
0041
0042
0043 static int max517_set_value(struct iio_dev *indio_dev,
0044 long val, int channel)
0045 {
0046 struct max517_data *data = iio_priv(indio_dev);
0047 struct i2c_client *client = data->client;
0048 u8 outbuf[2];
0049 int res;
0050
0051 if (val < 0 || val > 255)
0052 return -EINVAL;
0053
0054 outbuf[0] = channel;
0055 outbuf[1] = val;
0056
0057 res = i2c_master_send(client, outbuf, 2);
0058 if (res < 0)
0059 return res;
0060 else if (res != 2)
0061 return -EIO;
0062 else
0063 return 0;
0064 }
0065
0066 static int max517_read_raw(struct iio_dev *indio_dev,
0067 struct iio_chan_spec const *chan,
0068 int *val,
0069 int *val2,
0070 long m)
0071 {
0072 struct max517_data *data = iio_priv(indio_dev);
0073
0074 switch (m) {
0075 case IIO_CHAN_INFO_SCALE:
0076
0077 *val = data->vref_mv[chan->channel];
0078 *val2 = 8;
0079 return IIO_VAL_FRACTIONAL_LOG2;
0080 default:
0081 break;
0082 }
0083 return -EINVAL;
0084 }
0085
0086 static int max517_write_raw(struct iio_dev *indio_dev,
0087 struct iio_chan_spec const *chan, int val, int val2, long mask)
0088 {
0089 int ret;
0090
0091 switch (mask) {
0092 case IIO_CHAN_INFO_RAW:
0093 ret = max517_set_value(indio_dev, val, chan->channel);
0094 break;
0095 default:
0096 ret = -EINVAL;
0097 break;
0098 }
0099
0100 return ret;
0101 }
0102
0103 static int max517_suspend(struct device *dev)
0104 {
0105 u8 outbuf = COMMAND_PD;
0106
0107 return i2c_master_send(to_i2c_client(dev), &outbuf, 1);
0108 }
0109
0110 static int max517_resume(struct device *dev)
0111 {
0112 u8 outbuf = 0;
0113
0114 return i2c_master_send(to_i2c_client(dev), &outbuf, 1);
0115 }
0116
0117 static DEFINE_SIMPLE_DEV_PM_OPS(max517_pm_ops, max517_suspend, max517_resume);
0118
0119 static const struct iio_info max517_info = {
0120 .read_raw = max517_read_raw,
0121 .write_raw = max517_write_raw,
0122 };
0123
0124 #define MAX517_CHANNEL(chan) { \
0125 .type = IIO_VOLTAGE, \
0126 .indexed = 1, \
0127 .output = 1, \
0128 .channel = (chan), \
0129 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
0130 BIT(IIO_CHAN_INFO_SCALE), \
0131 }
0132
0133 static const struct iio_chan_spec max517_channels[] = {
0134 MAX517_CHANNEL(0),
0135 MAX517_CHANNEL(1),
0136 MAX517_CHANNEL(2),
0137 MAX517_CHANNEL(3),
0138 MAX517_CHANNEL(4),
0139 MAX517_CHANNEL(5),
0140 MAX517_CHANNEL(6),
0141 MAX517_CHANNEL(7),
0142 };
0143
0144 static int max517_probe(struct i2c_client *client,
0145 const struct i2c_device_id *id)
0146 {
0147 struct max517_data *data;
0148 struct iio_dev *indio_dev;
0149 struct max517_platform_data *platform_data = client->dev.platform_data;
0150 int chan;
0151
0152 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
0153 if (!indio_dev)
0154 return -ENOMEM;
0155 data = iio_priv(indio_dev);
0156 data->client = client;
0157
0158 switch (id->driver_data) {
0159 case ID_MAX521:
0160 indio_dev->num_channels = 8;
0161 break;
0162 case ID_MAX520:
0163 indio_dev->num_channels = 4;
0164 break;
0165 case ID_MAX519:
0166 case ID_MAX518:
0167 indio_dev->num_channels = 2;
0168 break;
0169 default:
0170 indio_dev->num_channels = 1;
0171 break;
0172 }
0173 indio_dev->channels = max517_channels;
0174 indio_dev->modes = INDIO_DIRECT_MODE;
0175 indio_dev->info = &max517_info;
0176
0177
0178
0179
0180
0181 for (chan = 0; chan < indio_dev->num_channels; chan++) {
0182 if (id->driver_data == ID_MAX518 || !platform_data)
0183 data->vref_mv[chan] = 5000;
0184 else
0185 data->vref_mv[chan] = platform_data->vref_mv[chan];
0186 }
0187
0188 return devm_iio_device_register(&client->dev, indio_dev);
0189 }
0190
0191 static const struct i2c_device_id max517_id[] = {
0192 { "max517", ID_MAX517 },
0193 { "max518", ID_MAX518 },
0194 { "max519", ID_MAX519 },
0195 { "max520", ID_MAX520 },
0196 { "max521", ID_MAX521 },
0197 { }
0198 };
0199 MODULE_DEVICE_TABLE(i2c, max517_id);
0200
0201 static struct i2c_driver max517_driver = {
0202 .driver = {
0203 .name = MAX517_DRV_NAME,
0204 .pm = pm_sleep_ptr(&max517_pm_ops),
0205 },
0206 .probe = max517_probe,
0207 .id_table = max517_id,
0208 };
0209 module_i2c_driver(max517_driver);
0210
0211 MODULE_AUTHOR("Roland Stigge <stigge@antcom.de>");
0212 MODULE_DESCRIPTION("MAX517/518/519/520/521 8-bit DAC");
0213 MODULE_LICENSE("GPL");