Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp1050930pxx; Tue, 27 Oct 2020 07:11:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzI7WY2f/ACEVvdyJ3a9c+rWNpKCP0ncKmZyU+1z1Fe3dWooAZ/DiF3jQhDUYzPoW2kiPJC X-Received: by 2002:a17:906:c08f:: with SMTP id f15mr2478623ejz.97.1603807891921; Tue, 27 Oct 2020 07:11:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603807891; cv=none; d=google.com; s=arc-20160816; b=SkOXUlc3RDCBqXvjm176qMBpKT3kA6H8bwXLyr7pgCX6zBnzlnuKaFVIN8c+1PELKw Kw+PuyTVz3fCx1QHE+s/wkJptAXYA70Su/y+fXd7QKvk8E8YyJ1T+JhaBYvSIbDjrmLg 7yRKxAxgv0JwlyKrdxXLI7L9o8ncy3ScoyJRng1rsYuT1Z4nvGaviai69IC9DaPvR1HW DUKkCCCNxDIbQdB2UgCR0tOOq6+Mq7lH4E2M4GJsdZTy4va+0xcrX8iw9gmOPekRQ1ZJ 0A4TedKG84ACmJxPotXkOi7WpIRZFwF0n09Mc0mFH0nbVe9gy/5lYsMO6j1GGGyeAQ7y YSSg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:ironport-sdr:ironport-sdr; bh=J1dvQ5v3i3MtHuSw5KVdtBqGSWGz0ODdD3YI59L6fYs=; b=AzIDN714X5fg2qNca4aYnGPkyPwUC86sY6FFfc3L0F/aHgaoRfMXnUaANHBbEDJDZr 8zjorZghwJ4UWys4632emcsHJXhu3qxNF8/IrskpJoFF28AU/Leq26X+NwPWIhPTAyRH ZZCS66j8qHwxYbPCO2ix+q7ZOut2yOYNGiJazW6JbV4gZz+MiZMBUvPNvXPJBKDViWiu eEluXOiBbZ8URSnUyWkg/O1kCPvsw++eeVkM9kkQ92ML8Hfp7937Ji8H1stv0kgw+4k9 P3tVOqgQTQQWMr+Pm9dobeycfg5yNLnYeuDr2d1RJ7Y1TT7YjKMissI5qNaWcdO3j4ig Fzvg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g19si1060534ejd.105.2020.10.27.07.11.04; Tue, 27 Oct 2020 07:11:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2507038AbgJ0G4V (ORCPT + 99 others); Tue, 27 Oct 2020 02:56:21 -0400 Received: from mga17.intel.com ([192.55.52.151]:5231 "EHLO mga17.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2507033AbgJ0G4T (ORCPT ); Tue, 27 Oct 2020 02:56:19 -0400 IronPort-SDR: 7LZ9MjZwA33ZFPjonbJb6nAtXGpqYK0LF28Ogl4J/UQIRqPriUJVpVXhqDLGOZ54JACBy2llaE cuiZO+WNHADQ== X-IronPort-AV: E=McAfee;i="6000,8403,9786"; a="147890919" X-IronPort-AV: E=Sophos;i="5.77,422,1596524400"; d="scan'208";a="147890919" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Oct 2020 23:56:18 -0700 IronPort-SDR: pqcLVhhRvOmag2o9wYEu5dqAsWI3mkY//1XBl95cH2opG/I4LK9msctMBe169xKDOo509Mw7IV csLUAIY6hTTg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.77,422,1596524400"; d="scan'208";a="350175997" Received: from jsia-hp-z620-workstation.png.intel.com ([10.221.118.135]) by orsmga008.jf.intel.com with ESMTP; 26 Oct 2020 23:56:17 -0700 From: Sia Jee Heng To: vkoul@kernel.org, Eugeniy.Paltsev@synopsys.com Cc: andriy.shevchenko@linux.intel.com, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 14/15] dmaengine: dw-axi-dmac: Add Intel KeemBay AxiDMA BYTE and HALFWORD registers Date: Tue, 27 Oct 2020 14:38:57 +0800 Message-Id: <20201027063858.4877-15-jee.heng.sia@intel.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20201027063858.4877-1-jee.heng.sia@intel.com> References: <20201027063858.4877-1-jee.heng.sia@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support for Intel KeemBay AxiDMA BYTE and HALFWORD registers programming. Intel KeemBay AxiDMA supports data transfer between device to memory and memory to device operations. This code is needed by I2C, I3C, I2S, SPI and UART which uses FIFO size of 8bits and 16bits to perform memory to device data transfer operation. 0-padding functionality is provided to avoid pre-processing of data on CPU. Reviewed-by: Andy Shevchenko Signed-off-by: Sia Jee Heng --- .../dma/dw-axi-dmac/dw-axi-dmac-platform.c | 44 ++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c b/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c index 0f40b41fd5c0..d4fca3ffe67f 100644 --- a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c +++ b/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c @@ -312,7 +312,7 @@ static void axi_chan_block_xfer_start(struct axi_dma_chan *chan, struct axi_dma_desc *first) { u32 priority = chan->chip->dw->hdata->priority[chan->id]; - u32 reg, irq_mask; + u32 reg, irq_mask, reg_width, offset, val; u8 lms = 0; /* Select AXI0 master for LLI fetching */ if (unlikely(axi_chan_is_hw_enable(chan))) { @@ -334,6 +334,25 @@ static void axi_chan_block_xfer_start(struct axi_dma_chan *chan, DWAXIDMAC_HS_SEL_HW << CH_CFG_H_HS_SEL_SRC_POS); switch (chan->direction) { case DMA_MEM_TO_DEV: + if (chan->chip->apb_regs) { + reg_width = __ffs(chan->config.dst_addr_width); + /* + * Configure Byte and Halfword register + * for MEM_TO_DEV only. + */ + if (reg_width == DWAXIDMAC_TRANS_WIDTH_16) { + offset = DMAC_APB_HALFWORD_WR_CH_EN; + val = ioread32(chan->chip->apb_regs + offset); + val |= BIT(chan->id); + iowrite32(val, chan->chip->apb_regs + offset); + } else if (reg_width == DWAXIDMAC_TRANS_WIDTH_8) { + offset = DMAC_APB_BYTE_WR_CH_EN; + val = ioread32(chan->chip->apb_regs + offset); + val |= BIT(chan->id); + iowrite32(val, chan->chip->apb_regs + offset); + } + } + reg |= (chan->config.device_fc ? DWAXIDMAC_TT_FC_MEM_TO_PER_DST : DWAXIDMAC_TT_FC_MEM_TO_PER_DMAC) @@ -1054,8 +1073,9 @@ static int dma_chan_terminate_all(struct dma_chan *dchan) { struct axi_dma_chan *chan = dchan_to_axi_dma_chan(dchan); u32 chan_active = BIT(chan->id) << DMAC_CHAN_EN_SHIFT; + u32 reg_width = __ffs(chan->config.dst_addr_width); unsigned long flags; - u32 val; + u32 offset, val; int ret; LIST_HEAD(head); @@ -1067,9 +1087,23 @@ static int dma_chan_terminate_all(struct dma_chan *dchan) dev_warn(dchan2dev(dchan), "%s failed to stop\n", axi_chan_name(chan)); - if (chan->direction != DMA_MEM_TO_MEM) - dw_axi_dma_set_hw_channel(chan->chip, - chan->hw_hs_num, false); + if (chan->direction != DMA_MEM_TO_MEM) { + ret = dw_axi_dma_set_hw_channel(chan->chip, + chan->hw_hs_num, false); + if (ret == 0 && chan->direction == DMA_MEM_TO_DEV) { + if (reg_width == DWAXIDMAC_TRANS_WIDTH_8) { + offset = DMAC_APB_BYTE_WR_CH_EN; + val = ioread32(chan->chip->apb_regs + offset); + val &= ~BIT(chan->id); + iowrite32(val, chan->chip->apb_regs + offset); + } else if (reg_width == DWAXIDMAC_TRANS_WIDTH_16) { + offset = DMAC_APB_HALFWORD_WR_CH_EN; + val = ioread32(chan->chip->apb_regs + offset); + val &= ~BIT(chan->id); + iowrite32(val, chan->chip->apb_regs + offset); + } + } + } spin_lock_irqsave(&chan->vc.lock, flags); -- 2.18.0