• Home
  • Raw
  • Download

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
54 int (*dac5571_cmd)(struct dac5571_data *data, int channel, u16 val);
55 int (*dac5571_pwrdwn)(struct dac5571_data *data, int channel, u8 pwrdwn);
66 static int dac5571_cmd_single(struct dac5571_data *data, int channel, u16 val) in dac5571_cmd_single() argument
70 shift = 12 - data->spec->resolution; in dac5571_cmd_single()
71 data->buf[1] = val << shift; in dac5571_cmd_single()
72 data->buf[0] = val >> (8 - shift); in dac5571_cmd_single()
74 if (i2c_master_send(data->client, data->buf, 2) != 2) in dac5571_cmd_single()
75 return -EIO; in dac5571_cmd_single()
80 static int dac5571_cmd_quad(struct dac5571_data *data, int channel, u16 val) in dac5571_cmd_quad() argument
84 shift = 16 - data->spec->resolution; in dac5571_cmd_quad()
85 data->buf[2] = val << shift; in dac5571_cmd_quad()
86 data->buf[1] = (val >> (8 - shift)); in dac5571_cmd_quad()
87 data->buf[0] = (channel << DAC5571_CHANNEL_SELECT) | in dac5571_cmd_quad()
90 if (i2c_master_send(data->client, data->buf, 3) != 3) in dac5571_cmd_quad()
91 return -EIO; in dac5571_cmd_quad()
96 static int dac5571_pwrdwn_single(struct dac5571_data *data, int channel, u8 pwrdwn) in dac5571_pwrdwn_single() argument
98 data->buf[1] = 0; in dac5571_pwrdwn_single()
99 data->buf[0] = pwrdwn << DAC5571_SINGLE_PWRDWN_BITS; in dac5571_pwrdwn_single()
101 if (i2c_master_send(data->client, data->buf, 2) != 2) in dac5571_pwrdwn_single()
102 return -EIO; in dac5571_pwrdwn_single()
107 static int dac5571_pwrdwn_quad(struct dac5571_data *data, int channel, u8 pwrdwn) in dac5571_pwrdwn_quad() argument
109 data->buf[2] = 0; in dac5571_pwrdwn_quad()
110 data->buf[1] = pwrdwn << DAC5571_QUAD_PWRDWN_BITS; in dac5571_pwrdwn_quad()
111 data->buf[0] = (channel << DAC5571_CHANNEL_SELECT) | in dac5571_pwrdwn_quad()
114 if (i2c_master_send(data->client, data->buf, 3) != 3) in dac5571_pwrdwn_quad()
115 return -EIO; in dac5571_pwrdwn_quad()
127 struct dac5571_data *data = iio_priv(indio_dev); in dac5571_get_powerdown_mode() local
129 return data->powerdown_mode[chan->channel]; in dac5571_get_powerdown_mode()
136 struct dac5571_data *data = iio_priv(indio_dev); in dac5571_set_powerdown_mode() local
139 if (data->powerdown_mode[chan->channel] == mode) in dac5571_set_powerdown_mode()
142 mutex_lock(&data->lock); in dac5571_set_powerdown_mode()
143 if (data->powerdown[chan->channel]) { in dac5571_set_powerdown_mode()
144 ret = data->dac5571_pwrdwn(data, chan->channel, in dac5571_set_powerdown_mode()
149 data->powerdown_mode[chan->channel] = mode; in dac5571_set_powerdown_mode()
152 mutex_unlock(&data->lock); in dac5571_set_powerdown_mode()
169 struct dac5571_data *data = iio_priv(indio_dev); in dac5571_read_powerdown() local
171 return sysfs_emit(buf, "%d\n", data->powerdown[chan->channel]); in dac5571_read_powerdown()
179 struct dac5571_data *data = iio_priv(indio_dev); in dac5571_write_powerdown() local
187 if (data->powerdown[chan->channel] == powerdown) in dac5571_write_powerdown()
190 mutex_lock(&data->lock); in dac5571_write_powerdown()
192 ret = data->dac5571_pwrdwn(data, chan->channel, in dac5571_write_powerdown()
193 DAC5571_POWERDOWN(data->powerdown_mode[chan->channel])); in dac5571_write_powerdown()
195 ret = data->dac5571_cmd(data, chan->channel, in dac5571_write_powerdown()
196 data->val[chan->channel]); in dac5571_write_powerdown()
200 data->powerdown[chan->channel] = powerdown; in dac5571_write_powerdown()
203 mutex_unlock(&data->lock); in dac5571_write_powerdown()
223 .channel = (chan), \
244 struct dac5571_data *data = iio_priv(indio_dev); in dac5571_read_raw() local
249 *val = data->val[chan->channel]; in dac5571_read_raw()
253 ret = regulator_get_voltage(data->vref); in dac5571_read_raw()
258 *val2 = data->spec->resolution; in dac5571_read_raw()
262 return -EINVAL; in dac5571_read_raw()
270 struct dac5571_data *data = iio_priv(indio_dev); in dac5571_write_raw() local
275 if (data->val[chan->channel] == val) in dac5571_write_raw()
278 if (val >= (1 << data->spec->resolution) || val < 0) in dac5571_write_raw()
279 return -EINVAL; in dac5571_write_raw()
281 if (data->powerdown[chan->channel]) in dac5571_write_raw()
282 return -EBUSY; in dac5571_write_raw()
284 mutex_lock(&data->lock); in dac5571_write_raw()
285 ret = data->dac5571_cmd(data, chan->channel, val); in dac5571_write_raw()
287 data->val[chan->channel] = val; in dac5571_write_raw()
288 mutex_unlock(&data->lock); in dac5571_write_raw()
292 return -EINVAL; in dac5571_write_raw()
312 struct device *dev = &client->dev; in dac5571_probe()
314 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()
335 chip_id = id->driver_data; in dac5571_probe()
339 indio_dev->num_channels = spec->num_channels; in dac5571_probe()
340 data->spec = spec; in dac5571_probe()
342 data->vref = devm_regulator_get(dev, "vref"); in dac5571_probe()
343 if (IS_ERR(data->vref)) in dac5571_probe()
344 return PTR_ERR(data->vref); in dac5571_probe()
346 ret = regulator_enable(data->vref); in dac5571_probe()
350 mutex_init(&data->lock); in dac5571_probe()
352 switch (spec->num_channels) { in dac5571_probe()
354 data->dac5571_cmd = dac5571_cmd_single; in dac5571_probe()
355 data->dac5571_pwrdwn = dac5571_pwrdwn_single; in dac5571_probe()
358 data->dac5571_cmd = dac5571_cmd_quad; in dac5571_probe()
359 data->dac5571_pwrdwn = dac5571_pwrdwn_quad; in dac5571_probe()
362 ret = -EINVAL; in dac5571_probe()
366 for (i = 0; i < spec->num_channels; i++) { in dac5571_probe()
367 ret = data->dac5571_cmd(data, i, 0); in dac5571_probe()
369 dev_err(dev, "failed to initialize channel %d to 0\n", i); in dac5571_probe()
381 regulator_disable(data->vref); in dac5571_probe()
388 struct dac5571_data *data = iio_priv(indio_dev); in dac5571_remove() local
391 regulator_disable(data->vref); in dac5571_remove()
395 {.compatible = "ti,dac5571", .data = (void *)single_8bit},
396 {.compatible = "ti,dac6571", .data = (void *)single_10bit},
397 {.compatible = "ti,dac7571", .data = (void *)single_12bit},
398 {.compatible = "ti,dac5574", .data = (void *)quad_8bit},
399 {.compatible = "ti,dac6574", .data = (void *)quad_10bit},
400 {.compatible = "ti,dac7574", .data = (void *)quad_12bit},
401 {.compatible = "ti,dac5573", .data = (void *)quad_8bit},
402 {.compatible = "ti,dac6573", .data = (void *)quad_10bit},
403 {.compatible = "ti,dac7573", .data = (void *)quad_12bit},
404 {.compatible = "ti,dac121c081", .data = (void *)single_12bit},
426 .name = "ti-dac5571",
436 MODULE_DESCRIPTION("Texas Instruments 8/10/12-bit 1/4-channel DAC driver");