From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S941440AbcIZN3m (ORCPT ); Mon, 26 Sep 2016 09:29:42 -0400 Received: from mail1.bemta3.messagelabs.com ([195.245.230.166]:22706 "EHLO mail1.bemta3.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S935875AbcIZN3h (ORCPT ); Mon, 26 Sep 2016 09:29:37 -0400 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpjleJIrShJLcpLzFFi42KJ27nUWHej0st wg8e7mCyuXDzEZDH14RM2i5vvnjNZfLvSwWRxedccNovOXf2sFqvfLGCx2PB9LaNF4+u5rA6c Hhs+N7F5zG64yOKxc9Zddo/Fe14yeWxa1cnmse/tMjaPv7P2s3is33KVxePzJrkAzijWzLyk/ IoE1oyDHa1sBevFKw4tfsTWwPhDuIuRi0NIYD2jxKJd+9m6GDmBnAqJq9vuMIPYvAKZElce/W MCsTkF3CWWfr7IClHjJnF98hMwm03AQmLyiQdgvSwCqhKNk+8zgtjCAl4S5x9MYwVZICLQxSi x+tVjdhCHWeA/o8TmkwtZIDYISpyc+QTMZhaQkDj44gUzxAYDidMLGsHiEgL2EtPfXwWKcwDZ +hKNx2IhwoYS32d9gyoxl9hz/j7TBEbBWUimzkIydQEj0ypGjeLUorLUIl0jM72kosz0jJLcx MwcXUMDY73c1OLixPTUnMSkYr3k/NxNjMD4qWdgYNzB2LDX7xCjJAeTkiivntzLcCG+pPyUyo zE4oz4otKc1OJDjDIcHEoSvO8UgXKCRanpqRVpmTnASIZJS3DwKInwcgOjWYi3uCAxtzgzHSJ 1ilFRSpx3D0ifAEgiozQPrg2WPC4xykoJ8zIyMDAI8RSkFuVmlqDKv2IU52BUEuaVABnPk5lX Ajf9FdBiJqDFS0+8AFlckoiQkmpgnM3VeUxj/+t/2xvFblqdXlNxSjxJYc1Z/1thW4tFT0cZn ju5oo3x6spsq0l/ijh7Iue1B/MqLP9ztH/v/XXqV940OXTybuy/0RMZ9c/y3630BL3eBZmiIV 5Coet/3vnOc+26/qG2+Yy5m/Y0Fek+fl+88dyNVdZGGrorFr9ewsjjGP6g7OsfWSWW4oxEQy3 mouJEANlr544ZAwAA X-Env-Sender: Adam.Thomson.Opensource@diasemi.com X-Msg-Ref: server-11.tower-217.messagelabs.com!1474896560!47046753!1 X-Originating-IP: [94.185.165.51] X-StarScan-Received: X-StarScan-Version: 8.84; banners=-,-,- X-VirusChecked: Checked Message-ID: <4c191834ee78d57c9e9d60b758d9ef767a47a523.1474896038.git.Adam.Thomson.Opensource@diasemi.com> In-Reply-To: References: From: Adam Thomson Date: Mon, 26 Sep 2016 14:29:20 +0100 Subject: [PATCH 1/2] ASoC: da7219: Reset codec gracefully, if still active To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai CC: Support Opensource , , , Sathyanarayana Nujella , Xing Zheng , Hsin-Yu Chao MIME-Version: 1.0 Content-Type: text/plain X-KSE-AttachmentFiltering-Interceptor-Info: protection disabled X-KSE-ServerInfo: sw-ex-cashub01.diasemi.com, 9 X-KSE-Antivirus-Interceptor-Info: scan successful X-KSE-Antivirus-Info: Clean, bases: 26/09/2016 10:27:00 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently the reset code in i2c_probe only resets the AAD part of the device and not the entire codec. This patch updates the driver to resolve this and ensures that if the codec is still active from a previous boot then the audio paths are powered down prior to reset. Signed-off-by: Adam Thomson --- sound/soc/codecs/da7219.c | 30 +++++++++++++++++++++++++++--- sound/soc/codecs/da7219.h | 5 +++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/sound/soc/codecs/da7219.c b/sound/soc/codecs/da7219.c index 9d08c11..eecb6d6 100644 --- a/sound/soc/codecs/da7219.c +++ b/sound/soc/codecs/da7219.c @@ -1925,7 +1925,8 @@ static int da7219_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct da7219_priv *da7219; - int ret; + unsigned int system_active, system_status; + int i, ret; da7219 = devm_kzalloc(&i2c->dev, sizeof(struct da7219_priv), GFP_KERNEL); @@ -1941,14 +1942,37 @@ static int da7219_i2c_probe(struct i2c_client *i2c, return ret; } - /* Software reset codec. */ + regcache_cache_bypass(da7219->regmap, true); + + /* Disable audio paths if still active from previous start */ + regmap_read(da7219->regmap, DA7219_SYSTEM_ACTIVE, &system_active); + if (system_active) { + regmap_write(da7219->regmap, DA7219_GAIN_RAMP_CTRL, + DA7219_GAIN_RAMP_RATE_NOMINAL); + regmap_write(da7219->regmap, DA7219_SYSTEM_MODES_INPUT, 0x00); + regmap_write(da7219->regmap, DA7219_SYSTEM_MODES_OUTPUT, 0x01); + + for (i = 0; i < DA7219_SYS_STAT_CHECK_RETRIES; ++i) { + regmap_read(da7219->regmap, DA7219_SYSTEM_STATUS, + &system_status); + if (!system_status) + break; + + msleep(DA7219_SYS_STAT_CHECK_DELAY); + } + } + + /* Soft reset codec */ regmap_write_bits(da7219->regmap, DA7219_ACCDET_CONFIG_1, DA7219_ACCDET_EN_MASK, 0); regmap_write_bits(da7219->regmap, DA7219_CIF_CTRL, - DA7219_CIF_REG_SOFT_RESET_MASK, 0); + DA7219_CIF_REG_SOFT_RESET_MASK, + DA7219_CIF_REG_SOFT_RESET_MASK); regmap_write_bits(da7219->regmap, DA7219_SYSTEM_ACTIVE, DA7219_SYSTEM_ACTIVE_MASK, 0); + regcache_cache_bypass(da7219->regmap, false); + ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_da7219, &da7219_dai, 1); if (ret < 0) { diff --git a/sound/soc/codecs/da7219.h b/sound/soc/codecs/da7219.h index 545576d..f1b3ad8 100644 --- a/sound/soc/codecs/da7219.h +++ b/sound/soc/codecs/da7219.h @@ -578,6 +578,7 @@ #define DA7219_GAIN_RAMP_RATE_SHIFT 0 #define DA7219_GAIN_RAMP_RATE_MASK (0x3 << 0) #define DA7219_GAIN_RAMP_RATE_X8 (0x0 << 0) +#define DA7219_GAIN_RAMP_RATE_NOMINAL (0x1 << 0) #define DA7219_GAIN_RAMP_RATE_MAX 4 /* DA7219_PC_COUNT = 0x94 */ @@ -772,6 +773,10 @@ /* SRM */ #define DA7219_SRM_CHECK_RETRIES 8 +/* System Controller */ +#define DA7219_SYS_STAT_CHECK_RETRIES 6 +#define DA7219_SYS_STAT_CHECK_DELAY 50 + enum da7219_clk_src { DA7219_CLKSRC_MCLK = 0, DA7219_CLKSRC_MCLK_SQR, -- 1.9.3