Hi Markus, kernel test robot noticed the following build warnings: [auto build test WARNING on robh/for-next] [also build test WARNING on krzk-dt/for-next linus/master v6.12-rc2 next-20241004] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Markus-Stockhausen/dt-bindings-phy-add-realtek-otto-serdes-PHY-binding/20241008-003929 base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next patch link: https://lore.kernel.org/r/20241007163623.3274510-4-markus.stockhausen%40gmx.de patch subject: [PATCH v2 3/3] phy: Integrate Realtek Otto SerDes driver into build system config: hexagon-allmodconfig (https://download.01.org/0day-ci/archive/20241008/202410081436.fFz8vjTK-lkp@xxxxxxxxx/config) compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project fef3566a25ff0e34fb87339ba5e13eca17cec00f) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241008/202410081436.fFz8vjTK-lkp@xxxxxxxxx/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@xxxxxxxxx> | Closes: https://lore.kernel.org/oe-kbuild-all/202410081436.fFz8vjTK-lkp@xxxxxxxxx/ All warnings (new ones prefixed by >>): In file included from drivers/phy/realtek/phy-rtk-otto-serdes.c:11: In file included from include/linux/phy.h:16: In file included from include/linux/ethtool.h:18: In file included from include/linux/if_ether.h:19: In file included from include/linux/skbuff.h:17: In file included from include/linux/bvec.h:10: In file included from include/linux/highmem.h:10: In file included from include/linux/mm.h:2213: include/linux/vmstat.h:518:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion] 518 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_" | ~~~~~~~~~~~ ^ ~~~ In file included from drivers/phy/realtek/phy-rtk-otto-serdes.c:11: In file included from include/linux/phy.h:16: In file included from include/linux/ethtool.h:18: In file included from include/linux/if_ether.h:19: In file included from include/linux/skbuff.h:17: In file included from include/linux/bvec.h:10: In file included from include/linux/highmem.h:12: In file included from include/linux/hardirq.h:11: In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1: In file included from include/asm-generic/hardirq.h:17: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:14: In file included from arch/hexagon/include/asm/io.h:328: include/asm-generic/io.h:548:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 548 | val = __raw_readb(PCI_IOBASE + addr); | ~~~~~~~~~~ ^ include/asm-generic/io.h:561:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 561 | val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr)); | ~~~~~~~~~~ ^ include/uapi/linux/byteorder/little_endian.h:37:51: note: expanded from macro '__le16_to_cpu' 37 | #define __le16_to_cpu(x) ((__force __u16)(__le16)(x)) | ^ In file included from drivers/phy/realtek/phy-rtk-otto-serdes.c:11: In file included from include/linux/phy.h:16: In file included from include/linux/ethtool.h:18: In file included from include/linux/if_ether.h:19: In file included from include/linux/skbuff.h:17: In file included from include/linux/bvec.h:10: In file included from include/linux/highmem.h:12: In file included from include/linux/hardirq.h:11: In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1: In file included from include/asm-generic/hardirq.h:17: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:14: In file included from arch/hexagon/include/asm/io.h:328: include/asm-generic/io.h:574:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 574 | val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr)); | ~~~~~~~~~~ ^ include/uapi/linux/byteorder/little_endian.h:35:51: note: expanded from macro '__le32_to_cpu' 35 | #define __le32_to_cpu(x) ((__force __u32)(__le32)(x)) | ^ In file included from drivers/phy/realtek/phy-rtk-otto-serdes.c:11: In file included from include/linux/phy.h:16: In file included from include/linux/ethtool.h:18: In file included from include/linux/if_ether.h:19: In file included from include/linux/skbuff.h:17: In file included from include/linux/bvec.h:10: In file included from include/linux/highmem.h:12: In file included from include/linux/hardirq.h:11: In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1: In file included from include/asm-generic/hardirq.h:17: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:14: In file included from arch/hexagon/include/asm/io.h:328: include/asm-generic/io.h:585:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 585 | __raw_writeb(value, PCI_IOBASE + addr); | ~~~~~~~~~~ ^ include/asm-generic/io.h:595:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 595 | __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr); | ~~~~~~~~~~ ^ include/asm-generic/io.h:605:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 605 | __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr); | ~~~~~~~~~~ ^ >> drivers/phy/realtek/phy-rtk-otto-serdes.c:490:15: warning: overlapping comparisons always evaluate to true [-Wtautological-overlap-compare] 490 | if (sid >= 2 || sid <= 9) | ~~~~~~~~~^~~~~~~~~~~ drivers/phy/realtek/phy-rtk-otto-serdes.c:509:15: warning: overlapping comparisons always evaluate to true [-Wtautological-overlap-compare] 509 | if (sid >= 2 || sid <= 9) | ~~~~~~~~~^~~~~~~~~~~ >> drivers/phy/realtek/phy-rtk-otto-serdes.c:686:6: warning: variable 'ret' is uninitialized when used here [-Wuninitialized] 686 | if (ret) | ^~~ drivers/phy/realtek/phy-rtk-otto-serdes.c:677:9: note: initialize the variable 'ret' to silence this warning 677 | int ret; | ^ | = 0 drivers/phy/realtek/phy-rtk-otto-serdes.c:706:6: warning: variable 'ret' is uninitialized when used here [-Wuninitialized] 706 | if (ret) | ^~~ drivers/phy/realtek/phy-rtk-otto-serdes.c:697:9: note: initialize the variable 'ret' to silence this warning 697 | int ret; | ^ | = 0 drivers/phy/realtek/phy-rtk-otto-serdes.c:723:7: warning: variable 'ret' is uninitialized when used here [-Wuninitialized] 723 | if (!ret) | ^~~ drivers/phy/realtek/phy-rtk-otto-serdes.c:717:9: note: initialize the variable 'ret' to silence this warning 717 | int ret; | ^ | = 0 12 warnings generated. Kconfig warnings: (for reference only) WARNING: unmet direct dependencies detected for MODVERSIONS Depends on [n]: MODULES [=y] && !COMPILE_TEST [=y] Selected by [y]: - RANDSTRUCT_FULL [=y] && (CC_HAS_RANDSTRUCT [=y] || GCC_PLUGINS [=n]) && MODULES [=y] WARNING: unmet direct dependencies detected for GET_FREE_REGION Depends on [n]: SPARSEMEM [=n] Selected by [m]: - RESOURCE_KUNIT_TEST [=m] && RUNTIME_TESTING_MENU [=y] && KUNIT [=m] vim +490 drivers/phy/realtek/phy-rtk-otto-serdes.c 40f1aea80b53b8 Markus Stockhausen 2024-10-07 477 40f1aea80b53b8 Markus Stockhausen 2024-10-07 478 static int rtsds_930x_set_mode(struct rtsds_ctrl *ctrl, u32 sid, int combomode) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 479 { 40f1aea80b53b8 Markus Stockhausen 2024-10-07 480 int modeshift, subshift; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 481 int mode = RTSDS_MODE(combomode); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 482 int submode = RTSDS_SUBMODE(combomode); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 483 void __iomem __force *modereg; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 484 void __iomem __force *subreg; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 485 40f1aea80b53b8 Markus Stockhausen 2024-10-07 486 if (rtsds_invalid_sds(ctrl, sid)) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 487 return -EINVAL; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 488 40f1aea80b53b8 Markus Stockhausen 2024-10-07 489 rtsds_930x_mode_offset(sid, &modereg, &modeshift, &subreg, &subshift); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 @490 if (sid >= 2 || sid <= 9) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 491 iomask32(0x1f << subshift, (submode & 0x1f) << subshift, subreg); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 492 else if (submode != 0) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 493 return -EINVAL; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 494 iomask32(0x1f << modeshift, (mode & 0x1f) << modeshift, modereg); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 495 40f1aea80b53b8 Markus Stockhausen 2024-10-07 496 return 0; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 497 } 40f1aea80b53b8 Markus Stockhausen 2024-10-07 498 40f1aea80b53b8 Markus Stockhausen 2024-10-07 499 static int rtsds_930x_get_mode(struct rtsds_ctrl *ctrl, u32 sid) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 500 { 40f1aea80b53b8 Markus Stockhausen 2024-10-07 501 int modeshift, subshift, mode, submode = 0; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 502 void __iomem __force *modereg; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 503 void __iomem __force *subreg; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 504 40f1aea80b53b8 Markus Stockhausen 2024-10-07 505 if (rtsds_invalid_sds(ctrl, sid)) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 506 return -EINVAL; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 507 40f1aea80b53b8 Markus Stockhausen 2024-10-07 508 rtsds_930x_mode_offset(sid, &modereg, &modeshift, &subreg, &subshift); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 509 if (sid >= 2 || sid <= 9) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 510 submode = (ioread32(subreg) >> subshift) & 0x1f; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 511 mode = ioread32(modereg) >> modeshift & 0x1f; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 512 40f1aea80b53b8 Markus Stockhausen 2024-10-07 513 return RTSDS_COMBOMODE(mode, submode); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 514 } 40f1aea80b53b8 Markus Stockhausen 2024-10-07 515 40f1aea80b53b8 Markus Stockhausen 2024-10-07 516 static int rtsds_930x_reset(struct rtsds_ctrl *ctrl, u32 sid) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 517 { 40f1aea80b53b8 Markus Stockhausen 2024-10-07 518 int modecur, modeoff = ctrl->conf->mode_map[PHY_INTERFACE_MODE_NA]; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 519 40f1aea80b53b8 Markus Stockhausen 2024-10-07 520 if (rtsds_invalid_sds(ctrl, sid)) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 521 return -EINVAL; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 522 40f1aea80b53b8 Markus Stockhausen 2024-10-07 523 modecur = rtsds_930x_get_mode(ctrl, sid); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 524 40f1aea80b53b8 Markus Stockhausen 2024-10-07 525 /* It is enough to power off SerDes and set to old mode again */ 40f1aea80b53b8 Markus Stockhausen 2024-10-07 526 if (modecur != modeoff) { 40f1aea80b53b8 Markus Stockhausen 2024-10-07 527 rtsds_930x_set_mode(ctrl, sid, modeoff); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 528 rtsds_930x_set_mode(ctrl, sid, modecur); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 529 } 40f1aea80b53b8 Markus Stockhausen 2024-10-07 530 40f1aea80b53b8 Markus Stockhausen 2024-10-07 531 return 0; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 532 } 40f1aea80b53b8 Markus Stockhausen 2024-10-07 533 40f1aea80b53b8 Markus Stockhausen 2024-10-07 534 /* 40f1aea80b53b8 Markus Stockhausen 2024-10-07 535 * The RTL931x family has 14 "frontend" SerDes that are cascaded. All operations (e.g. reset) work 40f1aea80b53b8 Markus Stockhausen 2024-10-07 536 * on this frontend view while their registers are distributed over a total of 32 background 40f1aea80b53b8 Markus Stockhausen 2024-10-07 537 * SerDes. Two types of SerDes have been identified: 40f1aea80b53b8 Markus Stockhausen 2024-10-07 538 * 40f1aea80b53b8 Markus Stockhausen 2024-10-07 539 * A "even" SerDes with numbers 0, 1, 2, 4, 6, 8, 10, 12 works on two background SerDes. 64 analog 40f1aea80b53b8 Markus Stockhausen 2024-10-07 540 * and 64 XGMII data pages are coming from a first background SerDes while another 64 XGMII pages 40f1aea80b53b8 Markus Stockhausen 2024-10-07 541 * are served from a second SerDes. 40f1aea80b53b8 Markus Stockhausen 2024-10-07 542 * 40f1aea80b53b8 Markus Stockhausen 2024-10-07 543 * The "odd" SerDes with numbers 3, 5, 7, 9, 11 & 13 SerDes consist of a total of 3 background 40f1aea80b53b8 Markus Stockhausen 2024-10-07 544 * SerDes (one analog and two XGMII) each with an own page/register set. 40f1aea80b53b8 Markus Stockhausen 2024-10-07 545 * 40f1aea80b53b8 Markus Stockhausen 2024-10-07 546 * To align this and improve readability the driver will simulate a total of 576 pages and mix 40f1aea80b53b8 Markus Stockhausen 2024-10-07 547 * them as follows. 40f1aea80b53b8 Markus Stockhausen 2024-10-07 548 * 40f1aea80b53b8 Markus Stockhausen 2024-10-07 549 * frontend page "even" frontend SerDes "odd" frontend SerDes 40f1aea80b53b8 Markus Stockhausen 2024-10-07 550 * page 0-63 (analog): back SDS page 0-63 back SDS page 0-63 40f1aea80b53b8 Markus Stockhausen 2024-10-07 551 * page 64-127 (XGMII1): back SDS page 0-63 back SDS+1 page 0-63 40f1aea80b53b8 Markus Stockhausen 2024-10-07 552 * page 128-191 (XGMII2): back SDS+1 page 0-63 back SDS+2 page 0-63 40f1aea80b53b8 Markus Stockhausen 2024-10-07 553 */ 40f1aea80b53b8 Markus Stockhausen 2024-10-07 554 40f1aea80b53b8 Markus Stockhausen 2024-10-07 555 static int rtsds_931x_reg_offset(u32 sid, u32 page) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 556 { 40f1aea80b53b8 Markus Stockhausen 2024-10-07 557 int map[] = {0, 1, 2, 3, 6, 7, 10, 11, 14, 15, 18, 19, 22, 23}; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 558 int offs = map[sid]; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 559 40f1aea80b53b8 Markus Stockhausen 2024-10-07 560 if ((sid & 1) && (sid != 1)) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 561 offs += (page >> 6); /* distribute "odd" to 3 background SerDes */ 40f1aea80b53b8 Markus Stockhausen 2024-10-07 562 else if (page >= 128) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 563 offs += 1; /* "distribute "even" to 2 background SerDes */ 40f1aea80b53b8 Markus Stockhausen 2024-10-07 564 40f1aea80b53b8 Markus Stockhausen 2024-10-07 565 return offs; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 566 } 40f1aea80b53b8 Markus Stockhausen 2024-10-07 567 40f1aea80b53b8 Markus Stockhausen 2024-10-07 568 static int rtsds_931x_read(struct rtsds_ctrl *ctrl, u32 sid, u32 page, u32 reg) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 569 { 40f1aea80b53b8 Markus Stockhausen 2024-10-07 570 int offs; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 571 40f1aea80b53b8 Markus Stockhausen 2024-10-07 572 if (rtsds_invalid_reg(ctrl, sid, page, reg)) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 573 return -EINVAL; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 574 40f1aea80b53b8 Markus Stockhausen 2024-10-07 575 offs = rtsds_931x_reg_offset(sid, page); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 576 if (offs < 0) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 577 return 0; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 578 40f1aea80b53b8 Markus Stockhausen 2024-10-07 579 return rtsds_93xx_read(ctrl, offs, page, reg); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 580 } 40f1aea80b53b8 Markus Stockhausen 2024-10-07 581 40f1aea80b53b8 Markus Stockhausen 2024-10-07 582 static int rtsds_931x_mask(struct rtsds_ctrl *ctrl, u32 sid, u32 page, u32 reg, u32 val, u32 mask) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 583 { 40f1aea80b53b8 Markus Stockhausen 2024-10-07 584 int offs; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 585 40f1aea80b53b8 Markus Stockhausen 2024-10-07 586 if (rtsds_invalid_reg(ctrl, sid, page, reg)) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 587 return -EINVAL; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 588 40f1aea80b53b8 Markus Stockhausen 2024-10-07 589 offs = rtsds_931x_reg_offset(sid, page); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 590 if (offs < 0) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 591 return 0; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 592 40f1aea80b53b8 Markus Stockhausen 2024-10-07 593 return rtsds_93xx_mask(ctrl, offs, page, reg, val, mask); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 594 } 40f1aea80b53b8 Markus Stockhausen 2024-10-07 595 40f1aea80b53b8 Markus Stockhausen 2024-10-07 596 static int rtsds_931x_set_mode(struct rtsds_ctrl *ctrl, u32 sid, int combomode) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 597 { 40f1aea80b53b8 Markus Stockhausen 2024-10-07 598 int shift = (sid & 3) << 3, offs = sid & ~3; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 599 int mode = RTSDS_MODE(combomode); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 600 int submode = RTSDS_SUBMODE(combomode); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 601 40f1aea80b53b8 Markus Stockhausen 2024-10-07 602 if (rtsds_invalid_sds(ctrl, sid)) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 603 return -EINVAL; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 604 40f1aea80b53b8 Markus Stockhausen 2024-10-07 605 rtsds_931x_mask(ctrl, sid, 0x1f, 0x09, (submode & 0x3f << 6), 0x0fc0); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 606 iomask32(0xff << shift, ((mode | RTSDS_931X_SDS_FORCE_SETUP) & 0xff) << shift, 40f1aea80b53b8 Markus Stockhausen 2024-10-07 607 RTSDS_931X_SERDES_MODE_CTRL + offs); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 608 40f1aea80b53b8 Markus Stockhausen 2024-10-07 609 return 0; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 610 } 40f1aea80b53b8 Markus Stockhausen 2024-10-07 611 40f1aea80b53b8 Markus Stockhausen 2024-10-07 612 static int rtsds_931x_get_mode(struct rtsds_ctrl *ctrl, u32 sid) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 613 { 40f1aea80b53b8 Markus Stockhausen 2024-10-07 614 int mode, submode, shift = (sid & 3) << 3, offs = sid & ~3; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 615 40f1aea80b53b8 Markus Stockhausen 2024-10-07 616 if (rtsds_invalid_sds(ctrl, sid)) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 617 return -EINVAL; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 618 40f1aea80b53b8 Markus Stockhausen 2024-10-07 619 submode = (rtsds_931x_read(ctrl, sid, 0x1f, 0x09) >> 6) & 0x3f; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 620 mode = (ioread32(RTSDS_931X_SERDES_MODE_CTRL + offs) >> shift) & 0x1f; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 621 40f1aea80b53b8 Markus Stockhausen 2024-10-07 622 return RTSDS_COMBOMODE(mode, submode); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 623 } 40f1aea80b53b8 Markus Stockhausen 2024-10-07 624 40f1aea80b53b8 Markus Stockhausen 2024-10-07 625 static int rtsds_931x_reset(struct rtsds_ctrl *ctrl, u32 sid) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 626 { 40f1aea80b53b8 Markus Stockhausen 2024-10-07 627 int pwr, modecur, modeoff = ctrl->conf->mode_map[PHY_INTERFACE_MODE_NA]; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 628 40f1aea80b53b8 Markus Stockhausen 2024-10-07 629 if (rtsds_invalid_sds(ctrl, sid)) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 630 return -EINVAL; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 631 40f1aea80b53b8 Markus Stockhausen 2024-10-07 632 modecur = rtsds_931x_get_mode(ctrl, sid); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 633 40f1aea80b53b8 Markus Stockhausen 2024-10-07 634 if (modecur != modeoff) { 40f1aea80b53b8 Markus Stockhausen 2024-10-07 635 /* reset with mode switch cycle while being powered off */ 40f1aea80b53b8 Markus Stockhausen 2024-10-07 636 pwr = ioread32(RTSDS_931X_PS_SERDES_OFF_MODE_CTRL); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 637 iowrite32(pwr | BIT(sid), RTSDS_931X_PS_SERDES_OFF_MODE_CTRL); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 638 rtsds_931x_set_mode(ctrl, sid, modeoff); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 639 rtsds_931x_set_mode(ctrl, sid, modecur); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 640 iowrite32(pwr, RTSDS_931X_PS_SERDES_OFF_MODE_CTRL); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 641 } 40f1aea80b53b8 Markus Stockhausen 2024-10-07 642 40f1aea80b53b8 Markus Stockhausen 2024-10-07 643 return 0; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 644 } 40f1aea80b53b8 Markus Stockhausen 2024-10-07 645 40f1aea80b53b8 Markus Stockhausen 2024-10-07 646 int rtsds_read(struct phy *phy, u32 page, u32 reg) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 647 { 40f1aea80b53b8 Markus Stockhausen 2024-10-07 648 struct rtsds_macro *macro = phy_get_drvdata(phy); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 649 struct rtsds_ctrl *ctrl = macro->ctrl; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 650 u32 sid = macro->sid; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 651 40f1aea80b53b8 Markus Stockhausen 2024-10-07 652 return ctrl->conf->read(ctrl, sid, page, reg); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 653 } 40f1aea80b53b8 Markus Stockhausen 2024-10-07 654 40f1aea80b53b8 Markus Stockhausen 2024-10-07 655 int rtsds_mask(struct phy *phy, u32 page, u32 reg, u32 val, u32 mask) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 656 { 40f1aea80b53b8 Markus Stockhausen 2024-10-07 657 struct rtsds_macro *macro = phy_get_drvdata(phy); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 658 struct rtsds_ctrl *ctrl = macro->ctrl; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 659 u32 sid = macro->sid; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 660 40f1aea80b53b8 Markus Stockhausen 2024-10-07 661 if (rtsds_readonly(ctrl, sid)) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 662 return 0; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 663 40f1aea80b53b8 Markus Stockhausen 2024-10-07 664 return ctrl->conf->mask(ctrl, sid, page, reg, val, mask); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 665 } 40f1aea80b53b8 Markus Stockhausen 2024-10-07 666 40f1aea80b53b8 Markus Stockhausen 2024-10-07 667 int rtsds_write(struct phy *phy, u32 page, u32 reg, u32 val) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 668 { 40f1aea80b53b8 Markus Stockhausen 2024-10-07 669 return rtsds_mask(phy, page, reg, val, 0xffff); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 670 } 40f1aea80b53b8 Markus Stockhausen 2024-10-07 671 40f1aea80b53b8 Markus Stockhausen 2024-10-07 672 static int rtsds_phy_init(struct phy *phy) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 673 { 40f1aea80b53b8 Markus Stockhausen 2024-10-07 674 struct rtsds_macro *macro = phy_get_drvdata(phy); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 675 struct rtsds_ctrl *ctrl = macro->ctrl; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 676 u32 sid = macro->sid; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 677 int ret; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 678 40f1aea80b53b8 Markus Stockhausen 2024-10-07 679 if (rtsds_readonly(ctrl, sid)) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 680 return 0; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 681 40f1aea80b53b8 Markus Stockhausen 2024-10-07 682 mutex_lock(&ctrl->lock); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 683 // ret = rtsds_run_event(ctrl, sid, RTSDS_EVENT_INIT); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 684 mutex_unlock(&ctrl->lock); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 685 40f1aea80b53b8 Markus Stockhausen 2024-10-07 @686 if (ret) 40f1aea80b53b8 Markus Stockhausen 2024-10-07 687 dev_err(ctrl->dev, "init failed for SerDes %d\n", sid); 40f1aea80b53b8 Markus Stockhausen 2024-10-07 688 40f1aea80b53b8 Markus Stockhausen 2024-10-07 689 return ret; 40f1aea80b53b8 Markus Stockhausen 2024-10-07 690 } 40f1aea80b53b8 Markus Stockhausen 2024-10-07 691 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki