Lines Matching +full:dac +full:- +full:mode +full:- +full:mask

1 // SPDX-License-Identifier: GPL-2.0-only
3 * mcp4725.c - Support for Microchip MCP4725/6
9 * driver for the Microchip I2C 12-bit digital-to-analog converter (DAC)
10 * (7-bit I2C slave address 0x60, the three LSBs can be configured in
25 #include <linux/iio/dac/mcp4725.h>
55 outbuf[0] = (data->powerdown_mode + 1) << 4; in mcp4725_suspend()
57 data->powerdown = true; in mcp4725_suspend()
59 ret = i2c_master_send(data->client, outbuf, 2); in mcp4725_suspend()
63 return -EIO; in mcp4725_suspend()
74 /* restore previous DAC value */ in mcp4725_resume()
75 outbuf[0] = (data->dac_value >> 8) & 0xf; in mcp4725_resume()
76 outbuf[1] = data->dac_value & 0xff; in mcp4725_resume()
77 data->powerdown = false; in mcp4725_resume()
79 ret = i2c_master_send(data->client, outbuf, 2); in mcp4725_resume()
83 return -EIO; in mcp4725_resume()
107 inoutbuf[0] |= data->ref_mode << 3; in mcp4725_store_eeprom()
108 inoutbuf[0] |= data->powerdown ? ((data->powerdown_mode + 1) << 1) : 0; in mcp4725_store_eeprom()
109 inoutbuf[1] = data->dac_value >> 4; in mcp4725_store_eeprom()
110 inoutbuf[2] = (data->dac_value & 0xf) << 4; in mcp4725_store_eeprom()
112 ret = i2c_master_send(data->client, inoutbuf, 3); in mcp4725_store_eeprom()
116 return -EIO; in mcp4725_store_eeprom()
119 while (tries--) { in mcp4725_store_eeprom()
121 ret = i2c_master_recv(data->client, inoutbuf, 3); in mcp4725_store_eeprom()
125 return -EIO; in mcp4725_store_eeprom()
132 dev_err(&data->client->dev, in mcp4725_store_eeprom()
134 return -EIO; in mcp4725_store_eeprom()
168 return data->powerdown_mode; in mcp4725_get_powerdown_mode()
172 const struct iio_chan_spec *chan, unsigned mode) in mcp4725_set_powerdown_mode() argument
176 data->powerdown_mode = mode; in mcp4725_set_powerdown_mode()
186 return sysfs_emit(buf, "%d\n", data->powerdown); in mcp4725_read_powerdown()
202 ret = mcp4725_suspend(&data->client->dev); in mcp4725_write_powerdown()
204 ret = mcp4725_resume(&data->client->dev); in mcp4725_write_powerdown()
287 return -EINVAL; in mcp4725_set_value()
292 ret = i2c_master_send(data->client, outbuf, 2); in mcp4725_set_value()
296 return -EIO; in mcp4725_set_value()
308 outbuf[0] |= data->ref_mode << 3; in mcp4726_set_cfg()
309 if (data->powerdown) in mcp4726_set_cfg()
310 outbuf[0] |= data->powerdown << 1; in mcp4726_set_cfg()
311 outbuf[1] = data->dac_value >> 4; in mcp4726_set_cfg()
312 outbuf[2] = (data->dac_value & 0xf) << 4; in mcp4726_set_cfg()
314 ret = i2c_master_send(data->client, outbuf, 3); in mcp4726_set_cfg()
318 return -EIO; in mcp4726_set_cfg()
325 int *val, int *val2, long mask) in mcp4725_read_raw() argument
330 switch (mask) { in mcp4725_read_raw()
332 *val = data->dac_value; in mcp4725_read_raw()
335 if (data->ref_mode == MCP472X_REF_VDD) in mcp4725_read_raw()
336 ret = regulator_get_voltage(data->vdd_reg); in mcp4725_read_raw()
338 ret = regulator_get_voltage(data->vref_reg); in mcp4725_read_raw()
347 return -EINVAL; in mcp4725_read_raw()
352 int val, int val2, long mask) in mcp4725_write_raw() argument
357 switch (mask) { in mcp4725_write_raw()
360 data->dac_value = val; in mcp4725_write_raw()
363 ret = -EINVAL; in mcp4725_write_raw()
379 /* check if is the vref-supply defined */ in mcp4725_probe_dt()
380 pdata->use_vref = device_property_present(dev, "vref-supply"); in mcp4725_probe_dt()
381 pdata->vref_buffered = in mcp4725_probe_dt()
382 device_property_read_bool(dev, "microchip,vref-buffered"); in mcp4725_probe_dt()
399 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in mcp4725_probe()
401 return -ENOMEM; in mcp4725_probe()
404 data->client = client; in mcp4725_probe()
406 pdata = dev_get_platdata(&client->dev); in mcp4725_probe()
409 err = mcp4725_probe_dt(&client->dev, &pdata_dt); in mcp4725_probe()
411 dev_err(&client->dev, in mcp4725_probe()
418 if (info->use_ext_ref_voltage && pdata->use_vref) { in mcp4725_probe()
419 dev_err(&client->dev, in mcp4725_probe()
421 return -EINVAL; in mcp4725_probe()
424 if (!pdata->use_vref && pdata->vref_buffered) { in mcp4725_probe()
425 dev_err(&client->dev, in mcp4725_probe()
427 return -EINVAL; in mcp4725_probe()
430 if (!pdata->use_vref) in mcp4725_probe()
431 data->ref_mode = MCP472X_REF_VDD; in mcp4725_probe()
433 data->ref_mode = pdata->vref_buffered ? in mcp4725_probe()
437 data->vdd_reg = devm_regulator_get(&client->dev, "vdd"); in mcp4725_probe()
438 if (IS_ERR(data->vdd_reg)) in mcp4725_probe()
439 return PTR_ERR(data->vdd_reg); in mcp4725_probe()
441 err = regulator_enable(data->vdd_reg); in mcp4725_probe()
445 if (pdata->use_vref) { in mcp4725_probe()
446 data->vref_reg = devm_regulator_get(&client->dev, "vref"); in mcp4725_probe()
447 if (IS_ERR(data->vref_reg)) { in mcp4725_probe()
448 err = PTR_ERR(data->vref_reg); in mcp4725_probe()
452 err = regulator_enable(data->vref_reg); in mcp4725_probe()
457 indio_dev->name = id->name; in mcp4725_probe()
458 indio_dev->info = &mcp4725_info; in mcp4725_probe()
459 indio_dev->channels = info->chan_spec; in mcp4725_probe()
460 indio_dev->num_channels = 1; in mcp4725_probe()
461 indio_dev->modes = INDIO_DIRECT_MODE; in mcp4725_probe()
463 /* read current DAC value and settings */ in mcp4725_probe()
464 err = i2c_master_recv(client, inbuf, info->dac_reg_offset); in mcp4725_probe()
467 dev_err(&client->dev, "failed to read DAC value"); in mcp4725_probe()
471 data->powerdown = pd > 0; in mcp4725_probe()
472 data->powerdown_mode = pd ? pd - 1 : 2; /* largest resistor to gnd */ in mcp4725_probe()
473 data->dac_value = (inbuf[1] << 4) | (inbuf[2] >> 4); in mcp4725_probe()
474 if (!info->use_ext_ref_voltage) in mcp4725_probe()
477 if (!info->use_ext_ref_voltage && ref != data->ref_mode) { in mcp4725_probe()
478 dev_info(&client->dev, in mcp4725_probe()
479 "voltage reference mode differs (conf: %u, eeprom: %u), setting %u", in mcp4725_probe()
480 data->ref_mode, ref, data->ref_mode); in mcp4725_probe()
493 if (data->vref_reg) in mcp4725_probe()
494 regulator_disable(data->vref_reg); in mcp4725_probe()
497 regulator_disable(data->vdd_reg); in mcp4725_probe()
509 if (data->vref_reg) in mcp4725_remove()
510 regulator_disable(data->vref_reg); in mcp4725_remove()
511 regulator_disable(data->vdd_reg); in mcp4725_remove()
558 MODULE_DESCRIPTION("MCP4725/6 12-bit DAC");