Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ptp: ptp_clockmatrix: update to support 4.8.7 firmware

With 4.8.7 firmware, adjtime can change delta instead of absolute time,
which greately increases snap accuracy. PPS alignment doesn't have to
be set for every single TOD change. Other minor changes includes:
adding more debug logs, increasing snap accuracy for pre 4.8.7 firmware
and supporting new tcs2bin format.

Signed-off-by: Min Li <min.li.xe@renesas.com>
Acked-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Min Li and committed by
David S. Miller
7ea5fda2 2a043e9c

+1045 -209
+48
drivers/ptp/idt8a340_reg.h
··· 20 20 #define HW_DPLL_1 (0x8b00) 21 21 #define HW_DPLL_2 (0x8c00) 22 22 #define HW_DPLL_3 (0x8d00) 23 + #define HW_DPLL_4 (0x8e00) 24 + #define HW_DPLL_5 (0x8f00) 25 + #define HW_DPLL_6 (0x9000) 26 + #define HW_DPLL_7 (0x9100) 23 27 24 28 #define HW_DPLL_TOD_SW_TRIG_ADDR__0 (0x080) 25 29 #define HW_DPLL_TOD_CTRL_1 (0x089) ··· 60 56 #define SYNCTRL1_FBDIV_SYNC_TRIG BIT(2) 61 57 #define SYNCTRL1_Q1_DIV_SYNC_TRIG BIT(1) 62 58 #define SYNCTRL1_Q0_DIV_SYNC_TRIG BIT(0) 59 + 60 + #define HW_Q8_CTRL_SPARE (0xa7d4) 61 + #define HW_Q11_CTRL_SPARE (0xa7ec) 62 + 63 + /** 64 + * Select FOD5 as sync_trigger for Q8 divider. 65 + * Transition from logic zero to one 66 + * sets trigger to sync Q8 divider. 67 + * 68 + * Unused when FOD4 is driving Q8 divider (normal operation). 69 + */ 70 + #define Q9_TO_Q8_SYNC_TRIG BIT(1) 71 + 72 + /** 73 + * Enable FOD5 as driver for clock and sync for Q8 divider. 74 + * Enable fanout buffer for FOD5. 75 + * 76 + * Unused when FOD4 is driving Q8 divider (normal operation). 77 + */ 78 + #define Q9_TO_Q8_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK (BIT(0) | BIT(2)) 79 + 80 + /** 81 + * Select FOD6 as sync_trigger for Q11 divider. 82 + * Transition from logic zero to one 83 + * sets trigger to sync Q11 divider. 84 + * 85 + * Unused when FOD7 is driving Q11 divider (normal operation). 86 + */ 87 + #define Q10_TO_Q11_SYNC_TRIG BIT(1) 88 + 89 + /** 90 + * Enable FOD6 as driver for clock and sync for Q11 divider. 91 + * Enable fanout buffer for FOD6. 92 + * 93 + * Unused when FOD7 is driving Q11 divider (normal operation). 94 + */ 95 + #define Q10_TO_Q11_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK (BIT(0) | BIT(2)) 63 96 64 97 #define RESET_CTRL 0xc000 65 98 #define SM_RESET 0x0012 ··· 232 191 233 192 #define DPLL_CTRL_0 0xc600 234 193 #define DPLL_CTRL_DPLL_MANU_REF_CFG 0x0001 194 + #define DPLL_CTRL_COMBO_MASTER_CFG 0x003a 235 195 236 196 #define DPLL_CTRL_1 0xc63c 237 197 ··· 688 646 /* Bit definitions for the TOD_WRITE_CMD register */ 689 647 #define TOD_WRITE_SELECTION_SHIFT (0) 690 648 #define TOD_WRITE_SELECTION_MASK (0xf) 649 + /* 4.8.7 */ 650 + #define TOD_WRITE_TYPE_SHIFT (4) 651 + #define TOD_WRITE_TYPE_MASK (0x3) 691 652 692 653 /* Bit definitions for the TOD_READ_PRIMARY_SEL_CFG_0 register */ 693 654 #define RD_PWM_DECODER_INDEX_SHIFT (4) ··· 702 657 #define TOD_READ_TRIGGER_MODE BIT(4) 703 658 #define TOD_READ_TRIGGER_SHIFT (0) 704 659 #define TOD_READ_TRIGGER_MASK (0xf) 660 + 661 + /* Bit definitions for the DPLL_CTRL_COMBO_MASTER_CFG register */ 662 + #define COMBO_MASTER_HOLD BIT(0) 705 663 706 664 #endif
+947 -198
drivers/ptp/ptp_clockmatrix.c
··· 13 13 #include <linux/jiffies.h> 14 14 #include <linux/kernel.h> 15 15 #include <linux/timekeeping.h> 16 + #include <linux/string.h> 16 17 17 18 #include "ptp_private.h" 18 19 #include "ptp_clockmatrix.h" ··· 23 22 MODULE_AUTHOR("IDT support-1588 <IDT-support-1588@lm.renesas.com>"); 24 23 MODULE_VERSION("1.0"); 25 24 MODULE_LICENSE("GPL"); 25 + 26 + /* 27 + * The name of the firmware file to be loaded 28 + * over-rides any automatic selection 29 + */ 30 + static char *firmware; 31 + module_param(firmware, charp, 0); 26 32 27 33 #define SETTIME_CORRECTION (0) 28 34 ··· 103 95 return 0; 104 96 } 105 97 98 + static int idtcm_strverscmp(const char *ver1, const char *ver2) 99 + { 100 + u8 num1; 101 + u8 num2; 102 + int result = 0; 103 + 104 + /* loop through each level of the version string */ 105 + while (result == 0) { 106 + /* extract leading version numbers */ 107 + if (kstrtou8(ver1, 10, &num1) < 0) 108 + return -1; 109 + 110 + if (kstrtou8(ver2, 10, &num2) < 0) 111 + return -1; 112 + 113 + /* if numbers differ, then set the result */ 114 + if (num1 < num2) 115 + result = -1; 116 + else if (num1 > num2) 117 + result = 1; 118 + else { 119 + /* if numbers are the same, go to next level */ 120 + ver1 = strchr(ver1, '.'); 121 + ver2 = strchr(ver2, '.'); 122 + if (!ver1 && !ver2) 123 + break; 124 + else if (!ver1) 125 + result = -1; 126 + else if (!ver2) 127 + result = 1; 128 + else { 129 + ver1++; 130 + ver2++; 131 + } 132 + } 133 + } 134 + return result; 135 + } 136 + 106 137 static int idtcm_xfer(struct idtcm *idtcm, 107 138 u8 regaddr, 108 139 u8 *buf, ··· 151 104 struct i2c_client *client = idtcm->client; 152 105 struct i2c_msg msg[2]; 153 106 int cnt; 107 + char *fmt = "i2c_transfer failed at %d in %s for %s, at addr: %04X!\n"; 154 108 155 109 msg[0].addr = client->addr; 156 110 msg[0].flags = 0; ··· 166 118 cnt = i2c_transfer(client->adapter, msg, 2); 167 119 168 120 if (cnt < 0) { 169 - dev_err(&client->dev, "i2c_transfer returned %d\n", cnt); 121 + dev_err(&client->dev, 122 + fmt, 123 + __LINE__, 124 + __func__, 125 + write ? "write" : "read", 126 + regaddr); 170 127 return cnt; 171 128 } else if (cnt != 2) { 172 129 dev_err(&client->dev, ··· 197 144 198 145 err = idtcm_xfer(idtcm, PAGE_ADDR, buf, sizeof(buf), 1); 199 146 200 - if (err) 147 + if (err) { 148 + idtcm->page_offset = 0xff; 201 149 dev_err(&idtcm->client->dev, "failed to set page offset\n"); 202 - else 150 + } else { 203 151 idtcm->page_offset = val; 152 + } 204 153 205 154 return err; 206 155 } ··· 253 198 { 254 199 struct idtcm *idtcm = channel->idtcm; 255 200 u8 buf[TOD_BYTE_COUNT]; 201 + u8 timeout = 10; 256 202 u8 trigger; 257 203 int err; 258 204 ··· 264 208 265 209 trigger &= ~(TOD_READ_TRIGGER_MASK << TOD_READ_TRIGGER_SHIFT); 266 210 trigger |= (1 << TOD_READ_TRIGGER_SHIFT); 267 - trigger |= TOD_READ_TRIGGER_MODE; 211 + trigger &= ~TOD_READ_TRIGGER_MODE; /* single shot */ 268 212 269 213 err = idtcm_write(idtcm, channel->tod_read_primary, 270 214 TOD_READ_PRIMARY_CMD, &trigger, sizeof(trigger)); 271 - 272 215 if (err) 273 216 return err; 274 217 275 - if (idtcm->calculate_overhead_flag) 276 - idtcm->start_time = ktime_get_raw(); 218 + /* wait trigger to be 0 */ 219 + while (trigger & TOD_READ_TRIGGER_MASK) { 220 + 221 + if (idtcm->calculate_overhead_flag) 222 + idtcm->start_time = ktime_get_raw(); 223 + 224 + err = idtcm_read(idtcm, channel->tod_read_primary, 225 + TOD_READ_PRIMARY_CMD, &trigger, 226 + sizeof(trigger)); 227 + 228 + if (err) 229 + return err; 230 + 231 + if (--timeout == 0) 232 + return -EIO; 233 + } 277 234 278 235 err = idtcm_read(idtcm, channel->tod_read_primary, 279 236 TOD_READ_PRIMARY, buf, sizeof(buf)); ··· 309 240 u8 val; 310 241 u16 sync_ctrl0; 311 242 u16 sync_ctrl1; 243 + u8 temp; 312 244 313 245 if ((qn == 0) && (qn_plus_1 == 0)) 314 246 return 0; ··· 375 305 if (err) 376 306 return err; 377 307 308 + /* PLL5 can have OUT8 as second additional output. */ 309 + if ((pll == 5) && (qn_plus_1 != 0)) { 310 + err = idtcm_read(idtcm, 0, HW_Q8_CTRL_SPARE, 311 + &temp, sizeof(temp)); 312 + if (err) 313 + return err; 314 + 315 + temp &= ~(Q9_TO_Q8_SYNC_TRIG); 316 + 317 + err = idtcm_write(idtcm, 0, HW_Q8_CTRL_SPARE, 318 + &temp, sizeof(temp)); 319 + if (err) 320 + return err; 321 + 322 + temp |= Q9_TO_Q8_SYNC_TRIG; 323 + 324 + err = idtcm_write(idtcm, 0, HW_Q8_CTRL_SPARE, 325 + &temp, sizeof(temp)); 326 + if (err) 327 + return err; 328 + } 329 + 330 + /* PLL6 can have OUT11 as second additional output. */ 331 + if ((pll == 6) && (qn_plus_1 != 0)) { 332 + err = idtcm_read(idtcm, 0, HW_Q11_CTRL_SPARE, 333 + &temp, sizeof(temp)); 334 + if (err) 335 + return err; 336 + 337 + temp &= ~(Q10_TO_Q11_SYNC_TRIG); 338 + 339 + err = idtcm_write(idtcm, 0, HW_Q11_CTRL_SPARE, 340 + &temp, sizeof(temp)); 341 + if (err) 342 + return err; 343 + 344 + temp |= Q10_TO_Q11_SYNC_TRIG; 345 + 346 + err = idtcm_write(idtcm, 0, HW_Q11_CTRL_SPARE, 347 + &temp, sizeof(temp)); 348 + if (err) 349 + return err; 350 + } 351 + 378 352 /* Place master sync out of reset */ 379 353 val &= ~(SYNCTRL1_MASTER_SYNC_RST); 380 354 err = idtcm_write(idtcm, 0, sync_ctrl1, &val, sizeof(val)); 355 + 356 + return err; 357 + } 358 + 359 + static int sync_source_dpll_tod_pps(u16 tod_addr, u8 *sync_src) 360 + { 361 + int err = 0; 362 + 363 + switch (tod_addr) { 364 + case TOD_0: 365 + *sync_src = SYNC_SOURCE_DPLL0_TOD_PPS; 366 + break; 367 + case TOD_1: 368 + *sync_src = SYNC_SOURCE_DPLL1_TOD_PPS; 369 + break; 370 + case TOD_2: 371 + *sync_src = SYNC_SOURCE_DPLL2_TOD_PPS; 372 + break; 373 + case TOD_3: 374 + *sync_src = SYNC_SOURCE_DPLL3_TOD_PPS; 375 + break; 376 + default: 377 + err = -EINVAL; 378 + } 381 379 382 380 return err; 383 381 } ··· 459 321 u8 qn; 460 322 u8 qn_plus_1; 461 323 int err = 0; 324 + u8 out8_mux = 0; 325 + u8 out11_mux = 0; 326 + u8 temp; 462 327 463 328 u16 output_mask = channel->output_mask; 464 329 465 - switch (channel->dpll_n) { 466 - case DPLL_0: 467 - sync_src = SYNC_SOURCE_DPLL0_TOD_PPS; 468 - break; 469 - case DPLL_1: 470 - sync_src = SYNC_SOURCE_DPLL1_TOD_PPS; 471 - break; 472 - case DPLL_2: 473 - sync_src = SYNC_SOURCE_DPLL2_TOD_PPS; 474 - break; 475 - case DPLL_3: 476 - sync_src = SYNC_SOURCE_DPLL3_TOD_PPS; 477 - break; 478 - default: 479 - return -EINVAL; 480 - } 330 + err = sync_source_dpll_tod_pps(channel->tod_n, &sync_src); 331 + if (err) 332 + return err; 333 + 334 + err = idtcm_read(idtcm, 0, HW_Q8_CTRL_SPARE, 335 + &temp, sizeof(temp)); 336 + if (err) 337 + return err; 338 + 339 + if ((temp & Q9_TO_Q8_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK) == 340 + Q9_TO_Q8_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK) 341 + out8_mux = 1; 342 + 343 + err = idtcm_read(idtcm, 0, HW_Q11_CTRL_SPARE, 344 + &temp, sizeof(temp)); 345 + if (err) 346 + return err; 347 + 348 + if ((temp & Q10_TO_Q11_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK) == 349 + Q10_TO_Q11_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK) 350 + out11_mux = 1; 481 351 482 352 for (pll = 0; pll < 8; pll++) { 483 - 484 - qn = output_mask & 0x1; 485 - output_mask = output_mask >> 1; 353 + qn = 0; 354 + qn_plus_1 = 0; 486 355 487 356 if (pll < 4) { 488 357 /* First 4 pll has 2 outputs */ 358 + qn = output_mask & 0x1; 359 + output_mask = output_mask >> 1; 489 360 qn_plus_1 = output_mask & 0x1; 490 361 output_mask = output_mask >> 1; 491 - } else { 492 - qn_plus_1 = 0; 362 + } else if (pll == 4) { 363 + if (out8_mux == 0) { 364 + qn = output_mask & 0x1; 365 + output_mask = output_mask >> 1; 366 + } 367 + } else if (pll == 5) { 368 + if (out8_mux) { 369 + qn_plus_1 = output_mask & 0x1; 370 + output_mask = output_mask >> 1; 371 + } 372 + qn = output_mask & 0x1; 373 + output_mask = output_mask >> 1; 374 + } else if (pll == 6) { 375 + qn = output_mask & 0x1; 376 + output_mask = output_mask >> 1; 377 + if (out11_mux) { 378 + qn_plus_1 = output_mask & 0x1; 379 + output_mask = output_mask >> 1; 380 + } 381 + } else if (pll == 7) { 382 + if (out11_mux == 0) { 383 + qn = output_mask & 0x1; 384 + output_mask = output_mask >> 1; 385 + } 493 386 } 494 387 495 388 if ((qn != 0) || (qn_plus_1 != 0)) ··· 534 365 return err; 535 366 } 536 367 537 - static int _idtcm_set_dpll_tod(struct idtcm_channel *channel, 368 + static int _idtcm_set_dpll_hw_tod(struct idtcm_channel *channel, 538 369 struct timespec64 const *ts, 539 370 enum hw_tod_write_trig_sel wr_trig) 540 371 { ··· 608 439 return err; 609 440 } 610 441 442 + static int _idtcm_set_dpll_scsr_tod(struct idtcm_channel *channel, 443 + struct timespec64 const *ts, 444 + enum scsr_tod_write_trig_sel wr_trig, 445 + enum scsr_tod_write_type_sel wr_type) 446 + { 447 + struct idtcm *idtcm = channel->idtcm; 448 + unsigned char buf[TOD_BYTE_COUNT], cmd; 449 + struct timespec64 local_ts = *ts; 450 + int err, count = 0; 451 + 452 + timespec64_add_ns(&local_ts, SETTIME_CORRECTION); 453 + 454 + err = timespec_to_char_array(&local_ts, buf, sizeof(buf)); 455 + 456 + if (err) 457 + return err; 458 + 459 + err = idtcm_write(idtcm, channel->tod_write, TOD_WRITE, 460 + buf, sizeof(buf)); 461 + if (err) 462 + return err; 463 + 464 + /* Trigger the write operation. */ 465 + err = idtcm_read(idtcm, channel->tod_write, TOD_WRITE_CMD, 466 + &cmd, sizeof(cmd)); 467 + if (err) 468 + return err; 469 + 470 + cmd &= ~(TOD_WRITE_SELECTION_MASK << TOD_WRITE_SELECTION_SHIFT); 471 + cmd &= ~(TOD_WRITE_TYPE_MASK << TOD_WRITE_TYPE_SHIFT); 472 + cmd |= (wr_trig << TOD_WRITE_SELECTION_SHIFT); 473 + cmd |= (wr_type << TOD_WRITE_TYPE_SHIFT); 474 + 475 + err = idtcm_write(idtcm, channel->tod_write, TOD_WRITE_CMD, 476 + &cmd, sizeof(cmd)); 477 + if (err) 478 + return err; 479 + 480 + /* Wait for the operation to complete. */ 481 + while (1) { 482 + /* pps trigger takes up to 1 sec to complete */ 483 + if (wr_trig == SCSR_TOD_WR_TRIG_SEL_TODPPS) 484 + msleep(50); 485 + 486 + err = idtcm_read(idtcm, channel->tod_write, TOD_WRITE_CMD, 487 + &cmd, sizeof(cmd)); 488 + if (err) 489 + return err; 490 + 491 + if (cmd == 0) 492 + break; 493 + 494 + if (++count > 20) { 495 + dev_err(&idtcm->client->dev, 496 + "Timed out waiting for the write counter\n"); 497 + return -EIO; 498 + } 499 + } 500 + 501 + return 0; 502 + } 503 + 611 504 static int _idtcm_settime(struct idtcm_channel *channel, 612 505 struct timespec64 const *ts, 613 506 enum hw_tod_write_trig_sel wr_trig) 614 507 { 615 508 struct idtcm *idtcm = channel->idtcm; 616 - s32 retval; 617 509 int err; 618 510 int i; 619 511 u8 trig_sel; 620 512 621 - err = _idtcm_set_dpll_tod(channel, ts, wr_trig); 513 + err = _idtcm_set_dpll_hw_tod(channel, ts, wr_trig); 622 514 623 515 if (err) 624 516 return err; ··· 699 469 err = 1; 700 470 } 701 471 702 - if (err) 472 + if (err) { 473 + dev_err(&idtcm->client->dev, 474 + "Failed at line %d in func %s!\n", 475 + __LINE__, 476 + __func__); 703 477 return err; 478 + } 704 479 705 - retval = idtcm_sync_pps_output(channel); 480 + return idtcm_sync_pps_output(channel); 481 + } 706 482 707 - return retval; 483 + static int _idtcm_settime_v487(struct idtcm_channel *channel, 484 + struct timespec64 const *ts, 485 + enum scsr_tod_write_type_sel wr_type) 486 + { 487 + return _idtcm_set_dpll_scsr_tod(channel, ts, 488 + SCSR_TOD_WR_TRIG_SEL_IMMEDIATE, 489 + wr_type); 708 490 } 709 491 710 492 static int idtcm_set_phase_pull_in_offset(struct idtcm_channel *channel, ··· 807 565 return err; 808 566 } 809 567 568 + static int set_tod_write_overhead(struct idtcm_channel *channel) 569 + { 570 + struct idtcm *idtcm = channel->idtcm; 571 + s64 current_ns = 0; 572 + s64 lowest_ns = 0; 573 + int err; 574 + u8 i; 575 + 576 + ktime_t start; 577 + ktime_t stop; 578 + 579 + char buf[TOD_BYTE_COUNT] = {0}; 580 + 581 + /* Set page offset */ 582 + idtcm_write(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_OVR__0, 583 + buf, sizeof(buf)); 584 + 585 + for (i = 0; i < TOD_WRITE_OVERHEAD_COUNT_MAX; i++) { 586 + 587 + start = ktime_get_raw(); 588 + 589 + err = idtcm_write(idtcm, channel->hw_dpll_n, 590 + HW_DPLL_TOD_OVR__0, buf, sizeof(buf)); 591 + 592 + if (err) 593 + return err; 594 + 595 + stop = ktime_get_raw(); 596 + 597 + current_ns = ktime_to_ns(stop - start); 598 + 599 + if (i == 0) { 600 + lowest_ns = current_ns; 601 + } else { 602 + if (current_ns < lowest_ns) 603 + lowest_ns = current_ns; 604 + } 605 + } 606 + 607 + idtcm->tod_write_overhead_ns = lowest_ns; 608 + 609 + return err; 610 + } 611 + 810 612 static int _idtcm_adjtime(struct idtcm_channel *channel, s64 delta) 811 613 { 812 614 int err; ··· 862 576 err = idtcm_do_phase_pull_in(channel, delta, 0); 863 577 } else { 864 578 idtcm->calculate_overhead_flag = 1; 579 + 580 + err = set_tod_write_overhead(channel); 581 + 582 + if (err) 583 + return err; 865 584 866 585 err = _idtcm_gettime(channel, &ts); 867 586 ··· 947 656 config_select, sizeof(u8)); 948 657 } 949 658 950 - static int process_pll_mask(struct idtcm *idtcm, u32 addr, u8 val, u8 *mask) 951 - { 952 - int err = 0; 953 - 954 - if (addr == PLL_MASK_ADDR) { 955 - if ((val & 0xf0) || !(val & 0xf)) { 956 - dev_err(&idtcm->client->dev, 957 - "Invalid PLL mask 0x%hhx\n", val); 958 - err = -EINVAL; 959 - } 960 - *mask = val; 961 - } 962 - 963 - return err; 964 - } 965 - 966 659 static int set_pll_output_mask(struct idtcm *idtcm, u16 addr, u8 val) 967 660 { 968 661 int err = 0; 969 662 970 663 switch (addr) { 971 - case OUTPUT_MASK_PLL0_ADDR: 664 + case TOD0_OUT_ALIGN_MASK_ADDR: 972 665 SET_U16_LSB(idtcm->channel[0].output_mask, val); 973 666 break; 974 - case OUTPUT_MASK_PLL0_ADDR + 1: 667 + case TOD0_OUT_ALIGN_MASK_ADDR + 1: 975 668 SET_U16_MSB(idtcm->channel[0].output_mask, val); 976 669 break; 977 - case OUTPUT_MASK_PLL1_ADDR: 670 + case TOD1_OUT_ALIGN_MASK_ADDR: 978 671 SET_U16_LSB(idtcm->channel[1].output_mask, val); 979 672 break; 980 - case OUTPUT_MASK_PLL1_ADDR + 1: 673 + case TOD1_OUT_ALIGN_MASK_ADDR + 1: 981 674 SET_U16_MSB(idtcm->channel[1].output_mask, val); 982 675 break; 983 - case OUTPUT_MASK_PLL2_ADDR: 676 + case TOD2_OUT_ALIGN_MASK_ADDR: 984 677 SET_U16_LSB(idtcm->channel[2].output_mask, val); 985 678 break; 986 - case OUTPUT_MASK_PLL2_ADDR + 1: 679 + case TOD2_OUT_ALIGN_MASK_ADDR + 1: 987 680 SET_U16_MSB(idtcm->channel[2].output_mask, val); 988 681 break; 989 - case OUTPUT_MASK_PLL3_ADDR: 682 + case TOD3_OUT_ALIGN_MASK_ADDR: 990 683 SET_U16_LSB(idtcm->channel[3].output_mask, val); 991 684 break; 992 - case OUTPUT_MASK_PLL3_ADDR + 1: 685 + case TOD3_OUT_ALIGN_MASK_ADDR + 1: 993 686 SET_U16_MSB(idtcm->channel[3].output_mask, val); 994 687 break; 995 688 default: 996 - err = -EINVAL; 689 + err = -EFAULT; /* Bad address */; 997 690 break; 998 691 } 999 692 1000 693 return err; 694 + } 695 + 696 + static int set_tod_ptp_pll(struct idtcm *idtcm, u8 index, u8 pll) 697 + { 698 + if (index >= MAX_TOD) { 699 + dev_err(&idtcm->client->dev, "ToD%d not supported\n", index); 700 + return -EINVAL; 701 + } 702 + 703 + if (pll >= MAX_PLL) { 704 + dev_err(&idtcm->client->dev, "Pll%d not supported\n", pll); 705 + return -EINVAL; 706 + } 707 + 708 + idtcm->channel[index].pll = pll; 709 + 710 + return 0; 1001 711 } 1002 712 1003 713 static int check_and_set_masks(struct idtcm *idtcm, ··· 1007 715 { 1008 716 int err = 0; 1009 717 1010 - if (set_pll_output_mask(idtcm, regaddr, val)) { 1011 - /* Not an output mask, check for pll mask */ 1012 - err = process_pll_mask(idtcm, regaddr, val, &idtcm->pll_mask); 718 + switch (regaddr) { 719 + case TOD_MASK_ADDR: 720 + if ((val & 0xf0) || !(val & 0x0f)) { 721 + dev_err(&idtcm->client->dev, 722 + "Invalid TOD mask 0x%hhx\n", val); 723 + err = -EINVAL; 724 + } else { 725 + idtcm->tod_mask = val; 726 + } 727 + break; 728 + case TOD0_PTP_PLL_ADDR: 729 + err = set_tod_ptp_pll(idtcm, 0, val); 730 + break; 731 + case TOD1_PTP_PLL_ADDR: 732 + err = set_tod_ptp_pll(idtcm, 1, val); 733 + break; 734 + case TOD2_PTP_PLL_ADDR: 735 + err = set_tod_ptp_pll(idtcm, 2, val); 736 + break; 737 + case TOD3_PTP_PLL_ADDR: 738 + err = set_tod_ptp_pll(idtcm, 3, val); 739 + break; 740 + default: 741 + err = set_pll_output_mask(idtcm, regaddr, val); 742 + break; 1013 743 } 1014 744 1015 745 return err; 1016 746 } 1017 747 1018 - static void display_pll_and_output_masks(struct idtcm *idtcm) 748 + static void display_pll_and_masks(struct idtcm *idtcm) 1019 749 { 1020 750 u8 i; 1021 751 u8 mask; 1022 752 1023 - dev_dbg(&idtcm->client->dev, "pllmask = 0x%02x\n", idtcm->pll_mask); 753 + dev_dbg(&idtcm->client->dev, "tod_mask = 0x%02x\n", idtcm->tod_mask); 1024 754 1025 - for (i = 0; i < MAX_PHC_PLL; i++) { 755 + for (i = 0; i < MAX_TOD; i++) { 1026 756 mask = 1 << i; 1027 757 1028 - if (mask & idtcm->pll_mask) 758 + if (mask & idtcm->tod_mask) 1029 759 dev_dbg(&idtcm->client->dev, 1030 - "PLL%d output_mask = 0x%04x\n", 1031 - i, idtcm->channel[i].output_mask); 760 + "TOD%d pll = %d output_mask = 0x%04x\n", 761 + i, idtcm->channel[i].pll, 762 + idtcm->channel[i].output_mask); 1032 763 } 1033 764 } 1034 765 1035 766 static int idtcm_load_firmware(struct idtcm *idtcm, 1036 767 struct device *dev) 1037 768 { 769 + char fname[128] = FW_FILENAME; 1038 770 const struct firmware *fw; 1039 771 struct idtcm_fwrc *rec; 1040 772 u32 regaddr; ··· 1067 751 u8 val; 1068 752 u8 loaddr; 1069 753 1070 - dev_dbg(&idtcm->client->dev, "requesting firmware '%s'\n", FW_FILENAME); 754 + if (firmware) /* module parameter */ 755 + snprintf(fname, sizeof(fname), "%s", firmware); 1071 756 1072 - err = request_firmware(&fw, FW_FILENAME, dev); 757 + dev_dbg(&idtcm->client->dev, "requesting firmware '%s'\n", fname); 1073 758 1074 - if (err) 759 + err = request_firmware(&fw, fname, dev); 760 + 761 + if (err) { 762 + dev_err(&idtcm->client->dev, 763 + "Failed at line %d in func %s!\n", 764 + __LINE__, 765 + __func__); 1075 766 return err; 767 + } 1076 768 1077 769 dev_dbg(&idtcm->client->dev, "firmware size %zu bytes\n", fw->size); 1078 770 ··· 1107 783 err = check_and_set_masks(idtcm, regaddr, val); 1108 784 } 1109 785 1110 - if (err == 0) { 786 + if (err != -EINVAL) { 787 + err = 0; 788 + 1111 789 /* Top (status registers) and bottom are read-only */ 1112 790 if ((regaddr < GPIO_USER_CONTROL) 1113 791 || (regaddr >= SCRATCH)) ··· 1127 801 goto out; 1128 802 } 1129 803 1130 - display_pll_and_output_masks(idtcm); 804 + display_pll_and_masks(idtcm); 1131 805 1132 806 out: 1133 807 release_firmware(fw); 1134 808 return err; 1135 809 } 1136 810 1137 - static int idtcm_pps_enable(struct idtcm_channel *channel, bool enable) 811 + static int idtcm_output_enable(struct idtcm_channel *channel, 812 + bool enable, unsigned int outn) 1138 813 { 1139 814 struct idtcm *idtcm = channel->idtcm; 1140 - u32 module; 1141 - u8 val; 1142 815 int err; 816 + u8 val; 1143 817 1144 - /* 1145 - * This assumes that the 1-PPS is on the second of the two 1146 - * output. But is this always true? 1147 - */ 1148 - switch (channel->dpll_n) { 1149 - case DPLL_0: 1150 - module = OUTPUT_1; 1151 - break; 1152 - case DPLL_1: 1153 - module = OUTPUT_3; 1154 - break; 1155 - case DPLL_2: 1156 - module = OUTPUT_5; 1157 - break; 1158 - case DPLL_3: 1159 - module = OUTPUT_7; 1160 - break; 1161 - default: 1162 - return -EINVAL; 1163 - } 1164 - 1165 - err = idtcm_read(idtcm, module, OUT_CTRL_1, &val, sizeof(val)); 818 + err = idtcm_read(idtcm, OUTPUT_MODULE_FROM_INDEX(outn), 819 + OUT_CTRL_1, &val, sizeof(val)); 1166 820 1167 821 if (err) 1168 822 return err; ··· 1152 846 else 1153 847 val &= ~SQUELCH_DISABLE; 1154 848 1155 - err = idtcm_write(idtcm, module, OUT_CTRL_1, &val, sizeof(val)); 849 + return idtcm_write(idtcm, OUTPUT_MODULE_FROM_INDEX(outn), 850 + OUT_CTRL_1, &val, sizeof(val)); 851 + } 1156 852 1157 - if (err) 1158 - return err; 853 + static int idtcm_output_mask_enable(struct idtcm_channel *channel, 854 + bool enable) 855 + { 856 + u16 mask; 857 + int err; 858 + u8 outn; 859 + 860 + mask = channel->output_mask; 861 + outn = 0; 862 + 863 + while (mask) { 864 + 865 + if (mask & 0x1) { 866 + 867 + err = idtcm_output_enable(channel, enable, outn); 868 + 869 + if (err) 870 + return err; 871 + } 872 + 873 + mask >>= 0x1; 874 + outn++; 875 + } 1159 876 1160 877 return 0; 878 + } 879 + 880 + static int idtcm_perout_enable(struct idtcm_channel *channel, 881 + bool enable, 882 + struct ptp_perout_request *perout) 883 + { 884 + unsigned int flags = perout->flags; 885 + 886 + if (flags == PEROUT_ENABLE_OUTPUT_MASK) 887 + return idtcm_output_mask_enable(channel, enable); 888 + 889 + /* Enable/disable individual output instead */ 890 + return idtcm_output_enable(channel, enable, perout->index); 1161 891 } 1162 892 1163 893 static int idtcm_set_pll_mode(struct idtcm_channel *channel, ··· 1282 940 return err; 1283 941 } 1284 942 1285 - static int idtcm_adjfreq(struct ptp_clock_info *ptp, s32 ppb) 943 + static int _idtcm_adjfine(struct idtcm_channel *channel, long scaled_ppm) 1286 944 { 1287 - struct idtcm_channel *channel = 1288 - container_of(ptp, struct idtcm_channel, caps); 1289 945 struct idtcm *idtcm = channel->idtcm; 1290 946 u8 i; 1291 947 bool neg_adj = 0; ··· 1310 970 * FCW = ------------- 1311 971 * 111 * 2^4 1312 972 */ 1313 - if (ppb < 0) { 973 + if (scaled_ppm < 0) { 1314 974 neg_adj = 1; 1315 - ppb = -ppb; 975 + scaled_ppm = -scaled_ppm; 1316 976 } 1317 977 1318 978 /* 2 ^ -53 = 1.1102230246251565404236316680908e-16 */ 1319 - fcw = ppb * 1000000000000ULL; 979 + fcw = scaled_ppm * 244140625ULL; 1320 980 1321 - fcw = div_u64(fcw, 111022); 981 + fcw = div_u64(fcw, 1776); 1322 982 1323 983 if (neg_adj) 1324 984 fcw = -fcw; ··· 1328 988 fcw >>= 8; 1329 989 } 1330 990 1331 - mutex_lock(&idtcm->reg_lock); 1332 - 1333 991 err = idtcm_write(idtcm, channel->dpll_freq, DPLL_WR_FREQ, 1334 992 buf, sizeof(buf)); 1335 993 1336 - mutex_unlock(&idtcm->reg_lock); 1337 994 return err; 1338 995 } 1339 996 ··· 1344 1007 mutex_lock(&idtcm->reg_lock); 1345 1008 1346 1009 err = _idtcm_gettime(channel, ts); 1010 + 1011 + if (err) 1012 + dev_err(&idtcm->client->dev, 1013 + "Failed at line %d in func %s!\n", 1014 + __LINE__, 1015 + __func__); 1347 1016 1348 1017 mutex_unlock(&idtcm->reg_lock); 1349 1018 ··· 1368 1025 1369 1026 err = _idtcm_settime(channel, ts, HW_TOD_WR_TRIG_SEL_MSB); 1370 1027 1028 + if (err) 1029 + dev_err(&idtcm->client->dev, 1030 + "Failed at line %d in func %s!\n", 1031 + __LINE__, 1032 + __func__); 1033 + 1034 + mutex_unlock(&idtcm->reg_lock); 1035 + 1036 + return err; 1037 + } 1038 + 1039 + static int idtcm_settime_v487(struct ptp_clock_info *ptp, 1040 + const struct timespec64 *ts) 1041 + { 1042 + struct idtcm_channel *channel = 1043 + container_of(ptp, struct idtcm_channel, caps); 1044 + struct idtcm *idtcm = channel->idtcm; 1045 + int err; 1046 + 1047 + mutex_lock(&idtcm->reg_lock); 1048 + 1049 + err = _idtcm_settime_v487(channel, ts, SCSR_TOD_WR_TYPE_SEL_ABSOLUTE); 1050 + 1051 + if (err) 1052 + dev_err(&idtcm->client->dev, 1053 + "Failed at line %d in func %s!\n", 1054 + __LINE__, 1055 + __func__); 1056 + 1371 1057 mutex_unlock(&idtcm->reg_lock); 1372 1058 1373 1059 return err; ··· 1412 1040 mutex_lock(&idtcm->reg_lock); 1413 1041 1414 1042 err = _idtcm_adjtime(channel, delta); 1043 + 1044 + if (err) 1045 + dev_err(&idtcm->client->dev, 1046 + "Failed at line %d in func %s!\n", 1047 + __LINE__, 1048 + __func__); 1049 + 1050 + mutex_unlock(&idtcm->reg_lock); 1051 + 1052 + return err; 1053 + } 1054 + 1055 + static int idtcm_adjtime_v487(struct ptp_clock_info *ptp, s64 delta) 1056 + { 1057 + struct idtcm_channel *channel = 1058 + container_of(ptp, struct idtcm_channel, caps); 1059 + struct idtcm *idtcm = channel->idtcm; 1060 + struct timespec64 ts; 1061 + enum scsr_tod_write_type_sel type; 1062 + int err; 1063 + 1064 + if (abs(delta) < PHASE_PULL_IN_THRESHOLD_NS_V487) { 1065 + err = idtcm_do_phase_pull_in(channel, delta, 0); 1066 + if (err) 1067 + dev_err(&idtcm->client->dev, 1068 + "Failed at line %d in func %s!\n", 1069 + __LINE__, 1070 + __func__); 1071 + return err; 1072 + } 1073 + 1074 + if (delta >= 0) { 1075 + ts = ns_to_timespec64(delta); 1076 + type = SCSR_TOD_WR_TYPE_SEL_DELTA_PLUS; 1077 + } else { 1078 + ts = ns_to_timespec64(-delta); 1079 + type = SCSR_TOD_WR_TYPE_SEL_DELTA_MINUS; 1080 + } 1081 + 1082 + mutex_lock(&idtcm->reg_lock); 1083 + 1084 + err = _idtcm_settime_v487(channel, &ts, type); 1085 + 1086 + if (err) 1087 + dev_err(&idtcm->client->dev, 1088 + "Failed at line %d in func %s!\n", 1089 + __LINE__, 1090 + __func__); 1415 1091 1416 1092 mutex_unlock(&idtcm->reg_lock); 1417 1093 ··· 1479 1059 1480 1060 err = _idtcm_adjphase(channel, delta); 1481 1061 1062 + if (err) 1063 + dev_err(&idtcm->client->dev, 1064 + "Failed at line %d in func %s!\n", 1065 + __LINE__, 1066 + __func__); 1067 + 1068 + mutex_unlock(&idtcm->reg_lock); 1069 + 1070 + return err; 1071 + } 1072 + 1073 + static int idtcm_adjfine(struct ptp_clock_info *ptp, long scaled_ppm) 1074 + { 1075 + struct idtcm_channel *channel = 1076 + container_of(ptp, struct idtcm_channel, caps); 1077 + 1078 + struct idtcm *idtcm = channel->idtcm; 1079 + 1080 + int err; 1081 + 1082 + mutex_lock(&idtcm->reg_lock); 1083 + 1084 + err = _idtcm_adjfine(channel, scaled_ppm); 1085 + 1086 + if (err) 1087 + dev_err(&idtcm->client->dev, 1088 + "Failed at line %d in func %s!\n", 1089 + __LINE__, 1090 + __func__); 1091 + 1482 1092 mutex_unlock(&idtcm->reg_lock); 1483 1093 1484 1094 return err; ··· 1517 1067 static int idtcm_enable(struct ptp_clock_info *ptp, 1518 1068 struct ptp_clock_request *rq, int on) 1519 1069 { 1070 + int err; 1071 + 1520 1072 struct idtcm_channel *channel = 1521 1073 container_of(ptp, struct idtcm_channel, caps); 1522 1074 1523 1075 switch (rq->type) { 1524 1076 case PTP_CLK_REQ_PEROUT: 1525 - if (!on) 1526 - return idtcm_pps_enable(channel, false); 1077 + if (!on) { 1078 + err = idtcm_perout_enable(channel, false, &rq->perout); 1079 + if (err) 1080 + dev_err(&channel->idtcm->client->dev, 1081 + "Failed at line %d in func %s!\n", 1082 + __LINE__, 1083 + __func__); 1084 + return err; 1085 + } 1527 1086 1528 1087 /* Only accept a 1-PPS aligned to the second. */ 1529 1088 if (rq->perout.start.nsec || rq->perout.period.sec != 1 || 1530 1089 rq->perout.period.nsec) 1531 1090 return -ERANGE; 1532 1091 1533 - return idtcm_pps_enable(channel, true); 1092 + err = idtcm_perout_enable(channel, true, &rq->perout); 1093 + if (err) 1094 + dev_err(&channel->idtcm->client->dev, 1095 + "Failed at line %d in func %s!\n", 1096 + __LINE__, 1097 + __func__); 1098 + return err; 1534 1099 default: 1535 1100 break; 1536 1101 } 1537 1102 1538 1103 return -EOPNOTSUPP; 1104 + } 1105 + 1106 + static int _enable_pll_tod_sync(struct idtcm *idtcm, 1107 + u8 pll, 1108 + u8 sync_src, 1109 + u8 qn, 1110 + u8 qn_plus_1) 1111 + { 1112 + int err; 1113 + u8 val; 1114 + u16 dpll; 1115 + u16 out0 = 0, out1 = 0; 1116 + 1117 + if ((qn == 0) && (qn_plus_1 == 0)) 1118 + return 0; 1119 + 1120 + switch (pll) { 1121 + case 0: 1122 + dpll = DPLL_0; 1123 + if (qn) 1124 + out0 = OUTPUT_0; 1125 + if (qn_plus_1) 1126 + out1 = OUTPUT_1; 1127 + break; 1128 + case 1: 1129 + dpll = DPLL_1; 1130 + if (qn) 1131 + out0 = OUTPUT_2; 1132 + if (qn_plus_1) 1133 + out1 = OUTPUT_3; 1134 + break; 1135 + case 2: 1136 + dpll = DPLL_2; 1137 + if (qn) 1138 + out0 = OUTPUT_4; 1139 + if (qn_plus_1) 1140 + out1 = OUTPUT_5; 1141 + break; 1142 + case 3: 1143 + dpll = DPLL_3; 1144 + if (qn) 1145 + out0 = OUTPUT_6; 1146 + if (qn_plus_1) 1147 + out1 = OUTPUT_7; 1148 + break; 1149 + case 4: 1150 + dpll = DPLL_4; 1151 + if (qn) 1152 + out0 = OUTPUT_8; 1153 + break; 1154 + case 5: 1155 + dpll = DPLL_5; 1156 + if (qn) 1157 + out0 = OUTPUT_9; 1158 + if (qn_plus_1) 1159 + out1 = OUTPUT_8; 1160 + break; 1161 + case 6: 1162 + dpll = DPLL_6; 1163 + if (qn) 1164 + out0 = OUTPUT_10; 1165 + if (qn_plus_1) 1166 + out1 = OUTPUT_11; 1167 + break; 1168 + case 7: 1169 + dpll = DPLL_7; 1170 + if (qn) 1171 + out0 = OUTPUT_11; 1172 + break; 1173 + default: 1174 + return -EINVAL; 1175 + } 1176 + 1177 + /* 1178 + * Enable OUTPUT OUT_SYNC. 1179 + */ 1180 + if (out0) { 1181 + err = idtcm_read(idtcm, out0, OUT_CTRL_1, &val, sizeof(val)); 1182 + 1183 + if (err) 1184 + return err; 1185 + 1186 + val &= ~OUT_SYNC_DISABLE; 1187 + 1188 + err = idtcm_write(idtcm, out0, OUT_CTRL_1, &val, sizeof(val)); 1189 + 1190 + if (err) 1191 + return err; 1192 + } 1193 + 1194 + if (out1) { 1195 + err = idtcm_read(idtcm, out1, OUT_CTRL_1, &val, sizeof(val)); 1196 + 1197 + if (err) 1198 + return err; 1199 + 1200 + val &= ~OUT_SYNC_DISABLE; 1201 + 1202 + err = idtcm_write(idtcm, out1, OUT_CTRL_1, &val, sizeof(val)); 1203 + 1204 + if (err) 1205 + return err; 1206 + } 1207 + 1208 + /* enable dpll sync tod pps, must be set before dpll_mode */ 1209 + err = idtcm_read(idtcm, dpll, DPLL_TOD_SYNC_CFG, &val, sizeof(val)); 1210 + if (err) 1211 + return err; 1212 + 1213 + val &= ~(TOD_SYNC_SOURCE_MASK << TOD_SYNC_SOURCE_SHIFT); 1214 + val |= (sync_src << TOD_SYNC_SOURCE_SHIFT); 1215 + val |= TOD_SYNC_EN; 1216 + 1217 + return idtcm_write(idtcm, dpll, DPLL_TOD_SYNC_CFG, &val, sizeof(val)); 1218 + } 1219 + 1220 + static int idtcm_enable_tod_sync(struct idtcm_channel *channel) 1221 + { 1222 + struct idtcm *idtcm = channel->idtcm; 1223 + 1224 + u8 pll; 1225 + u8 sync_src; 1226 + u8 qn; 1227 + u8 qn_plus_1; 1228 + u8 cfg; 1229 + int err = 0; 1230 + u16 output_mask = channel->output_mask; 1231 + u8 out8_mux = 0; 1232 + u8 out11_mux = 0; 1233 + u8 temp; 1234 + 1235 + /* 1236 + * set tod_out_sync_enable to 0. 1237 + */ 1238 + err = idtcm_read(idtcm, channel->tod_n, TOD_CFG, &cfg, sizeof(cfg)); 1239 + if (err) 1240 + return err; 1241 + 1242 + cfg &= ~TOD_OUT_SYNC_ENABLE; 1243 + 1244 + err = idtcm_write(idtcm, channel->tod_n, TOD_CFG, &cfg, sizeof(cfg)); 1245 + if (err) 1246 + return err; 1247 + 1248 + switch (channel->tod_n) { 1249 + case TOD_0: 1250 + sync_src = 0; 1251 + break; 1252 + case TOD_1: 1253 + sync_src = 1; 1254 + break; 1255 + case TOD_2: 1256 + sync_src = 2; 1257 + break; 1258 + case TOD_3: 1259 + sync_src = 3; 1260 + break; 1261 + default: 1262 + return -EINVAL; 1263 + } 1264 + 1265 + err = idtcm_read(idtcm, 0, HW_Q8_CTRL_SPARE, 1266 + &temp, sizeof(temp)); 1267 + if (err) 1268 + return err; 1269 + 1270 + if ((temp & Q9_TO_Q8_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK) == 1271 + Q9_TO_Q8_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK) 1272 + out8_mux = 1; 1273 + 1274 + err = idtcm_read(idtcm, 0, HW_Q11_CTRL_SPARE, 1275 + &temp, sizeof(temp)); 1276 + if (err) 1277 + return err; 1278 + 1279 + if ((temp & Q10_TO_Q11_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK) == 1280 + Q10_TO_Q11_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK) 1281 + out11_mux = 1; 1282 + 1283 + for (pll = 0; pll < 8; pll++) { 1284 + qn = 0; 1285 + qn_plus_1 = 0; 1286 + 1287 + if (pll < 4) { 1288 + /* First 4 pll has 2 outputs */ 1289 + qn = output_mask & 0x1; 1290 + output_mask = output_mask >> 1; 1291 + qn_plus_1 = output_mask & 0x1; 1292 + output_mask = output_mask >> 1; 1293 + } else if (pll == 4) { 1294 + if (out8_mux == 0) { 1295 + qn = output_mask & 0x1; 1296 + output_mask = output_mask >> 1; 1297 + } 1298 + } else if (pll == 5) { 1299 + if (out8_mux) { 1300 + qn_plus_1 = output_mask & 0x1; 1301 + output_mask = output_mask >> 1; 1302 + } 1303 + qn = output_mask & 0x1; 1304 + output_mask = output_mask >> 1; 1305 + } else if (pll == 6) { 1306 + qn = output_mask & 0x1; 1307 + output_mask = output_mask >> 1; 1308 + if (out11_mux) { 1309 + qn_plus_1 = output_mask & 0x1; 1310 + output_mask = output_mask >> 1; 1311 + } 1312 + } else if (pll == 7) { 1313 + if (out11_mux == 0) { 1314 + qn = output_mask & 0x1; 1315 + output_mask = output_mask >> 1; 1316 + } 1317 + } 1318 + 1319 + if ((qn != 0) || (qn_plus_1 != 0)) 1320 + err = _enable_pll_tod_sync(idtcm, pll, sync_src, qn, 1321 + qn_plus_1); 1322 + 1323 + if (err) 1324 + return err; 1325 + } 1326 + 1327 + return err; 1539 1328 } 1540 1329 1541 1330 static int idtcm_enable_tod(struct idtcm_channel *channel) ··· 1783 1094 struct timespec64 ts = {0, 0}; 1784 1095 u8 cfg; 1785 1096 int err; 1786 - 1787 - err = idtcm_pps_enable(channel, false); 1788 - if (err) 1789 - return err; 1790 1097 1791 1098 /* 1792 1099 * Start the TOD clock ticking. ··· 1819 1134 1820 1135 idtcm_read_otp_scsr_config_select(idtcm, &config_select); 1821 1136 1137 + snprintf(idtcm->version, sizeof(idtcm->version), "%u.%u.%u", 1138 + major, minor, hotfix); 1139 + 1822 1140 dev_info(&idtcm->client->dev, fmt, major, minor, hotfix, 1823 1141 product_id, hw_rev_id, config_select); 1824 1142 } 1825 1143 1144 + static const struct ptp_clock_info idtcm_caps_v487 = { 1145 + .owner = THIS_MODULE, 1146 + .max_adj = 244000, 1147 + .n_per_out = 12, 1148 + .adjphase = &idtcm_adjphase, 1149 + .adjfine = &idtcm_adjfine, 1150 + .adjtime = &idtcm_adjtime_v487, 1151 + .gettime64 = &idtcm_gettime, 1152 + .settime64 = &idtcm_settime_v487, 1153 + .enable = &idtcm_enable, 1154 + .do_aux_work = &set_write_phase_ready, 1155 + }; 1156 + 1826 1157 static const struct ptp_clock_info idtcm_caps = { 1827 1158 .owner = THIS_MODULE, 1828 1159 .max_adj = 244000, 1829 - .n_per_out = 1, 1160 + .n_per_out = 12, 1830 1161 .adjphase = &idtcm_adjphase, 1831 - .adjfreq = &idtcm_adjfreq, 1162 + .adjfine = &idtcm_adjfine, 1832 1163 .adjtime = &idtcm_adjtime, 1833 1164 .gettime64 = &idtcm_gettime, 1834 1165 .settime64 = &idtcm_settime, ··· 1852 1151 .do_aux_work = &set_write_phase_ready, 1853 1152 }; 1854 1153 1855 - 1856 - static int idtcm_enable_channel(struct idtcm *idtcm, u32 index) 1154 + static int configure_channel_pll(struct idtcm_channel *channel) 1857 1155 { 1858 - struct idtcm_channel *channel; 1859 - int err; 1156 + int err = 0; 1860 1157 1861 - if (!(index < MAX_PHC_PLL)) 1862 - return -EINVAL; 1863 - 1864 - channel = &idtcm->channel[index]; 1865 - 1866 - switch (index) { 1158 + switch (channel->pll) { 1867 1159 case 0: 1868 1160 channel->dpll_freq = DPLL_FREQ_0; 1869 1161 channel->dpll_n = DPLL_0; 1870 - channel->tod_read_primary = TOD_READ_PRIMARY_0; 1871 - channel->tod_write = TOD_WRITE_0; 1872 - channel->tod_n = TOD_0; 1873 1162 channel->hw_dpll_n = HW_DPLL_0; 1874 1163 channel->dpll_phase = DPLL_PHASE_0; 1875 1164 channel->dpll_ctrl_n = DPLL_CTRL_0; ··· 1868 1177 case 1: 1869 1178 channel->dpll_freq = DPLL_FREQ_1; 1870 1179 channel->dpll_n = DPLL_1; 1871 - channel->tod_read_primary = TOD_READ_PRIMARY_1; 1872 - channel->tod_write = TOD_WRITE_1; 1873 - channel->tod_n = TOD_1; 1874 1180 channel->hw_dpll_n = HW_DPLL_1; 1875 1181 channel->dpll_phase = DPLL_PHASE_1; 1876 1182 channel->dpll_ctrl_n = DPLL_CTRL_1; ··· 1876 1188 case 2: 1877 1189 channel->dpll_freq = DPLL_FREQ_2; 1878 1190 channel->dpll_n = DPLL_2; 1879 - channel->tod_read_primary = TOD_READ_PRIMARY_2; 1880 - channel->tod_write = TOD_WRITE_2; 1881 - channel->tod_n = TOD_2; 1882 1191 channel->hw_dpll_n = HW_DPLL_2; 1883 1192 channel->dpll_phase = DPLL_PHASE_2; 1884 1193 channel->dpll_ctrl_n = DPLL_CTRL_2; ··· 1884 1199 case 3: 1885 1200 channel->dpll_freq = DPLL_FREQ_3; 1886 1201 channel->dpll_n = DPLL_3; 1887 - channel->tod_read_primary = TOD_READ_PRIMARY_3; 1888 - channel->tod_write = TOD_WRITE_3; 1889 - channel->tod_n = TOD_3; 1890 1202 channel->hw_dpll_n = HW_DPLL_3; 1891 1203 channel->dpll_phase = DPLL_PHASE_3; 1892 1204 channel->dpll_ctrl_n = DPLL_CTRL_3; 1893 1205 channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_3; 1206 + break; 1207 + case 4: 1208 + channel->dpll_freq = DPLL_FREQ_4; 1209 + channel->dpll_n = DPLL_4; 1210 + channel->hw_dpll_n = HW_DPLL_4; 1211 + channel->dpll_phase = DPLL_PHASE_4; 1212 + channel->dpll_ctrl_n = DPLL_CTRL_4; 1213 + channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_4; 1214 + break; 1215 + case 5: 1216 + channel->dpll_freq = DPLL_FREQ_5; 1217 + channel->dpll_n = DPLL_5; 1218 + channel->hw_dpll_n = HW_DPLL_5; 1219 + channel->dpll_phase = DPLL_PHASE_5; 1220 + channel->dpll_ctrl_n = DPLL_CTRL_5; 1221 + channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_5; 1222 + break; 1223 + case 6: 1224 + channel->dpll_freq = DPLL_FREQ_6; 1225 + channel->dpll_n = DPLL_6; 1226 + channel->hw_dpll_n = HW_DPLL_6; 1227 + channel->dpll_phase = DPLL_PHASE_6; 1228 + channel->dpll_ctrl_n = DPLL_CTRL_6; 1229 + channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_6; 1230 + break; 1231 + case 7: 1232 + channel->dpll_freq = DPLL_FREQ_7; 1233 + channel->dpll_n = DPLL_7; 1234 + channel->hw_dpll_n = HW_DPLL_7; 1235 + channel->dpll_phase = DPLL_PHASE_7; 1236 + channel->dpll_ctrl_n = DPLL_CTRL_7; 1237 + channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_7; 1238 + break; 1239 + default: 1240 + err = -EINVAL; 1241 + } 1242 + 1243 + return err; 1244 + } 1245 + 1246 + static int idtcm_enable_channel(struct idtcm *idtcm, u32 index) 1247 + { 1248 + struct idtcm_channel *channel; 1249 + int err; 1250 + 1251 + if (!(index < MAX_TOD)) 1252 + return -EINVAL; 1253 + 1254 + channel = &idtcm->channel[index]; 1255 + 1256 + /* Set pll addresses */ 1257 + err = configure_channel_pll(channel); 1258 + if (err) 1259 + return err; 1260 + 1261 + /* Set tod addresses */ 1262 + switch (index) { 1263 + case 0: 1264 + channel->tod_read_primary = TOD_READ_PRIMARY_0; 1265 + channel->tod_write = TOD_WRITE_0; 1266 + channel->tod_n = TOD_0; 1267 + break; 1268 + case 1: 1269 + channel->tod_read_primary = TOD_READ_PRIMARY_1; 1270 + channel->tod_write = TOD_WRITE_1; 1271 + channel->tod_n = TOD_1; 1272 + break; 1273 + case 2: 1274 + channel->tod_read_primary = TOD_READ_PRIMARY_2; 1275 + channel->tod_write = TOD_WRITE_2; 1276 + channel->tod_n = TOD_2; 1277 + break; 1278 + case 3: 1279 + channel->tod_read_primary = TOD_READ_PRIMARY_3; 1280 + channel->tod_write = TOD_WRITE_3; 1281 + channel->tod_n = TOD_3; 1894 1282 break; 1895 1283 default: 1896 1284 return -EINVAL; ··· 1971 1213 1972 1214 channel->idtcm = idtcm; 1973 1215 1974 - channel->caps = idtcm_caps; 1216 + if (idtcm_strverscmp(idtcm->version, "4.8.7") >= 0) 1217 + channel->caps = idtcm_caps_v487; 1218 + else 1219 + channel->caps = idtcm_caps; 1220 + 1975 1221 snprintf(channel->caps.name, sizeof(channel->caps.name), 1976 - "IDT CM PLL%u", index); 1222 + "IDT CM TOD%u", index); 1223 + 1224 + if (idtcm_strverscmp(idtcm->version, "4.8.7") >= 0) { 1225 + err = idtcm_enable_tod_sync(channel); 1226 + if (err) { 1227 + dev_err(&idtcm->client->dev, 1228 + "Failed at line %d in func %s!\n", 1229 + __LINE__, 1230 + __func__); 1231 + return err; 1232 + } 1233 + } 1977 1234 1978 1235 err = idtcm_set_pll_mode(channel, PLL_MODE_WRITE_FREQUENCY); 1979 - if (err) 1236 + if (err) { 1237 + dev_err(&idtcm->client->dev, 1238 + "Failed at line %d in func %s!\n", 1239 + __LINE__, 1240 + __func__); 1980 1241 return err; 1242 + } 1981 1243 1982 1244 err = idtcm_enable_tod(channel); 1983 - if (err) 1245 + if (err) { 1246 + dev_err(&idtcm->client->dev, 1247 + "Failed at line %d in func %s!\n", 1248 + __LINE__, 1249 + __func__); 1984 1250 return err; 1251 + } 1985 1252 1986 1253 channel->ptp_clock = ptp_clock_register(&channel->caps, NULL); 1987 1254 ··· 2032 1249 u8 i; 2033 1250 struct idtcm_channel *channel; 2034 1251 2035 - for (i = 0; i < MAX_PHC_PLL; i++) { 1252 + for (i = 0; i < MAX_TOD; i++) { 2036 1253 2037 1254 channel = &idtcm->channel[i]; 2038 1255 ··· 2043 1260 2044 1261 static void set_default_masks(struct idtcm *idtcm) 2045 1262 { 2046 - idtcm->pll_mask = DEFAULT_PLL_MASK; 1263 + idtcm->tod_mask = DEFAULT_TOD_MASK; 1264 + 1265 + idtcm->channel[0].pll = DEFAULT_TOD0_PTP_PLL; 1266 + idtcm->channel[1].pll = DEFAULT_TOD1_PTP_PLL; 1267 + idtcm->channel[2].pll = DEFAULT_TOD2_PTP_PLL; 1268 + idtcm->channel[3].pll = DEFAULT_TOD3_PTP_PLL; 2047 1269 2048 1270 idtcm->channel[0].output_mask = DEFAULT_OUTPUT_MASK_PLL0; 2049 1271 idtcm->channel[1].output_mask = DEFAULT_OUTPUT_MASK_PLL1; 2050 1272 idtcm->channel[2].output_mask = DEFAULT_OUTPUT_MASK_PLL2; 2051 1273 idtcm->channel[3].output_mask = DEFAULT_OUTPUT_MASK_PLL3; 2052 - } 2053 - 2054 - static int set_tod_write_overhead(struct idtcm *idtcm) 2055 - { 2056 - int err; 2057 - u8 i; 2058 - 2059 - s64 total_ns = 0; 2060 - 2061 - ktime_t start; 2062 - ktime_t stop; 2063 - 2064 - char buf[TOD_BYTE_COUNT]; 2065 - 2066 - struct idtcm_channel *channel = &idtcm->channel[2]; 2067 - 2068 - /* Set page offset */ 2069 - idtcm_write(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_OVR__0, 2070 - buf, sizeof(buf)); 2071 - 2072 - for (i = 0; i < TOD_WRITE_OVERHEAD_COUNT_MAX; i++) { 2073 - 2074 - start = ktime_get_raw(); 2075 - 2076 - err = idtcm_write(idtcm, channel->hw_dpll_n, 2077 - HW_DPLL_TOD_OVR__0, buf, sizeof(buf)); 2078 - 2079 - if (err) 2080 - return err; 2081 - 2082 - stop = ktime_get_raw(); 2083 - 2084 - total_ns += ktime_to_ns(stop - start); 2085 - } 2086 - 2087 - idtcm->tod_write_overhead_ns = div_s64(total_ns, 2088 - TOD_WRITE_OVERHEAD_COUNT_MAX); 2089 - 2090 - return err; 2091 1274 } 2092 1275 2093 1276 static int idtcm_probe(struct i2c_client *client, ··· 2062 1313 struct idtcm *idtcm; 2063 1314 int err; 2064 1315 u8 i; 1316 + char *fmt = "Failed at %d in line %s with channel output %d!\n"; 2065 1317 2066 1318 /* Unused for now */ 2067 1319 (void)id; ··· 2083 1333 2084 1334 idtcm_display_version_info(idtcm); 2085 1335 2086 - err = set_tod_write_overhead(idtcm); 2087 - 2088 - if (err) { 2089 - mutex_unlock(&idtcm->reg_lock); 2090 - return err; 2091 - } 2092 - 2093 1336 err = idtcm_load_firmware(idtcm, &client->dev); 2094 1337 2095 1338 if (err) 2096 1339 dev_warn(&idtcm->client->dev, 2097 1340 "loading firmware failed with %d\n", err); 2098 1341 2099 - if (idtcm->pll_mask) { 2100 - for (i = 0; i < MAX_PHC_PLL; i++) { 2101 - if (idtcm->pll_mask & (1 << i)) { 1342 + if (idtcm->tod_mask) { 1343 + for (i = 0; i < MAX_TOD; i++) { 1344 + if (idtcm->tod_mask & (1 << i)) { 2102 1345 err = idtcm_enable_channel(idtcm, i); 2103 - if (err) 1346 + if (err) { 1347 + dev_err(&idtcm->client->dev, 1348 + fmt, 1349 + __LINE__, 1350 + __func__, 1351 + i); 2104 1352 break; 1353 + } 2105 1354 } 2106 1355 } 2107 1356 } else {
+50 -11
drivers/ptp/ptp_clockmatrix.h
··· 13 13 #include "idt8a340_reg.h" 14 14 15 15 #define FW_FILENAME "idtcm.bin" 16 - #define MAX_PHC_PLL 4 16 + #define MAX_TOD (4) 17 + #define MAX_PLL (8) 17 18 18 19 #define MAX_ABS_WRITE_PHASE_PICOSECONDS (107374182350LL) 19 20 20 - #define PLL_MASK_ADDR (0xFFA5) 21 - #define DEFAULT_PLL_MASK (0x04) 21 + #define TOD_MASK_ADDR (0xFFA5) 22 + #define DEFAULT_TOD_MASK (0x04) 22 23 23 24 #define SET_U16_LSB(orig, val8) (orig = (0xff00 & (orig)) | (val8)) 24 25 #define SET_U16_MSB(orig, val8) (orig = (0x00ff & (orig)) | (val8 << 8)) 25 26 26 - #define OUTPUT_MASK_PLL0_ADDR (0xFFB0) 27 - #define OUTPUT_MASK_PLL1_ADDR (0xFFB2) 28 - #define OUTPUT_MASK_PLL2_ADDR (0xFFB4) 29 - #define OUTPUT_MASK_PLL3_ADDR (0xFFB6) 27 + #define TOD0_PTP_PLL_ADDR (0xFFA8) 28 + #define TOD1_PTP_PLL_ADDR (0xFFA9) 29 + #define TOD2_PTP_PLL_ADDR (0xFFAA) 30 + #define TOD3_PTP_PLL_ADDR (0xFFAB) 31 + 32 + #define TOD0_OUT_ALIGN_MASK_ADDR (0xFFB0) 33 + #define TOD1_OUT_ALIGN_MASK_ADDR (0xFFB2) 34 + #define TOD2_OUT_ALIGN_MASK_ADDR (0xFFB4) 35 + #define TOD3_OUT_ALIGN_MASK_ADDR (0xFFB6) 30 36 31 37 #define DEFAULT_OUTPUT_MASK_PLL0 (0x003) 32 38 #define DEFAULT_OUTPUT_MASK_PLL1 (0x00c) 33 39 #define DEFAULT_OUTPUT_MASK_PLL2 (0x030) 34 40 #define DEFAULT_OUTPUT_MASK_PLL3 (0x0c0) 35 41 42 + #define DEFAULT_TOD0_PTP_PLL (0) 43 + #define DEFAULT_TOD1_PTP_PLL (1) 44 + #define DEFAULT_TOD2_PTP_PLL (2) 45 + #define DEFAULT_TOD3_PTP_PLL (3) 46 + 36 47 #define POST_SM_RESET_DELAY_MS (3000) 37 48 #define PHASE_PULL_IN_THRESHOLD_NS (150000) 38 - #define TOD_WRITE_OVERHEAD_COUNT_MAX (5) 49 + #define PHASE_PULL_IN_THRESHOLD_NS_V487 (15000) 50 + #define TOD_WRITE_OVERHEAD_COUNT_MAX (2) 39 51 #define TOD_BYTE_COUNT (11) 40 52 #define WR_PHASE_SETUP_MS (5000) 53 + 54 + #define OUTPUT_MODULE_FROM_INDEX(index) (OUTPUT_0 + (index) * 0x10) 55 + 56 + #define PEROUT_ENABLE_OUTPUT_MASK (0xdeadbeef) 41 57 42 58 /* Values of DPLL_N.DPLL_MODE.PLL_MODE */ 43 59 enum pll_mode { ··· 64 48 PLL_MODE_GPIO_INC_DEC = 3, 65 49 PLL_MODE_SYNTHESIS = 4, 66 50 PLL_MODE_PHASE_MEASUREMENT = 5, 67 - PLL_MODE_MAX = PLL_MODE_PHASE_MEASUREMENT, 51 + PLL_MODE_DISABLED = 6, 52 + PLL_MODE_MAX = PLL_MODE_DISABLED, 68 53 }; 69 54 70 55 enum hw_tod_write_trig_sel { ··· 78 61 HW_TOD_WR_TRIG_SEL_GPIO = 5, 79 62 HW_TOD_WR_TRIG_SEL_FOD_SYNC = 6, 80 63 WR_TRIG_SEL_MAX = HW_TOD_WR_TRIG_SEL_FOD_SYNC, 64 + }; 65 + 66 + /* 4.8.7 only */ 67 + enum scsr_tod_write_trig_sel { 68 + SCSR_TOD_WR_TRIG_SEL_DISABLE = 0, 69 + SCSR_TOD_WR_TRIG_SEL_IMMEDIATE = 1, 70 + SCSR_TOD_WR_TRIG_SEL_REFCLK = 2, 71 + SCSR_TOD_WR_TRIG_SEL_PWMPPS = 3, 72 + SCSR_TOD_WR_TRIG_SEL_TODPPS = 4, 73 + SCSR_TOD_WR_TRIG_SEL_SYNCFOD = 5, 74 + SCSR_TOD_WR_TRIG_SEL_GPIO = 6, 75 + SCSR_TOD_WR_TRIG_SEL_MAX = SCSR_TOD_WR_TRIG_SEL_GPIO, 76 + }; 77 + 78 + /* 4.8.7 only */ 79 + enum scsr_tod_write_type_sel { 80 + SCSR_TOD_WR_TYPE_SEL_ABSOLUTE = 0, 81 + SCSR_TOD_WR_TYPE_SEL_DELTA_PLUS = 1, 82 + SCSR_TOD_WR_TYPE_SEL_DELTA_MINUS = 2, 83 + SCSR_TOD_WR_TYPE_SEL_MAX = SCSR_TOD_WR_TYPE_SEL_DELTA_MINUS, 81 84 }; 82 85 83 86 struct idtcm; ··· 116 79 u16 tod_n; 117 80 u16 hw_dpll_n; 118 81 enum pll_mode pll_mode; 82 + u8 pll; 119 83 u16 output_mask; 120 84 int write_phase_ready; 121 85 }; 122 86 123 87 struct idtcm { 124 - struct idtcm_channel channel[MAX_PHC_PLL]; 88 + struct idtcm_channel channel[MAX_TOD]; 125 89 struct i2c_client *client; 126 90 u8 page_offset; 127 - u8 pll_mask; 91 + u8 tod_mask; 92 + char version[16]; 128 93 129 94 /* Overhead calculation for adjtime */ 130 95 u8 calculate_overhead_flag;