From patchwork Mon Oct 27 06:11:09 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Krishna Mohan Dani X-Patchwork-Id: 5157421 Return-Path: X-Original-To: patchwork-linux-samsung-soc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 72AE39F349 for ; Mon, 27 Oct 2014 06:13:31 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 65C2020320 for ; Mon, 27 Oct 2014 06:13:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 08AF9202F8 for ; Mon, 27 Oct 2014 06:13:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750967AbaJ0GN2 (ORCPT ); Mon, 27 Oct 2014 02:13:28 -0400 Received: from mailout1.samsung.com ([203.254.224.24]:22801 "EHLO mailout1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750761AbaJ0GN1 (ORCPT ); Mon, 27 Oct 2014 02:13:27 -0400 Received: from epcpsbgr1.samsung.com (u141.gpu120.samsung.co.kr [203.254.230.141]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NE30028AAMBIV00@mailout1.samsung.com> for linux-samsung-soc@vger.kernel.org; Mon, 27 Oct 2014 15:13:23 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.125]) by epcpsbgr1.samsung.com (EPCPMTA) with SMTP id AD.72.17016.282ED445; Mon, 27 Oct 2014 15:13:22 +0900 (KST) X-AuditID: cbfee68d-f79296d000004278-30-544de282e417 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id CB.F1.09430.282ED445; Mon, 27 Oct 2014 15:13:22 +0900 (KST) Received: from krishnamd-ubuntu.sisodomain.com ([107.108.73.88]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NE300CQXAIOXOI0@mmp2.samsung.com>; Mon, 27 Oct 2014 15:13:22 +0900 (KST) From: Krishna Mohan Dani To: kgene.kim@samsung.com, broonie@linaro.org, linux-samsung-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 2/4] Sound: Samsung: Add sound card machine driver for Arndale Board Date: Mon, 27 Oct 2014 11:41:09 +0530 Message-id: <1414390271-25040-3-git-send-email-krishna.md@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1414390271-25040-1-git-send-email-krishna.md@samsung.com> References: <1414390271-25040-1-git-send-email-krishna.md@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrBLMWRmVeSWpSXmKPExsWyRsSkVrfpkW+IwYfPlhabrl9ntehdcJXN YtPja6wWM87vY3Jg8bhzbQ+bx+Yl9R59W1YxenzeJBfAEsVlk5Kak1mWWqRvl8CVcfbYY6aC h0YVx07cY29g/KrZxcjJISFgIjFj8k1GCFtM4sK99WwgtpDAUkaJzd+UYGoa+g9CxaczSqz/ ydrFyAVk9zNJXJ01FayZTcBQYt7RJmYQW0SgQuLC26VMILawQJjExeYmVhCbRUBVYs3zPnYQ m1fATWLWgh0sXYwcQAsUJOZMsgEJcwq4S9yfcokJYpebxMYJ01lAdkkIvGaTeNZynglijoDE t8mHoHplJTYdYIa4U1Li4IobLBMYhRYwMqxiFE0tSC4oTkovMtQrTswtLs1L10vOz93ECAzQ 0/+e9e5gvH3A+hCjAAejEg+vRaFviBBrYllxZe4hRlOgDROZpUST84FxkFcSb2hsZmRhamJq bGRuaaYkzqso9TNYSCA9sSQ1OzW1ILUovqg0J7X4ECMTB6dUA6PIk8knosQ55ebOePO7wOn4 xxlyV0QNc1t25utv3mk/f3f0uzNhN89L/hN+KHbhvXfUdvv9khk3MqdtT+T9/fWsMOOpiIj2 nXx6C/8mlvVtE5/zRGbp8q95XeIS+azGeXWu5/MXfjy7wVbuBPPllM8i3yQ861drdMTtvNzc bvLh4c6Vi89+VRdSYinOSDTUYi4qTgQAEMhhYUsCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpmkeLIzCtJLcpLzFFi42I5/e+xoG7TI98Qg4ebDS02Xb/OatG74Cqb xabH11gtZpzfx+TA4nHn2h42j81L6j36tqxi9Pi8SS6AJaqB0SYjNTEltUghNS85PyUzL91W yTs43jne1MzAUNfQ0sJcSSEvMTfVVsnFJ0DXLTMHaKWSQlliTilQKCCxuFhJ3w7ThNAQN10L mMYIXd+QILgeIwM0kLCGMePsscdMBQ+NKo6duMfewPhVs4uRk0NCwESiof8gG4QtJnHh3now W0hgOqPE+p+sXYxcQHY/k8TVWVMZQRJsAoYS8442MYPYIgIVEhfeLmUCsYUFwiQuNjexgtgs AqoSa573sYPYvAJuErMW7GDpYuQAWqAgMWeSDUiYU8Bd4v6US0wQu9wkNk6YzjKBkWcBI8Mq RtHUguSC4qT0XCO94sTc4tK8dL3k/NxNjOAIeCa9g3FVg8UhRgEORiUeXotC3xAh1sSy4src Q4wSHMxKIrwf7wOFeFMSK6tSi/Lji0pzUosPMZoCHTWRWUo0OR8YnXkl8YbGJuamxqaWJhYm ZpZK4rwHW60DhQTSE0tSs1NTC1KLYPqYODilGhg5CiuCPZdGqlkcLtffsJ5dweHd0qMu2nMc lTUyz3oyR6i/vij1NWXFcRWlNIv5GdEJyrw+U5hV+PVNi46XF0nq1tWcZXuzWGvf968FJjZZ AYz2fGpSTUvllltobDX/qaaRmaG28v4CncoNTq9lJ+13Y8nrOWqZ9GgWi3jO5AU/F3L8vXF0 lhJLcUaioRZzUXEiAGP9Y7SWAgAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-samsung-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Adding machine driver to instantiate I2S based realtek's ALC5631 sound card on Arndale board. There are other variants of Audio Daughter Cards for Arndale Board for which support already exists but there is no support for Realtek's alc5631 codec hence support for ALC5631 based machine driver is being added. Signed-off-by: Krishna Mohan Dani --- sound/soc/samsung/Kconfig | 6 ++ sound/soc/samsung/Makefile | 2 + sound/soc/samsung/arndale_rt5631.c | 167 ++++++++++++++++++++++++++++++++++++ 3 files changed, 175 insertions(+) create mode 100644 sound/soc/samsung/arndale_rt5631.c diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig index 55a3869..b6134aa 100644 --- a/sound/soc/samsung/Kconfig +++ b/sound/soc/samsung/Kconfig @@ -239,3 +239,9 @@ config SND_SOC_ODROIDX2 select SND_SAMSUNG_I2S help Say Y here to enable audio support for the Odroid-X2/U3. + +config SND_SOC_ARNDALE_RT5631 + tristate "Audio support for RT5631(ALC5631) on Arndale Board" + depends on SND_SOC_SAMSUNG + select SND_SAMSUNG_I2S + select SND_SOC_RT5631 diff --git a/sound/soc/samsung/Makefile b/sound/soc/samsung/Makefile index 91505dd..656e64d 100644 --- a/sound/soc/samsung/Makefile +++ b/sound/soc/samsung/Makefile @@ -45,6 +45,7 @@ snd-soc-lowland-objs := lowland.o snd-soc-littlemill-objs := littlemill.o snd-soc-bells-objs := bells.o snd-soc-odroidx2-max98090-objs := odroidx2_max98090.o +snd-soc-arndale-rt5631-objs := arndale_rt5631.o obj-$(CONFIG_SND_SOC_SAMSUNG_JIVE_WM8750) += snd-soc-jive-wm8750.o obj-$(CONFIG_SND_SOC_SAMSUNG_NEO1973_WM8753) += snd-soc-neo1973-wm8753.o @@ -71,3 +72,4 @@ obj-$(CONFIG_SND_SOC_LOWLAND) += snd-soc-lowland.o obj-$(CONFIG_SND_SOC_LITTLEMILL) += snd-soc-littlemill.o obj-$(CONFIG_SND_SOC_BELLS) += snd-soc-bells.o obj-$(CONFIG_SND_SOC_ODROIDX2) += snd-soc-odroidx2-max98090.o +obj-$(CONFIG_SND_SOC_ARNDALE_RT5631) += snd-soc-arndale-rt5631.o diff --git a/sound/soc/samsung/arndale_rt5631.c b/sound/soc/samsung/arndale_rt5631.c new file mode 100644 index 0000000..2697af7 --- /dev/null +++ b/sound/soc/samsung/arndale_rt5631.c @@ -0,0 +1,167 @@ +/* + * arndale_rt5631.c + * + * Copyright (c) 2014, Insignal Co., Ltd. + * + * Author: Claude + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#include +#include +#include + +#include +#include +#include +#include + +#include "i2s.h" + +static int arndale_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + int bfs, psr, rfs, ret; + unsigned long rclk; + + bfs = 32; + + rfs = 256; + + rclk = params_rate(params) * rfs; + + psr = 4; + + ret = snd_soc_dai_set_sysclk(cpu_dai, SAMSUNG_I2S_CDCLK, + 0, SND_SOC_CLOCK_OUT); + if (ret < 0) + return ret; + + ret = snd_soc_dai_set_sysclk(cpu_dai, SAMSUNG_I2S_RCLKSRC_0, + 0, SND_SOC_CLOCK_OUT); + + if (ret < 0) + return ret; + + ret = snd_soc_dai_set_sysclk(codec_dai, 0, rclk, SND_SOC_CLOCK_OUT); + if (ret < 0) + return ret; + + return 0; +} + +static struct snd_soc_ops arndale_ops = { + .hw_params = arndale_hw_params, +}; + +static int arndale_alc5631_init_paiftx(struct snd_soc_pcm_runtime *rtd) +{ + struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_dapm_context *dapm = &codec->dapm; + + snd_soc_dapm_sync(dapm); + + return 0; +} + +static struct snd_soc_dai_link arndale_dai[] = { + { + .name = "RT5631 HiFi", + .stream_name = "Primary", + .codec_dai_name = "rt5631-hifi", + .init = arndale_alc5631_init_paiftx, + .dai_fmt = SND_SOC_DAIFMT_I2S + | SND_SOC_DAIFMT_NB_NF + | SND_SOC_DAIFMT_CBS_CFS, + .ops = &arndale_ops, + }, +}; + +static struct snd_soc_card arndale = { + .name = "Arndale-I2S", + .dai_link = arndale_dai, + .num_links = ARRAY_SIZE(arndale_dai), +}; + +static int arndale_audio_probe(struct platform_device *pdev) +{ + int n, ret; + struct device_node *np = pdev->dev.of_node; + struct snd_soc_card *card = &arndale; + + card->dev = &pdev->dev; + + for (n = 0; np && n < ARRAY_SIZE(arndale_dai); n++) { + if (!arndale_dai[n].cpu_dai_name) { + arndale_dai[n].cpu_of_node = of_parse_phandle(np, + "samsung,audio-cpu", n); + + if (!arndale_dai[n].cpu_of_node) { + dev_err(&pdev->dev, + "Property 'samsung,audio-cpu' missing or invalid\n"); + ret = -EINVAL; + } + } + if (!arndale_dai[n].platform_name) + arndale_dai[n].platform_of_node = + arndale_dai[n].cpu_of_node; + + arndale_dai[n].codec_name = NULL; + arndale_dai[n].codec_of_node = of_parse_phandle(np, + "samsung,audio-codec", n); + if (!arndale_dai[0].codec_of_node) { + dev_err(&pdev->dev, + "Property 'samsung,audio-codec' missing or invalid\n"); + ret = -EINVAL; + } + } + + ret = snd_soc_register_card(card); + + if (ret) + dev_err(&pdev->dev, "snd_soc_register_card() failed:%d\n", ret); + + return ret; +} + +static int arndale_audio_remove(struct platform_device *pdev) +{ + struct snd_soc_card *card = platform_get_drvdata(pdev); + + snd_soc_unregister_card(card); + + return 0; +} + +#ifdef CONFIG_OF +static const struct of_device_id samsung_arndale_rt5631_of_match[] = { + { .compatible = "samsung,arndale-rt5631", }, + {}, +}; +MODULE_DEVICE_TABLE(of, samsung_arndale_rt5631_of_match); +#endif /* CONFIG_OF */ + +static struct platform_driver arndale_audio_driver = { + .driver = { + .name = "arndale-audio", + .owner = THIS_MODULE, + .pm = &snd_soc_pm_ops, + .of_match_table = of_match_ptr(samsung_arndale_rt5631_of_match), + }, + .probe = arndale_audio_probe, + .remove = arndale_audio_remove, +}; + +module_platform_driver(arndale_audio_driver); + +MODULE_AUTHOR("Claude "); +MODULE_DESCRIPTION("ALSA SoC Driver for Arndale Board"); +MODULE_LICENSE("GPL"); +