[PATCH v1 2/2] i3c: master: Add Nuvoton npcm845 i3c master driver
kernel test robot
lkp at intel.com
Sat Aug 3 12:12:20 AEST 2024
Hi Stanley,
kernel test robot noticed the following build warnings:
[auto build test WARNING on robh/for-next]
[also build test WARNING on linus/master v6.11-rc1 next-20240802]
[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/Stanley-Chu/dt-bindings-i3c-Add-NPCM845-i3c-controller/20240802-183617
base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
patch link: https://lore.kernel.org/r/20240801071946.43266-3-yschu%40nuvoton.com
patch subject: [PATCH v1 2/2] i3c: master: Add Nuvoton npcm845 i3c master driver
config: hexagon-allmodconfig (https://download.01.org/0day-ci/archive/20240803/202408030900.Hx3aeLR4-lkp@intel.com/config)
compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 423aec6573df4424f90555468128e17073ddc69e)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240803/202408030900.Hx3aeLR4-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 at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202408030900.Hx3aeLR4-lkp@intel.com/
All warnings (new ones prefixed by >>):
In file included from drivers/i3c/master/npcm845-i3c-master.c:14:
In file included from include/linux/dma-mapping.h:11:
In file included from include/linux/scatterlist.h:8:
In file included from include/linux/mm.h:2228:
include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
In file included from drivers/i3c/master/npcm845-i3c-master.c:14:
In file included from include/linux/dma-mapping.h:11:
In file included from include/linux/scatterlist.h:9:
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/i3c/master/npcm845-i3c-master.c:14:
In file included from include/linux/dma-mapping.h:11:
In file included from include/linux/scatterlist.h:9:
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/i3c/master/npcm845-i3c-master.c:14:
In file included from include/linux/dma-mapping.h:11:
In file included from include/linux/scatterlist.h:9:
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/i3c/master/npcm845-i3c-master.c:655:2: warning: unannotated fall-through between switch labels [-Wimplicit-fallthrough]
655 | default:
| ^
drivers/i3c/master/npcm845-i3c-master.c:655:2: note: insert 'break;' to avoid fall-through
655 | default:
| ^
| break;
>> drivers/i3c/master/npcm845-i3c-master.c:885:41: warning: shift count >= width of type [-Wshift-count-overflow]
885 | info.pid = (NPCM_I3C_VENDORID_VID(reg) << 33) | readl(master->regs + NPCM_I3C_PARTNO);
| ^ ~~
drivers/i3c/master/npcm845-i3c-master.c:1112:9: warning: use of bitwise '|' with boolean operands [-Wbitwise-instead-of-logical]
1112 | if ((NPCM_I3C_MSTATUS_STATE_IDLE(reg) |
| ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| ||
1113 | NPCM_I3C_MSTATUS_STATE_SLVREQ(reg)) &&
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/i3c/master/npcm845-i3c-master.c:67:42: note: expanded from macro 'NPCM_I3C_MSTATUS_STATE_IDLE'
67 | #define NPCM_I3C_MSTATUS_STATE_IDLE(x) (NPCM_I3C_MSTATUS_STATE(x) == 0)
| ^
drivers/i3c/master/npcm845-i3c-master.c:1112:9: note: cast one or both operands to int to silence this warning
drivers/i3c/master/npcm845-i3c-master.c:67:42: note: expanded from macro 'NPCM_I3C_MSTATUS_STATE_IDLE'
67 | #define NPCM_I3C_MSTATUS_STATE_IDLE(x) (NPCM_I3C_MSTATUS_STATE(x) == 0)
| ^
drivers/i3c/master/npcm845-i3c-master.c:2353:12: error: incompatible function pointer types initializing 'void (*)(struct platform_device *)' with an expression of type 'int (struct platform_device *)' [-Wincompatible-function-pointer-types]
2353 | .remove = npcm_i3c_master_remove,
| ^~~~~~~~~~~~~~~~~~~~~~
10 warnings and 1 error generated.
vim +885 drivers/i3c/master/npcm845-i3c-master.c
770
771 static int npcm_i3c_master_bus_init(struct i3c_master_controller *m)
772 {
773 struct npcm_i3c_master *master = to_npcm_i3c_master(m);
774 struct i3c_bus *bus = i3c_master_get_bus(m);
775 struct i3c_device_info info = {};
776 unsigned long fclk_rate, fclk_period_ns;
777 unsigned long i3c_scl_rate, i2c_scl_rate;
778 unsigned int pp_high_period_ns, od_low_period_ns, i2c_period_ns;
779 unsigned int scl_period_ns;
780 u32 ppbaud, pplow, odhpp, odbaud, i2cbaud, reg;
781 int ret;
782
783 /* Timings derivation */
784 fclk_rate = clk_get_rate(master->fclk);
785 if (!fclk_rate)
786 return -EINVAL;
787
788 fclk_period_ns = DIV_ROUND_UP(1000000000, fclk_rate);
789
790 /*
791 * Configure for Push-Pull mode.
792 */
793 if (master->scl_timing.i3c_pp_hi >= I3C_SCL_PP_PERIOD_NS_MIN &&
794 master->scl_timing.i3c_pp_lo >= master->scl_timing.i3c_pp_hi) {
795 ppbaud = DIV_ROUND_UP(master->scl_timing.i3c_pp_hi, fclk_period_ns) - 1;
796 if (ppbaud > NPCM_I3C_MAX_PPBAUD)
797 ppbaud = NPCM_I3C_MAX_PPBAUD;
798 pplow = DIV_ROUND_UP(master->scl_timing.i3c_pp_lo, fclk_period_ns)
799 - (ppbaud + 1);
800 if (pplow > NPCM_I3C_MAX_PPLOW)
801 pplow = NPCM_I3C_MAX_PPLOW;
802 bus->scl_rate.i3c = 1000000000 / (((ppbaud + 1) * 2 + pplow) * fclk_period_ns);
803 } else {
804 scl_period_ns = DIV_ROUND_UP(1000000000, bus->scl_rate.i3c);
805 if (bus->scl_rate.i3c == 10000000) {
806 /* Workaround for npcm8xx: 40/60 ns */
807 ppbaud = DIV_ROUND_UP(40, fclk_period_ns) - 1;
808 pplow = DIV_ROUND_UP(20, fclk_period_ns);
809 } else {
810 /* 50% duty-cycle */
811 ppbaud = DIV_ROUND_UP((scl_period_ns / 2), fclk_period_ns) - 1;
812 pplow = 0;
813 }
814 if (ppbaud > NPCM_I3C_MAX_PPBAUD)
815 ppbaud = NPCM_I3C_MAX_PPBAUD;
816 }
817 pp_high_period_ns = (ppbaud + 1) * fclk_period_ns;
818
819 /*
820 * Configure for Open-Drain mode.
821 */
822 if (master->scl_timing.i3c_od_hi >= pp_high_period_ns &&
823 master->scl_timing.i3c_od_lo >= I3C_SCL_OD_LOW_PERIOD_NS_MIN) {
824 if (master->scl_timing.i3c_od_hi == pp_high_period_ns)
825 odhpp = 1;
826 else
827 odhpp = 0;
828 odbaud = DIV_ROUND_UP(master->scl_timing.i3c_od_lo, pp_high_period_ns) - 1;
829 } else {
830 /* Set default OD timing: 1MHz/1000ns with 50% duty cycle */
831 odhpp = 0;
832 odbaud = DIV_ROUND_UP(500, pp_high_period_ns) - 1;
833 }
834 if (odbaud > NPCM_I3C_MAX_ODBAUD)
835 odbaud = NPCM_I3C_MAX_ODBAUD;
836 od_low_period_ns = (odbaud + 1) * pp_high_period_ns;
837
838 /* Configure for I2C mode */
839 i2c_period_ns = DIV_ROUND_UP(1000000000, bus->scl_rate.i2c);
840 if (i2c_period_ns < od_low_period_ns * 2)
841 i2c_period_ns = od_low_period_ns * 2;
842 i2cbaud = DIV_ROUND_UP(i2c_period_ns, od_low_period_ns) - 2;
843 if (i2cbaud > NPCM_I3C_MAX_I2CBAUD)
844 i2cbaud = NPCM_I3C_MAX_I2CBAUD;
845
846 i3c_scl_rate = 1000000000 / (((ppbaud + 1) * 2 + pplow) * fclk_period_ns);
847 i2c_scl_rate = 1000000000 / ((i2cbaud + 2) * od_low_period_ns);
848
849 reg = NPCM_I3C_MCONFIG_MASTER_EN |
850 NPCM_I3C_MCONFIG_DISTO(0) |
851 NPCM_I3C_MCONFIG_HKEEP(3) |
852 NPCM_I3C_MCONFIG_ODSTOP(1) |
853 NPCM_I3C_MCONFIG_PPBAUD(ppbaud) |
854 NPCM_I3C_MCONFIG_PPLOW(pplow) |
855 NPCM_I3C_MCONFIG_ODBAUD(odbaud) |
856 NPCM_I3C_MCONFIG_ODHPP(odhpp) |
857 NPCM_I3C_MCONFIG_SKEW(0) |
858 NPCM_I3C_MCONFIG_I2CBAUD(i2cbaud);
859 writel(reg, master->regs + NPCM_I3C_MCONFIG);
860
861 dev_dbg(master->dev, "dts: i3c rate=%lu, i2c rate=%lu\n",
862 bus->scl_rate.i3c, bus->scl_rate.i2c);
863 dev_info(master->dev, "fclk=%lu, period_ns=%lu\n", fclk_rate, fclk_period_ns);
864 dev_info(master->dev, "i3c scl_rate=%lu\n", i3c_scl_rate);
865 dev_info(master->dev, "i2c scl_rate=%lu\n", i2c_scl_rate);
866 dev_info(master->dev, "pp_high=%u, pp_low=%lu\n", pp_high_period_ns,
867 (ppbaud + 1 + pplow) * fclk_period_ns);
868 dev_info(master->dev, "pp_sda_rd_skew=%d, pp_sda_wr_skew=%d\n",
869 master->scl_timing.i3c_pp_sda_rd_skew,
870 master->scl_timing.i3c_pp_sda_wr_skew);
871 dev_info(master->dev, "od_high=%d, od_low=%d\n",
872 odhpp ? pp_high_period_ns : od_low_period_ns, od_low_period_ns);
873 dev_dbg(master->dev, "i2c_high=%u, i2c_low=%u\n", ((i2cbaud >> 1) + 1) * od_low_period_ns,
874 ((i2cbaud >> 1) + 1 + (i2cbaud % 2)) * od_low_period_ns);
875 dev_dbg(master->dev, "ppbaud=%d, pplow=%d, odbaud=%d, i2cbaud=%d\n",
876 ppbaud, pplow, odbaud, i2cbaud);
877 dev_info(master->dev, "mconfig=0x%x\n", readl(master->regs + NPCM_I3C_MCONFIG));
878 /* Master core's registration */
879 ret = i3c_master_get_free_addr(m, 0);
880 if (ret < 0)
881 return ret;
882
883 info.dyn_addr = ret;
884 reg = readl(master->regs + NPCM_I3C_VENDORID);
> 885 info.pid = (NPCM_I3C_VENDORID_VID(reg) << 33) | readl(master->regs + NPCM_I3C_PARTNO);
886
887 writel(NPCM_MDYNADDR_VALID | NPCM_MDYNADDR_ADDR(info.dyn_addr),
888 master->regs + NPCM_I3C_MDYNADDR);
889
890 ret = i3c_master_set_info(&master->base, &info);
891
892 return ret;
893 }
894
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
More information about the openbmc
mailing list