Lines Matching +full:vref +full:- +full:n +full:- +full:supply
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
51 outbuf[0] = (data->powerdown_mode + 1) << 4; in mcp4725_suspend()
53 data->powerdown = true; in mcp4725_suspend()
55 return i2c_master_send(data->client, outbuf, 2); in mcp4725_suspend()
65 outbuf[0] = (data->dac_value >> 8) & 0xf; in mcp4725_resume()
66 outbuf[1] = data->dac_value & 0xff; in mcp4725_resume()
67 data->powerdown = false; in mcp4725_resume()
69 return i2c_master_send(data->client, outbuf, 2); in mcp4725_resume()
91 inoutbuf[0] |= data->ref_mode << 3; in mcp4725_store_eeprom()
92 inoutbuf[0] |= data->powerdown ? ((data->powerdown_mode + 1) << 1) : 0; in mcp4725_store_eeprom()
93 inoutbuf[1] = data->dac_value >> 4; in mcp4725_store_eeprom()
94 inoutbuf[2] = (data->dac_value & 0xf) << 4; in mcp4725_store_eeprom()
96 ret = i2c_master_send(data->client, inoutbuf, 3); in mcp4725_store_eeprom()
100 return -EIO; in mcp4725_store_eeprom()
103 while (tries--) { in mcp4725_store_eeprom()
105 ret = i2c_master_recv(data->client, inoutbuf, 3); in mcp4725_store_eeprom()
109 return -EIO; in mcp4725_store_eeprom()
116 dev_err(&data->client->dev, in mcp4725_store_eeprom()
117 "mcp4725_store_eeprom() failed, incomplete\n"); in mcp4725_store_eeprom()
118 return -EIO; in mcp4725_store_eeprom()
152 return data->powerdown_mode; in mcp4725_get_powerdown_mode()
160 data->powerdown_mode = mode; in mcp4725_set_powerdown_mode()
170 return sprintf(buf, "%d\n", data->powerdown); in mcp4725_read_powerdown()
186 ret = mcp4725_suspend(&data->client->dev); in mcp4725_write_powerdown()
188 ret = mcp4725_resume(&data->client->dev); in mcp4725_write_powerdown()
271 return -EINVAL; in mcp4725_set_value()
276 ret = i2c_master_send(data->client, outbuf, 2); in mcp4725_set_value()
280 return -EIO; in mcp4725_set_value()
292 outbuf[0] |= data->ref_mode << 3; in mcp4726_set_cfg()
293 if (data->powerdown) in mcp4726_set_cfg()
294 outbuf[0] |= data->powerdown << 1; in mcp4726_set_cfg()
295 outbuf[1] = data->dac_value >> 4; in mcp4726_set_cfg()
296 outbuf[2] = (data->dac_value & 0xf) << 4; in mcp4726_set_cfg()
298 ret = i2c_master_send(data->client, outbuf, 3); in mcp4726_set_cfg()
302 return -EIO; in mcp4726_set_cfg()
316 *val = data->dac_value; in mcp4725_read_raw()
319 if (data->ref_mode == MCP472X_REF_VDD) in mcp4725_read_raw()
320 ret = regulator_get_voltage(data->vdd_reg); in mcp4725_read_raw()
322 ret = regulator_get_voltage(data->vref_reg); in mcp4725_read_raw()
331 return -EINVAL; in mcp4725_read_raw()
344 data->dac_value = val; in mcp4725_write_raw()
347 ret = -EINVAL; in mcp4725_write_raw()
363 /* check if is the vref-supply defined */ in mcp4725_probe_dt()
364 pdata->use_vref = device_property_read_bool(dev, "vref-supply"); in mcp4725_probe_dt()
365 pdata->vref_buffered = in mcp4725_probe_dt()
366 device_property_read_bool(dev, "microchip,vref-buffered"); in mcp4725_probe_dt()
382 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in mcp4725_probe()
384 return -ENOMEM; in mcp4725_probe()
387 data->client = client; in mcp4725_probe()
388 if (dev_fwnode(&client->dev)) in mcp4725_probe()
389 data->id = (enum chip_id)device_get_match_data(&client->dev); in mcp4725_probe()
391 data->id = id->driver_data; in mcp4725_probe()
392 pdata = dev_get_platdata(&client->dev); in mcp4725_probe()
395 err = mcp4725_probe_dt(&client->dev, &pdata_dt); in mcp4725_probe()
397 dev_err(&client->dev, in mcp4725_probe()
404 if (data->id == MCP4725 && pdata->use_vref) { in mcp4725_probe()
405 dev_err(&client->dev, in mcp4725_probe()
407 return -EINVAL; in mcp4725_probe()
410 if (!pdata->use_vref && pdata->vref_buffered) { in mcp4725_probe()
411 dev_err(&client->dev, in mcp4725_probe()
413 return -EINVAL; in mcp4725_probe()
416 if (!pdata->use_vref) in mcp4725_probe()
417 data->ref_mode = MCP472X_REF_VDD; in mcp4725_probe()
419 data->ref_mode = pdata->vref_buffered ? in mcp4725_probe()
423 data->vdd_reg = devm_regulator_get(&client->dev, "vdd"); in mcp4725_probe()
424 if (IS_ERR(data->vdd_reg)) in mcp4725_probe()
425 return PTR_ERR(data->vdd_reg); in mcp4725_probe()
427 err = regulator_enable(data->vdd_reg); in mcp4725_probe()
431 if (pdata->use_vref) { in mcp4725_probe()
432 data->vref_reg = devm_regulator_get(&client->dev, "vref"); in mcp4725_probe()
433 if (IS_ERR(data->vref_reg)) { in mcp4725_probe()
434 err = PTR_ERR(data->vref_reg); in mcp4725_probe()
438 err = regulator_enable(data->vref_reg); in mcp4725_probe()
443 indio_dev->name = id->name; in mcp4725_probe()
444 indio_dev->info = &mcp4725_info; in mcp4725_probe()
445 indio_dev->channels = &mcp472x_channel[id->driver_data]; in mcp4725_probe()
446 indio_dev->num_channels = 1; in mcp4725_probe()
447 indio_dev->modes = INDIO_DIRECT_MODE; in mcp4725_probe()
450 err = i2c_master_recv(client, inbuf, data->id == MCP4725 ? 3 : 4); in mcp4725_probe()
453 dev_err(&client->dev, "failed to read DAC value"); in mcp4725_probe()
457 data->powerdown = pd > 0; in mcp4725_probe()
458 data->powerdown_mode = pd ? pd - 1 : 2; /* largest resistor to gnd */ in mcp4725_probe()
459 data->dac_value = (inbuf[1] << 4) | (inbuf[2] >> 4); in mcp4725_probe()
460 if (data->id == MCP4726) in mcp4725_probe()
463 if (data->id == MCP4726 && ref != data->ref_mode) { in mcp4725_probe()
464 dev_info(&client->dev, in mcp4725_probe()
466 data->ref_mode, ref, data->ref_mode); in mcp4725_probe()
479 if (data->vref_reg) in mcp4725_probe()
480 regulator_disable(data->vref_reg); in mcp4725_probe()
483 regulator_disable(data->vdd_reg); in mcp4725_probe()
495 if (data->vref_reg) in mcp4725_remove()
496 regulator_disable(data->vref_reg); in mcp4725_remove()
497 regulator_disable(data->vdd_reg); in mcp4725_remove()
535 MODULE_DESCRIPTION("MCP4725/6 12-bit DAC");