From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751639AbbCLCu6 (ORCPT ); Wed, 11 Mar 2015 22:50:58 -0400 Received: from mailout1.samsung.com ([203.254.224.24]:28139 "EHLO mailout1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751095AbbCLCuy (ORCPT ); Wed, 11 Mar 2015 22:50:54 -0400 X-AuditID: cbfee68e-f79b46d000002b74-fa-5500ff0c6829 From: Inha Song To: broonie@kernel.org, alsa-devel@alsa-project.org Cc: patches@opensource.wolfsonmicro.com, linux-kernel@vger.kernel.org, ckeepax@opensource.wolfsonmicro.com, nikesh@opensource.wolfsonmicro.com, lars@metafoo.de, lgirdwood@gmail.com, perex@perex.cz, tiwai@suse.de, Li.Xiubo@freescale.com, sachin.kamat@samsung.com, cw00.choi@samsung.com, Inha Song Subject: [alsa-devel] [PATCH] ASoC: wm8994: Manage wm8994's MCLK in codec driver Date: Thu, 12 Mar 2015 11:49:39 +0900 Message-id: <1426128580-18320-1-git-send-email-ideal.song@samsung.com> X-Mailer: git-send-email 2.0.0.390.gcb682f8 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrHLMWRmVeSWpSXmKPExsWyRsSkRJfnP0OowfzXfBZXLh5ispj68Amb xb8pN9gtrn95zmqx6+99Roslk+ezWny70sFk0Xmhg9Xi8q45bBZ/zmtaLH/7n82ic1c/q8WV S6fYLF5ufsPkwOex4XMTm8e/w/1MHjtn3WX32LSqk81jyZtDrB4vJ/5m89j3dhmbR9+WVYwe m09Xe3zeJBfAFcVlk5Kak1mWWqRvl8CV0dgwj7mgWbxi3b+ZbA2MX4S6GDk5JARMJGZ9/8AO YYtJXLi3nq2LkYtDSGApo8SP1Z8ZYYoOremGSkxnlJiw+jsLhDOHSeL64gWsIFVsAhoS3z9v ZgaxRQSMJW5+3skMUsQscIJJ4sHdj0wgCWGBAIlHJ9YAjeXgYBFQlTj/PRskzCvgJrFlRSsz xDZtiX0NM8G2SQhcY5f4dXUj2AIWAQGJb5MPsYD0SgjISmw6AFUvKXFwxQ2WCYyCCxgZVjGK phYkFxQnpRcZ6RUn5haX5qXrJefnbmIERsvpf8/6djDePGB9iFGAg1GJh7fiK0OoEGtiWXFl 7iFGU6ANE5mlRJPzgTGZVxJvaGxmZGFqYmpsZG5ppiTOmyD1M1hIID2xJDU7NbUgtSi+qDQn tfgQIxMHp1QDY3iJ/+qkhtKEJzIbljjKsj2Od5kuOn8259HfSx2dDu9fuTr5mP765xF2zy6y FtZvC5i8ZvkH2YYDiyVcpv+6Jx4ltTj7u+kBzoKOEJ4Y0V1rTEI08sOWtPjGND876L/tfPnj 6MkXtK84vr1xhKFh/+GcqUK+K6uK9b4tyUi0cpWs59g6wbggXomlOCPRUIu5qDgRAFwEoBiR AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrBIsWRmVeSWpSXmKPExsVy+t9jQV2e/wyhBm++sVhcuXiIyWLqwyds Fv+m3GC3uP7lOavFrr/3GS2WTJ7PavHtSgeTReeFDlaLy7vmsFn8Oa9psfztfzaLzl39rBZX Lp1is3i5+Q2TA5/Hhs9NbB7/DvczeeycdZfdY9OqTjaPJW8OsXq8nPibzWPf22VsHn1bVjF6 bD5d7fF5k1wAV1QDo01GamJKapFCal5yfkpmXrqtkndwvHO8qZmBoa6hpYW5kkJeYm6qrZKL T4CuW2YO0AdKCmWJOaVAoYDE4mIlfTtME0JD3HQtYBojdH1DguB6jAzQQMIaxozGhnnMBc3i Fev+zWRrYPwi1MXIySEhYCJxaE03G4QtJnHh3nogm4tDSGA6o8SE1d9ZIJw5TBLXFy9gBali E9CQ+P55MzOILSJgLHHz805mkCJmgRNMEg/ufmQCSQgLBEg8OrGGsYuRg4NFQFXi/PdskDCv gJvElhWtzBDbtCX2Ncxkm8DIvYCRYRWjaGpBckFxUnqukV5xYm5xaV66XnJ+7iZGcCw+k97B uKrB4hCjAAejEg/vhe8MoUKsiWXFlbmHGCU4mJVEeP1+AYV4UxIrq1KL8uOLSnNSiw8xmgIt n8gsJZqcD0wTeSXxhsYmZkaWRuaGFkbG5krivEr2bSFCAumJJanZqakFqUUwfUwcnFINjCYr 7dZcqG9YJ7Z6kdLmJM3U686K+69z7Tzi9XyDgaD0bhYlge/Xja5/XSC+e/lKWev3b7INw878 VvArXTtB9N9+xXneqkrSPPtaGUvU1572eiiyR/jWucw5cqczN6t3M5245T+fcYFtyb55jxpt zE+v7FGLnsigubf9jEGwu1TNpma3/fnn5ZVYijMSDbWYi4oTAQCoYErbAgAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Previously, When we use wm8994 codec, we should control its MCLK in machine driver. But, It should be managed by wm8994 codec driver, not machine driver. This patch add MCLK clock DT parsing logic and control own MCLK. Signed-off-by: Inha Song --- sound/soc/codecs/wm8994.c | 27 ++++++++++++++++++++++++++- sound/soc/codecs/wm8994.h | 1 + 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 247b390..d80dcc6 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -2470,6 +2471,7 @@ static int wm8994_set_bias_level(struct snd_soc_codec *codec, { struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); struct wm8994 *control = wm8994->wm8994; + int i; wm_hubs_set_bias_level(codec, level); @@ -2491,8 +2493,19 @@ static int wm8994_set_bias_level(struct snd_soc_codec *codec, break; } - if (codec->dapm.bias_level == SND_SOC_BIAS_STANDBY) + if (codec->dapm.bias_level == SND_SOC_BIAS_STANDBY) { + for (i = 0; i < ARRAY_SIZE(wm8994->clk_mclk); i++) { + if (!IS_ERR(wm8994->clk_mclk[i])) + clk_prepare_enable(wm8994->clk_mclk[i]); + } active_reference(codec); + } else if (codec->dapm.bias_level == SND_SOC_BIAS_ON) { + for (i = 0; i < ARRAY_SIZE(wm8994->clk_mclk); i++) { + if (!IS_ERR(wm8994->clk_mclk[i])) + clk_disable_unprepare( + wm8994->clk_mclk[i]); + } + } break; case SND_SOC_BIAS_STANDBY: @@ -4451,6 +4464,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8994 = { static int wm8994_probe(struct platform_device *pdev) { struct wm8994_priv *wm8994; + int i; wm8994 = devm_kzalloc(&pdev->dev, sizeof(struct wm8994_priv), GFP_KERNEL); @@ -4460,6 +4474,17 @@ static int wm8994_probe(struct platform_device *pdev) wm8994->wm8994 = dev_get_drvdata(pdev->dev.parent); + for (i = 0; i < ARRAY_SIZE(wm8994->clk_mclk); i++) { + char mclk_name[] = "MCLKx"; + + snprintf(mclk_name, sizeof(mclk_name), "MCLK%d", i + 1); + + wm8994->clk_mclk[i] = devm_clk_get(pdev->dev.parent, mclk_name); + if (IS_ERR(wm8994->clk_mclk[i])) + if (PTR_ERR(wm8994->clk_mclk) == -EPROBE_DEFER) + return -EPROBE_DEFER; + } + pm_runtime_enable(&pdev->dev); pm_runtime_idle(&pdev->dev); diff --git a/sound/soc/codecs/wm8994.h b/sound/soc/codecs/wm8994.h index 6536f8d..8cf06a4 100644 --- a/sound/soc/codecs/wm8994.h +++ b/sound/soc/codecs/wm8994.h @@ -78,6 +78,7 @@ struct wm8994_priv { int sysclk[2]; int sysclk_rate[2]; int mclk[2]; + struct clk *clk_mclk[2]; int aifclk[2]; int aifdiv[2]; int channels[2]; -- 2.0.0.390.gcb682f8