Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp9555078pxu; Mon, 28 Dec 2020 21:10:39 -0800 (PST) X-Google-Smtp-Source: ABdhPJwiv9tfIMVA2OtTqOckTvLlVrObSx+4lrnWUQ7/oBanqqiYyKDCzim+rT+WM6NH+SqNgiu/ X-Received: by 2002:a17:906:3146:: with SMTP id e6mr30518421eje.363.1609218639486; Mon, 28 Dec 2020 21:10:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609218639; cv=none; d=google.com; s=arc-20160816; b=OGQ/dElcyjOzDpfX7axyl52oaA6flMNSNH6ImA4sk5YtsPVVoz1QLtzcnsPu3HnKXQ /MDdmd/JAyk72VAVOOsHZ75xRpThPoOiTDrvZ38ocxuXN3KshUKO/pFr0Hrb5E/8l9oM /UExMSwOBYym7eKW5Mjfa8gUvqyr80r6IyrJqvy946f/MLAvTMkfqjBpxqq30Y7kUZ8m eMEHo3KhvTyI4mlJ43B8QenbUNyH4lT/OVg0bVpn2gTKGLHyefuRjPpGARc16qfFlqJQ 0MWC1/v8V1qiesWxnj8j8xVcEkzCh4v+6BJDWg8N+CY9/SXxXSCldSvWrHiyBE/uzxNx p1Mw== 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=U2l2HaBKKQ8mMsxKFaA4LnNfnbBhP6HUXjnqB1+Tl7M=; b=U0+nzFcC+Ol92iGTnqI9/8Na6mCkrAZHQQ1lJ4BLCTG8VdHQLwaFKd8Cn4UzNY5Y02 CvMVGfXwcK9AFFq4dmcU8JlmQ7nnm5zPFkUcbMsjerghNgtGR1UI2BMgAXNdzPYtorfi bNXg5mNw7uuYoGrzYXWjwce0lWv/58DpZQhFuy9+ngdHljtbjdVQf6BfNNiFLpbBI09D q9MFBc/l838gWXcR5t/tc4SMXOi3PX5gWiMuXzeYy3dvL/nMdUODYeMHPju64kI1DUQd 9G+88ZpRFqPeDnFb/bnCN2arfCmrafGis2O8shmR9EMcyrcND6Z6CNMmWJ26i6blhHzh NWSQ== 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 d9si19690916ejd.681.2020.12.28.21.10.17; Mon, 28 Dec 2020 21:10:39 -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 S1726749AbgL2FGA (ORCPT + 99 others); Tue, 29 Dec 2020 00:06:00 -0500 Received: from mga03.intel.com ([134.134.136.65]:37344 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726060AbgL2FF7 (ORCPT ); Tue, 29 Dec 2020 00:05:59 -0500 IronPort-SDR: n6HXqlQwRbk+v20Ucvu75nbXKaxO6c/uniWSe/ViOl4NsQjzNZFuXKN6LfExZoEgntcCL61JTa nkxC5Am2sfuw== X-IronPort-AV: E=McAfee;i="6000,8403,9848"; a="176554728" X-IronPort-AV: E=Sophos;i="5.78,457,1599548400"; d="scan'208";a="176554728" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Dec 2020 21:04:50 -0800 IronPort-SDR: j7wlSn7zHofsetQbhQ/7Hs1V+UwGr11iUiGutjLJqcUKDrykQmKkBpV/rEF26v40SJJP3TUQkm UWMCfx77jU/g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,457,1599548400"; d="scan'208";a="347249848" Received: from jsia-hp-z620-workstation.png.intel.com ([10.221.118.135]) by fmsmga008.fm.intel.com with ESMTP; 28 Dec 2020 21:04:48 -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 v8 14/16] dmaengine: dw-axi-dmac: Add Intel KeemBay AxiDMA BYTE and HALFWORD registers Date: Tue, 29 Dec 2020 12:47:11 +0800 Message-Id: <20201229044713.28464-15-jee.heng.sia@intel.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20201229044713.28464-1-jee.heng.sia@intel.com> References: <20201229044713.28464-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 5e77eb3d040f..ab145a84b0c0 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) @@ -994,8 +1013,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); @@ -1007,9 +1027,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_handshake_num, false); + if (chan->direction != DMA_MEM_TO_MEM) { + ret = dw_axi_dma_set_hw_channel(chan->chip, + chan->hw_handshake_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