root/drivers/iio/dac/ad5446.h
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _LINUX_AD5446_H
#define _LINUX_AD5446_H

#include <linux/bits.h>
#include <linux/compiler.h>
#include <linux/iio/iio.h>
#include <linux/mutex.h>
#include <linux/types.h>

struct device;

extern const struct iio_chan_spec_ext_info ad5446_ext_info_powerdown[];

#define _AD5446_CHANNEL(bits, storage, _shift, ext) { \
        .type = IIO_VOLTAGE, \
        .indexed = 1, \
        .output = 1, \
        .channel = 0, \
        .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
        .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
        .scan_type = { \
                .sign = 'u', \
                .realbits = (bits), \
                .storagebits = (storage), \
                .shift = (_shift), \
                }, \
        .ext_info = (ext), \
}

#define AD5446_CHANNEL(bits, storage, shift) \
        _AD5446_CHANNEL(bits, storage, shift, NULL)

#define AD5446_CHANNEL_POWERDOWN(bits, storage, shift) \
        _AD5446_CHANNEL(bits, storage, shift, ad5446_ext_info_powerdown)

/**
 * struct ad5446_state - driver instance specific data
 * @dev:                this device
 * @chip_info:          chip model specific constants, available modes etc
 * @vref_mv:            actual reference voltage used
 * @cached_val:         store/retrieve values during power down
 * @pwr_down_mode:      power down mode (1k, 100k or tristate)
 * @pwr_down:           true if the device is in power down
 * @lock:               lock to protect the data buffer during write ops
 */
struct ad5446_state {
        struct device *dev;
        const struct ad5446_chip_info *chip_info;
        unsigned short vref_mv;
        unsigned int cached_val;
        unsigned int pwr_down_mode;
        unsigned int pwr_down;
        /* mutex to protect device shared data */
        struct mutex lock;
        union {
                __be16 d16;
                u8 d24[3];
        } __aligned(IIO_DMA_MINALIGN);
};

/**
 * struct ad5446_chip_info - chip specific information
 * @channel:            channel spec for the DAC
 * @int_vref_mv:        AD5620/40/60: the internal reference voltage
 * @write:              chip specific helper function to write to the register
 */
struct ad5446_chip_info {
        struct iio_chan_spec channel;
        u16 int_vref_mv;
        int (*write)(struct ad5446_state *st, unsigned int val);
};

int ad5446_probe(struct device *dev, const char *name,
                 const struct ad5446_chip_info *chip_info);

#endif