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

Simplify the code by using devm_regulator_get_enable_read_voltage().

Error returns are updated to use dev_err_probe().

Signed-off-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20241023-iio-regulator-refactor-round-5-v1-9-d0bd396b3f50@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

David Lechner and committed by
Jonathan Cameron
89fd809a 4d930ffc

+23 -77
+23 -77
drivers/iio/dac/ad5761.c
··· 53 53 /** 54 54 * struct ad5761_state - driver instance specific data 55 55 * @spi: spi_device 56 - * @vref_reg: reference voltage regulator 57 56 * @use_intref: true when the internal voltage reference is used 58 57 * @vref: actual voltage reference in mVolts 59 58 * @range: output range mode used ··· 61 62 */ 62 63 struct ad5761_state { 63 64 struct spi_device *spi; 64 - struct regulator *vref_reg; 65 65 struct mutex lock; 66 66 67 67 bool use_intref; ··· 285 287 }, 286 288 }; 287 289 288 - static int ad5761_get_vref(struct ad5761_state *st, 289 - const struct ad5761_chip_info *chip_info) 290 - { 291 - int ret; 292 - 293 - st->vref_reg = devm_regulator_get_optional(&st->spi->dev, "vref"); 294 - if (PTR_ERR(st->vref_reg) == -ENODEV) { 295 - /* Use Internal regulator */ 296 - if (!chip_info->int_vref) { 297 - dev_err(&st->spi->dev, 298 - "Voltage reference not found\n"); 299 - return -EIO; 300 - } 301 - 302 - st->use_intref = true; 303 - st->vref = chip_info->int_vref; 304 - return 0; 305 - } 306 - 307 - if (IS_ERR(st->vref_reg)) { 308 - dev_err(&st->spi->dev, 309 - "Error getting voltage reference regulator\n"); 310 - return PTR_ERR(st->vref_reg); 311 - } 312 - 313 - ret = regulator_enable(st->vref_reg); 314 - if (ret) { 315 - dev_err(&st->spi->dev, 316 - "Failed to enable voltage reference\n"); 317 - return ret; 318 - } 319 - 320 - ret = regulator_get_voltage(st->vref_reg); 321 - if (ret < 0) { 322 - dev_err(&st->spi->dev, 323 - "Failed to get voltage reference value\n"); 324 - goto disable_regulator_vref; 325 - } 326 - 327 - if (ret < 2000000 || ret > 3000000) { 328 - dev_warn(&st->spi->dev, 329 - "Invalid external voltage ref. value %d uV\n", ret); 330 - ret = -EIO; 331 - goto disable_regulator_vref; 332 - } 333 - 334 - st->vref = ret / 1000; 335 - st->use_intref = false; 336 - 337 - return 0; 338 - 339 - disable_regulator_vref: 340 - regulator_disable(st->vref_reg); 341 - st->vref_reg = NULL; 342 - return ret; 343 - } 344 - 345 290 static int ad5761_probe(struct spi_device *spi) 346 291 { 347 292 struct iio_dev *iio_dev; ··· 304 363 st->spi = spi; 305 364 spi_set_drvdata(spi, iio_dev); 306 365 307 - ret = ad5761_get_vref(st, chip_info); 308 - if (ret) 309 - return ret; 366 + ret = devm_regulator_get_enable_read_voltage(&spi->dev, "vref"); 367 + if (ret < 0 && ret != -ENODEV) 368 + return dev_err_probe(&spi->dev, ret, 369 + "Failed to get voltage reference value\n"); 370 + if (ret == -ENODEV) { 371 + /* Use Internal regulator */ 372 + if (!chip_info->int_vref) 373 + return dev_err_probe(&spi->dev, -EIO, 374 + "Voltage reference not found\n"); 375 + 376 + st->use_intref = true; 377 + st->vref = chip_info->int_vref; 378 + } else { 379 + if (ret < 2000000 || ret > 3000000) 380 + return dev_err_probe(&spi->dev, -EIO, 381 + "Invalid external voltage ref. value %d uV\n", 382 + ret); 383 + 384 + st->use_intref = false; 385 + st->vref = ret / 1000; 386 + } 310 387 311 388 if (pdata) 312 389 voltage_range = pdata->voltage_range; ··· 333 374 334 375 ret = ad5761_spi_set_range(st, voltage_range); 335 376 if (ret) 336 - goto disable_regulator_err; 377 + return ret; 337 378 338 379 iio_dev->info = &ad5761_info; 339 380 iio_dev->modes = INDIO_DIRECT_MODE; 340 381 iio_dev->channels = &chip_info->channel; 341 382 iio_dev->num_channels = 1; 342 383 iio_dev->name = spi_get_device_id(st->spi)->name; 343 - ret = iio_device_register(iio_dev); 344 - if (ret) 345 - goto disable_regulator_err; 346 384 347 - return 0; 348 - 349 - disable_regulator_err: 350 - if (!IS_ERR_OR_NULL(st->vref_reg)) 351 - regulator_disable(st->vref_reg); 352 - 353 - return ret; 385 + return iio_device_register(iio_dev); 354 386 } 355 387 356 388 static void ad5761_remove(struct spi_device *spi) 357 389 { 358 390 struct iio_dev *iio_dev = spi_get_drvdata(spi); 359 - struct ad5761_state *st = iio_priv(iio_dev); 360 391 361 392 iio_device_unregister(iio_dev); 362 - 363 - if (!IS_ERR_OR_NULL(st->vref_reg)) 364 - regulator_disable(st->vref_reg); 365 393 } 366 394 367 395 static const struct spi_device_id ad5761_id[] = {