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 <lkp(a)intel.com>
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@lists.01.org