Message ID | 20241007163623.3274510-4-markus.stockhausen@gmx.de |
---|---|
State | Superseded |
Headers | show |
Series | phy: Realtek Otto SerDes: add new driver | expand |
On 07/10/2024 18:36, Markus Stockhausen wrote: > Add the driver to the build system. The Otto platform currently has > only some drivers upstream and is missing a lot of platform bits. > Use only the bare minimum of dependencies. > > Changes in v2: > - Change naming convention > - Add more help text > > Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de> > --- > drivers/phy/realtek/Kconfig | 10 ++++++++++ > drivers/phy/realtek/Makefile | 1 + > 2 files changed, 11 insertions(+) Still no point in splitting this. <form letter> This is a friendly reminder during the review process. It seems my or other reviewer's previous comments were not fully addressed. Maybe the feedback got lost between the quotes, maybe you just forgot to apply it. Please go back to the previous discussion and either implement all requested changes or keep discussing them. Thank you. </form letter> Best regards, Krzysztof
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@intel.com/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@intel.com/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@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202410081436.fFz8vjTK-lkp@intel.com/ 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
Hi Markus,
kernel test robot noticed the following build errors:
[auto build test ERROR on robh/for-next]
[also build test ERROR 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: alpha-allyesconfig (https://download.01.org/0day-ci/archive/20241008/202410081449.rLWpQtUj-lkp@intel.com/config)
compiler: alpha-linux-gcc (GCC) 13.3.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241008/202410081449.rLWpQtUj-lkp@intel.com/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@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202410081449.rLWpQtUj-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from include/linux/debugfs.h:16,
from drivers/phy/realtek/phy-rtk-otto-serdes.c:7:
drivers/phy/realtek/phy-rtk-otto-serdes.c: In function 'rtsds_dbg_mode_open':
>> drivers/phy/realtek/phy-rtk-otto-serdes.c:868:29: error: passing argument 2 of 'single_open' from incompatible pointer type [-Werror=incompatible-pointer-types]
868 | DEFINE_SHOW_STORE_ATTRIBUTE(rtsds_dbg_mode);
| ^~~~~~~~~~~~~~
| |
| ssize_t (*)(struct seq_file *, void *) {aka long int (*)(struct seq_file *, void *)}
include/linux/seq_file.h:223:34: note: in definition of macro 'DEFINE_SHOW_STORE_ATTRIBUTE'
223 | return single_open(file, __name ## _show, inode->i_private); \
| ^~~~~~
include/linux/seq_file.h:176:32: note: expected 'int (*)(struct seq_file *, void *)' but argument is of type 'ssize_t (*)(struct seq_file *, void *)' {aka 'long int (*)(struct seq_file *, void *)'}
176 | int single_open(struct file *, int (*)(struct seq_file *, void *), void *);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/phy/realtek/phy-rtk-otto-serdes.c: In function 'rtsds_dbg_reset_open':
drivers/phy/realtek/phy-rtk-otto-serdes.c:891:29: error: passing argument 2 of 'single_open' from incompatible pointer type [-Werror=incompatible-pointer-types]
891 | DEFINE_SHOW_STORE_ATTRIBUTE(rtsds_dbg_reset);
| ^~~~~~~~~~~~~~~
| |
| ssize_t (*)(struct seq_file *, void *) {aka long int (*)(struct seq_file *, void *)}
include/linux/seq_file.h:223:34: note: in definition of macro 'DEFINE_SHOW_STORE_ATTRIBUTE'
223 | return single_open(file, __name ## _show, inode->i_private); \
| ^~~~~~
include/linux/seq_file.h:176:32: note: expected 'int (*)(struct seq_file *, void *)' but argument is of type 'ssize_t (*)(struct seq_file *, void *)' {aka 'long int (*)(struct seq_file *, void *)'}
176 | int single_open(struct file *, int (*)(struct seq_file *, void *), void *);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
vim +/single_open +868 drivers/phy/realtek/phy-rtk-otto-serdes.c
40f1aea80b53b8 Markus Stockhausen 2024-10-07 847
40f1aea80b53b8 Markus Stockhausen 2024-10-07 848 static ssize_t rtsds_dbg_mode_write(struct file *file, const char __user *userbuf,
40f1aea80b53b8 Markus Stockhausen 2024-10-07 849 size_t count, loff_t *ppos)
40f1aea80b53b8 Markus Stockhausen 2024-10-07 850 {
40f1aea80b53b8 Markus Stockhausen 2024-10-07 851 struct seq_file *seqf = file->private_data;
40f1aea80b53b8 Markus Stockhausen 2024-10-07 852 struct rtsds_macro *macro = dev_get_drvdata(seqf->private);
40f1aea80b53b8 Markus Stockhausen 2024-10-07 853 struct rtsds_ctrl *ctrl = macro->ctrl;
40f1aea80b53b8 Markus Stockhausen 2024-10-07 854 int ret, hwmode, phymode, sid = macro->sid;
40f1aea80b53b8 Markus Stockhausen 2024-10-07 855
40f1aea80b53b8 Markus Stockhausen 2024-10-07 856 ret = kstrtou32_from_user(userbuf, count, 16, &hwmode);
40f1aea80b53b8 Markus Stockhausen 2024-10-07 857 if (ret)
40f1aea80b53b8 Markus Stockhausen 2024-10-07 858 return ret;
40f1aea80b53b8 Markus Stockhausen 2024-10-07 859 /*
40f1aea80b53b8 Markus Stockhausen 2024-10-07 860 * Allow to set arbitrary modes into the SerDes to improve error analysis. Accept that
40f1aea80b53b8 Markus Stockhausen 2024-10-07 861 * this might confuse the internal state tracking.
40f1aea80b53b8 Markus Stockhausen 2024-10-07 862 */
40f1aea80b53b8 Markus Stockhausen 2024-10-07 863 phymode = rtsds_hwmode_to_phymode(ctrl, hwmode);
40f1aea80b53b8 Markus Stockhausen 2024-10-07 864 rtsds_phy_set_mode_int(ctrl, sid, phymode, hwmode);
40f1aea80b53b8 Markus Stockhausen 2024-10-07 865
40f1aea80b53b8 Markus Stockhausen 2024-10-07 866 return count;
40f1aea80b53b8 Markus Stockhausen 2024-10-07 867 }
40f1aea80b53b8 Markus Stockhausen 2024-10-07 @868 DEFINE_SHOW_STORE_ATTRIBUTE(rtsds_dbg_mode);
40f1aea80b53b8 Markus Stockhausen 2024-10-07 869
Hi Markus,
kernel test robot noticed the following build errors:
[auto build test ERROR on robh/for-next]
[also build test ERROR 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: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20241008/202410081607.EKE62jfx-lkp@intel.com/config)
compiler: clang version 18.1.8 (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241008/202410081607.EKE62jfx-lkp@intel.com/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@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202410081607.EKE62jfx-lkp@intel.com/
All errors (new ones prefixed by >>):
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
>> drivers/phy/realtek/phy-rtk-otto-serdes.c:868:1: error: incompatible function pointer types passing 'ssize_t (struct seq_file *, void *)' (aka 'long (struct seq_file *, void *)') to parameter of type 'int (*)(struct seq_file *, void *)' [-Wincompatible-function-pointer-types]
868 | DEFINE_SHOW_STORE_ATTRIBUTE(rtsds_dbg_mode);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/seq_file.h:223:27: note: expanded from macro 'DEFINE_SHOW_STORE_ATTRIBUTE'
223 | return single_open(file, __name ## _show, inode->i_private); \
| ^~~~~~~~~~~~~~~
<scratch space>:49:1: note: expanded from here
49 | rtsds_dbg_mode_show
| ^~~~~~~~~~~~~~~~~~~
include/linux/seq_file.h:176:38: note: passing argument to parameter here
176 | int single_open(struct file *, int (*)(struct seq_file *, void *), void *);
| ^
drivers/phy/realtek/phy-rtk-otto-serdes.c:891:1: error: incompatible function pointer types passing 'ssize_t (struct seq_file *, void *)' (aka 'long (struct seq_file *, void *)') to parameter of type 'int (*)(struct seq_file *, void *)' [-Wincompatible-function-pointer-types]
891 | DEFINE_SHOW_STORE_ATTRIBUTE(rtsds_dbg_reset);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/seq_file.h:223:27: note: expanded from macro 'DEFINE_SHOW_STORE_ATTRIBUTE'
223 | return single_open(file, __name ## _show, inode->i_private); \
| ^~~~~~~~~~~~~~~
<scratch space>:54:1: note: expanded from here
54 | rtsds_dbg_reset_show
| ^~~~~~~~~~~~~~~~~~~~
include/linux/seq_file.h:176:38: note: passing argument to parameter here
176 | int single_open(struct file *, int (*)(struct seq_file *, void *), void *);
| ^
5 warnings and 2 errors 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]
vim +868 drivers/phy/realtek/phy-rtk-otto-serdes.c
40f1aea80b53b8 Markus Stockhausen 2024-10-07 847
40f1aea80b53b8 Markus Stockhausen 2024-10-07 848 static ssize_t rtsds_dbg_mode_write(struct file *file, const char __user *userbuf,
40f1aea80b53b8 Markus Stockhausen 2024-10-07 849 size_t count, loff_t *ppos)
40f1aea80b53b8 Markus Stockhausen 2024-10-07 850 {
40f1aea80b53b8 Markus Stockhausen 2024-10-07 851 struct seq_file *seqf = file->private_data;
40f1aea80b53b8 Markus Stockhausen 2024-10-07 852 struct rtsds_macro *macro = dev_get_drvdata(seqf->private);
40f1aea80b53b8 Markus Stockhausen 2024-10-07 853 struct rtsds_ctrl *ctrl = macro->ctrl;
40f1aea80b53b8 Markus Stockhausen 2024-10-07 854 int ret, hwmode, phymode, sid = macro->sid;
40f1aea80b53b8 Markus Stockhausen 2024-10-07 855
40f1aea80b53b8 Markus Stockhausen 2024-10-07 856 ret = kstrtou32_from_user(userbuf, count, 16, &hwmode);
40f1aea80b53b8 Markus Stockhausen 2024-10-07 857 if (ret)
40f1aea80b53b8 Markus Stockhausen 2024-10-07 858 return ret;
40f1aea80b53b8 Markus Stockhausen 2024-10-07 859 /*
40f1aea80b53b8 Markus Stockhausen 2024-10-07 860 * Allow to set arbitrary modes into the SerDes to improve error analysis. Accept that
40f1aea80b53b8 Markus Stockhausen 2024-10-07 861 * this might confuse the internal state tracking.
40f1aea80b53b8 Markus Stockhausen 2024-10-07 862 */
40f1aea80b53b8 Markus Stockhausen 2024-10-07 863 phymode = rtsds_hwmode_to_phymode(ctrl, hwmode);
40f1aea80b53b8 Markus Stockhausen 2024-10-07 864 rtsds_phy_set_mode_int(ctrl, sid, phymode, hwmode);
40f1aea80b53b8 Markus Stockhausen 2024-10-07 865
40f1aea80b53b8 Markus Stockhausen 2024-10-07 866 return count;
40f1aea80b53b8 Markus Stockhausen 2024-10-07 867 }
40f1aea80b53b8 Markus Stockhausen 2024-10-07 @868 DEFINE_SHOW_STORE_ATTRIBUTE(rtsds_dbg_mode);
40f1aea80b53b8 Markus Stockhausen 2024-10-07 869
diff --git a/drivers/phy/realtek/Kconfig b/drivers/phy/realtek/Kconfig index 75ac7e7c31ae..021b4c4e700a 100644 --- a/drivers/phy/realtek/Kconfig +++ b/drivers/phy/realtek/Kconfig @@ -30,3 +30,13 @@ config PHY_RTK_RTD_USB3PHY of the parameters. endif # ARCH_REALTEK || COMPILE_TEST + +config PHY_RTK_OTTO_SERDES + tristate "SerDes driver for the Realtek Otto platform" + depends on OF + select GENERIC_PHY + help + Enable this to support Realtek SerDes in the RTL83xx and + RTL93xx network SoCs. These are based on MIPS32 architecture + and the SerDes connect to one to octa transceivers to build + up switches with up to 52 ports. diff --git a/drivers/phy/realtek/Makefile b/drivers/phy/realtek/Makefile index ed7b47ff8a26..34e607f33961 100644 --- a/drivers/phy/realtek/Makefile +++ b/drivers/phy/realtek/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_PHY_RTK_RTD_USB2PHY) += phy-rtk-usb2.o obj-$(CONFIG_PHY_RTK_RTD_USB3PHY) += phy-rtk-usb3.o +obj-$(CONFIG_PHY_RTK_OTTO_SERDES) += phy-rtk-otto-serdes.o
Add the driver to the build system. The Otto platform currently has only some drivers upstream and is missing a lot of platform bits. Use only the bare minimum of dependencies. Changes in v2: - Change naming convention - Add more help text Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de> --- drivers/phy/realtek/Kconfig | 10 ++++++++++ drivers/phy/realtek/Makefile | 1 + 2 files changed, 11 insertions(+) -- 2.46.2