037-m5445x_edma_callback.patch 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. From acd937ac924aefd22ea9a66ea621ab80a4f9b594 Mon Sep 17 00:00:00 2001
  2. From: Kurt Mahan <[email protected]>
  3. Date: Mon, 10 Dec 2007 03:37:19 -0700
  4. Subject: [PATCH] Update EDMA driver to allow callback/arg changes.
  5. LTIBName: m5445x-edma-callback
  6. Signed-off-by: Kurt Mahan <[email protected]>
  7. ---
  8. drivers/spi/coldfire_edma.c | 27 +++++++++++++++++++++++++++
  9. include/asm-m68k/coldfire_edma.h | 20 ++++++++++++++++++++
  10. 2 files changed, 47 insertions(+), 0 deletions(-)
  11. --- a/drivers/spi/coldfire_edma.c
  12. +++ b/drivers/spi/coldfire_edma.c
  13. @@ -206,6 +206,31 @@ int request_edma_channel(int channel,
  14. EXPORT_SYMBOL(request_edma_channel);
  15. /**
  16. + * set_edma_callback - Update the channel callback/arg
  17. + * @channel: channel number
  18. + * @handler: dma handler
  19. + * @error_handler: dma error handler
  20. + * @arg: argument to pass back
  21. + *
  22. + * Returns 0 if success or a negative value if failure
  23. + */
  24. +int set_edma_callback(int channel,
  25. + edma_irq_handler handler,
  26. + edma_error_handler error_handler,
  27. + void *arg )
  28. +{
  29. + if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS &&
  30. + devp->dma_interrupt_handlers[channel].allocated) {
  31. + devp->dma_interrupt_handlers[channel].irq_handler = handler;
  32. + devp->dma_interrupt_handlers[channel].error_handler = error_handler;
  33. + devp->dma_interrupt_handlers[channel].arg = arg;
  34. + return 0;
  35. + }
  36. + return -EINVAL;
  37. +}
  38. +EXPORT_SYMBOL(set_edma_callback);
  39. +
  40. +/**
  41. * free_edma_channel - Free the edma channel
  42. * @channel: channel number
  43. * @arg: argument created with
  44. @@ -216,8 +241,10 @@ int free_edma_channel(int channel, void
  45. {
  46. if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) {
  47. if (devp->dma_interrupt_handlers[channel].allocated) {
  48. +#if 0
  49. if (devp->dma_interrupt_handlers[channel].arg != arg)
  50. return -EBUSY;
  51. +#endif
  52. devp->dma_interrupt_handlers[channel].allocated = 0;
  53. devp->dma_interrupt_handlers[channel].arg = NULL;
  54. --- a/include/asm-m68k/coldfire_edma.h
  55. +++ b/include/asm-m68k/coldfire_edma.h
  56. @@ -96,10 +96,30 @@ int request_edma_channel(int channel,
  57. void *dev,
  58. spinlock_t *lock,
  59. const char *device_id);
  60. +
  61. +/**
  62. + * set_edma_callback - Update the channel callback/arg
  63. + * @channel: channel number
  64. + * @handler: dma handler
  65. + * @error_handler: dma error handler
  66. + * @arg: argument to pass back
  67. + *
  68. + * Returns 0 if success or a negative value if failure
  69. + */
  70. +int set_edma_callback(int channel,
  71. + edma_irq_handler handler,
  72. + edma_error_handler error_handler,
  73. + void *arg);
  74. /* Free eDMA channel
  75. * channel - eDMA TCD number
  76. * dev - device
  77. */
  78. int free_edma_channel(int channel, void *dev);
  79. +
  80. +/*
  81. + * DMA Modes
  82. + */
  83. +#define DMA_MODE_READ 0
  84. +#define DMA_MODE_WRITE 1
  85. #endif