Lines Matching +full:conf +full:- +full:pd
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
52 outbuf[0] = (data->powerdown_mode + 1) << 4; in mcp4725_suspend()
54 data->powerdown = true; in mcp4725_suspend()
56 ret = i2c_master_send(data->client, outbuf, 2); in mcp4725_suspend()
60 return -EIO; in mcp4725_suspend()
72 outbuf[0] = (data->dac_value >> 8) & 0xf; in mcp4725_resume()
73 outbuf[1] = data->dac_value & 0xff; in mcp4725_resume()
74 data->powerdown = false; in mcp4725_resume()
76 ret = i2c_master_send(data->client, outbuf, 2); in mcp4725_resume()
80 return -EIO; in mcp4725_resume()
104 inoutbuf[0] |= data->ref_mode << 3; in mcp4725_store_eeprom()
105 inoutbuf[0] |= data->powerdown ? ((data->powerdown_mode + 1) << 1) : 0; in mcp4725_store_eeprom()
106 inoutbuf[1] = data->dac_value >> 4; in mcp4725_store_eeprom()
107 inoutbuf[2] = (data->dac_value & 0xf) << 4; in mcp4725_store_eeprom()
109 ret = i2c_master_send(data->client, inoutbuf, 3); in mcp4725_store_eeprom()
113 return -EIO; in mcp4725_store_eeprom()
116 while (tries--) { in mcp4725_store_eeprom()
118 ret = i2c_master_recv(data->client, inoutbuf, 3); in mcp4725_store_eeprom()
122 return -EIO; in mcp4725_store_eeprom()
129 dev_err(&data->client->dev, in mcp4725_store_eeprom()
131 return -EIO; in mcp4725_store_eeprom()
165 return data->powerdown_mode; in mcp4725_get_powerdown_mode()
173 data->powerdown_mode = mode; in mcp4725_set_powerdown_mode()
183 return sysfs_emit(buf, "%d\n", data->powerdown); in mcp4725_read_powerdown()
199 ret = mcp4725_suspend(&data->client->dev); in mcp4725_write_powerdown()
201 ret = mcp4725_resume(&data->client->dev); in mcp4725_write_powerdown()
284 return -EINVAL; in mcp4725_set_value()
289 ret = i2c_master_send(data->client, outbuf, 2); in mcp4725_set_value()
293 return -EIO; in mcp4725_set_value()
305 outbuf[0] |= data->ref_mode << 3; in mcp4726_set_cfg()
306 if (data->powerdown) in mcp4726_set_cfg()
307 outbuf[0] |= data->powerdown << 1; in mcp4726_set_cfg()
308 outbuf[1] = data->dac_value >> 4; in mcp4726_set_cfg()
309 outbuf[2] = (data->dac_value & 0xf) << 4; in mcp4726_set_cfg()
311 ret = i2c_master_send(data->client, outbuf, 3); in mcp4726_set_cfg()
315 return -EIO; in mcp4726_set_cfg()
329 *val = data->dac_value; in mcp4725_read_raw()
332 if (data->ref_mode == MCP472X_REF_VDD) in mcp4725_read_raw()
333 ret = regulator_get_voltage(data->vdd_reg); in mcp4725_read_raw()
335 ret = regulator_get_voltage(data->vref_reg); in mcp4725_read_raw()
344 return -EINVAL; in mcp4725_read_raw()
357 data->dac_value = val; in mcp4725_write_raw()
360 ret = -EINVAL; in mcp4725_write_raw()
376 /* check if is the vref-supply defined */ in mcp4725_probe_dt()
377 pdata->use_vref = device_property_read_bool(dev, "vref-supply"); in mcp4725_probe_dt()
378 pdata->vref_buffered = in mcp4725_probe_dt()
379 device_property_read_bool(dev, "microchip,vref-buffered"); in mcp4725_probe_dt()
391 u8 pd; in mcp4725_probe() local
395 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in mcp4725_probe()
397 return -ENOMEM; in mcp4725_probe()
400 data->client = client; in mcp4725_probe()
401 if (dev_fwnode(&client->dev)) in mcp4725_probe()
402 data->id = (uintptr_t)device_get_match_data(&client->dev); in mcp4725_probe()
404 data->id = id->driver_data; in mcp4725_probe()
405 pdata = dev_get_platdata(&client->dev); in mcp4725_probe()
408 err = mcp4725_probe_dt(&client->dev, &pdata_dt); in mcp4725_probe()
410 dev_err(&client->dev, in mcp4725_probe()
417 if (data->id == MCP4725 && pdata->use_vref) { in mcp4725_probe()
418 dev_err(&client->dev, in mcp4725_probe()
420 return -EINVAL; in mcp4725_probe()
423 if (!pdata->use_vref && pdata->vref_buffered) { in mcp4725_probe()
424 dev_err(&client->dev, in mcp4725_probe()
426 return -EINVAL; in mcp4725_probe()
429 if (!pdata->use_vref) in mcp4725_probe()
430 data->ref_mode = MCP472X_REF_VDD; in mcp4725_probe()
432 data->ref_mode = pdata->vref_buffered ? in mcp4725_probe()
436 data->vdd_reg = devm_regulator_get(&client->dev, "vdd"); in mcp4725_probe()
437 if (IS_ERR(data->vdd_reg)) in mcp4725_probe()
438 return PTR_ERR(data->vdd_reg); in mcp4725_probe()
440 err = regulator_enable(data->vdd_reg); in mcp4725_probe()
444 if (pdata->use_vref) { in mcp4725_probe()
445 data->vref_reg = devm_regulator_get(&client->dev, "vref"); in mcp4725_probe()
446 if (IS_ERR(data->vref_reg)) { in mcp4725_probe()
447 err = PTR_ERR(data->vref_reg); in mcp4725_probe()
451 err = regulator_enable(data->vref_reg); in mcp4725_probe()
456 indio_dev->name = id->name; in mcp4725_probe()
457 indio_dev->info = &mcp4725_info; in mcp4725_probe()
458 indio_dev->channels = &mcp472x_channel[id->driver_data]; in mcp4725_probe()
459 indio_dev->num_channels = 1; in mcp4725_probe()
460 indio_dev->modes = INDIO_DIRECT_MODE; in mcp4725_probe()
463 err = i2c_master_recv(client, inbuf, data->id == MCP4725 ? 3 : 4); in mcp4725_probe()
466 dev_err(&client->dev, "failed to read DAC value"); in mcp4725_probe()
469 pd = (inbuf[0] >> 1) & 0x3; in mcp4725_probe()
470 data->powerdown = pd > 0; in mcp4725_probe()
471 data->powerdown_mode = pd ? pd - 1 : 2; /* largest resistor to gnd */ in mcp4725_probe()
472 data->dac_value = (inbuf[1] << 4) | (inbuf[2] >> 4); in mcp4725_probe()
473 if (data->id == MCP4726) in mcp4725_probe()
476 if (data->id == MCP4726 && ref != data->ref_mode) { in mcp4725_probe()
477 dev_info(&client->dev, in mcp4725_probe()
478 "voltage reference mode differs (conf: %u, eeprom: %u), setting %u", in mcp4725_probe()
479 data->ref_mode, ref, data->ref_mode); in mcp4725_probe()
492 if (data->vref_reg) in mcp4725_probe()
493 regulator_disable(data->vref_reg); in mcp4725_probe()
496 regulator_disable(data->vdd_reg); in mcp4725_probe()
508 if (data->vref_reg) in mcp4725_remove()
509 regulator_disable(data->vref_reg); in mcp4725_remove()
510 regulator_disable(data->vdd_reg); in mcp4725_remove()
546 MODULE_DESCRIPTION("MCP4725/6 12-bit DAC");