From patchwork Sun Aug 13 12:04:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Bailon X-Patchwork-Id: 9897747 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 A894A60244 for ; Sun, 13 Aug 2017 12:04:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9AE37201B1 for ; Sun, 13 Aug 2017 12:04:39 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8FDD527B81; Sun, 13 Aug 2017 12:04:39 +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 8061A204BE for ; Sun, 13 Aug 2017 12:04:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751097AbdHMMEe (ORCPT ); Sun, 13 Aug 2017 08:04:34 -0400 Received: from mail-wm0-f46.google.com ([74.125.82.46]:38079 "EHLO mail-wm0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751723AbdHMMEc (ORCPT ); Sun, 13 Aug 2017 08:04:32 -0400 Received: by mail-wm0-f46.google.com with SMTP id f15so23985182wmg.1 for ; Sun, 13 Aug 2017 05:04:32 -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=+y0YpO7Q0OVbnWaHmf8a/7RJBPpFEyBc7/eZHbp9THc=; b=NSnr5o5mqR1UOr5w0YwO29AFe8OFjAK0fk+MPVMeB55Eau8UhxUNdg3QIqj7PHBrUF 9FmX6RgtDfYEHjD4MXgXlJZyq7k3SXQPJg3suduFyOilsoMmxcQ5ujoIt2lEux1SMOoO QP5SR3rFfTGGgs+GQmDTfPUVKd6y538Q6Kx7bAqOY414RToj3Xc63Bxaduq1o7ANELqa mmxZKQbsb1yzpvIIRdiAPSiUJOgYbw/UL0Okc/ZN0zd36agtjfKZFx7r8wZ6UxzYr6cE SgQJySgZ+CDjd+LAcZG1ilMiFlv1NjqgejeQzdnqx3wMbWcGORyubN+cLc5WUa2UD8+y KWJw== 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=+y0YpO7Q0OVbnWaHmf8a/7RJBPpFEyBc7/eZHbp9THc=; b=Xq04kTdtg6Ua7k/Wq2DMG1RluKZl+XTYAcMh7VVYix1fN7b/Kt8KKHHjm6Kiv/IDrl eV98wfD2jJQItfaLOkXNv0ulXb/2doiY0unv3lBKuw5XsltQ+pwO/sbGRml6BVRglmMD QmJp3tW5fDzzGHVM1UdfX8JTOxt0cG6l87ouXOCszfucGCkeGw+0cMdFygUnNWFUlD6q Jhzap0KTEtNomqytcK+elbXDJgpL/wMxdBHBll3t59T9C/SqwGSVqnasf5XlO6o62U3a fO5xcasNgGYyQw4pEOFJgqVisiKip2uImP1LJ34vPKV19tTAis8rGHwAqSbl3QeL6Jml 7Hqg== X-Gm-Message-State: AHYfb5hPmALz0361ARO5XP+jzo5YTKTCmTL30X+2O3SY1mQUIwO9hTdE DS6Axrlg1k1zP+MflhJ9fw== X-Received: by 10.28.211.145 with SMTP id k139mr2225626wmg.130.1502625871524; Sun, 13 Aug 2017 05:04:31 -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 125sm3383084wmk.6.2017.08.13.05.04.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 13 Aug 2017 05:04:30 -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 2/2] usb: musb: musb_cppi41: Fix cppi41_set_dma_mode() for DA8xx Date: Sun, 13 Aug 2017 14:04:23 +0200 Message-Id: <20170813120423.16371-3-abailon@baylibre.com> X-Mailer: git-send-email 2.13.0 In-Reply-To: <20170813120423.16371-1-abailon@baylibre.com> References: <20170813120423.16371-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 dbff0e0a4ff5..7284ec7ecff7 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_REG 0x10 #define DA8XX_USB_AUTOREQ_REG 0x14 #define DA8XX_USB_TEARDOWN_REG 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_REG, 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_REG; controller->autoreq_reg = DA8XX_USB_AUTOREQ_REG; + 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);