Lines Matching +full:4 +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
38 [quad_8bit] = {.num_channels = 4, .resolution = 8},
39 [quad_10bit] = {.num_channels = 4, .resolution = 10},
40 [quad_12bit] = {.num_channels = 4, .resolution = 12},
48 u16 val[4];
49 bool powerdown[4];
50 u8 powerdown_mode[4];
52 int (*dac5571_cmd)(struct dac5571_data *data, int channel, u16 val);
53 int (*dac5571_pwrdwn)(struct dac5571_data *data, int channel, u8 pwrdwn);
60 #define DAC5571_LOADMODE_DIRECT BIT(4)
61 #define DAC5571_SINGLE_PWRDWN_BITS 4
64 static int dac5571_cmd_single(struct dac5571_data *data, int channel, u16 val) in dac5571_cmd_single() argument
68 shift = 12 - data->spec->resolution; in dac5571_cmd_single()
69 data->buf[1] = val << shift; in dac5571_cmd_single()
70 data->buf[0] = val >> (8 - shift); in dac5571_cmd_single()
72 if (i2c_master_send(data->client, data->buf, 2) != 2) in dac5571_cmd_single()
73 return -EIO; in dac5571_cmd_single()
78 static int dac5571_cmd_quad(struct dac5571_data *data, int channel, u16 val) in dac5571_cmd_quad() argument
82 shift = 16 - data->spec->resolution; in dac5571_cmd_quad()
83 data->buf[2] = val << shift; in dac5571_cmd_quad()
84 data->buf[1] = (val >> (8 - shift)); in dac5571_cmd_quad()
85 data->buf[0] = (channel << DAC5571_CHANNEL_SELECT) | in dac5571_cmd_quad()
88 if (i2c_master_send(data->client, data->buf, 3) != 3) in dac5571_cmd_quad()
89 return -EIO; in dac5571_cmd_quad()
94 static int dac5571_pwrdwn_single(struct dac5571_data *data, int channel, u8 pwrdwn) in dac5571_pwrdwn_single() argument
96 data->buf[1] = 0; in dac5571_pwrdwn_single()
97 data->buf[0] = pwrdwn << DAC5571_SINGLE_PWRDWN_BITS; in dac5571_pwrdwn_single()
99 if (i2c_master_send(data->client, data->buf, 2) != 2) in dac5571_pwrdwn_single()
100 return -EIO; in dac5571_pwrdwn_single()
105 static int dac5571_pwrdwn_quad(struct dac5571_data *data, int channel, u8 pwrdwn) in dac5571_pwrdwn_quad() argument
107 data->buf[2] = 0; in dac5571_pwrdwn_quad()
108 data->buf[1] = pwrdwn << DAC5571_QUAD_PWRDWN_BITS; in dac5571_pwrdwn_quad()
109 data->buf[0] = (channel << DAC5571_CHANNEL_SELECT) | in dac5571_pwrdwn_quad()
112 if (i2c_master_send(data->client, data->buf, 3) != 3) in dac5571_pwrdwn_quad()
113 return -EIO; in dac5571_pwrdwn_quad()
127 return data->powerdown_mode[chan->channel]; in dac5571_get_powerdown_mode()
137 if (data->powerdown_mode[chan->channel] == mode) in dac5571_set_powerdown_mode()
140 mutex_lock(&data->lock); in dac5571_set_powerdown_mode()
141 if (data->powerdown[chan->channel]) { in dac5571_set_powerdown_mode()
142 ret = data->dac5571_pwrdwn(data, chan->channel, in dac5571_set_powerdown_mode()
147 data->powerdown_mode[chan->channel] = mode; in dac5571_set_powerdown_mode()
150 mutex_unlock(&data->lock); in dac5571_set_powerdown_mode()
169 return sprintf(buf, "%d\n", data->powerdown[chan->channel]); in dac5571_read_powerdown()
185 if (data->powerdown[chan->channel] == powerdown) in dac5571_write_powerdown()
188 mutex_lock(&data->lock); in dac5571_write_powerdown()
190 ret = data->dac5571_pwrdwn(data, chan->channel, in dac5571_write_powerdown()
191 DAC5571_POWERDOWN(data->powerdown_mode[chan->channel])); in dac5571_write_powerdown()
193 ret = data->dac5571_cmd(data, chan->channel, in dac5571_write_powerdown()
194 data->val[chan->channel]); in dac5571_write_powerdown()
198 data->powerdown[chan->channel] = powerdown; in dac5571_write_powerdown()
201 mutex_unlock(&data->lock); in dac5571_write_powerdown()
221 .channel = (chan), \
247 *val = data->val[chan->channel]; in dac5571_read_raw()
251 ret = regulator_get_voltage(data->vref); in dac5571_read_raw()
256 *val2 = data->spec->resolution; in dac5571_read_raw()
260 return -EINVAL; in dac5571_read_raw()
273 if (data->val[chan->channel] == val) in dac5571_write_raw()
276 if (val >= (1 << data->spec->resolution) || val < 0) in dac5571_write_raw()
277 return -EINVAL; in dac5571_write_raw()
279 if (data->powerdown[chan->channel]) in dac5571_write_raw()
280 return -EBUSY; in dac5571_write_raw()
282 mutex_lock(&data->lock); in dac5571_write_raw()
283 ret = data->dac5571_cmd(data, chan->channel, val); in dac5571_write_raw()
285 data->val[chan->channel] = val; in dac5571_write_raw()
286 mutex_unlock(&data->lock); in dac5571_write_raw()
290 return -EINVAL; in dac5571_write_raw()
310 struct device *dev = &client->dev; in dac5571_probe()
318 return -ENOMEM; in dac5571_probe()
322 data->client = client; in dac5571_probe()
324 indio_dev->info = &dac5571_info; in dac5571_probe()
325 indio_dev->name = id->name; in dac5571_probe()
326 indio_dev->modes = INDIO_DIRECT_MODE; in dac5571_probe()
327 indio_dev->channels = dac5571_channels; in dac5571_probe()
329 spec = &dac5571_spec[id->driver_data]; in dac5571_probe()
330 indio_dev->num_channels = spec->num_channels; in dac5571_probe()
331 data->spec = spec; in dac5571_probe()
333 data->vref = devm_regulator_get(dev, "vref"); in dac5571_probe()
334 if (IS_ERR(data->vref)) in dac5571_probe()
335 return PTR_ERR(data->vref); in dac5571_probe()
337 ret = regulator_enable(data->vref); in dac5571_probe()
341 mutex_init(&data->lock); in dac5571_probe()
343 switch (spec->num_channels) { in dac5571_probe()
345 data->dac5571_cmd = dac5571_cmd_single; in dac5571_probe()
346 data->dac5571_pwrdwn = dac5571_pwrdwn_single; in dac5571_probe()
348 case 4: in dac5571_probe()
349 data->dac5571_cmd = dac5571_cmd_quad; in dac5571_probe()
350 data->dac5571_pwrdwn = dac5571_pwrdwn_quad; in dac5571_probe()
356 for (i = 0; i < spec->num_channels; i++) { in dac5571_probe()
357 ret = data->dac5571_cmd(data, i, 0); in dac5571_probe()
359 dev_err(dev, "failed to initialize channel %d to 0\n", i); in dac5571_probe()
371 regulator_disable(data->vref); in dac5571_probe()
381 regulator_disable(data->vref); in dac5571_remove()
416 .name = "ti-dac5571",
426 MODULE_DESCRIPTION("Texas Instruments 8/10/12-bit 1/4-channel DAC driver");