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

Configure Feed

Select the types of activity you want to include in your feed.

iio: adc: ad7192: use devm_regulator_get_enable_read_voltage

This makes use of the new devm_regulator_get_enable_read_voltage()
function to reduce boilerplate code.

Error messages have changed slightly since there are now fewer places
where we print an error. The rest of the logic of selecting which
supply to use as the reference voltage remains the same.

Also 1000 is replaced by MILLI in a few places for consistency.

Signed-off-by: David Lechner <dlechner@baylibre.com>
Signed-off-by: Alisa-Dariana Roman <alisa.roman@analog.com>
Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
Link: https://patch.msgid.link/20240624124941.113010-2-alisa.roman@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

David Lechner and committed by
Jonathan Cameron
0d2775c1 a3c2c5c9

+33 -64
+33 -64
drivers/iio/adc/ad7192.c
··· 200 200 201 201 struct ad7192_state { 202 202 const struct ad7192_chip_info *chip_info; 203 - struct regulator *avdd; 204 - struct regulator *vref; 205 203 struct clk *mclk; 206 204 u16 int_vref_mv; 207 205 u32 aincom_mv; ··· 1187 1189 }, 1188 1190 }; 1189 1191 1190 - static void ad7192_reg_disable(void *reg) 1191 - { 1192 - regulator_disable(reg); 1193 - } 1194 - 1195 1192 static int ad7192_probe(struct spi_device *spi) 1196 1193 { 1197 1194 struct device *dev = &spi->dev; 1198 1195 struct ad7192_state *st; 1199 1196 struct iio_dev *indio_dev; 1200 - struct regulator *aincom; 1201 - int ret; 1197 + int ret, avdd_mv; 1202 1198 1203 1199 if (!spi->irq) 1204 1200 return dev_err_probe(dev, -ENODEV, "Failed to get IRQ\n"); ··· 1210 1218 * Newer firmware should provide a zero volt fixed supply if wired to 1211 1219 * ground. 1212 1220 */ 1213 - aincom = devm_regulator_get_optional(dev, "aincom"); 1214 - if (IS_ERR(aincom)) { 1215 - if (PTR_ERR(aincom) != -ENODEV) 1216 - return dev_err_probe(dev, PTR_ERR(aincom), 1217 - "Failed to get AINCOM supply\n"); 1221 + ret = devm_regulator_get_enable_read_voltage(dev, "aincom"); 1222 + if (ret < 0 && ret != -ENODEV) 1223 + return dev_err_probe(dev, ret, "Failed to get AINCOM voltage\n"); 1218 1224 1219 - st->aincom_mv = 0; 1220 - } else { 1221 - ret = regulator_enable(aincom); 1222 - if (ret) 1223 - return dev_err_probe(dev, ret, 1224 - "Failed to enable specified AINCOM supply\n"); 1225 + st->aincom_mv = ret == -ENODEV ? 0 : ret / MILLI; 1225 1226 1226 - ret = devm_add_action_or_reset(dev, ad7192_reg_disable, aincom); 1227 - if (ret) 1228 - return ret; 1227 + /* AVDD can optionally be used as reference voltage */ 1228 + ret = devm_regulator_get_enable_read_voltage(dev, "avdd"); 1229 + if (ret == -ENODEV || ret == -EINVAL) { 1230 + int ret2; 1229 1231 1230 - ret = regulator_get_voltage(aincom); 1231 - if (ret < 0) 1232 - return dev_err_probe(dev, ret, 1233 - "Device tree error, AINCOM voltage undefined\n"); 1234 - st->aincom_mv = ret / MILLI; 1232 + /* 1233 + * We get -EINVAL if avdd is a supply with unknown voltage. We 1234 + * still need to enable it since it is also a power supply. 1235 + */ 1236 + ret2 = devm_regulator_get_enable(dev, "avdd"); 1237 + if (ret2) 1238 + return dev_err_probe(dev, ret2, 1239 + "Failed to enable AVDD supply\n"); 1240 + } else if (ret < 0) { 1241 + return dev_err_probe(dev, ret, "Failed to get AVDD voltage\n"); 1235 1242 } 1236 1243 1237 - st->avdd = devm_regulator_get(dev, "avdd"); 1238 - if (IS_ERR(st->avdd)) 1239 - return PTR_ERR(st->avdd); 1240 - 1241 - ret = regulator_enable(st->avdd); 1242 - if (ret) 1243 - return dev_err_probe(dev, ret, 1244 - "Failed to enable specified AVdd supply\n"); 1245 - 1246 - ret = devm_add_action_or_reset(dev, ad7192_reg_disable, st->avdd); 1247 - if (ret) 1248 - return ret; 1244 + avdd_mv = ret == -ENODEV || ret == -EINVAL ? 0 : ret / MILLI; 1249 1245 1250 1246 ret = devm_regulator_get_enable(dev, "dvdd"); 1251 1247 if (ret) 1252 1248 return dev_err_probe(dev, ret, "Failed to enable specified DVdd supply\n"); 1253 1249 1254 - st->vref = devm_regulator_get_optional(dev, "vref"); 1255 - if (IS_ERR(st->vref)) { 1256 - if (PTR_ERR(st->vref) != -ENODEV) 1257 - return PTR_ERR(st->vref); 1258 - 1259 - ret = regulator_get_voltage(st->avdd); 1260 - if (ret < 0) 1261 - return dev_err_probe(dev, ret, 1262 - "Device tree error, AVdd voltage undefined\n"); 1263 - } else { 1264 - ret = regulator_enable(st->vref); 1265 - if (ret) 1266 - return dev_err_probe(dev, ret, 1267 - "Failed to enable specified Vref supply\n"); 1268 - 1269 - ret = devm_add_action_or_reset(dev, ad7192_reg_disable, st->vref); 1270 - if (ret) 1271 - return ret; 1272 - 1273 - ret = regulator_get_voltage(st->vref); 1274 - if (ret < 0) 1275 - return dev_err_probe(dev, ret, 1276 - "Device tree error, Vref voltage undefined\n"); 1250 + /* 1251 + * This is either REFIN1 or REFIN2 depending on adi,refin2-pins-enable. 1252 + * If this supply is not present, fall back to AVDD as reference. 1253 + */ 1254 + ret = devm_regulator_get_enable_read_voltage(dev, "vref"); 1255 + if (ret == -ENODEV) { 1256 + if (avdd_mv == 0) 1257 + return dev_err_probe(dev, -ENODEV, 1258 + "No reference voltage available\n"); 1259 + } else if (ret < 0) { 1260 + return ret; 1277 1261 } 1278 - st->int_vref_mv = ret / 1000; 1262 + 1263 + st->int_vref_mv = ret == -ENODEV ? avdd_mv : ret / MILLI; 1279 1264 1280 1265 st->chip_info = spi_get_device_match_data(spi); 1281 1266 indio_dev->name = st->chip_info->name;