From patchwork Wed Sep 20 07:35:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Bailon X-Patchwork-Id: 9961035 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 56397600C5 for ; Wed, 20 Sep 2017 07:35:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 48D6528F7D for ; Wed, 20 Sep 2017 07:35:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3DC1328FE9; Wed, 20 Sep 2017 07:35:35 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A954728F7D for ; Wed, 20 Sep 2017 07:35:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751796AbdITHfa (ORCPT ); Wed, 20 Sep 2017 03:35:30 -0400 Received: from mail-wr0-f178.google.com ([209.85.128.178]:48914 "EHLO mail-wr0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751793AbdITHfW (ORCPT ); Wed, 20 Sep 2017 03:35:22 -0400 Received: by mail-wr0-f178.google.com with SMTP id 108so1366903wra.5 for ; Wed, 20 Sep 2017 00:35:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=RElje/I99LgI5VTknRv+2U+5N5l9byQWPhYVfABJInA=; b=POllx/BAQGHf6itaKtjms6kucItCZGXo+exIw0jma4QyucOjevaTdEfvTCAxbs+21f M0d4H6hx5XP3K+LWgZ89AktCxNJwMJGxkMFb9Pt/pSKbL9lt82gc8v6wF/3vH8Pf2hVK kPF7QhfX7PskfPm1utGnTv84ZImDGQFaqXNLgEhL4N2VZmcEKxoiOJrRqMnEG+u7YnCE XNmP3TZ84/HCcfKa4r9Tahan5YvYTj9MMfJ4gqgRtY49Q7k+YFekC/ZN6nMGGzg4t9Ba 3Z1sA6P7//UkWywQ4kFh0L73leqygeqRwclWUXWMBFEJazjYR5g/JPHiTYqobF1fuKYe BdUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=RElje/I99LgI5VTknRv+2U+5N5l9byQWPhYVfABJInA=; b=fWUGykdeUvxUJSpfoZX0odtcX+zxpByuJ9RikILLpvSugU8dWK7gvEl7kMzHlBQhgC 5KzTgXQ2fx9RSxANNWLE5QQuYIieW9YHGb1seUHygafaEZaBuQSj+Zroui1gz1lj7HwM ih+1FjsPHXO6d7/NkL8gj9rgDr3WaTNvxQJ0k+nvFD412jieGi46dvrPQM3RW9++4s/M BGwTKXiQ2U0yS09yNuNU+t+qEWeT5CHbDSa2Q9qy10kJbR3C/YOfVuywmPDNXxQA/end mLfVR9QzPXGlFdL1R0ABrBjeRQjyoGvKWp5ce0gQMNy0dosC+lih8ohKfeQnROiA7x4X xSvw== X-Gm-Message-State: AHPjjUhgXW9f2L4GfqM3RCToGjxC/NWj91M+fe/Gdt+sRlHCqKBNw/pF L3vQ7ntsW+Qn/0s0PoHBOSv92w== X-Google-Smtp-Source: AOwi7QB8XCgZY1ZTtCGkP3ylZIK4GjM9iG4w15tSwEyWnxOYtYJkcJVfrVPiLfE+4L3ZPO31qVZBug== X-Received: by 10.223.135.252 with SMTP id c57mr3317935wrc.204.1505892921356; Wed, 20 Sep 2017 00:35:21 -0700 (PDT) Received: from localhost.localdomain (car75-h02-176-137-58-115.dsl.sta.abo.bbox.fr. [176.137.58.115]) by smtp.gmail.com with ESMTPSA id w14sm998875wmf.13.2017.09.20.00.35.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 20 Sep 2017 00:35:20 -0700 (PDT) From: Alexandre Bailon To: b-liu@ti.com Cc: linux-usb@vger.kernel.org, nsekhar@ti.com, ptitiano@baylibre.com, sergei.shtylyov@cogentembedded.com, linux-omap@vger.kernel.org, Alexandre Bailon Subject: [PATCH v2 2/4] usb: musb: musb_cppi41: Fix cppi41_set_dma_mode() for DA8xx Date: Wed, 20 Sep 2017 09:35:11 +0200 Message-Id: <20170920073513.11650-3-abailon@baylibre.com> X-Mailer: git-send-email 2.13.5 In-Reply-To: <20170920073513.11650-1-abailon@baylibre.com> References: <20170920073513.11650-1-abailon@baylibre.com> Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The way to configure the DMA mode on DA8xx is different from DSPS. Add a new function to configure DMA mode on DA8xx and use a callback to call the right function based on the platform. Signed-off-by: Alexandre Bailon --- drivers/usb/musb/musb_cppi41.c | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/drivers/usb/musb/musb_cppi41.c b/drivers/usb/musb/musb_cppi41.c index d66416a27146..b2b1306c01cf 100644 --- a/drivers/usb/musb/musb_cppi41.c +++ b/drivers/usb/musb/musb_cppi41.c @@ -26,6 +26,7 @@ #define MUSB_DMA_NUM_CHANNELS 15 +#define DA8XX_USB_MODE 0x10 #define DA8XX_USB_AUTOREQ 0x14 #define DA8XX_USB_TEARDOWN 0x1c @@ -41,6 +42,9 @@ struct cppi41_dma_controller { u32 tdown_reg; u32 autoreq_reg; + + void (*set_dma_mode)(struct cppi41_dma_channel *cppi41_channel, + unsigned int mode); }; static void save_rx_toggle(struct cppi41_dma_channel *cppi41_channel) @@ -355,6 +359,32 @@ static void cppi41_set_dma_mode(struct cppi41_dma_channel *cppi41_channel, } } +static void da8xx_set_dma_mode(struct cppi41_dma_channel *cppi41_channel, + unsigned int mode) +{ + struct cppi41_dma_controller *controller = cppi41_channel->controller; + struct musb *musb = controller->controller.musb; + unsigned int shift; + u32 port; + u32 new_mode; + u32 old_mode; + + old_mode = controller->tx_mode; + port = cppi41_channel->port_num; + + shift = (port - 1) * 4; + if (!cppi41_channel->is_tx) + shift += 16; + new_mode = old_mode & ~(3 << shift); + new_mode |= mode << shift; + + if (new_mode == old_mode) + return; + controller->tx_mode = new_mode; + musb_writel(musb->ctrl_base, DA8XX_USB_MODE, new_mode); +} + + static void cppi41_set_autoreq_mode(struct cppi41_dma_channel *cppi41_channel, unsigned mode) { @@ -379,6 +409,7 @@ static bool cppi41_configure_channel(struct dma_channel *channel, dma_addr_t dma_addr, u32 len) { struct cppi41_dma_channel *cppi41_channel = channel->private_data; + struct cppi41_dma_controller *controller = cppi41_channel->controller; struct dma_chan *dc = cppi41_channel->dc; struct dma_async_tx_descriptor *dma_desc; enum dma_transfer_direction direction; @@ -404,7 +435,7 @@ static bool cppi41_configure_channel(struct dma_channel *channel, musb_writel(musb->ctrl_base, RNDIS_REG(cppi41_channel->port_num), len); /* gen rndis */ - cppi41_set_dma_mode(cppi41_channel, + controller->set_dma_mode(cppi41_channel, EP_MODE_DMA_GEN_RNDIS); /* auto req */ @@ -413,14 +444,15 @@ static bool cppi41_configure_channel(struct dma_channel *channel, } else { musb_writel(musb->ctrl_base, RNDIS_REG(cppi41_channel->port_num), 0); - cppi41_set_dma_mode(cppi41_channel, + controller->set_dma_mode(cppi41_channel, EP_MODE_DMA_TRANSPARENT); cppi41_set_autoreq_mode(cppi41_channel, EP_MODE_AUTOREQ_NONE); } } else { /* fallback mode */ - cppi41_set_dma_mode(cppi41_channel, EP_MODE_DMA_TRANSPARENT); + controller->set_dma_mode(cppi41_channel, + EP_MODE_DMA_TRANSPARENT); cppi41_set_autoreq_mode(cppi41_channel, EP_MODE_AUTOREQ_NONE); len = min_t(u32, packet_sz, len); } @@ -737,9 +769,11 @@ cppi41_dma_controller_create(struct musb *musb, void __iomem *base) if (musb->io.quirks & MUSB_DA8XX) { controller->tdown_reg = DA8XX_USB_TEARDOWN; controller->autoreq_reg = DA8XX_USB_AUTOREQ; + controller->set_dma_mode = da8xx_set_dma_mode; } else { controller->tdown_reg = USB_TDOWN; controller->autoreq_reg = USB_CTRL_AUTOREQ; + controller->set_dma_mode = cppi41_set_dma_mode; } ret = cppi41_dma_controller_start(controller);