Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp200008pxb; Thu, 12 Nov 2020 01:10:22 -0800 (PST) X-Google-Smtp-Source: ABdhPJx8ru129nu88R9CeYAc69biHPjcbqhArPnqwXB7sX3JMlSKtlGlp31nGFKaGFr1AbTpuZnN X-Received: by 2002:a17:906:86cf:: with SMTP id j15mr28953655ejy.260.1605172222192; Thu, 12 Nov 2020 01:10:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1605172222; cv=none; d=google.com; s=arc-20160816; b=FurM/4OAFUc6vLBzfpPVr9KpXS1OE2ayo160MAhKC1mGtGSz/MEudrfM4MtCWK4ktK knHbDf6Sa2iq4ucEjiKE/xHJz8cWmQiqaAgyvUTOVcjTv8cfy3xdt4SiVXPmSxPVBFF/ sBrSAD/tuAi+zBBSX2hX1Ae0eqEkx5XTmINUftyHoZVUd9CZCC7dIjbpzFnoyySgkAo8 lwwzXRpx9P2gFZ4DKNVSRyFk1/hmLmf8hMqaOxUgotJksMit0UK4eMlVyAChyr4sLHod lzwsY4LMw1BW5S3h3WYXgBoJucTYO9MP2PNTLQBB26bGjzdC1JVsrzx0hHNWEJGOvfOy EAQQ== 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=hrAyWyjs3e3BwTyPRu6EcND0NHXEuo5pMWzWH9+4wFU=; b=O9xFDa0+b66y/BD4b8fyHzSjodM8uo/pmelGeEDJiA3VUz7Jg1olNcPCgP2UzVGdnv 7NSHEl4SBTf1WRgnn0vouCl9DvBd4NozIpbltdcn5NZkEiHybptjyd3TmTAkN14q4rT6 nTFhyBwsVqJ8M3LAFJ59kfDiYt2Dus1gsuEE3sAeVbx6ZzXAi9GcblSKSBNpFltuQ0PN 8DiRPUGePEcz0HiBuyMSv1NCRwRnm+89w9vJoWGJH9F17t7fqdJypNm0si5oxvpzul64 K2gOgmhlv0HbNbq8RtdTU/Sl3C0v9BzxLFY7p5nLN9RL1/KNwC1Kn3lpxBiQ+TIW7pIo MttQ== 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 q19si3128755ejr.425.2020.11.12.01.09.50; Thu, 12 Nov 2020 01:10:22 -0800 (PST) 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 S1727933AbgKLJHt (ORCPT + 99 others); Thu, 12 Nov 2020 04:07:49 -0500 Received: from mga05.intel.com ([192.55.52.43]:38735 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727822AbgKLJHF (ORCPT ); Thu, 12 Nov 2020 04:07:05 -0500 IronPort-SDR: T/C5kYSVlcGc1lXYwhSEGfpoCwVW4ao6le5FnQhWqD5PLBBLo+Sir1/h6hMuOdrL0/uh/hehly FhOzDcHoKIxw== X-IronPort-AV: E=McAfee;i="6000,8403,9802"; a="254988326" X-IronPort-AV: E=Sophos;i="5.77,471,1596524400"; d="scan'208";a="254988326" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Nov 2020 01:07:05 -0800 IronPort-SDR: 9aWrweWNYZT96RDMQ+GTTjyJ2l1YmkMro2+3uNs/U8jsA+jv/Mfp5U0KQ7kOAw1EzBKHEGOnrp Lfzdn32S6aGQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.77,471,1596524400"; d="scan'208";a="360911769" Received: from jsia-hp-z620-workstation.png.intel.com ([10.221.118.135]) by fmsmga002.fm.intel.com with ESMTP; 12 Nov 2020 01:07:03 -0800 From: Sia Jee Heng To: vkoul@kernel.org, Eugeniy.Paltsev@synopsys.com, robh+dt@kernel.org Cc: andriy.shevchenko@linux.intel.com, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Subject: [PATCH v3 14/15] dmaengine: dw-axi-dmac: Add Intel KeemBay AxiDMA BYTE and HALFWORD registers Date: Thu, 12 Nov 2020 16:49:52 +0800 Message-Id: <20201112084953.21629-15-jee.heng.sia@intel.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20201112084953.21629-1-jee.heng.sia@intel.com> References: <20201112084953.21629-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 df85f8289f05..812f51c717e6 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) @@ -1000,8 +1019,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); @@ -1013,9 +1033,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