#include <linux/iio/iio.h>
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/regulator/consumer.h>
single_8bit, single_10bit, single_12bit,
quad_8bit, quad_10bit, quad_12bit
static const struct dac5571_spec dac5571_spec[] = {
[single_8bit] = {.num_channels = 1, .resolution = 8},
[single_10bit] = {.num_channels = 1, .resolution = 10},
[single_12bit] = {.num_channels = 1, .resolution = 12},
[quad_8bit] = {.num_channels = 4, .resolution = 8},
[quad_10bit] = {.num_channels = 4, .resolution = 10},
[quad_12bit] = {.num_channels = 4, .resolution = 12},
struct i2c_client *client;
struct dac5571_spec const *spec;
int (*dac5571_cmd)(struct dac5571_data *data, int channel, u16 val);
int (*dac5571_pwrdwn)(struct dac5571_data *data, int channel, u8 pwrdwn);
u8 buf[3] ____cacheline_aligned;
#define DAC5571_POWERDOWN(mode) ((mode) + 1)
#define DAC5571_POWERDOWN_FLAG BIT(0)
#define DAC5571_CHANNEL_SELECT 1
#define DAC5571_LOADMODE_DIRECT BIT(4)
#define DAC5571_SINGLE_PWRDWN_BITS 4
#define DAC5571_QUAD_PWRDWN_BITS 6
static int dac5571_cmd_single(struct dac5571_data *data, int channel, u16 val)
shift = 12 - data->spec->resolution;
data->buf[1] = val << shift;
data->buf[0] = val >> (8 - shift);
if (i2c_master_send(data->client, data->buf, 2) != 2)
static int dac5571_cmd_quad(struct dac5571_data *data, int channel, u16 val)
shift = 16 - data->spec->resolution;
data->buf[2] = val << shift;
data->buf[1] = (val >> (8 - shift));
data->buf[0] = (channel << DAC5571_CHANNEL_SELECT) |
if (i2c_master_send(data->client, data->buf, 3) != 3)