Merge tag 'for-5.11/dm-changes' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / ptp / ptp_clockmatrix.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * PTP hardware clock driver for the IDT ClockMatrix(TM) family of timing and
4  * synchronization devices.
5  *
6  * Copyright (C) 2019 Integrated Device Technology, Inc., a Renesas Company.
7  */
8 #include <linux/firmware.h>
9 #include <linux/i2c.h>
10 #include <linux/module.h>
11 #include <linux/ptp_clock_kernel.h>
12 #include <linux/delay.h>
13 #include <linux/jiffies.h>
14 #include <linux/kernel.h>
15 #include <linux/timekeeping.h>
16 #include <linux/string.h>
17
18 #include "ptp_private.h"
19 #include "ptp_clockmatrix.h"
20
21 MODULE_DESCRIPTION("Driver for IDT ClockMatrix(TM) family");
22 MODULE_AUTHOR("Richard Cochran <richardcochran@gmail.com>");
23 MODULE_AUTHOR("IDT support-1588 <IDT-support-1588@lm.renesas.com>");
24 MODULE_VERSION("1.0");
25 MODULE_LICENSE("GPL");
26
27 /*
28  * The name of the firmware file to be loaded
29  * over-rides any automatic selection
30  */
31 static char *firmware;
32 module_param(firmware, charp, 0);
33
34 #define SETTIME_CORRECTION (0)
35
36 static int contains_full_configuration(const struct firmware *fw)
37 {
38         s32 full_count = FULL_FW_CFG_BYTES - FULL_FW_CFG_SKIPPED_BYTES;
39         struct idtcm_fwrc *rec = (struct idtcm_fwrc *)fw->data;
40         s32 count = 0;
41         u16 regaddr;
42         u8 loaddr;
43         s32 len;
44
45         /* If the firmware contains 'full configuration' SM_RESET can be used
46          * to ensure proper configuration.
47          *
48          * Full configuration is defined as the number of programmable
49          * bytes within the configuration range minus page offset addr range.
50          */
51         for (len = fw->size; len > 0; len -= sizeof(*rec)) {
52                 regaddr = rec->hiaddr << 8;
53                 regaddr |= rec->loaddr;
54
55                 loaddr = rec->loaddr;
56
57                 rec++;
58
59                 /* Top (status registers) and bottom are read-only */
60                 if (regaddr < GPIO_USER_CONTROL || regaddr >= SCRATCH)
61                         continue;
62
63                 /* Page size 128, last 4 bytes of page skipped */
64                 if ((loaddr > 0x7b && loaddr <= 0x7f) || loaddr > 0xfb)
65                         continue;
66
67                 count++;
68         }
69
70         return (count >= full_count);
71 }
72
73 static int char_array_to_timespec(u8 *buf,
74                                   u8 count,
75                                   struct timespec64 *ts)
76 {
77         u8 i;
78         u64 nsec;
79         time64_t sec;
80
81         if (count < TOD_BYTE_COUNT)
82                 return 1;
83
84         /* Sub-nanoseconds are in buf[0]. */
85         nsec = buf[4];
86         for (i = 0; i < 3; i++) {
87                 nsec <<= 8;
88                 nsec |= buf[3 - i];
89         }
90
91         sec = buf[10];
92         for (i = 0; i < 5; i++) {
93                 sec <<= 8;
94                 sec |= buf[9 - i];
95         }
96
97         ts->tv_sec = sec;
98         ts->tv_nsec = nsec;
99
100         return 0;
101 }
102
103 static int timespec_to_char_array(struct timespec64 const *ts,
104                                   u8 *buf,
105                                   u8 count)
106 {
107         u8 i;
108         s32 nsec;
109         time64_t sec;
110
111         if (count < TOD_BYTE_COUNT)
112                 return 1;
113
114         nsec = ts->tv_nsec;
115         sec = ts->tv_sec;
116
117         /* Sub-nanoseconds are in buf[0]. */
118         buf[0] = 0;
119         for (i = 1; i < 5; i++) {
120                 buf[i] = nsec & 0xff;
121                 nsec >>= 8;
122         }
123
124         for (i = 5; i < TOD_BYTE_COUNT; i++) {
125
126                 buf[i] = sec & 0xff;
127                 sec >>= 8;
128         }
129
130         return 0;
131 }
132
133 static int idtcm_strverscmp(const char *version1, const char *version2)
134 {
135         u8 ver1[3], ver2[3];
136         int i;
137
138         if (sscanf(version1, "%hhu.%hhu.%hhu",
139                    &ver1[0], &ver1[1], &ver1[2]) != 3)
140                 return -1;
141         if (sscanf(version2, "%hhu.%hhu.%hhu",
142                    &ver2[0], &ver2[1], &ver2[2]) != 3)
143                 return -1;
144
145         for (i = 0; i < 3; i++) {
146                 if (ver1[i] > ver2[i])
147                         return 1;
148                 if (ver1[i] < ver2[i])
149                         return -1;
150         }
151
152         return 0;
153 }
154
155 static int idtcm_xfer_read(struct idtcm *idtcm,
156                            u8 regaddr,
157                            u8 *buf,
158                            u16 count)
159 {
160         struct i2c_client *client = idtcm->client;
161         struct i2c_msg msg[2];
162         int cnt;
163         char *fmt = "i2c_transfer failed at %d in %s, at addr: %04X!\n";
164
165         msg[0].addr = client->addr;
166         msg[0].flags = 0;
167         msg[0].len = 1;
168         msg[0].buf = &regaddr;
169
170         msg[1].addr = client->addr;
171         msg[1].flags = I2C_M_RD;
172         msg[1].len = count;
173         msg[1].buf = buf;
174
175         cnt = i2c_transfer(client->adapter, msg, 2);
176
177         if (cnt < 0) {
178                 dev_err(&client->dev,
179                         fmt,
180                         __LINE__,
181                         __func__,
182                         regaddr);
183                 return cnt;
184         } else if (cnt != 2) {
185                 dev_err(&client->dev,
186                         "i2c_transfer sent only %d of %d messages\n", cnt, 2);
187                 return -EIO;
188         }
189
190         return 0;
191 }
192
193 static int idtcm_xfer_write(struct idtcm *idtcm,
194                             u8 regaddr,
195                             u8 *buf,
196                             u16 count)
197 {
198         struct i2c_client *client = idtcm->client;
199         /* we add 1 byte for device register */
200         u8 msg[IDTCM_MAX_WRITE_COUNT + 1];
201         int cnt;
202         char *fmt = "i2c_master_send failed at %d in %s, at addr: %04X!\n";
203
204         if (count > IDTCM_MAX_WRITE_COUNT)
205                 return -EINVAL;
206
207         msg[0] = regaddr;
208         memcpy(&msg[1], buf, count);
209
210         cnt = i2c_master_send(client, msg, count + 1);
211
212         if (cnt < 0) {
213                 dev_err(&client->dev,
214                         fmt,
215                         __LINE__,
216                         __func__,
217                         regaddr);
218                 return cnt;
219         }
220
221         return 0;
222 }
223
224 static int idtcm_page_offset(struct idtcm *idtcm, u8 val)
225 {
226         u8 buf[4];
227         int err;
228
229         if (idtcm->page_offset == val)
230                 return 0;
231
232         buf[0] = 0x0;
233         buf[1] = val;
234         buf[2] = 0x10;
235         buf[3] = 0x20;
236
237         err = idtcm_xfer_write(idtcm, PAGE_ADDR, buf, sizeof(buf));
238
239         if (err) {
240                 idtcm->page_offset = 0xff;
241                 dev_err(&idtcm->client->dev, "failed to set page offset\n");
242         } else {
243                 idtcm->page_offset = val;
244         }
245
246         return err;
247 }
248
249 static int _idtcm_rdwr(struct idtcm *idtcm,
250                        u16 regaddr,
251                        u8 *buf,
252                        u16 count,
253                        bool write)
254 {
255         u8 hi;
256         u8 lo;
257         int err;
258
259         hi = (regaddr >> 8) & 0xff;
260         lo = regaddr & 0xff;
261
262         err = idtcm_page_offset(idtcm, hi);
263
264         if (err)
265                 return err;
266
267         if (write)
268                 return idtcm_xfer_write(idtcm, lo, buf, count);
269
270         return idtcm_xfer_read(idtcm, lo, buf, count);
271 }
272
273 static int idtcm_read(struct idtcm *idtcm,
274                       u16 module,
275                       u16 regaddr,
276                       u8 *buf,
277                       u16 count)
278 {
279         return _idtcm_rdwr(idtcm, module + regaddr, buf, count, false);
280 }
281
282 static int idtcm_write(struct idtcm *idtcm,
283                        u16 module,
284                        u16 regaddr,
285                        u8 *buf,
286                        u16 count)
287 {
288         return _idtcm_rdwr(idtcm, module + regaddr, buf, count, true);
289 }
290
291 static int clear_boot_status(struct idtcm *idtcm)
292 {
293         int err;
294         u8 buf[4] = {0};
295
296         err = idtcm_write(idtcm, GENERAL_STATUS, BOOT_STATUS, buf, sizeof(buf));
297
298         return err;
299 }
300
301 static int read_boot_status(struct idtcm *idtcm, u32 *status)
302 {
303         int err;
304         u8 buf[4] = {0};
305
306         err = idtcm_read(idtcm, GENERAL_STATUS, BOOT_STATUS, buf, sizeof(buf));
307
308         *status = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
309
310         return err;
311 }
312
313 static int wait_for_boot_status_ready(struct idtcm *idtcm)
314 {
315         u32 status = 0;
316         u8 i = 30;      /* 30 * 100ms = 3s */
317         int err;
318
319         do {
320                 err = read_boot_status(idtcm, &status);
321
322                 if (err)
323                         return err;
324
325                 if (status == 0xA0)
326                         return 0;
327
328                 msleep(100);
329                 i--;
330
331         } while (i);
332
333         dev_warn(&idtcm->client->dev, "%s timed out\n", __func__);
334
335         return -EBUSY;
336 }
337
338 static int _idtcm_gettime(struct idtcm_channel *channel,
339                           struct timespec64 *ts)
340 {
341         struct idtcm *idtcm = channel->idtcm;
342         u8 buf[TOD_BYTE_COUNT];
343         u8 timeout = 10;
344         u8 trigger;
345         int err;
346
347         err = idtcm_read(idtcm, channel->tod_read_primary,
348                          TOD_READ_PRIMARY_CMD, &trigger, sizeof(trigger));
349         if (err)
350                 return err;
351
352         trigger &= ~(TOD_READ_TRIGGER_MASK << TOD_READ_TRIGGER_SHIFT);
353         trigger |= (1 << TOD_READ_TRIGGER_SHIFT);
354         trigger &= ~TOD_READ_TRIGGER_MODE; /* single shot */
355
356         err = idtcm_write(idtcm, channel->tod_read_primary,
357                           TOD_READ_PRIMARY_CMD, &trigger, sizeof(trigger));
358         if (err)
359                 return err;
360
361         /* wait trigger to be 0 */
362         while (trigger & TOD_READ_TRIGGER_MASK) {
363
364                 if (idtcm->calculate_overhead_flag)
365                         idtcm->start_time = ktime_get_raw();
366
367                 err = idtcm_read(idtcm, channel->tod_read_primary,
368                                  TOD_READ_PRIMARY_CMD, &trigger,
369                                  sizeof(trigger));
370
371                 if (err)
372                         return err;
373
374                 if (--timeout == 0)
375                         return -EIO;
376         }
377
378         err = idtcm_read(idtcm, channel->tod_read_primary,
379                          TOD_READ_PRIMARY, buf, sizeof(buf));
380
381         if (err)
382                 return err;
383
384         err = char_array_to_timespec(buf, sizeof(buf), ts);
385
386         return err;
387 }
388
389 static int _sync_pll_output(struct idtcm *idtcm,
390                             u8 pll,
391                             u8 sync_src,
392                             u8 qn,
393                             u8 qn_plus_1)
394 {
395         int err;
396         u8 val;
397         u16 sync_ctrl0;
398         u16 sync_ctrl1;
399         u8 temp;
400
401         if ((qn == 0) && (qn_plus_1 == 0))
402                 return 0;
403
404         switch (pll) {
405         case 0:
406                 sync_ctrl0 = HW_Q0_Q1_CH_SYNC_CTRL_0;
407                 sync_ctrl1 = HW_Q0_Q1_CH_SYNC_CTRL_1;
408                 break;
409         case 1:
410                 sync_ctrl0 = HW_Q2_Q3_CH_SYNC_CTRL_0;
411                 sync_ctrl1 = HW_Q2_Q3_CH_SYNC_CTRL_1;
412                 break;
413         case 2:
414                 sync_ctrl0 = HW_Q4_Q5_CH_SYNC_CTRL_0;
415                 sync_ctrl1 = HW_Q4_Q5_CH_SYNC_CTRL_1;
416                 break;
417         case 3:
418                 sync_ctrl0 = HW_Q6_Q7_CH_SYNC_CTRL_0;
419                 sync_ctrl1 = HW_Q6_Q7_CH_SYNC_CTRL_1;
420                 break;
421         case 4:
422                 sync_ctrl0 = HW_Q8_CH_SYNC_CTRL_0;
423                 sync_ctrl1 = HW_Q8_CH_SYNC_CTRL_1;
424                 break;
425         case 5:
426                 sync_ctrl0 = HW_Q9_CH_SYNC_CTRL_0;
427                 sync_ctrl1 = HW_Q9_CH_SYNC_CTRL_1;
428                 break;
429         case 6:
430                 sync_ctrl0 = HW_Q10_CH_SYNC_CTRL_0;
431                 sync_ctrl1 = HW_Q10_CH_SYNC_CTRL_1;
432                 break;
433         case 7:
434                 sync_ctrl0 = HW_Q11_CH_SYNC_CTRL_0;
435                 sync_ctrl1 = HW_Q11_CH_SYNC_CTRL_1;
436                 break;
437         default:
438                 return -EINVAL;
439         }
440
441         val = SYNCTRL1_MASTER_SYNC_RST;
442
443         /* Place master sync in reset */
444         err = idtcm_write(idtcm, 0, sync_ctrl1, &val, sizeof(val));
445         if (err)
446                 return err;
447
448         err = idtcm_write(idtcm, 0, sync_ctrl0, &sync_src, sizeof(sync_src));
449         if (err)
450                 return err;
451
452         /* Set sync trigger mask */
453         val |= SYNCTRL1_FBDIV_FRAME_SYNC_TRIG | SYNCTRL1_FBDIV_SYNC_TRIG;
454
455         if (qn)
456                 val |= SYNCTRL1_Q0_DIV_SYNC_TRIG;
457
458         if (qn_plus_1)
459                 val |= SYNCTRL1_Q1_DIV_SYNC_TRIG;
460
461         err = idtcm_write(idtcm, 0, sync_ctrl1, &val, sizeof(val));
462         if (err)
463                 return err;
464
465         /* PLL5 can have OUT8 as second additional output. */
466         if ((pll == 5) && (qn_plus_1 != 0)) {
467                 err = idtcm_read(idtcm, 0, HW_Q8_CTRL_SPARE,
468                                  &temp, sizeof(temp));
469                 if (err)
470                         return err;
471
472                 temp &= ~(Q9_TO_Q8_SYNC_TRIG);
473
474                 err = idtcm_write(idtcm, 0, HW_Q8_CTRL_SPARE,
475                                   &temp, sizeof(temp));
476                 if (err)
477                         return err;
478
479                 temp |= Q9_TO_Q8_SYNC_TRIG;
480
481                 err = idtcm_write(idtcm, 0, HW_Q8_CTRL_SPARE,
482                                   &temp, sizeof(temp));
483                 if (err)
484                         return err;
485         }
486
487         /* PLL6 can have OUT11 as second additional output. */
488         if ((pll == 6) && (qn_plus_1 != 0)) {
489                 err = idtcm_read(idtcm, 0, HW_Q11_CTRL_SPARE,
490                                  &temp, sizeof(temp));
491                 if (err)
492                         return err;
493
494                 temp &= ~(Q10_TO_Q11_SYNC_TRIG);
495
496                 err = idtcm_write(idtcm, 0, HW_Q11_CTRL_SPARE,
497                                   &temp, sizeof(temp));
498                 if (err)
499                         return err;
500
501                 temp |= Q10_TO_Q11_SYNC_TRIG;
502
503                 err = idtcm_write(idtcm, 0, HW_Q11_CTRL_SPARE,
504                                   &temp, sizeof(temp));
505                 if (err)
506                         return err;
507         }
508
509         /* Place master sync out of reset */
510         val &= ~(SYNCTRL1_MASTER_SYNC_RST);
511         err = idtcm_write(idtcm, 0, sync_ctrl1, &val, sizeof(val));
512
513         return err;
514 }
515
516 static int sync_source_dpll_tod_pps(u16 tod_addr, u8 *sync_src)
517 {
518         int err = 0;
519
520         switch (tod_addr) {
521         case TOD_0:
522                 *sync_src = SYNC_SOURCE_DPLL0_TOD_PPS;
523                 break;
524         case TOD_1:
525                 *sync_src = SYNC_SOURCE_DPLL1_TOD_PPS;
526                 break;
527         case TOD_2:
528                 *sync_src = SYNC_SOURCE_DPLL2_TOD_PPS;
529                 break;
530         case TOD_3:
531                 *sync_src = SYNC_SOURCE_DPLL3_TOD_PPS;
532                 break;
533         default:
534                 err = -EINVAL;
535         }
536
537         return err;
538 }
539
540 static int idtcm_sync_pps_output(struct idtcm_channel *channel)
541 {
542         struct idtcm *idtcm = channel->idtcm;
543
544         u8 pll;
545         u8 sync_src;
546         u8 qn;
547         u8 qn_plus_1;
548         int err = 0;
549         u8 out8_mux = 0;
550         u8 out11_mux = 0;
551         u8 temp;
552
553         u16 output_mask = channel->output_mask;
554
555         err = sync_source_dpll_tod_pps(channel->tod_n, &sync_src);
556         if (err)
557                 return err;
558
559         err = idtcm_read(idtcm, 0, HW_Q8_CTRL_SPARE,
560                          &temp, sizeof(temp));
561         if (err)
562                 return err;
563
564         if ((temp & Q9_TO_Q8_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK) ==
565             Q9_TO_Q8_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK)
566                 out8_mux = 1;
567
568         err = idtcm_read(idtcm, 0, HW_Q11_CTRL_SPARE,
569                          &temp, sizeof(temp));
570         if (err)
571                 return err;
572
573         if ((temp & Q10_TO_Q11_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK) ==
574             Q10_TO_Q11_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK)
575                 out11_mux = 1;
576
577         for (pll = 0; pll < 8; pll++) {
578                 qn = 0;
579                 qn_plus_1 = 0;
580
581                 if (pll < 4) {
582                         /* First 4 pll has 2 outputs */
583                         qn = output_mask & 0x1;
584                         output_mask = output_mask >> 1;
585                         qn_plus_1 = output_mask & 0x1;
586                         output_mask = output_mask >> 1;
587                 } else if (pll == 4) {
588                         if (out8_mux == 0) {
589                                 qn = output_mask & 0x1;
590                                 output_mask = output_mask >> 1;
591                         }
592                 } else if (pll == 5) {
593                         if (out8_mux) {
594                                 qn_plus_1 = output_mask & 0x1;
595                                 output_mask = output_mask >> 1;
596                         }
597                         qn = output_mask & 0x1;
598                         output_mask = output_mask >> 1;
599                 } else if (pll == 6) {
600                         qn = output_mask & 0x1;
601                         output_mask = output_mask >> 1;
602                         if (out11_mux) {
603                                 qn_plus_1 = output_mask & 0x1;
604                                 output_mask = output_mask >> 1;
605                         }
606                 } else if (pll == 7) {
607                         if (out11_mux == 0) {
608                                 qn = output_mask & 0x1;
609                                 output_mask = output_mask >> 1;
610                         }
611                 }
612
613                 if ((qn != 0) || (qn_plus_1 != 0))
614                         err = _sync_pll_output(idtcm, pll, sync_src, qn,
615                                                qn_plus_1);
616
617                 if (err)
618                         return err;
619         }
620
621         return err;
622 }
623
624 static int _idtcm_set_dpll_hw_tod(struct idtcm_channel *channel,
625                                struct timespec64 const *ts,
626                                enum hw_tod_write_trig_sel wr_trig)
627 {
628         struct idtcm *idtcm = channel->idtcm;
629
630         u8 buf[TOD_BYTE_COUNT];
631         u8 cmd;
632         int err;
633         struct timespec64 local_ts = *ts;
634         s64 total_overhead_ns;
635
636         /* Configure HW TOD write trigger. */
637         err = idtcm_read(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_CTRL_1,
638                          &cmd, sizeof(cmd));
639
640         if (err)
641                 return err;
642
643         cmd &= ~(0x0f);
644         cmd |= wr_trig | 0x08;
645
646         err = idtcm_write(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_CTRL_1,
647                           &cmd, sizeof(cmd));
648
649         if (err)
650                 return err;
651
652         if (wr_trig  != HW_TOD_WR_TRIG_SEL_MSB) {
653
654                 err = timespec_to_char_array(&local_ts, buf, sizeof(buf));
655
656                 if (err)
657                         return err;
658
659                 err = idtcm_write(idtcm, channel->hw_dpll_n,
660                                   HW_DPLL_TOD_OVR__0, buf, sizeof(buf));
661
662                 if (err)
663                         return err;
664         }
665
666         /* ARM HW TOD write trigger. */
667         cmd &= ~(0x08);
668
669         err = idtcm_write(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_CTRL_1,
670                           &cmd, sizeof(cmd));
671
672         if (wr_trig == HW_TOD_WR_TRIG_SEL_MSB) {
673
674                 if (idtcm->calculate_overhead_flag) {
675                         /* Assumption: I2C @ 400KHz */
676                         ktime_t diff = ktime_sub(ktime_get_raw(),
677                                                  idtcm->start_time);
678                         total_overhead_ns =  ktime_to_ns(diff)
679                                              + idtcm->tod_write_overhead_ns
680                                              + SETTIME_CORRECTION;
681
682                         timespec64_add_ns(&local_ts, total_overhead_ns);
683
684                         idtcm->calculate_overhead_flag = 0;
685                 }
686
687                 err = timespec_to_char_array(&local_ts, buf, sizeof(buf));
688
689                 if (err)
690                         return err;
691
692                 err = idtcm_write(idtcm, channel->hw_dpll_n,
693                                   HW_DPLL_TOD_OVR__0, buf, sizeof(buf));
694         }
695
696         return err;
697 }
698
699 static int _idtcm_set_dpll_scsr_tod(struct idtcm_channel *channel,
700                                     struct timespec64 const *ts,
701                                     enum scsr_tod_write_trig_sel wr_trig,
702                                     enum scsr_tod_write_type_sel wr_type)
703 {
704         struct idtcm *idtcm = channel->idtcm;
705         unsigned char buf[TOD_BYTE_COUNT], cmd;
706         struct timespec64 local_ts = *ts;
707         int err, count = 0;
708
709         timespec64_add_ns(&local_ts, SETTIME_CORRECTION);
710
711         err = timespec_to_char_array(&local_ts, buf, sizeof(buf));
712
713         if (err)
714                 return err;
715
716         err = idtcm_write(idtcm, channel->tod_write, TOD_WRITE,
717                           buf, sizeof(buf));
718         if (err)
719                 return err;
720
721         /* Trigger the write operation. */
722         err = idtcm_read(idtcm, channel->tod_write, TOD_WRITE_CMD,
723                          &cmd, sizeof(cmd));
724         if (err)
725                 return err;
726
727         cmd &= ~(TOD_WRITE_SELECTION_MASK << TOD_WRITE_SELECTION_SHIFT);
728         cmd &= ~(TOD_WRITE_TYPE_MASK << TOD_WRITE_TYPE_SHIFT);
729         cmd |= (wr_trig << TOD_WRITE_SELECTION_SHIFT);
730         cmd |= (wr_type << TOD_WRITE_TYPE_SHIFT);
731
732         err = idtcm_write(idtcm, channel->tod_write, TOD_WRITE_CMD,
733                            &cmd, sizeof(cmd));
734         if (err)
735                 return err;
736
737         /* Wait for the operation to complete. */
738         while (1) {
739                 /* pps trigger takes up to 1 sec to complete */
740                 if (wr_trig == SCSR_TOD_WR_TRIG_SEL_TODPPS)
741                         msleep(50);
742
743                 err = idtcm_read(idtcm, channel->tod_write, TOD_WRITE_CMD,
744                                  &cmd, sizeof(cmd));
745                 if (err)
746                         return err;
747
748                 if ((cmd & TOD_WRITE_SELECTION_MASK) == 0)
749                         break;
750
751                 if (++count > 20) {
752                         dev_err(&idtcm->client->dev,
753                                 "Timed out waiting for the write counter\n");
754                         return -EIO;
755                 }
756         }
757
758         return 0;
759 }
760
761 static int get_output_base_addr(u8 outn)
762 {
763         int base;
764
765         switch (outn) {
766         case 0:
767                 base = OUTPUT_0;
768                 break;
769         case 1:
770                 base = OUTPUT_1;
771                 break;
772         case 2:
773                 base = OUTPUT_2;
774                 break;
775         case 3:
776                 base = OUTPUT_3;
777                 break;
778         case 4:
779                 base = OUTPUT_4;
780                 break;
781         case 5:
782                 base = OUTPUT_5;
783                 break;
784         case 6:
785                 base = OUTPUT_6;
786                 break;
787         case 7:
788                 base = OUTPUT_7;
789                 break;
790         case 8:
791                 base = OUTPUT_8;
792                 break;
793         case 9:
794                 base = OUTPUT_9;
795                 break;
796         case 10:
797                 base = OUTPUT_10;
798                 break;
799         case 11:
800                 base = OUTPUT_11;
801                 break;
802         default:
803                 base = -EINVAL;
804         }
805
806         return base;
807 }
808
809 static int _idtcm_settime_deprecated(struct idtcm_channel *channel,
810                                      struct timespec64 const *ts)
811 {
812         struct idtcm *idtcm = channel->idtcm;
813         int err;
814
815         err = _idtcm_set_dpll_hw_tod(channel, ts, HW_TOD_WR_TRIG_SEL_MSB);
816
817         if (err) {
818                 dev_err(&idtcm->client->dev,
819                         "%s: Set HW ToD failed\n", __func__);
820                 return err;
821         }
822
823         return idtcm_sync_pps_output(channel);
824 }
825
826 static int _idtcm_settime(struct idtcm_channel *channel,
827                           struct timespec64 const *ts,
828                           enum scsr_tod_write_type_sel wr_type)
829 {
830         return _idtcm_set_dpll_scsr_tod(channel, ts,
831                                         SCSR_TOD_WR_TRIG_SEL_IMMEDIATE,
832                                         wr_type);
833 }
834
835 static int idtcm_set_phase_pull_in_offset(struct idtcm_channel *channel,
836                                           s32 offset_ns)
837 {
838         int err;
839         int i;
840         struct idtcm *idtcm = channel->idtcm;
841
842         u8 buf[4];
843
844         for (i = 0; i < 4; i++) {
845                 buf[i] = 0xff & (offset_ns);
846                 offset_ns >>= 8;
847         }
848
849         err = idtcm_write(idtcm, channel->dpll_phase_pull_in, PULL_IN_OFFSET,
850                           buf, sizeof(buf));
851
852         return err;
853 }
854
855 static int idtcm_set_phase_pull_in_slope_limit(struct idtcm_channel *channel,
856                                                u32 max_ffo_ppb)
857 {
858         int err;
859         u8 i;
860         struct idtcm *idtcm = channel->idtcm;
861
862         u8 buf[3];
863
864         if (max_ffo_ppb & 0xff000000)
865                 max_ffo_ppb = 0;
866
867         for (i = 0; i < 3; i++) {
868                 buf[i] = 0xff & (max_ffo_ppb);
869                 max_ffo_ppb >>= 8;
870         }
871
872         err = idtcm_write(idtcm, channel->dpll_phase_pull_in,
873                           PULL_IN_SLOPE_LIMIT, buf, sizeof(buf));
874
875         return err;
876 }
877
878 static int idtcm_start_phase_pull_in(struct idtcm_channel *channel)
879 {
880         int err;
881         struct idtcm *idtcm = channel->idtcm;
882
883         u8 buf;
884
885         err = idtcm_read(idtcm, channel->dpll_phase_pull_in, PULL_IN_CTRL,
886                          &buf, sizeof(buf));
887
888         if (err)
889                 return err;
890
891         if (buf == 0) {
892                 buf = 0x01;
893                 err = idtcm_write(idtcm, channel->dpll_phase_pull_in,
894                                   PULL_IN_CTRL, &buf, sizeof(buf));
895         } else {
896                 err = -EBUSY;
897         }
898
899         return err;
900 }
901
902 static int idtcm_do_phase_pull_in(struct idtcm_channel *channel,
903                                   s32 offset_ns,
904                                   u32 max_ffo_ppb)
905 {
906         int err;
907
908         err = idtcm_set_phase_pull_in_offset(channel, -offset_ns);
909
910         if (err)
911                 return err;
912
913         err = idtcm_set_phase_pull_in_slope_limit(channel, max_ffo_ppb);
914
915         if (err)
916                 return err;
917
918         err = idtcm_start_phase_pull_in(channel);
919
920         return err;
921 }
922
923 static int set_tod_write_overhead(struct idtcm_channel *channel)
924 {
925         struct idtcm *idtcm = channel->idtcm;
926         s64 current_ns = 0;
927         s64 lowest_ns = 0;
928         int err;
929         u8 i;
930
931         ktime_t start;
932         ktime_t stop;
933         ktime_t diff;
934
935         char buf[TOD_BYTE_COUNT] = {0};
936
937         /* Set page offset */
938         idtcm_write(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_OVR__0,
939                     buf, sizeof(buf));
940
941         for (i = 0; i < TOD_WRITE_OVERHEAD_COUNT_MAX; i++) {
942
943                 start = ktime_get_raw();
944
945                 err = idtcm_write(idtcm, channel->hw_dpll_n,
946                                   HW_DPLL_TOD_OVR__0, buf, sizeof(buf));
947
948                 if (err)
949                         return err;
950
951                 stop = ktime_get_raw();
952
953                 diff = ktime_sub(stop, start);
954
955                 current_ns = ktime_to_ns(diff);
956
957                 if (i == 0) {
958                         lowest_ns = current_ns;
959                 } else {
960                         if (current_ns < lowest_ns)
961                                 lowest_ns = current_ns;
962                 }
963         }
964
965         idtcm->tod_write_overhead_ns = lowest_ns;
966
967         return err;
968 }
969
970 static int _idtcm_adjtime_deprecated(struct idtcm_channel *channel, s64 delta)
971 {
972         int err;
973         struct idtcm *idtcm = channel->idtcm;
974         struct timespec64 ts;
975         s64 now;
976
977         if (abs(delta) < PHASE_PULL_IN_THRESHOLD_NS_DEPRECATED) {
978                 err = idtcm_do_phase_pull_in(channel, delta, 0);
979         } else {
980                 idtcm->calculate_overhead_flag = 1;
981
982                 err = set_tod_write_overhead(channel);
983
984                 if (err)
985                         return err;
986
987                 err = _idtcm_gettime(channel, &ts);
988
989                 if (err)
990                         return err;
991
992                 now = timespec64_to_ns(&ts);
993                 now += delta;
994
995                 ts = ns_to_timespec64(now);
996
997                 err = _idtcm_settime_deprecated(channel, &ts);
998         }
999
1000         return err;
1001 }
1002
1003 static int idtcm_state_machine_reset(struct idtcm *idtcm)
1004 {
1005         u8 byte = SM_RESET_CMD;
1006         u32 status = 0;
1007         int err;
1008         u8 i;
1009
1010         clear_boot_status(idtcm);
1011
1012         err = idtcm_write(idtcm, RESET_CTRL, SM_RESET, &byte, sizeof(byte));
1013
1014         if (!err) {
1015                 for (i = 0; i < 30; i++) {
1016                         msleep_interruptible(100);
1017                         read_boot_status(idtcm, &status);
1018
1019                         if (status == 0xA0) {
1020                                 dev_dbg(&idtcm->client->dev,
1021                                         "SM_RESET completed in %d ms\n",
1022                                         i * 100);
1023                                 break;
1024                         }
1025                 }
1026
1027                 if (!status)
1028                         dev_err(&idtcm->client->dev, "Timed out waiting for CM_RESET to complete\n");
1029         }
1030
1031         return err;
1032 }
1033
1034 static int idtcm_read_hw_rev_id(struct idtcm *idtcm, u8 *hw_rev_id)
1035 {
1036         return idtcm_read(idtcm, HW_REVISION, REV_ID, hw_rev_id, sizeof(u8));
1037 }
1038
1039 static int idtcm_read_product_id(struct idtcm *idtcm, u16 *product_id)
1040 {
1041         int err;
1042         u8 buf[2] = {0};
1043
1044         err = idtcm_read(idtcm, GENERAL_STATUS, PRODUCT_ID, buf, sizeof(buf));
1045
1046         *product_id = (buf[1] << 8) | buf[0];
1047
1048         return err;
1049 }
1050
1051 static int idtcm_read_major_release(struct idtcm *idtcm, u8 *major)
1052 {
1053         int err;
1054         u8 buf = 0;
1055
1056         err = idtcm_read(idtcm, GENERAL_STATUS, MAJ_REL, &buf, sizeof(buf));
1057
1058         *major = buf >> 1;
1059
1060         return err;
1061 }
1062
1063 static int idtcm_read_minor_release(struct idtcm *idtcm, u8 *minor)
1064 {
1065         return idtcm_read(idtcm, GENERAL_STATUS, MIN_REL, minor, sizeof(u8));
1066 }
1067
1068 static int idtcm_read_hotfix_release(struct idtcm *idtcm, u8 *hotfix)
1069 {
1070         return idtcm_read(idtcm,
1071                           GENERAL_STATUS,
1072                           HOTFIX_REL,
1073                           hotfix,
1074                           sizeof(u8));
1075 }
1076
1077 static int idtcm_read_otp_scsr_config_select(struct idtcm *idtcm,
1078                                              u8 *config_select)
1079 {
1080         return idtcm_read(idtcm, GENERAL_STATUS, OTP_SCSR_CONFIG_SELECT,
1081                           config_select, sizeof(u8));
1082 }
1083
1084 static int set_pll_output_mask(struct idtcm *idtcm, u16 addr, u8 val)
1085 {
1086         int err = 0;
1087
1088         switch (addr) {
1089         case TOD0_OUT_ALIGN_MASK_ADDR:
1090                 SET_U16_LSB(idtcm->channel[0].output_mask, val);
1091                 break;
1092         case TOD0_OUT_ALIGN_MASK_ADDR + 1:
1093                 SET_U16_MSB(idtcm->channel[0].output_mask, val);
1094                 break;
1095         case TOD1_OUT_ALIGN_MASK_ADDR:
1096                 SET_U16_LSB(idtcm->channel[1].output_mask, val);
1097                 break;
1098         case TOD1_OUT_ALIGN_MASK_ADDR + 1:
1099                 SET_U16_MSB(idtcm->channel[1].output_mask, val);
1100                 break;
1101         case TOD2_OUT_ALIGN_MASK_ADDR:
1102                 SET_U16_LSB(idtcm->channel[2].output_mask, val);
1103                 break;
1104         case TOD2_OUT_ALIGN_MASK_ADDR + 1:
1105                 SET_U16_MSB(idtcm->channel[2].output_mask, val);
1106                 break;
1107         case TOD3_OUT_ALIGN_MASK_ADDR:
1108                 SET_U16_LSB(idtcm->channel[3].output_mask, val);
1109                 break;
1110         case TOD3_OUT_ALIGN_MASK_ADDR + 1:
1111                 SET_U16_MSB(idtcm->channel[3].output_mask, val);
1112                 break;
1113         default:
1114                 err = -EFAULT; /* Bad address */;
1115                 break;
1116         }
1117
1118         return err;
1119 }
1120
1121 static int set_tod_ptp_pll(struct idtcm *idtcm, u8 index, u8 pll)
1122 {
1123         if (index >= MAX_TOD) {
1124                 dev_err(&idtcm->client->dev, "ToD%d not supported\n", index);
1125                 return -EINVAL;
1126         }
1127
1128         if (pll >= MAX_PLL) {
1129                 dev_err(&idtcm->client->dev, "Pll%d not supported\n", pll);
1130                 return -EINVAL;
1131         }
1132
1133         idtcm->channel[index].pll = pll;
1134
1135         return 0;
1136 }
1137
1138 static int check_and_set_masks(struct idtcm *idtcm,
1139                                u16 regaddr,
1140                                u8 val)
1141 {
1142         int err = 0;
1143
1144         switch (regaddr) {
1145         case TOD_MASK_ADDR:
1146                 if ((val & 0xf0) || !(val & 0x0f)) {
1147                         dev_err(&idtcm->client->dev,
1148                                 "Invalid TOD mask 0x%hhx\n", val);
1149                         err = -EINVAL;
1150                 } else {
1151                         idtcm->tod_mask = val;
1152                 }
1153                 break;
1154         case TOD0_PTP_PLL_ADDR:
1155                 err = set_tod_ptp_pll(idtcm, 0, val);
1156                 break;
1157         case TOD1_PTP_PLL_ADDR:
1158                 err = set_tod_ptp_pll(idtcm, 1, val);
1159                 break;
1160         case TOD2_PTP_PLL_ADDR:
1161                 err = set_tod_ptp_pll(idtcm, 2, val);
1162                 break;
1163         case TOD3_PTP_PLL_ADDR:
1164                 err = set_tod_ptp_pll(idtcm, 3, val);
1165                 break;
1166         default:
1167                 err = set_pll_output_mask(idtcm, regaddr, val);
1168                 break;
1169         }
1170
1171         return err;
1172 }
1173
1174 static void display_pll_and_masks(struct idtcm *idtcm)
1175 {
1176         u8 i;
1177         u8 mask;
1178
1179         dev_dbg(&idtcm->client->dev, "tod_mask = 0x%02x\n", idtcm->tod_mask);
1180
1181         for (i = 0; i < MAX_TOD; i++) {
1182                 mask = 1 << i;
1183
1184                 if (mask & idtcm->tod_mask)
1185                         dev_dbg(&idtcm->client->dev,
1186                                 "TOD%d pll = %d    output_mask = 0x%04x\n",
1187                                 i, idtcm->channel[i].pll,
1188                                 idtcm->channel[i].output_mask);
1189         }
1190 }
1191
1192 static int idtcm_load_firmware(struct idtcm *idtcm,
1193                                struct device *dev)
1194 {
1195         char fname[128] = FW_FILENAME;
1196         const struct firmware *fw;
1197         struct idtcm_fwrc *rec;
1198         u32 regaddr;
1199         int err;
1200         s32 len;
1201         u8 val;
1202         u8 loaddr;
1203
1204         if (firmware) /* module parameter */
1205                 snprintf(fname, sizeof(fname), "%s", firmware);
1206
1207         dev_dbg(&idtcm->client->dev, "requesting firmware '%s'\n", fname);
1208
1209         err = request_firmware(&fw, fname, dev);
1210
1211         if (err) {
1212                 dev_err(&idtcm->client->dev,
1213                         "Failed at line %d in func %s!\n",
1214                         __LINE__,
1215                         __func__);
1216                 return err;
1217         }
1218
1219         dev_dbg(&idtcm->client->dev, "firmware size %zu bytes\n", fw->size);
1220
1221         rec = (struct idtcm_fwrc *) fw->data;
1222
1223         if (contains_full_configuration(fw))
1224                 idtcm_state_machine_reset(idtcm);
1225
1226         for (len = fw->size; len > 0; len -= sizeof(*rec)) {
1227
1228                 if (rec->reserved) {
1229                         dev_err(&idtcm->client->dev,
1230                                 "bad firmware, reserved field non-zero\n");
1231                         err = -EINVAL;
1232                 } else {
1233                         regaddr = rec->hiaddr << 8;
1234                         regaddr |= rec->loaddr;
1235
1236                         val = rec->value;
1237                         loaddr = rec->loaddr;
1238
1239                         rec++;
1240
1241                         err = check_and_set_masks(idtcm, regaddr, val);
1242                 }
1243
1244                 if (err != -EINVAL) {
1245                         err = 0;
1246
1247                         /* Top (status registers) and bottom are read-only */
1248                         if ((regaddr < GPIO_USER_CONTROL)
1249                             || (regaddr >= SCRATCH))
1250                                 continue;
1251
1252                         /* Page size 128, last 4 bytes of page skipped */
1253                         if (((loaddr > 0x7b) && (loaddr <= 0x7f))
1254                              || loaddr > 0xfb)
1255                                 continue;
1256
1257                         err = idtcm_write(idtcm, regaddr, 0, &val, sizeof(val));
1258                 }
1259
1260                 if (err)
1261                         goto out;
1262         }
1263
1264         display_pll_and_masks(idtcm);
1265
1266 out:
1267         release_firmware(fw);
1268         return err;
1269 }
1270
1271 static int idtcm_output_enable(struct idtcm_channel *channel,
1272                                bool enable, unsigned int outn)
1273 {
1274         struct idtcm *idtcm = channel->idtcm;
1275         int base;
1276         int err;
1277         u8 val;
1278
1279         base = get_output_base_addr(outn);
1280
1281         if (!(base > 0)) {
1282                 dev_err(&idtcm->client->dev,
1283                         "%s - Unsupported out%d", __func__, outn);
1284                 return base;
1285         }
1286
1287         err = idtcm_read(idtcm, (u16)base, OUT_CTRL_1, &val, sizeof(val));
1288
1289         if (err)
1290                 return err;
1291
1292         if (enable)
1293                 val |= SQUELCH_DISABLE;
1294         else
1295                 val &= ~SQUELCH_DISABLE;
1296
1297         return idtcm_write(idtcm, (u16)base, OUT_CTRL_1, &val, sizeof(val));
1298 }
1299
1300 static int idtcm_output_mask_enable(struct idtcm_channel *channel,
1301                                     bool enable)
1302 {
1303         u16 mask;
1304         int err;
1305         u8 outn;
1306
1307         mask = channel->output_mask;
1308         outn = 0;
1309
1310         while (mask) {
1311
1312                 if (mask & 0x1) {
1313
1314                         err = idtcm_output_enable(channel, enable, outn);
1315
1316                         if (err)
1317                                 return err;
1318                 }
1319
1320                 mask >>= 0x1;
1321                 outn++;
1322         }
1323
1324         return 0;
1325 }
1326
1327 static int idtcm_perout_enable(struct idtcm_channel *channel,
1328                                bool enable,
1329                                struct ptp_perout_request *perout)
1330 {
1331         unsigned int flags = perout->flags;
1332
1333         if (flags == PEROUT_ENABLE_OUTPUT_MASK)
1334                 return idtcm_output_mask_enable(channel, enable);
1335
1336         /* Enable/disable individual output instead */
1337         return idtcm_output_enable(channel, enable, perout->index);
1338 }
1339
1340 static int idtcm_get_pll_mode(struct idtcm_channel *channel,
1341                               enum pll_mode *pll_mode)
1342 {
1343         struct idtcm *idtcm = channel->idtcm;
1344         int err;
1345         u8 dpll_mode;
1346
1347         err = idtcm_read(idtcm, channel->dpll_n, DPLL_MODE,
1348                          &dpll_mode, sizeof(dpll_mode));
1349         if (err)
1350                 return err;
1351
1352         *pll_mode = (dpll_mode >> PLL_MODE_SHIFT) & PLL_MODE_MASK;
1353
1354         return 0;
1355 }
1356
1357 static int idtcm_set_pll_mode(struct idtcm_channel *channel,
1358                               enum pll_mode pll_mode)
1359 {
1360         struct idtcm *idtcm = channel->idtcm;
1361         int err;
1362         u8 dpll_mode;
1363
1364         err = idtcm_read(idtcm, channel->dpll_n, DPLL_MODE,
1365                          &dpll_mode, sizeof(dpll_mode));
1366         if (err)
1367                 return err;
1368
1369         dpll_mode &= ~(PLL_MODE_MASK << PLL_MODE_SHIFT);
1370
1371         dpll_mode |= (pll_mode << PLL_MODE_SHIFT);
1372
1373         channel->pll_mode = pll_mode;
1374
1375         err = idtcm_write(idtcm, channel->dpll_n, DPLL_MODE,
1376                           &dpll_mode, sizeof(dpll_mode));
1377         if (err)
1378                 return err;
1379
1380         return 0;
1381 }
1382
1383 /* PTP Hardware Clock interface */
1384
1385 /**
1386  * @brief Maximum absolute value for write phase offset in picoseconds
1387  *
1388  * Destination signed register is 32-bit register in resolution of 50ps
1389  *
1390  * 0x7fffffff * 50 =  2147483647 * 50 = 107374182350
1391  */
1392 static int _idtcm_adjphase(struct idtcm_channel *channel, s32 delta_ns)
1393 {
1394         struct idtcm *idtcm = channel->idtcm;
1395
1396         int err;
1397         u8 i;
1398         u8 buf[4] = {0};
1399         s32 phase_50ps;
1400         s64 offset_ps;
1401
1402         if (channel->pll_mode != PLL_MODE_WRITE_PHASE) {
1403
1404                 err = idtcm_set_pll_mode(channel, PLL_MODE_WRITE_PHASE);
1405
1406                 if (err)
1407                         return err;
1408         }
1409
1410         offset_ps = (s64)delta_ns * 1000;
1411
1412         /*
1413          * Check for 32-bit signed max * 50:
1414          *
1415          * 0x7fffffff * 50 =  2147483647 * 50 = 107374182350
1416          */
1417         if (offset_ps > MAX_ABS_WRITE_PHASE_PICOSECONDS)
1418                 offset_ps = MAX_ABS_WRITE_PHASE_PICOSECONDS;
1419         else if (offset_ps < -MAX_ABS_WRITE_PHASE_PICOSECONDS)
1420                 offset_ps = -MAX_ABS_WRITE_PHASE_PICOSECONDS;
1421
1422         phase_50ps = div_s64(offset_ps, 50);
1423
1424         for (i = 0; i < 4; i++) {
1425                 buf[i] = phase_50ps & 0xff;
1426                 phase_50ps >>= 8;
1427         }
1428
1429         err = idtcm_write(idtcm, channel->dpll_phase, DPLL_WR_PHASE,
1430                           buf, sizeof(buf));
1431
1432         return err;
1433 }
1434
1435 static int _idtcm_adjfine(struct idtcm_channel *channel, long scaled_ppm)
1436 {
1437         struct idtcm *idtcm = channel->idtcm;
1438         u8 i;
1439         int err;
1440         u8 buf[6] = {0};
1441         s64 fcw;
1442
1443         if (channel->pll_mode  != PLL_MODE_WRITE_FREQUENCY) {
1444                 err = idtcm_set_pll_mode(channel, PLL_MODE_WRITE_FREQUENCY);
1445                 if (err)
1446                         return err;
1447         }
1448
1449         /*
1450          * Frequency Control Word unit is: 1.11 * 10^-10 ppm
1451          *
1452          * adjfreq:
1453          *       ppb * 10^9
1454          * FCW = ----------
1455          *          111
1456          *
1457          * adjfine:
1458          *       ppm_16 * 5^12
1459          * FCW = -------------
1460          *         111 * 2^4
1461          */
1462
1463         /* 2 ^ -53 = 1.1102230246251565404236316680908e-16 */
1464         fcw = scaled_ppm * 244140625ULL;
1465
1466         fcw = div_s64(fcw, 1776);
1467
1468         for (i = 0; i < 6; i++) {
1469                 buf[i] = fcw & 0xff;
1470                 fcw >>= 8;
1471         }
1472
1473         err = idtcm_write(idtcm, channel->dpll_freq, DPLL_WR_FREQ,
1474                           buf, sizeof(buf));
1475
1476         return err;
1477 }
1478
1479 static int idtcm_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts)
1480 {
1481         struct idtcm_channel *channel =
1482                 container_of(ptp, struct idtcm_channel, caps);
1483         struct idtcm *idtcm = channel->idtcm;
1484         int err;
1485
1486         mutex_lock(&idtcm->reg_lock);
1487
1488         err = _idtcm_gettime(channel, ts);
1489
1490         if (err)
1491                 dev_err(&idtcm->client->dev,
1492                         "Failed at line %d in func %s!\n",
1493                         __LINE__,
1494                         __func__);
1495
1496         mutex_unlock(&idtcm->reg_lock);
1497
1498         return err;
1499 }
1500
1501 static int idtcm_settime_deprecated(struct ptp_clock_info *ptp,
1502                                     const struct timespec64 *ts)
1503 {
1504         struct idtcm_channel *channel =
1505                 container_of(ptp, struct idtcm_channel, caps);
1506         struct idtcm *idtcm = channel->idtcm;
1507         int err;
1508
1509         mutex_lock(&idtcm->reg_lock);
1510
1511         err = _idtcm_settime_deprecated(channel, ts);
1512
1513         if (err)
1514                 dev_err(&idtcm->client->dev,
1515                         "Failed at line %d in func %s!\n",
1516                         __LINE__,
1517                         __func__);
1518
1519         mutex_unlock(&idtcm->reg_lock);
1520
1521         return err;
1522 }
1523
1524 static int idtcm_settime(struct ptp_clock_info *ptp,
1525                          const struct timespec64 *ts)
1526 {
1527         struct idtcm_channel *channel =
1528                 container_of(ptp, struct idtcm_channel, caps);
1529         struct idtcm *idtcm = channel->idtcm;
1530         int err;
1531
1532         mutex_lock(&idtcm->reg_lock);
1533
1534         err = _idtcm_settime(channel, ts, SCSR_TOD_WR_TYPE_SEL_ABSOLUTE);
1535
1536         if (err)
1537                 dev_err(&idtcm->client->dev,
1538                         "Failed at line %d in func %s!\n",
1539                         __LINE__,
1540                         __func__);
1541
1542         mutex_unlock(&idtcm->reg_lock);
1543
1544         return err;
1545 }
1546
1547 static int idtcm_adjtime_deprecated(struct ptp_clock_info *ptp, s64 delta)
1548 {
1549         struct idtcm_channel *channel =
1550                 container_of(ptp, struct idtcm_channel, caps);
1551         struct idtcm *idtcm = channel->idtcm;
1552         int err;
1553
1554         mutex_lock(&idtcm->reg_lock);
1555
1556         err = _idtcm_adjtime_deprecated(channel, delta);
1557
1558         if (err)
1559                 dev_err(&idtcm->client->dev,
1560                         "Failed at line %d in func %s!\n",
1561                         __LINE__,
1562                         __func__);
1563
1564         mutex_unlock(&idtcm->reg_lock);
1565
1566         return err;
1567 }
1568
1569 static int idtcm_adjtime(struct ptp_clock_info *ptp, s64 delta)
1570 {
1571         struct idtcm_channel *channel =
1572                 container_of(ptp, struct idtcm_channel, caps);
1573         struct idtcm *idtcm = channel->idtcm;
1574         struct timespec64 ts;
1575         enum scsr_tod_write_type_sel type;
1576         int err;
1577
1578         if (abs(delta) < PHASE_PULL_IN_THRESHOLD_NS) {
1579                 err = idtcm_do_phase_pull_in(channel, delta, 0);
1580                 if (err)
1581                         dev_err(&idtcm->client->dev,
1582                                 "Failed at line %d in func %s!\n",
1583                                 __LINE__,
1584                                 __func__);
1585                 return err;
1586         }
1587
1588         if (delta >= 0) {
1589                 ts = ns_to_timespec64(delta);
1590                 type = SCSR_TOD_WR_TYPE_SEL_DELTA_PLUS;
1591         } else {
1592                 ts = ns_to_timespec64(-delta);
1593                 type = SCSR_TOD_WR_TYPE_SEL_DELTA_MINUS;
1594         }
1595
1596         mutex_lock(&idtcm->reg_lock);
1597
1598         err = _idtcm_settime(channel, &ts, type);
1599
1600         if (err)
1601                 dev_err(&idtcm->client->dev,
1602                         "Failed at line %d in func %s!\n",
1603                         __LINE__,
1604                         __func__);
1605
1606         mutex_unlock(&idtcm->reg_lock);
1607
1608         return err;
1609 }
1610
1611 static int idtcm_adjphase(struct ptp_clock_info *ptp, s32 delta)
1612 {
1613         struct idtcm_channel *channel =
1614                 container_of(ptp, struct idtcm_channel, caps);
1615
1616         struct idtcm *idtcm = channel->idtcm;
1617
1618         int err;
1619
1620         mutex_lock(&idtcm->reg_lock);
1621
1622         err = _idtcm_adjphase(channel, delta);
1623
1624         if (err)
1625                 dev_err(&idtcm->client->dev,
1626                         "Failed at line %d in func %s!\n",
1627                         __LINE__,
1628                         __func__);
1629
1630         mutex_unlock(&idtcm->reg_lock);
1631
1632         return err;
1633 }
1634
1635 static int idtcm_adjfine(struct ptp_clock_info *ptp,  long scaled_ppm)
1636 {
1637         struct idtcm_channel *channel =
1638                 container_of(ptp, struct idtcm_channel, caps);
1639
1640         struct idtcm *idtcm = channel->idtcm;
1641
1642         int err;
1643
1644         mutex_lock(&idtcm->reg_lock);
1645
1646         err = _idtcm_adjfine(channel, scaled_ppm);
1647
1648         if (err)
1649                 dev_err(&idtcm->client->dev,
1650                         "Failed at line %d in func %s!\n",
1651                         __LINE__,
1652                         __func__);
1653
1654         mutex_unlock(&idtcm->reg_lock);
1655
1656         return err;
1657 }
1658
1659 static int idtcm_enable(struct ptp_clock_info *ptp,
1660                         struct ptp_clock_request *rq, int on)
1661 {
1662         int err;
1663
1664         struct idtcm_channel *channel =
1665                 container_of(ptp, struct idtcm_channel, caps);
1666
1667         switch (rq->type) {
1668         case PTP_CLK_REQ_PEROUT:
1669                 if (!on) {
1670                         err = idtcm_perout_enable(channel, false, &rq->perout);
1671                         if (err)
1672                                 dev_err(&channel->idtcm->client->dev,
1673                                         "Failed at line %d in func %s!\n",
1674                                         __LINE__,
1675                                         __func__);
1676                         return err;
1677                 }
1678
1679                 /* Only accept a 1-PPS aligned to the second. */
1680                 if (rq->perout.start.nsec || rq->perout.period.sec != 1 ||
1681                     rq->perout.period.nsec)
1682                         return -ERANGE;
1683
1684                 err = idtcm_perout_enable(channel, true, &rq->perout);
1685                 if (err)
1686                         dev_err(&channel->idtcm->client->dev,
1687                                 "Failed at line %d in func %s!\n",
1688                                 __LINE__,
1689                                 __func__);
1690                 return err;
1691         default:
1692                 break;
1693         }
1694
1695         return -EOPNOTSUPP;
1696 }
1697
1698 static int _enable_pll_tod_sync(struct idtcm *idtcm,
1699                                 u8 pll,
1700                                 u8 sync_src,
1701                                 u8 qn,
1702                                 u8 qn_plus_1)
1703 {
1704         int err;
1705         u8 val;
1706         u16 dpll;
1707         u16 out0 = 0, out1 = 0;
1708
1709         if ((qn == 0) && (qn_plus_1 == 0))
1710                 return 0;
1711
1712         switch (pll) {
1713         case 0:
1714                 dpll = DPLL_0;
1715                 if (qn)
1716                         out0 = OUTPUT_0;
1717                 if (qn_plus_1)
1718                         out1 = OUTPUT_1;
1719                 break;
1720         case 1:
1721                 dpll = DPLL_1;
1722                 if (qn)
1723                         out0 = OUTPUT_2;
1724                 if (qn_plus_1)
1725                         out1 = OUTPUT_3;
1726                 break;
1727         case 2:
1728                 dpll = DPLL_2;
1729                 if (qn)
1730                         out0 = OUTPUT_4;
1731                 if (qn_plus_1)
1732                         out1 = OUTPUT_5;
1733                 break;
1734         case 3:
1735                 dpll = DPLL_3;
1736                 if (qn)
1737                         out0 = OUTPUT_6;
1738                 if (qn_plus_1)
1739                         out1 = OUTPUT_7;
1740                 break;
1741         case 4:
1742                 dpll = DPLL_4;
1743                 if (qn)
1744                         out0 = OUTPUT_8;
1745                 break;
1746         case 5:
1747                 dpll = DPLL_5;
1748                 if (qn)
1749                         out0 = OUTPUT_9;
1750                 if (qn_plus_1)
1751                         out1 = OUTPUT_8;
1752                 break;
1753         case 6:
1754                 dpll = DPLL_6;
1755                 if (qn)
1756                         out0 = OUTPUT_10;
1757                 if (qn_plus_1)
1758                         out1 = OUTPUT_11;
1759                 break;
1760         case 7:
1761                 dpll = DPLL_7;
1762                 if (qn)
1763                         out0 = OUTPUT_11;
1764                 break;
1765         default:
1766                 return -EINVAL;
1767         }
1768
1769         /*
1770          * Enable OUTPUT OUT_SYNC.
1771          */
1772         if (out0) {
1773                 err = idtcm_read(idtcm, out0, OUT_CTRL_1, &val, sizeof(val));
1774
1775                 if (err)
1776                         return err;
1777
1778                 val &= ~OUT_SYNC_DISABLE;
1779
1780                 err = idtcm_write(idtcm, out0, OUT_CTRL_1, &val, sizeof(val));
1781
1782                 if (err)
1783                         return err;
1784         }
1785
1786         if (out1) {
1787                 err = idtcm_read(idtcm, out1, OUT_CTRL_1, &val, sizeof(val));
1788
1789                 if (err)
1790                         return err;
1791
1792                 val &= ~OUT_SYNC_DISABLE;
1793
1794                 err = idtcm_write(idtcm, out1, OUT_CTRL_1, &val, sizeof(val));
1795
1796                 if (err)
1797                         return err;
1798         }
1799
1800         /* enable dpll sync tod pps, must be set before dpll_mode */
1801         err = idtcm_read(idtcm, dpll, DPLL_TOD_SYNC_CFG, &val, sizeof(val));
1802         if (err)
1803                 return err;
1804
1805         val &= ~(TOD_SYNC_SOURCE_MASK << TOD_SYNC_SOURCE_SHIFT);
1806         val |= (sync_src << TOD_SYNC_SOURCE_SHIFT);
1807         val |= TOD_SYNC_EN;
1808
1809         return idtcm_write(idtcm, dpll, DPLL_TOD_SYNC_CFG, &val, sizeof(val));
1810 }
1811
1812 static int idtcm_enable_tod_sync(struct idtcm_channel *channel)
1813 {
1814         struct idtcm *idtcm = channel->idtcm;
1815
1816         u8 pll;
1817         u8 sync_src;
1818         u8 qn;
1819         u8 qn_plus_1;
1820         u8 cfg;
1821         int err = 0;
1822         u16 output_mask = channel->output_mask;
1823         u8 out8_mux = 0;
1824         u8 out11_mux = 0;
1825         u8 temp;
1826
1827         /*
1828          * set tod_out_sync_enable to 0.
1829          */
1830         err = idtcm_read(idtcm, channel->tod_n, TOD_CFG, &cfg, sizeof(cfg));
1831         if (err)
1832                 return err;
1833
1834         cfg &= ~TOD_OUT_SYNC_ENABLE;
1835
1836         err = idtcm_write(idtcm, channel->tod_n, TOD_CFG, &cfg, sizeof(cfg));
1837         if (err)
1838                 return err;
1839
1840         switch (channel->tod_n) {
1841         case TOD_0:
1842                 sync_src = 0;
1843                 break;
1844         case TOD_1:
1845                 sync_src = 1;
1846                 break;
1847         case TOD_2:
1848                 sync_src = 2;
1849                 break;
1850         case TOD_3:
1851                 sync_src = 3;
1852                 break;
1853         default:
1854                 return -EINVAL;
1855         }
1856
1857         err = idtcm_read(idtcm, 0, HW_Q8_CTRL_SPARE,
1858                          &temp, sizeof(temp));
1859         if (err)
1860                 return err;
1861
1862         if ((temp & Q9_TO_Q8_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK) ==
1863             Q9_TO_Q8_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK)
1864                 out8_mux = 1;
1865
1866         err = idtcm_read(idtcm, 0, HW_Q11_CTRL_SPARE,
1867                          &temp, sizeof(temp));
1868         if (err)
1869                 return err;
1870
1871         if ((temp & Q10_TO_Q11_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK) ==
1872             Q10_TO_Q11_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK)
1873                 out11_mux = 1;
1874
1875         for (pll = 0; pll < 8; pll++) {
1876                 qn = 0;
1877                 qn_plus_1 = 0;
1878
1879                 if (pll < 4) {
1880                         /* First 4 pll has 2 outputs */
1881                         qn = output_mask & 0x1;
1882                         output_mask = output_mask >> 1;
1883                         qn_plus_1 = output_mask & 0x1;
1884                         output_mask = output_mask >> 1;
1885                 } else if (pll == 4) {
1886                         if (out8_mux == 0) {
1887                                 qn = output_mask & 0x1;
1888                                 output_mask = output_mask >> 1;
1889                         }
1890                 } else if (pll == 5) {
1891                         if (out8_mux) {
1892                                 qn_plus_1 = output_mask & 0x1;
1893                                 output_mask = output_mask >> 1;
1894                         }
1895                         qn = output_mask & 0x1;
1896                         output_mask = output_mask >> 1;
1897                 } else if (pll == 6) {
1898                         qn = output_mask & 0x1;
1899                         output_mask = output_mask >> 1;
1900                         if (out11_mux) {
1901                                 qn_plus_1 = output_mask & 0x1;
1902                                 output_mask = output_mask >> 1;
1903                         }
1904                 } else if (pll == 7) {
1905                         if (out11_mux == 0) {
1906                                 qn = output_mask & 0x1;
1907                                 output_mask = output_mask >> 1;
1908                         }
1909                 }
1910
1911                 if ((qn != 0) || (qn_plus_1 != 0))
1912                         err = _enable_pll_tod_sync(idtcm, pll, sync_src, qn,
1913                                                qn_plus_1);
1914
1915                 if (err)
1916                         return err;
1917         }
1918
1919         return err;
1920 }
1921
1922 static int idtcm_enable_tod(struct idtcm_channel *channel)
1923 {
1924         struct idtcm *idtcm = channel->idtcm;
1925         struct timespec64 ts = {0, 0};
1926         u8 cfg;
1927         int err;
1928
1929         /*
1930          * Start the TOD clock ticking.
1931          */
1932         err = idtcm_read(idtcm, channel->tod_n, TOD_CFG, &cfg, sizeof(cfg));
1933         if (err)
1934                 return err;
1935
1936         cfg |= TOD_ENABLE;
1937
1938         err = idtcm_write(idtcm, channel->tod_n, TOD_CFG, &cfg, sizeof(cfg));
1939         if (err)
1940                 return err;
1941
1942         if (idtcm->deprecated)
1943                 return _idtcm_settime_deprecated(channel, &ts);
1944         else
1945                 return _idtcm_settime(channel, &ts,
1946                                       SCSR_TOD_WR_TYPE_SEL_ABSOLUTE);
1947 }
1948
1949 static void idtcm_set_version_info(struct idtcm *idtcm)
1950 {
1951         u8 major;
1952         u8 minor;
1953         u8 hotfix;
1954         u16 product_id;
1955         u8 hw_rev_id;
1956         u8 config_select;
1957         char *fmt = "%d.%d.%d, Id: 0x%04x  HW Rev: %d  OTP Config Select: %d\n";
1958
1959         idtcm_read_major_release(idtcm, &major);
1960         idtcm_read_minor_release(idtcm, &minor);
1961         idtcm_read_hotfix_release(idtcm, &hotfix);
1962
1963         idtcm_read_product_id(idtcm, &product_id);
1964         idtcm_read_hw_rev_id(idtcm, &hw_rev_id);
1965
1966         idtcm_read_otp_scsr_config_select(idtcm, &config_select);
1967
1968         snprintf(idtcm->version, sizeof(idtcm->version), "%u.%u.%u",
1969                  major, minor, hotfix);
1970
1971         if (idtcm_strverscmp(idtcm->version, "4.8.7") >= 0)
1972                 idtcm->deprecated = 0;
1973         else
1974                 idtcm->deprecated = 1;
1975
1976         dev_info(&idtcm->client->dev, fmt, major, minor, hotfix,
1977                  product_id, hw_rev_id, config_select);
1978 }
1979
1980 static const struct ptp_clock_info idtcm_caps = {
1981         .owner          = THIS_MODULE,
1982         .max_adj        = 244000,
1983         .n_per_out      = 12,
1984         .adjphase       = &idtcm_adjphase,
1985         .adjfine        = &idtcm_adjfine,
1986         .adjtime        = &idtcm_adjtime,
1987         .gettime64      = &idtcm_gettime,
1988         .settime64      = &idtcm_settime,
1989         .enable         = &idtcm_enable,
1990 };
1991
1992 static const struct ptp_clock_info idtcm_caps_deprecated = {
1993         .owner          = THIS_MODULE,
1994         .max_adj        = 244000,
1995         .n_per_out      = 12,
1996         .adjphase       = &idtcm_adjphase,
1997         .adjfine        = &idtcm_adjfine,
1998         .adjtime        = &idtcm_adjtime_deprecated,
1999         .gettime64      = &idtcm_gettime,
2000         .settime64      = &idtcm_settime_deprecated,
2001         .enable         = &idtcm_enable,
2002 };
2003
2004 static int configure_channel_pll(struct idtcm_channel *channel)
2005 {
2006         int err = 0;
2007
2008         switch (channel->pll) {
2009         case 0:
2010                 channel->dpll_freq = DPLL_FREQ_0;
2011                 channel->dpll_n = DPLL_0;
2012                 channel->hw_dpll_n = HW_DPLL_0;
2013                 channel->dpll_phase = DPLL_PHASE_0;
2014                 channel->dpll_ctrl_n = DPLL_CTRL_0;
2015                 channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_0;
2016                 break;
2017         case 1:
2018                 channel->dpll_freq = DPLL_FREQ_1;
2019                 channel->dpll_n = DPLL_1;
2020                 channel->hw_dpll_n = HW_DPLL_1;
2021                 channel->dpll_phase = DPLL_PHASE_1;
2022                 channel->dpll_ctrl_n = DPLL_CTRL_1;
2023                 channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_1;
2024                 break;
2025         case 2:
2026                 channel->dpll_freq = DPLL_FREQ_2;
2027                 channel->dpll_n = DPLL_2;
2028                 channel->hw_dpll_n = HW_DPLL_2;
2029                 channel->dpll_phase = DPLL_PHASE_2;
2030                 channel->dpll_ctrl_n = DPLL_CTRL_2;
2031                 channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_2;
2032                 break;
2033         case 3:
2034                 channel->dpll_freq = DPLL_FREQ_3;
2035                 channel->dpll_n = DPLL_3;
2036                 channel->hw_dpll_n = HW_DPLL_3;
2037                 channel->dpll_phase = DPLL_PHASE_3;
2038                 channel->dpll_ctrl_n = DPLL_CTRL_3;
2039                 channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_3;
2040                 break;
2041         case 4:
2042                 channel->dpll_freq = DPLL_FREQ_4;
2043                 channel->dpll_n = DPLL_4;
2044                 channel->hw_dpll_n = HW_DPLL_4;
2045                 channel->dpll_phase = DPLL_PHASE_4;
2046                 channel->dpll_ctrl_n = DPLL_CTRL_4;
2047                 channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_4;
2048                 break;
2049         case 5:
2050                 channel->dpll_freq = DPLL_FREQ_5;
2051                 channel->dpll_n = DPLL_5;
2052                 channel->hw_dpll_n = HW_DPLL_5;
2053                 channel->dpll_phase = DPLL_PHASE_5;
2054                 channel->dpll_ctrl_n = DPLL_CTRL_5;
2055                 channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_5;
2056                 break;
2057         case 6:
2058                 channel->dpll_freq = DPLL_FREQ_6;
2059                 channel->dpll_n = DPLL_6;
2060                 channel->hw_dpll_n = HW_DPLL_6;
2061                 channel->dpll_phase = DPLL_PHASE_6;
2062                 channel->dpll_ctrl_n = DPLL_CTRL_6;
2063                 channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_6;
2064                 break;
2065         case 7:
2066                 channel->dpll_freq = DPLL_FREQ_7;
2067                 channel->dpll_n = DPLL_7;
2068                 channel->hw_dpll_n = HW_DPLL_7;
2069                 channel->dpll_phase = DPLL_PHASE_7;
2070                 channel->dpll_ctrl_n = DPLL_CTRL_7;
2071                 channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_7;
2072                 break;
2073         default:
2074                 err = -EINVAL;
2075         }
2076
2077         return err;
2078 }
2079
2080 static int idtcm_enable_channel(struct idtcm *idtcm, u32 index)
2081 {
2082         struct idtcm_channel *channel;
2083         int err;
2084
2085         if (!(index < MAX_TOD))
2086                 return -EINVAL;
2087
2088         channel = &idtcm->channel[index];
2089
2090         /* Set pll addresses */
2091         err = configure_channel_pll(channel);
2092         if (err)
2093                 return err;
2094
2095         /* Set tod addresses */
2096         switch (index) {
2097         case 0:
2098                 channel->tod_read_primary = TOD_READ_PRIMARY_0;
2099                 channel->tod_write = TOD_WRITE_0;
2100                 channel->tod_n = TOD_0;
2101                 break;
2102         case 1:
2103                 channel->tod_read_primary = TOD_READ_PRIMARY_1;
2104                 channel->tod_write = TOD_WRITE_1;
2105                 channel->tod_n = TOD_1;
2106                 break;
2107         case 2:
2108                 channel->tod_read_primary = TOD_READ_PRIMARY_2;
2109                 channel->tod_write = TOD_WRITE_2;
2110                 channel->tod_n = TOD_2;
2111                 break;
2112         case 3:
2113                 channel->tod_read_primary = TOD_READ_PRIMARY_3;
2114                 channel->tod_write = TOD_WRITE_3;
2115                 channel->tod_n = TOD_3;
2116                 break;
2117         default:
2118                 return -EINVAL;
2119         }
2120
2121         channel->idtcm = idtcm;
2122
2123         if (idtcm->deprecated)
2124                 channel->caps = idtcm_caps_deprecated;
2125         else
2126                 channel->caps = idtcm_caps;
2127
2128         snprintf(channel->caps.name, sizeof(channel->caps.name),
2129                  "IDT CM TOD%u", index);
2130
2131         if (!idtcm->deprecated) {
2132                 err = idtcm_enable_tod_sync(channel);
2133                 if (err) {
2134                         dev_err(&idtcm->client->dev,
2135                                 "Failed at line %d in func %s!\n",
2136                                 __LINE__,
2137                                 __func__);
2138                         return err;
2139                 }
2140         }
2141
2142         /* Sync pll mode with hardware */
2143         err = idtcm_get_pll_mode(channel, &channel->pll_mode);
2144         if (err) {
2145                 dev_err(&idtcm->client->dev,
2146                         "Error: %s - Unable to read pll mode\n", __func__);
2147                 return err;
2148         }
2149
2150         err = idtcm_enable_tod(channel);
2151         if (err) {
2152                 dev_err(&idtcm->client->dev,
2153                         "Failed at line %d in func %s!\n",
2154                         __LINE__,
2155                         __func__);
2156                 return err;
2157         }
2158
2159         channel->ptp_clock = ptp_clock_register(&channel->caps, NULL);
2160
2161         if (IS_ERR(channel->ptp_clock)) {
2162                 err = PTR_ERR(channel->ptp_clock);
2163                 channel->ptp_clock = NULL;
2164                 return err;
2165         }
2166
2167         if (!channel->ptp_clock)
2168                 return -ENOTSUPP;
2169
2170         dev_info(&idtcm->client->dev, "PLL%d registered as ptp%d\n",
2171                  index, channel->ptp_clock->index);
2172
2173         return 0;
2174 }
2175
2176 static void ptp_clock_unregister_all(struct idtcm *idtcm)
2177 {
2178         u8 i;
2179         struct idtcm_channel *channel;
2180
2181         for (i = 0; i < MAX_TOD; i++) {
2182
2183                 channel = &idtcm->channel[i];
2184
2185                 if (channel->ptp_clock)
2186                         ptp_clock_unregister(channel->ptp_clock);
2187         }
2188 }
2189
2190 static void set_default_masks(struct idtcm *idtcm)
2191 {
2192         idtcm->tod_mask = DEFAULT_TOD_MASK;
2193
2194         idtcm->channel[0].pll = DEFAULT_TOD0_PTP_PLL;
2195         idtcm->channel[1].pll = DEFAULT_TOD1_PTP_PLL;
2196         idtcm->channel[2].pll = DEFAULT_TOD2_PTP_PLL;
2197         idtcm->channel[3].pll = DEFAULT_TOD3_PTP_PLL;
2198
2199         idtcm->channel[0].output_mask = DEFAULT_OUTPUT_MASK_PLL0;
2200         idtcm->channel[1].output_mask = DEFAULT_OUTPUT_MASK_PLL1;
2201         idtcm->channel[2].output_mask = DEFAULT_OUTPUT_MASK_PLL2;
2202         idtcm->channel[3].output_mask = DEFAULT_OUTPUT_MASK_PLL3;
2203 }
2204
2205 static int idtcm_probe(struct i2c_client *client,
2206                        const struct i2c_device_id *id)
2207 {
2208         struct idtcm *idtcm;
2209         int err;
2210         u8 i;
2211         char *fmt = "Failed at %d in line %s with channel output %d!\n";
2212
2213         /* Unused for now */
2214         (void)id;
2215
2216         idtcm = devm_kzalloc(&client->dev, sizeof(struct idtcm), GFP_KERNEL);
2217
2218         if (!idtcm)
2219                 return -ENOMEM;
2220
2221         idtcm->client = client;
2222         idtcm->page_offset = 0xff;
2223         idtcm->calculate_overhead_flag = 0;
2224
2225         set_default_masks(idtcm);
2226
2227         mutex_init(&idtcm->reg_lock);
2228         mutex_lock(&idtcm->reg_lock);
2229
2230         idtcm_set_version_info(idtcm);
2231
2232         err = idtcm_load_firmware(idtcm, &client->dev);
2233
2234         if (err)
2235                 dev_warn(&idtcm->client->dev,
2236                          "loading firmware failed with %d\n", err);
2237
2238         if (wait_for_boot_status_ready(idtcm))
2239                 dev_warn(&idtcm->client->dev, "BOOT_STATUS != 0xA0\n");
2240
2241         if (idtcm->tod_mask) {
2242                 for (i = 0; i < MAX_TOD; i++) {
2243                         if (idtcm->tod_mask & (1 << i)) {
2244                                 err = idtcm_enable_channel(idtcm, i);
2245                                 if (err) {
2246                                         dev_err(&idtcm->client->dev,
2247                                                 fmt,
2248                                                 __LINE__,
2249                                                 __func__,
2250                                                 i);
2251                                         break;
2252                                 }
2253                         }
2254                 }
2255         } else {
2256                 dev_err(&idtcm->client->dev,
2257                         "no PLLs flagged as PHCs, nothing to do\n");
2258                 err = -ENODEV;
2259         }
2260
2261         mutex_unlock(&idtcm->reg_lock);
2262
2263         if (err) {
2264                 ptp_clock_unregister_all(idtcm);
2265                 return err;
2266         }
2267
2268         i2c_set_clientdata(client, idtcm);
2269
2270         return 0;
2271 }
2272
2273 static int idtcm_remove(struct i2c_client *client)
2274 {
2275         struct idtcm *idtcm = i2c_get_clientdata(client);
2276
2277         ptp_clock_unregister_all(idtcm);
2278
2279         mutex_destroy(&idtcm->reg_lock);
2280
2281         return 0;
2282 }
2283
2284 #ifdef CONFIG_OF
2285 static const struct of_device_id idtcm_dt_id[] = {
2286         { .compatible = "idt,8a34000" },
2287         { .compatible = "idt,8a34001" },
2288         { .compatible = "idt,8a34002" },
2289         { .compatible = "idt,8a34003" },
2290         { .compatible = "idt,8a34004" },
2291         { .compatible = "idt,8a34005" },
2292         { .compatible = "idt,8a34006" },
2293         { .compatible = "idt,8a34007" },
2294         { .compatible = "idt,8a34008" },
2295         { .compatible = "idt,8a34009" },
2296         { .compatible = "idt,8a34010" },
2297         { .compatible = "idt,8a34011" },
2298         { .compatible = "idt,8a34012" },
2299         { .compatible = "idt,8a34013" },
2300         { .compatible = "idt,8a34014" },
2301         { .compatible = "idt,8a34015" },
2302         { .compatible = "idt,8a34016" },
2303         { .compatible = "idt,8a34017" },
2304         { .compatible = "idt,8a34018" },
2305         { .compatible = "idt,8a34019" },
2306         { .compatible = "idt,8a34040" },
2307         { .compatible = "idt,8a34041" },
2308         { .compatible = "idt,8a34042" },
2309         { .compatible = "idt,8a34043" },
2310         { .compatible = "idt,8a34044" },
2311         { .compatible = "idt,8a34045" },
2312         { .compatible = "idt,8a34046" },
2313         { .compatible = "idt,8a34047" },
2314         { .compatible = "idt,8a34048" },
2315         { .compatible = "idt,8a34049" },
2316         {},
2317 };
2318 MODULE_DEVICE_TABLE(of, idtcm_dt_id);
2319 #endif
2320
2321 static const struct i2c_device_id idtcm_i2c_id[] = {
2322         { "8a34000" },
2323         { "8a34001" },
2324         { "8a34002" },
2325         { "8a34003" },
2326         { "8a34004" },
2327         { "8a34005" },
2328         { "8a34006" },
2329         { "8a34007" },
2330         { "8a34008" },
2331         { "8a34009" },
2332         { "8a34010" },
2333         { "8a34011" },
2334         { "8a34012" },
2335         { "8a34013" },
2336         { "8a34014" },
2337         { "8a34015" },
2338         { "8a34016" },
2339         { "8a34017" },
2340         { "8a34018" },
2341         { "8a34019" },
2342         { "8a34040" },
2343         { "8a34041" },
2344         { "8a34042" },
2345         { "8a34043" },
2346         { "8a34044" },
2347         { "8a34045" },
2348         { "8a34046" },
2349         { "8a34047" },
2350         { "8a34048" },
2351         { "8a34049" },
2352         {},
2353 };
2354 MODULE_DEVICE_TABLE(i2c, idtcm_i2c_id);
2355
2356 static struct i2c_driver idtcm_driver = {
2357         .driver = {
2358                 .of_match_table = of_match_ptr(idtcm_dt_id),
2359                 .name           = "idtcm",
2360         },
2361         .probe          = idtcm_probe,
2362         .remove         = idtcm_remove,
2363         .id_table       = idtcm_i2c_id,
2364 };
2365
2366 module_i2c_driver(idtcm_driver);