From nobody Sun Feb 8 06:22:06 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010066.outbound.protection.outlook.com [52.101.193.66]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D242233E356; Fri, 30 Jan 2026 05:10:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.66 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769749863; cv=fail; b=Y7Zmxhs2AbFgrTDoq+BksrorD3HkU+UdGkDMm9iLzCMLyaF1tJq2YFRdqYamYKkHgykEWPJAAw3IYFkTguPcQmoz0Z1aYFpTrf5kCTP3LunxuapmpKrV7b9QQgbiSDgnIifeuUEkydfeQFdLf52oyLL0wSpuRj4pZ8ZthkFyeRk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769749863; c=relaxed/simple; bh=kdC6/LoOzEKtJpxIcgqdCHZGCXHcn26hdDsvWOzSTxk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Id6VNW+8ALjKpdgiHfhS+FR7fqBAW5o2rLZrR5Iti69CexSnS17RKySe8FusBn0YVUZb0cCy4nuAI9oKyIul+8+XSVY4sMynbtA/jnz2GhmwH95ye9YVliHvKO1HkkmS0BWHhUwlOZS3d99ZSk1S+lzkfertSw2kgItVz20g1dk= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=GW407SOt; arc=fail smtp.client-ip=52.101.193.66 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="GW407SOt" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ppLxXKWgIXblbLA4a5T+4a0VlIAEQhagpXL9PF3kXJEyBFczF3mx5sXlY4tkgpYWG8ND+OhZDW/jXK0Uxar8bsdfD0Xogo3MOFc1wCzOwhDxmOwPvEmN2uLhjEbzeYNwL6Srwxto+aK/2q17r7ZV3VDVc+FK3ony4y2jCFPOTdQUeCek9gelqUF5xwnHGAsttDelzN7xTig3eBroO5SqOFAq4BYmF4NW6+GN+ZuDJRnrzJjiTeRih84+kqIUGc4rf8jnIbLKaUqITWYd0QEAfCcF5imxVq5bV0CgFWnsu4X6C7Y8qOrhysPTR2KPYEnffBrM9mmU0Y4foDsS2qjB2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=wgyHjFqRytWd9tkBKnSoeGBYFory6CM7c1qHFfUiP/s=; b=w7gTTg9e8jf+x05mJPXuv28izo5FASdki/t7mGKCHKM91rbg0wwqIv8j+SSWb8AztPl36jklRNic2x0g+krdpXd1MeBZHGlqfiFuoh5npGWynpHEUwb1Grl7Ulo3toUohNFo7SQqCJMlk3qAgUGT8kn4zezaOriAN8fLzmG9Kcq7Q+7dtXpy5Mq4KnJNs1GwSTGEniW2GgLlbGWmL39HeRPthd4ecKAbsgbUyxNX/QP2vIpwEtHSDfFOgspXeLp8KRMrBb2MJBcR37jQ9jzlTNMmx8G8aWraxSoYwbaF5ftkDt5LhwW7Yh+Vw8oTCrp2PvQwU92LCwgjdtUR+1OCoA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.21.194) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wgyHjFqRytWd9tkBKnSoeGBYFory6CM7c1qHFfUiP/s=; b=GW407SOtY3y3WFjZ65+Olr1fMvbEiLRceNU1hsBPwoEjIuBE6xdMR7MdYOD4hgq/i3LWBYI9pP5qrGBlgwNVw2o7t1eRekWFErvtRU3Zpkbe5mFwu8zNaE428JL2YJZ1uIriYyREeFRjRpDNx8PbyPNU6CrvqIFMDnNuqhQ0rvg= Received: from BN9PR03CA0782.namprd03.prod.outlook.com (2603:10b6:408:13f::7) by DM3PPF3F503E3E3.namprd10.prod.outlook.com (2603:10b6:f:fc00::c21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.7; Fri, 30 Jan 2026 05:10:53 +0000 Received: from BN3PEPF0000B06D.namprd21.prod.outlook.com (2603:10b6:408:13f:cafe::60) by BN9PR03CA0782.outlook.office365.com (2603:10b6:408:13f::7) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9564.10 via Frontend Transport; Fri, 30 Jan 2026 05:10:44 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.21.194) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.21.194 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.21.194; helo=flwvzet200.ext.ti.com; pr=C Received: from flwvzet200.ext.ti.com (198.47.21.194) by BN3PEPF0000B06D.mail.protection.outlook.com (10.167.243.72) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9587.0 via Frontend Transport; Fri, 30 Jan 2026 05:10:51 +0000 Received: from DFLE204.ent.ti.com (10.64.6.62) by flwvzet200.ext.ti.com (10.248.192.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 29 Jan 2026 23:10:46 -0600 Received: from DFLE207.ent.ti.com (10.64.6.65) by DFLE204.ent.ti.com (10.64.6.62) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 29 Jan 2026 23:10:46 -0600 Received: from lelvem-mr06.itg.ti.com (10.180.75.8) by DFLE207.ent.ti.com (10.64.6.65) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20 via Frontend Transport; Thu, 29 Jan 2026 23:10:46 -0600 Received: from localhost (mz02jj9v.dhcp.ti.com [128.247.81.0]) by lelvem-mr06.itg.ti.com (8.18.1/8.18.1) with ESMTP id 60U5Akmj748611; Thu, 29 Jan 2026 23:10:46 -0600 From: Sen Wang To: , , , , , , , CC: , , , Sen Wang Subject: [PATCH 1/4] dt-bindings: sound: davinci-mcasp: Add optional properties for asynchronous mode Date: Thu, 29 Jan 2026 23:10:41 -0600 Message-ID: <20260130051045.1898892-2-sen@ti.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260130051045.1898892-1-sen@ti.com> References: <20260130051045.1898892-1-sen@ti.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN3PEPF0000B06D:EE_|DM3PPF3F503E3E3:EE_ X-MS-Office365-Filtering-Correlation-Id: f66e5270-8329-443c-2f06-08de5fbdf076 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|36860700013|82310400026|7416014|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?UsmIDuP6ARLTWNfFxr3HxgEynLNg5VngwUo+sy+flB90SdwuDWy2P4YNNY/P?= =?us-ascii?Q?l7OvI0NHuzob0rF+oDAG7cFbeUuSgd6/CLmqi1J7gw7S3fc0HWAfYdzJUif0?= =?us-ascii?Q?/CS79DvA5lljVFXOfUR2CFzZjTSoLE0i2vvK2a30KIurJMOhuO4iYV16SGVZ?= =?us-ascii?Q?yygrNXqsnJvymmKIiFiWd8y/cE1DyMKME+1nNhMh/tAy3JFHd4h65iOIQnMI?= =?us-ascii?Q?hNOMCOLkEcmFLZdoqyslN0KEeezNTcBIiHveciSrgkUqacDp/fiv3axepJJV?= =?us-ascii?Q?o5OvODm7yEB5AoPUahwm1tUE5Hv/7e4oDVB29BcGu5GsgbzM1x5z38akY/tO?= =?us-ascii?Q?IFSEecqU5LbqSetR8nnYZxPJB8fXmCNYy0rsvirytKsgGTeNgx3okuO3acsk?= =?us-ascii?Q?Xg0m0Cq4UNDzWYaGwsQhSY4OcnabD/HL3UWvBJGYmiqsvbQBoSNujp5olNnp?= =?us-ascii?Q?9e9Hh/Idx2am7kQApq1ILEcnZ9nmTJlA9xVVvN9HwC1YThCjhV+z7pd1VmIr?= =?us-ascii?Q?ck/C5yCyklG4EsAiV0Z/MGRd3ZQdC7UU8cPQYfmIFW36WnrF/Cyj5oYxlhut?= =?us-ascii?Q?Ko82dGsYJ3ptdzgSxcaS4+zHTLplthku0PNeIzynHflsupCJkn/R4SHjTm2i?= =?us-ascii?Q?zAFO3m/8VljirWKpsHVCd4nYkMIrc8kWNmDuxPjXHYLZ0v+Oor1fakPTxE7l?= =?us-ascii?Q?dEniPiVj7By8kQ54fA3M/C4eGbWlMeeJg7k2h4dLrS30HAlJFa/Bv3BqQETr?= =?us-ascii?Q?eJMqXZ6JN7JYf0yppSG4mQ4RkKlwsHeiG5H9vIUs1CKQ2gqxNDfAS0BqAOl9?= =?us-ascii?Q?sGqJHC3oGb6lAWd60cEPnXyZ9cGAsOYfERrMMuxIqaatjp9FeosjnrFU1yVM?= =?us-ascii?Q?M61uwRXK1sGbFPy+/KOm2q77/NdOeXJxdYmvXIACMczQ7F2F/SmGD+s2Kk4n?= =?us-ascii?Q?vUajfpPsnwpigqmy60JCYPo0oVGIxxazScGoYVkvsRWWkcnMKKqpbwn1pVze?= =?us-ascii?Q?33xKJi+BuUhHK0Vwo02lM5wMLRoCCaPowG+8S2X5vghD01LuQllA4i/VXlbN?= =?us-ascii?Q?cNtyAtfvJd4SC81JTZLxfBOD7FS4Rr7/qMqojYL5TGUoVcsbAb6yeIag0w8U?= =?us-ascii?Q?53Iq7Xo8UMLUMkvuvMVcRQwa3cuWJ/cnndylUGsJz1Ui45vY0LwHoSPwj7In?= =?us-ascii?Q?rBiToZe/jorK2UyTHjPpvAsPN9fmKaDfwJscfAbf4qHC1NkdYJT17CXYapQ1?= =?us-ascii?Q?fnXWB8I2q2qDJ0Ux3AyDygUufcQHBnNJlU+QvcLrIXmyRE4bGBw5Jsv2bKsx?= =?us-ascii?Q?xe9TUQcKYkoSvGrpGNixwoPTthA8wAXrlaYYeUaLGRGZsAUpGVl9Xv8yYD+M?= =?us-ascii?Q?Fy8IEJ+ETAjbXiDqiqvsbfgo3BLQK/JuUqbCzz0pzJD1XTbyAN78fA1Mm5kQ?= =?us-ascii?Q?coWU2BHRDlxEhwBo6dCcO4yXRBJ4gXvCrFBLgDWhMQotVygigSSeR+EdS94w?= =?us-ascii?Q?ap3nGLSTNqJrM5Is+oz+PtJbzSO6wULpSQjl?= X-Forefront-Antispam-Report: CIP:198.47.21.194;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:flwvzet200.ext.ti.com;PTR:ErrorRetry;CAT:NONE;SFS:(13230040)(1800799024)(36860700013)(82310400026)(7416014)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: cKFRfF4C7u2TiqNhs81+t1vgpgq5WZQb+T4Eju6V66m7/M/cT5uTWNytYa+6mJxlNrSG0IFPObX5EAT9UEF++Iq4izm2/7uazTmFbfXjUxaKzYyAYw0PalOroj3T7jP17AiIdrhCfqouDbNmsXJDNcjXrZRfDaEOPW7zb256GtOLwOoGxbG3C0Hm26rBeLOYbwfhzHbvWcINhPV/JZnTMYcXFPHKzfTdx4u4C8vom6ZPYv7Rjl4BWS41aH04nkIWkYuUEZD4gColuvRpENJvH2lWnfSMw8EKix7NJh97BIFam9/qQifEfHfKg1yDeVAgkWNEKpYDEuEWs/iGz1GAMIDj0Dsjgvl1pP1EPaS2NMsjTcZywE3imnBPXjbfdF0XLMnr/AZoB9kGOSr/sEdAmgWsw+BnxTVlPX0c4IlHGgfyBWC9VrwSlu2kuu1NwqKB X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 05:10:51.9711 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f66e5270-8329-443c-2f06-08de5fbdf076 X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7;Ip=[198.47.21.194];Helo=[flwvzet200.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: BN3PEPF0000B06D.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM3PPF3F503E3E3 Content-Type: text/plain; charset="utf-8" McASP supports the independent configuration of TX & RX clk and frame sync registers. By default, the driver is configured in synchronous mode where RX clock generator is disabled and it uses transmit clock signals as bit clock and frame sync. Therefore add optional properties needed for asynchronous mode. Add ti,async-mode boolean binding to provide a way to decouple the default behavior and allows for independent TX & RX clocking. Add tdm-slots-rx uint32 binding to provide an alternative hardware specifier stating the number of RX serializers. The existing property tdm-slots will still dictate number of TX serializers, and RX if tdm-slots-rx isn't given for backwards compatibility. Add auxclk-fs-ratio-rx which allows to specify the ratio just for RX. The driver can be supplied with two different ratios (auxclk-fs-ratio and auxclk-fs-ratio-rx in tandem) and achieve two different sampling rates for tx & rx. Signed-off-by: Sen Wang --- .../bindings/sound/davinci-mcasp-audio.yaml | 71 +++++++++++++++++-- 1 file changed, 66 insertions(+), 5 deletions(-) diff --git a/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.ya= ml b/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.yaml index beef193aaaeb..87559d0d079a 100644 --- a/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.yaml +++ b/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.yaml @@ -40,11 +40,33 @@ properties: tdm-slots: $ref: /schemas/types.yaml#/definitions/uint32 description: - number of channels over one serializer - the property is ignored in DIT mode + Number of channels over one serializer. This property + specifies the TX playback TDM slot count, along with default RX slot= count + if tdm-slots-rx is not specified. + The property is ignored in DIT mode. minimum: 2 maximum: 32 =20 + tdm-slots-rx: + $ref: /schemas/types.yaml#/definitions/uint32 + description: + Number of RX capture channels over one serializer. If specified, + allows independent RX TDM slot count separate from TX. Requires + ti,async-mode to be enabled for independent TX/RX clock rates. + The property is ignored in DIT mode. + minimum: 2 + maximum: 32 + + ti,async-mode: + description: + Specify to allow independent TX & RX clocking, + to enable audio playback & record with different sampling rate, + and different number of bits per frame. + if property is omitted, TX and RX will share same bit clock and fram= e clock signals, + thus RX need to use same bits per frame and sampling rate as TX in s= ynchronous mode. + the property is ignored in DIT mode (as DIT is TX-only) + type: boolean + serial-dir: description: A list of serializer configuration @@ -125,7 +147,21 @@ properties: =20 auxclk-fs-ratio: $ref: /schemas/types.yaml#/definitions/uint32 - description: ratio of AUCLK and FS rate if applicable + description: + Ratio of AUCLK and FS rate if applicable. This property specifies + the TX ratio, along with default RX ratio if auxclk-fs-ratio-rx + is not specified. + When not specified, the inputted system clock frequency via set_sysc= lk + callback by the machine driver is used for divider calculation. + + auxclk-fs-ratio-rx: + $ref: /schemas/types.yaml#/definitions/uint32 + description: + Ratio of AUCLK and FS rate for RX. If specified, allows + for a different RX ratio. Requires ti,async-mode to be + enabled when the ratio differs from auxclk-fs-ratio. + When not specified, it defaults to the value of auxclk-fs-ratio. + The property is ignored in DIT mode. =20 gpio-controller: true =20 @@ -170,14 +206,38 @@ allOf: - $ref: dai-common.yaml# - if: properties: - opmode: + op-mode: enum: - 0 - then: required: - tdm-slots =20 + - if: + properties: + op-mode: + const: 1 + then: + properties: + tdm-slots: false + tdm-slots-rx: false + ti,async-mode: false + auxclk-fs-ratio-rx: false + + - if: + required: + - tdm-slots-rx + then: + required: + - ti,async-mode + + - if: + required: + - auxclk-fs-ratio-rx + then: + required: + - ti,async-mode + unevaluatedProperties: false =20 examples: @@ -190,6 +250,7 @@ examples: interrupt-names =3D "tx", "rx"; op-mode =3D <0>; /* MCASP_IIS_MODE */ tdm-slots =3D <2>; + ti,async-mode; dmas =3D <&main_udmap 0xc400>, <&main_udmap 0x4400>; dma-names =3D "tx", "rx"; serial-dir =3D < --=20 2.43.0 From nobody Sun Feb 8 06:22:06 2026 Received: from DM5PR21CU001.outbound.protection.outlook.com (mail-centralusazon11011065.outbound.protection.outlook.com [52.101.62.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4645F33C18B; Fri, 30 Jan 2026 05:10:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.62.65 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769749857; cv=fail; b=Z1UXTRcPsS38VsvqjUQSvhWPP9PT7qoINgwdBZyMH6e3nXr+YJP3iHw5zrbA2ilfQ1zphBLl6vaRb0Mg0eQbCECMTfJa1n+msnKVW3Ki+xiQBIoJvQBNGs6s8etJDhmYq7QLFJRgWXaZoaC0GsDhDG3rrMyyubF1MGjh4/AdBkA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769749857; c=relaxed/simple; bh=3xhf3p6KShdWxm8wLshve+NrLUH3RKfLSICMdKt0VHo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=jjRPoJeoTn4tjPHXlRm4A3pZAdFbgM0OvkRSvKQBghJ/40IYfxmSsGvIqB5F4uzqpBpS91/SVCW3bCOffpmyJVL1nxXPOWBF0T0kaC+d5ZuLn05vZu+HIiuxwtxwC60hCIxcgiRyJAiqoLDrnuTGXQHozWX386VfAKTQuTa2+C4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=M2MhzS3X; arc=fail smtp.client-ip=52.101.62.65 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="M2MhzS3X" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=gbcvUqVLW4g+QCv/1Hnx7bgfMFafwtIYR9B7ZnNV5FF3LNMyqLN3N9lnbTVhjhDAV/oWeiTot7CkjnDwipqpsHb639FLknP2MkMNnYZtdBMaP5wOtS+AYecBkNSkYC6p23F3CB3Fmv5xiEjfyReN1lNAD/PncFkjcvw0CSKiZdJAKOCY87k3Xvxn6Jm4un7fRt7iQjIXiONtXUveTtfpQclrwtLKqXObiIb8o3gSd2e759vYBOlIL784VxI4sxkOYKx/a5MuFXdOm4VgOmd28JgjYuQoiAlqmmniUvs3oNjnJZVmdvEDCQW+7diVP/y9XvUkjpnOJ0ng5UVWRVXHcA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Fx6AUV/eZi4qaJiMhrZVMKP1cKHaQGAATmLnnOELOz0=; b=rfm6wJgqs5wK5H3ETJSUoKTQLl3Y+s89JWS9HTGbo6mv71yZ20H1kOahzsB270vHYfXB7gkflkHVdtcw15k4rn9xpOAb8JlqDhe0qKU9t3IrmCZDuZj3mE/da+vcP/2eJ5aI1f5C4NUMNuvkIVh/aGtKQ4ulqQHGjvm/ENJEz8Jb97CMm3apGSBafUfJ8M6KXhNKfBkeeO6EHzFM5bLhawhqsPeHXUaBqylDiHJN/OgWiY8/xe8tZAcUJ2Hx+3Lbn3aPFQI8SQbRgBLx3WP9t1K5pyNQ8h28OT514w9MA0L5bhDx4jQdjYsIgBuyHMnAXAUPBG99vpSLAcVh87CWdQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.21.195) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Fx6AUV/eZi4qaJiMhrZVMKP1cKHaQGAATmLnnOELOz0=; b=M2MhzS3XXXYN3tj4/eIY9WkZ/BZGTMhsdEJzMUSw/VCy8H2Ps+SfMt3dhxIw/YVamahgT3k77zQBzlwyGM+cwmpxgmXm3S8jdbW6i5me7+GpqomQshDzX3o6g4+tNhUPRDXEo2xfk6bhm4DAyt3zyB5H2fDSQDXXulZr5v3G/ko= Received: from SJ0PR13CA0238.namprd13.prod.outlook.com (2603:10b6:a03:2c1::33) by SN7PR10MB6497.namprd10.prod.outlook.com (2603:10b6:806:2a4::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.7; Fri, 30 Jan 2026 05:10:53 +0000 Received: from CO1PEPF000044EF.namprd05.prod.outlook.com (2603:10b6:a03:2c1:cafe::1a) by SJ0PR13CA0238.outlook.office365.com (2603:10b6:a03:2c1::33) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9587.2 via Frontend Transport; Fri, 30 Jan 2026 05:10:41 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.21.195) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.21.195 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.21.195; helo=flwvzet201.ext.ti.com; pr=C Received: from flwvzet201.ext.ti.com (198.47.21.195) by CO1PEPF000044EF.mail.protection.outlook.com (10.167.241.69) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.3 via Frontend Transport; Fri, 30 Jan 2026 05:10:52 +0000 Received: from DFLE202.ent.ti.com (10.64.6.60) by flwvzet201.ext.ti.com (10.248.192.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 29 Jan 2026 23:10:46 -0600 Received: from DFLE205.ent.ti.com (10.64.6.63) by DFLE202.ent.ti.com (10.64.6.60) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 29 Jan 2026 23:10:46 -0600 Received: from lelvem-mr06.itg.ti.com (10.180.75.8) by DFLE205.ent.ti.com (10.64.6.63) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20 via Frontend Transport; Thu, 29 Jan 2026 23:10:46 -0600 Received: from localhost (mz02jj9v.dhcp.ti.com [128.247.81.0]) by lelvem-mr06.itg.ti.com (8.18.1/8.18.1) with ESMTP id 60U5AkRj748615; Thu, 29 Jan 2026 23:10:46 -0600 From: Sen Wang To: , , , , , , , CC: , , , Sen Wang Subject: [PATCH 2/4] ASoC: ti: davinci-mcasp: Disambiguate mcasp_is_synchronous function Date: Thu, 29 Jan 2026 23:10:42 -0600 Message-ID: <20260130051045.1898892-3-sen@ti.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260130051045.1898892-1-sen@ti.com> References: <20260130051045.1898892-1-sen@ti.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1PEPF000044EF:EE_|SN7PR10MB6497:EE_ X-MS-Office365-Filtering-Correlation-Id: 34e65fd6-320c-43f3-6ae8-08de5fbdf080 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|82310400026|376014|7416014|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?3SpB3rUCqaQF89pAGuA6yWA7yf0oNI/aGhMiICuy2zlJbM/BSthjBmDshxuz?= =?us-ascii?Q?N3BRx8xxkp9p85Qx/D/F2UmhahYz9s43WnQdSwGZeEgPfYoX98qLajXlq1d7?= =?us-ascii?Q?+AVyAwIOqMA6NoWVXHYRrd2Bq59UHUGXn8E+wI8TXsVA+K6+JVv1lkbX/vPy?= =?us-ascii?Q?aQi7tP9WpLEx/32Z2XCtohGV3RXRDgYR4yzwOsWCT5O04AksTLqhIdjw4SIa?= =?us-ascii?Q?52Lzsnm/eoQDIkYZMd+b7qhLf3050wFQ9AzEymgFrNu7EDz8LtJ9b55C+6+h?= =?us-ascii?Q?eUWddkuNLl/B5ff89QyFUVxvd7wvysMzZ2vh95QT5kZad0TCCPETZz4qpWan?= =?us-ascii?Q?onZ9jxe2ydqi1Odv0Pz+xZACiuD8Yq0DB64pn6Um879pMoy+UWmyGbQZHXxa?= =?us-ascii?Q?dDz8IlpbXzoyjsfoVMETaeJNIR++uzguBMLNLebABgZ6lV/fdadVBKLN6LuQ?= =?us-ascii?Q?BvIHfkxxnUUO8IMkQvygmdF1iSlH5cRj6g7+1vjGEW6hMMjd40OnP+SgEu1l?= =?us-ascii?Q?41GZ63/L6//hqyjAd7fDOfZEH52KqV6zK6+mz9G5bnIhKYW/3J4ENZJ6yFH7?= =?us-ascii?Q?uVxWu/Phdf+f4FH/5Xmk+Hc4Vgnbj8zDUW91TFpmZWYtrDFA2j2YKyQVlucB?= =?us-ascii?Q?IiHxPQ0FoqeYckFgabb3GPCuCzOUP4tdILUKVA7aRUJzzy79wBc8pGkQ4Rqp?= =?us-ascii?Q?z5TnDj/N2b74Tim34CfCFEvcq6FYWx/0cT3uE72RIXpGA6zeo/k9Ui+Zk5RL?= =?us-ascii?Q?qiFzkbSltWWeka1VBcBOfmuj46wqPhxmekXmF8CNAlr073OqZEQ6BsO1Fcu9?= =?us-ascii?Q?Lcp1LwaRVfDkTKmnyT9I1FEUzP2sRsZkS0VcU3AOf10J4j8xP58DsCygLwje?= =?us-ascii?Q?YwnjGdWrzfZo/Xdsw4XKWz4iiTDXiv88UUEGbm5kFnzccTFOVF5ehZOKp4yJ?= =?us-ascii?Q?YmXVNaxWBJaNku6uDKrBygRZJTK1gEhqGEH3q9ek6qQMtLY96KOvDg5m47cL?= =?us-ascii?Q?/Kv0WsMACd9fr9jg/7eNPfoL3A5HigrbYDSIOesfsRNIpXH81SWO+fbFcgdG?= =?us-ascii?Q?9Yc3b1uursm2H5qJR71rzwWP+uWn25AuS+q5PcNDlvohnHf8Z/X2HQ+62GAT?= =?us-ascii?Q?TrvFsWHl0O3IBVat8MkDjziGHqmdhPcAK7AGn3PTQ1xwwg2CUYSPF/HbtVLj?= =?us-ascii?Q?/CI1HHTZL7Wn4wx7RiJWpUZTk861Diw7kur8WaoLthHz9/vs3UjDKS2RRhVG?= =?us-ascii?Q?rqK3C9jF2Ym/RKdcqqzaBpq9uawWoNwX/6ofVRixqFFRQR/qd+PF5bw6EZuU?= =?us-ascii?Q?pcb08UcY5ybdF4oh1dr6poqoTlDVTf59CzVTi6Xtmq9nOxIH7Jz8OwRPOUDp?= =?us-ascii?Q?lZtSJpB3c/sjeVq5NMumOHYMvJPdQ0cXSZFuVI3tVfqziTmNYI7QbsAEYfEc?= =?us-ascii?Q?EKjbVdTR+UxZOMy8WJbYRHnDQPfFJ/0SncyqasevkOWoNXIILE01lhQkB2g4?= =?us-ascii?Q?sc33UvSufU5YtvsCj15kQy6BF25WxIuM8Gih1B4j+62ygc0gBCjPQGZ9BoCD?= =?us-ascii?Q?0ZnJLolMQMbMyNcBIB7h4E2zE1ZrhqOT9km/sN/AK5XNomygbUvBhR8TQ4jU?= =?us-ascii?Q?f8nASerbNk22reM/LZ+cKv3ZcxqPxr1vaqfOZti+EgF9i1MEe7OOGEDEke0I?= =?us-ascii?Q?fOy/CQ=3D=3D?= X-Forefront-Antispam-Report: CIP:198.47.21.195;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:flwvzet201.ext.ti.com;PTR:ErrorRetry;CAT:NONE;SFS:(13230040)(36860700013)(82310400026)(376014)(7416014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: IpfXV2DjQ2qWAwVrHX51uvY1OIoJJNtFbsrJrEaXv/08t+/fvRX5k7q1ojZ1neNFI6XkFVt2+sr9L74uwBuFk5V6j+35mkmG7eS9J+3gvJK/MXF1kCVDzctet/PXuzMv7kYIaEMieAYqtkhl5ZSc4q81GV4mY5tnoldKxTRdEZXRy17LWLl7jN2wKhMRUZxT2jTS9VepjZuqvpCA0lhQ0vSswG9YK9RA1GL/gS7eBSxARr0fhqlI6lDY/Qfahet28A6VTGJ+rZm9jM+MlhR3OKZyuxFXZJvkF7njfCaPZ9yY2LABACiWtCa31IXeHtH7XnFt/0U0KZu9L4kdoFnYtNnvnX6CKM78lNukuiejpRB4/iXbvbcUbHvm1rRZYEyBfImcoBLciAKW0sZWxxIEAYlsnxqpX9CohJzhlNXCGh8I6oeqk4taYBfmA0n3uLgD X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 05:10:52.0286 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 34e65fd6-320c-43f3-6ae8-08de5fbdf080 X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7;Ip=[198.47.21.195];Helo=[flwvzet201.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: CO1PEPF000044EF.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR10MB6497 Content-Type: text/plain; charset="utf-8" The current mcasp_is_synchronous() function does more than what it proclaims, it also checks if McASP is a frame producer. Therefore split the original function into two separate ones and replace all occurrences with the new equivalent logic. So the functions can be re-used when checking async/sync status in light of async mode enhancements. Signed-off-by: Sen Wang Acked-by: Peter Ujfalusi --- sound/soc/ti/davinci-mcasp.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/sound/soc/ti/davinci-mcasp.c b/sound/soc/ti/davinci-mcasp.c index 621a9d5f9377..aa14fc1c8011 100644 --- a/sound/soc/ti/davinci-mcasp.c +++ b/sound/soc/ti/davinci-mcasp.c @@ -179,10 +179,16 @@ static void mcasp_set_ctl_reg(struct davinci_mcasp *m= casp, u32 ctl_reg, u32 val) =20 static bool mcasp_is_synchronous(struct davinci_mcasp *mcasp) { - u32 rxfmctl =3D mcasp_get_reg(mcasp, DAVINCI_MCASP_RXFMCTL_REG); u32 aclkxctl =3D mcasp_get_reg(mcasp, DAVINCI_MCASP_ACLKXCTL_REG); =20 - return !(aclkxctl & TX_ASYNC) && rxfmctl & AFSRE; + return !(aclkxctl & TX_ASYNC); +} + +static bool mcasp_is_frame_producer(struct davinci_mcasp *mcasp) +{ + u32 rxfmctl =3D mcasp_get_reg(mcasp, DAVINCI_MCASP_RXFMCTL_REG); + + return rxfmctl & AFSRE; } =20 static inline void mcasp_set_clk_pdir(struct davinci_mcasp *mcasp, bool en= able) @@ -226,7 +232,7 @@ static void mcasp_start_rx(struct davinci_mcasp *mcasp) * synchronously from the transmit clock and frame sync. We need to make * sure that the TX signlas are enabled when starting reception. */ - if (mcasp_is_synchronous(mcasp)) { + if (mcasp_is_frame_producer(mcasp) && mcasp_is_synchronous(mcasp)) { mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST); mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST); mcasp_set_clk_pdir(mcasp, true); @@ -239,7 +245,7 @@ static void mcasp_start_rx(struct davinci_mcasp *mcasp) mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXSMRST); /* Release Frame Sync generator */ mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXFSRST); - if (mcasp_is_synchronous(mcasp)) + if (mcasp_is_frame_producer(mcasp) && mcasp_is_synchronous(mcasp)) mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXFSRST); =20 /* enable receive IRQs */ @@ -305,7 +311,7 @@ static void mcasp_stop_rx(struct davinci_mcasp *mcasp) * In synchronous mode stop the TX clocks if no other stream is * running */ - if (mcasp_is_synchronous(mcasp) && !mcasp->streams) { + if (mcasp_is_frame_producer(mcasp) && mcasp_is_synchronous(mcasp) && !mca= sp->streams) { mcasp_set_clk_pdir(mcasp, false); mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, 0); } @@ -332,7 +338,7 @@ static void mcasp_stop_tx(struct davinci_mcasp *mcasp) * In synchronous mode keep TX clocks running if the capture stream is * still running. */ - if (mcasp_is_synchronous(mcasp) && mcasp->streams) + if (mcasp_is_frame_producer(mcasp) && mcasp_is_synchronous(mcasp) && mcas= p->streams) val =3D TXHCLKRST | TXCLKRST | TXFSRST; else mcasp_set_clk_pdir(mcasp, false); @@ -1041,7 +1047,8 @@ static int mcasp_i2s_hw_param(struct davinci_mcasp *m= casp, int stream, * not running already we need to configure the TX slots in * order to have correct FSX on the bus */ - if (mcasp_is_synchronous(mcasp) && !mcasp->channels) + if (mcasp_is_frame_producer(mcasp) && mcasp_is_synchronous(mcasp) && + !mcasp->channels) mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXMOD(total_slots), FSXMOD(0x1FF)); } --=20 2.43.0 From nobody Sun Feb 8 06:22:06 2026 Received: from BL2PR02CU003.outbound.protection.outlook.com (mail-eastusazon11011053.outbound.protection.outlook.com [52.101.52.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A78F4329392; Fri, 30 Jan 2026 05:10:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.52.53 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769749854; cv=fail; b=qwo34on6feXZ7Vz4V9q9zGoKMNeVN7k3nnCBc/Lfws9QugyJO2sYHN9unqsOfQAVxfpEb4gfs8Gvv2+/hvtQmJv7aNoQnGVf2OZIl/OkjBjXN0F9mQ9F948j2Nfg/5qPjXbkEy7KlixT8dKX27xGbuKUY2frOJytoVMJxmxdgIg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769749854; c=relaxed/simple; bh=QyIXjefb5CW3H0ywH7TBnPftSYFtsRplzyQcCuQulsk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=fl2KxD1OJqoWgCQaRKodNEi7nntySJEODmNlzWjspWzUSS0PHANDMiEGLVSUUN8mhUcuL1PMp7GbChujlsIIWEXCqekMk9HP/2FCDQa6VCf3WiXJ+ra2UZvhs3f7YjkvumYBihc5V36OmiRtT/lyDbMGLT7jrBwJ2aEr+w61d0E= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=gSJDyWrz; arc=fail smtp.client-ip=52.101.52.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="gSJDyWrz" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Vb/d1Hb919K0IsAzrXCksVbquNhl42lWy5WzI4xtUYViFz2AYjLuJckU6tTMIykf8QjQre5YTGY/x1mby3X6DS5tL0NCm81D4bIy4WOcFnZUfZ3XH/5fq4QQxrObKY7SHFMglJljpVRiC4XkRIiHSFNtSAJnYfBfeT8FUVCCTReJ57Ycj8ZAuf+ARvG4xYyRL0yzINiRMdkqvzqy1i0H13DRI7I8mzOuZyWH6lZsk7HmWoKenMRy85kvX5shD15iB6vOgQBiha39WYgGLYE8mEpAzDqpdZVmr8VNY/xej8N9SjxgT44wGNLlUOD/R+uT5BjLAcdX4oYGAWhUWKvEFw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=hkAy5SZD2O7aRDAlY2U/PevHlCeGS+HC250YkWDjz/8=; b=DaG4wvcwmp9+R+jMsHJd9MxI3QWOLrY69lsunTvdfUM2LMFW2xkaRr8/8ZQnvPKP5JOv7oqUGUcKgfKo1hzaITftq/9thsZ2cSv4c6Ot14Fbp/dwvcUhZ6rNRqILBUdrvNj2katcnV8cQzEfKDgBkXmw9GC0JmzGQMagsQglNg+obxxjvBKTN1PwAHYVYcbwU+1A4fuwdklxFDzLmYUkOA+gpZl+LAj9OiXs1vnNwqbvM0dEdax/pkJC+FNeT+xnH9IxtfkBs4BV0rHhTnMrDq4mb5FnG9i9cQAhHpJjAso+vjn0bMahEHQL6H67RXtSf8gkuu2UCTdXYePeruf4ng== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.23.195) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=hkAy5SZD2O7aRDAlY2U/PevHlCeGS+HC250YkWDjz/8=; b=gSJDyWrzlCed22Vk/GUgwW2YfgAr8tJ+cANBn8puqTgXMeBKOYhV5MjVlgc+eVxclQy8s5+QPqgIlCUiXjDNLgyMmpGLZM8Tg5rMgGNO+sVkW21AnQivntOLtd0Wz3NF1P4PfigcV/GJKKKdZ6SUS42xMwPWBDryBqHP+d2/k+w= Received: from BYAPR06CA0026.namprd06.prod.outlook.com (2603:10b6:a03:d4::39) by LV3PR10MB7748.namprd10.prod.outlook.com (2603:10b6:408:1b4::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.11; Fri, 30 Jan 2026 05:10:50 +0000 Received: from CO1PEPF000066EC.namprd05.prod.outlook.com (2603:10b6:a03:d4:cafe::ee) by BYAPR06CA0026.outlook.office365.com (2603:10b6:a03:d4::39) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9564.10 via Frontend Transport; Fri, 30 Jan 2026 05:10:51 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.23.195) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.23.195 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.23.195; helo=lewvzet201.ext.ti.com; pr=C Received: from lewvzet201.ext.ti.com (198.47.23.195) by CO1PEPF000066EC.mail.protection.outlook.com (10.167.249.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.3 via Frontend Transport; Fri, 30 Jan 2026 05:10:49 +0000 Received: from DLEE207.ent.ti.com (157.170.170.95) by lewvzet201.ext.ti.com (10.4.14.104) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 29 Jan 2026 23:10:46 -0600 Received: from DLEE201.ent.ti.com (157.170.170.76) by DLEE207.ent.ti.com (157.170.170.95) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 29 Jan 2026 23:10:46 -0600 Received: from lelvem-mr06.itg.ti.com (10.180.75.8) by DLEE201.ent.ti.com (157.170.170.76) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20 via Frontend Transport; Thu, 29 Jan 2026 23:10:46 -0600 Received: from localhost (mz02jj9v.dhcp.ti.com [128.247.81.0]) by lelvem-mr06.itg.ti.com (8.18.1/8.18.1) with ESMTP id 60U5AkpV748621; Thu, 29 Jan 2026 23:10:46 -0600 From: Sen Wang To: , , , , , , , CC: , , , Sen Wang Subject: [PATCH 3/4] ASoC: ti: davinci-mcasp: Streamline pdir behavior across rx & tx streams Date: Thu, 29 Jan 2026 23:10:43 -0600 Message-ID: <20260130051045.1898892-4-sen@ti.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260130051045.1898892-1-sen@ti.com> References: <20260130051045.1898892-1-sen@ti.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1PEPF000066EC:EE_|LV3PR10MB7748:EE_ X-MS-Office365-Filtering-Correlation-Id: 349c2217-d1a7-469e-be60-08de5fbdef30 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|36860700013|1800799024|7416014|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?QXwhTSs7e21c1gxU0jZeNJuM/H7dWXcUJx3RUzd8APK8BK+DYw7toI2Y6ELJ?= =?us-ascii?Q?C58q6FVCQiD+Oksh/Ifmao0yDGfwYohoK2cma9BbilblI2qJvVXjZ5WFqPB1?= =?us-ascii?Q?PA5JOi8udWk/x2x84Kma8Ur9nl1AroUbn8vFC3QPzKudyFjSaNbTcWZqbEtd?= =?us-ascii?Q?A/hWSZzRuDJ0sfxqdC+S/B3YCOqLvsuK2TVOlPsiezJjRG3OigAlJoY917sw?= =?us-ascii?Q?pQvseauwmCJYFq1sYNg1gGdZhoVo+p4iZDSashOk0B/YUoIT1UuZqUwmeAwr?= =?us-ascii?Q?fcuXlu4IVgJwX9bWPBfx7T7GEhJitlcEbFCJYO3vMD80uClCdjq8b55eCpQK?= =?us-ascii?Q?ZyrONDhDq73KfvivvGrarhYx2sO+CakeSidrMw2oqHFPRuuf8FEAymD9sbRr?= =?us-ascii?Q?95p88NDErXdKGBX4tYW0zIBgVeQHkiJx0Z9UvVRymqbhHlLc8lIeKZ6kPoai?= =?us-ascii?Q?S2yZ0Yaui53Dk/RW15ckYiEkjddRC2dv5264eS4iQbqMrIZ6dvX2w3dUcxvw?= =?us-ascii?Q?V+Pr5p/6hv7B7xSqfIixe/s8mq2tzDamMkxzbETgQytmKu+4cFqeUaT3T5je?= =?us-ascii?Q?nFviJCiQRuTMj5nIF4oeI2ApL5TZQoi0RT8QiHyFFaz5IyJRw4OVt0lMmYQN?= =?us-ascii?Q?koSGz4Whdn/m0Kbv0nDO4IjCIzgbsJ6Kws9imuVbmKSkLAZZ3FURzPKs3hIi?= =?us-ascii?Q?wR3Xd4C5566iKmCdMJ3iGcNAHkaHITUgC5riOD9iPtoy5lEsek6RqW4RWwi7?= =?us-ascii?Q?RgIDVHQXjPSRar377OWPFxX7o+n340otbD7Q47i7s4xSad3xqSv7rY4aR96X?= =?us-ascii?Q?CZBjQ7q4dN1NnQlidmaxk6bmquWGR2q9RodF2O+Z/MMSO5NjulRxOBLD/zhQ?= =?us-ascii?Q?NIGAKPB64gfwveOlLUxBlTiHT3R4Wsivjp3yzlkXrocWHqm/4VtT6V1zFkeZ?= =?us-ascii?Q?z8rZB51Hyy16AT5k4b6OVc67579qwFZtXaRATjPT1vKtv+JEFISgWo3gYKqj?= =?us-ascii?Q?ZY8ZfYEhEyX8vz8RSa4p7GAnkBtsbZWkbum09nl1/jA4EwLGbNuPnyVMqgZ8?= =?us-ascii?Q?qKHCtHaRfY1MnzcneoQBzjYEaCbw7T+yHXJNv8Subos6N3CsrbI6lY85pYpC?= =?us-ascii?Q?el0qsLcs1YyW7cwSARf0vDttik1iyxZh6k9kYBQYGmoqB5MojcvdZsy8d03d?= =?us-ascii?Q?7eg+KGsqSWT2zh8roDRg/kGoFRU3i1uLTyRfz9e45zyybwRchklBfcdJd7Dc?= =?us-ascii?Q?A9NejhM2fgU4/EV+sQrc0pmUvHFKWgb6IimZ/jfkARQV4BU6ha4OAlwwyiCn?= =?us-ascii?Q?XvCRhbgptFA41+27CMrhwcW1OAdZehaolXzfQBQa9W0XHyIvhzNXs1Fyo62J?= =?us-ascii?Q?ALNGgjkZuHBH9iQbOJE03HTy+kG361G2LZxuANGhyyTBEgVlByHrqBDUAKK2?= =?us-ascii?Q?tqtDSNY8x3lxfMsLchtNDHIzRw6lGh0EFE2wvmnNJ+lyk8vLvAw4lRMHQ73x?= =?us-ascii?Q?CyBnBn1J5ZHBXs4Eng8ZwrEe5kxMqQ1wAwUKHaA+OsSrspQSKPNXJD9ZE104?= =?us-ascii?Q?zdIjeDFvy1R3B5IyKYM4SCos6GhCWznoWSedy4RfMqrtPRUsA7wtUVrXl1Jg?= =?us-ascii?Q?bZWGR0WGBRPuSghj8nAEH8VA+qmpFWPjXt6XpgOw1Uq5mKT3qLekiU7O0tmw?= =?us-ascii?Q?cN/Plw=3D=3D?= X-Forefront-Antispam-Report: CIP:198.47.23.195;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:lewvzet201.ext.ti.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(36860700013)(1800799024)(7416014)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: hxyDZrMQzdymYVtaVi66FmGoaIuy2Ya9YHJO1TLHbp1ARCnKEfszkbcSPDppyRhFyamX71CqMnrqSOCGRXYSiMe6itdD4rTq5w59G12v2hOSYb+wgDfK9TztgSn1S2vQ1Eb5m9erKdUKTbxQF4ONPmhZvaMHeI4jkLVQnVeCi48VSBPz/CEgwuEQJJy2pTAOdVdGCcUNfIiJPcjUVoavmzuTV9epdeISuggTrfoUg+auv21JmFU3jWfULIPwIsdrA3rnXNKpDilumhbQC2amfF40bef2X89KYPIP+GXrUlzeif0q0pc10SfgigRRJGOwXtE6JqaNwlR/VlAd4qSua65UYSaizDQZ+Wmn3UvbMJKt0Hv/5Tb2qVWzeUjKsrq8XA+rD9rXmm8wJOqN2Yds+XNizIyw6ph/x8XPbQ5+Db4kOt0reHF0i01IZmev2ijK X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 05:10:49.8258 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 349c2217-d1a7-469e-be60-08de5fbdef30 X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7;Ip=[198.47.23.195];Helo=[lewvzet201.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: CO1PEPF000066EC.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV3PR10MB7748 Content-Type: text/plain; charset="utf-8" Simplify the mcasp_set_clk_pdir caller convention in start/stop stream function, to make it so that set_clk_pdir gets called regardless when stream starts and also disables when stream ends. Functionality-wise, everything remains the same as the previously skipped calls are now either correctly configured (when McASP is SND_SOC_DAIFMT_BP_FC - pdir needs to be enabled) or called with a bitmask of zero (when McASP is SND_SOC_DAIFMT_BC_FC - pdir gets disabled). On brief regarding McASP Clock and Frame sync configurations, refer to [0]. [0]:TRM Section 12.1.1.4.2 https://www.ti.com/lit/ug/sprujd4a/sprujd4a.pdf Signed-off-by: Sen Wang --- sound/soc/ti/davinci-mcasp.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sound/soc/ti/davinci-mcasp.c b/sound/soc/ti/davinci-mcasp.c index aa14fc1c8011..4f8a2ce6ce78 100644 --- a/sound/soc/ti/davinci-mcasp.c +++ b/sound/soc/ti/davinci-mcasp.c @@ -235,8 +235,8 @@ static void mcasp_start_rx(struct davinci_mcasp *mcasp) if (mcasp_is_frame_producer(mcasp) && mcasp_is_synchronous(mcasp)) { mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST); mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST); - mcasp_set_clk_pdir(mcasp, true); } + mcasp_set_clk_pdir(mcasp, true); =20 /* Activate serializer(s) */ mcasp_set_reg(mcasp, DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF); @@ -311,10 +311,10 @@ static void mcasp_stop_rx(struct davinci_mcasp *mcasp) * In synchronous mode stop the TX clocks if no other stream is * running */ - if (mcasp_is_frame_producer(mcasp) && mcasp_is_synchronous(mcasp) && !mca= sp->streams) { - mcasp_set_clk_pdir(mcasp, false); + if (mcasp_is_frame_producer(mcasp) && mcasp_is_synchronous(mcasp) && !mca= sp->streams) mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, 0); - } + if (!mcasp->streams) + mcasp_set_clk_pdir(mcasp, false); =20 mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, 0); mcasp_set_reg(mcasp, DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF); @@ -340,7 +340,7 @@ static void mcasp_stop_tx(struct davinci_mcasp *mcasp) */ if (mcasp_is_frame_producer(mcasp) && mcasp_is_synchronous(mcasp) && mcas= p->streams) val =3D TXHCLKRST | TXCLKRST | TXFSRST; - else + if (!mcasp->streams) mcasp_set_clk_pdir(mcasp, false); =20 =20 --=20 2.43.0 From nobody Sun Feb 8 06:22:06 2026 Received: from SJ2PR03CU001.outbound.protection.outlook.com (mail-westusazon11012029.outbound.protection.outlook.com [52.101.43.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9DCB8329C6D; Fri, 30 Jan 2026 05:10:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.43.29 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769749856; cv=fail; b=PUOKQXcygdVeVJ3BAvzDxnJlaIoSsT+1IU466v4Av2f14X7VRvNPjHzHmRFesxP2EejfsD9GuSHoTKvXRLIsvgd8FdbiE+mSJ5weXFeh1w1b7Kz/KfK9Z0LrH1kRk6t7s7reb9eFfTL/ZhyBdjASxi1unXGRc2rgwwejvvv/MjY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769749856; c=relaxed/simple; bh=5L7UZHyQtwO68AaMgKLM+Y1/7Fzr6gmG/o6eVxUIOyw=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=B4bFrDv0gLsPfAx6QJNXfpyQBwuc0sRRsjuMwUt40/kBKoIzvkhAqcZfUcNbztcoCzQoO8QiQW1us2R7Z02/QxZWFpmRFfWi1fcxZn76LxAfWDKX3SFDLTCVV41wZHo7pLjxN89XHh34LY4gUMInw/jjvGvcXOKBZRi9Cv1y/yo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=WGTbJ7ni; arc=fail smtp.client-ip=52.101.43.29 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="WGTbJ7ni" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=B3qrTKoJv3y7dtoL9RQkStfrgW96S7f2E7sgGVMKjG+y+hFVYlTYLhanTTO+mCXAYvkKtVgblohQh3KY2R7JnROfTqKgUaHUvUlurVxMCkldWivb8dPKsO5JA2/udLc5pBMGyvdrsRj7E8mIW/j80DQPktDw2qtkQPzQl7WBGbZWggIfQnHNKLD75FpcHvPvK2XKEsMFenXpg2FwrAOKOHW3eAA82ZHS6tjrgd9lXDSI5yP5b1blWqngQMQEp+2KHWb+3cq6TO0M70T+Bpas/pLnqEZ2/xAv0yTBjuY1L9T8+pHlMZFayxHSx7sEXHDo3BSUxbHhnKwxnHDg/TY5MA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=OZibJ17mMWkbajpdpESy6tN34/QPpOkzToSSS120wjM=; b=EKydEOkqd8oq5xXBAua+gAfmWEGxMjxkWkwDaziXNzquh0e+UD/e8K9O6257S4rxSolGiw5GENDEVtGsZR7ae414bCCPobiVmq/QWt5+i9fKZr/MBNqOBPDdnPDoJ93yXoJsLE43VkvzNGA4Ptk3e1+Yr3RhrcR6LWBtSGHhQXCVdRuzVunUVfCrk8O16v5Locq0+6aVFby6DMtbg01m3Iw4O1zPJEQ29uX8LGTDrBvJZBj9EBnDU2SK71x+0F7HSRtcCedXJxIyUXDjEL5opsScca5pNmPzAyp1oXfUL3TookO26/pKFmVmt7wn1UO1SwwFw0QUsaJ86NvTzzhPWA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.23.195) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=OZibJ17mMWkbajpdpESy6tN34/QPpOkzToSSS120wjM=; b=WGTbJ7ni/ORPhQHXDA8pYiUY+fP8rmY0Pg8GqiisNP8Qc22zrXCl4TOKrJf1az7JyHIt0Qt2u0yycyjXY7X1utvPlNfQrcE4fsT4NbmnYEps1TW9l88ZJEmmKO0PxL+ndwl2HArFUWzrKvEDzQwDxAyQgKnqZlf1onOy5uRXv9I= Received: from BYAPR06CA0003.namprd06.prod.outlook.com (2603:10b6:a03:d4::16) by DM4PR10MB7450.namprd10.prod.outlook.com (2603:10b6:8:18f::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.7; Fri, 30 Jan 2026 05:10:51 +0000 Received: from CO1PEPF000066EC.namprd05.prod.outlook.com (2603:10b6:a03:d4:cafe::44) by BYAPR06CA0003.outlook.office365.com (2603:10b6:a03:d4::16) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9564.8 via Frontend Transport; Fri, 30 Jan 2026 05:10:51 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.23.195) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.23.195 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.23.195; helo=lewvzet201.ext.ti.com; pr=C Received: from lewvzet201.ext.ti.com (198.47.23.195) by CO1PEPF000066EC.mail.protection.outlook.com (10.167.249.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.3 via Frontend Transport; Fri, 30 Jan 2026 05:10:51 +0000 Received: from DLEE204.ent.ti.com (157.170.170.84) by lewvzet201.ext.ti.com (10.4.14.104) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 29 Jan 2026 23:10:47 -0600 Received: from DLEE206.ent.ti.com (157.170.170.90) by DLEE204.ent.ti.com (157.170.170.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 29 Jan 2026 23:10:46 -0600 Received: from lelvem-mr05.itg.ti.com (10.180.75.9) by DLEE206.ent.ti.com (157.170.170.90) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20 via Frontend Transport; Thu, 29 Jan 2026 23:10:46 -0600 Received: from localhost (mz02jj9v.dhcp.ti.com [128.247.81.0]) by lelvem-mr05.itg.ti.com (8.18.1/8.18.1) with ESMTP id 60U5AkD11150949; Thu, 29 Jan 2026 23:10:46 -0600 From: Sen Wang To: , , , , , , , CC: , , , Sen Wang Subject: [PATCH 4/4] ASoC: ti: davinci-mcasp: Add asynchronous mode support Date: Thu, 29 Jan 2026 23:10:44 -0600 Message-ID: <20260130051045.1898892-5-sen@ti.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260130051045.1898892-1-sen@ti.com> References: <20260130051045.1898892-1-sen@ti.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1PEPF000066EC:EE_|DM4PR10MB7450:EE_ X-MS-Office365-Filtering-Correlation-Id: 3ebfe71f-8610-4db5-97ad-08de5fbdefef X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|7416014|376014|1800799024|82310400026; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?Lb9o2Mj2yndHd4Ql4cdXnnUYd/R6M23pD/YQ233VZsRLpsL+DGy3VPrUTe9x?= =?us-ascii?Q?K5ccqP8O3wphWYZc8Che2JRNuuxpCyM6eNOTJBczhKLaYTsDkBftKfDEpErj?= =?us-ascii?Q?O1wbzaw1QxNo4SCtQUK6a6oYguRbUJa+nXvBoyQiJ7miGDcUXIV7D1SLPJBs?= =?us-ascii?Q?wmVpEdTk0hQRXALugOWfbOrVDeVY8brQsV3WWuzpXVGMflde+IFIaSqgtpQc?= =?us-ascii?Q?FD0yw56gQnVummKpMpKNU0FgDKz3cUfzu1PG0uhpQG22zyTLmcRdj8lj1I4L?= =?us-ascii?Q?Fxov528xLIa9yAUuVyQzz4UgIFuTTb1wfm5NXUV6OlRDnIJkSVpjpRmIR1J5?= =?us-ascii?Q?z4aNz9PltzZuMtQq7nMU54ILioGcE21AtVFcXBjzii4Rl93yvhdKvUWbe2qf?= =?us-ascii?Q?MUr9igQHYtE85c9JqJ3/gHAY1NSJhCzSBM8n3cnBB7NRAeeQL2bp/xPugfgU?= =?us-ascii?Q?g1SpLWdnwxXFAi6xXkxHXY9SxPh5SOLVmMIlCNLZd3z1TOaEWg0Uv6QTBTxf?= =?us-ascii?Q?Vmpc1iLQ3mPZqJ/L0ybCN6A8RULfwbuIVQKy4lDwuB/JcPQPs0PORNGIRVFf?= =?us-ascii?Q?yK5TrW9Dninb5v5C7j+yO7cDpRQx9/z2sAzaLsZO8Jk7sBw6QIDIBnfVUSEL?= =?us-ascii?Q?PGdXMOXgZLbDkKBQ4NXrUt+wetiu0a/UGvlJVb29MGt8bH7pYVnexsRVNFWB?= =?us-ascii?Q?nPkSPzq+WwVVrqs8jzKnsAWZaWYjZdFZ1Wd9KwzHQb+ezvyJ9iQ5r8gPbzeK?= =?us-ascii?Q?zJQ7awMczwG+GG3gdLSwrMeDpxV4iNo3GRDnRVtm4tMxR65APCls2ZpLR74p?= =?us-ascii?Q?nKoRc3ErrhDoDRx/GaMydWJb8wjbVQ1QEQ2qdbHLd/bcHb3DU0fm+XubbbwG?= =?us-ascii?Q?BX7chykRftO+dviJScHix8CTj1c7+1hoDkYCK3Iu0+AGpFgI9e9Xo8B7fe1w?= =?us-ascii?Q?80emZr8goT2uoweiyNVD/GCAIyCXvBXVmURkkvg2QX7PjdrXNlOdMtkawgUl?= =?us-ascii?Q?wqiCeXAAUcSHYIfXNApRNrk1gR3C7XrCJdFf/a2ZUtkO5bQI40rBrrz1iDGo?= =?us-ascii?Q?7tpD9Fj9AYlgWIK+agKuO5W1DtScLWUu7PQLuF1dNDR0StRWQa+G0uu6sOjP?= =?us-ascii?Q?UgSOxg1199Q6YaBVOm+s/QGMgnfod6i++I5o4wnl577zV7Sz0ULZIaNQwwzw?= =?us-ascii?Q?RozTk8eN8W7GjW/o3ioIVTda93+oQtZy4VDIK2RtUaUfo//q7KRHXZIDFeKL?= =?us-ascii?Q?Q6ppLA+VqEH/TvRRWHP3YP0qwcdvZZyEqBUJ7iEkILSTygjpMOYxmLsAhLTk?= =?us-ascii?Q?VdlGk/OfwJDZqCwCGsh7+2N8CN2DCGciJgkIHdsUxySDIeED9LIFlV/lXRZm?= =?us-ascii?Q?xBLGQ1gFseqb7j7Nz/lSzvwNC59BvvbfUribs63fQuLgtqpLKB/DkaVKS8/g?= =?us-ascii?Q?U5kaM1geZD7rcnYRXegCXWmr7OpJ6bx3qqiZEuEX33CVnOELUPq89Gr3F/v5?= =?us-ascii?Q?RoVd9LnpDuhjR5GQWWs2ZsImJEy9yqZWU2y9JCQQg+k5jJYo86wajuQ8F+nb?= =?us-ascii?Q?Rp0ruhT8ewo1S7SNPhzPTL4sn1Zpa+AjbDhgkkohN9k9kyupuL7G9bj2FZje?= =?us-ascii?Q?gxSDdZmiA0yvnSWyoZnmvBvgX6sGwK7buRE6O9saoiIkgaQPktL3zUpGgiSx?= =?us-ascii?Q?L3quXg=3D=3D?= X-Forefront-Antispam-Report: CIP:198.47.23.195;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:lewvzet201.ext.ti.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(7416014)(376014)(1800799024)(82310400026);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 3ooRFjFxAShj73nLRa3ckfDwmCCt7MwIbZbUuvN164grTtv8EDPCNjqwbllwmNPoACzZxd/P4K5McmKIzw5KcXJ6LROHr3xD9r/ksnByXo6kMpVe8qUG8SqdcTJgcaXaL6YP5ZpOqWTELT0/o2MJy/f3z4Gl9fKcun728QMbJJRAlgjdVOJffGp7R8UZEh6oCxq931UoJI0FyZ+zHtB9TJd/88kXDJ2MJld2PuQpNx6YMenPCmgvQovcYOrW8jVM+Br5pMdu/GkbVCebxomiV+oFH/VoNW4uBztldY1j0oaLMQWHbyowzvtSyAXuwCHshhQx4xyjyE3xMR3VuTLbKBrVINJwKB7vXTvZ7N/ksM2oApRI570jF9InrF/H5aq1CwHg5QfiTNAX4t38PlIcl9mWDMDako1l32wKKiT3BoMwEwEanRKM2O9EL8RTR6h9 X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 05:10:51.0823 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3ebfe71f-8610-4db5-97ad-08de5fbdefef X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7;Ip=[198.47.23.195];Helo=[lewvzet201.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: CO1PEPF000066EC.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR10MB7450 Content-Type: text/plain; charset="utf-8" McASP has dedicated clock & frame sync registers for both transmit and receive. Currently McASP driver only supports synchronous behavior and couples both TX & RX settings. Add logic that enables asynchronous mode via ti,async-mode property. In async mode, playback & record can be done simultaneously with different audio configurations (tdm slots, tdm width, audio bit depth). Note the ability to have different tx/rx DSP formats (i2s, dsp_a, etc.), while possible in hardware, remains to be a gap as it require changes to the corresponding machine driver interface. Existing IIS (sync mode) and DIT mode logic remains mostly unchanged. Exceptions are IIS mode logic that previously assumed sync mode, which has now been made aware of the distinction. And shared logic across all modes also now checks for McASP tx/rx-specific driver attributes. Those attributes have been populated according to the original extent, ensuring no divergence in functionality. Constraints no longer applicable for async mode are skipped. Clock selection options have also been added to include rx/tx-only clk_ids, exposing independent configuration via the machine driver as well. Note that asynchronous mode is not applicable for McASP in DIT mode, which is a transmitter-only mode to interface w/ self-clocking formats. Signed-off-by: Sen Wang Acked-by: Peter Ujfalusi --- include/linux/platform_data/davinci_asp.h | 3 +- sound/soc/ti/davinci-mcasp.c | 487 +++++++++++++++++----- sound/soc/ti/davinci-mcasp.h | 10 + 3 files changed, 398 insertions(+), 102 deletions(-) diff --git a/include/linux/platform_data/davinci_asp.h b/include/linux/plat= form_data/davinci_asp.h index b9c8520b4bd3..509c5592aab0 100644 --- a/include/linux/platform_data/davinci_asp.h +++ b/include/linux/platform_data/davinci_asp.h @@ -59,7 +59,8 @@ struct davinci_mcasp_pdata { bool i2s_accurate_sck; =20 /* McASP specific fields */ - int tdm_slots; + int tdm_slots_tx; + int tdm_slots_rx; u8 op_mode; u8 dismod; u8 num_serializer; diff --git a/sound/soc/ti/davinci-mcasp.c b/sound/soc/ti/davinci-mcasp.c index 4f8a2ce6ce78..ef7fa23d30bf 100644 --- a/sound/soc/ti/davinci-mcasp.c +++ b/sound/soc/ti/davinci-mcasp.c @@ -70,6 +70,7 @@ struct davinci_mcasp_context { struct davinci_mcasp_ruledata { struct davinci_mcasp *mcasp; int serializers; + int stream; }; =20 struct davinci_mcasp { @@ -87,21 +88,27 @@ struct davinci_mcasp { bool missing_audio_param; =20 /* McASP specific data */ - int tdm_slots; + int tdm_slots_tx; + int tdm_slots_rx; u32 tdm_mask[2]; - int slot_width; + int slot_width_tx; + int slot_width_rx; u8 op_mode; u8 dismod; u8 num_serializer; u8 *serial_dir; u8 version; - u8 bclk_div; + u8 bclk_div_tx; + u8 bclk_div_rx; int streams; u32 irq_request[2]; =20 - int sysclk_freq; + unsigned int sysclk_freq_tx; + unsigned int sysclk_freq_rx; bool bclk_master; - u32 auxclk_fs_ratio; + bool async_mode; + u32 auxclk_fs_ratio_tx; + u32 auxclk_fs_ratio_rx; =20 unsigned long pdir; /* Pin direction bitfield */ =20 @@ -203,6 +210,27 @@ static inline void mcasp_set_clk_pdir(struct davinci_m= casp *mcasp, bool enable) } } =20 +static inline void mcasp_set_clk_pdir_stream(struct davinci_mcasp *mcasp, + int stream, bool enable) +{ + u32 bit, bit_end; + + if (stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) { + bit =3D PIN_BIT_ACLKX; + bit_end =3D PIN_BIT_AFSX + 1; + } else { + bit =3D PIN_BIT_ACLKR; + bit_end =3D PIN_BIT_AFSR + 1; + } + + for_each_set_bit_from(bit, &mcasp->pdir, bit_end) { + if (enable) + mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, BIT(bit)); + else + mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, BIT(bit)); + } +} + static inline void mcasp_set_axr_pdir(struct davinci_mcasp *mcasp, bool en= able) { u32 bit; @@ -215,6 +243,36 @@ static inline void mcasp_set_axr_pdir(struct davinci_m= casp *mcasp, bool enable) } } =20 +static inline int mcasp_get_tdm_slots(struct davinci_mcasp *mcasp, int str= eam) +{ + return (stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) ? + mcasp->tdm_slots_tx : mcasp->tdm_slots_rx; +} + +static inline int mcasp_get_slot_width(struct davinci_mcasp *mcasp, int st= ream) +{ + return (stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) ? + mcasp->slot_width_tx : mcasp->slot_width_rx; +} + +static inline unsigned int mcasp_get_sysclk_freq(struct davinci_mcasp *mca= sp, int stream) +{ + return (stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) ? + mcasp->sysclk_freq_tx : mcasp->sysclk_freq_rx; +} + +static inline unsigned int mcasp_get_bclk_div(struct davinci_mcasp *mcasp,= int stream) +{ + return (stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) ? + mcasp->bclk_div_tx : mcasp->bclk_div_rx; +} + +static inline unsigned int mcasp_get_auxclk_fs_ratio(struct davinci_mcasp = *mcasp, int stream) +{ + return (stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) ? + mcasp->auxclk_fs_ratio_tx : mcasp->auxclk_fs_ratio_rx; +} + static void mcasp_start_rx(struct davinci_mcasp *mcasp) { if (mcasp->rxnumevt) { /* enable FIFO */ @@ -230,13 +288,17 @@ static void mcasp_start_rx(struct davinci_mcasp *mcas= p) /* * When ASYNC =3D=3D 0 the transmit and receive sections operate * synchronously from the transmit clock and frame sync. We need to make - * sure that the TX signlas are enabled when starting reception. + * sure that the TX signals are enabled when starting reception. + * Else set pin to be output when McASP is the master */ if (mcasp_is_frame_producer(mcasp) && mcasp_is_synchronous(mcasp)) { mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST); mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST); } - mcasp_set_clk_pdir(mcasp, true); + if (mcasp_is_synchronous(mcasp)) + mcasp_set_clk_pdir(mcasp, true); + else + mcasp_set_clk_pdir_stream(mcasp, SNDRV_PCM_STREAM_CAPTURE, true); =20 /* Activate serializer(s) */ mcasp_set_reg(mcasp, DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF); @@ -267,7 +329,10 @@ static void mcasp_start_tx(struct davinci_mcasp *mcasp) /* Start clocks */ mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST); mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST); - mcasp_set_clk_pdir(mcasp, true); + if (mcasp_is_synchronous(mcasp)) + mcasp_set_clk_pdir(mcasp, true); + else + mcasp_set_clk_pdir_stream(mcasp, SNDRV_PCM_STREAM_PLAYBACK, true); =20 /* Activate serializer(s) */ mcasp_set_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF); @@ -310,11 +375,14 @@ static void mcasp_stop_rx(struct davinci_mcasp *mcasp) /* * In synchronous mode stop the TX clocks if no other stream is * running + * Otherwise in async mode only stop RX clocks */ if (mcasp_is_frame_producer(mcasp) && mcasp_is_synchronous(mcasp) && !mca= sp->streams) mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, 0); - if (!mcasp->streams) + if (mcasp_is_synchronous(mcasp) && !mcasp->streams) mcasp_set_clk_pdir(mcasp, false); + else if (!mcasp_is_synchronous(mcasp)) + mcasp_set_clk_pdir_stream(mcasp, SNDRV_PCM_STREAM_CAPTURE, false); =20 mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, 0); mcasp_set_reg(mcasp, DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF); @@ -337,11 +405,14 @@ static void mcasp_stop_tx(struct davinci_mcasp *mcasp) /* * In synchronous mode keep TX clocks running if the capture stream is * still running. + * Otherwise in async mode only stop TX clocks */ if (mcasp_is_frame_producer(mcasp) && mcasp_is_synchronous(mcasp) && mcas= p->streams) val =3D TXHCLKRST | TXCLKRST | TXFSRST; - if (!mcasp->streams) + if (mcasp_is_synchronous(mcasp) && !mcasp->streams) mcasp_set_clk_pdir(mcasp, false); + else if (!mcasp_is_synchronous(mcasp)) + mcasp_set_clk_pdir_stream(mcasp, SNDRV_PCM_STREAM_PLAYBACK, false); =20 =20 mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, val); @@ -353,7 +424,8 @@ static void mcasp_stop_tx(struct davinci_mcasp *mcasp) mcasp_clr_bits(mcasp, reg, FIFO_ENABLE); } =20 - mcasp_set_axr_pdir(mcasp, false); + if (!mcasp->streams) + mcasp_set_axr_pdir(mcasp, false); } =20 static void davinci_mcasp_stop(struct davinci_mcasp *mcasp, int stream) @@ -625,13 +697,39 @@ static int __davinci_mcasp_set_clkdiv(struct davinci_= mcasp *mcasp, int div_id, AHCLKRDIV(div - 1), AHCLKRDIV_MASK); break; =20 + case MCASP_CLKDIV_AUXCLK_TXONLY: /* MCLK divider for TX only */ + mcasp_mod_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, + AHCLKXDIV(div - 1), AHCLKXDIV_MASK); + break; + + case MCASP_CLKDIV_AUXCLK_RXONLY: /* MCLK divider for RX only */ + mcasp_mod_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, + AHCLKRDIV(div - 1), AHCLKRDIV_MASK); + break; + case MCASP_CLKDIV_BCLK: /* BCLK divider */ mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXDIV(div - 1), ACLKXDIV_MASK); + mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, + ACLKRDIV(div - 1), ACLKRDIV_MASK); + if (explicit) { + mcasp->bclk_div_tx =3D div; + mcasp->bclk_div_rx =3D div; + } + break; + + case MCASP_CLKDIV_BCLK_TXONLY: /* BCLK divider for TX only */ + mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, + ACLKXDIV(div - 1), ACLKXDIV_MASK); + if (explicit) + mcasp->bclk_div_tx =3D div; + break; + + case MCASP_CLKDIV_BCLK_RXONLY: /* BCLK divider for RX only */ mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRDIV(div - 1), ACLKRDIV_MASK); if (explicit) - mcasp->bclk_div =3D div; + mcasp->bclk_div_rx =3D div; break; =20 case MCASP_CLKDIV_BCLK_FS_RATIO: @@ -645,11 +743,33 @@ static int __davinci_mcasp_set_clkdiv(struct davinci_= mcasp *mcasp, int div_id, * tdm_slot width by dividing the ratio by the * number of configured tdm slots. */ - mcasp->slot_width =3D div / mcasp->tdm_slots; - if (div % mcasp->tdm_slots) + mcasp->slot_width_tx =3D div / mcasp->tdm_slots_tx; + if (div % mcasp->tdm_slots_tx) + dev_warn(mcasp->dev, + "%s(): BCLK/LRCLK %d is not divisible by %d tx tdm slots", + __func__, div, mcasp->tdm_slots_tx); + + mcasp->slot_width_rx =3D div / mcasp->tdm_slots_rx; + if (div % mcasp->tdm_slots_rx) + dev_warn(mcasp->dev, + "%s(): BCLK/LRCLK %d is not divisible by %d rx tdm slots", + __func__, div, mcasp->tdm_slots_rx); + break; + + case MCASP_CLKDIV_BCLK_FS_RATIO_TXONLY: + mcasp->slot_width_tx =3D div / mcasp->tdm_slots_tx; + if (div % mcasp->tdm_slots_tx) + dev_warn(mcasp->dev, + "%s(): BCLK/LRCLK %d is not divisible by %d tx tdm slots", + __func__, div, mcasp->tdm_slots_tx); + break; + + case MCASP_CLKDIV_BCLK_FS_RATIO_RXONLY: + mcasp->slot_width_rx =3D div / mcasp->tdm_slots_rx; + if (div % mcasp->tdm_slots_rx) dev_warn(mcasp->dev, - "%s(): BCLK/LRCLK %d is not divisible by %d tdm slots", - __func__, div, mcasp->tdm_slots); + "%s(): BCLK/LRCLK %d is not divisible by %d rx tdm slots", + __func__, div, mcasp->tdm_slots_rx); break; =20 default: @@ -683,6 +803,20 @@ static int davinci_mcasp_set_sysclk(struct snd_soc_dai= *dai, int clk_id, mcasp_clr_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE); clear_bit(PIN_BIT_AHCLKX, &mcasp->pdir); + mcasp->sysclk_freq_tx =3D freq; + mcasp->sysclk_freq_rx =3D freq; + break; + case MCASP_CLK_HCLK_AHCLK_TXONLY: + mcasp_clr_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, + AHCLKXE); + clear_bit(PIN_BIT_AHCLKX, &mcasp->pdir); + mcasp->sysclk_freq_tx =3D freq; + break; + case MCASP_CLK_HCLK_AHCLK_RXONLY: + mcasp_clr_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, + AHCLKRE); + clear_bit(PIN_BIT_AHCLKR, &mcasp->pdir); + mcasp->sysclk_freq_rx =3D freq; break; case MCASP_CLK_HCLK_AUXCLK: mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, @@ -690,22 +824,56 @@ static int davinci_mcasp_set_sysclk(struct snd_soc_da= i *dai, int clk_id, mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE); set_bit(PIN_BIT_AHCLKX, &mcasp->pdir); + mcasp->sysclk_freq_tx =3D freq; + mcasp->sysclk_freq_rx =3D freq; + break; + case MCASP_CLK_HCLK_AUXCLK_TXONLY: + mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, + AHCLKXE); + set_bit(PIN_BIT_AHCLKX, &mcasp->pdir); + mcasp->sysclk_freq_tx =3D freq; + break; + case MCASP_CLK_HCLK_AUXCLK_RXONLY: + mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, + AHCLKRE); + set_bit(PIN_BIT_AHCLKR, &mcasp->pdir); + mcasp->sysclk_freq_rx =3D freq; break; default: dev_err(mcasp->dev, "Invalid clk id: %d\n", clk_id); goto out; } } else { - /* Select AUXCLK as HCLK */ - mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE); - mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE); - set_bit(PIN_BIT_AHCLKX, &mcasp->pdir); + /* McASP is clock master, select AUXCLK as HCLK */ + switch (clk_id) { + case MCASP_CLK_HCLK_AUXCLK_TXONLY: + mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, + AHCLKXE); + set_bit(PIN_BIT_AHCLKX, &mcasp->pdir); + mcasp->sysclk_freq_tx =3D freq; + break; + case MCASP_CLK_HCLK_AUXCLK_RXONLY: + mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, + AHCLKRE); + set_bit(PIN_BIT_AHCLKR, &mcasp->pdir); + mcasp->sysclk_freq_rx =3D freq; + break; + default: + mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, + AHCLKXE); + mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, + AHCLKRE); + set_bit(PIN_BIT_AHCLKX, &mcasp->pdir); + set_bit(PIN_BIT_AHCLKR, &mcasp->pdir); + mcasp->sysclk_freq_tx =3D freq; + mcasp->sysclk_freq_rx =3D freq; + break; + } } /* * When AHCLK X/R is selected to be output it means that the HCLK is * the same clock - coming via AUXCLK. */ - mcasp->sysclk_freq =3D freq; out: pm_runtime_put(mcasp->dev); return 0; @@ -717,9 +885,11 @@ static int davinci_mcasp_ch_constraint(struct davinci_= mcasp *mcasp, int stream, { struct snd_pcm_hw_constraint_list *cl =3D &mcasp->chconstr[stream]; unsigned int *list =3D (unsigned int *) cl->list; - int slots =3D mcasp->tdm_slots; + int slots; int i, count =3D 0; =20 + slots =3D mcasp_get_tdm_slots(mcasp, stream); + if (mcasp->tdm_mask[stream]) slots =3D hweight32(mcasp->tdm_mask[stream]); =20 @@ -784,27 +954,42 @@ static int davinci_mcasp_set_tdm_slot(struct snd_soc_= dai *dai, return -EINVAL; } =20 - mcasp->tdm_slots =3D slots; + if (mcasp->async_mode) { + if (tx_mask) { + mcasp->tdm_slots_tx =3D slots; + mcasp->slot_width_tx =3D slot_width; + } + if (rx_mask) { + mcasp->tdm_slots_rx =3D slots; + mcasp->slot_width_rx =3D slot_width; + } + } else { + mcasp->tdm_slots_tx =3D slots; + mcasp->tdm_slots_rx =3D slots; + mcasp->slot_width_tx =3D slot_width; + mcasp->slot_width_rx =3D slot_width; + } + mcasp->tdm_mask[SNDRV_PCM_STREAM_PLAYBACK] =3D tx_mask; mcasp->tdm_mask[SNDRV_PCM_STREAM_CAPTURE] =3D rx_mask; - mcasp->slot_width =3D slot_width; =20 return davinci_mcasp_set_ch_constraints(mcasp); } =20 static int davinci_config_channel_size(struct davinci_mcasp *mcasp, - int sample_width) + int sample_width, int stream) { u32 fmt; u32 tx_rotate, rx_rotate, slot_width; u32 mask =3D (1ULL << sample_width) - 1; =20 - if (mcasp->slot_width) - slot_width =3D mcasp->slot_width; - else if (mcasp->max_format_width) - slot_width =3D mcasp->max_format_width; - else - slot_width =3D sample_width; + slot_width =3D mcasp_get_slot_width(mcasp, stream); + if (!slot_width) { + if (mcasp->max_format_width) + slot_width =3D mcasp->max_format_width; + else + slot_width =3D sample_width; + } /* * TX rotation: * right aligned formats: rotate w/ slot_width @@ -827,17 +1012,23 @@ static int davinci_config_channel_size(struct davinc= i_mcasp *mcasp, fmt =3D (slot_width >> 1) - 1; =20 if (mcasp->op_mode !=3D DAVINCI_MCASP_DIT_MODE) { - mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, RXSSZ(fmt), - RXSSZ(0x0F)); - mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXSSZ(fmt), - TXSSZ(0x0F)); - mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(tx_rotate), - TXROT(7)); - mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, RXROT(rx_rotate), - RXROT(7)); - mcasp_set_reg(mcasp, DAVINCI_MCASP_RXMASK_REG, mask); + if (!mcasp->async_mode || stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) { + mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXSSZ(fmt), + TXSSZ(0x0F)); + mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(tx_rotate), + TXROT(7)); + mcasp_set_reg(mcasp, DAVINCI_MCASP_TXMASK_REG, mask); + } + if (!mcasp->async_mode || stream =3D=3D SNDRV_PCM_STREAM_CAPTURE) { + mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, RXSSZ(fmt), + RXSSZ(0x0F)); + mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, RXROT(rx_rotate), + RXROT(7)); + mcasp_set_reg(mcasp, DAVINCI_MCASP_RXMASK_REG, mask); + } } else { /* + * DIT mode only use TX serializers * according to the TRM it should be TXROT=3D0, this one works: * 16 bit to 23-8 (TXROT=3D6, rotate 24 bits) * 24 bit to 23-0 (TXROT=3D0, rotate 0 bits) @@ -850,10 +1041,9 @@ static int davinci_config_channel_size(struct davinci= _mcasp *mcasp, TXROT(7)); mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXSSZ(15), TXSSZ(0x0F)); + mcasp_set_reg(mcasp, DAVINCI_MCASP_TXMASK_REG, mask); } =20 - mcasp_set_reg(mcasp, DAVINCI_MCASP_TXMASK_REG, mask); - return 0; } =20 @@ -864,11 +1054,13 @@ static int mcasp_common_hw_param(struct davinci_mcas= p *mcasp, int stream, int i; u8 tx_ser =3D 0; u8 rx_ser =3D 0; - u8 slots =3D mcasp->tdm_slots; + int slots; u8 max_active_serializers, max_rx_serializers, max_tx_serializers; int active_serializers, numevt; u32 reg; =20 + slots =3D mcasp_get_tdm_slots(mcasp, stream); + /* In DIT mode we only allow maximum of one serializers for now */ if (mcasp->op_mode =3D=3D DAVINCI_MCASP_DIT_MODE) max_active_serializers =3D 1; @@ -996,7 +1188,7 @@ static int mcasp_i2s_hw_param(struct davinci_mcasp *mc= asp, int stream, u32 mask =3D 0; u32 busel =3D 0; =20 - total_slots =3D mcasp->tdm_slots; + total_slots =3D mcasp_get_tdm_slots(mcasp, stream); =20 /* * If more than one serializer is needed, then use them with @@ -1027,7 +1219,10 @@ static int mcasp_i2s_hw_param(struct davinci_mcasp *= mcasp, int stream, mask |=3D (1 << i); } =20 - mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC); + if (mcasp->async_mode) + mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC); + else + mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC); =20 if (!mcasp->dat_port) busel =3D TXSEL; @@ -1126,16 +1321,33 @@ static int mcasp_dit_hw_param(struct davinci_mcasp = *mcasp, =20 static int davinci_mcasp_calc_clk_div(struct davinci_mcasp *mcasp, unsigned int sysclk_freq, - unsigned int bclk_freq, bool set) + unsigned int bclk_freq, + int stream, + bool set) { - u32 reg =3D mcasp_get_reg(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG); int div =3D sysclk_freq / bclk_freq; int rem =3D sysclk_freq % bclk_freq; int error_ppm; int aux_div =3D 1; + int bclk_div_id, auxclk_div_id; + bool auxclk_enabled; + + if (mcasp->async_mode && stream =3D=3D SNDRV_PCM_STREAM_CAPTURE) { + auxclk_enabled =3D mcasp_get_reg(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG) & A= HCLKRE; + bclk_div_id =3D MCASP_CLKDIV_BCLK_RXONLY; + auxclk_div_id =3D MCASP_CLKDIV_AUXCLK_RXONLY; + } else if (mcasp->async_mode && stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) { + auxclk_enabled =3D mcasp_get_reg(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG) & A= HCLKXE; + bclk_div_id =3D MCASP_CLKDIV_BCLK_TXONLY; + auxclk_div_id =3D MCASP_CLKDIV_AUXCLK_TXONLY; + } else { + auxclk_enabled =3D mcasp_get_reg(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG) & A= HCLKXE; + bclk_div_id =3D MCASP_CLKDIV_BCLK; + auxclk_div_id =3D MCASP_CLKDIV_AUXCLK; + } =20 if (div > (ACLKXDIV_MASK + 1)) { - if (reg & AHCLKXE) { + if (auxclk_enabled) { aux_div =3D div / (ACLKXDIV_MASK + 1); if (div % (ACLKXDIV_MASK + 1)) aux_div++; @@ -1165,10 +1377,10 @@ static int davinci_mcasp_calc_clk_div(struct davinc= i_mcasp *mcasp, dev_info(mcasp->dev, "Sample-rate is off by %d PPM\n", error_ppm); =20 - __davinci_mcasp_set_clkdiv(mcasp, MCASP_CLKDIV_BCLK, div, 0); - if (reg & AHCLKXE) - __davinci_mcasp_set_clkdiv(mcasp, MCASP_CLKDIV_AUXCLK, - aux_div, 0); + __davinci_mcasp_set_clkdiv(mcasp, bclk_div_id, div, false); + if (auxclk_enabled) + __davinci_mcasp_set_clkdiv(mcasp, auxclk_div_id, + aux_div, false); } =20 return error_ppm; @@ -1219,6 +1431,7 @@ static int davinci_mcasp_hw_params(struct snd_pcm_sub= stream *substream, int channels =3D params_channels(params); int period_size =3D params_period_size(params); int ret; + unsigned int sysclk_freq =3D mcasp_get_sysclk_freq(mcasp, substream->stre= am); =20 switch (params_format(params)) { case SNDRV_PCM_FORMAT_U8: @@ -1259,22 +1472,26 @@ static int davinci_mcasp_hw_params(struct snd_pcm_s= ubstream *substream, * If mcasp is BCLK master, and a BCLK divider was not provided by * the machine driver, we need to calculate the ratio. */ - if (mcasp->bclk_master && mcasp->bclk_div =3D=3D 0 && mcasp->sysclk_freq)= { - int slots =3D mcasp->tdm_slots; + if (mcasp->bclk_master && mcasp_get_bclk_div(mcasp, substream->stream) = =3D=3D 0 && + sysclk_freq) { + int slots, slot_width; int rate =3D params_rate(params); int sbits =3D params_width(params); unsigned int bclk_target; =20 - if (mcasp->slot_width) - sbits =3D mcasp->slot_width; + slots =3D mcasp_get_tdm_slots(mcasp, substream->stream); + + slot_width =3D mcasp_get_slot_width(mcasp, substream->stream); + if (slot_width) + sbits =3D slot_width; =20 if (mcasp->op_mode =3D=3D DAVINCI_MCASP_IIS_MODE) bclk_target =3D rate * sbits * slots; else bclk_target =3D rate * 128; =20 - davinci_mcasp_calc_clk_div(mcasp, mcasp->sysclk_freq, - bclk_target, true); + davinci_mcasp_calc_clk_div(mcasp, sysclk_freq, + bclk_target, substream->stream, true); } =20 ret =3D mcasp_common_hw_param(mcasp, substream->stream, @@ -1291,9 +1508,10 @@ static int davinci_mcasp_hw_params(struct snd_pcm_su= bstream *substream, if (ret) return ret; =20 - davinci_config_channel_size(mcasp, word_length); + davinci_config_channel_size(mcasp, word_length, substream->stream); =20 - if (mcasp->op_mode =3D=3D DAVINCI_MCASP_IIS_MODE) { + /* Channel constraints are disabled for async mode */ + if (mcasp->op_mode =3D=3D DAVINCI_MCASP_IIS_MODE && !mcasp->async_mode) { mcasp->channels =3D channels; if (!mcasp->max_format_width) mcasp->max_format_width =3D word_length; @@ -1337,7 +1555,7 @@ static int davinci_mcasp_hw_rule_slot_width(struct sn= d_pcm_hw_params *params, snd_pcm_format_t i; =20 snd_mask_none(&nfmt); - slot_width =3D rd->mcasp->slot_width; + slot_width =3D mcasp_get_slot_width(rd->mcasp, rd->stream); =20 pcm_for_each_format(i) { if (snd_mask_test_format(fmt, i)) { @@ -1387,12 +1605,15 @@ static int davinci_mcasp_hw_rule_rate(struct snd_pc= m_hw_params *params, struct snd_interval *ri =3D hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE); int sbits =3D params_width(params); - int slots =3D rd->mcasp->tdm_slots; + int slots, slot_width; struct snd_interval range; int i; =20 - if (rd->mcasp->slot_width) - sbits =3D rd->mcasp->slot_width; + slots =3D mcasp_get_tdm_slots(rd->mcasp, rd->stream); + + slot_width =3D mcasp_get_slot_width(rd->mcasp, rd->stream); + if (slot_width) + sbits =3D slot_width; =20 snd_interval_any(&range); range.empty =3D 1; @@ -1402,16 +1623,17 @@ static int davinci_mcasp_hw_rule_rate(struct snd_pc= m_hw_params *params, uint bclk_freq =3D sbits * slots * davinci_mcasp_dai_rates[i]; unsigned int sysclk_freq; + unsigned int ratio; int ppm; =20 - if (rd->mcasp->auxclk_fs_ratio) - sysclk_freq =3D davinci_mcasp_dai_rates[i] * - rd->mcasp->auxclk_fs_ratio; + ratio =3D mcasp_get_auxclk_fs_ratio(rd->mcasp, rd->stream); + if (ratio) + sysclk_freq =3D davinci_mcasp_dai_rates[i] * ratio; else - sysclk_freq =3D rd->mcasp->sysclk_freq; + sysclk_freq =3D mcasp_get_sysclk_freq(rd->mcasp, rd->stream); =20 ppm =3D davinci_mcasp_calc_clk_div(rd->mcasp, sysclk_freq, - bclk_freq, false); + bclk_freq, rd->stream, false); if (abs(ppm) < DAVINCI_MAX_RATE_ERROR_PPM) { if (range.empty) { range.min =3D davinci_mcasp_dai_rates[i]; @@ -1437,30 +1659,34 @@ static int davinci_mcasp_hw_rule_format(struct snd_= pcm_hw_params *params, struct snd_mask *fmt =3D hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); struct snd_mask nfmt; int rate =3D params_rate(params); - int slots =3D rd->mcasp->tdm_slots; + int slots; int count =3D 0; snd_pcm_format_t i; =20 + slots =3D mcasp_get_tdm_slots(rd->mcasp, rd->stream); + snd_mask_none(&nfmt); =20 pcm_for_each_format(i) { if (snd_mask_test_format(fmt, i)) { uint sbits =3D snd_pcm_format_width(i); unsigned int sysclk_freq; - int ppm; + unsigned int ratio; + int ppm, slot_width; =20 - if (rd->mcasp->auxclk_fs_ratio) - sysclk_freq =3D rate * - rd->mcasp->auxclk_fs_ratio; + ratio =3D mcasp_get_auxclk_fs_ratio(rd->mcasp, rd->stream); + if (ratio) + sysclk_freq =3D rate * ratio; else - sysclk_freq =3D rd->mcasp->sysclk_freq; + sysclk_freq =3D mcasp_get_sysclk_freq(rd->mcasp, rd->stream); =20 - if (rd->mcasp->slot_width) - sbits =3D rd->mcasp->slot_width; + slot_width =3D mcasp_get_slot_width(rd->mcasp, rd->stream); + if (slot_width) + sbits =3D slot_width; =20 ppm =3D davinci_mcasp_calc_clk_div(rd->mcasp, sysclk_freq, sbits * slots * rate, - false); + rd->stream, false); if (abs(ppm) < DAVINCI_MAX_RATE_ERROR_PPM) { snd_mask_set_format(&nfmt, i); count++; @@ -1497,7 +1723,7 @@ static int davinci_mcasp_startup(struct snd_pcm_subst= ream *substream, &mcasp->ruledata[substream->stream]; u32 max_channels =3D 0; int i, dir, ret; - int tdm_slots =3D mcasp->tdm_slots; + int tdm_slots; u8 *numevt; =20 /* Do not allow more then one stream per direction */ @@ -1506,6 +1732,8 @@ static int davinci_mcasp_startup(struct snd_pcm_subst= ream *substream, =20 mcasp->substreams[substream->stream] =3D substream; =20 + tdm_slots =3D mcasp_get_tdm_slots(mcasp, substream->stream); + if (mcasp->tdm_mask[substream->stream]) tdm_slots =3D hweight32(mcasp->tdm_mask[substream->stream]); =20 @@ -1527,6 +1755,7 @@ static int davinci_mcasp_startup(struct snd_pcm_subst= ream *substream, } ruledata->serializers =3D max_channels; ruledata->mcasp =3D mcasp; + ruledata->stream =3D substream->stream; max_channels *=3D tdm_slots; /* * If the already active stream has less channels than the calculated @@ -1534,9 +1763,13 @@ static int davinci_mcasp_startup(struct snd_pcm_subs= tream *substream, * is in use we need to use that as a constraint for the second stream. * Otherwise (first stream or less allowed channels or more than one * serializer in use) we use the calculated constraint. + * + * However, in async mode, TX and RX have independent clocks and can + * use different configurations, so don't apply the constraint. */ if (mcasp->channels && mcasp->channels < max_channels && - ruledata->serializers =3D=3D 1) + ruledata->serializers =3D=3D 1 && + !mcasp->async_mode) max_channels =3D mcasp->channels; /* * But we can always allow channels upto the amount of @@ -1553,10 +1786,10 @@ static int davinci_mcasp_startup(struct snd_pcm_sub= stream *substream, 0, SNDRV_PCM_HW_PARAM_CHANNELS, &mcasp->chconstr[substream->stream]); =20 - if (mcasp->max_format_width) { + if (mcasp->max_format_width && !mcasp->async_mode) { /* * Only allow formats which require same amount of bits on the - * bus as the currently running stream + * bus as the currently running stream to ensure sync mode */ ret =3D snd_pcm_hw_rule_add(substream->runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT, @@ -1565,8 +1798,7 @@ static int davinci_mcasp_startup(struct snd_pcm_subst= ream *substream, SNDRV_PCM_HW_PARAM_FORMAT, -1); if (ret) return ret; - } - else if (mcasp->slot_width) { + } else if (mcasp_get_slot_width(mcasp, substream->stream)) { /* Only allow formats require <=3D slot_width bits on the bus */ ret =3D snd_pcm_hw_rule_add(substream->runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT, @@ -1581,7 +1813,8 @@ static int davinci_mcasp_startup(struct snd_pcm_subst= ream *substream, * If we rely on implicit BCLK divider setting we should * set constraints based on what we can provide. */ - if (mcasp->bclk_master && mcasp->bclk_div =3D=3D 0 && mcasp->sysclk_freq)= { + if (mcasp->bclk_master && mcasp_get_bclk_div(mcasp, substream->stream) = =3D=3D 0 && + mcasp_get_sysclk_freq(mcasp, substream->stream)) { ret =3D snd_pcm_hw_rule_add(substream->runtime, 0, SNDRV_PCM_HW_PARAM_RATE, davinci_mcasp_hw_rule_rate, @@ -1758,8 +1991,6 @@ static struct snd_soc_dai_driver davinci_mcasp_dai[] = =3D { .formats =3D DAVINCI_MCASP_PCM_FMTS, }, .ops =3D &davinci_mcasp_dai_ops, - - .symmetric_rate =3D 1, }, { .name =3D "davinci-mcasp.1", @@ -1921,18 +2152,33 @@ static int davinci_mcasp_get_config(struct davinci_= mcasp *mcasp, goto out; } =20 + /* Parse TX-specific TDM slot and use it as default for RX */ if (of_property_read_u32(np, "tdm-slots", &val) =3D=3D 0) { if (val < 2 || val > 32) { - dev_err(&pdev->dev, "tdm-slots must be in rage [2-32]\n"); + dev_err(&pdev->dev, "tdm-slots must be in range [2-32]\n"); return -EINVAL; } =20 - pdata->tdm_slots =3D val; + pdata->tdm_slots_tx =3D val; + pdata->tdm_slots_rx =3D val; } else if (pdata->op_mode =3D=3D DAVINCI_MCASP_IIS_MODE) { mcasp->missing_audio_param =3D true; goto out; } =20 + /* Parse RX-specific TDM slot count if provided */ + if (of_property_read_u32(np, "tdm-slots-rx", &val) =3D=3D 0) { + if (val < 2 || val > 32) { + dev_err(&pdev->dev, "tdm-slots-rx must be in range [2-32]\n"); + return -EINVAL; + } + + pdata->tdm_slots_rx =3D val; + } + + if (pdata->op_mode !=3D DAVINCI_MCASP_DIT_MODE) + mcasp->async_mode =3D of_property_read_bool(np, "ti,async-mode"); + of_serial_dir32 =3D of_get_property(np, "serial-dir", &val); val /=3D sizeof(u32); if (of_serial_dir32) { @@ -1958,8 +2204,15 @@ static int davinci_mcasp_get_config(struct davinci_m= casp *mcasp, if (of_property_read_u32(np, "rx-num-evt", &val) =3D=3D 0) pdata->rxnumevt =3D val; =20 - if (of_property_read_u32(np, "auxclk-fs-ratio", &val) =3D=3D 0) - mcasp->auxclk_fs_ratio =3D val; + /* Parse TX-specific auxclk/fs ratio and use it as default for RX */ + if (of_property_read_u32(np, "auxclk-fs-ratio", &val) =3D=3D 0) { + mcasp->auxclk_fs_ratio_tx =3D val; + mcasp->auxclk_fs_ratio_rx =3D val; + } + + /* Parse RX-specific auxclk/fs ratio if provided */ + if (of_property_read_u32(np, "auxclk-fs-ratio-rx", &val) =3D=3D 0) + mcasp->auxclk_fs_ratio_rx =3D val; =20 if (of_property_read_u32(np, "dismod", &val) =3D=3D 0) { if (val =3D=3D 0 || val =3D=3D 2 || val =3D=3D 3) { @@ -1988,19 +2241,51 @@ static int davinci_mcasp_get_config(struct davinci_= mcasp *mcasp, mcasp->op_mode =3D pdata->op_mode; /* sanity check for tdm slots parameter */ if (mcasp->op_mode =3D=3D DAVINCI_MCASP_IIS_MODE) { - if (pdata->tdm_slots < 2) { - dev_warn(&pdev->dev, "invalid tdm slots: %d\n", - pdata->tdm_slots); - mcasp->tdm_slots =3D 2; - } else if (pdata->tdm_slots > 32) { - dev_warn(&pdev->dev, "invalid tdm slots: %d\n", - pdata->tdm_slots); - mcasp->tdm_slots =3D 32; + if (pdata->tdm_slots_tx < 2) { + dev_warn(&pdev->dev, "invalid tdm tx slots: %d\n", + pdata->tdm_slots_tx); + mcasp->tdm_slots_tx =3D 2; + } else if (pdata->tdm_slots_tx > 32) { + dev_warn(&pdev->dev, "invalid tdm tx slots: %d\n", + pdata->tdm_slots_tx); + mcasp->tdm_slots_tx =3D 32; } else { - mcasp->tdm_slots =3D pdata->tdm_slots; + mcasp->tdm_slots_tx =3D pdata->tdm_slots_tx; + } + + if (pdata->tdm_slots_rx < 2) { + dev_warn(&pdev->dev, "invalid tdm rx slots: %d\n", + pdata->tdm_slots_rx); + mcasp->tdm_slots_rx =3D 2; + } else if (pdata->tdm_slots_rx > 32) { + dev_warn(&pdev->dev, "invalid tdm rx slots: %d\n", + pdata->tdm_slots_rx); + mcasp->tdm_slots_rx =3D 32; + } else { + mcasp->tdm_slots_rx =3D pdata->tdm_slots_rx; } } else { - mcasp->tdm_slots =3D 32; + mcasp->tdm_slots_tx =3D 32; + mcasp->tdm_slots_rx =3D 32; + } + + /* Different TX/RX slot counts require async mode */ + if (pdata->op_mode !=3D DAVINCI_MCASP_DIT_MODE && + mcasp->tdm_slots_tx !=3D mcasp->tdm_slots_rx && !mcasp->async_mode) { + dev_err(&pdev->dev, + "Different TX (%d) and RX (%d) TDM slots require ti,async-mode\n", + mcasp->tdm_slots_tx, mcasp->tdm_slots_rx); + return -EINVAL; + } + + /* Different TX/RX auxclk-fs-ratio require async mode */ + if (pdata->op_mode !=3D DAVINCI_MCASP_DIT_MODE && + mcasp->auxclk_fs_ratio_tx && mcasp->auxclk_fs_ratio_rx && + mcasp->auxclk_fs_ratio_tx !=3D mcasp->auxclk_fs_ratio_rx && !mcasp->a= sync_mode) { + dev_err(&pdev->dev, + "Different TX (%d) and RX (%d) auxclk-fs-ratio require ti,async-mode\n", + mcasp->auxclk_fs_ratio_tx, mcasp->auxclk_fs_ratio_rx); + return -EINVAL; } =20 mcasp->num_serializer =3D pdata->num_serializer; diff --git a/sound/soc/ti/davinci-mcasp.h b/sound/soc/ti/davinci-mcasp.h index 5de2b8a31061..4eba8c918c5f 100644 --- a/sound/soc/ti/davinci-mcasp.h +++ b/sound/soc/ti/davinci-mcasp.h @@ -298,10 +298,20 @@ /* Source of High-frequency transmit/receive clock */ #define MCASP_CLK_HCLK_AHCLK 0 /* AHCLKX/R */ #define MCASP_CLK_HCLK_AUXCLK 1 /* Internal functional clock */ +#define MCASP_CLK_HCLK_AHCLK_TXONLY 2 /* AHCLKX for TX only */ +#define MCASP_CLK_HCLK_AHCLK_RXONLY 3 /* AHCLKR for RX only */ +#define MCASP_CLK_HCLK_AUXCLK_TXONLY 4 /* AUXCLK for TX only */ +#define MCASP_CLK_HCLK_AUXCLK_RXONLY 5 /* AUXCLK for RX only */ =20 /* clock divider IDs */ #define MCASP_CLKDIV_AUXCLK 0 /* HCLK divider from AUXCLK */ #define MCASP_CLKDIV_BCLK 1 /* BCLK divider from HCLK */ #define MCASP_CLKDIV_BCLK_FS_RATIO 2 /* to set BCLK FS ration */ +#define MCASP_CLKDIV_AUXCLK_TXONLY 3 /* AUXCLK divider for TX only */ +#define MCASP_CLKDIV_AUXCLK_RXONLY 4 /* AUXCLK divider for RX only */ +#define MCASP_CLKDIV_BCLK_TXONLY 5 /* BCLK divider for TX only */ +#define MCASP_CLKDIV_BCLK_RXONLY 6 /* BCLK divider for RX only */ +#define MCASP_CLKDIV_BCLK_FS_RATIO_TXONLY 7 /* BCLK/FS ratio for TX only */ +#define MCASP_CLKDIV_BCLK_FS_RATIO_RXONLY 8 /* BCLK/FS ratio for RX only */ =20 #endif /* DAVINCI_MCASP_H */ --=20 2.43.0