mirror of https://gitee.com/openkylin/linux.git
usb: musb: core: add pm_runtime_irq_safe()
We need a pm_runtime_get_sync() call from within musb_gadget_pullup() to make sure registers are accessible at that time. The problem is that musb_gadget_pullup() is called with IRQs disabled and, because of that, we need to tell pm_runtime that this pm_runtime_get_sync() is IRQ safe. We can simply add pm_runtime_irq_safe(), however, because we need to make our read/write accessor function pointers have been initialized before trying to use them. This means that all pm_runtime initialization for musb_core needs to be moved down so that when we call pm_runtime_irq_safe(), the pm_runtime_get_sync() that it calls on the parent, won't cause a crash due to NULL musb_read/write accessors. Reported-by: Pali Rohár <pali.rohar@gmail.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
9ec36f7fe2
commit
3e43a07256
|
@ -1969,10 +1969,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
|
|||
goto fail0;
|
||||
}
|
||||
|
||||
pm_runtime_use_autosuspend(musb->controller);
|
||||
pm_runtime_set_autosuspend_delay(musb->controller, 200);
|
||||
pm_runtime_enable(musb->controller);
|
||||
|
||||
spin_lock_init(&musb->lock);
|
||||
musb->board_set_power = plat->set_power;
|
||||
musb->min_power = plat->min_power;
|
||||
|
@ -1991,6 +1987,12 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
|
|||
musb_readl = musb_default_readl;
|
||||
musb_writel = musb_default_writel;
|
||||
|
||||
/* We need musb_read/write functions initialized for PM */
|
||||
pm_runtime_use_autosuspend(musb->controller);
|
||||
pm_runtime_set_autosuspend_delay(musb->controller, 200);
|
||||
pm_runtime_irq_safe(musb->controller);
|
||||
pm_runtime_enable(musb->controller);
|
||||
|
||||
/* The musb_platform_init() call:
|
||||
* - adjusts musb->mregs
|
||||
* - sets the musb->isr
|
||||
|
|
Loading…
Reference in New Issue