From patchwork Fri Feb 23 01:52:13 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Ond=C5=99ej_Jirman?= X-Patchwork-Id: 205181 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:a81b:b0:108:e6aa:91d0 with SMTP id bq27csp331259dyb; Thu, 22 Feb 2024 17:53:47 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCVBqL2sAsx/s9h8HO1L7PwzCgjilgW9FBzzw7oEWB8+G7M0BPpX6sr48VuE2RSz5zbDbWoxanyiEbG31gHorxmYFBST6w== X-Google-Smtp-Source: AGHT+IGEUpAM6Nf2wWle/L3DhrIoU0pSAOxWD0DMDO5+lcu/3oGy/x/RUXyY7KDNHQNIjkOkuDL+ X-Received: by 2002:a17:902:a3c6:b0:1db:c1be:374d with SMTP id q6-20020a170902a3c600b001dbc1be374dmr672090plb.7.1708653227770; Thu, 22 Feb 2024 17:53:47 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1708653227; cv=pass; d=google.com; s=arc-20160816; b=L7MmAqJri4wg2F00j8OH4vgEbW8+gabrBfRQkAj/jiPu3GyowT3dXmScbu15ZqSsP5 rCb96Y/1+zD9A/qLopry1UGBZeSY6k7EySo2Y+z8lNF7f+NRR2VyY2eKestPFdMZsJAY r9/kEwZbgrF674vG5ivh8pD5t6diHrQFNQXdarR9WlbzHevFOAH0xzgWtrwU8pn8podM lvF3/ZIQdgca6bcfDz4OrQsar9AYiHBxBOX3Qbr4G0/Ro3Af2tFWWAgbWOzt3pvqGs45 ENXgjg1I0PDMgQzarlasFhBu13S2Er/zd/gA1ypeCdTtmmpHc9wrHpuJRQkrmt0otwXP nZDQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=wBePflGuTIzSp+nsddwFz5v1Bexw5+WgmLeux8C68Tg=; fh=QGdVBqYg4q7jIiN9KcNXeuSkybNfaLt8K5LfUlN67/I=; b=r/RpjB66VP8q0mwfOyyyiwWnjJc2rxtgXlb1LdwH6PL5tLcNVLmXa8u3CckdfrS27d Yjhyi4Ljbb5CgbCjvVwwY5YQzE6NzRJBTO/xGK8WstSH1O2iS9gLjxbvUex08nw7Qe7D tPDyzPrlAhJ1QKzbaTmik8HgtezywB4I5svlUIgmeYvHz4F2/+lH3aSqIAjDLHIERTBC MHg2gU5bjle3EAmho+DTWaXd4fEB1SmuMfuP0ypA1DJoZ3e669Yo4RGBghNwZvdlWRPv oECvUVWV5IRwHmnsDSvxx/8VyPx492+IdJYL12O4WPAMlNtXp/n6q2II7oZ+CkvIfR0F lZDA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@xff.cz header.s=mail header.b=CM2gDb4J; arc=pass (i=1 spf=pass spfdomain=xff.cz dkim=pass dkdomain=xff.cz dmarc=pass fromdomain=xff.cz); spf=pass (google.com: domain of linux-kernel+bounces-77656-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-77656-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=xff.cz Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id u7-20020a170902e80700b001dbde62e1c6si10164408plg.30.2024.02.22.17.53.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Feb 2024 17:53:47 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-77656-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@xff.cz header.s=mail header.b=CM2gDb4J; arc=pass (i=1 spf=pass spfdomain=xff.cz dkim=pass dkdomain=xff.cz dmarc=pass fromdomain=xff.cz); spf=pass (google.com: domain of linux-kernel+bounces-77656-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-77656-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=xff.cz Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 958AB285DA4 for ; Fri, 23 Feb 2024 01:53:47 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A7432B645; Fri, 23 Feb 2024 01:52:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=xff.cz header.i=@xff.cz header.b="CM2gDb4J" Received: from vps.xff.cz (vps.xff.cz [195.181.215.36]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 541D5B66B; Fri, 23 Feb 2024 01:52:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=195.181.215.36 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708653152; cv=none; b=A/8CowIhZrrZvf0MVHw3xBuOwjZaQh1FNeHg9F6NsHqBYg7PnJ0SNe6nPwLp8IUJVO1sGWC2IlpM6qVy1tCdWsZJtZQE8KQ4qRRxjl5qKNtqM+Bo467Vn+FpZmtWy4t6tZpA2S5WQ30VIYnY9bk3bSfttdSssws6eCkqzmchDi0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708653152; c=relaxed/simple; bh=Yqk0ASm3qdzudKQuluB7RYak2VVWIt+QMV2iJnIWwSI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=b69RQIRcI+UtGm2hsj08UCb5NzJqjtRzOXVSN1uUm4hIxzMruh5UwCPJmdKw9J8aezHMYYGdL+oRryyno43aX0yqGEHccF7Ua0knIJKBjA14QadD9eEa5RjWq/w8poSp7HnShYclgplr0Rx9ukSJA7yEEEw+YNsHgIHbLrby1Kk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=xff.cz; spf=pass smtp.mailfrom=xff.cz; dkim=pass (1024-bit key) header.d=xff.cz header.i=@xff.cz header.b=CM2gDb4J; arc=none smtp.client-ip=195.181.215.36 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=xff.cz Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=xff.cz DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=xff.cz; s=mail; t=1708653141; bh=Yqk0ASm3qdzudKQuluB7RYak2VVWIt+QMV2iJnIWwSI=; h=From:To:Cc:Subject:Date:References:From; b=CM2gDb4J6ARmclc8F0Pd6/HYlVLC1RR66BJAHV3tN9xR983jyM19FtB022TMlvCiw imCP6PmHAk/6auOxUgYAPT9LDm87bQdV2oGkQwnIM3U4ivCb7LtVucL+RpOu+d6K9W Te/Cr19IHm5uGeoWtGdPnB/ODBsGng96ZwOvu5rE= From: =?utf-8?q?Ond=C5=99ej_Jirman?= To: linux-kernel@vger.kernel.org, Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: Samuel Holland , Chen-Yu Tsai , Jernej Skrabec , Ondrej Jirman , Arnaud Ferraris , linux-sound@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev Subject: [PATCH v2 3/5] ASoC: sun8i-codec: Enable bus clock at STANDBY and higher bias Date: Fri, 23 Feb 2024 02:52:13 +0100 Message-ID: <20240223015219.3618111-4-megi@xff.cz> In-Reply-To: <20240223015219.3618111-1-megi@xff.cz> References: <20240223015219.3618111-1-megi@xff.cz> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1791652766893389942 X-GMAIL-MSGID: 1791652766893389942 From: Samuel Holland For codec variants that have a bus clock, that clock must be running to receive interrupts. Since jack and mic accessory detection should work even when no audio is playing, that means the bus clock should be enabled any time the system is on. Accomplish that by tying the bus clock to the runtime PM state, which is then tied to the bias level not being OFF. Since the codec sets idle_bias_on, bias will generally never be OFF. However, we can set suspend_bias_off to maintain the power savings of gating the bus clock during suspend, when we don't expect jack/accessory detection to work. Signed-off-by: Samuel Holland Signed-off-by: Ondřej Jirman --- sound/soc/sunxi/sun8i-codec.c | 41 ++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/sound/soc/sunxi/sun8i-codec.c b/sound/soc/sunxi/sun8i-codec.c index 7b45ddffe990..2a46b96b03cc 100644 --- a/sound/soc/sunxi/sun8i-codec.c +++ b/sound/soc/sunxi/sun8i-codec.c @@ -177,12 +177,14 @@ struct sun8i_codec_aif { }; struct sun8i_codec_quirks { - bool legacy_widgets : 1; - bool lrck_inversion : 1; + bool bus_clock : 1; + bool legacy_widgets : 1; + bool lrck_inversion : 1; }; struct sun8i_codec { struct regmap *regmap; + struct clk *clk_bus; struct clk *clk_module; const struct sun8i_codec_quirks *quirks; struct sun8i_codec_aif aifs[SUN8I_CODEC_NAIFS]; @@ -197,6 +199,14 @@ static int sun8i_codec_runtime_resume(struct device *dev) struct sun8i_codec *scodec = dev_get_drvdata(dev); int ret; + if (scodec->clk_bus) { + ret = clk_prepare_enable(scodec->clk_bus); + if (ret) { + dev_err(dev, "Failed to enable the bus clock\n"); + return ret; + } + } + regcache_cache_only(scodec->regmap, false); ret = regcache_sync(scodec->regmap); @@ -215,6 +225,9 @@ static int sun8i_codec_runtime_suspend(struct device *dev) regcache_cache_only(scodec->regmap, true); regcache_mark_dirty(scodec->regmap); + if (scodec->clk_bus) + clk_disable_unprepare(scodec->clk_bus); + return 0; } @@ -1277,6 +1290,7 @@ static const struct snd_soc_component_driver sun8i_soc_component = { .num_dapm_routes = ARRAY_SIZE(sun8i_codec_dapm_routes), .probe = sun8i_codec_component_probe, .idle_bias_on = 1, + .suspend_bias_off = 1, .endianness = 1, }; @@ -1299,6 +1313,18 @@ static int sun8i_codec_probe(struct platform_device *pdev) if (!scodec) return -ENOMEM; + scodec->quirks = of_device_get_match_data(&pdev->dev); + + platform_set_drvdata(pdev, scodec); + + if (scodec->quirks->bus_clock) { + scodec->clk_bus = devm_clk_get(&pdev->dev, "bus"); + if (IS_ERR(scodec->clk_bus)) { + dev_err(&pdev->dev, "Failed to get the bus clock\n"); + return PTR_ERR(scodec->clk_bus); + } + } + scodec->clk_module = devm_clk_get(&pdev->dev, "mod"); if (IS_ERR(scodec->clk_module)) { dev_err(&pdev->dev, "Failed to get the module clock\n"); @@ -1311,17 +1337,14 @@ static int sun8i_codec_probe(struct platform_device *pdev) return PTR_ERR(base); } - scodec->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "bus", base, - &sun8i_codec_regmap_config); + scodec->regmap = devm_regmap_init_mmio(&pdev->dev, base, + &sun8i_codec_regmap_config); if (IS_ERR(scodec->regmap)) { dev_err(&pdev->dev, "Failed to create our regmap\n"); return PTR_ERR(scodec->regmap); } - scodec->quirks = of_device_get_match_data(&pdev->dev); - - platform_set_drvdata(pdev, scodec); - + regcache_cache_only(scodec->regmap, true); pm_runtime_enable(&pdev->dev); if (!pm_runtime_enabled(&pdev->dev)) { ret = sun8i_codec_runtime_resume(&pdev->dev); @@ -1357,11 +1380,13 @@ static void sun8i_codec_remove(struct platform_device *pdev) } static const struct sun8i_codec_quirks sun8i_a33_quirks = { + .bus_clock = true, .legacy_widgets = true, .lrck_inversion = true, }; static const struct sun8i_codec_quirks sun50i_a64_quirks = { + .bus_clock = true, }; static const struct of_device_id sun8i_codec_of_match[] = {