Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/dpll/zl3073x/core.c
50620 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
3
#include <linux/array_size.h>
4
#include <linux/bitfield.h>
5
#include <linux/bits.h>
6
#include <linux/dev_printk.h>
7
#include <linux/device.h>
8
#include <linux/export.h>
9
#include <linux/math64.h>
10
#include <linux/module.h>
11
#include <linux/netlink.h>
12
#include <linux/regmap.h>
13
#include <linux/sprintf.h>
14
#include <linux/string_choices.h>
15
#include <linux/unaligned.h>
16
#include <net/devlink.h>
17
18
#include "core.h"
19
#include "devlink.h"
20
#include "dpll.h"
21
#include "regs.h"
22
23
/* Chip IDs for zl30731 */
24
static const u16 zl30731_ids[] = {
25
0x0E93,
26
0x1E93,
27
0x2E93,
28
};
29
30
const struct zl3073x_chip_info zl30731_chip_info = {
31
.ids = zl30731_ids,
32
.num_ids = ARRAY_SIZE(zl30731_ids),
33
.num_channels = 1,
34
};
35
EXPORT_SYMBOL_NS_GPL(zl30731_chip_info, "ZL3073X");
36
37
/* Chip IDs for zl30732 */
38
static const u16 zl30732_ids[] = {
39
0x0E30,
40
0x0E94,
41
0x1E94,
42
0x1F60,
43
0x2E94,
44
0x3FC4,
45
};
46
47
const struct zl3073x_chip_info zl30732_chip_info = {
48
.ids = zl30732_ids,
49
.num_ids = ARRAY_SIZE(zl30732_ids),
50
.num_channels = 2,
51
};
52
EXPORT_SYMBOL_NS_GPL(zl30732_chip_info, "ZL3073X");
53
54
/* Chip IDs for zl30733 */
55
static const u16 zl30733_ids[] = {
56
0x0E95,
57
0x1E95,
58
0x2E95,
59
};
60
61
const struct zl3073x_chip_info zl30733_chip_info = {
62
.ids = zl30733_ids,
63
.num_ids = ARRAY_SIZE(zl30733_ids),
64
.num_channels = 3,
65
};
66
EXPORT_SYMBOL_NS_GPL(zl30733_chip_info, "ZL3073X");
67
68
/* Chip IDs for zl30734 */
69
static const u16 zl30734_ids[] = {
70
0x0E96,
71
0x1E96,
72
0x2E96,
73
};
74
75
const struct zl3073x_chip_info zl30734_chip_info = {
76
.ids = zl30734_ids,
77
.num_ids = ARRAY_SIZE(zl30734_ids),
78
.num_channels = 4,
79
};
80
EXPORT_SYMBOL_NS_GPL(zl30734_chip_info, "ZL3073X");
81
82
/* Chip IDs for zl30735 */
83
static const u16 zl30735_ids[] = {
84
0x0E97,
85
0x1E97,
86
0x2E97,
87
};
88
89
const struct zl3073x_chip_info zl30735_chip_info = {
90
.ids = zl30735_ids,
91
.num_ids = ARRAY_SIZE(zl30735_ids),
92
.num_channels = 5,
93
};
94
EXPORT_SYMBOL_NS_GPL(zl30735_chip_info, "ZL3073X");
95
96
#define ZL_RANGE_OFFSET 0x80
97
#define ZL_PAGE_SIZE 0x80
98
#define ZL_NUM_PAGES 256
99
#define ZL_PAGE_SEL 0x7F
100
#define ZL_PAGE_SEL_MASK GENMASK(7, 0)
101
#define ZL_NUM_REGS (ZL_NUM_PAGES * ZL_PAGE_SIZE)
102
103
/* Regmap range configuration */
104
static const struct regmap_range_cfg zl3073x_regmap_range = {
105
.range_min = ZL_RANGE_OFFSET,
106
.range_max = ZL_RANGE_OFFSET + ZL_NUM_REGS - 1,
107
.selector_reg = ZL_PAGE_SEL,
108
.selector_mask = ZL_PAGE_SEL_MASK,
109
.selector_shift = 0,
110
.window_start = 0,
111
.window_len = ZL_PAGE_SIZE,
112
};
113
114
static bool
115
zl3073x_is_volatile_reg(struct device *dev __maybe_unused, unsigned int reg)
116
{
117
/* Only page selector is non-volatile */
118
return reg != ZL_PAGE_SEL;
119
}
120
121
const struct regmap_config zl3073x_regmap_config = {
122
.reg_bits = 8,
123
.val_bits = 8,
124
.max_register = ZL_RANGE_OFFSET + ZL_NUM_REGS - 1,
125
.ranges = &zl3073x_regmap_range,
126
.num_ranges = 1,
127
.cache_type = REGCACHE_MAPLE,
128
.volatile_reg = zl3073x_is_volatile_reg,
129
};
130
EXPORT_SYMBOL_NS_GPL(zl3073x_regmap_config, "ZL3073X");
131
132
static bool
133
zl3073x_check_reg(struct zl3073x_dev *zldev, unsigned int reg, size_t size)
134
{
135
/* Check that multiop lock is held when accessing registers
136
* from page 10 and above except the page 255 that does not
137
* need this protection.
138
*/
139
if (ZL_REG_PAGE(reg) >= 10 && ZL_REG_PAGE(reg) < 255)
140
lockdep_assert_held(&zldev->multiop_lock);
141
142
/* Check the index is in valid range for indexed register */
143
if (ZL_REG_OFFSET(reg) > ZL_REG_MAX_OFFSET(reg)) {
144
dev_err(zldev->dev, "Index out of range for reg 0x%04lx\n",
145
ZL_REG_ADDR(reg));
146
return false;
147
}
148
/* Check the requested size corresponds to register size */
149
if (ZL_REG_SIZE(reg) != size) {
150
dev_err(zldev->dev, "Invalid size %zu for reg 0x%04lx\n",
151
size, ZL_REG_ADDR(reg));
152
return false;
153
}
154
155
return true;
156
}
157
158
static int
159
zl3073x_read_reg(struct zl3073x_dev *zldev, unsigned int reg, void *val,
160
size_t size)
161
{
162
int rc;
163
164
if (!zl3073x_check_reg(zldev, reg, size))
165
return -EINVAL;
166
167
/* Map the register address to virtual range */
168
reg = ZL_REG_ADDR(reg) + ZL_RANGE_OFFSET;
169
170
rc = regmap_bulk_read(zldev->regmap, reg, val, size);
171
if (rc) {
172
dev_err(zldev->dev, "Failed to read reg 0x%04x: %pe\n", reg,
173
ERR_PTR(rc));
174
return rc;
175
}
176
177
return 0;
178
}
179
180
static int
181
zl3073x_write_reg(struct zl3073x_dev *zldev, unsigned int reg, const void *val,
182
size_t size)
183
{
184
int rc;
185
186
if (!zl3073x_check_reg(zldev, reg, size))
187
return -EINVAL;
188
189
/* Map the register address to virtual range */
190
reg = ZL_REG_ADDR(reg) + ZL_RANGE_OFFSET;
191
192
rc = regmap_bulk_write(zldev->regmap, reg, val, size);
193
if (rc) {
194
dev_err(zldev->dev, "Failed to write reg 0x%04x: %pe\n", reg,
195
ERR_PTR(rc));
196
return rc;
197
}
198
199
return 0;
200
}
201
202
/**
203
* zl3073x_read_u8 - read value from 8bit register
204
* @zldev: zl3073x device pointer
205
* @reg: register to write to
206
* @val: value to write
207
*
208
* Reads value from given 8bit register.
209
*
210
* Returns: 0 on success, <0 on error
211
*/
212
int zl3073x_read_u8(struct zl3073x_dev *zldev, unsigned int reg, u8 *val)
213
{
214
return zl3073x_read_reg(zldev, reg, val, sizeof(*val));
215
}
216
217
/**
218
* zl3073x_write_u8 - write value to 16bit register
219
* @zldev: zl3073x device pointer
220
* @reg: register to write to
221
* @val: value to write
222
*
223
* Writes value into given 8bit register.
224
*
225
* Returns: 0 on success, <0 on error
226
*/
227
int zl3073x_write_u8(struct zl3073x_dev *zldev, unsigned int reg, u8 val)
228
{
229
return zl3073x_write_reg(zldev, reg, &val, sizeof(val));
230
}
231
232
/**
233
* zl3073x_read_u16 - read value from 16bit register
234
* @zldev: zl3073x device pointer
235
* @reg: register to write to
236
* @val: value to write
237
*
238
* Reads value from given 16bit register.
239
*
240
* Returns: 0 on success, <0 on error
241
*/
242
int zl3073x_read_u16(struct zl3073x_dev *zldev, unsigned int reg, u16 *val)
243
{
244
int rc;
245
246
rc = zl3073x_read_reg(zldev, reg, val, sizeof(*val));
247
if (!rc)
248
be16_to_cpus(val);
249
250
return rc;
251
}
252
253
/**
254
* zl3073x_write_u16 - write value to 16bit register
255
* @zldev: zl3073x device pointer
256
* @reg: register to write to
257
* @val: value to write
258
*
259
* Writes value into given 16bit register.
260
*
261
* Returns: 0 on success, <0 on error
262
*/
263
int zl3073x_write_u16(struct zl3073x_dev *zldev, unsigned int reg, u16 val)
264
{
265
cpu_to_be16s(&val);
266
267
return zl3073x_write_reg(zldev, reg, &val, sizeof(val));
268
}
269
270
/**
271
* zl3073x_read_u32 - read value from 32bit register
272
* @zldev: zl3073x device pointer
273
* @reg: register to write to
274
* @val: value to write
275
*
276
* Reads value from given 32bit register.
277
*
278
* Returns: 0 on success, <0 on error
279
*/
280
int zl3073x_read_u32(struct zl3073x_dev *zldev, unsigned int reg, u32 *val)
281
{
282
int rc;
283
284
rc = zl3073x_read_reg(zldev, reg, val, sizeof(*val));
285
if (!rc)
286
be32_to_cpus(val);
287
288
return rc;
289
}
290
291
/**
292
* zl3073x_write_u32 - write value to 32bit register
293
* @zldev: zl3073x device pointer
294
* @reg: register to write to
295
* @val: value to write
296
*
297
* Writes value into given 32bit register.
298
*
299
* Returns: 0 on success, <0 on error
300
*/
301
int zl3073x_write_u32(struct zl3073x_dev *zldev, unsigned int reg, u32 val)
302
{
303
cpu_to_be32s(&val);
304
305
return zl3073x_write_reg(zldev, reg, &val, sizeof(val));
306
}
307
308
/**
309
* zl3073x_read_u48 - read value from 48bit register
310
* @zldev: zl3073x device pointer
311
* @reg: register to write to
312
* @val: value to write
313
*
314
* Reads value from given 48bit register.
315
*
316
* Returns: 0 on success, <0 on error
317
*/
318
int zl3073x_read_u48(struct zl3073x_dev *zldev, unsigned int reg, u64 *val)
319
{
320
u8 buf[6];
321
int rc;
322
323
rc = zl3073x_read_reg(zldev, reg, buf, sizeof(buf));
324
if (!rc)
325
*val = get_unaligned_be48(buf);
326
327
return rc;
328
}
329
330
/**
331
* zl3073x_write_u48 - write value to 48bit register
332
* @zldev: zl3073x device pointer
333
* @reg: register to write to
334
* @val: value to write
335
*
336
* Writes value into given 48bit register.
337
* The value must be from the interval -S48_MIN to U48_MAX.
338
*
339
* Returns: 0 on success, <0 on error
340
*/
341
int zl3073x_write_u48(struct zl3073x_dev *zldev, unsigned int reg, u64 val)
342
{
343
u8 buf[6];
344
345
/* Check the value belongs to <S48_MIN, U48_MAX>
346
* Any value >= S48_MIN has bits 47..63 set.
347
*/
348
if (val > GENMASK_ULL(47, 0) && val < GENMASK_ULL(63, 47)) {
349
dev_err(zldev->dev, "Value 0x%0llx out of range\n", val);
350
return -EINVAL;
351
}
352
353
put_unaligned_be48(val, buf);
354
355
return zl3073x_write_reg(zldev, reg, buf, sizeof(buf));
356
}
357
358
/**
359
* zl3073x_poll_zero_u8 - wait for register to be cleared by device
360
* @zldev: zl3073x device pointer
361
* @reg: register to poll (has to be 8bit register)
362
* @mask: bit mask for polling
363
*
364
* Waits for bits specified by @mask in register @reg value to be cleared
365
* by the device.
366
*
367
* Returns: 0 on success, <0 on error
368
*/
369
int zl3073x_poll_zero_u8(struct zl3073x_dev *zldev, unsigned int reg, u8 mask)
370
{
371
/* Register polling sleep & timeout */
372
#define ZL_POLL_SLEEP_US 10
373
#define ZL_POLL_TIMEOUT_US 2000000
374
unsigned int val;
375
376
/* Check the register is 8bit */
377
if (ZL_REG_SIZE(reg) != 1) {
378
dev_err(zldev->dev, "Invalid reg 0x%04lx size for polling\n",
379
ZL_REG_ADDR(reg));
380
return -EINVAL;
381
}
382
383
/* Map the register address to virtual range */
384
reg = ZL_REG_ADDR(reg) + ZL_RANGE_OFFSET;
385
386
return regmap_read_poll_timeout(zldev->regmap, reg, val, !(val & mask),
387
ZL_POLL_SLEEP_US, ZL_POLL_TIMEOUT_US);
388
}
389
390
int zl3073x_mb_op(struct zl3073x_dev *zldev, unsigned int op_reg, u8 op_val,
391
unsigned int mask_reg, u16 mask_val)
392
{
393
int rc;
394
395
/* Set mask for the operation */
396
rc = zl3073x_write_u16(zldev, mask_reg, mask_val);
397
if (rc)
398
return rc;
399
400
/* Trigger the operation */
401
rc = zl3073x_write_u8(zldev, op_reg, op_val);
402
if (rc)
403
return rc;
404
405
/* Wait for the operation to actually finish */
406
return zl3073x_poll_zero_u8(zldev, op_reg, op_val);
407
}
408
409
/**
410
* zl3073x_do_hwreg_op - Perform HW register read/write operation
411
* @zldev: zl3073x device pointer
412
* @op: operation to perform
413
*
414
* Performs requested operation and waits for its completion.
415
*
416
* Return: 0 on success, <0 on error
417
*/
418
static int
419
zl3073x_do_hwreg_op(struct zl3073x_dev *zldev, u8 op)
420
{
421
int rc;
422
423
/* Set requested operation and set pending bit */
424
rc = zl3073x_write_u8(zldev, ZL_REG_HWREG_OP, op | ZL_HWREG_OP_PENDING);
425
if (rc)
426
return rc;
427
428
/* Poll for completion - pending bit cleared */
429
return zl3073x_poll_zero_u8(zldev, ZL_REG_HWREG_OP,
430
ZL_HWREG_OP_PENDING);
431
}
432
433
/**
434
* zl3073x_read_hwreg - Read HW register
435
* @zldev: zl3073x device pointer
436
* @addr: HW register address
437
* @value: Value of the HW register
438
*
439
* Reads HW register value and stores it into @value.
440
*
441
* Return: 0 on success, <0 on error
442
*/
443
int zl3073x_read_hwreg(struct zl3073x_dev *zldev, u32 addr, u32 *value)
444
{
445
int rc;
446
447
/* Set address to read data from */
448
rc = zl3073x_write_u32(zldev, ZL_REG_HWREG_ADDR, addr);
449
if (rc)
450
return rc;
451
452
/* Perform the read operation */
453
rc = zl3073x_do_hwreg_op(zldev, ZL_HWREG_OP_READ);
454
if (rc)
455
return rc;
456
457
/* Read the received data */
458
return zl3073x_read_u32(zldev, ZL_REG_HWREG_READ_DATA, value);
459
}
460
461
/**
462
* zl3073x_write_hwreg - Write value to HW register
463
* @zldev: zl3073x device pointer
464
* @addr: HW registers address
465
* @value: Value to be written to HW register
466
*
467
* Stores the requested value into HW register.
468
*
469
* Return: 0 on success, <0 on error
470
*/
471
int zl3073x_write_hwreg(struct zl3073x_dev *zldev, u32 addr, u32 value)
472
{
473
int rc;
474
475
/* Set address to write data to */
476
rc = zl3073x_write_u32(zldev, ZL_REG_HWREG_ADDR, addr);
477
if (rc)
478
return rc;
479
480
/* Set data to be written */
481
rc = zl3073x_write_u32(zldev, ZL_REG_HWREG_WRITE_DATA, value);
482
if (rc)
483
return rc;
484
485
/* Perform the write operation */
486
return zl3073x_do_hwreg_op(zldev, ZL_HWREG_OP_WRITE);
487
}
488
489
/**
490
* zl3073x_update_hwreg - Update certain bits in HW register
491
* @zldev: zl3073x device pointer
492
* @addr: HW register address
493
* @value: Value to be written into HW register
494
* @mask: Bitmask indicating bits to be updated
495
*
496
* Reads given HW register, updates requested bits specified by value and
497
* mask and writes result back to HW register.
498
*
499
* Return: 0 on success, <0 on error
500
*/
501
int zl3073x_update_hwreg(struct zl3073x_dev *zldev, u32 addr, u32 value,
502
u32 mask)
503
{
504
u32 tmp;
505
int rc;
506
507
rc = zl3073x_read_hwreg(zldev, addr, &tmp);
508
if (rc)
509
return rc;
510
511
tmp &= ~mask;
512
tmp |= value & mask;
513
514
return zl3073x_write_hwreg(zldev, addr, tmp);
515
}
516
517
/**
518
* zl3073x_write_hwreg_seq - Write HW registers sequence
519
* @zldev: pointer to device structure
520
* @seq: pointer to first sequence item
521
* @num_items: number of items in sequence
522
*
523
* Writes given HW registers sequence.
524
*
525
* Return: 0 on success, <0 on error
526
*/
527
int zl3073x_write_hwreg_seq(struct zl3073x_dev *zldev,
528
const struct zl3073x_hwreg_seq_item *seq,
529
size_t num_items)
530
{
531
int i, rc = 0;
532
533
for (i = 0; i < num_items; i++) {
534
dev_dbg(zldev->dev, "Write 0x%0x [0x%0x] to 0x%0x",
535
seq[i].value, seq[i].mask, seq[i].addr);
536
537
if (seq[i].mask == U32_MAX)
538
/* Write value directly */
539
rc = zl3073x_write_hwreg(zldev, seq[i].addr,
540
seq[i].value);
541
else
542
/* Update only bits specified by the mask */
543
rc = zl3073x_update_hwreg(zldev, seq[i].addr,
544
seq[i].value, seq[i].mask);
545
if (rc)
546
return rc;
547
548
if (seq->wait)
549
msleep(seq->wait);
550
}
551
552
return rc;
553
}
554
555
static int
556
zl3073x_dev_state_fetch(struct zl3073x_dev *zldev)
557
{
558
int rc;
559
u8 i;
560
561
for (i = 0; i < ZL3073X_NUM_REFS; i++) {
562
rc = zl3073x_ref_state_fetch(zldev, i);
563
if (rc) {
564
dev_err(zldev->dev,
565
"Failed to fetch input state: %pe\n",
566
ERR_PTR(rc));
567
return rc;
568
}
569
}
570
571
for (i = 0; i < ZL3073X_NUM_SYNTHS; i++) {
572
rc = zl3073x_synth_state_fetch(zldev, i);
573
if (rc) {
574
dev_err(zldev->dev,
575
"Failed to fetch synth state: %pe\n",
576
ERR_PTR(rc));
577
return rc;
578
}
579
}
580
581
for (i = 0; i < ZL3073X_NUM_OUTS; i++) {
582
rc = zl3073x_out_state_fetch(zldev, i);
583
if (rc) {
584
dev_err(zldev->dev,
585
"Failed to fetch output state: %pe\n",
586
ERR_PTR(rc));
587
return rc;
588
}
589
}
590
591
return rc;
592
}
593
594
static void
595
zl3073x_dev_ref_status_update(struct zl3073x_dev *zldev)
596
{
597
int i, rc;
598
599
for (i = 0; i < ZL3073X_NUM_REFS; i++) {
600
rc = zl3073x_read_u8(zldev, ZL_REG_REF_MON_STATUS(i),
601
&zldev->ref[i].mon_status);
602
if (rc)
603
dev_warn(zldev->dev,
604
"Failed to get REF%u status: %pe\n", i,
605
ERR_PTR(rc));
606
}
607
}
608
609
/**
610
* zl3073x_ref_phase_offsets_update - update reference phase offsets
611
* @zldev: pointer to zl3073x_dev structure
612
* @channel: DPLL channel number or -1
613
*
614
* The function asks device to update phase offsets latch registers with
615
* the latest measured values. There are 2 sets of latch registers:
616
*
617
* 1) Up to 5 DPLL-to-connected-ref registers that contain phase offset
618
* values between particular DPLL channel and its *connected* input
619
* reference.
620
*
621
* 2) 10 selected-DPLL-to-all-ref registers that contain phase offset values
622
* between selected DPLL channel and all input references.
623
*
624
* If the caller is interested in 2) then it has to pass DPLL channel number
625
* in @channel parameter. If it is interested only in 1) then it should pass
626
* @channel parameter with value of -1.
627
*
628
* Return: 0 on success, <0 on error
629
*/
630
int zl3073x_ref_phase_offsets_update(struct zl3073x_dev *zldev, int channel)
631
{
632
int rc;
633
634
/* Per datasheet we have to wait for 'dpll_ref_phase_err_rqst_rd'
635
* to be zero to ensure that the measured data are coherent.
636
*/
637
rc = zl3073x_poll_zero_u8(zldev, ZL_REG_REF_PHASE_ERR_READ_RQST,
638
ZL_REF_PHASE_ERR_READ_RQST_RD);
639
if (rc)
640
return rc;
641
642
/* Select DPLL channel if it is specified */
643
if (channel != -1) {
644
rc = zl3073x_write_u8(zldev, ZL_REG_DPLL_MEAS_IDX, channel);
645
if (rc)
646
return rc;
647
}
648
649
/* Request to update phase offsets measurement values */
650
rc = zl3073x_write_u8(zldev, ZL_REG_REF_PHASE_ERR_READ_RQST,
651
ZL_REF_PHASE_ERR_READ_RQST_RD);
652
if (rc)
653
return rc;
654
655
/* Wait for finish */
656
return zl3073x_poll_zero_u8(zldev, ZL_REG_REF_PHASE_ERR_READ_RQST,
657
ZL_REF_PHASE_ERR_READ_RQST_RD);
658
}
659
660
/**
661
* zl3073x_ref_ffo_update - update reference fractional frequency offsets
662
* @zldev: pointer to zl3073x_dev structure
663
*
664
* The function asks device to update fractional frequency offsets latch
665
* registers the latest measured values, reads and stores them into
666
*
667
* Return: 0 on success, <0 on error
668
*/
669
static int
670
zl3073x_ref_ffo_update(struct zl3073x_dev *zldev)
671
{
672
int i, rc;
673
674
/* Per datasheet we have to wait for 'ref_freq_meas_ctrl' to be zero
675
* to ensure that the measured data are coherent.
676
*/
677
rc = zl3073x_poll_zero_u8(zldev, ZL_REG_REF_FREQ_MEAS_CTRL,
678
ZL_REF_FREQ_MEAS_CTRL);
679
if (rc)
680
return rc;
681
682
/* Select all references for measurement */
683
rc = zl3073x_write_u8(zldev, ZL_REG_REF_FREQ_MEAS_MASK_3_0,
684
GENMASK(7, 0)); /* REF0P..REF3N */
685
if (rc)
686
return rc;
687
rc = zl3073x_write_u8(zldev, ZL_REG_REF_FREQ_MEAS_MASK_4,
688
GENMASK(1, 0)); /* REF4P..REF4N */
689
if (rc)
690
return rc;
691
692
/* Request frequency offset measurement */
693
rc = zl3073x_write_u8(zldev, ZL_REG_REF_FREQ_MEAS_CTRL,
694
ZL_REF_FREQ_MEAS_CTRL_REF_FREQ_OFF);
695
if (rc)
696
return rc;
697
698
/* Wait for finish */
699
rc = zl3073x_poll_zero_u8(zldev, ZL_REG_REF_FREQ_MEAS_CTRL,
700
ZL_REF_FREQ_MEAS_CTRL);
701
if (rc)
702
return rc;
703
704
/* Read DPLL-to-REFx frequency offset measurements */
705
for (i = 0; i < ZL3073X_NUM_REFS; i++) {
706
s32 value;
707
708
/* Read value stored in units of 2^-32 signed */
709
rc = zl3073x_read_u32(zldev, ZL_REG_REF_FREQ(i), &value);
710
if (rc)
711
return rc;
712
713
/* Convert to ppm -> ffo = (10^6 * value) / 2^32 */
714
zldev->ref[i].ffo = mul_s64_u64_shr(value, 1000000, 32);
715
}
716
717
return 0;
718
}
719
720
static void
721
zl3073x_dev_periodic_work(struct kthread_work *work)
722
{
723
struct zl3073x_dev *zldev = container_of(work, struct zl3073x_dev,
724
work.work);
725
struct zl3073x_dpll *zldpll;
726
int rc;
727
728
/* Update input references status */
729
zl3073x_dev_ref_status_update(zldev);
730
731
/* Update DPLL-to-connected-ref phase offsets registers */
732
rc = zl3073x_ref_phase_offsets_update(zldev, -1);
733
if (rc)
734
dev_warn(zldev->dev, "Failed to update phase offsets: %pe\n",
735
ERR_PTR(rc));
736
737
/* Update references' fractional frequency offsets */
738
rc = zl3073x_ref_ffo_update(zldev);
739
if (rc)
740
dev_warn(zldev->dev,
741
"Failed to update fractional frequency offsets: %pe\n",
742
ERR_PTR(rc));
743
744
list_for_each_entry(zldpll, &zldev->dplls, list)
745
zl3073x_dpll_changes_check(zldpll);
746
747
/* Run twice a second */
748
kthread_queue_delayed_work(zldev->kworker, &zldev->work,
749
msecs_to_jiffies(500));
750
}
751
752
int zl3073x_dev_phase_avg_factor_set(struct zl3073x_dev *zldev, u8 factor)
753
{
754
u8 dpll_meas_ctrl, value;
755
int rc;
756
757
/* Read DPLL phase measurement control register */
758
rc = zl3073x_read_u8(zldev, ZL_REG_DPLL_MEAS_CTRL, &dpll_meas_ctrl);
759
if (rc)
760
return rc;
761
762
/* Convert requested factor to register value */
763
value = (factor + 1) & 0x0f;
764
765
/* Update phase measurement control register */
766
dpll_meas_ctrl &= ~ZL_DPLL_MEAS_CTRL_AVG_FACTOR;
767
dpll_meas_ctrl |= FIELD_PREP(ZL_DPLL_MEAS_CTRL_AVG_FACTOR, value);
768
rc = zl3073x_write_u8(zldev, ZL_REG_DPLL_MEAS_CTRL, dpll_meas_ctrl);
769
if (rc)
770
return rc;
771
772
/* Save the new factor */
773
zldev->phase_avg_factor = factor;
774
775
return 0;
776
}
777
778
/**
779
* zl3073x_dev_phase_meas_setup - setup phase offset measurement
780
* @zldev: pointer to zl3073x_dev structure
781
*
782
* Enable phase offset measurement block, set measurement averaging factor
783
* and enable DPLL-to-its-ref phase measurement for all DPLLs.
784
*
785
* Returns: 0 on success, <0 on error
786
*/
787
static int
788
zl3073x_dev_phase_meas_setup(struct zl3073x_dev *zldev)
789
{
790
struct zl3073x_dpll *zldpll;
791
u8 dpll_meas_ctrl, mask = 0;
792
int rc;
793
794
/* Setup phase measurement averaging factor */
795
rc = zl3073x_dev_phase_avg_factor_set(zldev, zldev->phase_avg_factor);
796
if (rc)
797
return rc;
798
799
/* Read DPLL phase measurement control register */
800
rc = zl3073x_read_u8(zldev, ZL_REG_DPLL_MEAS_CTRL, &dpll_meas_ctrl);
801
if (rc)
802
return rc;
803
804
/* Enable DPLL measurement block */
805
dpll_meas_ctrl |= ZL_DPLL_MEAS_CTRL_EN;
806
807
/* Update phase measurement control register */
808
rc = zl3073x_write_u8(zldev, ZL_REG_DPLL_MEAS_CTRL, dpll_meas_ctrl);
809
if (rc)
810
return rc;
811
812
/* Enable DPLL-to-connected-ref measurement for each channel */
813
list_for_each_entry(zldpll, &zldev->dplls, list)
814
mask |= BIT(zldpll->id);
815
816
return zl3073x_write_u8(zldev, ZL_REG_DPLL_PHASE_ERR_READ_MASK, mask);
817
}
818
819
/**
820
* zl3073x_dev_start - Start normal operation
821
* @zldev: zl3073x device pointer
822
* @full: perform full initialization
823
*
824
* The function starts normal operation, which means registering all DPLLs and
825
* their pins, and starting monitoring. If full initialization is requested,
826
* the function additionally initializes the phase offset measurement block and
827
* fetches hardware-invariant parameters.
828
*
829
* Return: 0 on success, <0 on error
830
*/
831
int zl3073x_dev_start(struct zl3073x_dev *zldev, bool full)
832
{
833
struct zl3073x_dpll *zldpll;
834
u8 info;
835
int rc;
836
837
rc = zl3073x_read_u8(zldev, ZL_REG_INFO, &info);
838
if (rc) {
839
dev_err(zldev->dev, "Failed to read device status info\n");
840
return rc;
841
}
842
843
if (!FIELD_GET(ZL_INFO_READY, info)) {
844
/* The ready bit indicates that the firmware was successfully
845
* configured and is ready for normal operation. If it is
846
* cleared then the configuration stored in flash is wrong
847
* or missing. In this situation the driver will expose
848
* only devlink interface to give an opportunity to flash
849
* the correct config.
850
*/
851
dev_info(zldev->dev,
852
"FW not fully ready - missing or corrupted config\n");
853
854
return 0;
855
}
856
857
if (full) {
858
/* Fetch device state */
859
rc = zl3073x_dev_state_fetch(zldev);
860
if (rc)
861
return rc;
862
863
/* Setup phase offset measurement block */
864
rc = zl3073x_dev_phase_meas_setup(zldev);
865
if (rc) {
866
dev_err(zldev->dev,
867
"Failed to setup phase measurement\n");
868
return rc;
869
}
870
}
871
872
/* Register all DPLLs */
873
list_for_each_entry(zldpll, &zldev->dplls, list) {
874
rc = zl3073x_dpll_register(zldpll);
875
if (rc) {
876
dev_err_probe(zldev->dev, rc,
877
"Failed to register DPLL%u\n",
878
zldpll->id);
879
return rc;
880
}
881
}
882
883
/* Perform initial firmware fine phase correction */
884
rc = zl3073x_dpll_init_fine_phase_adjust(zldev);
885
if (rc) {
886
dev_err_probe(zldev->dev, rc,
887
"Failed to init fine phase correction\n");
888
return rc;
889
}
890
891
/* Start monitoring */
892
kthread_queue_delayed_work(zldev->kworker, &zldev->work, 0);
893
894
return 0;
895
}
896
897
/**
898
* zl3073x_dev_stop - Stop normal operation
899
* @zldev: zl3073x device pointer
900
*
901
* The function stops the normal operation that mean deregistration of all
902
* DPLLs and their pins and stop monitoring.
903
*
904
* Return: 0 on success, <0 on error
905
*/
906
void zl3073x_dev_stop(struct zl3073x_dev *zldev)
907
{
908
struct zl3073x_dpll *zldpll;
909
910
/* Stop monitoring */
911
kthread_cancel_delayed_work_sync(&zldev->work);
912
913
/* Unregister all DPLLs */
914
list_for_each_entry(zldpll, &zldev->dplls, list) {
915
if (zldpll->dpll_dev)
916
zl3073x_dpll_unregister(zldpll);
917
}
918
}
919
920
static void zl3073x_dev_dpll_fini(void *ptr)
921
{
922
struct zl3073x_dpll *zldpll, *next;
923
struct zl3073x_dev *zldev = ptr;
924
925
/* Stop monitoring and unregister DPLLs */
926
zl3073x_dev_stop(zldev);
927
928
/* Destroy monitoring thread */
929
if (zldev->kworker) {
930
kthread_destroy_worker(zldev->kworker);
931
zldev->kworker = NULL;
932
}
933
934
/* Free all DPLLs */
935
list_for_each_entry_safe(zldpll, next, &zldev->dplls, list) {
936
list_del(&zldpll->list);
937
zl3073x_dpll_free(zldpll);
938
}
939
}
940
941
static int
942
zl3073x_devm_dpll_init(struct zl3073x_dev *zldev, u8 num_dplls)
943
{
944
struct kthread_worker *kworker;
945
struct zl3073x_dpll *zldpll;
946
unsigned int i;
947
int rc;
948
949
INIT_LIST_HEAD(&zldev->dplls);
950
951
/* Allocate all DPLLs */
952
for (i = 0; i < num_dplls; i++) {
953
zldpll = zl3073x_dpll_alloc(zldev, i);
954
if (IS_ERR(zldpll)) {
955
dev_err_probe(zldev->dev, PTR_ERR(zldpll),
956
"Failed to alloc DPLL%u\n", i);
957
rc = PTR_ERR(zldpll);
958
goto error;
959
}
960
961
list_add_tail(&zldpll->list, &zldev->dplls);
962
}
963
964
/* Initialize monitoring thread */
965
kthread_init_delayed_work(&zldev->work, zl3073x_dev_periodic_work);
966
kworker = kthread_run_worker(0, "zl3073x-%s", dev_name(zldev->dev));
967
if (IS_ERR(kworker)) {
968
rc = PTR_ERR(kworker);
969
goto error;
970
}
971
zldev->kworker = kworker;
972
973
/* Start normal operation */
974
rc = zl3073x_dev_start(zldev, true);
975
if (rc) {
976
dev_err_probe(zldev->dev, rc, "Failed to start device\n");
977
goto error;
978
}
979
980
/* Add devres action to release DPLL related resources */
981
rc = devm_add_action_or_reset(zldev->dev, zl3073x_dev_dpll_fini, zldev);
982
if (rc)
983
goto error;
984
985
return 0;
986
987
error:
988
zl3073x_dev_dpll_fini(zldev);
989
990
return rc;
991
}
992
993
/**
994
* zl3073x_dev_probe - initialize zl3073x device
995
* @zldev: pointer to zl3073x device
996
* @chip_info: chip info based on compatible
997
*
998
* Common initialization of zl3073x device structure.
999
*
1000
* Returns: 0 on success, <0 on error
1001
*/
1002
int zl3073x_dev_probe(struct zl3073x_dev *zldev,
1003
const struct zl3073x_chip_info *chip_info)
1004
{
1005
u16 id, revision, fw_ver;
1006
unsigned int i;
1007
u32 cfg_ver;
1008
int rc;
1009
1010
/* Read chip ID */
1011
rc = zl3073x_read_u16(zldev, ZL_REG_ID, &id);
1012
if (rc)
1013
return rc;
1014
1015
/* Check it matches */
1016
for (i = 0; i < chip_info->num_ids; i++) {
1017
if (id == chip_info->ids[i])
1018
break;
1019
}
1020
1021
if (i == chip_info->num_ids) {
1022
return dev_err_probe(zldev->dev, -ENODEV,
1023
"Unknown or non-match chip ID: 0x%0x\n",
1024
id);
1025
}
1026
1027
/* Read revision, firmware version and custom config version */
1028
rc = zl3073x_read_u16(zldev, ZL_REG_REVISION, &revision);
1029
if (rc)
1030
return rc;
1031
rc = zl3073x_read_u16(zldev, ZL_REG_FW_VER, &fw_ver);
1032
if (rc)
1033
return rc;
1034
rc = zl3073x_read_u32(zldev, ZL_REG_CUSTOM_CONFIG_VER, &cfg_ver);
1035
if (rc)
1036
return rc;
1037
1038
dev_dbg(zldev->dev, "ChipID(%X), ChipRev(%X), FwVer(%u)\n", id,
1039
revision, fw_ver);
1040
dev_dbg(zldev->dev, "Custom config version: %lu.%lu.%lu.%lu\n",
1041
FIELD_GET(GENMASK(31, 24), cfg_ver),
1042
FIELD_GET(GENMASK(23, 16), cfg_ver),
1043
FIELD_GET(GENMASK(15, 8), cfg_ver),
1044
FIELD_GET(GENMASK(7, 0), cfg_ver));
1045
1046
/* Generate random clock ID as the device has not such property that
1047
* could be used for this purpose. A user can later change this value
1048
* using devlink.
1049
*/
1050
zldev->clock_id = get_random_u64();
1051
1052
/* Default phase offset averaging factor */
1053
zldev->phase_avg_factor = 2;
1054
1055
/* Initialize mutex for operations where multiple reads, writes
1056
* and/or polls are required to be done atomically.
1057
*/
1058
rc = devm_mutex_init(zldev->dev, &zldev->multiop_lock);
1059
if (rc)
1060
return dev_err_probe(zldev->dev, rc,
1061
"Failed to initialize mutex\n");
1062
1063
/* Register DPLL channels */
1064
rc = zl3073x_devm_dpll_init(zldev, chip_info->num_channels);
1065
if (rc)
1066
return rc;
1067
1068
/* Register the devlink instance and parameters */
1069
rc = zl3073x_devlink_register(zldev);
1070
if (rc)
1071
return dev_err_probe(zldev->dev, rc,
1072
"Failed to register devlink instance\n");
1073
1074
return 0;
1075
}
1076
EXPORT_SYMBOL_NS_GPL(zl3073x_dev_probe, "ZL3073X");
1077
1078
MODULE_AUTHOR("Ivan Vecera <[email protected]>");
1079
MODULE_DESCRIPTION("Microchip ZL3073x core driver");
1080
MODULE_LICENSE("GPL");
1081
1082