From patchwork Mon Jan 9 16:06:53 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Bailon X-Patchwork-Id: 9505365 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 B2C2D606E1 for ; Mon, 9 Jan 2017 16:08:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A4DDF28474 for ; Mon, 9 Jan 2017 16:08:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 98FC528497; Mon, 9 Jan 2017 16:08:47 +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=unavailable 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 1AF2428474 for ; Mon, 9 Jan 2017 16:08:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1762372AbdAIQIH (ORCPT ); Mon, 9 Jan 2017 11:08:07 -0500 Received: from mail-wm0-f46.google.com ([74.125.82.46]:35513 "EHLO mail-wm0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S970241AbdAIQH0 (ORCPT ); Mon, 9 Jan 2017 11:07:26 -0500 Received: by mail-wm0-f46.google.com with SMTP id a197so102720925wmd.0 for ; Mon, 09 Jan 2017 08:07:26 -0800 (PST) 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=iGKsNCRf5AcsrAJ7r+lKfCz26mi/NsyEpyAiK77/6gM=; b=EUFE033Jtrz9mMnis+V0Veb/yE6SN3KwuIXS4G3nZVTborQ7Q0MiMk+GjDjfGxZUdv 3qC95UCwmNC/VwBx+0h/lR1IVSy8wyDvYMUXVYHhDMjVdjJH8Kkiv2S5Km1vVavrZ43B xK9AzURrrUqLNVDzsyJMOSqFnYRuFi9fDD4KJ10z9EwxXzl0KAzjgNqPkuTBj6G3h6r8 k9/eigmcYI7FOhKnS8U+8A6Ai7kbFbU/fyL4L72+e3Xqw1GTPo7zQ6AwLv/NgDu8e4++ vr9jV9A6CedDKHB9l0sf7ajUHnzbAuP6rnEEs7NA0yMixhxemIWM9iaS+4kyXnx5PY66 b0fQ== 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=iGKsNCRf5AcsrAJ7r+lKfCz26mi/NsyEpyAiK77/6gM=; b=EIBZj9XMVJIEu89zFfp5SbLzPXyLTz+WkNdmdU041lMiB9y/wQl/biMONUuFjjFiJh IZ3P/3WydyIZUXGh++342GitUQLX8EGmYDVoTz5O/RxlC5Oq3JVEWKq6xU2j4pPJavNb 1Hp8y6uM/oslB3yrj53Seydur1/SPADWjXgEs3yk8+rOGe5ODodT7iRJs1hvqag4SArR cgLwsxTFsIIwUkA3DC3XOfN6kxTd0jbAMz92Z+nGhVcoCcn9kw0BHpu/lwxNhay+xZSk gMnUfi2m1sFOM3cKf+mg4HfxGeIOprP0rCUm93ql68WmQS819WDHA/Yf2sTuDyEM9dWG EUBA== X-Gm-Message-State: AIkVDXKUZ1GeK3q1etAM/Y3Cre4FOqU71XyOc0m78cuMN2SBl9zH2wi6DlCOIQPZA2u/LXLa X-Received: by 10.28.66.194 with SMTP id k63mr5408946wmi.140.1483978045180; Mon, 09 Jan 2017 08:07:25 -0800 (PST) Received: from localhost.localdomain ([90.63.244.31]) by smtp.gmail.com with ESMTPSA id w18sm19656244wme.9.2017.01.09.08.07.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 09 Jan 2017 08:07:24 -0800 (PST) From: Alexandre Bailon To: vinod.koul@intel.com Cc: dmaengine@vger.kernel.org, linux-usb@vger.kernel.org, nsekhar@ti.com, khilman@baylibre.com, ptitiano@baylibre.com, tony@atomide.com, linux-omap@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org, b-liu@ti.com, Alexandre Bailon Subject: [PATCH 08/11] dmaengine: cppi41: Implement the glue for da8xx Date: Mon, 9 Jan 2017 17:06:53 +0100 Message-Id: <20170109160656.3470-9-abailon@baylibre.com> X-Mailer: git-send-email 2.10.2 In-Reply-To: <20170109160656.3470-1-abailon@baylibre.com> References: <20170109160656.3470-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 da8xx has a cppi41 dma controller. This is add the glue layer required to make it work on da8xx, as well some changes in driver (e.g to manage clock). Signed-off-by: Alexandre Bailon --- drivers/dma/cppi41.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/drivers/dma/cppi41.c b/drivers/dma/cppi41.c index 939398e..4318e53 100644 --- a/drivers/dma/cppi41.c +++ b/drivers/dma/cppi41.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -86,10 +87,19 @@ #define USBSS_IRQ_PD_COMP (1 << 2) +/* USB DA8XX */ +#define DA8XX_INTR_SRC_MASKED 0x38 +#define DA8XX_END_OF_INTR 0x3c + +#define DA8XX_QMGR_PENDING_MASK (0xf << 24) + + + /* Packet Descriptor */ #define PD2_ZERO_LENGTH (1 << 19) #define AM335X_CPPI41 0 +#define DA8XX_CPPI41 1 struct cppi41_channel { struct dma_chan chan; @@ -158,6 +168,9 @@ struct cppi41_dd { /* context for suspend/resume */ unsigned int dma_tdfdq; + + /* da8xx clock */ + struct clk *clk; }; static struct chan_queues am335x_usb_queues_tx[] = { @@ -232,6 +245,20 @@ static const struct chan_queues am335x_usb_queues_rx[] = { [29] = { .submit = 30, .complete = 155}, }; +static const struct chan_queues da8xx_usb_queues_tx[] = { + [0] = { .submit = 16, .complete = 24}, + [1] = { .submit = 18, .complete = 24}, + [2] = { .submit = 20, .complete = 24}, + [3] = { .submit = 22, .complete = 24}, +}; + +static const struct chan_queues da8xx_usb_queues_rx[] = { + [0] = { .submit = 1, .complete = 26}, + [1] = { .submit = 3, .complete = 26}, + [2] = { .submit = 5, .complete = 26}, + [3] = { .submit = 7, .complete = 26}, +}; + struct cppi_glue_infos { irqreturn_t (*isr)(int irq, void *data); const struct chan_queues *queues_rx; @@ -366,6 +393,26 @@ static irqreturn_t am335x_cppi41_irq(int irq, void *data) return cppi41_irq(cdd); } +static irqreturn_t da8xx_cppi41_irq(int irq, void *data) +{ + struct cppi41_dd *cdd = data; + u32 status; + u32 usbss_status; + + status = cppi_readl(cdd->qmgr_mem + QMGR_PEND(0)); + if (status & DA8XX_QMGR_PENDING_MASK) + cppi41_irq(cdd); + else + return IRQ_NONE; + + /* Re-assert IRQ if there no usb core interrupts pending */ + usbss_status = cppi_readl(cdd->usbss_mem + DA8XX_INTR_SRC_MASKED); + if (!usbss_status) + cppi_writel(0, cdd->usbss_mem + DA8XX_END_OF_INTR); + + return IRQ_HANDLED; +} + static dma_cookie_t cppi41_tx_submit(struct dma_async_tx_descriptor *tx) { dma_cookie_t cookie; @@ -972,8 +1019,19 @@ static const struct cppi_glue_infos am335x_usb_infos = { .platform = AM335X_CPPI41, }; +static const struct cppi_glue_infos da8xx_usb_infos = { + .isr = da8xx_cppi41_irq, + .queues_rx = da8xx_usb_queues_rx, + .queues_tx = da8xx_usb_queues_tx, + .td_queue = { .submit = 31, .complete = 0 }, + .first_completion_queue = 24, + .qmgr_num_pend = 2, + .platform = DA8XX_CPPI41, +}; + static const struct of_device_id cppi41_dma_ids[] = { { .compatible = "ti,am3359-cppi41", .data = &am335x_usb_infos}, + { .compatible = "ti,da8xx-cppi41", .data = &da8xx_usb_infos}, {}, }; MODULE_DEVICE_TABLE(of, cppi41_dma_ids); @@ -995,6 +1053,13 @@ static int is_am335x_cppi41(struct device *dev) return cdd->platform == AM335X_CPPI41; } +static int is_da8xx_cppi41(struct device *dev) +{ + struct cppi41_dd *cdd = dev_get_drvdata(dev); + + return cdd->platform == DA8XX_CPPI41; +} + #define CPPI41_DMA_BUSWIDTHS (BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | \ BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | \ BIT(DMA_SLAVE_BUSWIDTH_3_BYTES) | \ @@ -1058,6 +1123,21 @@ static int cppi41_dma_probe(struct platform_device *pdev) cdd->first_completion_queue = glue_info->first_completion_queue; cdd->platform = glue_info->platform; + if (is_da8xx_cppi41(dev)) { + cdd->clk = devm_clk_get(&pdev->dev, "usb20"); + ret = PTR_ERR_OR_ZERO(cdd->clk); + if (ret) { + dev_err(&pdev->dev, "failed to get clock\n"); + goto err_clk_en; + } + + ret = clk_prepare_enable(cdd->clk); + if (ret) { + dev_err(dev, "failed to enable clock\n"); + goto err_clk_en; + } + } + ret = of_property_read_u32(dev->of_node, "#dma-channels", &cdd->n_chans); if (ret) @@ -1112,6 +1192,9 @@ static int cppi41_dma_probe(struct platform_device *pdev) err_init_cppi: pm_runtime_dont_use_autosuspend(dev); err_get_n_chans: + if (is_da8xx_cppi41(dev)) + clk_disable_unprepare(cdd->clk); +err_clk_en: err_get_sync: pm_runtime_put_sync(dev); pm_runtime_disable(dev); @@ -1146,6 +1229,8 @@ static int cppi41_dma_remove(struct platform_device *pdev) pm_runtime_dont_use_autosuspend(&pdev->dev); pm_runtime_put_sync(&pdev->dev); pm_runtime_disable(&pdev->dev); + if (is_da8xx_cppi41(&pdev->dev)) + clk_disable_unprepare(cdd->clk); return 0; } @@ -1158,6 +1243,9 @@ static int __maybe_unused cppi41_suspend(struct device *dev) cppi_writel(0, cdd->usbss_mem + USBSS_IRQ_CLEARR); disable_sched(cdd); + if (is_da8xx_cppi41(dev)) + clk_disable_unprepare(cdd->clk); + return 0; } @@ -1165,8 +1253,15 @@ static int __maybe_unused cppi41_resume(struct device *dev) { struct cppi41_dd *cdd = dev_get_drvdata(dev); struct cppi41_channel *c; + int ret; int i; + if (is_da8xx_cppi41(dev)) { + ret = clk_prepare_enable(cdd->clk); + if (ret) + return ret; + } + for (i = 0; i < DESCS_AREAS; i++) cppi_writel(cdd->descs_phys, cdd->qmgr_mem + QMGR_MEMBASE(i));