From patchwork Mon Sep 3 07:05:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kuninori Morimoto X-Patchwork-Id: 10585525 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 93D7B139B for ; Mon, 3 Sep 2018 07:05:54 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 86C542918D for ; Mon, 3 Sep 2018 07:05:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7722929455; Mon, 3 Sep 2018 07:05:54 +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=-2.8 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,T_DKIM_INVALID autolearn=ham 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 3A38D2918D for ; Mon, 3 Sep 2018 07:05:52 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id C2F1326784E; Mon, 3 Sep 2018 09:05:51 +0200 (CEST) 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 1A0CA26784E; Mon, 3 Sep 2018 09:05:49 +0200 (CEST) Received: from relmlie3.idc.renesas.com (relmlor4.renesas.com [210.160.252.174]) by alsa0.perex.cz (Postfix) with ESMTP id D6DD9266E0E for ; Mon, 3 Sep 2018 09:05:45 +0200 (CEST) Received: from unknown (HELO relmlir2.idc.renesas.com) ([10.200.68.152]) by relmlie3.idc.renesas.com with ESMTP; 03 Sep 2018 16:05:44 +0900 Received: from relmlii2.idc.renesas.com (relmlii2.idc.renesas.com [10.200.68.66]) by relmlir2.idc.renesas.com (Postfix) with ESMTP id 5159675B9B; Mon, 3 Sep 2018 16:05:44 +0900 (JST) X-IronPort-AV: E=Sophos;i="5.53,324,1531753200"; d="scan'208";a="291384181" Received: from mail-ty1jpn01lp0180.outbound.protection.outlook.com (HELO JPN01-TY1-obe.outbound.protection.outlook.com) ([23.103.139.180]) by relmlii2.idc.renesas.com with ESMTP/TLS/AES256-SHA256; 03 Sep 2018 16:05:44 +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:X-MS-Exchange-SenderADCheck; bh=cGPUXqK0HAjMuschYxCyOcd1dHqkfPAcei5lI2VsZQA=; b=NlAVaOlijsQtxUASJXCLHVSF5hLER/4fHYe0riEJtAoL4LICVib0G0J01VuzDCz5/dY/NEXTaDqbR/s2xhXPl7ZiUejZ7MH0q2UghFrQDzUb8ts/QCQTmaST9FEzBm8wQ1eGm9mO+ZWzDOnbFbfYxwmeSK9MAN+IhxeIJ1eOjBM= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=kuninori.morimoto.gx@renesas.com; Received: from morimoto-PC.renesas.com (211.11.155.130) by OSAPR01MB1860.jpnprd01.prod.outlook.com (2603:1096:603:2d::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1101.18; Mon, 3 Sep 2018 07:05:42 +0000 Message-ID: <87a7ozf4np.wl-kuninori.morimoto.gx@renesas.com> From: Kuninori Morimoto User-Agent: Wanderlust/2.15.9 Emacs/24.5 Mule/6.0 To: Mark Brown In-Reply-To: <87d0tvf4q0.wl-kuninori.morimoto.gx@renesas.com> References: <87d0tvf4q0.wl-kuninori.morimoto.gx@renesas.com> MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Date: Mon, 3 Sep 2018 07:05:42 +0000 X-Originating-IP: [211.11.155.130] X-ClientProxiedBy: TYAPR01CA0096.jpnprd01.prod.outlook.com (2603:1096:404:2c::36) To OSAPR01MB1860.jpnprd01.prod.outlook.com (2603:1096:603:2d::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d525b225-19df-4a03-d0e5-08d6116ba98e X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989137)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:OSAPR01MB1860; X-Microsoft-Exchange-Diagnostics: 1; OSAPR01MB1860; 3:Zo6frb3xutRGHDatoY/RqbTbqr/FBlqG/ODd4Pprs7jYC/j1UBkNejzAqm3rS5OfFEYrecDxaDU3wQ7UCudoUxblH6o6M4y950puWUT3doR2a15MqLk7K7aftHeafJQDfwUahzISGUrip14zIiaZJOwNClV8XtfQgyvhZGmyPoahbUt3AaEa0xl9QkQkDY4UEhTlEShpYkcfpTKAuTBNtHjOwTxwGgXmEdiJRheRwvgPNB98r9NYbnxFu0PDwbB9; 25:n0epjIYQTkmL2KIWJImEkDS4E+296YjsKyr+EqAlm0SxYl8ywdM3bbnbd6nc2hXOLs3RyjUrYDPIgDbHTcj4V7IdVXvS1lGpjL+jAq9pmTVpf8bVMdE2nqKpYGBC9yA0OU2IbqzIjB/xrSXKWck4R7dq94plOdFZab0mxtIhgxZb9hXlwtE+QyDzGQae4p9NqUhVzpBFdh4WO7yQOAN0UOYmyfumrLSd5VmeJfG3KcVK/Qd1QBOhkzgpVB02QJkQM7QL7m1Hx/2jcqfIe5G0bdrcUP/6myJNPl/bAcFuZXhndaB7Oen+Xz5c2Vq4lfcYZc6lg1t1KQDoXWUVO1dYaw==; 31:8bKpkMJgTU5iaYOTZ2coCKPnrvD8rAY2rdjm3ijVKAG+V6Unbv04gff1/ChW4/W5otyJF+bCEH+xebdi5/Maqd5XvUR1UFVqCxQZy0tZw16B/DfUhjnK9izNYVBshwVcJIpaR8eedv6kXFbQfLCaRYuifc4XvLMS0s55qzO6EWyptv0S9sGugwU1qeap2kZQDw8Tw//o1ul72b6QjD0bgW7XXBKEPGyN3CSQev/ATtY= X-MS-TrafficTypeDiagnostic: OSAPR01MB1860: X-Microsoft-Exchange-Diagnostics: 1; OSAPR01MB1860; 20:XgHOFvWnzaivPsdnA4bXaHxq21I/rSbx6InuIEEDTO9fI9vEJHllY6mM1PEuXcHb4Q3aS13DTrXZA4IBTVKwpNLCgGKQIuphfX4t3UtICc4g36WUB8hQgPbEWY6bIHcmgFyDgU/oGOZOKr0x3ufXxoAK6+i7p0YPUOTUGsnfHwxgWjeGEyxepx4iZMjM7ndtVnvZz7eka8e4m2DdHlbm1gIQsx4tQtf1Ho7iZC2a3qb0Ar6eQjQ+7ONFVWLxy5C9HmVTtRNyYHNLDXDqtH6CaoWNPZqnYJEaXUqBGiM2guirtnT8tph3Siv/hOp4Yhy9UK/q/9zpMCYEvNHS4YvLU66+xoCIuTe4ZCxncLgUqKF6sd5lZ3Gp4/ePUU1keUlI2qIP5C70kCzNNn3Z58tb5+5KTlg/qi6HMu7q/9lLSvMQtZ2Qokuqk8MKLR1G5QV4TVV9OypMcBZhhXjCyaOBi0SaOq7bunVowY5KUahNSQLOIf0wcL0xCuKqeyRDvhp3; 4:AXElc5FVm3g6JWgp5XrgHQpp3ajaaGuVZwhqSUNZbVCNPZnqtq9it6mHH53xeS6uuQe4wHGOmU9uA7W050+HBF5kBizsPV5MsWkZ4ZP189U1AxvYmH07KBMRFSkjHObZIgyRqAVHqzVN12eIyxY9eMOQIirRtSzLc/4ZmN5qRmpBZ6vxwR6ojcBc2iqtm5SF7i7qq5UsnX3XfPUdbJnL4Zdzb6I60i2B8Elo8eq81zRHJxCL0GqfCmPyI4arwAHBkWjBmE/zQbWZQ0IjqMIQnA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(823301075)(10201501046)(3002001)(93006095)(93001095)(3231311)(944501410)(52105095)(6055026)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(201708071742011)(7699016); SRVR:OSAPR01MB1860; BCL:0; PCL:0; RULEID:; SRVR:OSAPR01MB1860; X-Forefront-PRVS: 0784C803FD X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(366004)(39860400002)(396003)(376002)(136003)(346002)(189003)(199004)(25786009)(3846002)(68736007)(86362001)(476003)(575784001)(106356001)(446003)(7736002)(2616005)(956004)(11346002)(16526019)(186003)(486006)(26005)(4326008)(50466002)(5660300001)(54906003)(81156014)(69596002)(8936002)(105586002)(386003)(81166006)(16586007)(8676002)(6116002)(53936002)(58126008)(305945005)(478600001)(76176011)(7696005)(36756003)(52116002)(2906002)(97736004)(6916009)(23726003)(53416004)(6486002)(47776003)(66066001)(316002)(16060500001); DIR:OUT; SFP:1102; SCL:1; SRVR:OSAPR01MB1860; H:morimoto-PC.renesas.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: renesas.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; OSAPR01MB1860; 23:I7f/s4KaOKjYUB2fAnxo8sY8qHc8AzclJaNKHVgqf?= toxjvs2GbknaDbYzA3Ko+iqmsOeJdZ5wwsuJgp/ZHLLHyhUBkWFs0tKtfQFjGpvEdL0//98IhvfoJnWCtwue0mzpLBBdUxQXGwJqXTqfzM12Sw3QGSGvbRiGVkwShbMSntXaO40cMoc2nCehvyzgQXOXcx0n9WnKx3VmFzOFu7Unc0qNawKlkEPcwLsK4MhN4p9YDMTX6DW1taUZU7P6CoghnFxs9rg8Zhi+0pmYQQnoMDrfUHkYtm1ynKa2tw6C3wcO9FF2AwM77pzO6y7FWJSJrOgqWuzqG7qv9FwV4Ecf9U7Fbid0cGcmPFLdv2epvD3wuPJzt2ZKu7d4+JEqSnwjZjRVQUIuRCEmJ7Mw2IUwbLAQ3+RQyRZluQIpR91dvElOu6SGLjA6uPaRWy1C/SvSdSInhkZmE2MRXbHTXO4tp0ZSx4uain9YAynFqASaJdcp5cJsQi4f/I42qUelyQeyYbMd9pAECDFyw+I4Pn5H3r+x83JxgjIWhl9oEunDOVArW56KVntZ30vPPVdRcu5Isskh0hrE44uc8KiSkUUptdPxUn+n9fGed7+9y1AO1URYfDrqSATjEccnjbGPD+SGucm11LHy2W+GMv7AVsGoV58GlaWksyJyDByGHIL+lUSFOXvmVPk/zpqVHuffN9QAk4UXph/iQUli0TG4FZbGi1QSB99QgXjXSr+QTdwRI7prw3GDjS2RsZ1th9XfHGhHEW8wmc7dXbJUkAF6N3dOwr8OKrr7t4E+7/6K0z5EVVZekpsXZXPaAZgtNX6KOB6TuewMO4Y9RNrDDaqd0ci6sETSxTZ8qepJgR5IafT0dhq2JV1dyOWDibcxepfhDTZQlTrXBzLI6ZZVExx7bO0CjT6G11IBRh5NzhD3F7n77JKRA5dHVosE5HRTi7oCSSbNIIxz3HCuWwzGS4Zk8iOpxwhMccZn7Rd8g1xLK2sFxrLJuxlTxrRQFO+rZwHNSaZXPv1cWJ9EgFSbE+mfFItR60YfCBqHNjOwPdhOn1VXoM9rbabXyhtcP13YoNitoIFzQQU5lYipDEtV2+EDsoVug3sQSzzjBsQ7iWrDeEmh823+o1eEx8s4NEY4R72s0zF996BPzWsQJ31kCRpnfi9fkaah7fSzdWY+B4QRlExWAt+i6eMWvkRwVcsyQVw8bekK7+uEzv4p4KLA7hDnVe/bw== X-Microsoft-Antispam-Message-Info: HZOUvHs5WKvJs3YizfegTlpipM+MAdGQcBR6MlYAA2fu5uJI0E6Vm0QM0q8PidwIRFHYE2antlwBIpKPUQ2X2k1aHIBxzU1Ed+ueCiY8dJ6GKooTjCv6woQBTQwsGMGoYSgomb3sgZdXqG0xDN1CTBFXJAnjXZb9w/eQvlXqrBCnlfHT1zAhDk6FGPh9LkfBhAtdrCi9P3xjI3vn0M/gu/hnWDDwkyAhyFR+nrh+zN4BGNE8asDahAuNxRKBdcE1u3P+6m+b49OFojbGSyXV81OW32mnibiKluiLGmPTuepzFg8+x0YRzzvUjhaa9Ki2fj2/5wBkev36Qwc5YmtUT0IlVk+W0fMzAkzA4nW5cK0= X-Microsoft-Exchange-Diagnostics: 1; OSAPR01MB1860; 6:Bo/JLI3GdUOFdA/GFKI6PYzEVD/6c2b7rPw657FXow6hVNJjEmeqtSyotu6/AARcAPsdZRY/XlKSs9jmXe8niuhqFSh7lOF9IbgkJVEi4oirPG0Tm4HfL3USOMK10MrvRRty/MzZZ45irmQ6LDD0oCsg1INbK/phbXJ4Myq2n3BeyMkSkVPwKSBmo4c9WVFhtl8W+/99lR2qprmKjoMSzpX4dKNPCPRjU+9lABqrH8TLDBQx3wBdpEvbemPUDA9q+f2hyYuYPaESOJF2dRa9GyNF7CSkmJmz7pvRcb+aeSZbA0z6uM6VYGfIKbvUPtMZ7Jo0cZIXjoBe48zz/3MmmSaNsyW266vEwo0Z0HAM1jcJmlUFZocTztYT4wQBysxk9YBLY6P1lXlLTZsWZBsKOkmIRfDA9x8soNbOsAA7yxWSFAg+RuNKz9fiwCgoLs5njubKHnJlbrG6gPTMgqpRyQ==; 5:XZlFs+i2j5UDSk1lVITKSYrLi2OGpPa+XvY4/L9yuXCCGv1Z9Wt2QXV5J1jLtoBJBZ8Bj1Qe44mdck0PnxaL8K2s7nfpYit/LeX7a9nxHFY+wYiF5NKsFWFD686KiB57PEdHxHaZ0EjMgYA9qGY4mtRXM+rI8Pdn5bFiaPyHnnI=; 7:GlTz5eYLUaLqarYUUbReVyOQn3EVebukQDq3VjQOzy41KhHyBdXsTEEa86qPPjbqtvp4MDzdslWLlZzXn9r9gk+aN5ugdnYNj5vJMU8L77z51FhST5/6bdz/aq7171EXv+rBWlWKHmDGDzpRaFzF4jEgmcFTnfovimPo0ZieTjY/21WW5qEiDjIziRqyI50oKVJpi28TuR8XWjqW4Q0ECcSxhQlwlCR4PpMvdhWKx/V8kq36G2/wHSqg9Bajadgp SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; OSAPR01MB1860; 20:ll3ZdKxpY1gvIawE2UXtBMwkesckVM4ShPgJonJt0hN3vv7pAjg8feIq1phC8zyuRQFrgvErOUiP9ouUO3RYIbO7OqFTLG9kfCMWvuR6D/rziNE9aWj71otfy5avTd0gmdoWaGeVKysYLEhz/M4xy1IWmcVGsLaX2Vd6YFeSmJ0= X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Sep 2018 07:05:42.1667 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d525b225-19df-4a03-d0e5-08d6116ba98e X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 53d82571-da19-47e4-9cb4-625a166a4a2a X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSAPR01MB1860 Cc: Jiada Wang , Timo Wischer , Linux-ALSA , Hiroyuki Yokoyama , Dragos Tarcatu Subject: [alsa-devel] [PATCH 02/13] ASoC: rsnd: add support for 16/24 bit slot widths 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: Dragos Tarcatu The slot width (system word length) was fixed at 32 bits. This patch allows also setting it to 16 or 24 bits. Signed-off-by: Dragos Tarcatu Signed-off-by: Jiada Wang Signed-off-by: Timo Wischer [Kuninori: tidyup for upstream] Signed-off-by: Kuninori Morimoto Tested-by: Hiroyuki Yokoyama --- sound/soc/sh/rcar/core.c | 32 +++++++++++++++++++++------- sound/soc/sh/rcar/rsnd.h | 8 ++++++- sound/soc/sh/rcar/ssi.c | 54 +++++++++++++++++++++++++++++++++++------------- 3 files changed, 72 insertions(+), 22 deletions(-) diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c index ab7e317..ce0a3a6 100644 --- a/sound/soc/sh/rcar/core.c +++ b/sound/soc/sh/rcar/core.c @@ -540,6 +540,14 @@ int rsnd_rdai_ssi_lane_ctrl(struct rsnd_dai *rdai, return rdai->ssi_lane; } +int rsnd_rdai_width_ctrl(struct rsnd_dai *rdai, int width) +{ + if (width > 0) + rdai->chan_width = width; + + return rdai->chan_width; +} + struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id) { if ((id < 0) || (id >= rsnd_rdai_nr(priv))) @@ -720,6 +728,16 @@ static int rsnd_soc_set_dai_tdm_slot(struct snd_soc_dai *dai, struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai); struct device *dev = rsnd_priv_to_dev(priv); + switch (slot_width) { + case 16: + case 24: + case 32: + break; + default: + dev_err(dev, "unsupported slot width value: %d\n", slot_width); + return -EINVAL; + } + switch (slots) { case 2: case 6: @@ -727,6 +745,7 @@ static int rsnd_soc_set_dai_tdm_slot(struct snd_soc_dai *dai, /* TDM Extend Mode */ rsnd_rdai_channels_set(rdai, slots); rsnd_rdai_ssi_lane_set(rdai, 1); + rsnd_rdai_width_set(rdai, slot_width); break; default: dev_err(dev, "unsupported TDM slots (%d)\n", slots); @@ -755,7 +774,7 @@ static unsigned int rsnd_soc_hw_rate_list[] = { 192000, }; -static int rsnd_soc_hw_rule(struct rsnd_priv *priv, +static int rsnd_soc_hw_rule(struct rsnd_dai *rdai, unsigned int *list, int list_num, struct snd_interval *baseline, struct snd_interval *iv) { @@ -772,14 +791,14 @@ static int rsnd_soc_hw_rule(struct rsnd_priv *priv, if (!snd_interval_test(iv, list[i])) continue; - rate = rsnd_ssi_clk_query(priv, + rate = rsnd_ssi_clk_query(rdai, baseline->min, list[i], NULL); if (rate > 0) { p.min = min(p.min, list[i]); p.max = max(p.max, list[i]); } - rate = rsnd_ssi_clk_query(priv, + rate = rsnd_ssi_clk_query(rdai, baseline->max, list[i], NULL); if (rate > 0) { p.min = min(p.min, list[i]); @@ -799,7 +818,6 @@ static int __rsnd_soc_hw_rule_rate(struct snd_pcm_hw_params *params, struct snd_interval ic; struct snd_soc_dai *dai = rule->private; struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai); - struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai); struct rsnd_dai_stream *io = is_play ? &rdai->playback : &rdai->capture; /* @@ -811,7 +829,7 @@ static int __rsnd_soc_hw_rule_rate(struct snd_pcm_hw_params *params, ic.min = ic.max = rsnd_runtime_channel_for_ssi_with_params(io, params); - return rsnd_soc_hw_rule(priv, rsnd_soc_hw_rate_list, + return rsnd_soc_hw_rule(rdai, rsnd_soc_hw_rate_list, ARRAY_SIZE(rsnd_soc_hw_rate_list), &ic, ir); } @@ -837,7 +855,6 @@ static int __rsnd_soc_hw_rule_channels(struct snd_pcm_hw_params *params, struct snd_interval ic; struct snd_soc_dai *dai = rule->private; struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai); - struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai); struct rsnd_dai_stream *io = is_play ? &rdai->playback : &rdai->capture; /* @@ -849,7 +866,7 @@ static int __rsnd_soc_hw_rule_channels(struct snd_pcm_hw_params *params, ic.min = ic.max = rsnd_runtime_channel_for_ssi_with_params(io, params); - return rsnd_soc_hw_rule(priv, rsnd_soc_hw_channels_list, + return rsnd_soc_hw_rule(rdai, rsnd_soc_hw_channels_list, ARRAY_SIZE(rsnd_soc_hw_channels_list), ir, &ic); } @@ -1072,6 +1089,7 @@ static void __rsnd_dai_probe(struct rsnd_priv *priv, rdai->capture.rdai = rdai; rsnd_rdai_channels_set(rdai, 2); /* default 2ch */ rsnd_rdai_ssi_lane_set(rdai, 1); /* default 1lane */ + rsnd_rdai_width_set(rdai, 32); /* default 32bit width */ for (io_i = 0;; io_i++) { playback = of_parse_phandle(dai_np, "playback", io_i); diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h index 96d9333..698b081 100644 --- a/sound/soc/sh/rcar/rsnd.h +++ b/sound/soc/sh/rcar/rsnd.h @@ -460,6 +460,7 @@ struct rsnd_dai { int max_channels; /* 2ch - 16ch */ int ssi_lane; /* 1lane - 4lane */ + int chan_width; /* 16/24/32 bit width */ unsigned int clk_master:1; unsigned int bit_clk_inv:1; @@ -493,6 +494,11 @@ int rsnd_rdai_channels_ctrl(struct rsnd_dai *rdai, int rsnd_rdai_ssi_lane_ctrl(struct rsnd_dai *rdai, int ssi_lane); +#define rsnd_rdai_width_set(rdai, width) \ + rsnd_rdai_width_ctrl(rdai, width) +#define rsnd_rdai_width_get(rdai) \ + rsnd_rdai_width_ctrl(rdai, 0) +int rsnd_rdai_width_ctrl(struct rsnd_dai *rdai, int width); void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io); int rsnd_dai_connect(struct rsnd_mod *mod, struct rsnd_dai_stream *io, @@ -702,7 +708,7 @@ int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod); void rsnd_parse_connect_ssi(struct rsnd_dai *rdai, struct device_node *playback, struct device_node *capture); -unsigned int rsnd_ssi_clk_query(struct rsnd_priv *priv, +unsigned int rsnd_ssi_clk_query(struct rsnd_dai *rdai, int param1, int param2, int *idx); /* diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c index 8304e4e..f707f53 100644 --- a/sound/soc/sh/rcar/ssi.c +++ b/sound/soc/sh/rcar/ssi.c @@ -42,7 +42,13 @@ #define DWL_24 (5 << 19) /* Data Word Length */ #define DWL_32 (6 << 19) /* Data Word Length */ +/* + * System word length + */ +#define SWL_16 (1 << 16) /* R/W System Word Length */ +#define SWL_24 (2 << 16) /* R/W System Word Length */ #define SWL_32 (3 << 16) /* R/W System Word Length */ + #define SCKD (1 << 15) /* Serial Bit Clock Direction */ #define SWSD (1 << 14) /* Serial WS Direction */ #define SCKP (1 << 13) /* Serial Bit Clock Polarity */ @@ -220,14 +226,32 @@ u32 rsnd_ssi_multi_slaves_runtime(struct rsnd_dai_stream *io) return 0; } -unsigned int rsnd_ssi_clk_query(struct rsnd_priv *priv, +static u32 rsnd_rdai_width_to_swl(struct rsnd_dai *rdai) +{ + struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai); + struct device *dev = rsnd_priv_to_dev(priv); + int width = rsnd_rdai_width_get(rdai); + + switch (width) { + case 32: return SWL_32; + case 24: return SWL_24; + case 16: return SWL_16; + } + + dev_err(dev, "unsupported slot width value: %d\n", width); + return 0; +} + +unsigned int rsnd_ssi_clk_query(struct rsnd_dai *rdai, int param1, int param2, int *idx) { + struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai); int ssi_clk_mul_table[] = { 1, 2, 4, 8, 16, 6, 12, }; int j, ret; unsigned int main_rate; + int width = rsnd_rdai_width_get(rdai); for (j = 0; j < ARRAY_SIZE(ssi_clk_mul_table); j++) { @@ -240,12 +264,7 @@ unsigned int rsnd_ssi_clk_query(struct rsnd_priv *priv, if (j == 0) continue; - /* - * this driver is assuming that - * system word is 32bit x chan - * see rsnd_ssi_init() - */ - main_rate = 32 * param1 * param2 * ssi_clk_mul_table[j]; + main_rate = width * param1 * param2 * ssi_clk_mul_table[j]; ret = rsnd_adg_clk_query(priv, main_rate); if (ret < 0) @@ -292,7 +311,7 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod, return 0; } - main_rate = rsnd_ssi_clk_query(priv, rate, chan, &idx); + main_rate = rsnd_ssi_clk_query(rdai, rate, chan, &idx); if (!main_rate) { dev_err(dev, "unsupported clock rate\n"); return -EIO; @@ -312,7 +331,8 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod, * SSICR : FORCE, SCKD, SWSD * SSIWSR : CONT */ - ssi->cr_clk = FORCE | SWL_32 | SCKD | SWSD | CKDV(idx); + ssi->cr_clk = FORCE | rsnd_rdai_width_to_swl(rdai) | + SCKD | SWSD | CKDV(idx); ssi->wsr = CONT; ssi->rate = rate; @@ -357,11 +377,7 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod, is_tdm = rsnd_runtime_is_ssi_tdm(io); - /* - * always use 32bit system word. - * see also rsnd_ssi_master_clk_enable() - */ - cr_own |= FORCE | SWL_32; + cr_own |= FORCE | rsnd_rdai_width_to_swl(rdai); if (rdai->bit_clk_inv) cr_own |= SCKP; @@ -494,7 +510,17 @@ static int rsnd_ssi_hw_params(struct rsnd_mod *mod, struct snd_pcm_hw_params *params) { struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); + struct rsnd_dai *rdai = rsnd_io_to_rdai(io); int chan = params_channels(params); + unsigned int fmt_width = snd_pcm_format_width(params_format(params)); + + if (fmt_width > rdai->chan_width) { + struct rsnd_priv *priv = rsnd_io_to_priv(io); + struct device *dev = rsnd_priv_to_dev(priv); + + dev_err(dev, "invalid combination of slot-width and format-data-width\n"); + return -EINVAL; + } /* * snd_pcm_ops::hw_params will be called *before*