From nobody Sat Jul 25 04:29:51 2026 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 97B9633D6ED for ; Sat, 18 Jul 2026 08:57:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784365068; cv=none; b=Q6+Y7fpQr8/v3jHbHrqd9MboLi2xZGbRYoGjsTwSSVBLD09l/PbpvjW3EMUJghpSX+QUZ/dGhf5q54vKVZ4AgJPNzjt585ML+AIzZvE313IF+qrkLuyfaX3+lxD92TE1wQlDoj0YzucHn5R020Dkh2D3AWo7IpQXiq/f+9tZedk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784365068; c=relaxed/simple; bh=FBKBF74RW1jmtaWW/YnMsgj9Hhr7SISvBtJONmdABjE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FotUrSpOZc4707vQahHm+i5TpjLRw8EScucdN5NCNzG7N9JKA34r3/zstlvzzGSBKexLcpcRKraVnLJZdNWd5cFvveqmh88PDKcl3gGAooey1A9jfIh6wUcF9Y8/137y/2mNwtkKwRfDIoa034w5pEEATJPsj74xCYjN2o0X0nQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=aFe/+oHG; arc=none smtp.client-ip=209.85.128.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="aFe/+oHG" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-4925a778491so3498485e9.0 for ; Sat, 18 Jul 2026 01:57:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784365065; x=1784969865; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=1HzdZoi0bv+xxuKeJljmyb5SqIlDMVTBvbaIEvE8LEk=; b=aFe/+oHGG2z/Gb6U1Q8F1yN/JL4u9iDUNBxI1KkftcvQ38F7M9NNbOoCBAgmrh2kjo S78FppExqboE403aTMOXATmrfAQsODJDCQ46fgCnkY8CzQOoXIgPC1eTYBPweMhODlsr ta0qNWbMShqjqoU3tyDA/jdgAd7or0lHjRiBvOooauS5lkbwtWbWJlDxuWLAgnOzz2DC aFdsfjYP9S8WgG77KfGRXkBOK9zjWmbMhF4LNiv7HYeVPxH/8D2DYwMpaEnhvazs0PbD t2PWuXpKKnmyCAnN030zEH4AMZeCqqd8Ot1Z9rwFLXB7HXpW0I/wZrOvJWsyYKBZxeE2 FLnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784365065; x=1784969865; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=1HzdZoi0bv+xxuKeJljmyb5SqIlDMVTBvbaIEvE8LEk=; b=C7xlmaOs8hmbeuGpPht+vjJabljsfRO638uWqJFNftIY+w+HgN3FUkboIvY2zQLX76 7qfGxccfQVlOn+LlhnKJtWrhFROVZRRDieUGQd4xgkGlEuakjV8V7GwEk3EcHRnRuukK s7PBUTk4FRdI2iuiJZEaRH8HfRqodCJO8iDFPRS9Yk2Od1MMNCa3c2osMZVkMaWdwpwM wDIUQTPudABwpzYVKjvi72/UMkHFd+FP5zs2iLlLcX0T8ZlyzSX+Fs/tlD+LX/azBDdo PcaTBTAa/PQrTRl7hgiInal3TdDfpgxCL1iy7gKuaE4OJROhfyZjAbaBRsrC7VQUDM0W ksgg== X-Forwarded-Encrypted: i=1; AHgh+RrTRakdgIM39QUG6S4BMnJ4j7V1IYC5+Niypq0bUzCvn7kkRLQlwt3SoIbsRXU0dnQufetmFtAWaVJGdiI=@vger.kernel.org X-Gm-Message-State: AOJu0Yxdalm7YWE7HQ0qz/0OW+X9Z7s+1IvDRRosGxG37v4JSzEhduK2 SsS53chieBZ+j1AJLQRHF7nXz/r+kQAgJUzTDZZdcKijY+vqfe/Jt3lC X-Gm-Gg: AfdE7cn+/Aw9axNOdrTxw6/YE6QJKsxEceIHUidp/GSUB8pdF9pbeCopDTcHsI6h9x6 NP2BV17duhWN0GwC6HlKwo7P+v9bz21fdEIhLg8nZkZrJ+l4oTWyl/FpLWvayJ5sYF0GsqC9RNq 4ATYiW8OVCYST5cXKYtrg4LSGQtM9ilTBZl1LK93ui5rEk7A1KA6L5/fPG8vvIo1ceOzRK9VHBH 7l0+xjX6rBGFH4fpkf1IANZvB+5aKV49DsZbpgRkWZd7fdAyGhzDhvdbTdn5lVWs43KKIQejAhX q9VDWCWw4bRzmC4xr7EIf3+41EdwzNrczwHYSqSX5DndFRBGtWLABXrmq0KsrUEPbZlY95lJaAc o/s1dObnSNpnWknjRtPTpCbLFxOA5MPY2aBSysOJ/GjmlSu26c1f89PLdaKFY9YQmzkEa68GiOk 6+3e1LFkZW3GXHCzFPttGhIrxvCLrxyN6QrhP0DH8ayv+7M8x/mFZ7ydeHKxUGbDzHF9VJpAWpz uTLkFFaPw== X-Received: by 2002:a05:600c:35c8:b0:495:4505:dad0 with SMTP id 5b1f17b1804b1-4954a3eb076mr54474895e9.2.1784365064613; Sat, 18 Jul 2026 01:57:44 -0700 (PDT) Received: from OrangePi5-Plus.BB-HOME (20014C4E1B8D1600206D23E70680CBAA.dsl.pool.telekom.hu. [2001:4c4e:1b8d:1600:206d:23e7:680:cbaa]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4954834edc3sm91477455e9.0.2026.07.18.01.57.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 18 Jul 2026 01:57:44 -0700 (PDT) From: Igor Paunovic To: Dmitry Osipenko , Mauro Carvalho Chehab Cc: Sebastian Reichel , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, kernel@collabora.com, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Igor Paunovic Subject: [PATCH v3 1/4] dt-bindings: media: snps,dw-hdmi-rx: add #sound-dai-cells Date: Sat, 18 Jul 2026 10:57:25 +0200 Message-ID: <20260718085728.6797-2-royalnet026@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260718085728.6797-1-royalnet026@gmail.com> References: <20260718085728.6797-1-royalnet026@gmail.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 Content-Type: text/plain; charset="utf-8" The HDMI RX controller can expose the audio embedded in the incoming HDMI stream as an ALSA capture device. Document the #sound-dai-cells property so that a sound card can reference the HDMI RX audio DAI. Signed-off-by: Igor Paunovic --- Changes in v3: - no changes Changes in v2 (all suggested by Sebastian Reichel): - reworded the commit message to describe the hardware - property description now documents the DAI indexes (0 =3D I2S, 1 =3D S/PDIF) - moved the consumer reference into the binding example .../devicetree/bindings/media/snps,dw-hdmi-rx.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Documentation/devicetree/bindings/media/snps,dw-hdmi-rx.yaml b= /Documentation/devicetree/bindings/media/snps,dw-hdmi-rx.yaml index b7f6c87..fa6cd0d 100644 --- a/Documentation/devicetree/bindings/media/snps,dw-hdmi-rx.yaml +++ b/Documentation/devicetree/bindings/media/snps,dw-hdmi-rx.yaml @@ -78,6 +78,13 @@ properties: The phandle of the syscon node for the Video Output GRF register to enable EDID transfer through SDAIN and SCLIN. =20 + "#sound-dai-cells": + const: 1 + description: + The HDMI RX controller has two digital audio interfaces, one for + I2S and one for S/PDIF. The DAI cell selects the interface, 0 for + I2S and 1 for S/PDIF. + required: - compatible - reg @@ -129,4 +136,6 @@ examples: pinctrl-0 =3D <&hdmim1_rx_cec &hdmim1_rx_hpdin &hdmim1_rx_scl &hdmim= 1_rx_sda &hdmirx_5v_detection>; pinctrl-names =3D "default"; hpd-gpios =3D <&gpio1 22 GPIO_ACTIVE_LOW>; + /* referenced by a sound card as <&hdmi_receiver 0> (0: I2S, 1: S/PD= IF) */ + #sound-dai-cells =3D <1>; }; --=20 2.53.0 From nobody Sat Jul 25 04:29:51 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 30D4337CD24 for ; Sat, 18 Jul 2026 08:57:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784365070; cv=none; b=b/lgopr3UhdXFTDxsvK1C7b4qZTfbTFtF2wvd3LqnZL66hEEACFukiopTLrGcTGR0RtyXxaEsNEiEWSlO8peRICoGn3ofKA2BVq+5U0VvjaT3MiG9Zg4wMYfAU1GFDwZZZ2dJQuDo2rqiHXD9sNx208wU/PMmJUlw13qnBVb8qQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784365070; c=relaxed/simple; bh=K4dOvTgZEd0Bx0/BDsPYu2mzGTZ+2d1VtRBgXK0Iufw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HYnDQ5B0zllwkcAFZm+vNvoz5i2t/pcn5Lw1ZW5q/LSmUQUVzJqLvCUbBGlf2TU5jsQfOA3KVMPQ/XBLueIXNPGCmXPS5J3zn3psKvB2lOt+LsqiIa4l50zO0bK3Ducif44LeRjlHXe9kUPfXgwK30Qnv1r8zwgGltosFwcU/H4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=fv1em9uj; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="fv1em9uj" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-490d6730461so9670885e9.3 for ; Sat, 18 Jul 2026 01:57:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784365066; x=1784969866; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=SDnMtCkuMj9Cogsv4cA0KYznv1xBNwp6u1rkofi/6cU=; b=fv1em9ujWwLWw92XDlvtntoH5oZGjSOv0QtzKNZ2XY+UZQeIpuMo4IZoppcea+vt56 /ZhhfTEIsTffA88fhevb5vc0gnGBGMQm/06iJ4bta4eTntHOmo+KIDQYSn9H+GBzE4bG sPd9FfZRvnNAjF9f0HmBgkd4fDvDCzn9A5BZVIkbhtCGQdQ8ML0/cVdbQ6srDRLvRVdd Uk9+9GNALYReVg67zR1OmuDORV4yYJivqQNq3qNfJVsVoWLJdiGK3n2rrOfy5aOPxkLE gr9nNekTBtZhCBhBBTTOKyRK50T0kjCIgZr0N2hnszgFbteKdcteUAX8oJdUdKX2akSX 78zg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784365066; x=1784969866; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=SDnMtCkuMj9Cogsv4cA0KYznv1xBNwp6u1rkofi/6cU=; b=qrqU4cGCzU0mzTYrsZG8PRdEofLbIaY2HN4qkIRLkStLU6EjW05ZpaNAr1v1hRho0d cTcEbE7JGGW9ioM418AzLlzarBlTcgbcAUOBbzdak7LIcop7TcNikz6YssB66uT43fLy Amo3AORzYwG+gV/mYtHUJn44nNFcc0hNdKI4M0cd3jW6Tryj55gpbUNLdr93P42gLppH dnZnNedZHrgV6mpVJTD0w7ix3fNHj7w0e4WE6AQLdJrhbF3MPcJaE07lMDe1cHvyzMyS qT5hRMUL1V9Sd5vKSCJyTh9SJUHbDNtXRc9U/qA7zWNNAz2K00t8ixIE1FTpsmJlaEPh iPRA== X-Forwarded-Encrypted: i=1; AHgh+RqfULVbD+w3i2MutSbV6/pFpk9p2ko3qOQ0sIHYbWDSbYZSIt3URiuDr2bnmLMD/XKyrt9uGKCmmxQHUZw=@vger.kernel.org X-Gm-Message-State: AOJu0Yw8OOo2Gp8W6SlG1cTV5vnh6QdkgMEF2ZXffcKb15jdE9eb3sBp qvYUyRmZMB08JewEj5AGKfqgkm+5TlTp9A7nDzLrERjB4svTDrRyr2vO X-Gm-Gg: AfdE7ckQ2UuH8TCc69pKgZCk4umi1sBiLDvjpE0fa4QKY2PA2vQi+7VUAxIt2Vrurwr KV9yfln7sDqDZBB1FDdkyMkatXpuXCNS9wxsKXx5KIbXHQrHmp+zAiaF0IN2zADjWtFd/9jC8xA cJQJ00r+WRvC7iSAgpKtN8PztXGcAxk+7xdK9vE7C5UcfVueQYDzkaA09AyGdmWftssh+QJeKC+ vIMybHstwwbZRl0eggmOFzBfIir0AH7fJBR1E0BdeN91OMy2jIFJZwP4UdnLsnXc4v8SmJ4Lu8F QZz516qiwPvqwp2VznqzRE/fXdXrhy88nY3yeVjTSvn9Y5Q7ue225rspkjRUUJPn7kFTgOWy+1i QNUqmWXwnK14tx3nXbLO9rCTjt1AREgEIw8huR65X03NgTxUt3gWVxB08FKkAApplpjHG2r17c2 52+3vQyeBO7o/3pZ1SRvhl9Neo7AKPAd5CPTNJtIuA1EN1cc7v4okfb88jLVVEUVsWMu3reEpNK 2/88IgFAUQOUWPXC3Cp X-Received: by 2002:a05:600c:b8d:b0:493:b6a2:858d with SMTP id 5b1f17b1804b1-4954a51321cmr38761665e9.6.1784365066131; Sat, 18 Jul 2026 01:57:46 -0700 (PDT) Received: from OrangePi5-Plus.BB-HOME (20014C4E1B8D1600206D23E70680CBAA.dsl.pool.telekom.hu. [2001:4c4e:1b8d:1600:206d:23e7:680:cbaa]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4954834edc3sm91477455e9.0.2026.07.18.01.57.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 18 Jul 2026 01:57:45 -0700 (PDT) From: Igor Paunovic To: Dmitry Osipenko , Mauro Carvalho Chehab Cc: Sebastian Reichel , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, kernel@collabora.com, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Igor Paunovic Subject: [PATCH v3 2/4] media: synopsys: hdmirx: add HDMI audio capture support Date: Sat, 18 Jul 2026 10:57:26 +0200 Message-ID: <20260718085728.6797-3-royalnet026@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260718085728.6797-1-royalnet026@gmail.com> References: <20260718085728.6797-1-royalnet026@gmail.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 Content-Type: text/plain; charset="utf-8" The Synopsys DesignWare HDMI RX controller extracts the audio stream embedded in the incoming HDMI signal and feeds it to an on-SoC I2S controller. Expose it as an ALSA capture device by registering the generic hdmi-codec as a child of the controller, so that a simple-audio-card in the device tree can bind the HDMI RX audio DAI. The sample rate is recovered from the ACR N/CTS values together with the measured TMDS character rate. A periodic worker keeps the local audio reference clock locked to the source by nudging it in small ppm steps to hold the audio FIFO fill level near its target, which avoids FIFO under/overflow and the resulting dropped samples. Signed-off-by: Igor Paunovic --- Changes in v3: - restore the v1 audio teardown in remove(): audio_shutdown() already stops the worker when the stream closes, so the extra flag clear and trailing cancel added in v2 were redundant (Dmitry Osipenko) - rename the ACR read locals and add a comment documenting the register byte packing - drop the get_dai_id stub so OF-graph cards resolve the DAI index from the reg property Changes in v2: - register the S/PDIF DAI so the indexes match the binding and reject it with -EOPNOTSUPP until wired up (Sebastian Reichel) - use platform_device_register_data() and drop the fixed 32-bit DMA mask (Dmitry Osipenko) - don't leave an ERR_PTR in audio_pdev on registration failure - fix teardown ordering in remove() - stop the worker before reprogramming shared state in hw_params() - look up the "audio" clock by name instead of indexing clks[1] - keep the worker on system_unbound_wq when re-arming .../platform/synopsys/hdmirx/snps_hdmirx.c | 271 ++++++++++++++++++ .../platform/synopsys/hdmirx/snps_hdmirx.h | 8 + 2 files changed, 279 insertions(+) diff --git a/drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c b/drivers= /media/platform/synopsys/hdmirx/snps_hdmirx.c index 9cceffa..8636944 100644 --- a/drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c +++ b/drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c @@ -41,6 +41,8 @@ #include #include =20 +#include + #include "snps_hdmirx.h" #include "snps_hdmirx_cec.h" =20 @@ -132,6 +134,13 @@ struct snps_hdmirx_dev { struct delayed_work delayed_work_hotplug; struct delayed_work delayed_work_res_change; struct hdmirx_cec *cec; + struct platform_device *audio_pdev; + struct clk *audio_clk; + struct delayed_work audio_work; + u32 audio_clkrate; + u32 audio_fs; + int audio_pre_state; + bool audio_streaming; struct mutex phy_rw_lock; /* to protect phy r/w configuration */ struct mutex stream_lock; /* to lock video stream capture */ struct mutex work_lock; /* to lock the critical section of hotplug event = */ @@ -2283,6 +2292,13 @@ static int hdmirx_parse_dt(struct snps_hdmirx_dev *h= dmirx_dev) if (hdmirx_dev->num_clks < 1) return -ENODEV; =20 + for (int i =3D 0; i < hdmirx_dev->num_clks; i++) { + if (!strcmp(hdmirx_dev->clks[i].id, "audio")) { + hdmirx_dev->audio_clk =3D hdmirx_dev->clks[i].clk; + break; + } + } + hdmirx_dev->resets[HDMIRX_RST_A].id =3D "axi"; hdmirx_dev->resets[HDMIRX_RST_P].id =3D "apb"; hdmirx_dev->resets[HDMIRX_RST_REF].id =3D "ref"; @@ -2650,6 +2666,253 @@ static int hdmirx_register_cec(struct snps_hdmirx_d= ev *hdmirx_dev, return 0; } =20 +#define HDMIRX_AUDIO_INIT_FIFO_STATE 128 +#define HDMIRX_AUDIO_INIT_STATE (HDMIRX_AUDIO_INIT_FIFO_STATE * 4) + +static const int hdmirx_supported_fs[] =3D { + 32000, 44100, 48000, 88200, 96000, 176400, 192000, 768000, -1 +}; + +static int hdmirx_audio_closest_fs(int fs) +{ + int i =3D 0, fs_t =3D hdmirx_supported_fs[0]; + + while (fs_t > 0) { + if (abs(fs - fs_t) <=3D 2000) + return fs_t; + fs_t =3D hdmirx_supported_fs[++i]; + } + return 0; +} + +/* Recover the incoming audio sample rate from the ACR N/CTS + TMDS clock.= */ +static u32 hdmirx_audio_fs(struct snps_hdmirx_dev *hdmirx_dev) +{ + u64 tmds_clk, fs_audio =3D 0; + u32 acr_cts, acr_n, tmdsqpclk_freq; + u32 acr_pb3_0, acr_pb7_4; + + tmdsqpclk_freq =3D hdmirx_readl(hdmirx_dev, CMU_TMDSQPCLK_FREQ); + hdmirx_readl(hdmirx_dev, PKTDEC_ACR_PH2_1); + acr_pb3_0 =3D hdmirx_readl(hdmirx_dev, PKTDEC_ACR_PB3_0); + acr_pb7_4 =3D hdmirx_readl(hdmirx_dev, PKTDEC_ACR_PB7_4); + /* + * The packet decoder stores the ACR subpacket bytes with packet byte + * 0 in register bits [7:0], so byte-swap each word to line the bytes + * up: CTS is packet bytes 1-3 (PKTDEC_ACR_PB3_0) and N is packet + * bytes 4-6 (PKTDEC_ACR_PB7_4), 20 bits each. + */ + acr_cts =3D be32_to_cpu((__force __be32)acr_pb3_0) & 0xfffff; + acr_n =3D (be32_to_cpu((__force __be32)acr_pb7_4) & 0x0fffff00) >> 8; + tmds_clk =3D tmdsqpclk_freq * 4 * 1000U; + if (acr_cts !=3D 0) { + fs_audio =3D div_u64((tmds_clk * acr_n), acr_cts); + fs_audio /=3D 128; + fs_audio =3D hdmirx_audio_closest_fs(fs_audio); + } + return (u32)fs_audio; +} + +/* Nudge the audio reference clock by +/- ppm to keep the FIFO balanced. */ +static void hdmirx_audio_clk_ppm_inc(struct snps_hdmirx_dev *hdmirx_dev, i= nt ppm) +{ + int delta, inc; + long rate =3D hdmirx_dev->audio_clkrate; + + if (ppm < 0) { + ppm =3D -ppm; + inc =3D -1; + } else { + inc =3D 1; + } + delta =3D (int)div64_u64((u64)rate * ppm + 500000, 1000000); + delta *=3D inc; + rate =3D hdmirx_dev->audio_clkrate + delta; + clk_set_rate(hdmirx_dev->audio_clk, rate); + hdmirx_dev->audio_clkrate =3D rate; +} + +static int hdmirx_audio_clk_adjust(struct snps_hdmirx_dev *hdmirx_dev, + int total_offset, int single_offset) +{ + int schedule_time =3D 500; + int ppm =3D 10; + u32 offset_abs =3D abs(total_offset); + + if (offset_abs > 200) { + ppm +=3D 200; + schedule_time -=3D 100; + } + if (offset_abs > 100) { + ppm +=3D 200; + schedule_time -=3D 100; + } + if (offset_abs > 32) { + ppm +=3D 20; + schedule_time -=3D 100; + } + if (offset_abs > 16) + ppm +=3D 20; + if (total_offset > 16 && single_offset > 0) + hdmirx_audio_clk_ppm_inc(hdmirx_dev, ppm); + else if (total_offset < -16 && single_offset < 0) + hdmirx_audio_clk_ppm_inc(hdmirx_dev, -ppm); + return schedule_time; +} + +static void hdmirx_audio_fifo_reinit(struct snps_hdmirx_dev *hdmirx_dev) +{ + hdmirx_writel(hdmirx_dev, AUDIO_FIFO_CONTROL, 1); + usleep_range(200, 210); + hdmirx_writel(hdmirx_dev, AUDIO_FIFO_CONTROL, 0); +} + +/* + * Periodic worker that locks the local audio clock to the source by keepi= ng + * the audio FIFO fill level close to its target, avoiding under/overflow. + */ +static void hdmirx_audio_work(struct work_struct *work) +{ + struct snps_hdmirx_dev *hdmirx_dev =3D + container_of(to_delayed_work(work), struct snps_hdmirx_dev, audio_work); + unsigned long delay =3D 200; + int cur, total, single; + u32 fifo, fs; + + fs =3D hdmirx_audio_fs(hdmirx_dev); + fifo =3D hdmirx_readl(hdmirx_dev, AUDIO_FIFO_STATUS2); + + if (fifo & (AFIFO_UNDERFLOW_ST | AFIFO_OVERFLOW_ST)) { + if (fs) { + clk_set_rate(hdmirx_dev->audio_clk, fs * 128); + hdmirx_dev->audio_clkrate =3D fs * 128; + hdmirx_dev->audio_fs =3D fs; + } + hdmirx_audio_fifo_reinit(hdmirx_dev); + hdmirx_dev->audio_pre_state =3D 0; + goto out; + } + + cur =3D fifo & 0xffff; + total =3D cur - HDMIRX_AUDIO_INIT_STATE; + single =3D cur - hdmirx_dev->audio_pre_state; + + if (fs && abs((int)fs - (int)hdmirx_dev->audio_fs) > 1000) { + clk_set_rate(hdmirx_dev->audio_clk, fs * 128); + hdmirx_dev->audio_clkrate =3D fs * 128; + hdmirx_dev->audio_fs =3D fs; + hdmirx_audio_fifo_reinit(hdmirx_dev); + hdmirx_dev->audio_pre_state =3D 0; + goto out; + } + + if (cur !=3D 0) + delay =3D hdmirx_audio_clk_adjust(hdmirx_dev, total, single); + hdmirx_dev->audio_pre_state =3D cur; +out: + /* Only re-arm while streaming; avoids a self-reschedule race with + * the cancel_delayed_work_sync() callers (hw_params and + * audio_shutdown). + */ + if (READ_ONCE(hdmirx_dev->audio_streaming)) + queue_delayed_work(system_unbound_wq, &hdmirx_dev->audio_work, + msecs_to_jiffies(delay)); +} + +static int hdmirx_audio_hw_params(struct device *dev, void *data, + struct hdmi_codec_daifmt *fmt, + struct hdmi_codec_params *hparms) +{ + struct snps_hdmirx_dev *hdmirx_dev =3D dev_get_drvdata(dev); + u32 fs; + + /* Only the I2S interface (DAI 0) is wired up so far. */ + if (fmt->fmt =3D=3D HDMI_SPDIF) + return -EOPNOTSUPP; + + /* + * Stop the worker before touching the shared audio state; it is + * re-armed below once the new parameters are in place. + */ + WRITE_ONCE(hdmirx_dev->audio_streaming, false); + cancel_delayed_work_sync(&hdmirx_dev->audio_work); + + fs =3D hdmirx_audio_fs(hdmirx_dev); + if (!fs) + fs =3D hparms ? hparms->sample_rate : 48000; + if (!fs) + fs =3D 48000; + + hdmirx_dev->audio_fs =3D fs; + hdmirx_dev->audio_clkrate =3D fs * 128; + clk_set_rate(hdmirx_dev->audio_clk, fs * 128); + + hdmirx_audio_fifo_reinit(hdmirx_dev); + hdmirx_writel(hdmirx_dev, AUDIO_FIFO_THR_PASS, HDMIRX_AUDIO_INIT_FIFO_STA= TE); + hdmirx_writel(hdmirx_dev, AUDIO_FIFO_THR, + AFIFO_THR_LOW_QST(0x20) | AFIFO_THR_HIGH_QST(0x160)); + hdmirx_writel(hdmirx_dev, AUDIO_FIFO_MUTE_THR, + AFIFO_THR_MUTE_LOW_QST(0x8) | AFIFO_THR_MUTE_HIGH_QST(0x178)); + + hdmirx_update_bits(hdmirx_dev, AUDIO_PROC_CONFIG0, I2S_EN, I2S_EN); + hdmirx_update_bits(hdmirx_dev, GLOBAL_SWENABLE, AUDIO_ENABLE, AUDIO_ENABL= E); + + hdmirx_dev->audio_pre_state =3D 0; + WRITE_ONCE(hdmirx_dev->audio_streaming, true); + mod_delayed_work(system_unbound_wq, &hdmirx_dev->audio_work, + msecs_to_jiffies(200)); + + dev_dbg(dev, "audio hw_params: fs=3D%u\n", fs); + return 0; +} + +static void hdmirx_audio_shutdown(struct device *dev, void *data) +{ + struct snps_hdmirx_dev *hdmirx_dev =3D dev_get_drvdata(dev); + + WRITE_ONCE(hdmirx_dev->audio_streaming, false); + cancel_delayed_work_sync(&hdmirx_dev->audio_work); + hdmirx_update_bits(hdmirx_dev, GLOBAL_SWENABLE, AUDIO_ENABLE, 0); +} + +static const struct hdmi_codec_ops hdmirx_audio_codec_ops =3D { + .hw_params =3D hdmirx_audio_hw_params, + .audio_shutdown =3D hdmirx_audio_shutdown, +}; + +static int hdmirx_register_audio_device(struct snps_hdmirx_dev *hdmirx_dev) +{ + struct hdmi_codec_pdata codec_data =3D { + .ops =3D &hdmirx_audio_codec_ops, + .i2s =3D 1, + .no_i2s_playback =3D 1, + .max_i2s_channels =3D 8, + /* + * The controller also has an S/PDIF audio interface (DAI 1 in + * the binding). Register it so DAI indexes match the binding, + * but reject its use in hw_params() until it is wired up. + */ + .spdif =3D 1, + .no_spdif_playback =3D 1, + .data =3D hdmirx_dev, + }; + struct platform_device *audio_pdev; + + if (!hdmirx_dev->audio_clk) + return -ENODEV; + + audio_pdev =3D platform_device_register_data(hdmirx_dev->dev, + HDMI_CODEC_DRV_NAME, + PLATFORM_DEVID_AUTO, + &codec_data, sizeof(codec_data)); + if (IS_ERR(audio_pdev)) + return PTR_ERR(audio_pdev); + + hdmirx_dev->audio_pdev =3D audio_pdev; + + return 0; +} + static int hdmirx_probe(struct platform_device *pdev) { struct snps_hdmirx_dev *hdmirx_dev; @@ -2701,6 +2964,7 @@ static int hdmirx_probe(struct platform_device *pdev) hdmirx_delayed_work_hotplug); INIT_DELAYED_WORK(&hdmirx_dev->delayed_work_res_change, hdmirx_delayed_work_res_change); + INIT_DELAYED_WORK(&hdmirx_dev->audio_work, hdmirx_audio_work); =20 hdmirx_dev->cur_fmt_fourcc =3D V4L2_PIX_FMT_BGR24; hdmirx_dev->timings =3D cea640x480; @@ -2769,6 +3033,10 @@ static int hdmirx_probe(struct platform_device *pdev) V4L2_DEBUGFS_IF_AVI, hdmirx_dev, hdmirx_debugfs_if_read); =20 + ret =3D hdmirx_register_audio_device(hdmirx_dev); + if (ret) + dev_warn(dev, "failed to register HDMI audio codec: %d\n", ret); + return 0; =20 err_unreg_video_dev: @@ -2788,6 +3056,9 @@ static void hdmirx_remove(struct platform_device *pde= v) struct device *dev =3D &pdev->dev; struct snps_hdmirx_dev *hdmirx_dev =3D dev_get_drvdata(dev); =20 + if (hdmirx_dev->audio_pdev) + platform_device_unregister(hdmirx_dev->audio_pdev); + v4l2_debugfs_if_free(hdmirx_dev->infoframes); debugfs_remove_recursive(hdmirx_dev->debugfs_dir); =20 diff --git a/drivers/media/platform/synopsys/hdmirx/snps_hdmirx.h b/drivers= /media/platform/synopsys/hdmirx/snps_hdmirx.h index 31b887e..a99f54f 100644 --- a/drivers/media/platform/synopsys/hdmirx/snps_hdmirx.h +++ b/drivers/media/platform/synopsys/hdmirx/snps_hdmirx.h @@ -81,6 +81,7 @@ #define DATAPATH_ENABLE BIT(12) #define PKTFIFO_ENABLE BIT(11) #define AVPUNIT_ENABLE BIT(8) +#define AUDIO_ENABLE BIT(9) #define MAIN_ENABLE BIT(0) #define GLOBAL_TIMER_REF_BASE 0x0028 #define CORE_CONFIG 0x0050 @@ -177,20 +178,27 @@ #define VPROC_FMT_OVR_VALUE(x) UPDATE(x, 6, 4) #define VPROC_FMT_OVR_EN BIT(0) =20 +#define AUDIO_FIFO_CONFIG 0x0460 #define AFIFO_FILL_RESTART BIT(0) +#define AUDIO_FIFO_CONTROL 0x0464 #define AFIFO_INIT_P BIT(0) +#define AUDIO_FIFO_THR_PASS 0x0468 +#define AUDIO_FIFO_THR 0x046c #define AFIFO_THR_LOW_QST_MASK GENMASK(25, 16) #define AFIFO_THR_LOW_QST(x) UPDATE(x, 25, 16) #define AFIFO_THR_HIGH_QST_MASK GENMASK(9, 0) #define AFIFO_THR_HIGH_QST(x) UPDATE(x, 9, 0) +#define AUDIO_FIFO_MUTE_THR 0x0470 #define AFIFO_THR_MUTE_LOW_QST_MASK GENMASK(25, 16) #define AFIFO_THR_MUTE_LOW_QST(x) UPDATE(x, 25, 16) #define AFIFO_THR_MUTE_HIGH_QST_MASK GENMASK(9, 0) #define AFIFO_THR_MUTE_HIGH_QST(x) UPDATE(x, 9, 0) =20 +#define AUDIO_FIFO_STATUS2 0x0478 #define AFIFO_UNDERFLOW_ST BIT(25) #define AFIFO_OVERFLOW_ST BIT(24) =20 +#define AUDIO_PROC_CONFIG0 0x0480 #define SPEAKER_ALLOC_OVR_EN BIT(16) #define I2S_BPCUV_EN BIT(4) #define SPDIF_EN BIT(2) --=20 2.53.0 From nobody Sat Jul 25 04:29:51 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 688FF385D97 for ; Sat, 18 Jul 2026 08:57:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784365075; cv=none; b=FLLBHRTvZgEkEs57A0lIN8LMwd/yUFobyiJwp8McIoK2r3hL0gzW0/znhMgvw79nE6W5nEjFahB1S8hMk13bsurbbqxNRisRfWyRxULuV33tabB0ODXD2+ovsEkkLh0aDP8KJ5kzqtYM7p0s7FXuWPlJ+sMZUrdtT3x+YhsYDt8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784365075; c=relaxed/simple; bh=og04sSBm3wAKBXPeDuda5ze9nmSKybKCjjyV0RwL3LY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LNK45d5epMCOm2NdrD5AmfvckT/yygA9nwmWrgqZdPsDRJHLm5m9z8MdiA8kdBYZpVfnJ1w6JiTqy0nsr1B28YhAPA1ZTHKK4/oDoNRBWuL2H7bbOnHQcnJYPnySP/OWlCNiv+XHHocCo7zxxwxK13MDvT+WyNt3T70xUtTZyts= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=lkQ+eylf; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lkQ+eylf" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-494049206c6so2170615e9.2 for ; Sat, 18 Jul 2026 01:57:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784365067; x=1784969867; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=IVdUc4K/IhqrOMLTX+JPmZv/Y1bCw+s3TFSm96hNeQA=; b=lkQ+eylf3gvIeuR8jPylDgdmokCNv+5s2JjuZ4jedL43SYH704mJf7K9jBR6m4ES6n Wzoqqr30dvR7O9FiyVUilqVsJvHBPcvGgE4XodAEf0am4O1PNG3+SN7hmd1st/X1iQwv s+v+wWo3vVhtU1N2m3DDt/ytnCTx9tbicnkpZ3+pFljobJH0BDmhLvgZosI/2tD9gosK zq590yg19hJIKkzLt9uu/7pzyLB18arRtPWHkaOlFvefJBXpwMJvob5CD9kvm2USDMlx 2uD4fGQVeiG+ZMP6YaK8AsFtPcyjYfJDpuvowXqAXp3Cw/X6wWDvVDKxB+5LyjNuKs4s 8TZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784365068; x=1784969868; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=IVdUc4K/IhqrOMLTX+JPmZv/Y1bCw+s3TFSm96hNeQA=; b=ZUdg9n/2UpjxKxGQoN98+jUDKy3CGfWDMj5UA3cCN6VIC4eCwUD4i30yaqCfPhXfFJ +rORJT1SWcvq7n5x+S20ix2sL4V1eirTyFqh/Z7sRPXd28XBnJxgC0ZPqAqyOGQ5Cn/+ RB1Qf1eijZsO0g4Mhf7eIg3DYjKDK1X/yZCdREUL/QdhvA5dXDwzb0UOM/LPJ5C27w10 bBidBQm/QyoDokvivJCIBOzwPmEOGXmHlXqGUxNctjEprgbx/6I6gsvrW17s9Z6tY92e MTeuzEl5XrV/xB9jTWX7BTfQlZlhf91xa+89lb4U+FcUbmTkc5o0FBlSz/ZugLhPXxW0 o4Sw== X-Forwarded-Encrypted: i=1; AHgh+Ro2R/Dc9+WHMv9e1r9xup6KBzAScOgTX5wuHP2ufx5Ylb4kdOWO7gZ3gbX54MXhTD3WvcRuGXBQ1ekQ3Ic=@vger.kernel.org X-Gm-Message-State: AOJu0YxqsvicvWEhhFCy9HwgRUh2RU0ABPWkz403rUSfD+1jOWQV6BwY T7WM6rtWeVHpN1IpoARRpgMr5mcMrnUuBO3JikUJPo7LmAdGQByPCDJP X-Gm-Gg: AfdE7ck/HrIslgL7KUBJ6EriwgZMo+2W7FxlEoBLQ8gd1tJ6ctM1jfuurV9u6ialHJL 7U8NHJSFGC0AGnQm3M6oDcHsSFCwadvVHH/M81hIlXGhXLiUglCu0fg1Vk51cjbgezlT99lrEak aPFTGutS+ATB/Hm6kn4iGljDW+QHYf7gB8upq2vXrbVGfWj84VL1IdMhF4CMOHwb32uvwXwC1Uk bx6VXla4LdZob7gAlgkhWR4/nGFzk/9yjoeI0GEkO3um7v0D9DJElNi9h4UXVF7D//mHbEjKs+C e6ELSZOgZYrJynlV5kMICWJEuP1tPNXXCc/X6W4egnN/w4bAugT/9VFQ+0/2lLPePUPeJuNnK7/ dCGXXFTcn+Bi07UUS1kNbp5R4Itm3+ALf4sGv+ImMY95mNyPdmlLIw8E+eer/x9aMfe1723wfRW 2zFkbC56sf8iRUsQbS4CRS9TijGmH+2is6Z3C6atqVA3KszO5V5xNnTQ1kAXpx+Cf3IyAMmAfWk XDPUtn3AVVSOLxu+DgS X-Received: by 2002:a05:600c:350a:b0:493:f13a:3f74 with SMTP id 5b1f17b1804b1-4954a51df12mr39497985e9.5.1784365067516; Sat, 18 Jul 2026 01:57:47 -0700 (PDT) Received: from OrangePi5-Plus.BB-HOME (20014C4E1B8D1600206D23E70680CBAA.dsl.pool.telekom.hu. [2001:4c4e:1b8d:1600:206d:23e7:680:cbaa]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4954834edc3sm91477455e9.0.2026.07.18.01.57.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 18 Jul 2026 01:57:47 -0700 (PDT) From: Igor Paunovic To: Dmitry Osipenko , Mauro Carvalho Chehab Cc: Sebastian Reichel , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, kernel@collabora.com, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Igor Paunovic Subject: [PATCH v3 3/4] arm64: dts: rockchip: add #sound-dai-cells to the RK3588 HDMI receiver Date: Sat, 18 Jul 2026 10:57:27 +0200 Message-ID: <20260718085728.6797-4-royalnet026@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260718085728.6797-1-royalnet026@gmail.com> References: <20260718085728.6797-1-royalnet026@gmail.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 Content-Type: text/plain; charset="utf-8" The Synopsys HDMI RX controller exposes two digital audio interfaces, one for I2S (0) and one for S/PDIF (1). Add the #sound-dai-cells property so audio cards can reference them as a codec, as documented by the snps,dw-hdmi-rx binding. Signed-off-by: Igor Paunovic --- New in v3. arch/arm64/boot/dts/rockchip/rk3588-extra.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3588-extra.dtsi b/arch/arm64/bo= ot/dts/rockchip/rk3588-extra.dtsi index a264001..fa100e3 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-extra.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-extra.dtsi @@ -338,6 +338,7 @@ reset-names =3D "axi", "apb", "ref", "biu"; rockchip,grf =3D <&sys_grf>; rockchip,vo1-grf =3D <&vo1_grf>; + #sound-dai-cells =3D <1>; status =3D "disabled"; }; =20 --=20 2.53.0 From nobody Sat Jul 25 04:29:51 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A431C33F59E for ; Sat, 18 Jul 2026 08:57:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784365076; cv=none; b=rNhL9MuMbEsjklH4E/ESHmeHq3DF4jCeiYxXDnd6QKNv/r+4xJum+UhGxJQ47BdEGWKVIb/Tz53QWcorqtzMY+QPKgxBgnZeHpuOxK31gEVcnhgoQpxnzmnkPiOzuxOhJHAoWqH6PhVl81PgKFzWdl7VnyR8ZhhAjSsFfiDGUJE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784365076; c=relaxed/simple; bh=tizS5g0h70SzokJT7ulA6Z1Qe+e6ZmlUwrpJqQZsAiA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=X9WoX/dL2bZQUurUVwRgE7XZvMXv6VdxByK3E8J8mhSNbOYQc2G2hLv3OsUaSKHeExAEQLjMweGWggKTAb0vV3M757UJZdIoMCs/gQeq7ecaYg8vwZ6XLQ5h55M9NmdlVvQzqbGvqmslQxquD7K1PP8RaGRKXFGqlUhxYpOnbXQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bPGJMfXH; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bPGJMfXH" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-4953f64372aso4428515e9.0 for ; Sat, 18 Jul 2026 01:57:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784365069; x=1784969869; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=OkAddxCtIZjvbuQcdVYEMV492MXwwpyu35XKLgJr4rw=; b=bPGJMfXHeDy9xisKFzTaiYeCLN2keI7S37xUaolhVDOkoWTRr6ECxNncheVTfHSgc1 wVgxJJZ7cT5gqtMILcda/olZqOgu8dlq+NxcKb0p4XAxcKr2Aw6MKFUUdrsJHnGss8AF 8clSKjO92BWxMRXYCpugj0SEJhdHpUi9oMZ4MvBL+eDKxZmUXVwyO7WaM/sjfDzelj6j VOwAt+p2PB/a2rUGLzhF+sWaFaCR21yHcUitIU3mKAddJ/EORl+StzmHav93WcXF2RSe QJ5aml6SNjn+DpOk9WavoJtdvtA3zDWiqlU9svkZm5DVTRGzeYtCxLILZ5QIN4qhVvFR bjAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784365069; x=1784969869; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=OkAddxCtIZjvbuQcdVYEMV492MXwwpyu35XKLgJr4rw=; b=Xb45foBxnQB3chJx97zjio929s3HaAOd4WDNoVcDfTJ2zEqt0sz8ng/Orrk4a07yUF qkZzH/Yz0MAfRNIz29Isip/+mapm2TOyo8JbIHBQsFIl8x7qog/FFpsm03pCgBxYYPX7 sSg2y8t+W2ILwvKsG94RzoXihPRpKRElXRmmGdCGm9a4M5qgx9xTXfA7PICwojTV07Ie nmEidpRH6VrIyTXWf6bOmj42CElbnKV9W3kfwh/EVjUka+uBWoHbTDheJrcRHwpM7FVc TJKVT8BLtkUN2IhCg5PQfzeLtfj2SKwxZKZpzjONMFIBwbboZvGXYt5663/HTAY3BF47 ZNeg== X-Forwarded-Encrypted: i=1; AHgh+Rp5xUq9al6MeAhcwzcMIuRM5CI8LDu3VIWDKdXJ4MFJ3WUJrXeRKmMTsB+pHvYVmz3nr+83DFHLP+4aUII=@vger.kernel.org X-Gm-Message-State: AOJu0YxjmJ+Czeu3jjZmvqTeE3ZkuHrGAPMqmm6JDOp7BTfGWfXG83jQ uf27RyoCyaUIT4OkuKtpHlKKoQ/VUwkVWeS86eit/E/C4iTWXI3YaEyX X-Gm-Gg: AfdE7cnvdONIGYcnTPAbXsiW0P9MnpmKYZJYJOsNSDUfwsLZS3wD9RxtoTRkYDfSHBC pkPQQX0PDMmI3vZ42R2E4HZoZLVq0s79Z3/OQVpLwFnteH3yidM/qQG121wWEQNJ7Orh7MWnAoS oybxzfhcXSbSKWIJWVYwu5kuUdn4OihiGTsYskfc4UaECYH+PlczYQB4ooHCEJeO3Ctej6zi1zR oZlvCrCP6V9Vdm8zXER9mS0UM8LiKUuqpxUedodSECx2DGWeuCBwmhSB10YuIIzgY/OY9oHZThu /+NnZcH0VFdED1JSHlVPffGkTfiOqZRRsHUNsUNaPHD1SGv6x1g4J3NbLjZgtg+sY2uhST6k3JV WrdLygcX//V37/iLOEfrick2h+yaHJMVwUNLrYduptzcm0F3QzJgJcoXpFWHWubLTH5vI2KVNjg lZUDizbpKZgx/Pz+eibpaXBDOxjiSIIktzOIv+/BrJpMst/j5a1ruiiMzaAyE9wRWODGDQ85DPG YdGKIwVyA== X-Received: by 2002:a05:600c:3553:b0:495:4a33:2c34 with SMTP id 5b1f17b1804b1-4954a39955emr39555925e9.0.1784365068868; Sat, 18 Jul 2026 01:57:48 -0700 (PDT) Received: from OrangePi5-Plus.BB-HOME (20014C4E1B8D1600206D23E70680CBAA.dsl.pool.telekom.hu. [2001:4c4e:1b8d:1600:206d:23e7:680:cbaa]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4954834edc3sm91477455e9.0.2026.07.18.01.57.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 18 Jul 2026 01:57:48 -0700 (PDT) From: Igor Paunovic To: Dmitry Osipenko , Mauro Carvalho Chehab Cc: Sebastian Reichel , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, kernel@collabora.com, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Igor Paunovic Subject: [PATCH v3 4/4] arm64: dts: rockchip: enable HDMI RX audio capture on Orange Pi 5 Plus Date: Sat, 18 Jul 2026 10:57:28 +0200 Message-ID: <20260718085728.6797-5-royalnet026@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260718085728.6797-1-royalnet026@gmail.com> References: <20260718085728.6797-1-royalnet026@gmail.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 Content-Type: text/plain; charset="utf-8" Route the HDMI receiver audio to i2s7_8ch, the receive-only I2S interface dedicated to HDMI RX, through a simple-audio-card with the receiver as bitclock and frame master. Together with the audio capture support in the snps_hdmirx driver this exposes a capture-only ALSA card fed by the HDMI input. Tested on the Orange Pi 5 Plus with multiple HDMI sources: capture follows the source sample rate and stays in sync via the FIFO-level clock tracking in the driver. Signed-off-by: Igor Paunovic --- New in v3. .../dts/rockchip/rk3588-orangepi-5-plus.dts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts b/arch= /arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts index 9950d11..d5840e1 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts @@ -37,6 +37,22 @@ }; }; =20 + hdmiin-sound { + compatible =3D "simple-audio-card"; + simple-audio-card,name =3D "rockchip,hdmiin"; + simple-audio-card,format =3D "i2s"; + simple-audio-card,bitclock-master =3D <&hdmiin_codec>; + simple-audio-card,frame-master =3D <&hdmiin_codec>; + + simple-audio-card,cpu { + sound-dai =3D <&i2s7_8ch>; + }; + + hdmiin_codec: simple-audio-card,codec { + sound-dai =3D <&hdmi_receiver 0>; + }; + }; + ir-receiver { compatible =3D "gpio-ir-receiver"; gpios =3D <&gpio4 RK_PB3 GPIO_ACTIVE_LOW>; @@ -247,6 +263,10 @@ status =3D "okay"; }; =20 +&i2s7_8ch { + status =3D "okay"; +}; + &led_blue_gpio { gpios =3D <&gpio3 RK_PA6 GPIO_ACTIVE_HIGH>; status =3D "okay"; --=20 2.53.0