xref: /OK3568_Linux_fs/kernel/drivers/iio/frequency/adf4371.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Analog Devices ADF4371 SPI Wideband Synthesizer driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright 2019 Analog Devices Inc.
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun #include <linux/bitfield.h>
8*4882a593Smuzhiyun #include <linux/clk.h>
9*4882a593Smuzhiyun #include <linux/device.h>
10*4882a593Smuzhiyun #include <linux/err.h>
11*4882a593Smuzhiyun #include <linux/gcd.h>
12*4882a593Smuzhiyun #include <linux/kernel.h>
13*4882a593Smuzhiyun #include <linux/module.h>
14*4882a593Smuzhiyun #include <linux/regmap.h>
15*4882a593Smuzhiyun #include <linux/sysfs.h>
16*4882a593Smuzhiyun #include <linux/spi/spi.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include <linux/iio/iio.h>
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun /* Registers address macro */
21*4882a593Smuzhiyun #define ADF4371_REG(x)			(x)
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /* ADF4371_REG0 */
24*4882a593Smuzhiyun #define ADF4371_ADDR_ASC_MSK		BIT(2)
25*4882a593Smuzhiyun #define ADF4371_ADDR_ASC(x)		FIELD_PREP(ADF4371_ADDR_ASC_MSK, x)
26*4882a593Smuzhiyun #define ADF4371_ADDR_ASC_R_MSK		BIT(5)
27*4882a593Smuzhiyun #define ADF4371_ADDR_ASC_R(x)		FIELD_PREP(ADF4371_ADDR_ASC_R_MSK, x)
28*4882a593Smuzhiyun #define ADF4371_RESET_CMD		0x81
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun /* ADF4371_REG17 */
31*4882a593Smuzhiyun #define ADF4371_FRAC2WORD_L_MSK		GENMASK(7, 1)
32*4882a593Smuzhiyun #define ADF4371_FRAC2WORD_L(x)		FIELD_PREP(ADF4371_FRAC2WORD_L_MSK, x)
33*4882a593Smuzhiyun #define ADF4371_FRAC1WORD_MSK		BIT(0)
34*4882a593Smuzhiyun #define ADF4371_FRAC1WORD(x)		FIELD_PREP(ADF4371_FRAC1WORD_MSK, x)
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /* ADF4371_REG18 */
37*4882a593Smuzhiyun #define ADF4371_FRAC2WORD_H_MSK		GENMASK(6, 0)
38*4882a593Smuzhiyun #define ADF4371_FRAC2WORD_H(x)		FIELD_PREP(ADF4371_FRAC2WORD_H_MSK, x)
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /* ADF4371_REG1A */
41*4882a593Smuzhiyun #define ADF4371_MOD2WORD_MSK		GENMASK(5, 0)
42*4882a593Smuzhiyun #define ADF4371_MOD2WORD(x)		FIELD_PREP(ADF4371_MOD2WORD_MSK, x)
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun /* ADF4371_REG24 */
45*4882a593Smuzhiyun #define ADF4371_RF_DIV_SEL_MSK		GENMASK(6, 4)
46*4882a593Smuzhiyun #define ADF4371_RF_DIV_SEL(x)		FIELD_PREP(ADF4371_RF_DIV_SEL_MSK, x)
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun /* ADF4371_REG25 */
49*4882a593Smuzhiyun #define ADF4371_MUTE_LD_MSK		BIT(7)
50*4882a593Smuzhiyun #define ADF4371_MUTE_LD(x)		FIELD_PREP(ADF4371_MUTE_LD_MSK, x)
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun /* ADF4371_REG32 */
53*4882a593Smuzhiyun #define ADF4371_TIMEOUT_MSK		GENMASK(1, 0)
54*4882a593Smuzhiyun #define ADF4371_TIMEOUT(x)		FIELD_PREP(ADF4371_TIMEOUT_MSK, x)
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun /* ADF4371_REG34 */
57*4882a593Smuzhiyun #define ADF4371_VCO_ALC_TOUT_MSK	GENMASK(4, 0)
58*4882a593Smuzhiyun #define ADF4371_VCO_ALC_TOUT(x)		FIELD_PREP(ADF4371_VCO_ALC_TOUT_MSK, x)
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun /* Specifications */
61*4882a593Smuzhiyun #define ADF4371_MIN_VCO_FREQ		4000000000ULL /* 4000 MHz */
62*4882a593Smuzhiyun #define ADF4371_MAX_VCO_FREQ		8000000000ULL /* 8000 MHz */
63*4882a593Smuzhiyun #define ADF4371_MAX_OUT_RF8_FREQ	ADF4371_MAX_VCO_FREQ /* Hz */
64*4882a593Smuzhiyun #define ADF4371_MIN_OUT_RF8_FREQ	(ADF4371_MIN_VCO_FREQ / 64) /* Hz */
65*4882a593Smuzhiyun #define ADF4371_MAX_OUT_RF16_FREQ	(ADF4371_MAX_VCO_FREQ * 2) /* Hz */
66*4882a593Smuzhiyun #define ADF4371_MIN_OUT_RF16_FREQ	(ADF4371_MIN_VCO_FREQ * 2) /* Hz */
67*4882a593Smuzhiyun #define ADF4371_MAX_OUT_RF32_FREQ	(ADF4371_MAX_VCO_FREQ * 4) /* Hz */
68*4882a593Smuzhiyun #define ADF4371_MIN_OUT_RF32_FREQ	(ADF4371_MIN_VCO_FREQ * 4) /* Hz */
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #define ADF4371_MAX_FREQ_PFD		250000000UL /* Hz */
71*4882a593Smuzhiyun #define ADF4371_MAX_FREQ_REFIN		600000000UL /* Hz */
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun /* MOD1 is a 24-bit primary modulus with fixed value of 2^25 */
74*4882a593Smuzhiyun #define ADF4371_MODULUS1		33554432ULL
75*4882a593Smuzhiyun /* MOD2 is the programmable, 14-bit auxiliary fractional modulus */
76*4882a593Smuzhiyun #define ADF4371_MAX_MODULUS2		BIT(14)
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun #define ADF4371_CHECK_RANGE(freq, range) \
79*4882a593Smuzhiyun 	((freq > ADF4371_MAX_ ## range) || (freq < ADF4371_MIN_ ## range))
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun enum {
82*4882a593Smuzhiyun 	ADF4371_FREQ,
83*4882a593Smuzhiyun 	ADF4371_POWER_DOWN,
84*4882a593Smuzhiyun 	ADF4371_CHANNEL_NAME
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun enum {
88*4882a593Smuzhiyun 	ADF4371_CH_RF8,
89*4882a593Smuzhiyun 	ADF4371_CH_RFAUX8,
90*4882a593Smuzhiyun 	ADF4371_CH_RF16,
91*4882a593Smuzhiyun 	ADF4371_CH_RF32
92*4882a593Smuzhiyun };
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun enum adf4371_variant {
95*4882a593Smuzhiyun 	ADF4371,
96*4882a593Smuzhiyun 	ADF4372
97*4882a593Smuzhiyun };
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun struct adf4371_pwrdown {
100*4882a593Smuzhiyun 	unsigned int reg;
101*4882a593Smuzhiyun 	unsigned int bit;
102*4882a593Smuzhiyun };
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun static const char * const adf4371_ch_names[] = {
105*4882a593Smuzhiyun 	"RF8x", "RFAUX8x", "RF16x", "RF32x"
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun static const struct adf4371_pwrdown adf4371_pwrdown_ch[4] = {
109*4882a593Smuzhiyun 	[ADF4371_CH_RF8] = { ADF4371_REG(0x25), 2 },
110*4882a593Smuzhiyun 	[ADF4371_CH_RFAUX8] = { ADF4371_REG(0x72), 3 },
111*4882a593Smuzhiyun 	[ADF4371_CH_RF16] = { ADF4371_REG(0x25), 3 },
112*4882a593Smuzhiyun 	[ADF4371_CH_RF32] = { ADF4371_REG(0x25), 4 },
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun static const struct reg_sequence adf4371_reg_defaults[] = {
116*4882a593Smuzhiyun 	{ ADF4371_REG(0x0),  0x18 },
117*4882a593Smuzhiyun 	{ ADF4371_REG(0x12), 0x40 },
118*4882a593Smuzhiyun 	{ ADF4371_REG(0x1E), 0x48 },
119*4882a593Smuzhiyun 	{ ADF4371_REG(0x20), 0x14 },
120*4882a593Smuzhiyun 	{ ADF4371_REG(0x22), 0x00 },
121*4882a593Smuzhiyun 	{ ADF4371_REG(0x23), 0x00 },
122*4882a593Smuzhiyun 	{ ADF4371_REG(0x24), 0x80 },
123*4882a593Smuzhiyun 	{ ADF4371_REG(0x25), 0x07 },
124*4882a593Smuzhiyun 	{ ADF4371_REG(0x27), 0xC5 },
125*4882a593Smuzhiyun 	{ ADF4371_REG(0x28), 0x83 },
126*4882a593Smuzhiyun 	{ ADF4371_REG(0x2C), 0x44 },
127*4882a593Smuzhiyun 	{ ADF4371_REG(0x2D), 0x11 },
128*4882a593Smuzhiyun 	{ ADF4371_REG(0x2E), 0x12 },
129*4882a593Smuzhiyun 	{ ADF4371_REG(0x2F), 0x94 },
130*4882a593Smuzhiyun 	{ ADF4371_REG(0x32), 0x04 },
131*4882a593Smuzhiyun 	{ ADF4371_REG(0x35), 0xFA },
132*4882a593Smuzhiyun 	{ ADF4371_REG(0x36), 0x30 },
133*4882a593Smuzhiyun 	{ ADF4371_REG(0x39), 0x07 },
134*4882a593Smuzhiyun 	{ ADF4371_REG(0x3A), 0x55 },
135*4882a593Smuzhiyun 	{ ADF4371_REG(0x3E), 0x0C },
136*4882a593Smuzhiyun 	{ ADF4371_REG(0x3F), 0x80 },
137*4882a593Smuzhiyun 	{ ADF4371_REG(0x40), 0x50 },
138*4882a593Smuzhiyun 	{ ADF4371_REG(0x41), 0x28 },
139*4882a593Smuzhiyun 	{ ADF4371_REG(0x47), 0xC0 },
140*4882a593Smuzhiyun 	{ ADF4371_REG(0x52), 0xF4 },
141*4882a593Smuzhiyun 	{ ADF4371_REG(0x70), 0x03 },
142*4882a593Smuzhiyun 	{ ADF4371_REG(0x71), 0x60 },
143*4882a593Smuzhiyun 	{ ADF4371_REG(0x72), 0x32 },
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun static const struct regmap_config adf4371_regmap_config = {
147*4882a593Smuzhiyun 	.reg_bits = 16,
148*4882a593Smuzhiyun 	.val_bits = 8,
149*4882a593Smuzhiyun 	.read_flag_mask = BIT(7),
150*4882a593Smuzhiyun };
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun struct adf4371_chip_info {
153*4882a593Smuzhiyun 	unsigned int num_channels;
154*4882a593Smuzhiyun 	const struct iio_chan_spec *channels;
155*4882a593Smuzhiyun };
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun struct adf4371_state {
158*4882a593Smuzhiyun 	struct spi_device *spi;
159*4882a593Smuzhiyun 	struct regmap *regmap;
160*4882a593Smuzhiyun 	struct clk *clkin;
161*4882a593Smuzhiyun 	/*
162*4882a593Smuzhiyun 	 * Lock for accessing device registers. Some operations require
163*4882a593Smuzhiyun 	 * multiple consecutive R/W operations, during which the device
164*4882a593Smuzhiyun 	 * shouldn't be interrupted. The buffers are also shared across
165*4882a593Smuzhiyun 	 * all operations so need to be protected on stand alone reads and
166*4882a593Smuzhiyun 	 * writes.
167*4882a593Smuzhiyun 	 */
168*4882a593Smuzhiyun 	struct mutex lock;
169*4882a593Smuzhiyun 	const struct adf4371_chip_info *chip_info;
170*4882a593Smuzhiyun 	unsigned long clkin_freq;
171*4882a593Smuzhiyun 	unsigned long fpfd;
172*4882a593Smuzhiyun 	unsigned int integer;
173*4882a593Smuzhiyun 	unsigned int fract1;
174*4882a593Smuzhiyun 	unsigned int fract2;
175*4882a593Smuzhiyun 	unsigned int mod2;
176*4882a593Smuzhiyun 	unsigned int rf_div_sel;
177*4882a593Smuzhiyun 	unsigned int ref_div_factor;
178*4882a593Smuzhiyun 	u8 buf[10] ____cacheline_aligned;
179*4882a593Smuzhiyun };
180*4882a593Smuzhiyun 
adf4371_pll_fract_n_get_rate(struct adf4371_state * st,u32 channel)181*4882a593Smuzhiyun static unsigned long long adf4371_pll_fract_n_get_rate(struct adf4371_state *st,
182*4882a593Smuzhiyun 						       u32 channel)
183*4882a593Smuzhiyun {
184*4882a593Smuzhiyun 	unsigned long long val, tmp;
185*4882a593Smuzhiyun 	unsigned int ref_div_sel;
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	val = (((u64)st->integer * ADF4371_MODULUS1) + st->fract1) * st->fpfd;
188*4882a593Smuzhiyun 	tmp = (u64)st->fract2 * st->fpfd;
189*4882a593Smuzhiyun 	do_div(tmp, st->mod2);
190*4882a593Smuzhiyun 	val += tmp + ADF4371_MODULUS1 / 2;
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	if (channel == ADF4371_CH_RF8 || channel == ADF4371_CH_RFAUX8)
193*4882a593Smuzhiyun 		ref_div_sel = st->rf_div_sel;
194*4882a593Smuzhiyun 	else
195*4882a593Smuzhiyun 		ref_div_sel = 0;
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	do_div(val, ADF4371_MODULUS1 * (1 << ref_div_sel));
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	if (channel == ADF4371_CH_RF16)
200*4882a593Smuzhiyun 		val <<= 1;
201*4882a593Smuzhiyun 	else if (channel == ADF4371_CH_RF32)
202*4882a593Smuzhiyun 		val <<= 2;
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	return val;
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun 
adf4371_pll_fract_n_compute(unsigned long long vco,unsigned long long pfd,unsigned int * integer,unsigned int * fract1,unsigned int * fract2,unsigned int * mod2)207*4882a593Smuzhiyun static void adf4371_pll_fract_n_compute(unsigned long long vco,
208*4882a593Smuzhiyun 				       unsigned long long pfd,
209*4882a593Smuzhiyun 				       unsigned int *integer,
210*4882a593Smuzhiyun 				       unsigned int *fract1,
211*4882a593Smuzhiyun 				       unsigned int *fract2,
212*4882a593Smuzhiyun 				       unsigned int *mod2)
213*4882a593Smuzhiyun {
214*4882a593Smuzhiyun 	unsigned long long tmp;
215*4882a593Smuzhiyun 	u32 gcd_div;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	tmp = do_div(vco, pfd);
218*4882a593Smuzhiyun 	tmp = tmp * ADF4371_MODULUS1;
219*4882a593Smuzhiyun 	*fract2 = do_div(tmp, pfd);
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun 	*integer = vco;
222*4882a593Smuzhiyun 	*fract1 = tmp;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	*mod2 = pfd;
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 	while (*mod2 > ADF4371_MAX_MODULUS2) {
227*4882a593Smuzhiyun 		*mod2 >>= 1;
228*4882a593Smuzhiyun 		*fract2 >>= 1;
229*4882a593Smuzhiyun 	}
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun 	gcd_div = gcd(*fract2, *mod2);
232*4882a593Smuzhiyun 	*mod2 /= gcd_div;
233*4882a593Smuzhiyun 	*fract2 /= gcd_div;
234*4882a593Smuzhiyun }
235*4882a593Smuzhiyun 
adf4371_set_freq(struct adf4371_state * st,unsigned long long freq,unsigned int channel)236*4882a593Smuzhiyun static int adf4371_set_freq(struct adf4371_state *st, unsigned long long freq,
237*4882a593Smuzhiyun 			    unsigned int channel)
238*4882a593Smuzhiyun {
239*4882a593Smuzhiyun 	u32 cp_bleed;
240*4882a593Smuzhiyun 	u8 int_mode = 0;
241*4882a593Smuzhiyun 	int ret;
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun 	switch (channel) {
244*4882a593Smuzhiyun 	case ADF4371_CH_RF8:
245*4882a593Smuzhiyun 	case ADF4371_CH_RFAUX8:
246*4882a593Smuzhiyun 		if (ADF4371_CHECK_RANGE(freq, OUT_RF8_FREQ))
247*4882a593Smuzhiyun 			return -EINVAL;
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun 		st->rf_div_sel = 0;
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 		while (freq < ADF4371_MIN_VCO_FREQ) {
252*4882a593Smuzhiyun 			freq <<= 1;
253*4882a593Smuzhiyun 			st->rf_div_sel++;
254*4882a593Smuzhiyun 		}
255*4882a593Smuzhiyun 		break;
256*4882a593Smuzhiyun 	case ADF4371_CH_RF16:
257*4882a593Smuzhiyun 		/* ADF4371 RF16 8000...16000 MHz */
258*4882a593Smuzhiyun 		if (ADF4371_CHECK_RANGE(freq, OUT_RF16_FREQ))
259*4882a593Smuzhiyun 			return -EINVAL;
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 		freq >>= 1;
262*4882a593Smuzhiyun 		break;
263*4882a593Smuzhiyun 	case ADF4371_CH_RF32:
264*4882a593Smuzhiyun 		/* ADF4371 RF32 16000...32000 MHz */
265*4882a593Smuzhiyun 		if (ADF4371_CHECK_RANGE(freq, OUT_RF32_FREQ))
266*4882a593Smuzhiyun 			return -EINVAL;
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 		freq >>= 2;
269*4882a593Smuzhiyun 		break;
270*4882a593Smuzhiyun 	default:
271*4882a593Smuzhiyun 		return -EINVAL;
272*4882a593Smuzhiyun 	}
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 	adf4371_pll_fract_n_compute(freq, st->fpfd, &st->integer, &st->fract1,
275*4882a593Smuzhiyun 				    &st->fract2, &st->mod2);
276*4882a593Smuzhiyun 	st->buf[0] = st->integer >> 8;
277*4882a593Smuzhiyun 	st->buf[1] = 0x40; /* REG12 default */
278*4882a593Smuzhiyun 	st->buf[2] = 0x00;
279*4882a593Smuzhiyun 	st->buf[3] = st->fract1 & 0xFF;
280*4882a593Smuzhiyun 	st->buf[4] = st->fract1 >> 8;
281*4882a593Smuzhiyun 	st->buf[5] = st->fract1 >> 16;
282*4882a593Smuzhiyun 	st->buf[6] = ADF4371_FRAC2WORD_L(st->fract2 & 0x7F) |
283*4882a593Smuzhiyun 		     ADF4371_FRAC1WORD(st->fract1 >> 24);
284*4882a593Smuzhiyun 	st->buf[7] = ADF4371_FRAC2WORD_H(st->fract2 >> 7);
285*4882a593Smuzhiyun 	st->buf[8] = st->mod2 & 0xFF;
286*4882a593Smuzhiyun 	st->buf[9] = ADF4371_MOD2WORD(st->mod2 >> 8);
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	ret = regmap_bulk_write(st->regmap, ADF4371_REG(0x11), st->buf, 10);
289*4882a593Smuzhiyun 	if (ret < 0)
290*4882a593Smuzhiyun 		return ret;
291*4882a593Smuzhiyun 	/*
292*4882a593Smuzhiyun 	 * The R counter allows the input reference frequency to be
293*4882a593Smuzhiyun 	 * divided down to produce the reference clock to the PFD
294*4882a593Smuzhiyun 	 */
295*4882a593Smuzhiyun 	ret = regmap_write(st->regmap, ADF4371_REG(0x1F), st->ref_div_factor);
296*4882a593Smuzhiyun 	if (ret < 0)
297*4882a593Smuzhiyun 		return ret;
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun 	ret = regmap_update_bits(st->regmap, ADF4371_REG(0x24),
300*4882a593Smuzhiyun 				 ADF4371_RF_DIV_SEL_MSK,
301*4882a593Smuzhiyun 				 ADF4371_RF_DIV_SEL(st->rf_div_sel));
302*4882a593Smuzhiyun 	if (ret < 0)
303*4882a593Smuzhiyun 		return ret;
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun 	cp_bleed = DIV_ROUND_UP(400 * 1750, st->integer * 375);
306*4882a593Smuzhiyun 	cp_bleed = clamp(cp_bleed, 1U, 255U);
307*4882a593Smuzhiyun 	ret = regmap_write(st->regmap, ADF4371_REG(0x26), cp_bleed);
308*4882a593Smuzhiyun 	if (ret < 0)
309*4882a593Smuzhiyun 		return ret;
310*4882a593Smuzhiyun 	/*
311*4882a593Smuzhiyun 	 * Set to 1 when in INT mode (when FRAC1 = FRAC2 = 0),
312*4882a593Smuzhiyun 	 * and set to 0 when in FRAC mode.
313*4882a593Smuzhiyun 	 */
314*4882a593Smuzhiyun 	if (st->fract1 == 0 && st->fract2 == 0)
315*4882a593Smuzhiyun 		int_mode = 0x01;
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 	ret = regmap_write(st->regmap, ADF4371_REG(0x2B), int_mode);
318*4882a593Smuzhiyun 	if (ret < 0)
319*4882a593Smuzhiyun 		return ret;
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 	return regmap_write(st->regmap, ADF4371_REG(0x10), st->integer & 0xFF);
322*4882a593Smuzhiyun }
323*4882a593Smuzhiyun 
adf4371_read(struct iio_dev * indio_dev,uintptr_t private,const struct iio_chan_spec * chan,char * buf)324*4882a593Smuzhiyun static ssize_t adf4371_read(struct iio_dev *indio_dev,
325*4882a593Smuzhiyun 			    uintptr_t private,
326*4882a593Smuzhiyun 			    const struct iio_chan_spec *chan,
327*4882a593Smuzhiyun 			    char *buf)
328*4882a593Smuzhiyun {
329*4882a593Smuzhiyun 	struct adf4371_state *st = iio_priv(indio_dev);
330*4882a593Smuzhiyun 	unsigned long long val = 0;
331*4882a593Smuzhiyun 	unsigned int readval, reg, bit;
332*4882a593Smuzhiyun 	int ret;
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 	switch ((u32)private) {
335*4882a593Smuzhiyun 	case ADF4371_FREQ:
336*4882a593Smuzhiyun 		val = adf4371_pll_fract_n_get_rate(st, chan->channel);
337*4882a593Smuzhiyun 		ret = regmap_read(st->regmap, ADF4371_REG(0x7C), &readval);
338*4882a593Smuzhiyun 		if (ret < 0)
339*4882a593Smuzhiyun 			break;
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 		if (readval == 0x00) {
342*4882a593Smuzhiyun 			dev_dbg(&st->spi->dev, "PLL un-locked\n");
343*4882a593Smuzhiyun 			ret = -EBUSY;
344*4882a593Smuzhiyun 		}
345*4882a593Smuzhiyun 		break;
346*4882a593Smuzhiyun 	case ADF4371_POWER_DOWN:
347*4882a593Smuzhiyun 		reg = adf4371_pwrdown_ch[chan->channel].reg;
348*4882a593Smuzhiyun 		bit = adf4371_pwrdown_ch[chan->channel].bit;
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun 		ret = regmap_read(st->regmap, reg, &readval);
351*4882a593Smuzhiyun 		if (ret < 0)
352*4882a593Smuzhiyun 			break;
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 		val = !(readval & BIT(bit));
355*4882a593Smuzhiyun 		break;
356*4882a593Smuzhiyun 	case ADF4371_CHANNEL_NAME:
357*4882a593Smuzhiyun 		return sprintf(buf, "%s\n", adf4371_ch_names[chan->channel]);
358*4882a593Smuzhiyun 	default:
359*4882a593Smuzhiyun 		ret = -EINVAL;
360*4882a593Smuzhiyun 		val = 0;
361*4882a593Smuzhiyun 		break;
362*4882a593Smuzhiyun 	}
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	return ret < 0 ? ret : sprintf(buf, "%llu\n", val);
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun 
adf4371_write(struct iio_dev * indio_dev,uintptr_t private,const struct iio_chan_spec * chan,const char * buf,size_t len)367*4882a593Smuzhiyun static ssize_t adf4371_write(struct iio_dev *indio_dev,
368*4882a593Smuzhiyun 			     uintptr_t private,
369*4882a593Smuzhiyun 			     const struct iio_chan_spec *chan,
370*4882a593Smuzhiyun 			     const char *buf, size_t len)
371*4882a593Smuzhiyun {
372*4882a593Smuzhiyun 	struct adf4371_state *st = iio_priv(indio_dev);
373*4882a593Smuzhiyun 	unsigned long long freq;
374*4882a593Smuzhiyun 	bool power_down;
375*4882a593Smuzhiyun 	unsigned int bit, readval, reg;
376*4882a593Smuzhiyun 	int ret;
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun 	mutex_lock(&st->lock);
379*4882a593Smuzhiyun 	switch ((u32)private) {
380*4882a593Smuzhiyun 	case ADF4371_FREQ:
381*4882a593Smuzhiyun 		ret = kstrtoull(buf, 10, &freq);
382*4882a593Smuzhiyun 		if (ret)
383*4882a593Smuzhiyun 			break;
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun 		ret = adf4371_set_freq(st, freq, chan->channel);
386*4882a593Smuzhiyun 		break;
387*4882a593Smuzhiyun 	case ADF4371_POWER_DOWN:
388*4882a593Smuzhiyun 		ret = kstrtobool(buf, &power_down);
389*4882a593Smuzhiyun 		if (ret)
390*4882a593Smuzhiyun 			break;
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 		reg = adf4371_pwrdown_ch[chan->channel].reg;
393*4882a593Smuzhiyun 		bit = adf4371_pwrdown_ch[chan->channel].bit;
394*4882a593Smuzhiyun 		ret = regmap_read(st->regmap, reg, &readval);
395*4882a593Smuzhiyun 		if (ret < 0)
396*4882a593Smuzhiyun 			break;
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 		readval &= ~BIT(bit);
399*4882a593Smuzhiyun 		readval |= (!power_down << bit);
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 		ret = regmap_write(st->regmap, reg, readval);
402*4882a593Smuzhiyun 		break;
403*4882a593Smuzhiyun 	default:
404*4882a593Smuzhiyun 		ret = -EINVAL;
405*4882a593Smuzhiyun 		break;
406*4882a593Smuzhiyun 	}
407*4882a593Smuzhiyun 	mutex_unlock(&st->lock);
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun 	return ret ? ret : len;
410*4882a593Smuzhiyun }
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun #define _ADF4371_EXT_INFO(_name, _ident) { \
413*4882a593Smuzhiyun 		.name = _name, \
414*4882a593Smuzhiyun 		.read = adf4371_read, \
415*4882a593Smuzhiyun 		.write = adf4371_write, \
416*4882a593Smuzhiyun 		.private = _ident, \
417*4882a593Smuzhiyun 		.shared = IIO_SEPARATE, \
418*4882a593Smuzhiyun }
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun static const struct iio_chan_spec_ext_info adf4371_ext_info[] = {
421*4882a593Smuzhiyun 	/*
422*4882a593Smuzhiyun 	 * Ideally we use IIO_CHAN_INFO_FREQUENCY, but there are
423*4882a593Smuzhiyun 	 * values > 2^32 in order to support the entire frequency range
424*4882a593Smuzhiyun 	 * in Hz. Using scale is a bit ugly.
425*4882a593Smuzhiyun 	 */
426*4882a593Smuzhiyun 	_ADF4371_EXT_INFO("frequency", ADF4371_FREQ),
427*4882a593Smuzhiyun 	_ADF4371_EXT_INFO("powerdown", ADF4371_POWER_DOWN),
428*4882a593Smuzhiyun 	_ADF4371_EXT_INFO("name", ADF4371_CHANNEL_NAME),
429*4882a593Smuzhiyun 	{ },
430*4882a593Smuzhiyun };
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun #define ADF4371_CHANNEL(index) { \
433*4882a593Smuzhiyun 		.type = IIO_ALTVOLTAGE, \
434*4882a593Smuzhiyun 		.output = 1, \
435*4882a593Smuzhiyun 		.channel = index, \
436*4882a593Smuzhiyun 		.ext_info = adf4371_ext_info, \
437*4882a593Smuzhiyun 		.indexed = 1, \
438*4882a593Smuzhiyun 	}
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun static const struct iio_chan_spec adf4371_chan[] = {
441*4882a593Smuzhiyun 	ADF4371_CHANNEL(ADF4371_CH_RF8),
442*4882a593Smuzhiyun 	ADF4371_CHANNEL(ADF4371_CH_RFAUX8),
443*4882a593Smuzhiyun 	ADF4371_CHANNEL(ADF4371_CH_RF16),
444*4882a593Smuzhiyun 	ADF4371_CHANNEL(ADF4371_CH_RF32),
445*4882a593Smuzhiyun };
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun static const struct adf4371_chip_info adf4371_chip_info[] = {
448*4882a593Smuzhiyun 	[ADF4371] = {
449*4882a593Smuzhiyun 		.channels = adf4371_chan,
450*4882a593Smuzhiyun 		.num_channels = 4,
451*4882a593Smuzhiyun 	},
452*4882a593Smuzhiyun 	[ADF4372] = {
453*4882a593Smuzhiyun 		.channels = adf4371_chan,
454*4882a593Smuzhiyun 		.num_channels = 3,
455*4882a593Smuzhiyun 	}
456*4882a593Smuzhiyun };
457*4882a593Smuzhiyun 
adf4371_reg_access(struct iio_dev * indio_dev,unsigned int reg,unsigned int writeval,unsigned int * readval)458*4882a593Smuzhiyun static int adf4371_reg_access(struct iio_dev *indio_dev,
459*4882a593Smuzhiyun 			      unsigned int reg,
460*4882a593Smuzhiyun 			      unsigned int writeval,
461*4882a593Smuzhiyun 			      unsigned int *readval)
462*4882a593Smuzhiyun {
463*4882a593Smuzhiyun 	struct adf4371_state *st = iio_priv(indio_dev);
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun 	if (readval)
466*4882a593Smuzhiyun 		return regmap_read(st->regmap, reg, readval);
467*4882a593Smuzhiyun 	else
468*4882a593Smuzhiyun 		return regmap_write(st->regmap, reg, writeval);
469*4882a593Smuzhiyun }
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun static const struct iio_info adf4371_info = {
472*4882a593Smuzhiyun 	.debugfs_reg_access = &adf4371_reg_access,
473*4882a593Smuzhiyun };
474*4882a593Smuzhiyun 
adf4371_setup(struct adf4371_state * st)475*4882a593Smuzhiyun static int adf4371_setup(struct adf4371_state *st)
476*4882a593Smuzhiyun {
477*4882a593Smuzhiyun 	unsigned int synth_timeout = 2, timeout = 1, vco_alc_timeout = 1;
478*4882a593Smuzhiyun 	unsigned int vco_band_div, tmp;
479*4882a593Smuzhiyun 	int ret;
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun 	/* Perform a software reset */
482*4882a593Smuzhiyun 	ret = regmap_write(st->regmap, ADF4371_REG(0x0), ADF4371_RESET_CMD);
483*4882a593Smuzhiyun 	if (ret < 0)
484*4882a593Smuzhiyun 		return ret;
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun 	ret = regmap_multi_reg_write(st->regmap, adf4371_reg_defaults,
487*4882a593Smuzhiyun 				     ARRAY_SIZE(adf4371_reg_defaults));
488*4882a593Smuzhiyun 	if (ret < 0)
489*4882a593Smuzhiyun 		return ret;
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun 	/* Mute to Lock Detect */
492*4882a593Smuzhiyun 	if (device_property_read_bool(&st->spi->dev, "adi,mute-till-lock-en")) {
493*4882a593Smuzhiyun 		ret = regmap_update_bits(st->regmap, ADF4371_REG(0x25),
494*4882a593Smuzhiyun 					 ADF4371_MUTE_LD_MSK,
495*4882a593Smuzhiyun 					 ADF4371_MUTE_LD(1));
496*4882a593Smuzhiyun 		if (ret < 0)
497*4882a593Smuzhiyun 			return ret;
498*4882a593Smuzhiyun 	}
499*4882a593Smuzhiyun 
500*4882a593Smuzhiyun 	/* Set address in ascending order, so the bulk_write() will work */
501*4882a593Smuzhiyun 	ret = regmap_update_bits(st->regmap, ADF4371_REG(0x0),
502*4882a593Smuzhiyun 				 ADF4371_ADDR_ASC_MSK | ADF4371_ADDR_ASC_R_MSK,
503*4882a593Smuzhiyun 				 ADF4371_ADDR_ASC(1) | ADF4371_ADDR_ASC_R(1));
504*4882a593Smuzhiyun 	if (ret < 0)
505*4882a593Smuzhiyun 		return ret;
506*4882a593Smuzhiyun 	/*
507*4882a593Smuzhiyun 	 * Calculate and maximize PFD frequency
508*4882a593Smuzhiyun 	 * fPFD = REFIN × ((1 + D)/(R × (1 + T)))
509*4882a593Smuzhiyun 	 * Where D is the REFIN doubler bit, T is the reference divide by 2,
510*4882a593Smuzhiyun 	 * R is the reference division factor
511*4882a593Smuzhiyun 	 * TODO: it is assumed D and T equal 0.
512*4882a593Smuzhiyun 	 */
513*4882a593Smuzhiyun 	do {
514*4882a593Smuzhiyun 		st->ref_div_factor++;
515*4882a593Smuzhiyun 		st->fpfd = st->clkin_freq / st->ref_div_factor;
516*4882a593Smuzhiyun 	} while (st->fpfd > ADF4371_MAX_FREQ_PFD);
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun 	/* Calculate Timeouts */
519*4882a593Smuzhiyun 	vco_band_div = DIV_ROUND_UP(st->fpfd, 2400000U);
520*4882a593Smuzhiyun 
521*4882a593Smuzhiyun 	tmp = DIV_ROUND_CLOSEST(st->fpfd, 1000000U);
522*4882a593Smuzhiyun 	do {
523*4882a593Smuzhiyun 		timeout++;
524*4882a593Smuzhiyun 		if (timeout > 1023) {
525*4882a593Smuzhiyun 			timeout = 2;
526*4882a593Smuzhiyun 			synth_timeout++;
527*4882a593Smuzhiyun 		}
528*4882a593Smuzhiyun 	} while (synth_timeout * 1024 + timeout <= 20 * tmp);
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun 	do {
531*4882a593Smuzhiyun 		vco_alc_timeout++;
532*4882a593Smuzhiyun 	} while (vco_alc_timeout * 1024 - timeout <= 50 * tmp);
533*4882a593Smuzhiyun 
534*4882a593Smuzhiyun 	st->buf[0] = vco_band_div;
535*4882a593Smuzhiyun 	st->buf[1] = timeout & 0xFF;
536*4882a593Smuzhiyun 	st->buf[2] = ADF4371_TIMEOUT(timeout >> 8) | 0x04;
537*4882a593Smuzhiyun 	st->buf[3] = synth_timeout;
538*4882a593Smuzhiyun 	st->buf[4] = ADF4371_VCO_ALC_TOUT(vco_alc_timeout);
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 	return regmap_bulk_write(st->regmap, ADF4371_REG(0x30), st->buf, 5);
541*4882a593Smuzhiyun }
542*4882a593Smuzhiyun 
adf4371_clk_disable(void * data)543*4882a593Smuzhiyun static void adf4371_clk_disable(void *data)
544*4882a593Smuzhiyun {
545*4882a593Smuzhiyun 	struct adf4371_state *st = data;
546*4882a593Smuzhiyun 
547*4882a593Smuzhiyun 	clk_disable_unprepare(st->clkin);
548*4882a593Smuzhiyun }
549*4882a593Smuzhiyun 
adf4371_probe(struct spi_device * spi)550*4882a593Smuzhiyun static int adf4371_probe(struct spi_device *spi)
551*4882a593Smuzhiyun {
552*4882a593Smuzhiyun 	const struct spi_device_id *id = spi_get_device_id(spi);
553*4882a593Smuzhiyun 	struct iio_dev *indio_dev;
554*4882a593Smuzhiyun 	struct adf4371_state *st;
555*4882a593Smuzhiyun 	struct regmap *regmap;
556*4882a593Smuzhiyun 	int ret;
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun 	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
559*4882a593Smuzhiyun 	if (!indio_dev)
560*4882a593Smuzhiyun 		return -ENOMEM;
561*4882a593Smuzhiyun 
562*4882a593Smuzhiyun 	regmap = devm_regmap_init_spi(spi, &adf4371_regmap_config);
563*4882a593Smuzhiyun 	if (IS_ERR(regmap)) {
564*4882a593Smuzhiyun 		dev_err(&spi->dev, "Error initializing spi regmap: %ld\n",
565*4882a593Smuzhiyun 			PTR_ERR(regmap));
566*4882a593Smuzhiyun 		return PTR_ERR(regmap);
567*4882a593Smuzhiyun 	}
568*4882a593Smuzhiyun 
569*4882a593Smuzhiyun 	st = iio_priv(indio_dev);
570*4882a593Smuzhiyun 	spi_set_drvdata(spi, indio_dev);
571*4882a593Smuzhiyun 	st->spi = spi;
572*4882a593Smuzhiyun 	st->regmap = regmap;
573*4882a593Smuzhiyun 	mutex_init(&st->lock);
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun 	st->chip_info = &adf4371_chip_info[id->driver_data];
576*4882a593Smuzhiyun 	indio_dev->name = id->name;
577*4882a593Smuzhiyun 	indio_dev->info = &adf4371_info;
578*4882a593Smuzhiyun 	indio_dev->modes = INDIO_DIRECT_MODE;
579*4882a593Smuzhiyun 	indio_dev->channels = st->chip_info->channels;
580*4882a593Smuzhiyun 	indio_dev->num_channels = st->chip_info->num_channels;
581*4882a593Smuzhiyun 
582*4882a593Smuzhiyun 	st->clkin = devm_clk_get(&spi->dev, "clkin");
583*4882a593Smuzhiyun 	if (IS_ERR(st->clkin))
584*4882a593Smuzhiyun 		return PTR_ERR(st->clkin);
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun 	ret = clk_prepare_enable(st->clkin);
587*4882a593Smuzhiyun 	if (ret < 0)
588*4882a593Smuzhiyun 		return ret;
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun 	ret = devm_add_action_or_reset(&spi->dev, adf4371_clk_disable, st);
591*4882a593Smuzhiyun 	if (ret)
592*4882a593Smuzhiyun 		return ret;
593*4882a593Smuzhiyun 
594*4882a593Smuzhiyun 	st->clkin_freq = clk_get_rate(st->clkin);
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun 	ret = adf4371_setup(st);
597*4882a593Smuzhiyun 	if (ret < 0) {
598*4882a593Smuzhiyun 		dev_err(&spi->dev, "ADF4371 setup failed\n");
599*4882a593Smuzhiyun 		return ret;
600*4882a593Smuzhiyun 	}
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun 	return devm_iio_device_register(&spi->dev, indio_dev);
603*4882a593Smuzhiyun }
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun static const struct spi_device_id adf4371_id_table[] = {
606*4882a593Smuzhiyun 	{ "adf4371", ADF4371 },
607*4882a593Smuzhiyun 	{ "adf4372", ADF4372 },
608*4882a593Smuzhiyun 	{}
609*4882a593Smuzhiyun };
610*4882a593Smuzhiyun MODULE_DEVICE_TABLE(spi, adf4371_id_table);
611*4882a593Smuzhiyun 
612*4882a593Smuzhiyun static const struct of_device_id adf4371_of_match[] = {
613*4882a593Smuzhiyun 	{ .compatible = "adi,adf4371" },
614*4882a593Smuzhiyun 	{ .compatible = "adi,adf4372" },
615*4882a593Smuzhiyun 	{ },
616*4882a593Smuzhiyun };
617*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, adf4371_of_match);
618*4882a593Smuzhiyun 
619*4882a593Smuzhiyun static struct spi_driver adf4371_driver = {
620*4882a593Smuzhiyun 	.driver = {
621*4882a593Smuzhiyun 		.name = "adf4371",
622*4882a593Smuzhiyun 		.of_match_table = adf4371_of_match,
623*4882a593Smuzhiyun 	},
624*4882a593Smuzhiyun 	.probe = adf4371_probe,
625*4882a593Smuzhiyun 	.id_table = adf4371_id_table,
626*4882a593Smuzhiyun };
627*4882a593Smuzhiyun module_spi_driver(adf4371_driver);
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");
630*4882a593Smuzhiyun MODULE_DESCRIPTION("Analog Devices ADF4371 SPI PLL");
631*4882a593Smuzhiyun MODULE_LICENSE("GPL");
632