#include "ad5446.h"
 
-static int ad5446_store_sample(struct ad5446_state *st, unsigned val)
+static int ad5446_write(struct ad5446_state *st, unsigned val)
 {
        __be16 data = cpu_to_be16(val);
        return spi_write(st->spi, &data, sizeof(data));
 }
 
-static int ad5660_store_sample(struct ad5446_state *st, unsigned val)
+static int ad5660_write(struct ad5446_state *st, unsigned val)
 {
        uint8_t data[3];
 
-       val |= AD5660_LOAD;
-       data[0] = (val >> 16) & 0xFF;
-       data[1] = (val >> 8) & 0xFF;
-       data[2] = val & 0xFF;
-
-       return spi_write(st->spi, data, sizeof(data));
-}
-
-static int ad5620_store_pwr_down(struct ad5446_state *st, unsigned mode)
-{
-       __be16 data = cpu_to_be16(mode << 14);
-       return spi_write(st->spi, &data, sizeof(data));
-}
-
-static int ad5660_store_pwr_down(struct ad5446_state *st, unsigned mode)
-{
-       unsigned val = mode << 16;
-       uint8_t data[3];
-
        data[0] = (val >> 16) & 0xFF;
        data[1] = (val >> 8) & 0xFF;
        data[2] = val & 0xFF;
                                            const char *buf, size_t len)
 {
        struct ad5446_state *st = iio_priv(indio_dev);
+       unsigned int shift;
+       unsigned int val;
        bool powerdown;
        int ret;
 
        mutex_lock(&indio_dev->mlock);
        st->pwr_down = powerdown;
 
-       if (st->pwr_down)
-               ret = st->chip_info->store_pwr_down(st, st->pwr_down_mode);
-       else
-               ret = st->chip_info->store_sample(st, st->cached_val);
+       if (st->pwr_down) {
+               shift = chan->scan_type.realbits + chan->scan_type.shift;
+               val = st->pwr_down_mode << shift;
+       } else {
+               val = st->cached_val;
+       }
 
+       ret = st->chip_info->write(st, val);
        mutex_unlock(&indio_dev->mlock);
 
        return ret ? ret : len;
 static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
        [ID_AD5444] = {
                .channel = AD5446_CHANNEL(12, 16, 2),
-               .store_sample = ad5446_store_sample,
+               .write = ad5446_write,
        },
        [ID_AD5446] = {
                .channel = AD5446_CHANNEL(14, 16, 0),
-               .store_sample = ad5446_store_sample,
+               .write = ad5446_write,
        },
        [ID_AD5541A] = {
                .channel = AD5446_CHANNEL(16, 16, 0),
-               .store_sample = ad5446_store_sample,
+               .write = ad5446_write,
        },
        [ID_AD5512A] = {
                .channel = AD5446_CHANNEL(12, 16, 4),
-               .store_sample = ad5446_store_sample,
+               .write = ad5446_write,
        },
        [ID_AD5553] = {
                .channel = AD5446_CHANNEL(14, 16, 0),
-               .store_sample = ad5446_store_sample,
+               .write = ad5446_write,
        },
        [ID_AD5601] = {
                .channel = AD5446_CHANNEL_POWERDOWN(8, 16, 6),
-               .store_sample = ad5446_store_sample,
-               .store_pwr_down = ad5620_store_pwr_down,
+               .write = ad5446_write,
        },
        [ID_AD5611] = {
                .channel = AD5446_CHANNEL_POWERDOWN(10, 16, 4),
-               .store_sample = ad5446_store_sample,
-               .store_pwr_down = ad5620_store_pwr_down,
+               .write = ad5446_write,
        },
        [ID_AD5621] = {
                .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
-               .store_sample = ad5446_store_sample,
-               .store_pwr_down = ad5620_store_pwr_down,
+               .write = ad5446_write,
        },
        [ID_AD5620_2500] = {
                .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
                .int_vref_mv = 2500,
-               .store_sample = ad5446_store_sample,
-               .store_pwr_down = ad5620_store_pwr_down,
+               .write = ad5446_write,
        },
        [ID_AD5620_1250] = {
                .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
                .int_vref_mv = 1250,
-               .store_sample = ad5446_store_sample,
-               .store_pwr_down = ad5620_store_pwr_down,
+               .write = ad5446_write,
        },
        [ID_AD5640_2500] = {
                .channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
                .int_vref_mv = 2500,
-               .store_sample = ad5446_store_sample,
-               .store_pwr_down = ad5620_store_pwr_down,
+               .write = ad5446_write,
        },
        [ID_AD5640_1250] = {
                .channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
                .int_vref_mv = 1250,
-               .store_sample = ad5446_store_sample,
-               .store_pwr_down = ad5620_store_pwr_down,
+               .write = ad5446_write,
        },
        [ID_AD5660_2500] = {
                .channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
                .int_vref_mv = 2500,
-               .store_sample = ad5660_store_sample,
-               .store_pwr_down = ad5660_store_pwr_down,
+               .write = ad5660_write,
        },
        [ID_AD5660_1250] = {
                .channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
                .int_vref_mv = 1250,
-               .store_sample = ad5660_store_sample,
-               .store_pwr_down = ad5660_store_pwr_down,
+               .write = ad5660_write,
        },
 };
 
                mutex_lock(&indio_dev->mlock);
                st->cached_val = val;
                if (!st->pwr_down)
-                       ret = st->chip_info->store_sample(st, val);
+                       ret = st->chip_info->write(st, val);
                mutex_unlock(&indio_dev->mlock);
                break;
        default: