From patchwork Mon Nov 30 08:54:03 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kuninori Morimoto X-Patchwork-Id: 7722481 Return-Path: X-Original-To: patchwork-alsa-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id CD61DBEEE1 for ; Mon, 30 Nov 2015 09:02:39 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id AE33E2065D for ; Mon, 30 Nov 2015 09:02:37 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.kernel.org (Postfix) with ESMTP id 2CEF520653 for ; Mon, 30 Nov 2015 09:02:36 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id 0408B2659D3; Mon, 30 Nov 2015 10:02:34 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Status: No, score=-2.6 required=5.0 tests=BAD_ENC_HEADER,BAYES_00, RCVD_IN_DNSWL_LOW, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 978D42654C3; Mon, 30 Nov 2015 09:57:28 +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 F23DB265558; Mon, 30 Nov 2015 09:57:27 +0100 (CET) Received: from relmlie1.idc.renesas.com (relmlor2.renesas.com [210.160.252.172]) by alsa0.perex.cz (Postfix) with ESMTP id 3D3F52654C3 for ; Mon, 30 Nov 2015 09:54:07 +0100 (CET) Received: from unknown (HELO relmlir3.idc.renesas.com) ([10.200.68.153]) by relmlie1.idc.renesas.com with ESMTP; 30 Nov 2015 17:54:06 +0900 Received: from relmlac2.idc.renesas.com (relmlac2.idc.renesas.com [10.200.69.22]) by relmlir3.idc.renesas.com (Postfix) with ESMTP id B44AA50EDF; Mon, 30 Nov 2015 17:54:06 +0900 (JST) Received: by relmlac2.idc.renesas.com (Postfix, from userid 0) id 9793E2806E; Mon, 30 Nov 2015 17:54:06 +0900 (JST) Received: from relmlac2.idc.renesas.com (localhost [127.0.0.1]) by relmlac2.idc.renesas.com (Postfix) with ESMTP id 91A2F2806D; Mon, 30 Nov 2015 17:54:06 +0900 (JST) Received: from relmlii2.idc.renesas.com [10.200.68.66] by relmlac2.idc.renesas.com with ESMTP id TAL28610; Mon, 30 Nov 2015 17:54:06 +0900 X-IronPort-AV: E=Sophos;i="5.20,364,1444662000"; d="scan'";a="200771388" Received: from mail-sg2apc01lp0239.outbound.protection.outlook.com (HELO APC01-SG2-obe.outbound.protection.outlook.com) ([65.55.88.239]) by relmlii2.idc.renesas.com with ESMTP/TLS/AES256-SHA; 30 Nov 2015 17:54:06 +0900 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=kuninori.morimoto.gx@renesas.com; Received: from morimoto-PC.renesas.com (211.11.155.144) by SG2PR06MB1019.apcprd06.prod.outlook.com (10.161.9.27) with Microsoft SMTP Server (TLS) id 15.1.331.20; Mon, 30 Nov 2015 08:54:03 +0000 Message-ID: <87si3nswdn.wl%kuninori.morimoto.gx@renesas.com> From: Kuninori Morimoto User-Agent: Wanderlust/2.15.9 Emacs/24.3 Mule/6.0 To: Mark Brown In-Reply-To: <87d1urub7x.wl%kuninori.morimoto.gx@renesas.com> References: <87d1urub7x.wl%kuninori.morimoto.gx@renesas.com> MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Date: Mon, 30 Nov 2015 08:54:03 +0000 X-Originating-IP: [211.11.155.144] X-ClientProxiedBy: TY1PR06CA0037.apcprd06.prod.outlook.com (25.164.91.47) To SG2PR06MB1019.apcprd06.prod.outlook.com (25.161.9.27) X-Microsoft-Exchange-Diagnostics: 1; SG2PR06MB1019; 2:Dqj+B7kuhtqycJHqgezKPzBAz0ne8Hl0LcuukPhmnDWXwEHEVpZ9zKiF76TikHMFYHEBgCQUvIzKqZknaDyqcO9Ky9k4u8JWips2FWTNdsOzVLte8dP9GjTeutJLvufHAlatpoGbJBUXBqSpPFPXoQ==; 3:opNIrEX/sEdW0q9Fw8+aLr5smSTVoe98dNEhx/P3ZwMZpin8OAGXOMZyjgleMtMYtmKfk1UA0fWqE0wVNg/VxVsKbK5dHwrhbNoFCT0MPhLJGrcg0E05N56WzRTIiKk3; 25:H+Zyhk2qpT49KGOP7Ce1p1MNKHW9uf/Et+yy75/XujbHtFSBmzUKhJro+WqQZbe7zzcjl12P575oUwkhUKG+yQxou99Taw/pR3Fh1KJVMMTwsYMIa8yH2YMDIbrPfo/s/aQxhcRx+VwFXWopk66DTxB0KMR+U1246st1IGiwi3mKPDEAgtetEVK+COdqRVWDFWYnODMtMhDGRMmiNj2K46OWOL0PXsPhprAiFohpJ0409/lSBEgmjrLDunxut4VJ X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SG2PR06MB1019; X-Microsoft-Exchange-Diagnostics: 1; SG2PR06MB1019; 20:0sXCSeORd6mnxIbqEg1isawOS+V/ykVLYUKYZTGtwxUIClNzjc//CL8NacB7N/MZBkxmxLoHRNIh2qyolLi6NEBB79E9onSYOGHEpZc8dKvTXpPRbG7VZMh0J5bodW1UnsX7QnAC+o+xf+rgRG8ZPK/APGgxXc2CpdWtquCJcw9PQP2vtaWcdEVJE47b/sJiJ6ihhJs17yssdf3AW/d/eeuGz+q0T8nnt2y6kbXq4t9HxpfHbfwmdPtK+D3fEanKW3tN6VE3UbVAkN13qiogJ1d9jhJyVENx+Bg2ycKX2e643Ev7qFVMBFB5/cgTSL8U1NVWzmIRE3ZbNbpGaf6UHXBOXtwMY9wlJ3T55AWxQ8hWAHirylXXuPC8EXSzWGWfnzNTywigdobGge5IVk0uWfCMsZX1fyTI4fpYbymzym0JZ4guzfNU0B4RYrHLb6PpgchJwAaikeAf+sWNng2QbHCbDFDLsPNsypcgQITydjLiYyyuuK9IdJEqyN+cEkNM; 4:KMSUiZbkZSLUvOTuaohwaFjj5ZUYZ4JneBR1bgUMJf6+lS+z7BBJDAuzisMg+5S5JzpI1gWJ69kEdRSuKIdoSJrM2PIrEyTtp7mngTKGCs52mYeqK2oumV39+oC3R3ohIUMd+whjd8sYx/BCItYOkd6tpJEYzi8ie1We4YL+kKBZ5aTiXS8kwYRATByAjHCrqqNHosM+fn39KvSW/zYhBUvbCPig518uCM77VsLGmm5q5zKp2X9Dcy3D8TMJQ2v/e2YJZQ8rNxOqwX8YqazJucapk8cBeJpQI6BdDov/BQoM6KNY7n5mTjq86c9ayr3FaY8Tzq0zuaal7l986vz31g+z76duQ4GBIFJGXMlDS+gGVoUjp41qDIha9zrpuGrwxt8coD1grQU5uYMapzAWeXaWHQs/mPY+tgTUDSKLcwU= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(85106069007906); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(5005006)(520078)(10201501046)(3002001); SRVR:SG2PR06MB1019; BCL:0; PCL:0; RULEID:; SRVR:SG2PR06MB1019; X-Forefront-PRVS: 0776C39A48 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6009001)(199003)(189002)(76176999)(46406003)(81156007)(19580405001)(33646002)(69596002)(5008740100001)(92566002)(2950100001)(86362001)(4001350100001)(42186005)(53416004)(77096005)(110136002)(5001960100002)(50986999)(189998001)(97736004)(575784001)(229853001)(3846002)(122386002)(101416001)(54356999)(19580395003)(40100003)(36756003)(1096002)(106356001)(6116002)(586003)(50466002)(23726003)(5004730100002)(87976001)(105586002)(47776003)(66066001)(83506001); DIR:OUT; SFP:1102; SCL:1; SRVR:SG2PR06MB1019; H:morimoto-PC.renesas.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SG2PR06MB1019; 23:1mHBqHcIYNtZFPhTHfyk8HnUweb0ZJOK9Gv0bGYG9?= =?us-ascii?Q?7Y7LdaOONtFWV2/NOu68RXZk6Vq3yO2p6j3aR4efaKrHntVkj4N/xH6MtBUM?= =?us-ascii?Q?5qiUEknYanCHtp9xFkGuFL9gfs95Ywdhr3T9jNxTqz734YKkMMSgo6OYbc+C?= =?us-ascii?Q?KC7jeN3mC3YOz6wdh/U7qWED4K2i+ItldPy2Zd/btshD56ZGV7nXy3a6nkTR?= =?us-ascii?Q?Evp+gvfT4Pnd7nujHYQ08LeKiS+YDY9MCNIY96G/j1CLbydwNNo9hX5oJfsy?= =?us-ascii?Q?zR2fJBfoYUiDw6dZlS4EQ+3iXZVTJiqb76693jl4behDk9PFPHoWpGJIUSko?= =?us-ascii?Q?zYjR3EhxKlHngaOHLWsxWvE3FMf2LaCHHnByv2d4GA7bGfn4zllYavlnWSeY?= =?us-ascii?Q?VAsr3RJUk/o6CIohVaR1lH69s+nmIUSSCMWMl9fGIHqchYEtoDutt5JqXpb3?= =?us-ascii?Q?Pws1yhlzcWR3oEt2hySBie6u1Qctf80s+3zuuWU1EUT6vrREf5rHW29X8Tgc?= =?us-ascii?Q?IyPa5CJdTpEzJLx9avEDog+av6klMOFK4DjDEB3ZqE5xm0WToYMe/f9Vr/iR?= =?us-ascii?Q?m4GhLo8645IHTSfBD95jZDpYngdaNNUjKsW9r+Re4xikhN2gP+hFxBHxpbGk?= =?us-ascii?Q?rr/apo7nOVG0FxzW2fnaGZkezpFCgt078mGfTDOZn+9I0i/rybMqO8slIOdI?= =?us-ascii?Q?dRqgVa5tiKUTw1Ff7fGQijJBHKlSeZdgtub1SpZDnZls+5EUWp5tyPXnoxf9?= =?us-ascii?Q?f6zqUfrFoP39G9tT2HCj1AqHAn1ylgE9ESGZ1iQKwMsGxgOHU7Th11RDRw14?= =?us-ascii?Q?IbuvUMfKfi+WKrituDxp3x3/lQjj9SR2W8FRX8FcrvIf50dbh30ycFbIRqaE?= =?us-ascii?Q?Gu8SyqSBeopBUmqPy3/OzKmUclND/deoF6tnrAWoX4hbODJ6wSH4CyQJGo1o?= =?us-ascii?Q?tvucS6sZOuqhuw7hC1vqps6wLX4HavgvPVgvQDbF9tU4RhKUUpu8HDU4PrUJ?= =?us-ascii?Q?m6nnZzh3AOm7zYIk+JU3fQEMA6zHpsxgDF0KPQ4FpqiwuK1m97R2m7WkkygR?= =?us-ascii?Q?hzis1+EVVvD61WKhNpVoXVgQ79fRzr9WidXObHuJrOqXm/XQHybpELJHExgu?= =?us-ascii?Q?vtnbs+TBIYpwkeKRoiOVo2TRioUoDU/?= X-Microsoft-Exchange-Diagnostics: 1; SG2PR06MB1019; 5:HMwCv8d9QlmXsjIUQyL+3WMIeDmcEEXlLwY3yWwr2NQZxY5fQWJfdsBldARDqvDTA0Gb8fkfK13EOoMWZhvkL02zVVL70Co1jp90r/MJDM82LOKnRMdtqvKS7VCNjcyq; 24:JRxZHwEXkeeAjOvQRKkYOxKpq5hdV6C8Wu74Tz+O/iq3lMXqOse6Hp5rtO0koPn+1ku9SlZpgTGob2hnS7iEsYQa7teDKticjSE1Q+6hvcI=; 20:YmgqXWsxNO+3WwF41VKXyiVeYB3NcdwL7w/mdcHzUmNApOmDIpffss3/nzQH3pE5FnXO2AQeKosdSaeipnx/B90AiM3yF0g9ZO8HQEW9jmFOhZDgvol354R6McxpZKSj3NiMPlMumpM7qT1paWnvPApItVTuj/YnXkPga7iR0cU= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2015 08:54:03.9111 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SG2PR06MB1019 Cc: Linux-ALSA , Simon , Liam Girdwood Subject: [alsa-devel] [PATCH 14/14] ASoC: rsnd: add TDM Extend Mode support 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 Renesas R-Car can out TDM by 1) 6ch x 1 DAI as TDM Extend Mode 2) 2ch x 4 x 1 DAI as TDM split Mode 3) 2ch x 3 DAI or 2ch x 4 DAI as TDM Multichannel Mode This patch adds 1) TDM Extend Mode. Because of HW design, this 6ch data will be outputed via 8ch data width. Signed-off-by: Kuninori Morimoto --- sound/soc/sh/rcar/core.c | 30 ++++++++++++++++++++++++++---- sound/soc/sh/rcar/gen.c | 1 + sound/soc/sh/rcar/rsnd.h | 1 + sound/soc/sh/rcar/ssi.c | 18 +++++++++++++++++- sound/soc/sh/rcar/ssiu.c | 9 +++++++++ 5 files changed, 54 insertions(+), 5 deletions(-) diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c index 7d364d7..b187a89 100644 --- a/sound/soc/sh/rcar/core.c +++ b/sound/soc/sh/rcar/core.c @@ -247,9 +247,9 @@ u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io) u32 rsnd_get_adinr_chan(struct rsnd_mod *mod, struct rsnd_dai_stream *io) { struct rsnd_priv *priv = rsnd_mod_to_priv(mod); - struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); struct device *dev = rsnd_priv_to_dev(priv); - u32 chan = runtime->channels; + struct rsnd_dai *rdai = rsnd_io_to_rdai(io); + u32 chan = rsnd_get_slot_rdai(rdai); switch (chan) { case 1: @@ -569,9 +569,31 @@ static int rsnd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) return 0; } +static int rsnd_soc_set_dai_tdm_slot(struct snd_soc_dai *dai, + u32 tx_mask, u32 rx_mask, + int slots, int slot_width) +{ + struct rsnd_priv *priv = rsnd_dai_to_priv(dai); + struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai); + struct device *dev = rsnd_priv_to_dev(priv); + + switch (slots) { + case 6: + /* TDM Extend Mode */ + rdai->slots = slots; + break; + default: + dev_err(dev, "unsupported TDM slots (%d)\n", slots); + return -EINVAL; + } + + return 0; +} + static const struct snd_soc_dai_ops rsnd_soc_dai_ops = { .trigger = rsnd_soc_dai_trigger, .set_fmt = rsnd_soc_dai_set_fmt, + .set_tdm_slot = rsnd_soc_set_dai_tdm_slot, }; static int rsnd_dai_probe(struct rsnd_priv *priv) @@ -626,7 +648,7 @@ static int rsnd_dai_probe(struct rsnd_priv *priv) drv->playback.rates = RSND_RATES; drv->playback.formats = RSND_FMTS; drv->playback.channels_min = 2; - drv->playback.channels_max = 2; + drv->playback.channels_max = 6; drv->playback.stream_name = rdai->playback.name; snprintf(rdai->capture.name, RSND_DAI_NAME_SIZE, @@ -634,7 +656,7 @@ static int rsnd_dai_probe(struct rsnd_priv *priv) drv->capture.rates = RSND_RATES; drv->capture.formats = RSND_FMTS; drv->capture.channels_min = 2; - drv->capture.channels_max = 2; + drv->capture.channels_max = 6; drv->capture.stream_name = rdai->capture.name; rdai->playback.rdai = rdai; diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c index 2151aa5..50fc730 100644 --- a/sound/soc/sh/rcar/gen.c +++ b/sound/soc/sh/rcar/gen.c @@ -230,6 +230,7 @@ static int rsnd_gen2_probe(struct rsnd_priv *priv) RSND_GEN_M_REG(SSI_BUSIF_MODE, 0x0, 0x80), RSND_GEN_M_REG(SSI_BUSIF_ADINR, 0x4, 0x80), RSND_GEN_M_REG(SSI_BUSIF_DALIGN,0x8, 0x80), + RSND_GEN_M_REG(SSI_MODE, 0xc, 0x80), RSND_GEN_M_REG(SSI_CTRL, 0x10, 0x80), RSND_GEN_M_REG(SSI_INT_ENABLE, 0x18, 0x80), }; diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h index 2111bf3..970e130 100644 --- a/sound/soc/sh/rcar/rsnd.h +++ b/sound/soc/sh/rcar/rsnd.h @@ -44,6 +44,7 @@ */ enum rsnd_reg { /* SCU (SRC/SSIU/MIX/CTU/DVC) */ + RSND_REG_SSI_MODE, /* Gen2 only */ RSND_REG_SSI_MODE0, RSND_REG_SSI_MODE1, RSND_REG_SSI_CTRL, /* Gen2 only */ diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c index 44e9141..628739f 100644 --- a/sound/soc/sh/rcar/ssi.c +++ b/sound/soc/sh/rcar/ssi.c @@ -24,7 +24,9 @@ #define OIEN (1 << 26) /* Overflow Interrupt Enable */ #define IIEN (1 << 25) /* Idle Mode Interrupt Enable */ #define DIEN (1 << 24) /* Data Interrupt Enable */ - +#define CHNL_4 (1 << 22) /* Channels */ +#define CHNL_6 (2 << 22) /* Channels */ +#define CHNL_8 (3 << 22) /* Channels */ #define DWL_8 (0 << 19) /* Data Word Length */ #define DWL_16 (1 << 19) /* Data Word Length */ #define DWL_18 (2 << 19) /* Data Word Length */ @@ -57,6 +59,7 @@ * SSIWSR */ #define CONT (1 << 8) /* WS Continue Function */ +#define WS_MODE (1 << 0) /* WS Mode */ #define SSI_NAME "ssi" @@ -261,6 +264,7 @@ static int rsnd_ssi_config_init(struct rsnd_ssi *ssi, struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); u32 cr_own; u32 cr_mode; + u32 wsr; /* * always use 32bit system word. @@ -297,8 +301,20 @@ static int rsnd_ssi_config_init(struct rsnd_ssi *ssi, cr_mode = DIEN; /* PIO : enable Data interrupt */ } + /* + * TDM Extend Mode + * see + * rsnd_ssiu_init_gen2() + */ + wsr = ssi->wsr; + if (rsnd_get_slot_runtime(io) >= 6) { + wsr |= WS_MODE; + cr_own |= CHNL_8; + } + ssi->cr_own = cr_own; ssi->cr_mode = cr_mode; + ssi->wsr = wsr; return 0; } diff --git a/sound/soc/sh/rcar/ssiu.c b/sound/soc/sh/rcar/ssiu.c index 6120b0a..3265501 100644 --- a/sound/soc/sh/rcar/ssiu.c +++ b/sound/soc/sh/rcar/ssiu.c @@ -78,6 +78,15 @@ static int rsnd_ssiu_init_gen2(struct rsnd_mod *mod, if (ret < 0) return ret; + if (rsnd_get_slot_runtime(io) >= 6) { + /* + * TDM Extend Mode + * see + * rsnd_ssi_config_init() + */ + rsnd_mod_write(mod, SSI_MODE, 0x1); + } + if (rsnd_ssi_use_busif(io)) { u32 val = rsnd_get_dalign(mod, io);