1 // SPDX-License-Identifier: GPL-2.0-only
3 * Support for Microchip MCP4728
5 * Copyright (C) 2023 Andrea Collamati <andrea.collamati@gmail.com>
7 * Based on mcp4725 by Peter Meerwald <pmeerw@pmeerw.net>
9 * Driver for the Microchip I2C 12-bit digital-to-analog quad channels
12 * (7-bit I2C slave address 0x60, the three LSBs can be configured in
16 #include <linux/bitfield.h>
17 #include <linux/delay.h>
18 #include <linux/err.h>
19 #include <linux/i2c.h>
20 #include <linux/iio/iio.h>
21 #include <linux/iio/sysfs.h>
22 #include <linux/module.h>
23 #include <linux/mod_devicetable.h>
24 #include <linux/property.h>
25 #include <linux/regulator/consumer.h>
27 #define MCP4728_RESOLUTION 12
28 #define MCP4728_N_CHANNELS 4
30 #define MCP4728_CMD_MASK GENMASK(7, 3)
31 #define MCP4728_CHSEL_MASK GENMASK(2, 1)
32 #define MCP4728_UDAC_MASK BIT(0)
34 #define MCP4728_VREF_MASK BIT(7)
35 #define MCP4728_PDMODE_MASK GENMASK(6, 5)
36 #define MCP4728_GAIN_MASK BIT(4)
38 #define MCP4728_DAC_H_MASK GENMASK(3, 0)
39 #define MCP4728_DAC_L_MASK GENMASK(7, 0)
41 #define MCP4728_RDY_MASK BIT(7)
43 #define MCP4728_MW_CMD 0x08 /* Multiwrite Command */
44 #define MCP4728_SW_CMD 0x0A /* Sequential Write Command with EEPROM */
46 #define MCP4728_READ_RESPONSE_LEN (MCP4728_N_CHANNELS * 3 * 2)
47 #define MCP4728_WRITE_EEPROM_LEN (1 + MCP4728_N_CHANNELS * 2)
50 MCP4728_VREF_EXTERNAL_VDD
= 0,
51 MCP4728_VREF_INTERNAL_2048mV
= 1,
59 enum iio_powerdown_mode
{
65 struct mcp4728_channel_data
{
66 enum vref_mode ref_mode
;
67 enum iio_powerdown_mode pd_mode
;
68 enum gain_mode g_mode
;
72 /* MCP4728 Full Scale Ranges
73 * the device available ranges are
74 * - VREF = VDD FSR = from 0.0V to VDD
75 * - VREF = Internal Gain = 1 FSR = from 0.0V to VREF
76 * - VREF = Internal Gain = 2 FSR = from 0.0V to 2*VREF
80 MCP4728_SCALE_VINT_NO_GAIN
,
81 MCP4728_SCALE_VINT_GAIN_X2
,
86 struct i2c_client
*client
;
88 int scales_avail
[MCP4728_N_SCALES
* 2];
89 struct mcp4728_channel_data chdata
[MCP4728_N_CHANNELS
];
92 #define MCP4728_CHAN(chan) { \
93 .type = IIO_VOLTAGE, \
97 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
98 BIT(IIO_CHAN_INFO_SCALE), \
99 .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SCALE), \
100 .ext_info = mcp4728_ext_info, \
103 static int mcp4728_suspend(struct device
*dev
);
104 static int mcp4728_resume(struct device
*dev
);
106 static ssize_t
mcp4728_store_eeprom(struct device
*dev
,
107 struct device_attribute
*attr
,
108 const char *buf
, size_t len
)
110 struct iio_dev
*indio_dev
= dev_to_iio_dev(dev
);
111 struct mcp4728_data
*data
= iio_priv(indio_dev
);
112 u8 outbuf
[MCP4728_WRITE_EEPROM_LEN
];
119 ret
= kstrtobool(buf
, &state
);
126 outbuf
[0] = FIELD_PREP(MCP4728_CMD_MASK
, MCP4728_SW_CMD
);
128 for (i
= 0; i
< MCP4728_N_CHANNELS
; i
++) {
129 struct mcp4728_channel_data
*ch
= &data
->chdata
[i
];
130 int offset
= 1 + i
* 2;
132 outbuf
[offset
] = FIELD_PREP(MCP4728_VREF_MASK
, ch
->ref_mode
);
134 if (data
->powerdown
) {
135 u8 mcp4728_pd_mode
= ch
->pd_mode
+ 1;
137 outbuf
[offset
] |= FIELD_PREP(MCP4728_PDMODE_MASK
,
141 outbuf
[offset
] |= FIELD_PREP(MCP4728_GAIN_MASK
, ch
->g_mode
);
143 FIELD_PREP(MCP4728_DAC_H_MASK
, ch
->dac_value
>> 8);
145 FIELD_PREP(MCP4728_DAC_L_MASK
, ch
->dac_value
);
148 ret
= i2c_master_send(data
->client
, outbuf
, MCP4728_WRITE_EEPROM_LEN
);
151 else if (ret
!= MCP4728_WRITE_EEPROM_LEN
)
154 /* wait RDY signal for write complete, takes up to 50ms */
157 ret
= i2c_master_recv(data
->client
, inbuf
, 3);
163 if (FIELD_GET(MCP4728_RDY_MASK
, inbuf
[0]))
168 dev_err(&data
->client
->dev
, "%s failed, incomplete\n",
175 static IIO_DEVICE_ATTR(store_eeprom
, 0200, NULL
, mcp4728_store_eeprom
, 0);
177 static struct attribute
*mcp4728_attributes
[] = {
178 &iio_dev_attr_store_eeprom
.dev_attr
.attr
,
182 static const struct attribute_group mcp4728_attribute_group
= {
183 .attrs
= mcp4728_attributes
,
186 static int mcp4728_program_channel_cfg(int channel
, struct iio_dev
*indio_dev
)
188 struct mcp4728_data
*data
= iio_priv(indio_dev
);
189 struct mcp4728_channel_data
*ch
= &data
->chdata
[channel
];
193 outbuf
[0] = FIELD_PREP(MCP4728_CMD_MASK
, MCP4728_MW_CMD
);
194 outbuf
[0] |= FIELD_PREP(MCP4728_CHSEL_MASK
, channel
);
195 outbuf
[0] |= FIELD_PREP(MCP4728_UDAC_MASK
, 0);
197 outbuf
[1] = FIELD_PREP(MCP4728_VREF_MASK
, ch
->ref_mode
);
200 outbuf
[1] |= FIELD_PREP(MCP4728_PDMODE_MASK
, ch
->pd_mode
+ 1);
202 outbuf
[1] |= FIELD_PREP(MCP4728_GAIN_MASK
, ch
->g_mode
);
203 outbuf
[1] |= FIELD_PREP(MCP4728_DAC_H_MASK
, ch
->dac_value
>> 8);
204 outbuf
[2] = FIELD_PREP(MCP4728_DAC_L_MASK
, ch
->dac_value
);
206 ret
= i2c_master_send(data
->client
, outbuf
, 3);
215 static const char *const mcp4728_powerdown_modes
[] = { "1kohm_to_gnd",
219 static int mcp4728_get_powerdown_mode(struct iio_dev
*indio_dev
,
220 const struct iio_chan_spec
*chan
)
222 struct mcp4728_data
*data
= iio_priv(indio_dev
);
224 return data
->chdata
[chan
->channel
].pd_mode
;
227 static int mcp4728_set_powerdown_mode(struct iio_dev
*indio_dev
,
228 const struct iio_chan_spec
*chan
,
231 struct mcp4728_data
*data
= iio_priv(indio_dev
);
233 data
->chdata
[chan
->channel
].pd_mode
= mode
;
238 static ssize_t
mcp4728_read_powerdown(struct iio_dev
*indio_dev
,
240 const struct iio_chan_spec
*chan
,
243 struct mcp4728_data
*data
= iio_priv(indio_dev
);
245 return sysfs_emit(buf
, "%d\n", data
->powerdown
);
248 static ssize_t
mcp4728_write_powerdown(struct iio_dev
*indio_dev
,
250 const struct iio_chan_spec
*chan
,
251 const char *buf
, size_t len
)
253 struct mcp4728_data
*data
= iio_priv(indio_dev
);
257 ret
= kstrtobool(buf
, &state
);
262 ret
= mcp4728_suspend(&data
->client
->dev
);
264 ret
= mcp4728_resume(&data
->client
->dev
);
272 static const struct iio_enum mcp4728_powerdown_mode_enum
= {
273 .items
= mcp4728_powerdown_modes
,
274 .num_items
= ARRAY_SIZE(mcp4728_powerdown_modes
),
275 .get
= mcp4728_get_powerdown_mode
,
276 .set
= mcp4728_set_powerdown_mode
,
279 static const struct iio_chan_spec_ext_info mcp4728_ext_info
[] = {
282 .read
= mcp4728_read_powerdown
,
283 .write
= mcp4728_write_powerdown
,
284 .shared
= IIO_SEPARATE
,
286 IIO_ENUM("powerdown_mode", IIO_SEPARATE
, &mcp4728_powerdown_mode_enum
),
287 IIO_ENUM_AVAILABLE("powerdown_mode", IIO_SHARED_BY_TYPE
,
288 &mcp4728_powerdown_mode_enum
),
292 static const struct iio_chan_spec mcp4728_channels
[MCP4728_N_CHANNELS
] = {
299 static void mcp4728_get_scale_avail(enum mcp4728_scale scale
,
300 struct mcp4728_data
*data
, int *val
,
303 *val
= data
->scales_avail
[scale
* 2];
304 *val2
= data
->scales_avail
[scale
* 2 + 1];
307 static void mcp4728_get_scale(int channel
, struct mcp4728_data
*data
, int *val
,
310 int ref_mode
= data
->chdata
[channel
].ref_mode
;
311 int g_mode
= data
->chdata
[channel
].g_mode
;
313 if (ref_mode
== MCP4728_VREF_EXTERNAL_VDD
) {
314 mcp4728_get_scale_avail(MCP4728_SCALE_VDD
, data
, val
, val2
);
316 if (g_mode
== MCP4728_GAIN_X1
) {
317 mcp4728_get_scale_avail(MCP4728_SCALE_VINT_NO_GAIN
,
320 mcp4728_get_scale_avail(MCP4728_SCALE_VINT_GAIN_X2
,
326 static int mcp4728_find_matching_scale(struct mcp4728_data
*data
, int val
,
329 for (int i
= 0; i
< MCP4728_N_SCALES
; i
++) {
330 if (data
->scales_avail
[i
* 2] == val
&&
331 data
->scales_avail
[i
* 2 + 1] == val2
)
337 static int mcp4728_set_scale(int channel
, struct mcp4728_data
*data
, int val
,
340 int scale
= mcp4728_find_matching_scale(data
, val
, val2
);
346 case MCP4728_SCALE_VDD
:
347 data
->chdata
[channel
].ref_mode
= MCP4728_VREF_EXTERNAL_VDD
;
349 case MCP4728_SCALE_VINT_NO_GAIN
:
350 data
->chdata
[channel
].ref_mode
= MCP4728_VREF_INTERNAL_2048mV
;
351 data
->chdata
[channel
].g_mode
= MCP4728_GAIN_X1
;
353 case MCP4728_SCALE_VINT_GAIN_X2
:
354 data
->chdata
[channel
].ref_mode
= MCP4728_VREF_INTERNAL_2048mV
;
355 data
->chdata
[channel
].g_mode
= MCP4728_GAIN_X2
;
362 static int mcp4728_read_raw(struct iio_dev
*indio_dev
,
363 struct iio_chan_spec
const *chan
, int *val
,
364 int *val2
, long mask
)
366 struct mcp4728_data
*data
= iio_priv(indio_dev
);
369 case IIO_CHAN_INFO_RAW
:
370 *val
= data
->chdata
[chan
->channel
].dac_value
;
372 case IIO_CHAN_INFO_SCALE
:
373 mcp4728_get_scale(chan
->channel
, data
, val
, val2
);
374 return IIO_VAL_INT_PLUS_MICRO
;
379 static int mcp4728_write_raw(struct iio_dev
*indio_dev
,
380 struct iio_chan_spec
const *chan
, int val
,
383 struct mcp4728_data
*data
= iio_priv(indio_dev
);
387 case IIO_CHAN_INFO_RAW
:
388 if (val
< 0 || val
> GENMASK(MCP4728_RESOLUTION
- 1, 0))
390 data
->chdata
[chan
->channel
].dac_value
= val
;
391 return mcp4728_program_channel_cfg(chan
->channel
, indio_dev
);
392 case IIO_CHAN_INFO_SCALE
:
393 ret
= mcp4728_set_scale(chan
->channel
, data
, val
, val2
);
397 return mcp4728_program_channel_cfg(chan
->channel
, indio_dev
);
403 static void mcp4728_init_scale_avail(enum mcp4728_scale scale
, int vref_mv
,
404 struct mcp4728_data
*data
)
410 tmp
= (s64
)vref_mv
* 1000000LL >> MCP4728_RESOLUTION
;
411 value_int
= div_s64_rem(tmp
, 1000000LL, &value_micro
);
413 data
->scales_avail
[scale
* 2] = value_int
;
414 data
->scales_avail
[scale
* 2 + 1] = value_micro
;
417 static int mcp4728_init_scales_avail(struct mcp4728_data
*data
, int vdd_mv
)
419 mcp4728_init_scale_avail(MCP4728_SCALE_VDD
, vdd_mv
, data
);
420 mcp4728_init_scale_avail(MCP4728_SCALE_VINT_NO_GAIN
, 2048, data
);
421 mcp4728_init_scale_avail(MCP4728_SCALE_VINT_GAIN_X2
, 4096, data
);
426 static int mcp4728_read_avail(struct iio_dev
*indio_dev
,
427 struct iio_chan_spec
const *chan
,
428 const int **vals
, int *type
, int *length
,
431 struct mcp4728_data
*data
= iio_priv(indio_dev
);
434 case IIO_CHAN_INFO_SCALE
:
435 *type
= IIO_VAL_INT_PLUS_MICRO
;
437 switch (chan
->type
) {
439 *vals
= data
->scales_avail
;
440 *length
= MCP4728_N_SCALES
* 2;
441 return IIO_AVAIL_LIST
;
450 static const struct iio_info mcp4728_info
= {
451 .read_raw
= mcp4728_read_raw
,
452 .write_raw
= mcp4728_write_raw
,
453 .read_avail
= &mcp4728_read_avail
,
454 .attrs
= &mcp4728_attribute_group
,
457 static int mcp4728_suspend(struct device
*dev
)
459 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
460 struct mcp4728_data
*data
= iio_priv(indio_dev
);
463 data
->powerdown
= true;
465 for (i
= 0; i
< MCP4728_N_CHANNELS
; i
++) {
466 int err
= mcp4728_program_channel_cfg(i
, indio_dev
);
474 static int mcp4728_resume(struct device
*dev
)
476 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
477 struct mcp4728_data
*data
= iio_priv(indio_dev
);
481 data
->powerdown
= false;
483 for (i
= 0; i
< MCP4728_N_CHANNELS
; i
++) {
484 int ret
= mcp4728_program_channel_cfg(i
, indio_dev
);
492 static DEFINE_SIMPLE_DEV_PM_OPS(mcp4728_pm_ops
, mcp4728_suspend
,
495 static int mcp4728_init_channels_data(struct mcp4728_data
*data
)
497 u8 inbuf
[MCP4728_READ_RESPONSE_LEN
];
501 ret
= i2c_master_recv(data
->client
, inbuf
, MCP4728_READ_RESPONSE_LEN
);
503 return dev_err_probe(&data
->client
->dev
, ret
,
504 "failed to read mcp4728 conf.\n");
505 } else if (ret
!= MCP4728_READ_RESPONSE_LEN
) {
506 return dev_err_probe(&data
->client
->dev
, -EIO
,
507 "failed to read mcp4728 conf. Wrong Response Len ret=%d\n",
511 for (i
= 0; i
< MCP4728_N_CHANNELS
; i
++) {
512 struct mcp4728_channel_data
*ch
= &data
->chdata
[i
];
513 u8 r2
= inbuf
[i
* 6 + 1];
514 u8 r3
= inbuf
[i
* 6 + 2];
516 ch
->dac_value
= FIELD_GET(MCP4728_DAC_H_MASK
, r2
) << 8 |
517 FIELD_GET(MCP4728_DAC_L_MASK
, r3
);
518 ch
->ref_mode
= FIELD_GET(MCP4728_VREF_MASK
, r2
);
519 ch
->pd_mode
= FIELD_GET(MCP4728_PDMODE_MASK
, r2
);
520 ch
->g_mode
= FIELD_GET(MCP4728_GAIN_MASK
, r2
);
526 static int mcp4728_probe(struct i2c_client
*client
)
528 const struct i2c_device_id
*id
= i2c_client_get_device_id(client
);
529 struct mcp4728_data
*data
;
530 struct iio_dev
*indio_dev
;
533 indio_dev
= devm_iio_device_alloc(&client
->dev
, sizeof(*data
));
537 data
= iio_priv(indio_dev
);
538 i2c_set_clientdata(client
, indio_dev
);
539 data
->client
= client
;
541 ret
= devm_regulator_get_enable_read_voltage(&client
->dev
, "vdd");
548 * MCP4728 has internal EEPROM that save each channel boot
549 * configuration. It means that device configuration is unknown to the
550 * driver at kernel boot. mcp4728_init_channels_data() reads back DAC
551 * settings and stores them in data structure.
553 ret
= mcp4728_init_channels_data(data
);
555 return dev_err_probe(&client
->dev
, ret
,
556 "failed to read mcp4728 current configuration\n");
559 ret
= mcp4728_init_scales_avail(data
, vdd_mv
);
561 return dev_err_probe(&client
->dev
, ret
,
562 "failed to init scales\n");
565 indio_dev
->name
= id
->name
;
566 indio_dev
->info
= &mcp4728_info
;
567 indio_dev
->channels
= mcp4728_channels
;
568 indio_dev
->num_channels
= MCP4728_N_CHANNELS
;
569 indio_dev
->modes
= INDIO_DIRECT_MODE
;
571 return devm_iio_device_register(&client
->dev
, indio_dev
);
574 static const struct i2c_device_id mcp4728_id
[] = {
578 MODULE_DEVICE_TABLE(i2c
, mcp4728_id
);
580 static const struct of_device_id mcp4728_of_match
[] = {
581 { .compatible
= "microchip,mcp4728" },
584 MODULE_DEVICE_TABLE(of
, mcp4728_of_match
);
586 static struct i2c_driver mcp4728_driver
= {
589 .of_match_table
= mcp4728_of_match
,
590 .pm
= pm_sleep_ptr(&mcp4728_pm_ops
),
592 .probe
= mcp4728_probe
,
593 .id_table
= mcp4728_id
,
595 module_i2c_driver(mcp4728_driver
);
597 MODULE_AUTHOR("Andrea Collamati <andrea.collamati@gmail.com>");
598 MODULE_DESCRIPTION("MCP4728 12-bit DAC");
599 MODULE_LICENSE("GPL");