0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/module.h>
0012 #include <linux/slab.h>
0013 #include <linux/i2c.h>
0014 #include <linux/err.h>
0015
0016 #include <linux/iio/iio.h>
0017 #include <linux/iio/driver.h>
0018
0019 #include <linux/regulator/consumer.h>
0020
0021 #define M62332_CHANNELS 2
0022
0023 struct m62332_data {
0024 struct i2c_client *client;
0025 struct regulator *vcc;
0026 struct mutex mutex;
0027 u8 raw[M62332_CHANNELS];
0028 u8 save[M62332_CHANNELS];
0029 };
0030
0031 static int m62332_set_value(struct iio_dev *indio_dev, u8 val, int channel)
0032 {
0033 struct m62332_data *data = iio_priv(indio_dev);
0034 struct i2c_client *client = data->client;
0035 u8 outbuf[2];
0036 int res;
0037
0038 if (val == data->raw[channel])
0039 return 0;
0040
0041 outbuf[0] = channel;
0042 outbuf[1] = val;
0043
0044 mutex_lock(&data->mutex);
0045
0046 if (val) {
0047 res = regulator_enable(data->vcc);
0048 if (res)
0049 goto out;
0050 }
0051
0052 res = i2c_master_send(client, outbuf, ARRAY_SIZE(outbuf));
0053 if (res >= 0 && res != ARRAY_SIZE(outbuf))
0054 res = -EIO;
0055 if (res < 0)
0056 goto out;
0057
0058 data->raw[channel] = val;
0059
0060 if (!val)
0061 regulator_disable(data->vcc);
0062
0063 mutex_unlock(&data->mutex);
0064
0065 return 0;
0066
0067 out:
0068 mutex_unlock(&data->mutex);
0069
0070 return res;
0071 }
0072
0073 static int m62332_read_raw(struct iio_dev *indio_dev,
0074 struct iio_chan_spec const *chan,
0075 int *val,
0076 int *val2,
0077 long mask)
0078 {
0079 struct m62332_data *data = iio_priv(indio_dev);
0080 int ret;
0081
0082 switch (mask) {
0083 case IIO_CHAN_INFO_SCALE:
0084
0085 ret = regulator_get_voltage(data->vcc);
0086 if (ret < 0)
0087 return ret;
0088
0089 *val = ret / 1000;
0090 *val2 = 8;
0091
0092 return IIO_VAL_FRACTIONAL_LOG2;
0093 case IIO_CHAN_INFO_RAW:
0094 *val = data->raw[chan->channel];
0095
0096 return IIO_VAL_INT;
0097 case IIO_CHAN_INFO_OFFSET:
0098 *val = 1;
0099
0100 return IIO_VAL_INT;
0101 default:
0102 break;
0103 }
0104
0105 return -EINVAL;
0106 }
0107
0108 static int m62332_write_raw(struct iio_dev *indio_dev,
0109 struct iio_chan_spec const *chan, int val, int val2,
0110 long mask)
0111 {
0112 switch (mask) {
0113 case IIO_CHAN_INFO_RAW:
0114 if (val < 0 || val > 255)
0115 return -EINVAL;
0116
0117 return m62332_set_value(indio_dev, val, chan->channel);
0118 default:
0119 break;
0120 }
0121
0122 return -EINVAL;
0123 }
0124
0125 static int m62332_suspend(struct device *dev)
0126 {
0127 struct i2c_client *client = to_i2c_client(dev);
0128 struct iio_dev *indio_dev = i2c_get_clientdata(client);
0129 struct m62332_data *data = iio_priv(indio_dev);
0130 int ret;
0131
0132 data->save[0] = data->raw[0];
0133 data->save[1] = data->raw[1];
0134
0135 ret = m62332_set_value(indio_dev, 0, 0);
0136 if (ret < 0)
0137 return ret;
0138
0139 return m62332_set_value(indio_dev, 0, 1);
0140 }
0141
0142 static int m62332_resume(struct device *dev)
0143 {
0144 struct i2c_client *client = to_i2c_client(dev);
0145 struct iio_dev *indio_dev = i2c_get_clientdata(client);
0146 struct m62332_data *data = iio_priv(indio_dev);
0147 int ret;
0148
0149 ret = m62332_set_value(indio_dev, data->save[0], 0);
0150 if (ret < 0)
0151 return ret;
0152
0153 return m62332_set_value(indio_dev, data->save[1], 1);
0154 }
0155
0156 static DEFINE_SIMPLE_DEV_PM_OPS(m62332_pm_ops, m62332_suspend, m62332_resume);
0157
0158 static const struct iio_info m62332_info = {
0159 .read_raw = m62332_read_raw,
0160 .write_raw = m62332_write_raw,
0161 };
0162
0163 #define M62332_CHANNEL(chan) { \
0164 .type = IIO_VOLTAGE, \
0165 .indexed = 1, \
0166 .output = 1, \
0167 .channel = (chan), \
0168 .datasheet_name = "CH" #chan, \
0169 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
0170 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
0171 BIT(IIO_CHAN_INFO_OFFSET), \
0172 }
0173
0174 static const struct iio_chan_spec m62332_channels[M62332_CHANNELS] = {
0175 M62332_CHANNEL(0),
0176 M62332_CHANNEL(1)
0177 };
0178
0179 static int m62332_probe(struct i2c_client *client,
0180 const struct i2c_device_id *id)
0181 {
0182 struct m62332_data *data;
0183 struct iio_dev *indio_dev;
0184 int ret;
0185
0186 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
0187 if (!indio_dev)
0188 return -ENOMEM;
0189
0190 data = iio_priv(indio_dev);
0191 i2c_set_clientdata(client, indio_dev);
0192 data->client = client;
0193
0194 mutex_init(&data->mutex);
0195
0196 data->vcc = devm_regulator_get(&client->dev, "VCC");
0197 if (IS_ERR(data->vcc))
0198 return PTR_ERR(data->vcc);
0199
0200 indio_dev->num_channels = ARRAY_SIZE(m62332_channels);
0201 indio_dev->channels = m62332_channels;
0202 indio_dev->modes = INDIO_DIRECT_MODE;
0203 indio_dev->info = &m62332_info;
0204
0205 ret = iio_map_array_register(indio_dev, client->dev.platform_data);
0206 if (ret < 0)
0207 return ret;
0208
0209 ret = iio_device_register(indio_dev);
0210 if (ret < 0)
0211 goto err;
0212
0213 return 0;
0214
0215 err:
0216 iio_map_array_unregister(indio_dev);
0217
0218 return ret;
0219 }
0220
0221 static int m62332_remove(struct i2c_client *client)
0222 {
0223 struct iio_dev *indio_dev = i2c_get_clientdata(client);
0224
0225 iio_device_unregister(indio_dev);
0226 iio_map_array_unregister(indio_dev);
0227 m62332_set_value(indio_dev, 0, 0);
0228 m62332_set_value(indio_dev, 0, 1);
0229
0230 return 0;
0231 }
0232
0233 static const struct i2c_device_id m62332_id[] = {
0234 { "m62332", },
0235 { }
0236 };
0237 MODULE_DEVICE_TABLE(i2c, m62332_id);
0238
0239 static struct i2c_driver m62332_driver = {
0240 .driver = {
0241 .name = "m62332",
0242 .pm = pm_sleep_ptr(&m62332_pm_ops),
0243 },
0244 .probe = m62332_probe,
0245 .remove = m62332_remove,
0246 .id_table = m62332_id,
0247 };
0248 module_i2c_driver(m62332_driver);
0249
0250 MODULE_AUTHOR("Dmitry Eremin-Solenikov");
0251 MODULE_DESCRIPTION("M62332 8-bit DAC");
0252 MODULE_LICENSE("GPL v2");