Skip to content

Commit

Permalink
Merge pull request torvalds#550 from analogdevicesinc/m2k_add_dac_syn…
Browse files Browse the repository at this point in the history
…c_start

iio: frequency: m2k-dac: Add attribute to control dma_sync_start
  • Loading branch information
mhennerich authored Aug 30, 2019
2 parents 930289b + e1ad405 commit 8c1ff1a
Showing 1 changed file with 69 additions and 1 deletion.
70 changes: 69 additions & 1 deletion drivers/iio/frequency/m2k-dac.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@
#define M2K_DAC_REG_CORRECTION_ENABLE 0x54
#define M2K_DAC_REG_CORRECTION_COEFFICIENT(x) (0x58 + (x) * 4)

#define M2K_DAC_DMA_SYNC_BIT BIT(0)
#define M2K_DAC_SYNC_START_BIT BIT(1)


struct m2k_dac {
void __iomem *regs;
Expand Down Expand Up @@ -241,6 +244,23 @@ static int m2k_dac_reg_access(struct iio_dev *indio_dev, unsigned int reg,
return 0;
}

static int m2k_dac_reg_update(struct iio_dev *indio_dev, unsigned int reg,
unsigned int writeval, const unsigned int mask)
{
struct m2k_dac_ch *ch = iio_priv(indio_dev);
struct m2k_dac *m2k_dac = ch->dac;
unsigned int regval;

reg &= 0xffff;

regval = ioread32(m2k_dac->regs + reg);
regval &= ~mask;
writeval &= mask;
iowrite32(writeval | regval, m2k_dac->regs + reg);

return 0;
}

static ssize_t m2k_dac_read_dma_sync(struct device *dev,
struct device_attribute *attr, char *buf)
{
Expand All @@ -257,27 +277,63 @@ static ssize_t m2k_dac_read_dma_sync(struct device *dev,

static ssize_t m2k_dac_write_dma_sync(struct device *dev,
struct device_attribute *attr, const char *buf, size_t len)
{
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
bool val;
int ret;

ret = strtobool(buf, &val);
if (ret < 0)
return ret;

m2k_dac_reg_update(indio_dev, M2K_DAC_REG_FLAGS, val,
M2K_DAC_DMA_SYNC_BIT);

return len;
}

static ssize_t m2k_dac_read_dma_sync_start(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
struct m2k_dac_ch *ch = iio_priv(indio_dev);
struct m2k_dac *m2k_dac = ch->dac;
unsigned int val;

val = ioread32(m2k_dac->regs + M2K_DAC_REG_FLAGS);
val &= M2K_DAC_SYNC_START_BIT;

return sprintf(buf, "%d\n", val >> 1);
}

static ssize_t m2k_dac_write_dma_sync_start(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t len)
{
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
bool val;
int ret;

ret = strtobool(buf, &val);
if (ret < 0)
return ret;

iowrite32(val, m2k_dac->regs + M2K_DAC_REG_FLAGS);
m2k_dac_reg_update(indio_dev, M2K_DAC_REG_FLAGS,
val << 1,
M2K_DAC_SYNC_START_BIT);

return len;
}

static IIO_DEVICE_ATTR(dma_sync, 0664,
m2k_dac_read_dma_sync, m2k_dac_write_dma_sync, 0);

static IIO_DEVICE_ATTR(dma_sync_start, 0664,
m2k_dac_read_dma_sync_start, m2k_dac_write_dma_sync_start, 0);

static struct attribute *m2k_dac_attributes[] = {
&iio_dev_attr_dma_sync.dev_attr.attr,
&iio_dev_attr_dma_sync_start.dev_attr.attr,
NULL
};

Expand Down Expand Up @@ -328,6 +384,12 @@ static int m2k_dac_buffer_preenable(struct iio_dev *indio_dev)
struct m2k_dac_ch *ch = iio_priv(indio_dev);
struct m2k_dac *m2k_dac = ch->dac;

if (iio_buffer_enabled(m2k_dac->ch_indio_dev[0]) !=
iio_buffer_enabled(m2k_dac->ch_indio_dev[1])) {
m2k_dac_reg_update(indio_dev, M2K_DAC_REG_FLAGS, 0,
M2K_DAC_SYNC_START_BIT);
}

cf_axi_dds_datasel(m2k_dac->dds, ch->num, DATA_SEL_DMA);
return 0;
}
Expand All @@ -337,6 +399,12 @@ static int m2k_dac_buffer_postdisable(struct iio_dev *indio_dev)
struct m2k_dac_ch *ch = iio_priv(indio_dev);
struct m2k_dac *m2k_dac = ch->dac;

if (iio_buffer_enabled(m2k_dac->ch_indio_dev[0]) !=
iio_buffer_enabled(m2k_dac->ch_indio_dev[1])) {
m2k_dac_reg_update(indio_dev, M2K_DAC_REG_FLAGS, 0,
M2K_DAC_SYNC_START_BIT);
}

cf_axi_dds_datasel(m2k_dac->dds, ch->num, DATA_SEL_DDS);
return 0;
}
Expand Down

0 comments on commit 8c1ff1a

Please sign in to comment.