lkml.org 
[lkml]   [2016]   [May]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.5 028/200] dmaengine: hsu: correct use of channel status register
    Date
    4.5-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

    commit 4f4bc0abff79dc9d7ccbd3143adbf8ad1f4fe6ab upstream.

    There is a typo in documentation regarding to descriptor empty bit (DESCE)
    which is set to 1 when descriptor is empty. Thus, status register at the end of
    a transfer usually returns all DESCE bits set and thus it will never be zero.

    Moreover, there are 2 bits (CDESC) that encode current descriptor, on which
    interrupt has been asserted. In case when we have few descriptors programmed we
    might have non-zero value.

    Remove DESCE and CDESC bits from DMA channel status register (HSU_CH_SR) when
    reading it.

    Fixes: 2b49e0c56741 ("dmaengine: append hsu DMA driver")
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Vinod Koul <vinod.koul@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/dma/hsu/hsu.c | 2 +-
    drivers/dma/hsu/hsu.h | 3 +++
    2 files changed, 4 insertions(+), 1 deletion(-)

    --- a/drivers/dma/hsu/hsu.c
    +++ b/drivers/dma/hsu/hsu.c
    @@ -135,7 +135,7 @@ static u32 hsu_dma_chan_get_sr(struct hs
    sr = hsu_chan_readl(hsuc, HSU_CH_SR);
    spin_unlock_irqrestore(&hsuc->vchan.lock, flags);

    - return sr;
    + return sr & ~(HSU_CH_SR_DESCE_ANY | HSU_CH_SR_CDESC_ANY);
    }

    irqreturn_t hsu_dma_irq(struct hsu_dma_chip *chip, unsigned short nr)
    --- a/drivers/dma/hsu/hsu.h
    +++ b/drivers/dma/hsu/hsu.h
    @@ -41,6 +41,9 @@
    #define HSU_CH_SR_DESCTO(x) BIT(8 + (x))
    #define HSU_CH_SR_DESCTO_ANY (BIT(11) | BIT(10) | BIT(9) | BIT(8))
    #define HSU_CH_SR_CHE BIT(15)
    +#define HSU_CH_SR_DESCE(x) BIT(16 + (x))
    +#define HSU_CH_SR_DESCE_ANY (BIT(19) | BIT(18) | BIT(17) | BIT(16))
    +#define HSU_CH_SR_CDESC_ANY (BIT(31) | BIT(30))

    /* Bits in HSU_CH_CR */
    #define HSU_CH_CR_CHA BIT(0)

    \
     
     \ /
      Last update: 2016-05-03 03:41    [W:4.304 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site