/***************************************************************************//** * @brief Writes a value to the selected register. * * @param registerAddress - The address of the register to write to. * @param registerValue - The value to write to the register. * * @return Returns 0 in case of success or negative error code. *******************************************************************************/ int32_t ad9523_write(uint32_t registerAddress, uint32_t registerValue) { uint32_t i = 0; int32_t ret = -1; uint16_t regAddr = 0; regAddr = (registerAddress & 0x1FFF); for(i = 0; i < AD9523_TRANSF_LEN(registerAddress); i++) { ret = SPI_Write(SPI_SEL_AD9523, regAddr, (registerValue >> ((AD9523_TRANSF_LEN(registerAddress) - i - 1) * 8)) & 0xFF); if(ret < 0) return ret; regAddr--; } return ret; }
/***************************************************************************//** * @brief Reads the value of the selected register. * * @param registerAddress - The address of the register to read. * * @return registerValue - The register's value or negative error code. *******************************************************************************/ int32_t ad9523_read(uint32_t registerAddress) { uint16_t regAddr = 0; uint32_t registerValue = 0; uint32_t registerValue1 = 0; int32_t ret; uint32_t i = 0; regAddr = 0x8000 + (registerAddress & 0x1FFF); for(i = 0; i < AD9523_TRANSF_LEN(registerAddress); i++) { ret = SPI_Read(SPI_SEL_AD9523, regAddr, ®isterValue1); if(ret < 0) return ret; regAddr--; registerValue <<= 8; registerValue |= registerValue1; } return (int32_t)registerValue; }
static int ad9523_read(struct iio_dev *indio_dev, unsigned addr) { struct ad9523_state *st = iio_priv(indio_dev); int ret; /* We encode the register size 1..3 bytes into the register address. * On transfer we get the size from the register datum, and make sure * the result is properly aligned. */ struct spi_transfer t[] = { { .tx_buf = &st->data[0].d8[2], .len = 2, }, { .rx_buf = &st->data[1].d8[4 - AD9523_TRANSF_LEN(addr)], .len = AD9523_TRANSF_LEN(addr), }, }; st->data[0].d32 = cpu_to_be32(AD9523_READ | AD9523_CNT(AD9523_TRANSF_LEN(addr)) | AD9523_ADDR(addr)); ret = spi_sync_transfer(st->spi, t, ARRAY_SIZE(t)); if (ret < 0) dev_err(&indio_dev->dev, "read failed (%d)", ret); else ret = be32_to_cpu(st->data[1].d32) & (0xFFFFFF >> (8 * (3 - AD9523_TRANSF_LEN(addr))));