[email protected] writes:

> From: Sandeep Paulraj <[email protected]>
>
> The reserve_contiguous_params function is used to reserve
> a set of contiguous PARAMs. If we do not find a complete
> set of contiguous PARAMs, the functions still has to free
> every PARAM that it found to be free in the process of finding a
> complete set and thus marked as "in use".
> This patch mainly deals with correctly handling the
> freeing of PARAMs.
>
> Signed-off-by: Sandeep Paulraj <[email protected]>

Applied to davinci git.

Kevin

> ---
>  arch/arm/mach-davinci/dma.c |   32 ++++++++++++++++++++++++--------
>  1 files changed, 24 insertions(+), 8 deletions(-)
>
> diff --git a/arch/arm/mach-davinci/dma.c b/arch/arm/mach-davinci/dma.c
> index 8eda4c3..b097592 100644
> --- a/arch/arm/mach-davinci/dma.c
> +++ b/arch/arm/mach-davinci/dma.c
> @@ -515,17 +515,30 @@ static int reserve_contiguous_params(int ctlr, unsigned 
> int id,
>  {
>       int i, j;
>       unsigned int count = num_params;
> +     int stop_param = start_param;
> +     DECLARE_BITMAP(tmp_inuse, EDMA_MAX_PARAMENTRY);
>  
>       for (i = start_param; i < edma_info[ctlr]->num_slots; ++i) {
>               j = EDMA_CHAN_SLOT(i);
> -             if (!test_and_set_bit(j, edma_info[ctlr]->edma_inuse))
> +             if (!test_and_set_bit(j, edma_info[ctlr]->edma_inuse)) {
> +                     /* Record our current beginning slot */
> +                     if (count == num_params)
> +                             stop_param = i;
> +
>                       count--;
> +                     set_bit(j, tmp_inuse);
> +
>                       if (count == 0)
>                               break;
> -             else if (id == EDMA_CONT_PARAMS_FIXED_EXACT)
> -                     break;
> -             else
> -                     count = num_params;
> +             } else {
> +                     clear_bit(j, tmp_inuse);
> +
> +                     if (id == EDMA_CONT_PARAMS_FIXED_EXACT) {
> +                             stop_param = i;
> +                             break;
> +                     } else
> +                             count = num_params;
> +             }
>       }
>  
>       /*
> @@ -534,12 +547,15 @@ static int reserve_contiguous_params(int ctlr, unsigned 
> int id,
>        * of contiguous parameter RAMs but do not find the exact number
>        * requested as we may reach the total number of parameter RAMs
>        */
> -     if (count) {
> -             for (j = i - num_params + count + 1; j <= i ; ++j)
> +     if (i == edma_info[ctlr]->num_slots)
> +             stop_param = i;
> +
> +     for (j = start_param; j < stop_param; j++)
> +             if (test_bit(j, tmp_inuse))
>                       clear_bit(j, edma_info[ctlr]->edma_inuse);
>  
> +     if (count)
>               return -EBUSY;
> -     }
>  
>       for (j = i - num_params + 1; j <= i; ++j)
>               memcpy_toio(edmacc_regs_base[ctlr] + PARM_OFFSET(j),
> -- 
> 1.6.0.4
>
> _______________________________________________
> Davinci-linux-open-source mailing list
> [email protected]
> http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to