Lines Matching +full:data +full:- +full:channel

1 // SPDX-License-Identifier: GPL-2.0-only
3 * ti-dac5571.c - Texas Instruments 8/10/12-bit 1/4-channel DAC driver
55 int (*dac5571_cmd)(struct dac5571_data *data, int channel, u16 val);
56 int (*dac5571_pwrdwn)(struct dac5571_data *data, int channel, u8 pwrdwn);
67 static int dac5571_cmd_single(struct dac5571_data *data, int channel, u16 val) in dac5571_cmd_single() argument
71 shift = 12 - data->spec->resolution; in dac5571_cmd_single()
72 data->buf[1] = val << shift; in dac5571_cmd_single()
73 data->buf[0] = val >> (8 - shift); in dac5571_cmd_single()
75 if (i2c_master_send(data->client, data->buf, 2) != 2) in dac5571_cmd_single()
76 return -EIO; in dac5571_cmd_single()
81 static int dac5571_cmd_quad(struct dac5571_data *data, int channel, u16 val) in dac5571_cmd_quad() argument
85 shift = 16 - data->spec->resolution; in dac5571_cmd_quad()
86 data->buf[2] = val << shift; in dac5571_cmd_quad()
87 data->buf[1] = (val >> (8 - shift)); in dac5571_cmd_quad()
88 data->buf[0] = (channel << DAC5571_CHANNEL_SELECT) | in dac5571_cmd_quad()
91 if (i2c_master_send(data->client, data->buf, 3) != 3) in dac5571_cmd_quad()
92 return -EIO; in dac5571_cmd_quad()
97 static int dac5571_pwrdwn_single(struct dac5571_data *data, int channel, u8 pwrdwn) in dac5571_pwrdwn_single() argument
99 data->buf[1] = 0; in dac5571_pwrdwn_single()
100 data->buf[0] = pwrdwn << DAC5571_SINGLE_PWRDWN_BITS; in dac5571_pwrdwn_single()
102 if (i2c_master_send(data->client, data->buf, 2) != 2) in dac5571_pwrdwn_single()
103 return -EIO; in dac5571_pwrdwn_single()
108 static int dac5571_pwrdwn_quad(struct dac5571_data *data, int channel, u8 pwrdwn) in dac5571_pwrdwn_quad() argument
110 data->buf[2] = 0; in dac5571_pwrdwn_quad()
111 data->buf[1] = pwrdwn << DAC5571_QUAD_PWRDWN_BITS; in dac5571_pwrdwn_quad()
112 data->buf[0] = (channel << DAC5571_CHANNEL_SELECT) | in dac5571_pwrdwn_quad()
115 if (i2c_master_send(data->client, data->buf, 3) != 3) in dac5571_pwrdwn_quad()
116 return -EIO; in dac5571_pwrdwn_quad()
128 struct dac5571_data *data = iio_priv(indio_dev); in dac5571_get_powerdown_mode() local
130 return data->powerdown_mode[chan->channel]; in dac5571_get_powerdown_mode()
137 struct dac5571_data *data = iio_priv(indio_dev); in dac5571_set_powerdown_mode() local
140 if (data->powerdown_mode[chan->channel] == mode) in dac5571_set_powerdown_mode()
143 mutex_lock(&data->lock); in dac5571_set_powerdown_mode()
144 if (data->powerdown[chan->channel]) { in dac5571_set_powerdown_mode()
145 ret = data->dac5571_pwrdwn(data, chan->channel, in dac5571_set_powerdown_mode()
150 data->powerdown_mode[chan->channel] = mode; in dac5571_set_powerdown_mode()
153 mutex_unlock(&data->lock); in dac5571_set_powerdown_mode()
170 struct dac5571_data *data = iio_priv(indio_dev); in dac5571_read_powerdown() local
172 return sysfs_emit(buf, "%d\n", data->powerdown[chan->channel]); in dac5571_read_powerdown()
180 struct dac5571_data *data = iio_priv(indio_dev); in dac5571_write_powerdown() local
188 if (data->powerdown[chan->channel] == powerdown) in dac5571_write_powerdown()
191 mutex_lock(&data->lock); in dac5571_write_powerdown()
193 ret = data->dac5571_pwrdwn(data, chan->channel, in dac5571_write_powerdown()
194 DAC5571_POWERDOWN(data->powerdown_mode[chan->channel])); in dac5571_write_powerdown()
196 ret = data->dac5571_cmd(data, chan->channel, in dac5571_write_powerdown()
197 data->val[chan->channel]); in dac5571_write_powerdown()
201 data->powerdown[chan->channel] = powerdown; in dac5571_write_powerdown()
204 mutex_unlock(&data->lock); in dac5571_write_powerdown()
224 .channel = (chan), \
245 struct dac5571_data *data = iio_priv(indio_dev); in dac5571_read_raw() local
250 *val = data->val[chan->channel]; in dac5571_read_raw()
254 ret = regulator_get_voltage(data->vref); in dac5571_read_raw()
259 *val2 = data->spec->resolution; in dac5571_read_raw()
263 return -EINVAL; in dac5571_read_raw()
271 struct dac5571_data *data = iio_priv(indio_dev); in dac5571_write_raw() local
276 if (data->val[chan->channel] == val) in dac5571_write_raw()
279 if (val >= (1 << data->spec->resolution) || val < 0) in dac5571_write_raw()
280 return -EINVAL; in dac5571_write_raw()
282 if (data->powerdown[chan->channel]) in dac5571_write_raw()
283 return -EBUSY; in dac5571_write_raw()
285 mutex_lock(&data->lock); in dac5571_write_raw()
286 ret = data->dac5571_cmd(data, chan->channel, val); in dac5571_write_raw()
288 data->val[chan->channel] = val; in dac5571_write_raw()
289 mutex_unlock(&data->lock); in dac5571_write_raw()
293 return -EINVAL; in dac5571_write_raw()
313 struct device *dev = &client->dev; in dac5571_probe()
315 struct dac5571_data *data; in dac5571_probe() local
319 indio_dev = devm_iio_device_alloc(dev, sizeof(*data)); in dac5571_probe()
321 return -ENOMEM; in dac5571_probe()
323 data = iio_priv(indio_dev); in dac5571_probe()
325 data->client = client; in dac5571_probe()
327 indio_dev->info = &dac5571_info; in dac5571_probe()
328 indio_dev->name = id->name; in dac5571_probe()
329 indio_dev->modes = INDIO_DIRECT_MODE; in dac5571_probe()
330 indio_dev->channels = dac5571_channels; in dac5571_probe()
334 indio_dev->num_channels = spec->num_channels; in dac5571_probe()
335 data->spec = spec; in dac5571_probe()
337 data->vref = devm_regulator_get(dev, "vref"); in dac5571_probe()
338 if (IS_ERR(data->vref)) in dac5571_probe()
339 return PTR_ERR(data->vref); in dac5571_probe()
341 ret = regulator_enable(data->vref); in dac5571_probe()
345 mutex_init(&data->lock); in dac5571_probe()
347 switch (spec->num_channels) { in dac5571_probe()
349 data->dac5571_cmd = dac5571_cmd_single; in dac5571_probe()
350 data->dac5571_pwrdwn = dac5571_pwrdwn_single; in dac5571_probe()
353 data->dac5571_cmd = dac5571_cmd_quad; in dac5571_probe()
354 data->dac5571_pwrdwn = dac5571_pwrdwn_quad; in dac5571_probe()
357 ret = -EINVAL; in dac5571_probe()
361 for (i = 0; i < spec->num_channels; i++) { in dac5571_probe()
362 ret = data->dac5571_cmd(data, i, 0); in dac5571_probe()
364 dev_err(dev, "failed to initialize channel %d to 0\n", i); in dac5571_probe()
376 regulator_disable(data->vref); in dac5571_probe()
383 struct dac5571_data *data = iio_priv(indio_dev); in dac5571_remove() local
386 regulator_disable(data->vref); in dac5571_remove()
390 {.compatible = "ti,dac081c081", .data = &dac5571_spec[single_8bit] },
391 {.compatible = "ti,dac121c081", .data = &dac5571_spec[single_12bit] },
392 {.compatible = "ti,dac5571", .data = &dac5571_spec[single_8bit] },
393 {.compatible = "ti,dac6571", .data = &dac5571_spec[single_10bit] },
394 {.compatible = "ti,dac7571", .data = &dac5571_spec[single_12bit] },
395 {.compatible = "ti,dac5574", .data = &dac5571_spec[quad_8bit] },
396 {.compatible = "ti,dac6574", .data = &dac5571_spec[quad_10bit] },
397 {.compatible = "ti,dac7574", .data = &dac5571_spec[quad_12bit] },
398 {.compatible = "ti,dac5573", .data = &dac5571_spec[quad_8bit] },
399 {.compatible = "ti,dac6573", .data = &dac5571_spec[quad_10bit] },
400 {.compatible = "ti,dac7573", .data = &dac5571_spec[quad_12bit] },
423 .name = "ti-dac5571",
433 MODULE_DESCRIPTION("Texas Instruments 8/10/12-bit 1/4-channel DAC driver");