From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933472AbdDEN1T (ORCPT ); Wed, 5 Apr 2017 09:27:19 -0400 Received: from mail-eopbgr40065.outbound.protection.outlook.com ([40.107.4.65]:15248 "EHLO EUR03-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932212AbdDEN1B (ORCPT ); Wed, 5 Apr 2017 09:27:01 -0400 Authentication-Results: alsa-project.org; dkim=none (message not signed) header.d=none;alsa-project.org; dmarc=none action=none header.from=nxp.com; From: Daniel Baluta To: CC: , , , , , , , , , Subject: [PATCH v2 1/2] ASoC: codec: wm9860: Refactor PLL out freq search Date: Wed, 5 Apr 2017 16:26:37 +0300 Message-ID: <1491398798-27829-2-git-send-email-daniel.baluta@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1491398798-27829-1-git-send-email-daniel.baluta@nxp.com> References: <1491398798-27829-1-git-send-email-daniel.baluta@nxp.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [192.88.146.1] X-ClientProxiedBy: HE1PR0701CA0058.eurprd07.prod.outlook.com (10.168.191.26) To DBXPR04MB511.eurprd04.prod.outlook.com (10.141.233.16) X-MS-Office365-Filtering-Correlation-Id: 60097ae6-fcdd-482b-d10a-08d47c276cca X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081)(201703131423075)(201703031133081);SRVR:DBXPR04MB511; X-Microsoft-Exchange-Diagnostics: 1;DBXPR04MB511;3:pMCFpKETNxMchnAfZrAXXkJQ728iXmPMNlSalXKbYC2ptZ5l7mIOWpMTyFHnLKSZqN0Zdvw1xf/FXhiJwDY2G70R5j6W2lIaY6yPpFwnhKF3RnBL1TduK2b86r01vVD4bAuFcfp9/nN3JqJ67HNjEnjWuvZ0U+lUe3hzSYFtki9EwRpfZcp3hDrmmUw1++xw9xk7jlLn/ZK4xIwHzm21ncPCotzfaUgyeUlK1cIpoojowgbvmQ19LYKFLbQE4AOnpZ6NTF92Wa2QpLW9+SkB95/GETLYzQNPOtq2KRS3r9PTHokKaxZiLN5mKZV23zpz732j1XI8r2lisasl9dPd33ja3NbUFD7bqeRXTbD4pkQ=;25:yWtZHpzh9EGXRARb+mQw913Dw63ckFPbGzRQZHi279RKOzH5ScDrIKY0y73W0gEx0eEbyT4YUmL51Q6YVk0uXG4HQ6tmhGO3KQuZaS3UntS2vrXhO9e30Z2llnL3/Hy4L04Ma07S5fBjdb3H7feVePi00S9bEVotaGGrJAYvB3yfgcYfkZ3qxoYAKU53oJLgzA/knf+huP2cakIRa4+hE1bj7LhkmW0snUtiRYg38bIAKxmQqVxKjPC3Aq18jRmci5IdzdfepNt6stxhosq9/YJZYP/R+BjshW5yTK/3NoexYiZSrEIqOVvEGoMBcf/dGn3aUKR9FrriaCun3SpTxQSCEcexp4036R9gq8OzQDe1DR/R4n0eWxbh4jngzdZhsGQZI1eFB2o14wwPPF0+suaC7Qqs1wiymoOqYfMaFjO0X30l5LEjjbEb5/9ypg6JPvAiHotod18nt7LGkWZAAg== X-Microsoft-Exchange-Diagnostics: 1;DBXPR04MB511;31:88Tc3rr2oSAwzhxqHJM/OvcSo8SJoTV7vwkVebEUlc9JuiA/pvr6vuvb3n/w8g9jGdPbGLbNW/hknlM3K5hubeAnDIZRvKnqNQEG40wO6L0aIysYTdds+XsYmxd+1qmOIolwYFYpMRhMwzn4MsBwDsiHziJlCrjg6Kn9+yZczBRCrAgDU8OB+I3YjcGh8fSbQvwMl7IgKvO7AvL1t7rrW2CALYRHYBWdg8Q7tTCFWhXUcFA5Sq0jiM4P2GeopVNA;20:4frYJiTwgR38APBEJqec5nNkH09n9tkH9N1teaPyjF5ySSYvl3Pk/LlSUBFleq4sKCXZOEf0PqJK/AZthbYNIIP1oU8OeWXRJdjmvlhG2actuDotnTwNWgLr9d32NIIWc/7QQTxFcyUE9HhBgA1roIutfrnBb8VZr/G2SsNIJUB1GoUxxm6xImGbqCpA2FSXM/BqKUggiRg+wOUSTsmec3vJDd9DEzeFMQgIJIOsL1f0MV+xpQolaYIrtek76oh6AtCczXPX2OMACGg4NcuLUVCGRpg1dwNZ927ykpBEPrxwPE8rWfTNjhvNVyGzTycl41Nci2JKQXYNyS/H0rxQNBpkBFxZ2yEAXk269ZXG9jZpxAJaCRoMo6KHh2sFgxlL00TUXRlg70kTmenx7uNSQ0fOFwRaZD5Tle9dz09mPGULEFpLDkPwVEoOXL4PiefRGrycYNsc5bbqfjqE4UG1XPsnaW/BHoQaNl43wZE1BIXbMTaNraBFg4UNGvmcaQ9G X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040450)(601004)(2401047)(8121501046)(5005006)(3002001)(93006095)(93001095)(10201501046)(6055026)(6041248)(201703131423075)(201702281528075)(201703061421075)(20161123562025)(20161123564025)(20161123555025)(20161123560025)(6072148);SRVR:DBXPR04MB511;BCL:0;PCL:0;RULEID:;SRVR:DBXPR04MB511; X-Microsoft-Exchange-Diagnostics: 1;DBXPR04MB511;4:TGqoGDzqosMUd4rKUayik/TByDdJI2+QbSOQTuAa44Vnx6WtZozCC1mTq4gREZfWqj1gn/WQppfQ+y3B0pl/3wtbIXwGxmult5UCSkd+AVAs/fTK3zedmch3jlvie27VRJyGf2sUY5bSbGjDnGAh02bWb6SM7JbRmMFsfkUdTsBRB16bsZreXj50xKLqfU/3jrgqbaV4Cy7lHsnfNIlOWQ9yJp3Vf33JivutrQcGuR4seP1aGJl1I5rzPz0E7pr41OSu1m/RD6LriatUjn2cS0E7aRzemnt4TTHqiiOSIJUbuw5yh1zRuKSE5hGwMRX31G+Zwc+noewKxFxPku6M28a0NKnBH9d7xTy6CGX0cVpXkYJZuwlpJkBEfWwznx3INvDf9wfASEhAI2WaZH9VlDJrF8mfodRDvIMvZooRyxlL+f2izEf3aumCEWpXOBwuIf6LV9w/sbDa80qs/Nu98omymqskLnFKOV3DVtBwCEr2Nnff0e7DmL09pudzBwsLIulc0G9A5xaQnn0YRLvAPRRQ55D2+K0KEqfS/MAkwZCsEDzChA06MzV9KkPZGHefcGC8/lCHtfehQWflfif5Ptydr3UkRgq4/F2s5ABPf//xMlBsbHvrEUh6QD7V24Xz0fAfXHYJ15bZSrV2SH0gX4DoJRfYR7qH8jUeCVn2E53W82Eed2vMTIRZnSkOEfWUoMjKkvUi17wDUyX933g3/m57JC5K0QaNmGiQn81eMO7GtRR3i9igVmy3CT/iCDVHnw8hG99qhzKP8ApKBnHwbA== X-Forefront-PRVS: 0268246AE7 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(39850400002)(39400400002)(39410400002)(39860400002)(39840400002)(39450400003)(86362001)(48376002)(66066001)(6116002)(81166006)(8676002)(3846002)(53936002)(50466002)(6666003)(33646002)(54906002)(6512007)(36756003)(76176999)(50986999)(5003940100001)(189998001)(6506006)(6486002)(38730400002)(110136004)(7736002)(305945005)(2351001)(25786009)(47776003)(2950100002)(6916009)(4326008)(42186005)(50226002);DIR:OUT;SFP:1101;SCL:1;SRVR:DBXPR04MB511;H:fsr-ub1664-118.ea.freescale.net;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DBXPR04MB511;23:r/zxmqTGLCrDn8zlq09x/3w9GmBwKaDwmyGbfqID3n?= =?us-ascii?Q?7WptoN03CzoI5PM4mJk+ccFj/RyIhJ3zU8zf+KeFHFtCvYId0o1YIscOLGk0?= =?us-ascii?Q?ClBhGcMhlQJwhYdq6gKHa0T2uDvw5FKMS5VjEviqOg+wQqNCrqmiyBmnQM0/?= =?us-ascii?Q?9mzHQLzN/WHDOFmJ7G2714PbhvKhP4JJatFoG6Wm/d5vMWFWzHOAHXqie/9r?= =?us-ascii?Q?uvxER6w1gSuzWgudRWgvbZczAkK/6HcvRjoOzEP8e8mVivUHgJ69kxcgnHhh?= =?us-ascii?Q?IqT1DsSqydeQVO9zE2ObAhogJB9KoidgjF1G5Rkno7rmbEbBe0VbvJdSyJjG?= =?us-ascii?Q?DlqRL0Cq6FLfcKqmtTXyCX9c7payemB2SZJVi0ifPh6FfqCChPpYpbs/LmrE?= =?us-ascii?Q?CCkQUGXA4tD/wSKXC5tI2249BTUZHGAnEcLJReCsUsrLpY6hwWr9GZNsZmTZ?= =?us-ascii?Q?Csc7PZaT9rl9CqGst9q8k6fHpcpdrYbu8afDBcP1pWCR5UIWkxX+48lvSm+K?= =?us-ascii?Q?gwBnEqel8UF+Xas0APhlIpjjGlVZlLTgKCRdxkNHetRW0ZhrAcV13rO1JVA0?= =?us-ascii?Q?R7+2lS3fNWUxB5hqiE6FUI+dHnW2ZtlNmYWsDGT4MiYBtxemw5G/vMJmkRRR?= =?us-ascii?Q?dlkjutha5K/fo+G5x4MJjPo1RX/VjeV11w/SMzO+nUI+3SjvQ3FfsYDgrjhl?= =?us-ascii?Q?ZlRBsNX65KlPMRokmG4YBd1xiOFzAXvr6aM8cxWpezIlCNMTL+uYYumlf9Nm?= =?us-ascii?Q?V/z0/8gnSzDODjjwP1QLSpFz1i5gsJjr7f/sFzCIddt2ZmH9L7ZAWCqSBDnl?= =?us-ascii?Q?s32j08VXVsRnftjEKXQjo5A45Q7D6847x+IY1c2H9+U1e/d9YjD1VIsBIOIB?= =?us-ascii?Q?PQVSjtCiZNeziI8Js989qUPTsuTHLbvbRSD2rNsdWt9MjM34LmRWcTfDeUXy?= =?us-ascii?Q?1gI+WwNBq3XwQ9/lLcrPujVEHeLYSuTVU6ADfr13D37MbkduZ918StA/rZg6?= =?us-ascii?Q?zlP8BpHZxZ+il5mbZXfnRQCXYeMG6tr0l5mnsZxLyQDw=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;DBXPR04MB511;6:Sbhs3ExpqkRMgo1VsCwxqMHdS47GeWeOTFEV4q9pwc/6cAoMoQ07fTthlsRth2VlsPB8J9L/yINLPyjxybpQ5SF4I+CY1TOwYWfgbs6rPIVrTjQPao449X14Gl9G1YbL+5Gbh3kCyNSgFCqP7atXNs6zpm/aq40Strjda6U1be4kiW1l4xvtnDefqDd3LVjWi7Rz7K8GHgO5/Jy2rVkLppQTkpHkIhbX2ED6VCUD83YROXCjXEqBxgVoQRJjvb9UOHl0+qOEHUgY7FKBPaxCQuTtI/kRsvGykTxr5UJynD1POYj0rIjPDE3W3arRt8IqehjDPHgnrJp4TW3UBy54xIkxEtIDAyM7vh8IyeN4qJTLXTzs6pEj4xASms76+eR2sKnRSSGVGDEPd5Pl/AWeu4Fw6M7qEYU7VqBEA9BPzRU=;5:0P7uvSfy8FSyW5xbOvcS3YGVBjAczj+Y8JwN+RTbaFjboH0HHt0s1t6Q6Iv+A0/+/WrdJZbZtcCzfVHnl5dnKLYZw+gzjOOJwtUUApEM9cq9gu4Ie9ckNWROL8D2YHJjQlO2XVN6o5QdUf86IBI4wg==;24:Ahjexb07wce4ALiqC7kjJrdMyyBBEWR5/EVdH6mSoo6nYg1LO7S0s4ot2IMSGpktSNVtNBy/66Q6tLO3+FoMI0ENTWYHkFY9ObZm9uVpX5Q= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DBXPR04MB511;7:B2QyXhHdBPmxdtMeuMajsOE+Eej/mF/mEyzXtg46DIrzdbZSMPEeOJVDIeuEb8EO03YtnyYxdoo4VGPy7P+WEwunIAl7JVa6gjYBLpsESEoevrDI9UiYayKkIN1l6KCHFjWpXpO1Ozq5F+8Ot7uUcmak/hhdNeYoM+JzX40/5589CmE+RXiJ4dVeOi/UAVX4SCcZaljD6jqfJ1N/x4JMWlVaShWjcyupraIJjFSQ/wD0nrAQiaYZeMM82fWAbhwQSYBR+I4QKS1YcvwfsNPq/ULDb/PSpEolPrVDjDAivSrTWGprX252HO5KmJwvj+AoNV4BG+aDzBL29gAECWot3Q== X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Apr 2017 13:26:52.1680 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBXPR04MB511 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add a separate function for deriving (sysclk, lrclk, bclk) when the clock is auto or pll. Signed-off-by: Daniel Baluta Acked-by: Charles Keepax --- sound/soc/codecs/wm8960.c | 97 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 68 insertions(+), 29 deletions(-) diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index ce159f1..1c973f0 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c @@ -672,10 +672,74 @@ int wm8960_configure_sysclk(struct wm8960_priv *wm8960, int mclk, return *bclk_idx; } +/** + * wm8960_configure_pll - checks if there is a PLL out frequency available + * The PLL out frequency must be chosen such that: + * - sysclk = lrclk * dac_divs + * - freq_out = sysclk * sysclk_divs + * - 10 * sysclk = bclk * bclk_divs + * + * @codec: codec structure + * @freq_in: input frequency used to derive freq out via PLL + * @sysclk_idx: sysclk_divs index for found sysclk + * @dac_idx: dac_divs index for found lrclk + * @bclk_idx: bclk_divs index for found bclk + * + * Returns: + * -1, in case no PLL frequency out available was found + * >=0, in case we could derive bclk, lrclk, sysclk from PLL out using + * (@sysclk_idx, @dac_idx, @bclk_idx) dividers + */ +static +int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in, + int *sysclk_idx, int *dac_idx, int *bclk_idx) +{ + struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); + int sysclk, bclk, lrclk, freq_out; + int diff, best_freq_out = 0; + int i, j, k; + + bclk = wm8960->bclk; + lrclk = wm8960->lrclk; + + *bclk_idx = *dac_idx = *sysclk_idx = -1; + + for (i = 0; i < ARRAY_SIZE(sysclk_divs); ++i) { + if (sysclk_divs[i] == -1) + continue; + for (j = 0; j < ARRAY_SIZE(dac_divs); ++j) { + sysclk = lrclk * dac_divs[j]; + freq_out = sysclk * sysclk_divs[i]; + + for (k = 0; k < ARRAY_SIZE(bclk_divs); ++k) { + if (!is_pll_freq_available(freq_in, freq_out)) + continue; + + diff = sysclk - bclk * bclk_divs[k] / 10; + if (diff == 0) { + *sysclk_idx = i; + *dac_idx = j; + *bclk_idx = k; + best_freq_out = freq_out; + break; + } + } + if (k != ARRAY_SIZE(bclk_divs)) + break; + } + if (j != ARRAY_SIZE(dac_divs)) + break; + } + + if (*bclk_idx != -1) + wm8960_set_pll(codec, freq_in, best_freq_out); + + return *bclk_idx; +} static int wm8960_configure_clocking(struct snd_soc_codec *codec) { struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); - int sysclk, bclk, lrclk, freq_out, freq_in; + int freq_out, freq_in; u16 iface1 = snd_soc_read(codec, WM8960_IFACE1); int i, j, k; int ret; @@ -692,8 +756,6 @@ static int wm8960_configure_clocking(struct snd_soc_codec *codec) } freq_in = wm8960->freq_in; - bclk = wm8960->bclk; - lrclk = wm8960->lrclk; /* * If it's sysclk auto mode, check if the MCLK can provide sysclk or * not. If MCLK can provide sysclk, using MCLK to provide sysclk @@ -720,33 +782,10 @@ static int wm8960_configure_clocking(struct snd_soc_codec *codec) return -EINVAL; } } - /* get a available pll out frequency and set pll */ - for (i = 0; i < ARRAY_SIZE(sysclk_divs); ++i) { - if (sysclk_divs[i] == -1) - continue; - for (j = 0; j < ARRAY_SIZE(dac_divs); ++j) { - sysclk = lrclk * dac_divs[j]; - freq_out = sysclk * sysclk_divs[i]; - - for (k = 0; k < ARRAY_SIZE(bclk_divs); ++k) { - if (sysclk == bclk * bclk_divs[k] / 10 && - is_pll_freq_available(freq_in, freq_out)) { - wm8960_set_pll(codec, - freq_in, freq_out); - break; - } else { - continue; - } - } - if (k != ARRAY_SIZE(bclk_divs)) - break; - } - if (j != ARRAY_SIZE(dac_divs)) - break; - } - if (i == ARRAY_SIZE(sysclk_divs)) { - dev_err(codec->dev, "failed to configure clock\n"); + ret = wm8960_configure_pll(codec, freq_in, &i, &j, &k); + if (ret < 0) { + dev_err(codec->dev, "failed to configure clock via PLL\n"); return -EINVAL; } -- 2.7.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Baluta Subject: [PATCH v2 1/2] ASoC: codec: wm9860: Refactor PLL out freq search Date: Wed, 5 Apr 2017 16:26:37 +0300 Message-ID: <1491398798-27829-2-git-send-email-daniel.baluta@nxp.com> References: <1491398798-27829-1-git-send-email-daniel.baluta@nxp.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from EUR02-AM5-obe.outbound.protection.outlook.com (mail-eopbgr00066.outbound.protection.outlook.com [40.107.0.66]) by alsa0.perex.cz (Postfix) with ESMTP id 73B02267018 for ; Wed, 5 Apr 2017 15:26:55 +0200 (CEST) In-Reply-To: <1491398798-27829-1-git-send-email-daniel.baluta@nxp.com> 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 To: alsa-devel@alsa-project.org Cc: lgirdwood@gmail.com, shengjiu.wang@nxp.com, patches@opensource.wolfsonmicro.com, linux-kernel@vger.kernel.org, tiwai@suse.com, broonie@kernel.org, viorel.suman@nxp.com, mihai.serban@nxp.com, ckeepax@opensource.wolfsonmicro.com List-Id: alsa-devel@alsa-project.org Add a separate function for deriving (sysclk, lrclk, bclk) when the clock is auto or pll. Signed-off-by: Daniel Baluta Acked-by: Charles Keepax --- sound/soc/codecs/wm8960.c | 97 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 68 insertions(+), 29 deletions(-) diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index ce159f1..1c973f0 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c @@ -672,10 +672,74 @@ int wm8960_configure_sysclk(struct wm8960_priv *wm8960, int mclk, return *bclk_idx; } +/** + * wm8960_configure_pll - checks if there is a PLL out frequency available + * The PLL out frequency must be chosen such that: + * - sysclk = lrclk * dac_divs + * - freq_out = sysclk * sysclk_divs + * - 10 * sysclk = bclk * bclk_divs + * + * @codec: codec structure + * @freq_in: input frequency used to derive freq out via PLL + * @sysclk_idx: sysclk_divs index for found sysclk + * @dac_idx: dac_divs index for found lrclk + * @bclk_idx: bclk_divs index for found bclk + * + * Returns: + * -1, in case no PLL frequency out available was found + * >=0, in case we could derive bclk, lrclk, sysclk from PLL out using + * (@sysclk_idx, @dac_idx, @bclk_idx) dividers + */ +static +int wm8960_configure_pll(struct snd_soc_codec *codec, int freq_in, + int *sysclk_idx, int *dac_idx, int *bclk_idx) +{ + struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); + int sysclk, bclk, lrclk, freq_out; + int diff, best_freq_out = 0; + int i, j, k; + + bclk = wm8960->bclk; + lrclk = wm8960->lrclk; + + *bclk_idx = *dac_idx = *sysclk_idx = -1; + + for (i = 0; i < ARRAY_SIZE(sysclk_divs); ++i) { + if (sysclk_divs[i] == -1) + continue; + for (j = 0; j < ARRAY_SIZE(dac_divs); ++j) { + sysclk = lrclk * dac_divs[j]; + freq_out = sysclk * sysclk_divs[i]; + + for (k = 0; k < ARRAY_SIZE(bclk_divs); ++k) { + if (!is_pll_freq_available(freq_in, freq_out)) + continue; + + diff = sysclk - bclk * bclk_divs[k] / 10; + if (diff == 0) { + *sysclk_idx = i; + *dac_idx = j; + *bclk_idx = k; + best_freq_out = freq_out; + break; + } + } + if (k != ARRAY_SIZE(bclk_divs)) + break; + } + if (j != ARRAY_SIZE(dac_divs)) + break; + } + + if (*bclk_idx != -1) + wm8960_set_pll(codec, freq_in, best_freq_out); + + return *bclk_idx; +} static int wm8960_configure_clocking(struct snd_soc_codec *codec) { struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); - int sysclk, bclk, lrclk, freq_out, freq_in; + int freq_out, freq_in; u16 iface1 = snd_soc_read(codec, WM8960_IFACE1); int i, j, k; int ret; @@ -692,8 +756,6 @@ static int wm8960_configure_clocking(struct snd_soc_codec *codec) } freq_in = wm8960->freq_in; - bclk = wm8960->bclk; - lrclk = wm8960->lrclk; /* * If it's sysclk auto mode, check if the MCLK can provide sysclk or * not. If MCLK can provide sysclk, using MCLK to provide sysclk @@ -720,33 +782,10 @@ static int wm8960_configure_clocking(struct snd_soc_codec *codec) return -EINVAL; } } - /* get a available pll out frequency and set pll */ - for (i = 0; i < ARRAY_SIZE(sysclk_divs); ++i) { - if (sysclk_divs[i] == -1) - continue; - for (j = 0; j < ARRAY_SIZE(dac_divs); ++j) { - sysclk = lrclk * dac_divs[j]; - freq_out = sysclk * sysclk_divs[i]; - - for (k = 0; k < ARRAY_SIZE(bclk_divs); ++k) { - if (sysclk == bclk * bclk_divs[k] / 10 && - is_pll_freq_available(freq_in, freq_out)) { - wm8960_set_pll(codec, - freq_in, freq_out); - break; - } else { - continue; - } - } - if (k != ARRAY_SIZE(bclk_divs)) - break; - } - if (j != ARRAY_SIZE(dac_divs)) - break; - } - if (i == ARRAY_SIZE(sysclk_divs)) { - dev_err(codec->dev, "failed to configure clock\n"); + ret = wm8960_configure_pll(codec, freq_in, &i, &j, &k); + if (ret < 0) { + dev_err(codec->dev, "failed to configure clock via PLL\n"); return -EINVAL; } -- 2.7.4