#include "ad5592r-base.h"
#include <linux/bitops.h>
#include <linux/module.h>
#include <linux/spi/spi.h>
#define AD5592R_GPIO_READBACK_EN BIT(10)
#define AD5592R_LDAC_READBACK_EN BIT(6)
static int ad5592r_spi_wnop_r16(struct ad5592r_state *st, __be16 *buf)
struct spi_device *spi = container_of(st->dev, struct spi_device, dev);
struct spi_transfer t = {
.tx_buf = &st->spi_msg_nop,
return spi_sync_transfer(spi, &t, 1);
static int ad5592r_write_dac(struct ad5592r_state *st, unsigned chan, u16 value)
struct spi_device *spi = container_of(st->dev, struct spi_device, dev);
st->spi_msg = cpu_to_be16(BIT(15) | (chan << 12) | value);
return spi_write(spi, &st->spi_msg, sizeof(st->spi_msg));
static int ad5592r_read_adc(struct ad5592r_state *st, unsigned chan, u16 *value)
struct spi_device *spi = container_of(st->dev, struct spi_device, dev);
st->spi_msg = cpu_to_be16((AD5592R_REG_ADC_SEQ << 11) | BIT(chan));
ret = spi_write(spi, &st->spi_msg, sizeof(st->spi_msg));
ret = ad5592r_spi_wnop_r16(st, &st->spi_msg);
ret = ad5592r_spi_wnop_r16(st, &st->spi_msg);