Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp14227947pxu; Mon, 4 Jan 2021 17:04:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJwXNjVI162otLY8TFrWQjvkdxLl3NAhNZjRsAe5TqI1HyIOmxui049Yxm7jCG/NabfKMOSe X-Received: by 2002:aa7:d511:: with SMTP id y17mr73593223edq.249.1609808663221; Mon, 04 Jan 2021 17:04:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609808663; cv=none; d=google.com; s=arc-20160816; b=YFIyYygsQqjrM1DTMSSZcm5+g55HGStH8I+4+gikVyUAI8rKb0Sad1D0yQi+QlxfZA ex3iQ2KwPcWiAJ65m68tI8p782UIw+5GOycGu85a5CFMil3vb2Pq3bAo396O1gZoIsm8 sWY8oBbv2D1JjXgdmiiKytk3lowLKn+lqnw3YijJM271uye7Uz5wicRmYncZZ0r8tMbq reBHilNSFE18tprKrXCFsYfpYtaBuCETcaidrJgcOQ6w4TPq7QfIdGnG1L/GZv3jTJ7J w8MGLNwwCXmLypDdvBMnl0ATFfuIdGRXcg1rnLJhRvAApnqeePmnQhhjwTu7AKOl1tMZ iTkA== 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=zempGTDKF/UsSYSZy56UN7Z0KOA6CCz/d7esRqjfkT0=; b=W1P9VfbqiE5EM6PxdRnY9XO2sGWvio88BRNB6ayduGSwhSIiESXeC6swCG9O9HHHw1 hCxhKLf+sDpUjBMHAvs6OTl9R4TDITisfFYVQmxu3pRuGYOvFldiYz6Ywt0WgD3kjseq UQB0k3/YC2XezYE+tZUZyk6qCgFeZ8yYWFu58n6y0NwubgGIzpYiOFDbNgO6dm/khXYI j1f/3Q2FjvoWfYtZggtlFO7K2XRJLrjaqXuKGNISX4MIBwn2qZ41LYwQwI8pZy2DeiTj tX1yag+47QgE9md+aSwvwxYvL+yeqqDHeqF8wY5H/mw3Ti/o2u6Ad2Pwb+kHJ66LdpPc BdDA== 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 w13si28982131ejn.15.2021.01.04.17.04.00; Mon, 04 Jan 2021 17:04:23 -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 S1728678AbhAEBCG (ORCPT + 99 others); Mon, 4 Jan 2021 20:02:06 -0500 Received: from mga05.intel.com ([192.55.52.43]:29975 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728674AbhAEBCA (ORCPT ); Mon, 4 Jan 2021 20:02:00 -0500 IronPort-SDR: foI8B9Qds4w+lA6xeic/tDBXVsr4UyiFym6CTXu6+UumAV+URmL0kl5NWgGhEMGxcvLzE+sfj3 5KigW36gGjFQ== X-IronPort-AV: E=McAfee;i="6000,8403,9854"; a="261794169" X-IronPort-AV: E=Sophos;i="5.78,475,1599548400"; d="scan'208";a="261794169" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Jan 2021 17:00:47 -0800 IronPort-SDR: h6jCSDrZUOH+6jE8RlmbvEc8T8Gn/qt0orYOpA7Ov9o9nU09EjoeFiLvOoDMu+Urb17mWV99AY BkLNNBOtTCfg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,475,1599548400"; d="scan'208";a="569540338" Received: from jsia-hp-z620-workstation.png.intel.com ([10.221.118.135]) by fmsmga005.fm.intel.com with ESMTP; 04 Jan 2021 17:00:46 -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 v9 14/16] dmaengine: dw-axi-dmac: Add Intel KeemBay AxiDMA BYTE and HALFWORD registers Date: Tue, 5 Jan 2021 08:43:04 +0800 Message-Id: <20210105004306.13588-15-jee.heng.sia@intel.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20210105004306.13588-1-jee.heng.sia@intel.com> References: <20210105004306.13588-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 | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) 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 e19369f9365a..ea527b92e0fc 100644 --- a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c +++ b/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c @@ -307,6 +307,30 @@ static void write_chan_llp(struct axi_dma_chan *chan, dma_addr_t adr) axi_chan_iowrite64(chan, CH_LLP, adr); } +static void dw_axi_dma_set_byte_halfword(struct axi_dma_chan *chan, bool set) +{ + u32 reg_width, offset, val; + + if (!chan->chip->apb_regs) { + dev_dbg(chan->chip->dev, "apb_regs not initialized\n"); + return; + } + + reg_width = __ffs(chan->config.dst_addr_width); + if (reg_width == DWAXIDMAC_TRANS_WIDTH_8) + offset = DMAC_APB_BYTE_WR_CH_EN; + else if (reg_width == DWAXIDMAC_TRANS_WIDTH_16) + offset = DMAC_APB_HALFWORD_WR_CH_EN; + + val = ioread32(chan->chip->apb_regs + offset); + + if (set) + val |= BIT(chan->id); + else + val &= ~BIT(chan->id); + + iowrite32(val, chan->chip->apb_regs + offset); +} /* Called in chan locked context */ static void axi_chan_block_xfer_start(struct axi_dma_chan *chan, struct axi_dma_desc *first) @@ -334,6 +358,7 @@ 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: + dw_axi_dma_set_byte_halfword(chan, true); reg |= (chan->config.device_fc ? DWAXIDMAC_TT_FC_MEM_TO_PER_DST : DWAXIDMAC_TT_FC_MEM_TO_PER_DMAC) @@ -1008,6 +1033,8 @@ static int dma_chan_terminate_all(struct dma_chan *dchan) 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_DEV) + dw_axi_dma_set_byte_halfword(chan, false); spin_lock_irqsave(&chan->vc.lock, flags); -- 2.18.0