Message ID | 1424946394-6784-1-git-send-email-geert+renesas@glider.be (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Geert Uytterhoeven |
Headers | show |
Hello. On 02/26/2015 01:26 PM, Geert Uytterhoeven wrote: > During system reboot, the sh-dma-engine device may be runtime-suspended, > causing a crash: > Unhandled fault: imprecise external abort (0x1406) at 0x0002c02c > Internal error: : 1406 [#1] SMP ARM > ... > PC is at sh_dmae_ctl_stop+0x28/0x64 > LR is at sh_dmae_ctl_stop+0x24/0x64 > If the sh-dma-engine is runtime-suspended, its module clock is turned > off, and its registers cannot be accessed. > To fix this, move the call to sh_dmae_ctl_stop(), which touches the > DMAOR register, to the sh_dmae_suspend() and sh_dmae_runtime_suspend() > callbacks. This makes PM operations more symmetric, as both > sh_dmae_resume() and sh_dmae_runtime_resume() already call sh_dmae_rst() > to re-initialize the DMAOR register. > Remove sh_dmae_shutdown(), as it became empty. > Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> > --- > This is v3 of "dmaengine: shdma: Runtime-resume device in .shutdown()" > v3: > - Move the call to sh_dmae_ctl_stop() to sh_dmae_suspend() and > sh_dmae_runtime_suspend() instead of runtime-resuming the device in > .shutdown(), > v2: > - Do nothing if we're runtime suspended. > --- > drivers/dma/sh/shdmac.c | 15 +++++++-------- > 1 file changed, 7 insertions(+), 8 deletions(-) > > diff --git a/drivers/dma/sh/shdmac.c b/drivers/dma/sh/shdmac.c > index b2431aa300331270..9f1d4c7dbab83890 100644 > --- a/drivers/dma/sh/shdmac.c > +++ b/drivers/dma/sh/shdmac.c [...] > @@ -929,13 +929,12 @@ static int sh_dmae_remove(struct platform_device *pdev) > } > > static struct platform_driver sh_dmae_driver = { > - .driver = { > + .driver = { Hm, don't understand what was changed on this line... WBR, Sergei -- To unsubscribe from this list: send the line "unsubscribe linux-sh" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Feb 26, 2015 at 2:21 PM, Sergei Shtylyov <sergei.shtylyov@cogentembedded.com> wrote: >> static struct platform_driver sh_dmae_driver = { >> - .driver = { >> + .driver = { > > > Hm, don't understand what was changed on this line... One silly space that should have been a TAB. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds -- To unsubscribe from this list: send the line "unsubscribe linux-sh" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 26 February 2015 at 11:26, Geert Uytterhoeven <geert+renesas@glider.be> wrote: > During system reboot, the sh-dma-engine device may be runtime-suspended, > causing a crash: > > Unhandled fault: imprecise external abort (0x1406) at 0x0002c02c > Internal error: : 1406 [#1] SMP ARM > ... > PC is at sh_dmae_ctl_stop+0x28/0x64 > LR is at sh_dmae_ctl_stop+0x24/0x64 > > If the sh-dma-engine is runtime-suspended, its module clock is turned > off, and its registers cannot be accessed. > > To fix this, move the call to sh_dmae_ctl_stop(), which touches the > DMAOR register, to the sh_dmae_suspend() and sh_dmae_runtime_suspend() > callbacks. This makes PM operations more symmetric, as both > sh_dmae_resume() and sh_dmae_runtime_resume() already call sh_dmae_rst() > to re-initialize the DMAOR register. > > Remove sh_dmae_shutdown(), as it became empty. > > Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org> Kind regards Uffe > --- > This is v3 of "dmaengine: shdma: Runtime-resume device in .shutdown()" > > v3: > - Move the call to sh_dmae_ctl_stop() to sh_dmae_suspend() and > sh_dmae_runtime_suspend() instead of runtime-resuming the device in > .shutdown(), > > v2: > - Do nothing if we're runtime suspended. > --- > drivers/dma/sh/shdmac.c | 15 +++++++-------- > 1 file changed, 7 insertions(+), 8 deletions(-) > > diff --git a/drivers/dma/sh/shdmac.c b/drivers/dma/sh/shdmac.c > index b2431aa300331270..9f1d4c7dbab83890 100644 > --- a/drivers/dma/sh/shdmac.c > +++ b/drivers/dma/sh/shdmac.c > @@ -582,15 +582,12 @@ static void sh_dmae_chan_remove(struct sh_dmae_device *shdev) > } > } > > -static void sh_dmae_shutdown(struct platform_device *pdev) > -{ > - struct sh_dmae_device *shdev = platform_get_drvdata(pdev); > - sh_dmae_ctl_stop(shdev); > -} > - > #ifdef CONFIG_PM > static int sh_dmae_runtime_suspend(struct device *dev) > { > + struct sh_dmae_device *shdev = dev_get_drvdata(dev); > + > + sh_dmae_ctl_stop(shdev); > return 0; > } > > @@ -605,6 +602,9 @@ static int sh_dmae_runtime_resume(struct device *dev) > #ifdef CONFIG_PM_SLEEP > static int sh_dmae_suspend(struct device *dev) > { > + struct sh_dmae_device *shdev = dev_get_drvdata(dev); > + > + sh_dmae_ctl_stop(shdev); > return 0; > } > > @@ -929,13 +929,12 @@ static int sh_dmae_remove(struct platform_device *pdev) > } > > static struct platform_driver sh_dmae_driver = { > - .driver = { > + .driver = { > .pm = &sh_dmae_pm, > .name = SH_DMAE_DRV_NAME, > .of_match_table = sh_dmae_of_match, > }, > .remove = sh_dmae_remove, > - .shutdown = sh_dmae_shutdown, > }; > > static int __init sh_dmae_init(void) > -- > 1.9.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-sh" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Feb 26, 2015 at 11:26:34AM +0100, Geert Uytterhoeven wrote: > During system reboot, the sh-dma-engine device may be runtime-suspended, > causing a crash: > > Unhandled fault: imprecise external abort (0x1406) at 0x0002c02c > Internal error: : 1406 [#1] SMP ARM > ... > PC is at sh_dmae_ctl_stop+0x28/0x64 > LR is at sh_dmae_ctl_stop+0x24/0x64 > > If the sh-dma-engine is runtime-suspended, its module clock is turned > off, and its registers cannot be accessed. > > To fix this, move the call to sh_dmae_ctl_stop(), which touches the > DMAOR register, to the sh_dmae_suspend() and sh_dmae_runtime_suspend() > callbacks. This makes PM operations more symmetric, as both > sh_dmae_resume() and sh_dmae_runtime_resume() already call sh_dmae_rst() > to re-initialize the DMAOR register. > > Remove sh_dmae_shutdown(), as it became empty. > > Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Applied, thanks
diff --git a/drivers/dma/sh/shdmac.c b/drivers/dma/sh/shdmac.c index b2431aa300331270..9f1d4c7dbab83890 100644 --- a/drivers/dma/sh/shdmac.c +++ b/drivers/dma/sh/shdmac.c @@ -582,15 +582,12 @@ static void sh_dmae_chan_remove(struct sh_dmae_device *shdev) } } -static void sh_dmae_shutdown(struct platform_device *pdev) -{ - struct sh_dmae_device *shdev = platform_get_drvdata(pdev); - sh_dmae_ctl_stop(shdev); -} - #ifdef CONFIG_PM static int sh_dmae_runtime_suspend(struct device *dev) { + struct sh_dmae_device *shdev = dev_get_drvdata(dev); + + sh_dmae_ctl_stop(shdev); return 0; } @@ -605,6 +602,9 @@ static int sh_dmae_runtime_resume(struct device *dev) #ifdef CONFIG_PM_SLEEP static int sh_dmae_suspend(struct device *dev) { + struct sh_dmae_device *shdev = dev_get_drvdata(dev); + + sh_dmae_ctl_stop(shdev); return 0; } @@ -929,13 +929,12 @@ static int sh_dmae_remove(struct platform_device *pdev) } static struct platform_driver sh_dmae_driver = { - .driver = { + .driver = { .pm = &sh_dmae_pm, .name = SH_DMAE_DRV_NAME, .of_match_table = sh_dmae_of_match, }, .remove = sh_dmae_remove, - .shutdown = sh_dmae_shutdown, }; static int __init sh_dmae_init(void)
During system reboot, the sh-dma-engine device may be runtime-suspended, causing a crash: Unhandled fault: imprecise external abort (0x1406) at 0x0002c02c Internal error: : 1406 [#1] SMP ARM ... PC is at sh_dmae_ctl_stop+0x28/0x64 LR is at sh_dmae_ctl_stop+0x24/0x64 If the sh-dma-engine is runtime-suspended, its module clock is turned off, and its registers cannot be accessed. To fix this, move the call to sh_dmae_ctl_stop(), which touches the DMAOR register, to the sh_dmae_suspend() and sh_dmae_runtime_suspend() callbacks. This makes PM operations more symmetric, as both sh_dmae_resume() and sh_dmae_runtime_resume() already call sh_dmae_rst() to re-initialize the DMAOR register. Remove sh_dmae_shutdown(), as it became empty. Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> --- This is v3 of "dmaengine: shdma: Runtime-resume device in .shutdown()" v3: - Move the call to sh_dmae_ctl_stop() to sh_dmae_suspend() and sh_dmae_runtime_suspend() instead of runtime-resuming the device in .shutdown(), v2: - Do nothing if we're runtime suspended. --- drivers/dma/sh/shdmac.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)