From patchwork Wed Jan 10 00:48:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kuninori Morimoto X-Patchwork-Id: 10153735 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 600F6602CA for ; Wed, 10 Jan 2018 00:49:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 525E326B41 for ; Wed, 10 Jan 2018 00:49:23 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 468F626E40; Wed, 10 Jan 2018 00:49:23 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.8 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED, RCVD_IN_DNSWL_NONE, T_DKIM_INVALID autolearn=no version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id ABF3F26B41 for ; Wed, 10 Jan 2018 00:49:21 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 8C92A2676AF; Wed, 10 Jan 2018 01:49:18 +0100 (CET) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 4BA032676B0; Wed, 10 Jan 2018 01:49:16 +0100 (CET) Received: from relmlie2.idc.renesas.com (relmlor3.renesas.com [210.160.252.173]) by alsa0.perex.cz (Postfix) with ESMTP id 3D38F2674CE for ; Wed, 10 Jan 2018 01:49:02 +0100 (CET) Received: from unknown (HELO relmlir2.idc.renesas.com) ([10.200.68.152]) by relmlie2.idc.renesas.com with ESMTP; 10 Jan 2018 09:48:59 +0900 Received: from relmlii2.idc.renesas.com (relmlii2.idc.renesas.com [10.200.68.66]) by relmlir2.idc.renesas.com (Postfix) with ESMTP id DB9FD4E91D; Wed, 10 Jan 2018 09:48:59 +0900 (JST) X-IronPort-AV: E=Sophos;i="5.46,337,1511794800"; d="scan'208";a="269079902" Received: from mail-pu1apc01lp0024.outbound.protection.outlook.com (HELO APC01-PU1-obe.outbound.protection.outlook.com) ([65.55.88.24]) by relmlii2.idc.renesas.com with ESMTP/TLS/AES256-GCM-SHA384; 10 Jan 2018 09:48:58 +0900 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=renesasgroup.onmicrosoft.com; s=selector1-renesas-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=k5ah0iqVOEYrKWT6MO/XtKYbZfvBKm3RoigLDxRUO9Q=; b=YsG7b/KXN2AWyPKXjNwZBXekgTa3SYWc8CaxVCJLR/sDZQ5h71taL8PZBwWECUaMe4QYorbEEmvsBBeyRDgis4vDOLrfMS7KSx9SlzLySUpj6NLeBSY00UVL3ArjXLrtvU2g2Ldzf7lfaL/rARLvVaXYOPpog9jbE6Dq4zF1k2A= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=kuninori.morimoto.gx@renesas.com; Received: from morimoto-PC.renesas.com (211.11.155.138) by HK2PR0601MB1876.apcprd06.prod.outlook.com (2603:1096:202:a::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.386.5; Wed, 10 Jan 2018 00:48:54 +0000 Message-ID: <87wp0qleto.wl%kuninori.morimoto.gx@renesas.com> From: Kuninori Morimoto User-Agent: Wanderlust/2.15.9 Emacs/24.3 Mule/6.0 To: Mark Brown MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Date: Wed, 10 Jan 2018 00:48:54 +0000 X-Originating-IP: [211.11.155.138] X-ClientProxiedBy: OS2PR01CA0140.jpnprd01.prod.outlook.com (2603:1096:602::34) To HK2PR0601MB1876.apcprd06.prod.outlook.com (2603:1096:202:a::20) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 70225acc-7abf-4d00-5b8d-08d557c3edd3 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(48565401081)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:HK2PR0601MB1876; X-Microsoft-Exchange-Diagnostics: 1; HK2PR0601MB1876; 3:ptV+L7aw4gMiVuzkdmRta1Pdns8tnEPVorZ4399zGA8MlEszn40unldBWnbW3gvG/TrsL96fecrot3GQq90yHsxWbyXp0Ta+1GU3+1/3by0Tt112IoB8/K+CS3NqWk/dy5pvmWV7g1eOpHlv7dipwRhusVERpUJvKEe7HSRhcqu3/ukWkrD7JHwABdJMIZXoTkjvtgvhoCkVeovJ2h+RbMugf126MtiRzSjiyWe4zu9Qx3edCjSUnGFDCYY3rU9F; 25:HLvRhl91vwdY9gA8XKIN3uxPOBLZisTyVaGhsmEu27gPUrRGjdv3OHBspoNohpcYhYNsyHefA4vbzF3LOQn0tJ6ITHF2mNMeEdnJcjg3YoDBMRBk7RhrvWCin7XbxLB+5jY7gCwdaatxCExEqpaIYRYeMW1xdePlTJPmfM7huC3617uLbErAdgyLf0czPu+d+X9gHGZaOQgh7tZn5VUBY85wXeFcXBDm3rBtbAGcHmgD8e9bTcAOHyZriEfaT/j36+LuYdxQ+dgBTq4f27DdCJEFf6Siz5PT747Q+Jd1UkHrLTgf8ToWyWYhCqT1UbMszh7zAQbrxQNMuCUytjBLcw==; 31:Dq4POmelYAxzYfp3cQoHWDIrQqUvep8OvmjiCp+YRroAYBjEtUmZPv5BaKuLQGh18epHSo98Ds9TGN9jWeQnlTCw0teMqnW5y19cuqqSd2x3zMa9rVLN9DhgzhKjJLX1M2RBDN1R5AGmc0HgbdNPxmJ0WRUD+pbYCTVrwmY9fN0sGL8P1gg4qQcm/XWYbtYZn4uA/cQk0z1i1LhySstjlLt/p26R4BQCz5nR3h+zJbs= X-MS-TrafficTypeDiagnostic: HK2PR0601MB1876: X-Microsoft-Exchange-Diagnostics: 1; HK2PR0601MB1876; 20:df+CR4Mx9ehSac7QXZQx3A/ixDv2kOaqVOE6C9Vv2SUjGmlBGUU40w2cB85qHaMYH37HAbE+Jq781SqF59Ad5IsKAVQr9+R+ZAzK/DAtXStOcAPfsPBAPvLPu8YduMeu5+xrH42E4bHW4kN5egdZSCbICBlkTtBnfOqN737I27/y5gvJDIUaIUMnhR0C5C42V+g7MYGmDwP4mqojq5UvRlJvkpkrp0gVnaLU6k/QLIg8km2TJhZbeeX0JW3ibkwA8PrVk8/phnMThcQNKr53JMUmRpF86EalddWV4TLxTIfop9oWhnKaYeT5/IsN42+QO2G8sxZqobW6wGca0DcN3UxMMm1HdbMBl1FCpPxqEkDyIwnbu+O7FqNjwiF+oe9gXoR3316Y0KOHkXSiEyLVVlfAbBD5JBuEDA12NKZYuHEUlxNP6FHGwKEU+Pioq+QWzplC+R6TIapLimGWnYCUIVxoMkmF3hN73XZ8rqo3gvBslSCvK/KtgmL+EEFl/2cK; 4:yLw44ZzCX+OB3wkdcMIc19Iw8tsyCtIivISaulbu3m2iJBrApGZ5St+2frVh5G4MbDHZ6sWixo8qpBEbEKUpiWirfBk6m3vYFGSGKgmc9MnzzlopGPDqnhYkl4erKtoEvfl3Ng2mMd5/dJ35GQiZh8DMLPtEOr112hmBpcLQnHHNlMuRHm+SvNlsYeOTj+UvfF6uj1IDtshOHfmRPbPJPoYziwHDLaUrbEGCAKVCkOrYH+XAEHWeyIL+fGkFxXu9XAU8iUzQ7PA57NqpjHCQzg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(2401047)(5005006)(8121501046)(10201501046)(3002001)(93006095)(93001095)(3231023)(944501075)(6055026)(6041268)(20161123560045)(20161123562045)(20161123558120)(20161123564045)(201703131423095)(201703061421075)(201703161042150)(6042181)(6072148)(201708071742011); SRVR:HK2PR0601MB1876; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:HK2PR0601MB1876; X-Forefront-PRVS: 0548586081 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(366004)(189003)(199004)(59450400001)(6486002)(386003)(6916009)(36756003)(69596002)(4326008)(106356001)(8936002)(498600001)(105586002)(97736004)(58126008)(52116002)(7736002)(53416004)(25786009)(8676002)(6116002)(7696005)(81166006)(81156014)(305945005)(50466002)(83506002)(16586007)(3846002)(47776003)(86362001)(68736007)(16526018)(5660300001)(53936002)(23726003)(66066001)(54906003)(2906002)(16060500001); DIR:OUT; SFP:1102; SCL:1; SRVR:HK2PR0601MB1876; H:morimoto-PC.renesas.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: renesas.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HK2PR0601MB1876; 23:teLJ6Zr1ofYmnnKduaKAWQ9H/eP8JdrVxso4ZjV?= =?us-ascii?Q?CbMC2SOT6wuabjNL/qEogi9FkhFbpXfR6pU0WBfLHfN8jjKvIHjy9unPJmMb?= =?us-ascii?Q?CStAOKUCYKCTEGnNj6xCtFGjUVHaEP7HAQh6wCV176drLlbiMIuh/ei9xKV2?= =?us-ascii?Q?zkB9wduJyNep4duZ72K4dLXjrDPiiEvYP7Y6VlBOQ/B5jcE3VfT+XCrJvoZK?= =?us-ascii?Q?v7TwdP+Jg4fYnb5KKe3UW/tXf1AEZnaTnmU+euUfHtZ8Vv2mvgMxHQNNQWGK?= =?us-ascii?Q?v6PF4MU63PIR83KeT6AtHZxgOe+Lg0X6wGHjOY4sNTHJzS7lioZ2TW3ulIwr?= =?us-ascii?Q?ilXsKBIR7vVP3AVAppVD8HGQ70bxXtpGhFZ6s29AR02cXuLI+3D0YX8fFMdr?= =?us-ascii?Q?8NXb/CG2yllu2M2hGVs3Et5I4TdaYF+C/qmSTk65nsVG4haP9Hsgi93sBzz9?= =?us-ascii?Q?1oUF2Pkf2rNbJiwe0d+eaFc9yA9XlVWIpHInBDYZur3doTQLC8uNZxJUIy1E?= =?us-ascii?Q?/9Jt9x3q0eaviJjHKAI3gI/02JVmCATiEo4DfeXD84/dqpwBJ6Wcs268lce3?= =?us-ascii?Q?zFrO2x5nh2AGTcLd6OEBMBU2UkaXNe88fawpGqboLM41h2Dw1wro+iDrRJxL?= =?us-ascii?Q?EMaHeer9LHxRxGsq+pfhdhXXvwosXD2YvsVxv0bPUAbtDbjB8pz3OnZxI1oL?= =?us-ascii?Q?BnNmJt7srGS2emzvY3o83JXFg0k2tfpPqZh7PZqW5DufUjLjevvp+EePBTgJ?= =?us-ascii?Q?/JNOAFKiloWnc8HkVqQOvsVGag/K9IVX3znvigZRtr5FocGYnYZUXnyX61rx?= =?us-ascii?Q?t83o4IZy4eGa6pRdehkN2rG/OpQS3Y+BWOlePWmuxMl5PY/UTIj71yaUnmCd?= =?us-ascii?Q?oGhHeYonV0oqySFCAijb++niMGPQZD1j/lKvesH+A5FtaEN1seTNxxq0CQX+?= =?us-ascii?Q?H+IrEu80Tp+WvASoN+6/vFcQIEI0Ohw/72yYcTGZLNGxFOxQTrkp6Co3hdL8?= =?us-ascii?Q?S71M=3D?= X-Microsoft-Exchange-Diagnostics: 1; HK2PR0601MB1876; 6:fe98c7rYjDew1Ab1av34pYipaYWet7PVwFM3oU17ZQ6n0wxZkuaKLM0JXmM3dCI9OTC4vMDFhKdU8Du5BbiWF6qyrRa1XLf8k2AxJ20Z2/ClozHyWJsd98Jk5JA3orUI46ExzHeO5XIfvkrft/lmuJ5qvm7xllfg6sOVNyamA+D79NM2tdHxwdQpQpo3X2yg89cqYL1p/frpfueKOhh6WQ+vL5t5ft2s5pvIiG82bZk4fmNmzl4dABJHpgDMT4Jp7CFMma6rOdzubgOo+Fu6DxaZYJqyHfHHhkSQIGVRGsp4wxqHcpm8tpfcb+MKjz8qGH1JTGT3MBdrW3IhibFjLjfQkEArRHc6FHAmRBlOGjg=; 5:pNbqH16SCjjwgrSWAV0YRCdN3ab8QK0TcKV9WDID8YesvOHmsmuQ2QulYMgJrrLnu/V8HU2mWZ3pSytnvVjQGgSrZ+H6x4G8TDmxemzmA9eTnAYybgWsJTwZo1LBxIQhc3XMdDMx965OKA3LgJnaWywO8dn30mgRJ9XLT8FW/Io=; 24:efZ0s3RN34DqzFCw6yVhZWa2CYENjnYTmBZMK1+rqa5TqvZjEhJodxnvye/6c6Q0jmB4tnBekNlHv3DhUWXjS8owK9yrl0ch3CgACZD8/wE=; 7:9qE2+nyMdcynB8oNnDQcbdrKwnk+HYmh+a5hiMWAk5rfkkSfeGZgzN2utyVQWnRCrVY5dkqI1eAbrDhVyH3zKIrgcGaHPZjWY1h+1aFpBolailBGfhYacQl+mTeUJhiA+poZHmIvZuWCz3bFY2vBMdIf7Kwt8/g3WBu7u3N9nw2MwAA8k8p7CDLAh/1GihFkHETwIIZS9J4fd24Z64tju+NhB/BXqYgBv25O8coad1JN9x3Yog8FAnPcTctZjr55 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; HK2PR0601MB1876; 20:TSHNDyMQYmVlcsYfFm2wy8Je+G9NtrgRCyl9VZz6LgETp5WcYKxi1KRJKl8+29KYJEwhX51o1I51QRzOtb8aVJu2ZaLBVmIRJ5cXVASsEWhZ9syisT8hUvQ9vGqNfgz+9Y6TmzBvEHjaH5+vtOXJpX2w7JM+jHIZ+MLEE+m+GHY= X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Jan 2018 00:48:54.8084 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 70225acc-7abf-4d00-5b8d-08d557c3edd3 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 53d82571-da19-47e4-9cb4-625a166a4a2a X-MS-Exchange-Transport-CrossTenantHeadersStamped: HK2PR0601MB1876 Cc: Linux-ALSA , Simon Subject: [alsa-devel] [PATCH v5][RESEND] ASoC: ak4613: call dummy write for PW_MGMT1/3 when Playback X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: Kuninori Morimoto Power Down Release Command (PMVR, PMDAC, RSTN, PMDA1-PMDA6) which are located on PW_MGMT1 / PW_MGMT3 register must be write again after at least 5 LRCK cycle or later on each command. Otherwise, Playback volume will be 0dB. Basically, it should be 1. PowerDownRelease by Power Management1 <= call 1.x after 5LRCK 1.x Dummy write to Power Management1 2. PowerDownRelease by Power Management3 <= call 2.x after 5LRCK 2.x Dummy write to Power Management3 To avoid too many dummy write, this patch is merging these. 1. PowerDownRelease by Power Management1 2. PowerDownRelease by Power Management3 <= call after 5LRCK 2.x Dummy write to Power Management1/3 <= merge dummy write This patch adds dummy write when Playback Start timing. Signed-off-by: Kuninori Morimoto --- 2week passed. resend sound/soc/codecs/ak4613.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/sound/soc/codecs/ak4613.c b/sound/soc/codecs/ak4613.c index ee9e822..d85c61e 100644 --- a/sound/soc/codecs/ak4613.c +++ b/sound/soc/codecs/ak4613.c @@ -15,6 +15,7 @@ */ #include +#include #include #include #include @@ -95,6 +96,9 @@ struct ak4613_priv { struct mutex lock; const struct ak4613_interface *iface; struct snd_pcm_hw_constraint_list constraint; + struct work_struct dummy_write_work; + struct snd_soc_component *component; + unsigned int rate; unsigned int sysclk; unsigned int fmt; @@ -392,6 +396,7 @@ static int ak4613_dai_hw_params(struct snd_pcm_substream *substream, default: return -EINVAL; } + priv->rate = rate; /* * FIXME @@ -467,11 +472,83 @@ static int ak4613_set_bias_level(struct snd_soc_component *component, return 0; } +static void ak4613_dummy_write(struct work_struct *work) +{ + struct ak4613_priv *priv = container_of(work, + struct ak4613_priv, + dummy_write_work); + struct snd_soc_component *component = priv->component; + unsigned int mgmt1; + unsigned int mgmt3; + + /* + * PW_MGMT1 / PW_MGMT3 needs dummy write at least after 5 LR clocks + * + * Note + * + * To avoid extra delay, we want to avoid preemption here, + * but we can't. Because it uses I2C access which is using IRQ + * and sleep. Thus, delay might be more than 5 LR clocks + * see also + * ak4613_dai_trigger() + */ + udelay(5000000 / priv->rate); + + snd_soc_component_read(component, PW_MGMT1, &mgmt1); + snd_soc_component_read(component, PW_MGMT3, &mgmt3); + + snd_soc_component_write(component, PW_MGMT1, mgmt1); + snd_soc_component_write(component, PW_MGMT3, mgmt3); +} + +static int ak4613_dai_trigger(struct snd_pcm_substream *substream, int cmd, + struct snd_soc_dai *dai) +{ + struct snd_soc_codec *codec = dai->codec; + struct ak4613_priv *priv = snd_soc_codec_get_drvdata(codec); + + /* + * FIXME + * + * PW_MGMT1 / PW_MGMT3 needs dummy write at least after 5 LR clocks + * from Power Down Release. Otherwise, Playback volume will be 0dB. + * To avoid complex multiple delay/dummy_write method from + * ak4613_set_bias_level() / SND_SOC_DAPM_DAC_E("DACx", ...), + * call it once here. + * + * But, unfortunately, we can't "write" here because here is atomic + * context (It uses I2C access for writing). + * Thus, use schedule_work() to switching to normal context + * immediately. + * + * Note + * + * Calling ak4613_dummy_write() function might be delayed. + * In such case, ak4613 volume might be temporarily 0dB when + * beggining of playback. + * see also + * ak4613_dummy_write() + */ + + if ((cmd != SNDRV_PCM_TRIGGER_START) && + (cmd != SNDRV_PCM_TRIGGER_RESUME)) + return 0; + + if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK) + return 0; + + priv->component = &codec->component; + schedule_work(&priv->dummy_write_work); + + return 0; +} + static const struct snd_soc_dai_ops ak4613_dai_ops = { .startup = ak4613_dai_startup, .shutdown = ak4613_dai_shutdown, .set_sysclk = ak4613_dai_set_sysclk, .set_fmt = ak4613_dai_set_fmt, + .trigger = ak4613_dai_trigger, .hw_params = ak4613_dai_hw_params, }; @@ -591,6 +668,7 @@ static int ak4613_i2c_probe(struct i2c_client *i2c, priv->iface = NULL; priv->cnt = 0; priv->sysclk = 0; + INIT_WORK(&priv->dummy_write_work, ak4613_dummy_write); mutex_init(&priv->lock);