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: mcp3564: use devm_regulator_get_enable_read_voltage()

This makes use of the new devm_regulator_get_enable_read_voltage()
helper function to reduce boilerplate code in the MCP3564 ADC driver.

The error message is slightly changed since there are fewer error
return paths.

Setting adc->vref_mv is consolidated into a single place to make the
logic easier to follow.

A use_internal_vref_attr local variable is added to make it more
obvious what the difference between the two iio info structures is.

The return value of the "Unknown Vref" dev_err_probe() is hard-coded to
-ENODEV instead of ret since it was getting a bit far from where ret
was set and logically that is the only value it could have.

Signed-off-by: David Lechner <dlechner@baylibre.com>
Reviewed-by: Marius Cristea <marius.cristea@microchip.com>
Link: https://patch.msgid.link/20240723-iio-regulator-refactor-round-3-v2-1-ae9291201785@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

David Lechner and committed by
Jonathan Cameron
8293a60c f44e94af

+16 -38
+16 -38
drivers/iio/adc/mcp3564.c
··· 349 349 * struct mcp3564_state - working data for a ADC device 350 350 * @chip_info: chip specific data 351 351 * @spi: SPI device structure 352 - * @vref: the regulator device used as a voltage reference in case 353 - * external voltage reference is used 354 352 * @vref_mv: voltage reference value in miliVolts 355 353 * @lock: synchronize access to driver's state members 356 354 * @dev_addr: hardware device address ··· 367 369 struct mcp3564_state { 368 370 const struct mcp3564_chip_info *chip_info; 369 371 struct spi_device *spi; 370 - struct regulator *vref; 371 372 unsigned short vref_mv; 372 373 struct mutex lock; /* Synchronize access to driver's state members */ 373 374 u8 dev_addr; ··· 1082 1085 return 0; 1083 1086 } 1084 1087 1085 - static void mcp3564_disable_reg(void *reg) 1086 - { 1087 - regulator_disable(reg); 1088 - } 1089 - 1090 1088 static void mcp3564_fill_scale_tbls(struct mcp3564_state *adc) 1091 1089 { 1092 1090 unsigned int pow = adc->chip_info->resolution - 1; ··· 1102 1110 } 1103 1111 } 1104 1112 1105 - static int mcp3564_config(struct iio_dev *indio_dev) 1113 + static int mcp3564_config(struct iio_dev *indio_dev, bool *use_internal_vref_attr) 1106 1114 { 1107 1115 struct mcp3564_state *adc = iio_priv(indio_dev); 1108 1116 struct device *dev = &adc->spi->dev; ··· 1111 1119 enum mcp3564_ids ids; 1112 1120 int ret = 0; 1113 1121 unsigned int tmp = 0x01; 1122 + bool internal_vref; 1114 1123 bool err = false; 1115 1124 1116 1125 /* ··· 1211 1218 1212 1219 dev_dbg(dev, "Found %s chip\n", adc->chip_info->name); 1213 1220 1214 - adc->vref = devm_regulator_get_optional(dev, "vref"); 1215 - if (IS_ERR(adc->vref)) { 1216 - if (PTR_ERR(adc->vref) != -ENODEV) 1217 - return dev_err_probe(dev, PTR_ERR(adc->vref), 1218 - "failed to get regulator\n"); 1221 + ret = devm_regulator_get_enable_read_voltage(dev, "vref"); 1222 + if (ret < 0 && ret != -ENODEV) 1223 + return dev_err_probe(dev, ret, "Failed to get vref voltage\n"); 1219 1224 1225 + internal_vref = ret == -ENODEV; 1226 + adc->vref_mv = internal_vref ? MCP3564R_INT_VREF_MV : ret / MILLI; 1227 + *use_internal_vref_attr = internal_vref; 1228 + 1229 + if (internal_vref) { 1220 1230 /* Check if chip has internal vref */ 1221 1231 if (!adc->have_vref) 1222 - return dev_err_probe(dev, PTR_ERR(adc->vref), 1223 - "Unknown Vref\n"); 1224 - adc->vref = NULL; 1232 + return dev_err_probe(dev, -ENODEV, "Unknown Vref\n"); 1233 + 1225 1234 dev_dbg(dev, "%s: Using internal Vref\n", __func__); 1226 1235 } else { 1227 - ret = regulator_enable(adc->vref); 1228 - if (ret) 1229 - return ret; 1230 - 1231 - ret = devm_add_action_or_reset(dev, mcp3564_disable_reg, 1232 - adc->vref); 1233 - if (ret) 1234 - return ret; 1235 - 1236 1236 dev_dbg(dev, "%s: Using External Vref\n", __func__); 1237 - 1238 - ret = regulator_get_voltage(adc->vref); 1239 - if (ret < 0) 1240 - return dev_err_probe(dev, ret, 1241 - "Failed to read vref regulator\n"); 1242 - 1243 - adc->vref_mv = ret / MILLI; 1244 1237 } 1245 1238 1246 1239 ret = mcp3564_parse_fw_children(indio_dev); ··· 1329 1350 tmp_reg |= FIELD_PREP(MCP3564_CONFIG0_CLK_SEL_MASK, MCP3564_CONFIG0_USE_INT_CLK); 1330 1351 tmp_reg |= MCP3456_CONFIG0_BIT6_DEFAULT; 1331 1352 1332 - if (!adc->vref) { 1353 + if (internal_vref) 1333 1354 tmp_reg |= FIELD_PREP(MCP3456_CONFIG0_VREF_MASK, 1); 1334 - adc->vref_mv = MCP3564R_INT_VREF_MV; 1335 - } 1336 1355 1337 1356 ret = mcp3564_write_8bits(adc, MCP3564_CONFIG0_REG, tmp_reg); 1338 1357 ··· 1389 1412 int ret; 1390 1413 struct iio_dev *indio_dev; 1391 1414 struct mcp3564_state *adc; 1415 + bool use_internal_vref_attr; 1392 1416 1393 1417 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc)); 1394 1418 if (!indio_dev) ··· 1406 1428 * enable/disable certain channels 1407 1429 * change the sampling rate to the requested value 1408 1430 */ 1409 - ret = mcp3564_config(indio_dev); 1431 + ret = mcp3564_config(indio_dev, &use_internal_vref_attr); 1410 1432 if (ret) 1411 1433 return dev_err_probe(&spi->dev, ret, 1412 1434 "Can't configure MCP356X device\n"); ··· 1418 1440 indio_dev->name = adc->chip_info->name; 1419 1441 indio_dev->modes = INDIO_DIRECT_MODE; 1420 1442 1421 - if (!adc->vref) 1443 + if (use_internal_vref_attr) 1422 1444 indio_dev->info = &mcp3564r_info; 1423 1445 else 1424 1446 indio_dev->info = &mcp3564_info;