Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

staging:iio:ade7854: Rework SPI read function

Rework read SPI function to reduce the code duplication and centralizes
all the task in a single function.

Signed-off-by: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Rodrigo Siqueira and committed by
Jonathan Cameron
e6182b2d 5d55dcbc

+33 -103
+33 -103
drivers/staging/iio/meter/ade7854-spi.c
··· 67 67 return ret; 68 68 } 69 69 70 - static int ade7854_spi_read_reg_8(struct device *dev, 71 - u16 reg_address, 72 - u8 *val) 70 + static int ade7854_spi_read_reg(struct device *dev, 71 + u16 reg_address, 72 + u32 *val, 73 + int bits) 73 74 { 74 75 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 75 76 struct ade7854_state *st = iio_priv(indio_dev); ··· 83 82 }, { 84 83 .rx_buf = st->rx, 85 84 .bits_per_word = 8, 86 - .len = 1, 85 + .len = bits, 87 86 } 88 87 }; 89 88 ··· 95 94 96 95 ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers)); 97 96 if (ret) { 98 - dev_err(&st->spi->dev, "problem when reading 8 bit register 0x%02X", 97 + dev_err(&st->spi->dev, "problem when reading register 0x%02X", 99 98 reg_address); 100 - goto error_ret; 99 + goto unlock; 101 100 } 102 - *val = st->rx[0]; 103 101 104 - error_ret: 102 + switch (bits) { 103 + case 8: 104 + *val = st->rx[0]; 105 + break; 106 + case 16: 107 + *val = be16_to_cpup((const __be16 *)st->rx); 108 + break; 109 + case 24: 110 + *val = (st->rx[0] << 16) | (st->rx[1] << 8) | st->rx[2]; 111 + break; 112 + case 32: 113 + *val = be32_to_cpup((const __be32 *)st->rx); 114 + break; 115 + } 116 + 117 + unlock: 105 118 mutex_unlock(&st->buf_lock); 106 119 return ret; 120 + } 121 + 122 + static int ade7854_spi_read_reg_8(struct device *dev, 123 + u16 reg_address, 124 + u8 *val) 125 + { 126 + return ade7854_spi_read_reg(dev, reg_address, (u32 *)val, 8); 107 127 } 108 128 109 129 static int ade7854_spi_read_reg_16(struct device *dev, 110 130 u16 reg_address, 111 131 u16 *val) 112 132 { 113 - struct iio_dev *indio_dev = dev_to_iio_dev(dev); 114 - struct ade7854_state *st = iio_priv(indio_dev); 115 - int ret; 116 - struct spi_transfer xfers[] = { 117 - { 118 - .tx_buf = st->tx, 119 - .bits_per_word = 8, 120 - .len = 3, 121 - }, { 122 - .rx_buf = st->rx, 123 - .bits_per_word = 8, 124 - .len = 2, 125 - } 126 - }; 127 - 128 - mutex_lock(&st->buf_lock); 129 - st->tx[0] = ADE7854_READ_REG; 130 - st->tx[1] = (reg_address >> 8) & 0xFF; 131 - st->tx[2] = reg_address & 0xFF; 132 - 133 - ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers)); 134 - if (ret) { 135 - dev_err(&st->spi->dev, "problem when reading 16 bit register 0x%02X", 136 - reg_address); 137 - goto error_ret; 138 - } 139 - *val = be16_to_cpup((const __be16 *)st->rx); 140 - 141 - error_ret: 142 - mutex_unlock(&st->buf_lock); 143 - return ret; 133 + return ade7854_spi_read_reg(dev, reg_address, (u32 *)val, 16); 144 134 } 145 135 146 136 static int ade7854_spi_read_reg_24(struct device *dev, 147 137 u16 reg_address, 148 138 u32 *val) 149 139 { 150 - struct iio_dev *indio_dev = dev_to_iio_dev(dev); 151 - struct ade7854_state *st = iio_priv(indio_dev); 152 - int ret; 153 - struct spi_transfer xfers[] = { 154 - { 155 - .tx_buf = st->tx, 156 - .bits_per_word = 8, 157 - .len = 3, 158 - }, { 159 - .rx_buf = st->rx, 160 - .bits_per_word = 8, 161 - .len = 3, 162 - } 163 - }; 164 - 165 - mutex_lock(&st->buf_lock); 166 - 167 - st->tx[0] = ADE7854_READ_REG; 168 - st->tx[1] = (reg_address >> 8) & 0xFF; 169 - st->tx[2] = reg_address & 0xFF; 170 - 171 - ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers)); 172 - if (ret) { 173 - dev_err(&st->spi->dev, "problem when reading 24 bit register 0x%02X", 174 - reg_address); 175 - goto error_ret; 176 - } 177 - *val = (st->rx[0] << 16) | (st->rx[1] << 8) | st->rx[2]; 178 - 179 - error_ret: 180 - mutex_unlock(&st->buf_lock); 181 - return ret; 140 + return ade7854_spi_read_reg(dev, reg_address, (u32 *)val, 24); 182 141 } 183 142 184 143 static int ade7854_spi_read_reg_32(struct device *dev, 185 144 u16 reg_address, 186 145 u32 *val) 187 146 { 188 - struct iio_dev *indio_dev = dev_to_iio_dev(dev); 189 - struct ade7854_state *st = iio_priv(indio_dev); 190 - int ret; 191 - struct spi_transfer xfers[] = { 192 - { 193 - .tx_buf = st->tx, 194 - .bits_per_word = 8, 195 - .len = 3, 196 - }, { 197 - .rx_buf = st->rx, 198 - .bits_per_word = 8, 199 - .len = 4, 200 - } 201 - }; 202 - 203 - mutex_lock(&st->buf_lock); 204 - 205 - st->tx[0] = ADE7854_READ_REG; 206 - st->tx[1] = (reg_address >> 8) & 0xFF; 207 - st->tx[2] = reg_address & 0xFF; 208 - 209 - ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers)); 210 - if (ret) { 211 - dev_err(&st->spi->dev, "problem when reading 32 bit register 0x%02X", 212 - reg_address); 213 - goto error_ret; 214 - } 215 - *val = be32_to_cpup((const __be32 *)st->rx); 216 - 217 - error_ret: 218 - mutex_unlock(&st->buf_lock); 219 - return ret; 147 + return ade7854_spi_read_reg(dev, reg_address, (u32 *)val, 32); 220 148 } 221 149 222 150 static int ade7854_spi_probe(struct spi_device *spi)