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

iio: adc: ad7793: Factor out core of ad7793_write_raw() to simplify error handling

Factor out everything under the direct mode claim allowing direct returns
in error paths. Switch sense of matching in the loop and use a continue
to reduce code indent and improve readability.

Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Link: https://patch.msgid.link/20250217141630.897334-18-jic23@kernel.org
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

+40 -35
+40 -35
drivers/iio/adc/ad7793.c
··· 462 462 return -EINVAL; 463 463 } 464 464 465 - static int ad7793_write_raw(struct iio_dev *indio_dev, 466 - struct iio_chan_spec const *chan, 467 - int val, 468 - int val2, 469 - long mask) 465 + static int __ad7793_write_raw(struct iio_dev *indio_dev, 466 + struct iio_chan_spec const *chan, 467 + int val, int val2, long mask) 470 468 { 471 469 struct ad7793_state *st = iio_priv(indio_dev); 472 - int ret, i; 470 + int i; 473 471 unsigned int tmp; 474 - 475 - ret = iio_device_claim_direct_mode(indio_dev); 476 - if (ret) 477 - return ret; 478 472 479 473 switch (mask) { 480 474 case IIO_CHAN_INFO_SCALE: 481 - ret = -EINVAL; 482 - for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++) 483 - if (val2 == st->scale_avail[i][1]) { 484 - ret = 0; 485 - tmp = st->conf; 486 - st->conf &= ~AD7793_CONF_GAIN(-1); 487 - st->conf |= AD7793_CONF_GAIN(i); 475 + for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++) { 476 + if (val2 != st->scale_avail[i][1]) 477 + continue; 488 478 489 - if (tmp == st->conf) 490 - break; 479 + tmp = st->conf; 480 + st->conf &= ~AD7793_CONF_GAIN(-1); 481 + st->conf |= AD7793_CONF_GAIN(i); 491 482 492 - ad_sd_write_reg(&st->sd, AD7793_REG_CONF, 493 - sizeof(st->conf), st->conf); 494 - ad7793_calibrate_all(st); 495 - break; 496 - } 497 - break; 498 - case IIO_CHAN_INFO_SAMP_FREQ: 499 - if (!val) { 500 - ret = -EINVAL; 501 - break; 483 + if (tmp == st->conf) 484 + return 0; 485 + 486 + ad_sd_write_reg(&st->sd, AD7793_REG_CONF, 487 + sizeof(st->conf), st->conf); 488 + ad7793_calibrate_all(st); 489 + 490 + return 0; 502 491 } 492 + return -EINVAL; 493 + case IIO_CHAN_INFO_SAMP_FREQ: 494 + if (!val) 495 + return -EINVAL; 503 496 504 497 for (i = 0; i < 16; i++) 505 498 if (val == st->chip_info->sample_freq_avail[i]) 506 499 break; 507 500 508 - if (i == 16) { 509 - ret = -EINVAL; 510 - break; 511 - } 501 + if (i == 16) 502 + return -EINVAL; 512 503 513 504 st->mode &= ~AD7793_MODE_RATE(-1); 514 505 st->mode |= AD7793_MODE_RATE(i); 515 506 ad_sd_write_reg(&st->sd, AD7793_REG_MODE, sizeof(st->mode), 516 507 st->mode); 517 - break; 508 + return 0; 518 509 default: 519 - ret = -EINVAL; 510 + return -EINVAL; 520 511 } 512 + } 513 + 514 + static int ad7793_write_raw(struct iio_dev *indio_dev, 515 + struct iio_chan_spec const *chan, 516 + int val, int val2, long mask) 517 + { 518 + int ret; 519 + 520 + ret = iio_device_claim_direct_mode(indio_dev); 521 + if (ret) 522 + return ret; 523 + 524 + ret = __ad7793_write_raw(indio_dev, chan, val, val2, mask); 521 525 522 526 iio_device_release_direct_mode(indio_dev); 527 + 523 528 return ret; 524 529 } 525 530