Received: by 2002:a25:824b:0:0:0:0:0 with SMTP id d11csp1179566ybn; Tue, 24 Sep 2019 16:13:44 -0700 (PDT) X-Google-Smtp-Source: APXvYqxu6/GfxdKTSi5ziJsgEcOp7DZ6SHY9DCr+weOaKCXk13DuX16d3Yv2ng/yLL9rm4n+ONDl X-Received: by 2002:a1c:3946:: with SMTP id g67mr3395442wma.52.1569366824668; Tue, 24 Sep 2019 16:13:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1569366824; cv=none; d=google.com; s=arc-20160816; b=kfJcUnbrtF2Vo7H9ze6+O4dx6Egq7VlOFdPtk8Qk9SW3OvjsrXwj6IqfpgpkHlYe0+ Z0N31+nDj1vVjrMpX6RCF2HBBxaXsA7M7R41CXutzy8s/RDnKRjoW1uXHlAMzLSS44BS hV7//kvzIT4D9672BBQDn1MuF1N/d9+aVVrs4F5UZNamQZ/0RB3+ngImDx9NsxhmeaII yXY8y1Sbmd2FXyodOQaU6/7ZmxNc+2xOzi96U/0AZb3UZDTeyYCEtqwJ4PuS7Mk0hXA0 FFjI7TeJGzFtSP3jeOhJO1kH0xOdweWa5JuOx2MDqo8wbgbs/+5/aMmm3rlgOLeykCi+ CAMQ== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=MC3a+PdwzhuQoM9+lyc1qvJ7pfUDliDLG3kA6oYpffg=; b=joCajwgyG146WBxShJU5PViU9dURWiftn5bsa7pCyjojhATbZ5iqw7nhlBpBZt99I7 XTH2IHIORiV7CSG/f9i8ONmcn22pYI9yZYvVtTDIBB3qeWfGs97FvITddg4Lg1R8V+sG OBzo/hzl2c528cgRm1qXPk+rQQDYObh29KCKxt56NiBW8IQREbo0buD123Gp/qn8GTLF H6/+2LINo/JOgWxq4R8lLAS9gF7H+KyYQ5CVimc3RBtoAD/p/B3Cm4kTHdLt7ZlJ/6V0 WJmfuupgw9eMoaODvT1PJAIRSmkEqUXh20S24cstLlwnx0cCXd5u3RHxH5kJ0Olk0a0w nVfQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=M2EQHUOc; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h58si2137959eda.191.2019.09.24.16.13.20; Tue, 24 Sep 2019 16:13:44 -0700 (PDT) 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=M2EQHUOc; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2406857AbfIVThs (ORCPT + 99 others); Sun, 22 Sep 2019 15:37:48 -0400 Received: from mail.kernel.org ([198.145.29.99]:41330 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389488AbfIVSpk (ORCPT ); Sun, 22 Sep 2019 14:45:40 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 93EE6206C2; Sun, 22 Sep 2019 18:45:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1569177939; bh=3OtjawS5Quoj0m9+HxUvXsST9CRqFPfbZPNEu3y/zwY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=M2EQHUOcI0omIH6MQE0Q6uebxmm4EYUncmlofu7ur9GUzUFM21ZVc9ljpG3KrZEpD UAI3WHyfdgyFCwpm5qRle0sGZg0d8XBRas9K/K1fAq2Q+hfb/jA7h4dVrWQliCXbGa nOSrbdupLr0r/oNUYhoE4dW+VoyaVXnpvwdMvIPY= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Kuninori Morimoto , Leon Kong , Mark Brown , Sasha Levin Subject: [PATCH AUTOSEL 5.3 048/203] ASoC: rsnd: don't call clk_get_rate() under atomic context Date: Sun, 22 Sep 2019 14:41:14 -0400 Message-Id: <20190922184350.30563-48-sashal@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190922184350.30563-1-sashal@kernel.org> References: <20190922184350.30563-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Kuninori Morimoto [ Upstream commit 06e8f5c842f2dbb232897ba967ea7b422745c271 ] ADG is using clk_get_rate() under atomic context, thus, we might have scheduling issue. To avoid this issue, we need to get/keep clk rate under non atomic context. We need to handle ADG as special device at Renesas Sound driver. From SW point of view, we want to impletent it as rsnd_mod_ops :: prepare, but it makes code just complicate. To avoid complicated code/patch, this patch adds new clk_rate[] array, and keep clk IN rate when rsnd_adg_clk_enable() was called. Reported-by: Leon Kong Signed-off-by: Kuninori Morimoto Tested-by: Leon Kong Link: https://lore.kernel.org/r/87v9vb0xkp.wl-kuninori.morimoto.gx@renesas.com Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- sound/soc/sh/rcar/adg.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c index fce4e050a9b70..b9aacf3d3b29c 100644 --- a/sound/soc/sh/rcar/adg.c +++ b/sound/soc/sh/rcar/adg.c @@ -30,6 +30,7 @@ struct rsnd_adg { struct clk *clkout[CLKOUTMAX]; struct clk_onecell_data onecell; struct rsnd_mod mod; + int clk_rate[CLKMAX]; u32 flags; u32 ckr; u32 rbga; @@ -114,9 +115,9 @@ static void __rsnd_adg_get_timesel_ratio(struct rsnd_priv *priv, unsigned int val, en; unsigned int min, diff; unsigned int sel_rate[] = { - clk_get_rate(adg->clk[CLKA]), /* 0000: CLKA */ - clk_get_rate(adg->clk[CLKB]), /* 0001: CLKB */ - clk_get_rate(adg->clk[CLKC]), /* 0010: CLKC */ + adg->clk_rate[CLKA], /* 0000: CLKA */ + adg->clk_rate[CLKB], /* 0001: CLKB */ + adg->clk_rate[CLKC], /* 0010: CLKC */ adg->rbga_rate_for_441khz, /* 0011: RBGA */ adg->rbgb_rate_for_48khz, /* 0100: RBGB */ }; @@ -302,7 +303,7 @@ int rsnd_adg_clk_query(struct rsnd_priv *priv, unsigned int rate) * AUDIO_CLKA/AUDIO_CLKB/AUDIO_CLKC/AUDIO_CLKI. */ for_each_rsnd_clk(clk, adg, i) { - if (rate == clk_get_rate(clk)) + if (rate == adg->clk_rate[i]) return sel_table[i]; } @@ -369,10 +370,18 @@ void rsnd_adg_clk_control(struct rsnd_priv *priv, int enable) for_each_rsnd_clk(clk, adg, i) { ret = 0; - if (enable) + if (enable) { ret = clk_prepare_enable(clk); - else + + /* + * We shouldn't use clk_get_rate() under + * atomic context. Let's keep it when + * rsnd_adg_clk_enable() was called + */ + adg->clk_rate[i] = clk_get_rate(adg->clk[i]); + } else { clk_disable_unprepare(clk); + } if (ret < 0) dev_warn(dev, "can't use clk %d\n", i); -- 2.20.1