forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/iio/frequency/ad9523.c
....@@ -1,9 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * AD9523 SPI Low Jitter Clock Generator
34 *
45 * Copyright 2012 Analog Devices Inc.
5
- *
6
- * Licensed under the GPL-2.
76 */
87
98 #include <linux/device.h>
....@@ -862,9 +861,11 @@
862861 if (ret < 0)
863862 return ret;
864863
865
- st->vco_freq = (pdata->vcxo_freq * (pdata->pll2_freq_doubler_en ? 2 : 1)
866
- / pdata->pll2_r2_div) * AD9523_PLL2_FB_NDIV(pdata->
867
- pll2_ndiv_a_cnt, pdata->pll2_ndiv_b_cnt);
864
+ st->vco_freq = div_u64((unsigned long long)pdata->vcxo_freq *
865
+ (pdata->pll2_freq_doubler_en ? 2 : 1) *
866
+ AD9523_PLL2_FB_NDIV(pdata->pll2_ndiv_a_cnt,
867
+ pdata->pll2_ndiv_b_cnt),
868
+ pdata->pll2_r2_div);
868869
869870 ret = ad9523_write(indio_dev, AD9523_PLL2_VCO_CTRL,
870871 AD9523_PLL2_VCO_CALIBRATE);
....@@ -872,22 +873,22 @@
872873 return ret;
873874
874875 ret = ad9523_write(indio_dev, AD9523_PLL2_VCO_DIVIDER,
875
- AD9523_PLL2_VCO_DIV_M1(pdata->pll2_vco_diff_m1) |
876
- AD9523_PLL2_VCO_DIV_M2(pdata->pll2_vco_diff_m2) |
877
- AD_IFE(pll2_vco_diff_m1, 0,
876
+ AD9523_PLL2_VCO_DIV_M1(pdata->pll2_vco_div_m1) |
877
+ AD9523_PLL2_VCO_DIV_M2(pdata->pll2_vco_div_m2) |
878
+ AD_IFE(pll2_vco_div_m1, 0,
878879 AD9523_PLL2_VCO_DIV_M1_PWR_DOWN_EN) |
879
- AD_IFE(pll2_vco_diff_m2, 0,
880
+ AD_IFE(pll2_vco_div_m2, 0,
880881 AD9523_PLL2_VCO_DIV_M2_PWR_DOWN_EN));
881882 if (ret < 0)
882883 return ret;
883884
884
- if (pdata->pll2_vco_diff_m1)
885
+ if (pdata->pll2_vco_div_m1)
885886 st->vco_out_freq[AD9523_VCO1] =
886
- st->vco_freq / pdata->pll2_vco_diff_m1;
887
+ st->vco_freq / pdata->pll2_vco_div_m1;
887888
888
- if (pdata->pll2_vco_diff_m2)
889
+ if (pdata->pll2_vco_div_m2)
889890 st->vco_out_freq[AD9523_VCO2] =
890
- st->vco_freq / pdata->pll2_vco_diff_m2;
891
+ st->vco_freq / pdata->pll2_vco_div_m2;
891892
892893 st->vco_out_freq[AD9523_VCXO] = pdata->vcxo_freq;
893894
....@@ -943,11 +944,14 @@
943944 }
944945 }
945946
946
- for_each_clear_bit(i, &active_mask, AD9523_NUM_CHAN)
947
- ad9523_write(indio_dev,
947
+ for_each_clear_bit(i, &active_mask, AD9523_NUM_CHAN) {
948
+ ret = ad9523_write(indio_dev,
948949 AD9523_CHANNEL_CLOCK_DIST(i),
949950 AD9523_CLK_DIST_DRIVER_MODE(TRISTATE) |
950951 AD9523_CLK_DIST_PWR_DOWN_EN);
952
+ if (ret < 0)
953
+ return ret;
954
+ }
951955
952956 ret = ad9523_write(indio_dev, AD9523_POWER_DOWN_CTRL, 0);
953957 if (ret < 0)
....@@ -963,6 +967,13 @@
963967 return ret;
964968
965969 return 0;
970
+}
971
+
972
+static void ad9523_reg_disable(void *data)
973
+{
974
+ struct regulator *reg = data;
975
+
976
+ regulator_disable(reg);
966977 }
967978
968979 static int ad9523_probe(struct spi_device *spi)
....@@ -990,21 +1001,22 @@
9901001 ret = regulator_enable(st->reg);
9911002 if (ret)
9921003 return ret;
1004
+
1005
+ ret = devm_add_action_or_reset(&spi->dev, ad9523_reg_disable,
1006
+ st->reg);
1007
+ if (ret)
1008
+ return ret;
9931009 }
9941010
9951011 st->pwrdown_gpio = devm_gpiod_get_optional(&spi->dev, "powerdown",
9961012 GPIOD_OUT_HIGH);
997
- if (IS_ERR(st->pwrdown_gpio)) {
998
- ret = PTR_ERR(st->pwrdown_gpio);
999
- goto error_disable_reg;
1000
- }
1013
+ if (IS_ERR(st->pwrdown_gpio))
1014
+ return PTR_ERR(st->pwrdown_gpio);
10011015
10021016 st->reset_gpio = devm_gpiod_get_optional(&spi->dev, "reset",
10031017 GPIOD_OUT_LOW);
1004
- if (IS_ERR(st->reset_gpio)) {
1005
- ret = PTR_ERR(st->reset_gpio);
1006
- goto error_disable_reg;
1007
- }
1018
+ if (IS_ERR(st->reset_gpio))
1019
+ return PTR_ERR(st->reset_gpio);
10081020
10091021 if (st->reset_gpio) {
10101022 udelay(1);
....@@ -1013,16 +1025,13 @@
10131025
10141026 st->sync_gpio = devm_gpiod_get_optional(&spi->dev, "sync",
10151027 GPIOD_OUT_HIGH);
1016
- if (IS_ERR(st->sync_gpio)) {
1017
- ret = PTR_ERR(st->sync_gpio);
1018
- goto error_disable_reg;
1019
- }
1028
+ if (IS_ERR(st->sync_gpio))
1029
+ return PTR_ERR(st->sync_gpio);
10201030
10211031 spi_set_drvdata(spi, indio_dev);
10221032 st->spi = spi;
10231033 st->pdata = pdata;
10241034
1025
- indio_dev->dev.parent = &spi->dev;
10261035 indio_dev->name = (pdata->name[0] != 0) ? pdata->name :
10271036 spi_get_device_id(spi)->name;
10281037 indio_dev->info = &ad9523_info;
....@@ -1032,34 +1041,9 @@
10321041
10331042 ret = ad9523_setup(indio_dev);
10341043 if (ret < 0)
1035
- goto error_disable_reg;
1044
+ return ret;
10361045
1037
- ret = iio_device_register(indio_dev);
1038
- if (ret)
1039
- goto error_disable_reg;
1040
-
1041
- dev_info(&spi->dev, "probed %s\n", indio_dev->name);
1042
-
1043
- return 0;
1044
-
1045
-error_disable_reg:
1046
- if (!IS_ERR(st->reg))
1047
- regulator_disable(st->reg);
1048
-
1049
- return ret;
1050
-}
1051
-
1052
-static int ad9523_remove(struct spi_device *spi)
1053
-{
1054
- struct iio_dev *indio_dev = spi_get_drvdata(spi);
1055
- struct ad9523_state *st = iio_priv(indio_dev);
1056
-
1057
- iio_device_unregister(indio_dev);
1058
-
1059
- if (!IS_ERR(st->reg))
1060
- regulator_disable(st->reg);
1061
-
1062
- return 0;
1046
+ return devm_iio_device_register(&spi->dev, indio_dev);
10631047 }
10641048
10651049 static const struct spi_device_id ad9523_id[] = {
....@@ -1073,11 +1057,10 @@
10731057 .name = "ad9523",
10741058 },
10751059 .probe = ad9523_probe,
1076
- .remove = ad9523_remove,
10771060 .id_table = ad9523_id,
10781061 };
10791062 module_spi_driver(ad9523_driver);
10801063
1081
-MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
1064
+MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
10821065 MODULE_DESCRIPTION("Analog Devices AD9523 CLOCKDIST/PLL");
10831066 MODULE_LICENSE("GPL v2");