Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp817426ybl; Fri, 24 Jan 2020 10:04:07 -0800 (PST) X-Google-Smtp-Source: APXvYqxasjnVHLxsf+jh7f7McawgIzZz5o+KlhT0JGH1MDF1p4UAroVoTDcEkHMcpoT6M9nV2yWQ X-Received: by 2002:a9d:748d:: with SMTP id t13mr3534236otk.181.1579889047594; Fri, 24 Jan 2020 10:04:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579889047; cv=none; d=google.com; s=arc-20160816; b=qp3p7lotLAH0o+6IIE+Oewf3h682/XTmSYvRbJDE4CWqa1NziQ+240MDjGsjqDH/uD Ot9NFjn17ApHlRmR2pT4NibWJtJM/dzk1du0k4dUKQUVrn7Pyo+vuAHMwR671SuvWHf0 UBIl4Ik+38DjHX48yWcEGd3o8Btsu0KFp1QrMiewzlP8YmvX+w9Mv/nr9IEu57XBN1x/ IgRtG58G+uFbet4+dRoCOeXBMYnY1VvVO8kuJ2eCY5MjGMfCdOYEzUvQxu4sE/vY7WVN zh3bVGXlCX+mgxR43eJ0masVNOWnotcFXbe0L9uTxTuapRV/fISoxgLpJBqfgwlfADbY d26A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=PcjEVCw84wNaqDBxfBKljJuYR3vSuE07xtDsJDLl2gc=; b=y06HH/ukWLBYoCemTaCpTxBqZLAM5D4fToSh7egudyUrUPgW+6SNydgoPFw7sKEidd 8oF4WXp/FS94SEyXtUk5vBjWuMKHrQS/X11Z4i1U/dosC2TQi/YkH8i4MYQIKeka0C2h PatKtykf73PEVDjBr6SY+RDBLwIh60CxQkWVvbpqg8Ksm7v+VjXcNuZsRg54XhuruSe7 6TAyM+zwYDJVaOqAxY8/e9FAaK3AZtKmdDca/5x2wpSV3/C8+IHPrKpyLG7K47G2Y6Ve M8/fZzhm2LVfyyySk5EWmmkKW69f6k1xQxTWmIXStOT7ZTrTo3VuyhkWVUTLh08FC+6f isRw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ClsK7e0S; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 16si1571477oth.99.2020.01.24.10.03.54; Fri, 24 Jan 2020 10:04:07 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ClsK7e0S; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390331AbgAXLSz (ORCPT + 99 others); Fri, 24 Jan 2020 06:18:55 -0500 Received: from mail.kernel.org ([198.145.29.99]:56090 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390483AbgAXLSt (ORCPT ); Fri, 24 Jan 2020 06:18:49 -0500 Received: from localhost (ip-213-127-102-57.ip.prioritytelecom.net [213.127.102.57]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 098B820704; Fri, 24 Jan 2020 11:18:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579864728; bh=Q02J/GZJFdeNELe5RyPHNSHC6s660rLzv3qwk8uItGg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ClsK7e0SJR8p519ek2ni8Q0WSkAWxw/rM/JuXHBF6FoVOBSqtAozfEoHz9MpNik4m OQtFPmV4CYN+k8QSNcH7Uolw43e/Q4SPUS+/BvX0wNCPoyf0yhWzZmEpT0Th89XgV1 ScwtnQaf62XCT3EpF9qZrz91cj1YC/6mRgdobucE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Sameer Pujar , Jon Hunter , Vinod Koul , Sasha Levin Subject: [PATCH 4.19 349/639] dmaengine: tegra210-adma: restore channel status Date: Fri, 24 Jan 2020 10:28:39 +0100 Message-Id: <20200124093130.839728067@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200124093047.008739095@linuxfoundation.org> References: <20200124093047.008739095@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Sameer Pujar [ Upstream commit f33e7bb3eb922618612a90f0a828c790e8880773 ] Status of ADMA channel registers is not saved and restored during system suspend. During active playback if system enters suspend, this results in wrong state of channel registers during system resume and playback fails to resume properly. Fix this by saving following channel registers in runtime suspend and restore during runtime resume. * ADMA_CH_LOWER_SRC_ADDR * ADMA_CH_LOWER_TRG_ADDR * ADMA_CH_FIFO_CTRL * ADMA_CH_CONFIG * ADMA_CH_CTRL * ADMA_CH_CMD * ADMA_CH_TC Runtime PM calls will be inovked during system resume path if a playback or capture needs to be resumed. Hence above changes work fine for system suspend case. Fixes: f46b195799b5 ("dmaengine: tegra-adma: Add support for Tegra210 ADMA") Signed-off-by: Sameer Pujar Reviewed-by: Jon Hunter Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- drivers/dma/tegra210-adma.c | 46 ++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/drivers/dma/tegra210-adma.c b/drivers/dma/tegra210-adma.c index 09b6756366c30..ac2a6b800db3e 100644 --- a/drivers/dma/tegra210-adma.c +++ b/drivers/dma/tegra210-adma.c @@ -98,6 +98,7 @@ struct tegra_adma_chan_regs { unsigned int src_addr; unsigned int trg_addr; unsigned int fifo_ctrl; + unsigned int cmd; unsigned int tc; }; @@ -127,6 +128,7 @@ struct tegra_adma_chan { enum dma_transfer_direction sreq_dir; unsigned int sreq_index; bool sreq_reserved; + struct tegra_adma_chan_regs ch_regs; /* Transfer count and position info */ unsigned int tx_buf_count; @@ -635,8 +637,30 @@ static struct dma_chan *tegra_dma_of_xlate(struct of_phandle_args *dma_spec, static int tegra_adma_runtime_suspend(struct device *dev) { struct tegra_adma *tdma = dev_get_drvdata(dev); + struct tegra_adma_chan_regs *ch_reg; + struct tegra_adma_chan *tdc; + int i; tdma->global_cmd = tdma_read(tdma, ADMA_GLOBAL_CMD); + if (!tdma->global_cmd) + goto clk_disable; + + for (i = 0; i < tdma->nr_channels; i++) { + tdc = &tdma->channels[i]; + ch_reg = &tdc->ch_regs; + ch_reg->cmd = tdma_ch_read(tdc, ADMA_CH_CMD); + /* skip if channel is not active */ + if (!ch_reg->cmd) + continue; + ch_reg->tc = tdma_ch_read(tdc, ADMA_CH_TC); + ch_reg->src_addr = tdma_ch_read(tdc, ADMA_CH_LOWER_SRC_ADDR); + ch_reg->trg_addr = tdma_ch_read(tdc, ADMA_CH_LOWER_TRG_ADDR); + ch_reg->ctrl = tdma_ch_read(tdc, ADMA_CH_CTRL); + ch_reg->fifo_ctrl = tdma_ch_read(tdc, ADMA_CH_FIFO_CTRL); + ch_reg->config = tdma_ch_read(tdc, ADMA_CH_CONFIG); + } + +clk_disable: clk_disable_unprepare(tdma->ahub_clk); return 0; @@ -645,7 +669,9 @@ static int tegra_adma_runtime_suspend(struct device *dev) static int tegra_adma_runtime_resume(struct device *dev) { struct tegra_adma *tdma = dev_get_drvdata(dev); - int ret; + struct tegra_adma_chan_regs *ch_reg; + struct tegra_adma_chan *tdc; + int ret, i; ret = clk_prepare_enable(tdma->ahub_clk); if (ret) { @@ -654,6 +680,24 @@ static int tegra_adma_runtime_resume(struct device *dev) } tdma_write(tdma, ADMA_GLOBAL_CMD, tdma->global_cmd); + if (!tdma->global_cmd) + return 0; + + for (i = 0; i < tdma->nr_channels; i++) { + tdc = &tdma->channels[i]; + ch_reg = &tdc->ch_regs; + /* skip if channel was not active earlier */ + if (!ch_reg->cmd) + continue; + tdma_ch_write(tdc, ADMA_CH_TC, ch_reg->tc); + tdma_ch_write(tdc, ADMA_CH_LOWER_SRC_ADDR, ch_reg->src_addr); + tdma_ch_write(tdc, ADMA_CH_LOWER_TRG_ADDR, ch_reg->trg_addr); + tdma_ch_write(tdc, ADMA_CH_CTRL, ch_reg->ctrl); + tdma_ch_write(tdc, ADMA_CH_FIFO_CTRL, ch_reg->fifo_ctrl); + tdma_ch_write(tdc, ADMA_CH_CONFIG, ch_reg->config); + tdma_ch_write(tdc, ADMA_CH_CMD, ch_reg->cmd); + } + return 0; } -- 2.20.1