0400-dmaengine-bcm2835-Load-driver-early-and-support-lega.patch 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. From 8b8b59db27e6e1597737fbd1fd7a17216540bc38 Mon Sep 17 00:00:00 2001
  2. From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
  3. Date: Sat, 3 Oct 2015 22:22:55 +0200
  4. Subject: [PATCH] dmaengine: bcm2835: Load driver early and support legacy API
  5. MIME-Version: 1.0
  6. Content-Type: text/plain; charset=UTF-8
  7. Content-Transfer-Encoding: 8bit
  8. Load driver early since at least bcm2708_fb doesn't support deferred
  9. probing and even if it did, we don't want the video driver deferred.
  10. Support the legacy DMA API which is needed by bcm2708_fb
  11. (but only using the dedicated dma channel 0).
  12. Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
  13. Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
  14. ---
  15. drivers/dma/Kconfig | 2 +-
  16. drivers/dma/bcm2835-dma.c | 27 ++++++++++++++++++++++++++-
  17. 2 files changed, 27 insertions(+), 2 deletions(-)
  18. --- a/drivers/dma/Kconfig
  19. +++ b/drivers/dma/Kconfig
  20. @@ -108,7 +108,7 @@ config COH901318
  21. config DMA_BCM2835
  22. tristate "BCM2835 DMA engine support"
  23. - depends on ARCH_BCM2835
  24. + depends on ARCH_BCM2835 || ARCH_BCM2708 || ARCH_BCM2709
  25. select DMA_ENGINE
  26. select DMA_VIRTUAL_CHANNELS
  27. --- a/drivers/dma/bcm2835-dma.c
  28. +++ b/drivers/dma/bcm2835-dma.c
  29. @@ -37,6 +37,7 @@
  30. #include <linux/interrupt.h>
  31. #include <linux/list.h>
  32. #include <linux/module.h>
  33. +#include <linux/platform_data/dma-bcm2708.h>
  34. #include <linux/platform_device.h>
  35. #include <linux/slab.h>
  36. #include <linux/io.h>
  37. @@ -1021,6 +1022,14 @@ static int bcm2835_dma_probe(struct plat
  38. dev_dbg(&pdev->dev, "Load BCM2835 DMA engine driver\n");
  39. + /* load the legacy api if bit 0 in the mask is cleared */
  40. + if ((chans_available & BIT(0)) == 0) {
  41. + rc = bcm_dmaman_probe(pdev, base, BIT(0));
  42. + if (rc)
  43. + dev_err(&pdev->dev,
  44. + "Failed to initialize the legacy API\n");
  45. + }
  46. +
  47. return 0;
  48. err_no_dma:
  49. @@ -1032,6 +1041,7 @@ static int bcm2835_dma_remove(struct pla
  50. {
  51. struct bcm2835_dmadev *od = platform_get_drvdata(pdev);
  52. + bcm_dmaman_remove(pdev);
  53. dma_async_device_unregister(&od->ddev);
  54. bcm2835_dma_free(od);
  55. @@ -1047,7 +1057,22 @@ static struct platform_driver bcm2835_dm
  56. },
  57. };
  58. -module_platform_driver(bcm2835_dma_driver);
  59. +static int bcm2835_dma_init(void)
  60. +{
  61. + return platform_driver_register(&bcm2835_dma_driver);
  62. +}
  63. +
  64. +static void bcm2835_dma_exit(void)
  65. +{
  66. + platform_driver_unregister(&bcm2835_dma_driver);
  67. +}
  68. +
  69. +/*
  70. + * Load after serial driver (arch_initcall) so we see the messages if it fails,
  71. + * but before drivers (module_init) that need a DMA channel.
  72. + */
  73. +subsys_initcall(bcm2835_dma_init);
  74. +module_exit(bcm2835_dma_exit);
  75. MODULE_ALIAS("platform:bcm2835-dma");
  76. MODULE_DESCRIPTION("BCM2835 DMA engine driver");