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