tree: https://git.kernel.org/pub/scm/linux/kernel/git/sashal/linux-stable.git queue-5.4 head: 8fc787b62d0c673cca994da068df84905ddea333 commit: eec346066d383e736228ada2a0c24e6ac8369619 [73/106] usb: musb: Add support for MediaTek musb controller config: alpha-allmodconfig (attached as .config) compiler: alpha-linux-gcc (GCC) 9.3.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross git checkout eec346066d383e736228ada2a0c24e6ac8369619 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=alpha If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All error/warnings (new ones prefixed by >>): drivers/usb/musb/mediatek.c: In function 'generic_interrupt': >> drivers/usb/musb/mediatek.c:202:18: error: implicit declaration of function 'musb_clearb'; did you mean 'musb_readb'? [-Werror=implicit-function-declaration] 202 | musb->int_usb = musb_clearb(musb->mregs, MUSB_INTRUSB); | ^~~~~~~~~~~ | musb_readb >> drivers/usb/musb/mediatek.c:203:17: error: implicit declaration of function 'musb_clearw'; did you mean 'musb_readw'? [-Werror=implicit-function-declaration] 203 | musb->int_rx = musb_clearw(musb->mregs, MUSB_INTRRX); | ^~~~~~~~~~~ | musb_readw drivers/usb/musb/mediatek.c: At top level: >> drivers/usb/musb/mediatek.c:392:3: error: 'const struct musb_platform_ops' has no member named 'get_toggle' 392 | .get_toggle = mtk_musb_get_toggle, | ^~~~~~~~~~ >> drivers/usb/musb/mediatek.c:392:16: error: initialization of 'int (*)(struct musb *)' from incompatible pointer type 'u16 (*)(struct musb_qh *, int)' {aka 'short unsigned int (*)(struct musb_qh *, int)'} [-Werror=incompatible-pointer-types] 392 | .get_toggle = mtk_musb_get_toggle, | ^~~~~~~~~~~~~~~~~~~ drivers/usb/musb/mediatek.c:392:16: note: (near initialization for 'mtk_musb_ops.exit') >> drivers/usb/musb/mediatek.c:393:3: error: 'const struct musb_platform_ops' has no member named 'set_toggle'; did you mean 'set_mode'? 393 | .set_toggle = mtk_musb_set_toggle, | ^~~~~~~~~~ | set_mode >> drivers/usb/musb/mediatek.c:393:16: error: initialization of 'void (*)(struct musb *)' from incompatible pointer type 'u16 (*)(struct musb_qh *, int, struct urb *)' {aka 'short unsigned int (*)(struct musb_qh *, int, struct urb *)'} [-Werror=incompatible-pointer-types] 393 | .set_toggle = mtk_musb_set_toggle, | ^~~~~~~~~~~~~~~~~~~ drivers/usb/musb/mediatek.c:393:16: note: (near initialization for 'mtk_musb_ops.enable') >> drivers/usb/musb/mediatek.c:394:10: warning: initialized field overwritten [-Woverride-init] 394 | .exit = mtk_musb_exit, | ^~~~~~~~~~~~~ drivers/usb/musb/mediatek.c:394:10: note: (near initialization for 'mtk_musb_ops.exit') >> drivers/usb/musb/mediatek.c:399:3: error: 'const struct musb_platform_ops' has no member named 'clearb' 399 | .clearb = mtk_musb_clearb, | ^~~~~~ >> drivers/usb/musb/mediatek.c:399:12: error: initialization of 'void (*)(struct musb *)' from incompatible pointer type 'u8 (*)(void *, unsigned int)' {aka 'unsigned char (*)(void *, unsigned int)'} [-Werror=incompatible-pointer-types] 399 | .clearb = mtk_musb_clearb, | ^~~~~~~~~~~~~~~ drivers/usb/musb/mediatek.c:399:12: note: (near initialization for 'mtk_musb_ops.enable') drivers/usb/musb/mediatek.c:399:12: warning: initialized field overwritten [-Woverride-init] drivers/usb/musb/mediatek.c:399:12: note: (near initialization for 'mtk_musb_ops.enable') >> drivers/usb/musb/mediatek.c:400:3: error: 'const struct musb_platform_ops' has no member named 'clearw' 400 | .clearw = mtk_musb_clearw, | ^~~~~~ >> drivers/usb/musb/mediatek.c:400:12: error: initialization of 'void (*)(struct musb *)' from incompatible pointer type 'u16 (*)(void *, unsigned int)' {aka 'short unsigned int (*)(void *, unsigned int)'} [-Werror=incompatible-pointer-types] 400 | .clearw = mtk_musb_clearw, | ^~~~~~~~~~~~~~~ drivers/usb/musb/mediatek.c:400:12: note: (near initialization for 'mtk_musb_ops.disable') cc1: some warnings being treated as errors vim +202 drivers/usb/musb/mediatek.c 194 195 static irqreturn_t generic_interrupt(int irq, void *__hci) 196 { 197 unsigned long flags; 198 irqreturn_t retval = IRQ_NONE; 199 struct musb *musb = __hci; 200 201 spin_lock_irqsave(&musb->lock, flags); > 202 musb->int_usb = musb_clearb(musb->mregs, MUSB_INTRUSB); > 203 musb->int_rx = musb_clearw(musb->mregs, MUSB_INTRRX); 204 musb->int_tx = musb_clearw(musb->mregs, MUSB_INTRTX); 205 206 if (musb->int_usb || musb->int_tx || musb->int_rx) 207 retval = musb_interrupt(musb); 208 209 spin_unlock_irqrestore(&musb->lock, flags); 210 211 return retval; 212 } 213 214 static irqreturn_t mtk_musb_interrupt(int irq, void *dev_id) 215 { 216 irqreturn_t retval = IRQ_NONE; 217 struct musb *musb = (struct musb *)dev_id; 218 u32 l1_ints; 219 220 l1_ints = musb_readl(musb->mregs, USB_L1INTS) & 221 musb_readl(musb->mregs, USB_L1INTM); 222 223 if (l1_ints & (TX_INT_STATUS | RX_INT_STATUS | USBCOM_INT_STATUS)) 224 retval = generic_interrupt(irq, musb); 225 226 #if defined(CONFIG_USB_INVENTRA_DMA) 227 if (l1_ints & DMA_INT_STATUS) 228 retval = dma_controller_irq(irq, musb->dma_controller); 229 #endif 230 return retval; 231 } 232 233 static u32 mtk_musb_busctl_offset(u8 epnum, u16 offset) 234 { 235 return MTK_MUSB_TXFUNCADDR + offset + 8 * epnum; 236 } 237 238 static u8 mtk_musb_clearb(void __iomem *addr, unsigned int offset) 239 { 240 u8 data; 241 242 /* W1C */ 243 data = musb_readb(addr, offset); 244 musb_writeb(addr, offset, data); 245 return data; 246 } 247 248 static u16 mtk_musb_clearw(void __iomem *addr, unsigned int offset) 249 { 250 u16 data; 251 252 /* W1C */ 253 data = musb_readw(addr, offset); 254 musb_writew(addr, offset, data); 255 return data; 256 } 257 258 static int mtk_musb_set_mode(struct musb *musb, u8 mode) 259 { 260 struct device *dev = musb->controller; 261 struct mtk_glue *glue = dev_get_drvdata(dev->parent); 262 enum phy_mode new_mode; 263 enum usb_role new_role; 264 265 switch (mode) { 266 case MUSB_HOST: 267 new_mode = PHY_MODE_USB_HOST; 268 new_role = USB_ROLE_HOST; 269 break; 270 case MUSB_PERIPHERAL: 271 new_mode = PHY_MODE_USB_DEVICE; 272 new_role = USB_ROLE_DEVICE; 273 break; 274 case MUSB_OTG: 275 new_mode = PHY_MODE_USB_OTG; 276 new_role = USB_ROLE_NONE; 277 break; 278 default: 279 dev_err(glue->dev, "Invalid mode request\n"); 280 return -EINVAL; 281 } 282 283 if (glue->phy_mode == new_mode) 284 return 0; 285 286 if (musb->port_mode != MUSB_OTG) { 287 dev_err(glue->dev, "Does not support changing modes\n"); 288 return -EINVAL; 289 } 290 291 glue->role = new_role; 292 musb_usb_role_sx_set(dev, glue->role); 293 return 0; 294 } 295 296 static int mtk_musb_init(struct musb *musb) 297 { 298 struct device *dev = musb->controller; 299 struct mtk_glue *glue = dev_get_drvdata(dev->parent); 300 int ret; 301 302 glue->musb = musb; 303 musb->phy = glue->phy; 304 musb->xceiv = glue->xceiv; 305 musb->is_host = false; 306 musb->isr = mtk_musb_interrupt; 307 308 /* Set TX/RX toggle enable */ 309 musb_writew(musb->mregs, MUSB_TXTOGEN, MTK_TOGGLE_EN); 310 musb_writew(musb->mregs, MUSB_RXTOGEN, MTK_TOGGLE_EN); 311 312 if (musb->port_mode == MUSB_OTG) { 313 ret = mtk_otg_switch_init(glue); 314 if (ret) 315 return ret; 316 } 317 318 ret = phy_init(glue->phy); 319 if (ret) 320 goto err_phy_init; 321 322 ret = phy_power_on(glue->phy); 323 if (ret) 324 goto err_phy_power_on; 325 326 phy_set_mode(glue->phy, glue->phy_mode); 327 328 #if defined(CONFIG_USB_INVENTRA_DMA) 329 musb_writel(musb->mregs, MUSB_HSDMA_INTR, 330 DMA_INTR_STATUS_MSK | DMA_INTR_UNMASK_SET_MSK); 331 #endif 332 musb_writel(musb->mregs, USB_L1INTM, TX_INT_STATUS | RX_INT_STATUS | 333 USBCOM_INT_STATUS | DMA_INT_STATUS); 334 return 0; 335 336 err_phy_power_on: 337 phy_exit(glue->phy); 338 err_phy_init: 339 mtk_otg_switch_exit(glue); 340 return ret; 341 } 342 343 static u16 mtk_musb_get_toggle(struct musb_qh *qh, int is_out) 344 { 345 struct musb *musb = qh->hw_ep->musb; 346 u8 epnum = qh->hw_ep->epnum; 347 u16 toggle; 348 349 toggle = musb_readw(musb->mregs, is_out ? MUSB_TXTOG : MUSB_RXTOG); 350 return toggle & (1 << epnum); 351 } 352 353 static u16 mtk_musb_set_toggle(struct musb_qh *qh, int is_out, struct urb *urb) 354 { 355 struct musb *musb = qh->hw_ep->musb; 356 u8 epnum = qh->hw_ep->epnum; 357 u16 value, toggle; 358 359 toggle = usb_gettoggle(urb->dev, qh->epnum, is_out); 360 361 if (is_out) { 362 value = musb_readw(musb->mregs, MUSB_TXTOG); 363 value |= toggle << epnum; 364 musb_writew(musb->mregs, MUSB_TXTOG, value); 365 } else { 366 value = musb_readw(musb->mregs, MUSB_RXTOG); 367 value |= toggle << epnum; 368 musb_writew(musb->mregs, MUSB_RXTOG, value); 369 } 370 371 return 0; 372 } 373 374 static int mtk_musb_exit(struct musb *musb) 375 { 376 struct device *dev = musb->controller; 377 struct mtk_glue *glue = dev_get_drvdata(dev->parent); 378 379 mtk_otg_switch_exit(glue); 380 phy_power_off(glue->phy); 381 phy_exit(glue->phy); 382 mtk_musb_clks_disable(glue); 383 384 pm_runtime_put_sync(dev); 385 pm_runtime_disable(dev); 386 return 0; 387 } 388 389 static const struct musb_platform_ops mtk_musb_ops = { 390 .quirks = MUSB_DMA_INVENTRA, 391 .init = mtk_musb_init, > 392 .get_toggle = mtk_musb_get_toggle, > 393 .set_toggle = mtk_musb_set_toggle, > 394 .exit = mtk_musb_exit, 395 #ifdef CONFIG_USB_INVENTRA_DMA 396 .dma_init = musbhs_dma_controller_create_noirq, 397 .dma_exit = musbhs_dma_controller_destroy, 398 #endif > 399 .clearb = mtk_musb_clearb, > 400 .clearw = mtk_musb_clearw, 401 .busctl_offset = mtk_musb_busctl_offset, 402 .set_mode = mtk_musb_set_mode, 403 }; 404 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org