Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp532381pxu; Fri, 11 Dec 2020 08:04:53 -0800 (PST) X-Google-Smtp-Source: ABdhPJxH1orKydkZMFMplTbtuC4HTVOuphMDA+gG9LPQU7sCc/8LtUkxxhGYGRZvKnHXTNbovI1U X-Received: by 2002:a50:ab59:: with SMTP id t25mr12543723edc.364.1607702693089; Fri, 11 Dec 2020 08:04:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1607702693; cv=none; d=google.com; s=arc-20160816; b=LYm6WFMLX4T5axlmiO0U+fEMqTAlZpPT2SMD80NQl/KYwEsw+VNcNUP3Es/l8nD8YO n2RzBzGCONVM0/uSwo4rPvyE3Y7wLEZuRr8N+pxW+i6iu9mZpjO2t2WaIIQNiu6dn+P3 KyhAbBNQP8VN/SnpA+MREJQhGTz8n+XdCxcwWpni9KRJfGBmlYcIvyPy7IwarZUtq+JM qmZ6vxxxQ4dJbk8gFaoTxvsJOZoIEZ9LAUFNWVHWyMYdUhN1lAsdwNslVUHZRn6FEBZr Pu8wX1lkUPFnx5elnXHf5j8pFkVYqgV26pQXSzVtK2UlD8n//qxTMf/b6UO+PWp/ICY5 rJzg== 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=xO9sy4ZVKmpdxZRwiT19M2u2TzW26j+Uq6zMBRm/atE=; b=wi4pcdKRSfBYZFj/Vz9s11CGAulUsk/T5tJqh8o3bieoWPly8eFMeKbIPy366UHyHl 2Y9XBDGAm2KFswgrS7DU7Zl29e0bgIIqJWYPD7Q2lgWSBUEIgwKRzx8os83yue+u9AWF GuxKODOXhHKFqKB+LCUaDZuyMlf5bgrCExYlT+P8Q6so6uPqvGCpjZHYTNuQwwsfhMYO Dte8BLYzMkdnUUcugB3JmIU0zb4nin6Ts0xo/TCPkZ3ejMi9YBODaQClQsq5xP0VkV+8 IinMrwNWwv+wkLU5kz3RmpTKjv4ZOzoSG/21aPqPduTC1zzwdn5dkdXNGOn7cSlNml5L Lwbw== 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 hs21si4968332ejc.395.2020.12.11.08.04.29; Fri, 11 Dec 2020 08:04:53 -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 S2404272AbgLKBGG (ORCPT + 99 others); Thu, 10 Dec 2020 20:06:06 -0500 Received: from mga14.intel.com ([192.55.52.115]:12012 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2394390AbgLKBF4 (ORCPT ); Thu, 10 Dec 2020 20:05:56 -0500 IronPort-SDR: OwVER0lUZOAd52xj2eWrseLJN34RkTqp9IPuIDBNsSsYGYXnELOgSfzIXjPtEEVUt8IuzkE42Y zXiuEzM331+w== X-IronPort-AV: E=McAfee;i="6000,8403,9831"; a="173596146" X-IronPort-AV: E=Sophos;i="5.78,409,1599548400"; d="scan'208";a="173596146" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Dec 2020 17:04:55 -0800 IronPort-SDR: DIvLHOEqEvK01p03mdJeT5EBqKq+A9S8YNokM6AbEMz1wORU8PG1aLryHCxcwo+/aH6EOs2fzH 5uiQqY4h09VQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,409,1599548400"; d="scan'208";a="320965869" Received: from jsia-hp-z620-workstation.png.intel.com ([10.221.118.135]) by fmsmga007.fm.intel.com with ESMTP; 10 Dec 2020 17:04:53 -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 v6 14/16] dmaengine: dw-axi-dmac: Add Intel KeemBay AxiDMA BYTE and HALFWORD registers Date: Fri, 11 Dec 2020 08:46:40 +0800 Message-Id: <20201211004642.25393-15-jee.heng.sia@intel.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20201211004642.25393-1-jee.heng.sia@intel.com> References: <20201211004642.25393-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 440f9a8b25da..dc7ddf98fd04 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