Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp1546313pxa; Sun, 23 Aug 2020 07:05:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwA2EI9aM2/BNf2LjEa2rxSnJksmBAMrX3tsgDZz7EfXLtSiZEp9FcSoqrXqDpkKRYW8wi9 X-Received: by 2002:a17:906:528d:: with SMTP id c13mr1619849ejm.61.1598191525123; Sun, 23 Aug 2020 07:05:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598191525; cv=none; d=google.com; s=arc-20160816; b=n67kNYA4XoZGIP/hQlBRIB0qyYYhx4kG61MEiUuJ0uE3i7VUAu/aUU4XaGJ4WV4twG gNe5TUGIPz3e2qWa4daylv/++A9YM1Ycy/H7by0r07LzitxoPoHimZ+/9hdaBAGiKC6+ 9FImUY+TpHUdf0GBjizcaqFXtqNyJdw1pBqWHqZNrroAFaEPYNRsJRDXYpcqfNFMl/kQ lcXnoxGi6Htr3IIBF0vZJ+ly8rjU92jfAKo+kFioXU73rJpTSzP7LZaMpXSvL13ovDHn xx2sdSuKPSj41KHwTkxii8rAA4L+QJSloyG5QhdZYYA0KlupOoxeyc2irIS1JabJ+Am2 6y3w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:to:from; bh=HVA6s0G5U9B53vBFX/tFhg77MTlGjI/0ajqWB0oVy5A=; b=Q1hNFspdM91j5K76lh9b4vxLSqN9txHzAdwO3ENfksV8axG/iTkspF9JNb315qDNbY pEpZZiFwJTseBqCKXwTXj9YHzB1K4qJMqnu/EbcCdRznvjfOVPchAU7A8WqFRbmpBokN XgrSdWobDPElftxp8a2z1y6eaABTsl3iptuHrKG/BxxYUnLSC75FVd76+HbiYrKc5Bpr 5pEeUUlJO9yjKX1DQOc4tde3N/sxIWVT0x7qIQhY8giPgwL+kJipe1Ox+stVNJ5Mr7Yy ruIAhRNid0DstesawhF4HvRyUw1IS5xaybCjoATm/vS2jbw2eRWpwsxQ2Xjb6RV2eF/o LVjA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id t21si5993760edi.213.2020.08.23.07.05.01; Sun, 23 Aug 2020 07:05:25 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726782AbgHWOAS (ORCPT + 99 others); Sun, 23 Aug 2020 10:00:18 -0400 Received: from inva020.nxp.com ([92.121.34.13]:44900 "EHLO inva020.nxp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726345AbgHWOAQ (ORCPT ); Sun, 23 Aug 2020 10:00:16 -0400 Received: from inva020.nxp.com (localhost [127.0.0.1]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 734AF1A0924; Sun, 23 Aug 2020 16:00:14 +0200 (CEST) Received: from invc005.ap-rdc01.nxp.com (invc005.ap-rdc01.nxp.com [165.114.16.14]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 14F221A0804; Sun, 23 Aug 2020 16:00:11 +0200 (CEST) Received: from 10.192.242.69 (shlinux2.ap.freescale.net [10.192.224.44]) by invc005.ap-rdc01.nxp.com (Postfix) with ESMTP id E3011402E2; Sun, 23 Aug 2020 16:00:06 +0200 (CEST) From: Shengjiu Wang To: lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org, robh+dt@kernel.org, devicetree@vger.kernel.org Subject: [PATCH 2/2] ASoC: ak5558: Add regulator support Date: Sun, 23 Aug 2020 21:54:37 +0800 Message-Id: <1598190877-9213-2-git-send-email-shengjiu.wang@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1598190877-9213-1-git-send-email-shengjiu.wang@nxp.com> References: <1598190877-9213-1-git-send-email-shengjiu.wang@nxp.com> X-Virus-Scanned: ClamAV using ClamSMTP Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org "AVDD" is for analog power supply, "DVDD" is for digital power supply, they can improve the power management. As the regulator is enabled in pm runtime resume, which is behind the component driver probe, so accessing registers in component driver probe will fail. Fix this issue by enabling regcache_cache_only after pm_runtime_enable. Signed-off-by: Shengjiu Wang --- sound/soc/codecs/ak5558.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/sound/soc/codecs/ak5558.c b/sound/soc/codecs/ak5558.c index 8179512129d3..2f076d5ee284 100644 --- a/sound/soc/codecs/ak5558.c +++ b/sound/soc/codecs/ak5558.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -22,8 +23,15 @@ #include "ak5558.h" +#define AK5558_NUM_SUPPLIES 2 +static const char *ak5558_supply_names[AK5558_NUM_SUPPLIES] = { + "DVDD", + "AVDD", +}; + /* AK5558 Codec Private Data */ struct ak5558_priv { + struct regulator_bulk_data supplies[AK5558_NUM_SUPPLIES]; struct snd_soc_component component; struct regmap *regmap; struct i2c_client *i2c; @@ -299,12 +307,22 @@ static int __maybe_unused ak5558_runtime_suspend(struct device *dev) regcache_cache_only(ak5558->regmap, true); ak5558_power_off(ak5558); + regulator_bulk_disable(ARRAY_SIZE(ak5558->supplies), + ak5558->supplies); return 0; } static int __maybe_unused ak5558_runtime_resume(struct device *dev) { struct ak5558_priv *ak5558 = dev_get_drvdata(dev); + int ret; + + ret = regulator_bulk_enable(ARRAY_SIZE(ak5558->supplies), + ak5558->supplies); + if (ret != 0) { + dev_err(dev, "Failed to enable supplies: %d\n", ret); + return ret; + } ak5558_power_off(ak5558); ak5558_power_on(ak5558); @@ -350,6 +368,7 @@ static int ak5558_i2c_probe(struct i2c_client *i2c) { struct ak5558_priv *ak5558; int ret = 0; + int i; ak5558 = devm_kzalloc(&i2c->dev, sizeof(*ak5558), GFP_KERNEL); if (!ak5558) @@ -367,6 +386,16 @@ static int ak5558_i2c_probe(struct i2c_client *i2c) if (IS_ERR(ak5558->reset_gpiod)) return PTR_ERR(ak5558->reset_gpiod); + for (i = 0; i < ARRAY_SIZE(ak5558->supplies); i++) + ak5558->supplies[i].supply = ak5558_supply_names[i]; + + ret = devm_regulator_bulk_get(&i2c->dev, ARRAY_SIZE(ak5558->supplies), + ak5558->supplies); + if (ret != 0) { + dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret); + return ret; + } + ret = devm_snd_soc_register_component(&i2c->dev, &soc_codec_dev_ak5558, &ak5558_dai, 1); @@ -374,6 +403,7 @@ static int ak5558_i2c_probe(struct i2c_client *i2c) return ret; pm_runtime_enable(&i2c->dev); + regcache_cache_only(ak5558->regmap, true); return 0; } -- 2.27.0