Hi Christian, kernel test robot noticed the following build errors: [auto build test ERROR on lee-leds/for-leds-next] [also build test ERROR on robh/for-next linus/master v6.9 next-20240517] [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/Christian-Marangi/dt-bindings-leds-lp55xx-Add-new-ti-lp5569-compatible/20240515-223434 base: https://git.kernel.org/pub/scm/linux/kernel/git/lee/leds.git for-leds-next patch link: https://lore.kernel.org/r/20240515143129.31557-3-ansuelsmth%40gmail.com patch subject: [PATCH 3/3] leds: leds-lp5569: Add support for Texas Instruments LP5569 config: hexagon-allyesconfig (https://download.01.org/0day-ci/archive/20240518/202405182007.uyC8NXfY-lkp@xxxxxxxxx/config) compiler: clang version 19.0.0git (https://github.com/llvm/llvm-project d3455f4ddd16811401fa153298fadd2f59f6914e) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240518/202405182007.uyC8NXfY-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/202405182007.uyC8NXfY-lkp@xxxxxxxxx/ All errors (new ones prefixed by >>): In file included from drivers/leds/leds-lp5569.c:15: In file included from include/linux/i2c.h:19: In file included from include/linux/regulator/consumer.h:35: In file included from include/linux/suspend.h:5: In file included from include/linux/swap.h:9: In file included from include/linux/memcontrol.h:13: In file included from include/linux/cgroup.h:26: In file included from include/linux/kernel_stat.h:9: In file included from include/linux/interrupt.h:11: 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:13: In file included from arch/hexagon/include/asm/io.h:328: include/asm-generic/io.h:547:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 547 | val = __raw_readb(PCI_IOBASE + addr); | ~~~~~~~~~~ ^ include/asm-generic/io.h:560:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 560 | 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/leds/leds-lp5569.c:15: In file included from include/linux/i2c.h:19: In file included from include/linux/regulator/consumer.h:35: In file included from include/linux/suspend.h:5: In file included from include/linux/swap.h:9: In file included from include/linux/memcontrol.h:13: In file included from include/linux/cgroup.h:26: In file included from include/linux/kernel_stat.h:9: In file included from include/linux/interrupt.h:11: 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:13: In file included from arch/hexagon/include/asm/io.h:328: include/asm-generic/io.h:573:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 573 | 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/leds/leds-lp5569.c:15: In file included from include/linux/i2c.h:19: In file included from include/linux/regulator/consumer.h:35: In file included from include/linux/suspend.h:5: In file included from include/linux/swap.h:9: In file included from include/linux/memcontrol.h:13: In file included from include/linux/cgroup.h:26: In file included from include/linux/kernel_stat.h:9: In file included from include/linux/interrupt.h:11: 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:13: In file included from arch/hexagon/include/asm/io.h:328: include/asm-generic/io.h:584:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 584 | __raw_writeb(value, PCI_IOBASE + addr); | ~~~~~~~~~~ ^ include/asm-generic/io.h:594:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 594 | __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr); | ~~~~~~~~~~ ^ include/asm-generic/io.h:604:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 604 | __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr); | ~~~~~~~~~~ ^ In file included from drivers/leds/leds-lp5569.c:15: In file included from include/linux/i2c.h:19: In file included from include/linux/regulator/consumer.h:35: In file included from include/linux/suspend.h:5: In file included from include/linux/swap.h:9: In file included from include/linux/memcontrol.h:21: In file included from include/linux/mm.h:2208: include/linux/vmstat.h:522:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion] 522 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_" | ~~~~~~~~~~~ ^ ~~~ >> drivers/leds/leds-lp5569.c:169:9: error: call to undeclared function 'FIELD_PREP'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 169 | val |= FIELD_PREP(LP5569_CP_MODE_MASK, chip->pdata->charge_pump_mode); | ^ >> drivers/leds/leds-lp5569.c:195:8: error: call to undeclared function 'FIELD_PREP_CONST'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 195 | val = LP5569_MODE_LOAD_ENG << LP5569_MODE_ENGn_SHIFT(idx); | ^ drivers/leds/leds-lp5569.c:41:33: note: expanded from macro 'LP5569_MODE_LOAD_ENG' 41 | #define LP5569_MODE_LOAD_ENG FIELD_PREP_CONST(LP5569_MODE_ENG_MASK, 0x1) | ^ drivers/leds/leds-lp5569.c:262:40: error: call to undeclared function 'FIELD_PREP_CONST'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 262 | if (LP5569_MODE_ENGn_GET(i, mode) != LP5569_MODE_LOAD_ENG) | ^ drivers/leds/leds-lp5569.c:41:33: note: expanded from macro 'LP5569_MODE_LOAD_ENG' 41 | #define LP5569_MODE_LOAD_ENG FIELD_PREP_CONST(LP5569_MODE_ENG_MASK, 0x1) | ^ >> drivers/leds/leds-lp5569.c:321:11: error: call to undeclared function 'FIELD_GET'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 321 | status = FIELD_GET(LP5569_ENG_STATUS_MASK, status); | ^ drivers/leds/leds-lp5569.c:601:6: error: call to undeclared function 'FIELD_PREP'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 601 | FIELD_PREP(LP5569_CP_MODE_MASK, LP55XX_CP_BOOST), | ^ drivers/leds/leds-lp5569.c:696:6: error: call to undeclared function 'FIELD_PREP'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 696 | FIELD_PREP(LP5569_CP_MODE_MASK, LP55XX_CP_BYPASS), | ^ drivers/leds/leds-lp5569.c:903:9: error: call to undeclared function 'FIELD_PREP'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 903 | val = FIELD_PREP(LP5569_FADER_MAPPING_MASK, val); | ^ >> drivers/leds/leds-lp5569.c:904:13: error: call to undeclared function 'FIELD_MAX'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 904 | if (val > FIELD_MAX(LP5569_FADER_MAPPING_MASK)) { | ^ drivers/leds/leds-lp5569.c:932:10: error: call to undeclared function 'FIELD_PREP'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 932 | val = FIELD_PREP(LP5569_FADER_MAPPING_MASK, buf[i] - '0'); | ^ 7 warnings and 9 errors generated. vim +/FIELD_PREP +169 drivers/leds/leds-lp5569.c 155 156 static int lp5569_post_init_device(struct lp55xx_chip *chip) 157 { 158 int ret; 159 int val; 160 161 ret = lp55xx_write(chip, LP5569_REG_ENABLE, LP5569_ENABLE); 162 if (ret) 163 return ret; 164 165 /* Chip startup time is 500 us, 1 - 2 ms gives some margin */ 166 usleep_range(1000, 2000); 167 168 val = LP5569_DEFAULT_CONFIG; > 169 val |= FIELD_PREP(LP5569_CP_MODE_MASK, chip->pdata->charge_pump_mode); 170 171 if (chip->pdata->clock_mode == LP55XX_CLOCK_INT) 172 val |= LP5569_INTERNAL_CLK; 173 174 ret = lp55xx_write(chip, LP5569_REG_MISC, val); 175 if (ret) 176 return ret; 177 178 if (chip->pdata->clock_mode == LP55XX_CLOCK_INT) { 179 ret = lp55xx_update_bits(chip, LP5569_REG_IO_CONTROL, 180 LP5569_CLK_OUTPUT, 181 LP5569_CLK_OUTPUT); 182 if (ret) 183 return ret; 184 } 185 186 return lp5569_init_program_engine(chip); 187 } 188 189 static void lp5569_load_engine(struct lp55xx_chip *chip) 190 { 191 enum lp55xx_engine_index idx = chip->engine_idx; 192 u8 mask, val; 193 194 mask = LP5569_MODE_ENGn_MASK(idx); > 195 val = LP5569_MODE_LOAD_ENG << LP5569_MODE_ENGn_SHIFT(idx); 196 197 lp55xx_update_bits(chip, LP5569_REG_OP_MODE, mask, val); 198 199 lp5569_wait_opmode_done(); 200 } 201 202 static void lp5569_load_engine_and_select_page(struct lp55xx_chip *chip) 203 { 204 enum lp55xx_engine_index idx = chip->engine_idx; 205 206 lp5569_load_engine(chip); 207 208 lp55xx_write(chip, LP5569_REG_PROG_PAGE_SEL, LP5569_PAGE_ENG(idx)); 209 } 210 211 static void lp5569_stop_all_engines(struct lp55xx_chip *chip) 212 { 213 lp55xx_write(chip, LP5569_REG_OP_MODE, 0); 214 lp5569_wait_opmode_done(); 215 } 216 217 static void lp5569_stop_engine(struct lp55xx_chip *chip) 218 { 219 enum lp55xx_engine_index idx = chip->engine_idx; 220 221 lp55xx_update_bits(chip, LP5569_REG_OP_MODE, LP5569_MODE_ENGn_MASK(idx), 0); 222 223 lp5569_wait_opmode_done(); 224 } 225 226 static void lp5569_turn_off_channels(struct lp55xx_chip *chip) 227 { 228 int i; 229 230 for (i = 0; i < LP5569_MAX_LEDS; i++) 231 lp55xx_write(chip, LP5569_REG_LED_PWM_BASE + i, 0); 232 } 233 234 static void lp5569_run_engine(struct lp55xx_chip *chip, bool start) 235 { 236 int i, ret; 237 u8 mode; 238 u8 exec; 239 240 /* stop engine */ 241 if (!start) { 242 lp5569_stop_engine(chip); 243 lp5569_turn_off_channels(chip); 244 return; 245 } 246 247 /* 248 * To run the engine, 249 * operation mode and enable register should updated at the same time 250 */ 251 252 ret = lp55xx_read(chip, LP5569_REG_OP_MODE, &mode); 253 if (ret) 254 return; 255 256 ret = lp55xx_read(chip, LP5569_REG_EXEC_CTRL, &exec); 257 if (ret) 258 return; 259 260 /* change operation mode to RUN only when each engine is loading */ 261 for (i = LP55XX_ENGINE_1; i <= LP55XX_ENGINE_3; i++) { 262 if (LP5569_MODE_ENGn_GET(i, mode) != LP5569_MODE_LOAD_ENG) 263 continue; 264 265 mode &= ~LP5569_MODE_ENGn_MASK(i); 266 mode |= LP5569_MODE_RUN_ENG << LP5569_MODE_ENGn_SHIFT(i); 267 exec &= ~LP5569_EXEC_ENGn_MASK(i); 268 exec |= LP5569_EXEC_RUN_ENG << LP5569_EXEC_ENGn_SHIFT(i); 269 } 270 271 lp55xx_write(chip, LP5569_REG_OP_MODE, mode); 272 lp5569_wait_opmode_done(); 273 274 lp55xx_write(chip, LP5569_REG_EXEC_CTRL, exec); 275 } 276 277 static int lp5569_init_program_engine(struct lp55xx_chip *chip) 278 { 279 int i; 280 int j; 281 int ret; 282 u8 status; 283 /* one pattern per engine setting LED MUX start and stop addresses */ 284 static const u8 pattern[][LP5569_PROGRAM_LENGTH] = { 285 { 0x9c, LP5569_ENG1_MUX_ADDR, 0x9c, 0xb0, 0x9d, 0x80, 0xd8, 0x00, 0}, 286 { 0x9c, LP5569_ENG2_MUX_ADDR, 0x9c, 0xc0, 0x9d, 0x80, 0xd8, 0x00, 0}, 287 { 0x9c, LP5569_ENG3_MUX_ADDR, 0x9c, 0xd0, 0x9d, 0x80, 0xd8, 0x00, 0}, 288 }; 289 290 /* hardcode 32 bytes of memory for each engine from program memory */ 291 ret = lp55xx_write(chip, LP5569_REG_CH1_PROG_START, LP5569_ENG1_PROG_ADDR); 292 if (ret) 293 return ret; 294 295 ret = lp55xx_write(chip, LP5569_REG_CH2_PROG_START, LP5569_ENG2_PROG_ADDR); 296 if (ret) 297 return ret; 298 299 ret = lp55xx_write(chip, LP5569_REG_CH3_PROG_START, LP5569_ENG3_PROG_ADDR); 300 if (ret) 301 return ret; 302 303 /* write LED MUX address space for each engine */ 304 for (i = LP55XX_ENGINE_1; i <= LP55XX_ENGINE_3; i++) { 305 chip->engine_idx = i; 306 lp5569_load_engine_and_select_page(chip); 307 308 for (j = 0; j < LP5569_PROGRAM_LENGTH; j++) { 309 ret = lp55xx_write(chip, LP5569_REG_PROG_MEM + j, 310 pattern[i - 1][j]); 311 if (ret) 312 goto out; 313 } 314 } 315 316 lp5569_run_engine(chip, true); 317 318 /* Let the programs run for couple of ms and check the engine status */ 319 usleep_range(3000, 6000); 320 lp55xx_read(chip, LP5569_REG_STATUS, &status); > 321 status = FIELD_GET(LP5569_ENG_STATUS_MASK, status); 322 323 if (status != LP5569_ENG_STATUS_MASK) { 324 dev_err(&chip->cl->dev, 325 "could not configure LED engine, status = 0x%.2x\n", 326 status); 327 ret = -1; 328 } 329 330 out: 331 lp5569_stop_all_engines(chip); 332 return ret; 333 } 334 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki