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

iio: adc: ad7192: convert to device-managed functions

With the devm_ad_sd_setup_buffer_and_trigger() helper, it's a bit easier
now to convert the probe of the AD7192 driver to use device-managed
functions.

The regulators and the mclk requires devm_add_action_or_reset() callbacks
though.

Signed-off-by: Alexandru Ardelean <aardelean@deviqon.com>
Link: https://lore.kernel.org/r/20210513120752.90074-11-aardelean@deviqon.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Alexandru Ardelean and committed by
Jonathan Cameron
bd5dcdeb c9ec2cb3

+36 -53
+36 -53
drivers/iio/adc/ad7192.c
··· 908 908 return 0; 909 909 } 910 910 911 + static void ad7192_reg_disable(void *reg) 912 + { 913 + regulator_disable(reg); 914 + } 915 + 916 + static void ad7192_clk_disable(void *clk) 917 + { 918 + clk_disable_unprepare(clk); 919 + } 920 + 911 921 static int ad7192_probe(struct spi_device *spi) 912 922 { 913 923 struct ad7192_state *st; ··· 947 937 return ret; 948 938 } 949 939 940 + ret = devm_add_action_or_reset(&spi->dev, ad7192_reg_disable, st->avdd); 941 + if (ret) 942 + return ret; 943 + 950 944 st->dvdd = devm_regulator_get(&spi->dev, "dvdd"); 951 - if (IS_ERR(st->dvdd)) { 952 - ret = PTR_ERR(st->dvdd); 953 - goto error_disable_avdd; 954 - } 945 + if (IS_ERR(st->dvdd)) 946 + return PTR_ERR(st->dvdd); 955 947 956 948 ret = regulator_enable(st->dvdd); 957 949 if (ret) { 958 950 dev_err(&spi->dev, "Failed to enable specified DVdd supply\n"); 959 - goto error_disable_avdd; 951 + return ret; 960 952 } 953 + 954 + ret = devm_add_action_or_reset(&spi->dev, ad7192_reg_disable, st->dvdd); 955 + if (ret) 956 + return ret; 961 957 962 958 ret = regulator_get_voltage(st->avdd); 963 959 if (ret < 0) { 964 960 dev_err(&spi->dev, "Device tree error, reference voltage undefined\n"); 965 - goto error_disable_avdd; 961 + return ret; 966 962 } 967 963 st->int_vref_mv = ret / 1000; 968 964 969 - spi_set_drvdata(spi, indio_dev); 970 965 st->chip_info = of_device_get_match_data(&spi->dev); 971 966 indio_dev->name = st->chip_info->name; 972 967 indio_dev->modes = INDIO_DIRECT_MODE; 973 968 974 969 ret = ad7192_channels_config(indio_dev); 975 970 if (ret < 0) 976 - goto error_disable_dvdd; 971 + return ret; 977 972 978 973 if (st->chip_info->chip_id == CHIPID_AD7195) 979 974 indio_dev->info = &ad7195_info; ··· 987 972 988 973 ad_sd_init(&st->sd, indio_dev, spi, &ad7192_sigma_delta_info); 989 974 990 - ret = ad_sd_setup_buffer_and_trigger(indio_dev); 975 + ret = devm_ad_sd_setup_buffer_and_trigger(&spi->dev, indio_dev); 991 976 if (ret) 992 - goto error_disable_dvdd; 977 + return ret; 993 978 994 979 st->fclk = AD7192_INT_FREQ_MHZ; 995 980 996 981 st->mclk = devm_clk_get_optional(&spi->dev, "mclk"); 997 - if (IS_ERR(st->mclk)) { 998 - ret = PTR_ERR(st->mclk); 999 - goto error_remove_trigger; 1000 - } 982 + if (IS_ERR(st->mclk)) 983 + return PTR_ERR(st->mclk); 1001 984 1002 985 st->clock_sel = ad7192_of_clock_select(st); 1003 986 ··· 1003 990 st->clock_sel == AD7192_CLK_EXT_MCLK2) { 1004 991 ret = clk_prepare_enable(st->mclk); 1005 992 if (ret < 0) 1006 - goto error_remove_trigger; 993 + return ret; 994 + 995 + ret = devm_add_action_or_reset(&spi->dev, ad7192_clk_disable, 996 + st->mclk); 997 + if (ret) 998 + return ret; 1007 999 1008 1000 st->fclk = clk_get_rate(st->mclk); 1009 1001 if (!ad7192_valid_external_frequency(st->fclk)) { 1010 - ret = -EINVAL; 1011 1002 dev_err(&spi->dev, 1012 1003 "External clock frequency out of bounds\n"); 1013 - goto error_disable_clk; 1004 + return -EINVAL; 1014 1005 } 1015 1006 } 1016 1007 1017 1008 ret = ad7192_setup(st, spi->dev.of_node); 1018 1009 if (ret) 1019 - goto error_disable_clk; 1010 + return ret; 1020 1011 1021 - ret = iio_device_register(indio_dev); 1022 - if (ret < 0) 1023 - goto error_disable_clk; 1024 - return 0; 1025 - 1026 - error_disable_clk: 1027 - if (st->clock_sel == AD7192_CLK_EXT_MCLK1_2 || 1028 - st->clock_sel == AD7192_CLK_EXT_MCLK2) 1029 - clk_disable_unprepare(st->mclk); 1030 - error_remove_trigger: 1031 - ad_sd_cleanup_buffer_and_trigger(indio_dev); 1032 - error_disable_dvdd: 1033 - regulator_disable(st->dvdd); 1034 - error_disable_avdd: 1035 - regulator_disable(st->avdd); 1036 - 1037 - return ret; 1038 - } 1039 - 1040 - static int ad7192_remove(struct spi_device *spi) 1041 - { 1042 - struct iio_dev *indio_dev = spi_get_drvdata(spi); 1043 - struct ad7192_state *st = iio_priv(indio_dev); 1044 - 1045 - iio_device_unregister(indio_dev); 1046 - if (st->clock_sel == AD7192_CLK_EXT_MCLK1_2 || 1047 - st->clock_sel == AD7192_CLK_EXT_MCLK2) 1048 - clk_disable_unprepare(st->mclk); 1049 - ad_sd_cleanup_buffer_and_trigger(indio_dev); 1050 - 1051 - regulator_disable(st->dvdd); 1052 - regulator_disable(st->avdd); 1053 - 1054 - return 0; 1012 + return devm_iio_device_register(&spi->dev, indio_dev); 1055 1013 } 1056 1014 1057 1015 static const struct of_device_id ad7192_of_match[] = { ··· 1040 1056 .of_match_table = ad7192_of_match, 1041 1057 }, 1042 1058 .probe = ad7192_probe, 1043 - .remove = ad7192_remove, 1044 1059 }; 1045 1060 module_spi_driver(ad7192_driver); 1046 1061