From nobody Sun Feb 8 05:37:15 2026 Received: from mail-wr1-f52.google.com (mail-wr1-f52.google.com [209.85.221.52]) (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 916EF2EBDD3 for ; Thu, 15 Jan 2026 19:18:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504689; cv=none; b=I9gIGTyLoQMPGyN9W+1nq3ZChy+XRsyNlGuL+O2IgPYiwsLJUKa0MAX2hZ0n7SIi1WA1spoTPqWSosjF4xcCgn9Ofew9M1Z5X5HKZbnSMBz8p0rLJxADW6Vj+ayRQKbbcEZ4nsW7ydkkkJkRVm6yqIC5cH6Eo/483y7FhsH7CXM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504689; c=relaxed/simple; bh=aL79ku9woK+lFHsaZx7h1/Un3D0nb/Y6kULQfvJwXrM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sD5+Qp/mG8MG0tKGAaaFHB6VJAh9dQTAs45RedDF8tw7oDoYu3YoZ4xc6iOmb6RKr0XcyfnCXvJJxVdWAjkDW774Qb0WrZZAgu1SSTeyuWmaorEkInrhIjq0bG1GialI8Wav0id/YQUIFUtLiJeJR/1vtkt+4B5Sm4cqGQyGC8s= 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=UNWEgG6Y; arc=none smtp.client-ip=209.85.221.52 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="UNWEgG6Y" Received: by mail-wr1-f52.google.com with SMTP id ffacd0b85a97d-42fb5810d39so1016108f8f.2 for ; Thu, 15 Jan 2026 11:18:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768504684; x=1769109484; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=DcLpMVd1uoMRkrBJra0Sqn/oCunudMeXpwg5cYzBxgE=; b=UNWEgG6YLZkn0VN41a9+BzcTnh6syc4sBGvOGeFaAQzflTjBUK4C0pdNGDqcfIEf0e 6CD46OvkkfR8Uk1meL1NbLmCIDf6DCV3qjuiZLvPoVPd3Lxpsaie7CsmYFn5rvqHdGvI YQxT1TKlCCITEROnQKZnnWhykIeCRo6D85Ies7UFqdMIYN/LD3lJ7fET4Mimiag44YLv 6ByxMiyiuUchEEgr1GNQ5CLw2+mfyGF9S0RdN+LU/GbQO3aHeRuIizyOuIbid5Y58PNF 9iOm3jO0QYetkjwBUNFH5/IXX614ZbNHaNGhnUQ8oltcOmzsaqetAUhf4gqzjOS6U1N9 GNxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768504684; x=1769109484; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=DcLpMVd1uoMRkrBJra0Sqn/oCunudMeXpwg5cYzBxgE=; b=ELHpfso7UqamMSh2X5FJlF40fghvK2IjVWbM9FbiNh7qwoNxVbK97+Slrz0xvseu+N gGesBePIUBGi67vPuoCU9TuqYMklapqKYj2cx5l2eZjD+1ajgzjQyXZeyz8+ZZnevq1R E4y2xEfXoc34Zk9K4Cv0WiWNkf/mXZMEaZu6BYFm1tFSmk6Z+W2iHdPPjyvvjOAoe4Jg BkE30vSbiAzDzPn5iQdT4qYeLvfJmQk2Z/kAKmVYcstU0ZElrw4VN2VWdLVM2XBgWAro 6qHCijFGnOcmYMbS3X2PzEuUVrPHgHTIdUb+2PnAOt3hRd7ojy7PougqWGuL52K2DZs5 lfcQ== X-Forwarded-Encrypted: i=1; AJvYcCUlE8mHh30ZgBNGIgZro41LGzaHXvPyn5dLMM7zJ/udfDRoaHd8ys7PMasNbtTajDOLWqIG3Hps2oSJBuU=@vger.kernel.org X-Gm-Message-State: AOJu0YyBTbGWag5kHKrwwCQUyy3pQRLHA13DqCG4zwuQGb6BhkNXYz07 I/QIaPzrt5K6rGHX9eC5EqNWzS2vc5uUSGuwiSRUUllXpB7MEYWYiQC8 X-Gm-Gg: AY/fxX5AX2JtCZc7pxzO1Yqx9z8SoAR5w8sXtcnB2ekfi9Eu/BMHy7tVxdyluMQ6nas +QV0wGdnqubpY0d6wV9DqXIsvjwNQHKoJ1hicx5wh1UR1CxSVFkhveBOv9nOAhfvWIfp0nWCAoi lvRdFUmk+MG3xpJIduDY2bMtJYBHb05VAGMdwBypYQPsKAsq20r9q9mOP303unfxSfD3i7TP1z6 vfqgO0teMrVvhXmODBK2/KNfNQ53onTb1QQtXvbloJlHSiIUYU3ZmiLoqDW1leJXSP+qes6Do0t 42umUi+hVuSrkO9FRLZQRKly2gcIQnOtxr/noEnpIO/hrN0i5323Tp0r7YYmK/IfQRt391/1ZO1 Eoza0OTFQ8xl/LRIiWMn/SWouRss9sjGEaZM9IHPukbm/boCG1PGTvOjE9YtlbXAjtZ1g/lfvaZ 6Ev6X1jvO227ssnIXo9Qy+CqoNHGbyR/IRW78Dn3VFYFiA X-Received: by 2002:a05:6000:2c01:b0:42b:2fb5:73c9 with SMTP id ffacd0b85a97d-4356a0662efmr421160f8f.58.1768504683920; Thu, 15 Jan 2026 11:18:03 -0800 (PST) Received: from [127.0.1.1] (bba-94-59-215-181.alshamil.net.ae. [94.59.215.181]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43569921dedsm692734f8f.9.2026.01.15.11.18.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Jan 2026 11:18:03 -0800 (PST) From: "Anton D. Stavinskii" Date: Thu, 15 Jan 2026 23:17:38 +0400 Subject: [PATCH 1/8] dt-bindings: sound: sophgo: add CV1800B I2S/TDM controller binding Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260115-cv1800b-i2s-driver-v1-1-e8b22b8578ab@gmail.com> References: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> In-Reply-To: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> To: Liam Girdwood , Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen Wang , Inochi Amaoto , Jaroslav Kysela , Takashi Iwai , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-sound@vger.kernel.org, devicetree@vger.kernel.org, sophgo@lists.linux.dev, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, "Anton D. Stavinskii" X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768504677; l=2155; i=stavinsky@gmail.com; s=20260115; h=from:subject:message-id; bh=aL79ku9woK+lFHsaZx7h1/Un3D0nb/Y6kULQfvJwXrM=; b=4AI//Dc4zB0LAW6t0lpzfgX5E/8bFJpEz7eva9PnikVe7DJg6MMIcs3jHP05P9nsmAecK/IYd loHA2q9vDIbDxJcS0fEHU3K9RMuF17S/aYb71J7Go359nwtOe2HnXK6 X-Developer-Key: i=stavinsky@gmail.com; a=ed25519; pk=2WxGZ1zd1vQwSPFCSks6zrADqUDBUdtq39lElk4ZE7Q= Purpose: introduce DT schema for the CPU driver Signed-off-by: Anton D. Stavinskii --- .../bindings/sound/sophgo,cv1800b-i2s.yaml | 75 ++++++++++++++++++= ++++ 1 file changed, 75 insertions(+) diff --git a/Documentation/devicetree/bindings/sound/sophgo,cv1800b-i2s.yam= l b/Documentation/devicetree/bindings/sound/sophgo,cv1800b-i2s.yaml new file mode 100644 index 000000000000..cf30880a62da --- /dev/null +++ b/Documentation/devicetree/bindings/sound/sophgo,cv1800b-i2s.yaml @@ -0,0 +1,75 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/sound/sophgo,cv1800b-i2s.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Sophgo CV1800B I2S/TDM controller + +maintainers: + - Anton D. Stavinskii + +description: | + I2S/TDM controller found in CV1800B / Sophgo SG2002/SG2000 SoCs. + +properties: + compatible: + const: sophgo,cv1800b-i2s + + reg: + maxItems: 1 + + "#sound-dai-cells": + const: 0 + + clocks: + minItems: 1 + maxItems: 2 + + clock-names: + items: + - const: i2s + - const: mclk + + dmas: + maxItems: 2 + + dma-names: + description: | + Names of DMA channels. May be omitted. If present, one entry + selects a single direction, while two entries select RX and TX. + minItems: 1 + maxItems: 2 + items: + enum: [rx, tx] + + "#address-cells": + const: 1 + + "#size-cells": + const: 0 + +required: + - compatible + - reg + - clocks + - clock-names + - "#sound-dai-cells" + +additionalProperties: false + +examples: + - | + #include + + i2s1: i2s@4110000 { + compatible =3D "sophgo,cv1800b-i2s"; + reg =3D <0x04110000 0x10000>; + #address-cells =3D <1>; + #size-cells =3D <0>; + clocks =3D <&clk CLK_APB_I2S1>, <&clk CLK_SDMA_AUD1>; + clock-names =3D "i2s", "mclk"; + dmas =3D <&dmamux 2 1>, <&dmamux 3 1>; + dma-names =3D "rx", "tx"; + }; +... --=20 2.43.0 From nobody Sun Feb 8 05:37:15 2026 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (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 342662ED846 for ; Thu, 15 Jan 2026 19:18:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504692; cv=none; b=W82eT7DQtrjHuFC0wSCYzR9Sedi6V1+O4PtAOv5N0wXX+gCdoKc1a9V4EZmDxCtnvfKfh+eENt/Frtp/9iQUte5X9Qd3+qwsveLh97ZZQzEdtzVtDY6Aq+YzLq+FGsSjchUZacVsP5JBBKbgCpwK2nEALBMDgb6nJdpUjGKljVI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504692; c=relaxed/simple; bh=U87qKfZ+a2BJ0cZEbw/LPacZcRExH/zpxyJ6JBlkiaU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=c43VJFW2lSDGtkZKx0MUHLaMLwHEFGMjue9Z7sLTU/+BkOOdqPlo/mQJ2g2bZw8wg+TdLVQI3pSwvA678ilwRUCUyIYPxu2tVOvTfQ79sMepfKdhixzzcV//XqhN2K/cj6j6Dsp3F0j6mXGMPrhDwx4BKeetHSU0oKh5vY1fGiM= 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=H3fT1vCA; arc=none smtp.client-ip=209.85.128.52 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="H3fT1vCA" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-47ee301a06aso11807425e9.0 for ; Thu, 15 Jan 2026 11:18:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768504687; x=1769109487; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=T1ynBQuWv4/1+RgpFKalLvGF7AqBFgPFTFi/g/rKhHQ=; b=H3fT1vCA1PfmyRfTy1MNMxQ3JTENwpzQIN8pBuQ51Yy/+iFQVMxReNLMkE4KqHhynm Tir8FgWkYbn6uhmEtYf8dv9WP9m9Sx4EvhFItk+sUz2M0YLYhGLMGjJDMqBBDW5nZBGC Nck3Nf0wvHG0DBlLWtjKaLUPgehwYzAzQWw975pbV6uoOj2P38nt35L5llm2oaNUpRo6 RWkK49XXVXySUg0zrp3Uq6wyqQYfbIqs7tluu3roV8F3kwud3vu1s2VQWGdXGIfxGtrI aFMFdBCO8N9Nb2e9OWvpF5/dMAoCRicAb+ELoBHJX2g1CNyg/DJzhcCxqsRF0yeuX7J+ Kh3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768504687; x=1769109487; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=T1ynBQuWv4/1+RgpFKalLvGF7AqBFgPFTFi/g/rKhHQ=; b=Ay5LhBIEX7YK+ZqRjB6A/ypeQbWRgyPz2ToyGsDOyNj7SShEwZ63kHz25PvanwxSap Muy0A91PKsKlwHrzlTbKGMEz+b+4HtPSc8DMjXkozvVrJbHqCqzweiXHHi74D5Q6Q7Nt Ur2+JBdc1bBZ8DVAC8I9O8MUrOJ5TNGoa7CInR3lG4Xh4JwqsTasXulQenJ0Y6h5a//1 lo3EPcdZSakpu3kb9FW8aGD6J8zCF9FnXtMJwFCc6DanJvZSp0CmY7hJSMm/cwO/Ebx9 BQJ9uE5gdGTdEsW9pHE7igEcpgm83KJPylTDeFO6rCRZCIupWcR0yRH49qdiuV8HkVfb lhvg== X-Forwarded-Encrypted: i=1; AJvYcCVt7rzndaBagXnaS0z3HrGwdEaSAxnoSkMJtE3O1AI3Pti1ALf43mDKJeix1Ui0VNy/SZX5h9viGjjhrHo=@vger.kernel.org X-Gm-Message-State: AOJu0YygocthqSztR1JJVN4+zyjCxFkrky+sDmd/acIi83ZtrsZc+vmd OMLTID/UthKwO9x3nngWYREj3ytCLUNhPhSW0nxQgBsjl5dkXWP5JTvD X-Gm-Gg: AY/fxX5gjbsLNTXyn2jt/0uDacYzO2ZZ4bMdhjuu3EDgG0IA4t9g1QNcnPZ53bNmxCC SUKtk9OYDI59yzacr6bqGI49MgmmWOBbv6uMITaZk+bKNl7kIs8itUPPQDiroMU+q+o943hKAsa nbtjFOKeiiksjv5L2eJ9L8h3UX2sK1TKLxrsPBFBEuGgKTB5xznU1Eo2GhfpPu9nQNKfR3Q5Q9o to7kg4Sea0DAU45GlD9OJj6bDkdK+noFZp0vAnKXANMcMYSTy/RIN6bMqZYTntZ7GbkunHXtYlX 1fWMu7/B+zJc1gVAEulpPvu8oTlfipJqfV89W5cjZvmP44goV4TXmw0LEF/tzvmD+wlhywBvjZf Yp7eIhfWNuKPs6kXnF3awoafX0ZVnyy70jr6rY2/ejnKZhoTeEc6RW6XmYwxRlfEIKsO74wxhnm H4BobSSN4fQYt/HWCkrBwRGQcp1ddU9BnIvzVgjWBdKKzUVvCOf/ry8Ho= X-Received: by 2002:a05:600c:34d6:b0:47d:3ead:7440 with SMTP id 5b1f17b1804b1-4801eb131b2mr3101085e9.32.1768504687290; Thu, 15 Jan 2026 11:18:07 -0800 (PST) Received: from [127.0.1.1] (bba-94-59-215-181.alshamil.net.ae. [94.59.215.181]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43569921dedsm692734f8f.9.2026.01.15.11.18.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Jan 2026 11:18:06 -0800 (PST) From: "Anton D. Stavinskii" Date: Thu, 15 Jan 2026 23:17:39 +0400 Subject: [PATCH 2/8] ASoC: sophgo: add CV1800B I2S/TDM controller driver Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260115-cv1800b-i2s-driver-v1-2-e8b22b8578ab@gmail.com> References: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> In-Reply-To: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> To: Liam Girdwood , Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen Wang , Inochi Amaoto , Jaroslav Kysela , Takashi Iwai , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-sound@vger.kernel.org, devicetree@vger.kernel.org, sophgo@lists.linux.dev, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, "Anton D. Stavinskii" X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768504677; l=24180; i=stavinsky@gmail.com; s=20260115; h=from:subject:message-id; bh=U87qKfZ+a2BJ0cZEbw/LPacZcRExH/zpxyJ6JBlkiaU=; b=eTCNg1xLNSE3zAMGpNuwOq3+EzAX0A17CiZnO26wEoD+oD7sJSvXP1VX3rJJaKYET1OcXwxOf /6Rd9Z2l4SGBqcO5kcgpgxH9e4/ocv+iX83xhbQ369QC45JlJVEKkE0 X-Developer-Key: i=stavinsky@gmail.com; a=ed25519; pk=2WxGZ1zd1vQwSPFCSks6zrADqUDBUdtq39lElk4ZE7Q= The actual CPU DAI controller. Signed-off-by: Anton D. Stavinskii --- sound/soc/Kconfig | 1 + sound/soc/Makefile | 1 + sound/soc/sophgo/Kconfig | 20 ++ sound/soc/sophgo/Makefile | 3 + sound/soc/sophgo/cv1800b-tdm.c | 714 +++++++++++++++++++++++++++++++++++++= ++++ 5 files changed, 739 insertions(+) diff --git a/sound/soc/Kconfig b/sound/soc/Kconfig index 36e0d443ba0e..edfdcbf734fe 100644 --- a/sound/soc/Kconfig +++ b/sound/soc/Kconfig @@ -127,6 +127,7 @@ source "sound/soc/renesas/Kconfig" source "sound/soc/rockchip/Kconfig" source "sound/soc/samsung/Kconfig" source "sound/soc/sdca/Kconfig" +source "sound/soc/sophgo/Kconfig" source "sound/soc/spacemit/Kconfig" source "sound/soc/spear/Kconfig" source "sound/soc/sprd/Kconfig" diff --git a/sound/soc/Makefile b/sound/soc/Makefile index 8c0480e6484e..21d8406767fc 100644 --- a/sound/soc/Makefile +++ b/sound/soc/Makefile @@ -70,6 +70,7 @@ obj-$(CONFIG_SND_SOC) +=3D rockchip/ obj-$(CONFIG_SND_SOC) +=3D samsung/ obj-$(CONFIG_SND_SOC) +=3D sdca/ obj-$(CONFIG_SND_SOC) +=3D sof/ +obj-$(CONFIG_SND_SOC) +=3D sophgo/ obj-$(CONFIG_SND_SOC) +=3D spacemit/ obj-$(CONFIG_SND_SOC) +=3D spear/ obj-$(CONFIG_SND_SOC) +=3D sprd/ diff --git a/sound/soc/sophgo/Kconfig b/sound/soc/sophgo/Kconfig new file mode 100644 index 000000000000..70f07d46c810 --- /dev/null +++ b/sound/soc/sophgo/Kconfig @@ -0,0 +1,20 @@ +menu "Sophgo" + depends on COMPILE_TEST || ARCH_SOPHGO + +config SND_SOC_CV1800B_TDM + tristate "Sophgo CV1800B I2S/TDM support" + depends on SND_SOC && OF + select SND_SOC_GENERIC_DMAENGINE_PCM + help + This option enables the I2S/TDM audio controller found in Sophgo + CV1800B / SG2002 SoCs. The controller supports standard I2S + audio modes for playback and capture. + + The driver integrates with the ASoC framework and uses the DMA + engine for audio data transfer. It is intended to be configured + via Device Tree along with simple-audio-card module. + + To compile the driver as a module, choose M here: the module will + be called cv1800b_tdm. + +endmenu diff --git a/sound/soc/sophgo/Makefile b/sound/soc/sophgo/Makefile new file mode 100644 index 000000000000..3f9f1d07227a --- /dev/null +++ b/sound/soc/sophgo/Makefile @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0 +# Sophgo Platform Support +obj-$(CONFIG_SND_SOC_CV1800B_TDM) +=3D cv1800b-tdm.o diff --git a/sound/soc/sophgo/cv1800b-tdm.c b/sound/soc/sophgo/cv1800b-tdm.c new file mode 100644 index 000000000000..5bd9236ef3b9 --- /dev/null +++ b/sound/soc/sophgo/cv1800b-tdm.c @@ -0,0 +1,714 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define TX_FIFO_SIZE (1024) +#define RX_FIFO_SIZE (1024) +#define TX_MAX_BURST (8) +#define RX_MAX_BURST (8) + +#define CV1800B_DEF_FREQ 24576000 +#define CV1800B_DEF_MCLK_FS_RATIO 256 + +/* tdm registers */ +#define CV1800B_BLK_MODE_SETTING 0x000 +#define CV1800B_FRAME_SETTING 0x004 +#define CV1800B_SLOT_SETTING1 0x008 +#define CV1800B_SLOT_SETTING2 0x00C +#define CV1800B_DATA_FORMAT 0x010 +#define CV1800B_BLK_CFG 0x014 +#define CV1800B_I2S_ENABLE 0x018 +#define CV1800B_I2S_RESET 0x01C +#define CV1800B_I2S_INT_EN 0x020 +#define CV1800B_I2S_INT 0x024 +#define CV1800B_FIFO_THRESHOLD 0x028 +#define CV1800B_LRCK_MASTER 0x02C /* special clock only mode */ +#define CV1800B_FIFO_RESET 0x030 +#define CV1800B_RX_STATUS 0x040 +#define CV1800B_TX_STATUS 0x048 +#define CV1800B_CLK_CTRL0 0x060 +#define CV1800B_CLK_CTRL1 0x064 +#define CV1800B_PCM_SYNTH 0x068 +#define CV1800B_RX_RD_PORT 0x080 +#define CV1800B_TX_WR_PORT 0x0C0 + +/* CV1800B_BLK_MODE_SETTING (0x000) */ +#define BLK_TX_MODE_MASK GENMASK(0, 0) +#define BLK_MASTER_MODE_MASK GENMASK(1, 1) +#define BLK_DMA_MODE_MASK GENMASK(7, 7) + +/* CV1800B_CLK_CTRL1 (0x064) */ +#define CLK_MCLK_DIV_MASK GENMASK(15, 0) +#define CLK_BCLK_DIV_MASK GENMASK(31, 16) + +/* CV1800B_CLK_CTRL0 (0x060) */ +#define CLK_AUD_CLK_SEL_MASK GENMASK(0, 0) +#define CLK_BCLK_OUT_CLK_FORCE_EN_MASK GENMASK(6, 6) +#define CLK_MCLK_OUT_EN_MASK GENMASK(7, 7) +#define CLK_AUD_EN_MASK GENMASK(8, 8) + +/* CV1800B_I2S_RESET (0x01C) */ +#define RST_I2S_RESET_RX_MASK GENMASK(0, 0) +#define RST_I2S_RESET_TX_MASK GENMASK(1, 1) + +/* CV1800B_FIFO_RESET (0x030) */ +#define FIFO_RX_RESET_MASK GENMASK(0, 0) +#define FIFO_TX_RESET_MASK GENMASK(16, 16) + +/* CV1800B_I2S_ENABLE (0x018) */ +#define I2S_ENABLE_MASK GENMASK(0, 0) + +/* CV1800B_BLK_CFG (0x014) */ +#define BLK_AUTO_DISABLE_WITH_CH_EN_MASK GENMASK(4, 4) +#define BLK_RX_BLK_CLK_FORCE_EN_MASK GENMASK(8, 8) +#define BLK_RX_FIFO_DMA_CLK_FORCE_EN_MASK GENMASK(9, 9) +#define BLK_TX_BLK_CLK_FORCE_EN_MASK GENMASK(16, 16) +#define BLK_TX_FIFO_DMA_CLK_FORCE_EN_MASK GENMASK(17, 17) + +/* CV1800B_FRAME_SETTING (0x004) */ +#define FRAME_LENGTH_MASK GENMASK(8, 0) +#define FS_ACTIVE_LENGTH_MASK GENMASK(23, 16) + +/* CV1800B_I2S_INT_EN (0x020) */ +#define INT_I2S_INT_EN_MASK GENMASK(8, 8) + +/* CV1800B_SLOT_SETTING2 (0x00C) */ +#define SLOT_EN_MASK GENMASK(15, 0) + +/* CV1800B_LRCK_MASTER (0x02C) */ +#define LRCK_MASTER_ENABLE_MASK GENMASK(0, 0) + +/* CV1800B_DATA_FORMAT (0x010) */ +#define DF_WORD_LENGTH_MASK GENMASK(2, 1) +#define DF_TX_SOURCE_LEFT_ALIGN_MASK GENMASK(6, 6) + +/* CV1800B_FIFO_THRESHOLD (0x028) */ +#define FIFO_RX_THRESHOLD_MASK GENMASK(4, 0) +#define FIFO_TX_THRESHOLD_MASK GENMASK(20, 16) +#define FIFO_TX_HIGH_THRESHOLD_MASK GENMASK(28, 24) + +/* CV1800B_SLOT_SETTING1 (0x008) */ +#define SLOT_NUM_MASK GENMASK(3, 0) +#define SLOT_SIZE_MASK GENMASK(13, 8) +#define DATA_SIZE_MASK GENMASK(20, 16) +#define FB_OFFSET_MASK GENMASK(28, 24) + +enum cv1800b_tdm_word_length { + CV1800B_WORD_LENGTH_8_BIT =3D 0, + CV1800B_WORD_LENGTH_16_BIT =3D 1, + CV1800B_WORD_LENGTH_32_BIT =3D 2, +}; + +struct cv1800b_i2s { + void __iomem *base; + struct clk *clk; + struct clk *sysclk; + struct device *dev; + struct snd_dmaengine_dai_dma_data playback_dma; + struct snd_dmaengine_dai_dma_data capture_dma; + u32 mclk_rate; + bool bclk_ratio_fixed; + u32 bclk_ratio; + +}; + +static void cv1800b_setup_dma_struct(struct cv1800b_i2s *i2s, + phys_addr_t phys_base) +{ + i2s->playback_dma.addr =3D phys_base + CV1800B_TX_WR_PORT; + i2s->playback_dma.addr_width =3D DMA_SLAVE_BUSWIDTH_4_BYTES; + i2s->playback_dma.fifo_size =3D TX_FIFO_SIZE; + i2s->playback_dma.maxburst =3D TX_MAX_BURST; + + i2s->capture_dma.addr =3D phys_base + CV1800B_RX_RD_PORT; + i2s->capture_dma.addr_width =3D DMA_SLAVE_BUSWIDTH_4_BYTES; + i2s->capture_dma.fifo_size =3D RX_FIFO_SIZE; + i2s->capture_dma.maxburst =3D RX_MAX_BURST; +} + +static const struct snd_dmaengine_pcm_config cv1800b_i2s_pcm_config =3D { + .prepare_slave_config =3D snd_dmaengine_pcm_prepare_slave_config, +}; + +static void cv1800b_reset_fifo(struct cv1800b_i2s *i2s) +{ + u32 val; + + val =3D readl(i2s->base + CV1800B_FIFO_RESET); + val =3D u32_replace_bits(val, 1, FIFO_RX_RESET_MASK); + val =3D u32_replace_bits(val, 1, FIFO_TX_RESET_MASK); + writel(val, i2s->base + CV1800B_FIFO_RESET); + + usleep_range(10, 20); + + val =3D readl(i2s->base + CV1800B_FIFO_RESET); + val =3D u32_replace_bits(val, 0, FIFO_RX_RESET_MASK); + val =3D u32_replace_bits(val, 0, FIFO_TX_RESET_MASK); + writel(val, i2s->base + CV1800B_FIFO_RESET); +} + +static void cv1800b_reset_i2s(struct cv1800b_i2s *i2s) +{ + u32 val; + + val =3D readl(i2s->base + CV1800B_I2S_RESET); + val =3D u32_replace_bits(val, 1, RST_I2S_RESET_RX_MASK); + val =3D u32_replace_bits(val, 1, RST_I2S_RESET_TX_MASK); + writel(val, i2s->base + CV1800B_I2S_RESET); + + usleep_range(10, 20); + + val =3D readl(i2s->base + CV1800B_I2S_RESET); + val =3D u32_replace_bits(val, 0, RST_I2S_RESET_RX_MASK); + val =3D u32_replace_bits(val, 0, RST_I2S_RESET_TX_MASK); + writel(val, i2s->base + CV1800B_I2S_RESET); +} + +static void cv1800b_set_mclk_div(struct cv1800b_i2s *i2s, u32 mclk_div) +{ + u32 val; + + val =3D readl(i2s->base + CV1800B_CLK_CTRL1); + val =3D u32_replace_bits(val, mclk_div, CLK_MCLK_DIV_MASK); + writel(val, i2s->base + CV1800B_CLK_CTRL1); + dev_dbg(i2s->dev, "mclk_div is set to %u\n", mclk_div); +} + +static void cv1800b_set_tx_mode(struct cv1800b_i2s *i2s, bool is_tx) +{ + u32 val; + + val =3D readl(i2s->base + CV1800B_BLK_MODE_SETTING); + val =3D u32_replace_bits(val, is_tx, BLK_TX_MODE_MASK); + writel(val, i2s->base + CV1800B_BLK_MODE_SETTING); + dev_dbg(i2s->dev, "tx_mode is set to %u\n", is_tx); +} + +static int cv1800b_set_bclk_div(struct cv1800b_i2s *i2s, u32 bclk_div) +{ + u32 val; + + if (bclk_div =3D=3D 0 || bclk_div > 0xFFFF) + return -EINVAL; + + val =3D readl(i2s->base + CV1800B_CLK_CTRL1); + val =3D u32_replace_bits(val, bclk_div, CLK_BCLK_DIV_MASK); + writel(val, i2s->base + CV1800B_CLK_CTRL1); + dev_dbg(i2s->dev, "bclk_div is set to %u\n", bclk_div); + return 0; +} + +/* set memory width of audio data , reg word_length */ +static int cv1800b_set_word_length(struct cv1800b_i2s *i2s, + unsigned int physical_width) +{ + u8 word_length_val; + u32 val; + + switch (physical_width) { + case 8: + word_length_val =3D CV1800B_WORD_LENGTH_8_BIT; + break; + case 16: + word_length_val =3D CV1800B_WORD_LENGTH_16_BIT; + break; + case 32: + word_length_val =3D CV1800B_WORD_LENGTH_32_BIT; + break; + default: + dev_dbg(i2s->dev, "can't set word_length field\n"); + return -EINVAL; + } + + val =3D readl(i2s->base + CV1800B_DATA_FORMAT); + val =3D u32_replace_bits(val, word_length_val, DF_WORD_LENGTH_MASK); + writel(val, i2s->base + CV1800B_DATA_FORMAT); + return 0; +} + +static void cv1800b_enable_clocks(struct cv1800b_i2s *i2s, bool enabled) +{ + u32 val; + + val =3D readl(i2s->base + CV1800B_CLK_CTRL0); + val =3D u32_replace_bits(val, enabled, CLK_AUD_EN_MASK); + writel(val, i2s->base + CV1800B_CLK_CTRL0); +} + +static int cv1800b_set_slot_settings(struct cv1800b_i2s *i2s, u32 slots, + u32 physical_width, u32 data_size) +{ + u32 slot_num; + u32 slot_size; + u32 frame_length; + u32 frame_active_length; + u32 val; + + if (!slots || !physical_width || !data_size) { + dev_err(i2s->dev, "frame or slot settings are not valid\n"); + return -EINVAL; + } + if (slots > 16 || physical_width > 64 || data_size > 32) { + dev_err(i2s->dev, "frame or slot settings are not valid\n"); + return -EINVAL; + } + + slot_num =3D slots - 1; + slot_size =3D physical_width - 1; + frame_length =3D (physical_width * slots) - 1; + frame_active_length =3D physical_width - 1; + + if (frame_length > 511 || frame_active_length > 255) { + dev_err(i2s->dev, "frame or slot settings are not valid\n"); + return -EINVAL; + } + + val =3D readl(i2s->base + CV1800B_SLOT_SETTING1); + val =3D u32_replace_bits(val, slot_size, SLOT_SIZE_MASK); + val =3D u32_replace_bits(val, data_size - 1, DATA_SIZE_MASK); + val =3D u32_replace_bits(val, slot_num, SLOT_NUM_MASK); + writel(val, i2s->base + CV1800B_SLOT_SETTING1); + + val =3D readl(i2s->base + CV1800B_FRAME_SETTING); + val =3D u32_replace_bits(val, frame_length, FRAME_LENGTH_MASK); + val =3D u32_replace_bits(val, frame_active_length, FS_ACTIVE_LENGTH_MASK); + writel(val, i2s->base + CV1800B_FRAME_SETTING); + + dev_dbg(i2s->dev, "slot settings num: %u width: %u\n", slots, physical_wi= dth); + return 0; +} + +/* + * calculate mclk_div. + * if requested value is bigger than optimal + * leave mclk_div as 1. cff clock is capable + * to handle it + */ +static int cv1800b_calc_mclk_div(unsigned int target_mclk, u32 *mclk_div) +{ + *mclk_div =3D 1; + + if (target_mclk =3D=3D 0) + return -EINVAL; + + /* optimal parent frequency is close to CV1800B_DEF_FREQ */ + if (target_mclk < CV1800B_DEF_FREQ) { + *mclk_div =3D DIV_ROUND_CLOSEST(CV1800B_DEF_FREQ, target_mclk); + if (!*mclk_div || *mclk_div > 0xFFFF) + return -EINVAL; + } + return 0; +} + +/* + * set CCF clock and divider for this clock + * mclk_clock =3D ccf_clock / mclk_div + */ +static int cv1800b_i2s_set_rate_for_mclk(struct cv1800b_i2s *i2s, + unsigned int target_mclk) +{ + u32 mclk_div =3D 1; + u64 tmp; + int ret; + unsigned long clk_rate; + unsigned long actual; + + ret =3D cv1800b_calc_mclk_div(target_mclk, &mclk_div); + if (ret) { + dev_dbg(i2s->dev, "can't calc mclk_div for freq %u\n", + target_mclk); + return ret; + } + + tmp =3D (u64)target_mclk * mclk_div; + if (tmp > ULONG_MAX) { + dev_err(i2s->dev, "clk_rate overflow: freq=3D%u div=3D%u\n", + target_mclk, mclk_div); + return -ERANGE; + } + + clk_rate =3D (unsigned long)tmp; + + cv1800b_enable_clocks(i2s, false); + + ret =3D clk_set_rate(i2s->sysclk, clk_rate); + if (ret) + return ret; + + actual =3D clk_get_rate(i2s->sysclk); + if (clk_rate !=3D actual) { + dev_err_ratelimited(i2s->dev, + "clk_set_rate failed %lu, actual is %lu\n", + clk_rate, actual); + } + + cv1800b_set_mclk_div(i2s, mclk_div); + cv1800b_enable_clocks(i2s, true); + + return 0; +} + +static int cv1800b_i2s_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct cv1800b_i2s *i2s =3D snd_soc_dai_get_drvdata(dai); + unsigned int rate =3D params_rate(params); + unsigned int channels =3D params_channels(params); + unsigned int physical_width =3D params_physical_width(params); + int data_width =3D params_width(params); + bool tx_mode =3D (substream->stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) ? 1= : 0; + int ret; + u32 bclk_div; + u32 bclk_ratio; + u32 mclk_rate; + u64 tmp; + + if (data_width < 0) + return data_width; + + if (!channels || !rate || !physical_width) + return -EINVAL; + + ret =3D cv1800b_set_slot_settings(i2s, channels, physical_width, data_wid= th); + if (ret) + return ret; + + if (i2s->mclk_rate) { + mclk_rate =3D i2s->mclk_rate; + } else { + dev_dbg(i2s->dev, "mclk is not set by machine driver\n"); + ret =3D cv1800b_i2s_set_rate_for_mclk(i2s, + rate * CV1800B_DEF_MCLK_FS_RATIO); + if (ret) + return ret; + mclk_rate =3D rate * CV1800B_DEF_MCLK_FS_RATIO; + } + + bclk_ratio =3D (i2s->bclk_ratio_fixed) ? i2s->bclk_ratio : + (physical_width * channels); + + tmp =3D (u64)rate * bclk_ratio; + if (!tmp) + return -EINVAL; + if (mclk_rate % tmp) + dev_warn(i2s->dev, "mclk rate is not aligned to bclk or rate\n"); + + bclk_div =3D DIV_ROUND_CLOSEST((u64)mclk_rate, tmp); + + ret =3D cv1800b_set_bclk_div(i2s, bclk_div); + if (ret) + return ret; + + ret =3D cv1800b_set_word_length(i2s, physical_width); + if (ret) + return ret; + + cv1800b_set_tx_mode(i2s, tx_mode); + + cv1800b_reset_fifo(i2s); + cv1800b_reset_i2s(i2s); + return 0; +} + +static int cv1800b_i2s_trigger(struct snd_pcm_substream *substream, int cm= d, + struct snd_soc_dai *dai) +{ + struct cv1800b_i2s *i2s =3D snd_soc_dai_get_drvdata(dai); + u32 val; + + val =3D readl(i2s->base + CV1800B_I2S_ENABLE); + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + val =3D u32_replace_bits(val, 1, I2S_ENABLE_MASK); + break; + + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + val =3D u32_replace_bits(val, 0, I2S_ENABLE_MASK); + break; + default: + return -EINVAL; + } + writel(val, i2s->base + CV1800B_I2S_ENABLE); + return 0; +} + +static int cv1800b_i2s_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_pcm_runtime *rtd =3D snd_soc_substream_to_rtd(substream); + struct cv1800b_i2s *i2s =3D snd_soc_dai_get_drvdata(dai); + struct snd_soc_dai_link *dai_link =3D rtd->dai_link; + + dev_dbg(i2s->dev, "%s: dai=3D%s substream=3D%d\n", __func__, dai->name, + substream->stream); + /** + * Ensure DMA is stopped before DAI + * shutdown (prevents DW AXI DMAC stop/busy on next open). + */ + dai_link->trigger_stop =3D SND_SOC_TRIGGER_ORDER_LDC; + return 0; +} + +static int cv1800b_i2s_dai_probe(struct snd_soc_dai *dai) +{ + struct cv1800b_i2s *i2s =3D snd_soc_dai_get_drvdata(dai); + + if (!i2s) { + dev_err(dai->dev, "no drvdata in DAI probe\n"); + return -ENODEV; + } + + snd_soc_dai_init_dma_data(dai, &i2s->playback_dma, &i2s->capture_dma); + return 0; +} + +static int cv1800b_i2s_dai_set_fmt(struct snd_soc_dai *dai, unsigned int f= mt) +{ + struct cv1800b_i2s *i2s =3D snd_soc_dai_get_drvdata(dai); + u32 val; + u32 master; + + /* only i2s format is supported */ + if ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) !=3D SND_SOC_DAIFMT_I2S) + return -EINVAL; + + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBP_CFP: + dev_dbg(i2s->dev, "set to master mode\n"); + master =3D 1; + break; + + case SND_SOC_DAIFMT_CBC_CFC: + dev_dbg(i2s->dev, "set to slave mode\n"); + master =3D 0; + break; + default: + return -EINVAL; + } + + val =3D readl(i2s->base + CV1800B_BLK_MODE_SETTING); + val =3D u32_replace_bits(val, master, BLK_MASTER_MODE_MASK); + writel(val, i2s->base + CV1800B_BLK_MODE_SETTING); + return 0; +} + +static int cv1800b_i2s_dai_set_bclk_ratio(struct snd_soc_dai *dai, + unsigned int ratio) +{ + struct cv1800b_i2s *i2s =3D snd_soc_dai_get_drvdata(dai); + + if (ratio =3D=3D 0) + return -EINVAL; + i2s->bclk_ratio =3D ratio; + i2s->bclk_ratio_fixed =3D true; + return 0; +} + +static int cv1800b_i2s_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, + unsigned int freq, int dir) +{ + struct cv1800b_i2s *i2s =3D snd_soc_dai_get_drvdata(dai); + int ret; + u32 val; + bool output_enable =3D (dir =3D=3D SND_SOC_CLOCK_OUT) ? true : false; + + dev_dbg(i2s->dev, "%s called with %u\n", __func__, freq); + ret =3D cv1800b_i2s_set_rate_for_mclk(i2s, freq); + if (ret) + return ret; + + val =3D readl(i2s->base + CV1800B_CLK_CTRL0); + val =3D u32_replace_bits(val, output_enable, CLK_MCLK_OUT_EN_MASK); + writel(val, i2s->base + CV1800B_CLK_CTRL0); + + i2s->mclk_rate =3D freq; + return 0; +} + +static const struct snd_soc_dai_ops cv1800b_i2s_dai_ops =3D { + .probe =3D cv1800b_i2s_dai_probe, + .startup =3D cv1800b_i2s_startup, + .hw_params =3D cv1800b_i2s_hw_params, + .trigger =3D cv1800b_i2s_trigger, + .set_fmt =3D cv1800b_i2s_dai_set_fmt, + .set_bclk_ratio =3D cv1800b_i2s_dai_set_bclk_ratio, + .set_sysclk =3D cv1800b_i2s_dai_set_sysclk, +}; + +static struct snd_soc_dai_driver cv1800b_i2s_dai_template =3D { + .name =3D "cv1800b-i2s", + .playback =3D { + .stream_name =3D "Playback", + .channels_min =3D 1, + .channels_max =3D 2, + .rates =3D SNDRV_PCM_RATE_8000_192000, + .formats =3D SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE, + }, + .capture =3D { + .stream_name =3D "Capture", + .channels_min =3D 1, + .channels_max =3D 2, + .rates =3D SNDRV_PCM_RATE_8000_192000, + .formats =3D SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE, + }, + .ops =3D &cv1800b_i2s_dai_ops, +}; + +static const struct snd_soc_component_driver cv1800b_i2s_component =3D { + .name =3D "cv1800b-i2s", +}; + +static void cv1800b_i2s_hw_disable(struct cv1800b_i2s *i2s) +{ + u32 val; + + val =3D readl(i2s->base + CV1800B_I2S_ENABLE); + val =3D u32_replace_bits(val, 0, I2S_ENABLE_MASK); + writel(val, i2s->base + CV1800B_I2S_ENABLE); + + val =3D readl(i2s->base + CV1800B_CLK_CTRL0); + val =3D u32_replace_bits(val, 0, CLK_AUD_EN_MASK); + val =3D u32_replace_bits(val, 0, CLK_MCLK_OUT_EN_MASK); + writel(val, i2s->base + CV1800B_CLK_CTRL0); + + val =3D readl(i2s->base + CV1800B_I2S_RESET); + val =3D u32_replace_bits(val, 1, RST_I2S_RESET_RX_MASK); + val =3D u32_replace_bits(val, 1, RST_I2S_RESET_TX_MASK); + writel(val, i2s->base + CV1800B_I2S_RESET); + + val =3D readl(i2s->base + CV1800B_FIFO_RESET); + val =3D u32_replace_bits(val, 1, FIFO_RX_RESET_MASK); + val =3D u32_replace_bits(val, 1, FIFO_TX_RESET_MASK); + writel(val, i2s->base + CV1800B_FIFO_RESET); +} + +static void cv1800b_i2s_setup_tdm(struct cv1800b_i2s *i2s) +{ + u32 val; + + val =3D readl(i2s->base + CV1800B_BLK_MODE_SETTING); + val =3D u32_replace_bits(val, 1, BLK_DMA_MODE_MASK); + writel(val, i2s->base + CV1800B_BLK_MODE_SETTING); + + val =3D readl(i2s->base + CV1800B_CLK_CTRL0); + val =3D u32_replace_bits(val, 0, CLK_AUD_CLK_SEL_MASK); + val =3D u32_replace_bits(val, 0, CLK_MCLK_OUT_EN_MASK); + val =3D u32_replace_bits(val, 0, CLK_AUD_EN_MASK); + writel(val, i2s->base + CV1800B_CLK_CTRL0); + + val =3D readl(i2s->base + CV1800B_FIFO_THRESHOLD); + val =3D u32_replace_bits(val, 4, FIFO_RX_THRESHOLD_MASK); + val =3D u32_replace_bits(val, 4, FIFO_TX_THRESHOLD_MASK); + val =3D u32_replace_bits(val, 4, FIFO_TX_HIGH_THRESHOLD_MASK); + writel(val, i2s->base + CV1800B_FIFO_THRESHOLD); + + val =3D readl(i2s->base + CV1800B_I2S_ENABLE); + val =3D u32_replace_bits(val, 0, I2S_ENABLE_MASK); + writel(val, i2s->base + CV1800B_I2S_ENABLE); +} + +static int cv1800b_i2s_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct cv1800b_i2s *i2s; + struct resource *res; + void __iomem *regs; + struct snd_soc_dai_driver *dai; + int ret; + + i2s =3D devm_kzalloc(dev, sizeof(*i2s), GFP_KERNEL); + if (!i2s) + return -ENOMEM; + + regs =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(regs)) + return PTR_ERR(regs); + i2s->dev =3D &pdev->dev; + i2s->base =3D regs; + + res =3D platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) + return -ENODEV; + cv1800b_setup_dma_struct(i2s, res->start); + + i2s->clk =3D devm_clk_get_enabled(dev, "i2s"); + if (IS_ERR(i2s->clk)) + return dev_err_probe(dev, PTR_ERR(i2s->clk), + "failed to get+enable i2s\n"); + i2s->sysclk =3D devm_clk_get_enabled(dev, "mclk"); + if (IS_ERR(i2s->sysclk)) + return dev_err_probe(dev, PTR_ERR(i2s->sysclk), + "failed to get+enable mclk\n"); + + platform_set_drvdata(pdev, i2s); + cv1800b_i2s_setup_tdm(i2s); + + dai =3D devm_kmemdup(dev, &cv1800b_i2s_dai_template, sizeof(*dai), + GFP_KERNEL); + if (!dai) + return -ENOMEM; + + ret =3D devm_snd_soc_register_component(dev, &cv1800b_i2s_component, dai, + 1); + if (ret) + return ret; + + ret =3D devm_snd_dmaengine_pcm_register(dev, &cv1800b_i2s_pcm_config, 0); + if (ret) { + dev_err(dev, "dmaengine_pcm_register failed: %d\n", ret); + return ret; + } + + dev_dbg(dev, "cv1800b I2S probed:\n"); + return 0; +} + +static void cv1800b_i2s_remove(struct platform_device *pdev) +{ + struct cv1800b_i2s *i2s =3D platform_get_drvdata(pdev); + + if (!i2s) + return; + cv1800b_i2s_hw_disable(i2s); +} + +static const struct of_device_id cv1800b_i2s_of_match[] =3D { + { .compatible =3D "sophgo,cv1800b-i2s" }, + { /* sentinel */ } +}; + +MODULE_DEVICE_TABLE(of, cv1800b_i2s_of_match); + +static struct platform_driver cv1800b_i2s_driver =3D { + .probe =3D cv1800b_i2s_probe, + .remove =3D cv1800b_i2s_remove, + .driver =3D { + .name =3D "cv1800b-i2s", + .of_match_table =3D cv1800b_i2s_of_match, + }, +}; +module_platform_driver(cv1800b_i2s_driver); + +MODULE_DESCRIPTION("Sophgo cv1800b I2S/TDM driver"); +MODULE_AUTHOR("Anton D. Stavinsky "); +MODULE_LICENSE("GPL"); --=20 2.43.0 From nobody Sun Feb 8 05:37:15 2026 Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.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 499F32F1FE9 for ; Thu, 15 Jan 2026 19:18:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504695; cv=none; b=T42vBB8pvmm5kJg8yg1OE/C79zxscGPJvrXY+Mt3UCyaP2GyNmURBRBOB1hCa1wOWn1f3oQQht3MyZFI//CL079KOgUJUSn4OowhuyXVAd/1DF+TxPWlV1cKj+6gjlM9K8NcEtCzX/ss2Pd20SJFEenDneCsGP3g+98JxwAgPKI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504695; c=relaxed/simple; bh=dLNnA22RKAohaAguDDfnNkXyaGGOSbGYv0h2Zz9YQM0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XGiZtQp0An133kYQ4Zg4GmwhW0BmjIhXL2uZQQxfFeuVIkwHH412wJB49FzU+704EfBtrCsN1QWaCyD3obAys3F9ImBHUp3mqW+XM4EeV449UVAgbDGQMHOLirgXUyLrc4jvz8sCY3IqSd8T8YAQHHUPtsxun8kglRBvzbLxKj0= 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=Rr/lS9LF; arc=none smtp.client-ip=209.85.221.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="Rr/lS9LF" Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-42fbad1fa90so1196830f8f.0 for ; Thu, 15 Jan 2026 11:18:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768504690; x=1769109490; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=2bohYG42KR5qp4xz2qlOBlGbhjbb9bQhbV9gX3/v3Mk=; b=Rr/lS9LFamyMrQMPL0m/iSjVGqAgVWbPmdV2fYUwih5n2KwY9qKp8XCi74eEO2Me3r C4pt3O18GWMt4aXk/Bb7mrL1FFiR2mES0zPpvuUqC9jTu2xdDBTNeHxUZc0CQhVwagvj t2Se2D4RNyNtDuD7l2jLcLbEsOm/FgWEcVMIUu4LQ/Bg5zvddmm26KcZeUtkfpMiMNUP /JEYSHfRPwc7NbQcy0RrOdzZbbuFu0cbXKSGhLW1C4oaJwzh7nzuNpyNZDzVLaXSCBC5 FwnvuSe+O8AGMx1e4FgiwOISPUCFqQBtIirkhE/7kTobUvv9gqrfsHwciQcglK0de14V U3qA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768504690; x=1769109490; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=2bohYG42KR5qp4xz2qlOBlGbhjbb9bQhbV9gX3/v3Mk=; b=OOAaJQlicqBs0m0Hr7aABh9AHeAun1wrg+8UeVfcVH0xeI1ekgYpYMdkZfZa27M6NM 4wr6icTv9TUF0dByRFsj1R5jZFDap5mDExz4bVLpE3QrkPI1cxJdkSbDZagWx4tgrn8t QW2GCzflz+tmFc1EGHIoPpdDE1JUR/oTknzL6+wDyLs2Br8dD2TNBI1nVAmbrvsPfFv5 WP5tsoCK6xJSXzwUtGpr2AhS7oCMkAmspeOCFAEBE7ND31umQqXs0J01+XkhvSU/Kghi F/bUPoshGCKheQbSHYMMMF7jSMdXc+H2EeW3WDUVV7QBtJNHDYQ6gTajQCOygcV1Umjp 7U0A== X-Forwarded-Encrypted: i=1; AJvYcCUpsbwETKVdVCe7qJxe1jNG8CmutIei+u6M0FaMj0HyIkppwC8UIIYBbsewgTFG3ac7qubSGHfo2ISlQ3w=@vger.kernel.org X-Gm-Message-State: AOJu0YyXWFOTCipBcfbXlB2x/kNmXkMYtFpW38JRUFRejHTP2MQdIs6S jYa0Jw0flaKfQ9lZp766DLFov1YxfQK3LdU0qdAkoNPdCqvCXyFxzrqb X-Gm-Gg: AY/fxX4OU66VQ1fbNq9H8d9C73CAGld2Jh9LCssmZ19/7Uqxa/nQyBgieyK+P8PqOF8 4cl9xVtZ4qQ08T2h2QHZqZEGObOWzEOl82t8GcPLqP9IIqcic5KmL72ruCg3hA0UYLBRn+0f3g3 Li/jIqJuMks1285reWIDP4efpEVsvMUZtXjlPZypIKBzcmAXwEjEB1HIis5CaKhsoNa8J7PNWAe uN32fRKAFIzkykOCM9hqjhaWf7hMuAw7cHtwY+CfXYOvOvXIlSsHGISaLjUPpuhQC7cvR0XJeDi OZq7Sr2Fi6CKTWBfkZpxwP7r4LtYDF2eGVk8C1kvLch1MWpAbcDIrmOuUtWm2T9PxlGQ65B7yQR 2QbYt6gj7KYp8AfvCiUeMuDI0ojQjYxIHk7WbWMq7TcVs/G6yO8dA/fscdSicsqiAYCqY9zEVj8 syClnj7BvyNDXbhJFetcnFhDsV53yEWsbx5MODhV3u5rp5 X-Received: by 2002:a05:6000:26c2:b0:430:f6bc:2f8b with SMTP id ffacd0b85a97d-43569bcf1b1mr533301f8f.45.1768504690389; Thu, 15 Jan 2026 11:18:10 -0800 (PST) Received: from [127.0.1.1] (bba-94-59-215-181.alshamil.net.ae. [94.59.215.181]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43569921dedsm692734f8f.9.2026.01.15.11.18.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Jan 2026 11:18:10 -0800 (PST) From: "Anton D. Stavinskii" Date: Thu, 15 Jan 2026 23:17:40 +0400 Subject: [PATCH 3/8] dt-bindings: sound: sophgo: add CV1800B internal ADC codec Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260115-cv1800b-i2s-driver-v1-3-e8b22b8578ab@gmail.com> References: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> In-Reply-To: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> To: Liam Girdwood , Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen Wang , Inochi Amaoto , Jaroslav Kysela , Takashi Iwai , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-sound@vger.kernel.org, devicetree@vger.kernel.org, sophgo@lists.linux.dev, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, "Anton D. Stavinskii" X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768504677; l=1630; i=stavinsky@gmail.com; s=20260115; h=from:subject:message-id; bh=dLNnA22RKAohaAguDDfnNkXyaGGOSbGYv0h2Zz9YQM0=; b=SQniyJ8r3rp4gJLKkMe/RuCjhYd1U6T6Xou1eZP38X8wwCyHO4bzGi5Ane4ARCg4LHldz4dOK Wzh/SCWOZwjCVC/3yMCdble9F+bcH7/0nBnSX9sk6GKlfWbbVy5qbyz X-Developer-Key: i=stavinsky@gmail.com; a=ed25519; pk=2WxGZ1zd1vQwSPFCSks6zrADqUDBUdtq39lElk4ZE7Q= Document the internal ADC audio codec integrated in the Sophgo CV1800B SoC. Signed-off-by: Anton D. Stavinskii --- .../bindings/sound/sophgo,cv1800b-sound-adc.yaml | 43 ++++++++++++++++++= ++++ 1 file changed, 43 insertions(+) diff --git a/Documentation/devicetree/bindings/sound/sophgo,cv1800b-sound-a= dc.yaml b/Documentation/devicetree/bindings/sound/sophgo,cv1800b-sound-adc.= yaml new file mode 100644 index 000000000000..339b60e317e8 --- /dev/null +++ b/Documentation/devicetree/bindings/sound/sophgo,cv1800b-sound-adc.yaml @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/sound/sophgo,cv1800b-sound-adc.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Sophgo CV1800B Internal ADC Codec + +maintainers: + - Anton D. Stavinskii + +description: | + Internal ADC audio codec integrated in the Sophgo CV1800B SoC. + The codec exposes a single DAI and is intended to be connected + to an I2S/TDM controller via an ASoC machine driver. + +properties: + compatible: + const: sophgo,cv1800b-sound-adc + + reg: + maxItems: 1 + description: + Base address and size of the ADC register block. + + "#sound-dai-cells": + const: 0 + +required: + - compatible + - reg + - "#sound-dai-cells" + +additionalProperties: false + +examples: + - | + audio-codec@300a100 { + compatible =3D "sophgo,cv1800b-sound-adc"; + reg =3D <0x0300a100 0x100>; + #sound-dai-cells =3D <0>; + }; +... --=20 2.43.0 From nobody Sun Feb 8 05:37:15 2026 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (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 7889C2F0C79 for ; Thu, 15 Jan 2026 19:18:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504697; cv=none; b=NSa2k2Wz2QdQK0FLDUEAOoJSQijDRigDIt5gW07jlYkfALEDGThNgY1jRLE/STG/qRzweEKIDKoU7yGi1dFv5OUYDjl7vNdgjmo8J8Fo73UgVwDDhm4RJpsljW/oi8/nmojyc2cvQmyzZERV8VcQZLboygwAiwPJAtUcFQ4GH6s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504697; c=relaxed/simple; bh=O8Ee174H7NMw+A7UBz4MjvSnSFHxy6XwQLYsDm3bEPY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OSowTTU51pDsgJusqxxvoOdrthu5sH1BHc38WoATx5oKpn4rCLZD11jk7cAf2fes0DPDr1dJIM9dMAsgxUSGvrS8oJ8I2krUCD3CX/oBEQyJIRbpiHOZRLI9h5ZVIlSKn/LVjKSkMkQSs+zdg09eY5igIDuQXHmhptsIR+EXgFI= 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=SBudINgo; arc=none smtp.client-ip=209.85.128.49 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="SBudINgo" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-47ee301a06aso11808095e9.0 for ; Thu, 15 Jan 2026 11:18:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768504694; x=1769109494; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=6L4awWQYPSXxWtWL95i1cF8McpiuA+MR52611qScECc=; b=SBudINgonj5clThsrLZFFIj1fruIneug0ubcOXkBCsZgasIFlesiG7Rb4/wHNHmLTe tIn62JQ7C0k1pIWAqGB4Ug6UfWv8AkizpykTGVpO/HnIDNG0Zx6eGhaO2kiFb/q+Cv3i vH3cTYXmilhjEs1BxySCzUoKeuS4vBt8ehD5BoCLSIeK2eZrQrQoG4mHqZp8ZMQQUxR7 f+sB555hMv+UfOM6b7JdBFIM+N/2fy+WgcApUwE/pjnuEvD/BYurnvS91uE19LoxsYaY ugFNK/gPG9Mai0sTR1jpm2qbJYmoD4xchP0TK5AVAp2vfQYtO8gCeA8I5Quo54Lkv5Re 3ZEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768504694; x=1769109494; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=6L4awWQYPSXxWtWL95i1cF8McpiuA+MR52611qScECc=; b=aWv9ZRahyPZZk+DLHg93EwC2Pq+lAKFbSckv2B0rjBzd6/UC5QMn3nGJlF5zIoHV3b zMxG/mBiGirv/Jk14Bv31PD9uzvYfL253kGZomsCZbjP151y3g/YhXgohby+G/P+awB3 RIbhIGxKXfa9tzdoKXdksHbHyA+Kvae4fMAYc0nxp3M8Q8DECP3JbaXKp0cB7FD/5TZq av1ZfSZIgyS1xze4r6J5rgSDkEJzTHJ5A0euOC0rJdhzmIjicsPcZBaJQ0VH3Xcuq7gb dgR16TXaWjcxeZ8imBwJW0LYsCs10vGAPLBve1HDGlMtqA7srmlR2bV0skhlKfTswgLZ g6RA== X-Forwarded-Encrypted: i=1; AJvYcCX38K6hUimFMY4W9Lo/9VXVJOx3PTYjAGY8ma/48Gu5GTK6RcRuWFLKbAlm4oRqa9vv2fw0xmhEnwQM1e4=@vger.kernel.org X-Gm-Message-State: AOJu0YyohY0YKSKzveD/ueu6zCcfWIrNER9O98AeDCD/lP7YOY6ZkceB OGztsg5B+HUdrGzpVf69n3maOevE07MekbA4JQlUNRBoAoTKYM0HJJDg X-Gm-Gg: AY/fxX4CkHwgm/rL0JEHl547mEPlT2QmUz2TLWOn0EaXrayM+qwqtnloD4TdXJFn+FT 3jvy5ztAcA3OpJIJhmNc+s+YC+lTxLhxo29H9PbVq8tfbRdNL0KA+E2EL9r6QREIkU3KCZC7ywo 6TJNazk69Q5pN4hObiufVk7Yi51G5pqJtBksBHVhqfDmEX3pQnyHrbdVMQgJNp6xI2BWrgTFO02 k0Ycl3AhcmQrBUBLqtS1mQRIs+qDQ3bgxQRHSte8xrpJ7Bs45UgFvp7FRO5oTFw1zlQ6TeKFZQP 5IAuhGz1t00zSsPVzk/R/pTUSocgfns4QW6sVyuUy+MajpRZPeaZFv7lNAYMGK/naF5NZki1vuF VLvb8rwxPWa/OSyitQd28I3akgOA8/kWuQZbSKLQbxjw5R1CRay3Gnn3gNl+COnEjQD1lQ0buh4 HdGzfo7NXc7cRF3Ru2TuzeQE7nqrwVCgrpPQdAg5Uqxtlv X-Received: by 2002:a05:600c:8b82:b0:480:1b65:b744 with SMTP id 5b1f17b1804b1-4801eb0e10emr2653565e9.28.1768504693621; Thu, 15 Jan 2026 11:18:13 -0800 (PST) Received: from [127.0.1.1] (bba-94-59-215-181.alshamil.net.ae. [94.59.215.181]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43569921dedsm692734f8f.9.2026.01.15.11.18.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Jan 2026 11:18:13 -0800 (PST) From: "Anton D. Stavinskii" Date: Thu, 15 Jan 2026 23:17:41 +0400 Subject: [PATCH 4/8] ASoC: sophgo: add CV1800B internal ADC codec driver Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260115-cv1800b-i2s-driver-v1-4-e8b22b8578ab@gmail.com> References: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> In-Reply-To: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> To: Liam Girdwood , Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen Wang , Inochi Amaoto , Jaroslav Kysela , Takashi Iwai , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-sound@vger.kernel.org, devicetree@vger.kernel.org, sophgo@lists.linux.dev, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, "Anton D. Stavinskii" X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768504677; l=11174; i=stavinsky@gmail.com; s=20260115; h=from:subject:message-id; bh=O8Ee174H7NMw+A7UBz4MjvSnSFHxy6XwQLYsDm3bEPY=; b=hoFLATBPC0khGo3tMKqeXk1X2hK+2LKrw1NTe+EXMQ12vRmdd3ig59loyfrk+9EOOlp87mZe8 L+Jt/S8kNMBCYUjc9jjGGumxzUuAtLyP/RRgBadSiuCOqG3Jch5TFH/ X-Developer-Key: i=stavinsky@gmail.com; a=ed25519; pk=2WxGZ1zd1vQwSPFCSks6zrADqUDBUdtq39lElk4ZE7Q= Codec DAI endpoint for RXADC + basic controls. THe codec have basic volume control. Which is imlemented by lookup table for simplicity. Signed-off-by: Anton D. Stavinskii --- sound/soc/sophgo/Kconfig | 12 ++ sound/soc/sophgo/Makefile | 1 + sound/soc/sophgo/cv1800b-sound-adc.c | 322 +++++++++++++++++++++++++++++++= ++++ 3 files changed, 335 insertions(+) diff --git a/sound/soc/sophgo/Kconfig b/sound/soc/sophgo/Kconfig index 70f07d46c810..813ab30d6da3 100644 --- a/sound/soc/sophgo/Kconfig +++ b/sound/soc/sophgo/Kconfig @@ -17,4 +17,16 @@ config SND_SOC_CV1800B_TDM To compile the driver as a module, choose M here: the module will be called cv1800b_tdm. =20 +config SND_SOC_CV1800B_ADC_CODEC + tristate "Sophgo CV1800B/SG2002 internal ADC codec" + depends on SND_SOC + help + This driver provides an ASoC codec DAI for capture and basic + control of the RXADC registers. + + Say Y or M to build support for the Sophgo CV1800B + internal analog ADC codec block (RXADC). + The module will be called cv1800b-sound-adc + + endmenu diff --git a/sound/soc/sophgo/Makefile b/sound/soc/sophgo/Makefile index 3f9f1d07227a..c654d6059cbd 100644 --- a/sound/soc/sophgo/Makefile +++ b/sound/soc/sophgo/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 # Sophgo Platform Support obj-$(CONFIG_SND_SOC_CV1800B_TDM) +=3D cv1800b-tdm.o +obj-$(CONFIG_SND_SOC_CV1800B_ADC_CODEC) +=3D cv1800b-sound-adc.o diff --git a/sound/soc/sophgo/cv1800b-sound-adc.c b/sound/soc/sophgo/cv1800= b-sound-adc.c new file mode 100644 index 000000000000..794030b713e9 --- /dev/null +++ b/sound/soc/sophgo/cv1800b-sound-adc.c @@ -0,0 +1,322 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Internal adc codec for cv1800b compatible SoC + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CV1800B_RXADC_WORD_LEN 16 +#define CV1800B_RXADC_CHANNELS 2 + +#define CV1800B_RXADC_CTRL0 0x00 +#define CV1800B_RXADCC_CTRL1 0x04 +#define CV1800B_RXADC_STATUS 0x08 +#define CV1800B_RXADC_CLK 0x0c +#define CV1800B_RXADC_ANA0 0x10 +#define CV1800B_RXADC_ANA1 0x14 +#define CV1800B_RXADC_ANA2 0x18 +#define CV1800B_RXADC_ANA3 0x1c +#define CV1800B_RXADC_ANA4 0x20 + +/* CV1800B_RXADC_CTRL0 */ +#define REG_RXADC_EN GENMASK(0, 0) +#define REG_I2S_TX_EN GENMASK(1, 1) + +/* CV1800B_RXADCC_CTRL1 */ +#define REG_RXADC_CIC_OPT GENMASK(1, 0) +#define REG_RXADC_IGR_INIT GENMASK(8, 8) + +/* CV1800B_RXADC_ANA0 */ +#define REG_GSTEPL_RXPGA GENMASK(12, 0) +#define REG_G6DBL_RXPGA GENMASK(13, 13) +#define REG_GAINL_RXADC GENMASK(15, 14) +#define REG_GSTEPR_RXPGA GENMASK(28, 16) +#define REG_G6DBR_RXPGA GENMASK(29, 29) +#define REG_GAINR_RXADC GENMASK(31, 30) +#define REG_COMB_LEFT_VOLUME GENMASK(15, 0) +#define REG_COMB_RIGHT_VOLUME GENMASK(31, 16) + +/* CV1800B_RXADC_ANA2 */ +#define REG_MUTEL_RXPGA GENMASK(0, 0) +#define REG_MUTER_RXPGA GENMASK(1, 1) + +/* CV1800B_RXADC_CLK */ +#define REG_RXADC_CLK_INV GENMASK(0, 0) +#define REG_RXADC_SCK_DIV GENMASK(15, 8) +#define REG_RXADC_DLYEN GENMASK(23, 16) + +enum decimation_values { + DECIMATION_64 =3D 0, + DECIMATION_128, + DECIMATION_256, + DECIMATION_512, +}; + +static const u32 cv1800b_gains[] =3D { + 0x0001, /* 0dB */ + 0x0002, /* 2dB */ + 0x0004, /* 4dB */ + 0x0008, /* 6dB */ + 0x0010, /* 8dB */ + 0x0020, /* 10dB */ + 0x0040, /* 12dB */ + 0x0080, /* 14dB */ + 0x0100, /* 16dB */ + 0x0200, /* 18dB */ + 0x0400, /* 20dB */ + 0x0800, /* 22dB */ + 0x1000, /* 24dB */ + 0x2400, /* 26dB */ + 0x2800, /* 28dB */ + 0x3000, /* 30dB */ + 0x6400, /* 32dB */ + 0x6800, /* 34dB */ + 0x7000, /* 36dB */ + 0xA400, /* 38dB */ + 0xA800, /* 40dB */ + 0xB000, /* 42dB */ + 0xE400, /* 44dB */ + 0xE800, /* 46dB */ + 0xF000, /* 48dB */ +}; + +struct cv1800b_priv { + void __iomem *regs; + struct device *dev; + unsigned int mclk_rate; +}; + +static int cv1800b_adc_setbclk_div(struct cv1800b_priv *priv, unsigned int= rate) +{ + u32 val; + u32 bclk_div; + u64 tmp; + + if (!priv->mclk_rate || !rate) + return -EINVAL; + + tmp =3D priv->mclk_rate; + tmp /=3D CV1800B_RXADC_WORD_LEN; + tmp /=3D CV1800B_RXADC_CHANNELS; + tmp /=3D rate; + tmp /=3D 2; + + if (!tmp) { + dev_err(priv->dev, "computed BCLK divider is zero\n"); + return -EINVAL; + } + + if (tmp > 256) { + dev_err(priv->dev, "BCLK divider %llu out of range\n", tmp); + return -EINVAL; + } + + bclk_div =3D tmp - 1; + val =3D readl(priv->regs + CV1800B_RXADC_CLK); + val =3D u32_replace_bits(val, bclk_div, REG_RXADC_SCK_DIV); + /* Vendor value for 48kHz, tested on SG2000/SG2002 */ + val =3D u32_replace_bits(val, 0x19, REG_RXADC_DLYEN); + writel(val, priv->regs + CV1800B_RXADC_CLK); + + return 0; +} + +static void cv1800b_adc_enable(struct cv1800b_priv *priv, bool enable) +{ + u32 val; + + val =3D readl(priv->regs + CV1800B_RXADC_CTRL0); + val =3D u32_replace_bits(val, enable, REG_RXADC_EN); + val =3D u32_replace_bits(val, enable, REG_I2S_TX_EN); + writel(val, priv->regs + CV1800B_RXADC_CTRL0); +} + +static unsigned int cv1800b_adc_calc_db(u32 ana0, bool right) +{ + u32 step_mask =3D right ? FIELD_GET(REG_GSTEPR_RXPGA, ana0) : + FIELD_GET(REG_GSTEPL_RXPGA, ana0); + u32 coarse =3D right ? FIELD_GET(REG_GAINR_RXADC, ana0) : + FIELD_GET(REG_GAINL_RXADC, ana0); + bool g6db =3D right ? FIELD_GET(REG_G6DBR_RXPGA, ana0) : + FIELD_GET(REG_G6DBL_RXPGA, ana0); + + u32 step =3D step_mask ? __ffs(step_mask) : 0; + + step =3D min(step, 12U); + coarse =3D min(coarse, 3U); + + return 2 * step + 6 * coarse + (g6db ? 6 : 0); +} + +static int cv1800b_adc_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct cv1800b_priv *priv =3D snd_soc_dai_get_drvdata(dai); + unsigned int rate =3D params_rate(params); + u32 val; + int ret; + + ret =3D cv1800b_adc_setbclk_div(priv, rate); + if (ret) { + dev_err(priv->dev, + "could not set rate, check DT node for fixed clock\n"); + return ret; + } + + /* init adc */ + val =3D readl(priv->regs + CV1800B_RXADCC_CTRL1); + val =3D u32_replace_bits(val, 1, REG_RXADC_IGR_INIT); + val =3D u32_replace_bits(val, DECIMATION_64, REG_RXADC_CIC_OPT); + writel(val, priv->regs + CV1800B_RXADCC_CTRL1); + return 0; +} + +static int cv1800b_adc_dai_trigger(struct snd_pcm_substream *substream, in= t cmd, + struct snd_soc_dai *dai) +{ + struct cv1800b_priv *priv =3D snd_soc_dai_get_drvdata(dai); + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + cv1800b_adc_enable(priv, true); + break; + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + cv1800b_adc_enable(priv, false); + break; + default: + return -EINVAL; + } + + return 0; +} + +static int cv1800b_adc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, + unsigned int freq, int dir) +{ + struct cv1800b_priv *priv =3D snd_soc_dai_get_drvdata(dai); + + priv->mclk_rate =3D freq; + dev_dbg(priv->dev, "mclk is set to %u\n", freq); + return 0; +} + +static const struct snd_soc_dai_ops cv1800b_adc_dai_ops =3D { + .hw_params =3D cv1800b_adc_hw_params, + .set_sysclk =3D cv1800b_adc_dai_set_sysclk, + .trigger =3D cv1800b_adc_dai_trigger, +}; + +static struct snd_soc_dai_driver cv1800b_adc_dai =3D { + .name =3D "adc-hifi", + .capture =3D { .stream_name =3D "ADC Capture", + .channels_min =3D 1, + .channels_max =3D 2, + .rates =3D SNDRV_PCM_RATE_48000, + .formats =3D SNDRV_PCM_FMTBIT_S16_LE }, + .ops =3D &cv1800b_adc_dai_ops, +}; + +static int cv1800b_adc_volume_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component =3D snd_kcontrol_chip(kcontrol); + struct cv1800b_priv *priv =3D snd_soc_component_get_drvdata(component); + u32 ana0 =3D readl(priv->regs + CV1800B_RXADC_ANA0); + + unsigned int left =3D cv1800b_adc_calc_db(ana0, false); + unsigned int right =3D cv1800b_adc_calc_db(ana0, true); + + ucontrol->value.integer.value[0] =3D min(left / 2, 24U); + ucontrol->value.integer.value[1] =3D min(right / 2, 24U); + return 0; +} + +static int cv1800b_adc_volume_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component =3D snd_kcontrol_chip(kcontrol); + struct cv1800b_priv *priv =3D snd_soc_component_get_drvdata(component); + + u32 v_left =3D clamp_t(u32, ucontrol->value.integer.value[0], 0, 24); + u32 v_right =3D clamp_t(u32, ucontrol->value.integer.value[1], 0, 24); + u32 val; + + val =3D readl(priv->regs + CV1800B_RXADC_ANA0); + val =3D u32_replace_bits(val, cv1800b_gains[v_left], + REG_COMB_LEFT_VOLUME); + val =3D u32_replace_bits(val, cv1800b_gains[v_right], + REG_COMB_RIGHT_VOLUME); + writel(val, priv->regs + CV1800B_RXADC_ANA0); + + return 0; +} + +static DECLARE_TLV_DB_SCALE(cv1800b_volume_tlv, 0, 200, 0); + +static const struct snd_kcontrol_new cv1800b_adc_controls[] =3D { + SOC_DOUBLE_EXT_TLV("Internal I2S Capture Volume", SND_SOC_NOPM, 0, 16, 24= , false, + cv1800b_adc_volume_get, cv1800b_adc_volume_set, + cv1800b_volume_tlv), +}; + +static const struct snd_soc_component_driver cv1800b_adc_component =3D { + .name =3D "cv1800b-adc-codec", + .controls =3D cv1800b_adc_controls, + .num_controls =3D ARRAY_SIZE(cv1800b_adc_controls), +}; + +static int cv1800b_adc_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct cv1800b_priv *priv; + + priv =3D devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->dev =3D dev; + priv->regs =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(priv->regs)) + return PTR_ERR(priv->regs); + + platform_set_drvdata(pdev, priv); + return devm_snd_soc_register_component(&pdev->dev, + &cv1800b_adc_component, + &cv1800b_adc_dai, 1); +} + +static const struct of_device_id cv1800b_adc_of_match[] =3D { + { .compatible =3D "sophgo,cv1800b-sound-adc" }, + { /* sentinel */ } +}; + +MODULE_DEVICE_TABLE(of, cv1800b_adc_of_match); + +static struct platform_driver cv1800b_adc_driver =3D { + .probe =3D cv1800b_adc_probe, + .driver =3D { + .name =3D "cv1800b-sound-adc", + .of_match_table =3D cv1800b_adc_of_match, + }, +}; + +module_platform_driver(cv1800b_adc_driver); + +MODULE_DESCRIPTION("ADC codec for CV1800B"); +MODULE_AUTHOR("Anton D. Stavinskii "); +MODULE_LICENSE("GPL"); --=20 2.43.0 From nobody Sun Feb 8 05:37:15 2026 Received: from mail-wr1-f53.google.com (mail-wr1-f53.google.com [209.85.221.53]) (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 A896E2F549F for ; Thu, 15 Jan 2026 19:18:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504700; cv=none; b=t7sGhvACJXVBZpNIbglSo/OzmrxYs6ALp3VeKCSGHBhnTA9vAFoytt5ZK74ywMJNId3zkw6oSvYN++7AkJuRmHZLR3CNgFwoCRjY6T5uxnNeiKxL4zWG3ZCsq6fJClxIBeb9zrO0jXXz47tvsWl4TE0AO0Sdo41mBWx/G4UATiE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504700; c=relaxed/simple; bh=DQtXugkjv8oX6MRmxxnR9guqKGpU+4+ND0DSGzuSelE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=f80btIS3WlG9ON8pBCCkFOgb6iWIQ3U9vFWHk06JqY891JWxbgLfQvBO8qctjmixxeduKH8kkedxXskCJLHjKQjJoDXO2CSGe6yIyyHmmmTmrCQao4/TTv6f4uzt5k9GEqJp65UQFSUFF4xshzXmHonNcNPzWynQkfZUR154iDs= 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=k/T5db//; arc=none smtp.client-ip=209.85.221.53 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="k/T5db//" Received: by mail-wr1-f53.google.com with SMTP id ffacd0b85a97d-42fbc305552so1047873f8f.0 for ; Thu, 15 Jan 2026 11:18:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768504697; x=1769109497; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=7WczvYa8CE5EVgqZyNZGoJ41lrxkL4ZBfyJ2rH7pD8I=; b=k/T5db//fsRafVYrLw98LfeF1HYdOJrjfha0dXJ3gJKwT0RmfSYQ6PTjxfxcwwap8H sFBbXgHu0R/Fw2IW/A132XN+AZC7cgQmcRwkTErj+8ZWdhhPvGIUbnMkRI/aDAtlWgSy dFn83gVI+3Eeqr0QvwN8OmUgkDeukW0oMmkj848xUM45zd+VpT0C49ECIsri/DwPdX0n KCY+yJuI/DXKmeA/icHcyNyxCwOK5dt5PZThGGnDziRo9HBLvnjPjsghjL9lcSVJKpFj kM4FPJs4iG8sxpTF8hW+qLuicP9QTwHeVTAnQodIcTD8W4LVzkvBN1D7PZxf1U8YXAGI 1y6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768504697; x=1769109497; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=7WczvYa8CE5EVgqZyNZGoJ41lrxkL4ZBfyJ2rH7pD8I=; b=TSEGzI8QV/6KcoLJCL6lr+QF+ai9lOyZpHTvGxKQeGXFpPcF/aUrz2AGgP0Iym/xNw FqAB5XfetfX2DiWJ+xww2PodRvD5Xr9xhGjUJqtL+E9KVL/9hyPwoJNAxwQo+KhOa/7S DzCSvc73cEDDPl62kcBvZ6Rz5aaUglquT3w9Y80oY+SelYqCsRw05yDi+0afWl5YB5Y8 gpco0R4KWLKZqh2Q8/9fqSl+IL2RBEo73Hwrj6UC8emulH1J/zeFaqnndQK+Uv1M2FGd KxS74+LcPeQ3I5dlXIOMBEt/zWI2L0ipyeDenFEnUsTuuZTjlGHeOWMhUv3750cfMM/e W/aQ== X-Forwarded-Encrypted: i=1; AJvYcCWWfVJ0/DzGxAe2GMiiCF0KHxQV64Nz3ep0OsbYCXyacqizgE3dFppVIDHiAADx7Rm4E/ZW7cCUD5c/mug=@vger.kernel.org X-Gm-Message-State: AOJu0Yx//NS7t97XFqm05MJzN/uXxQI4z3O+e32wmxrKJ8e0HadOxVnK lXqHSASocF5D9dSEiFhCGP5HWxDTJ6ra1XpPT+2+xEngyWsI6RPdXyVU X-Gm-Gg: AY/fxX7Wri4r9AcTfrEngV9a/il47MastjUUNBG5KMED8tiJq/G0FbvlUGjpB0Ttbrc l0EdoQdcglYLLZN93zkyuDXX0RMW5Tl9SEN2+SOofgNqCEyPvqaLdNWmA8uZtCE7sGbNXOauK1m cKuh8H4YvLAjuPpvNaCM/cjmS+0Dtpf2zeGjohhkY0AkQkxNKewM6LLjerUy5+l3JuYYwsBTqBt xYVjeJjmmGWaa0s/WNhSqoGj1EnsnWnIkOro2k7543I5i5xH/RbU5NQizb7LdQY5EWodff+1Y7B 9+0ANneAyP8BpM3VLoiLNOIe40dzhhAT3owkGn94AQgNc4wEUdxek1kM2GrBJtAkmbZGxgrk530 cbgZ6nnQUAJ7a+53Qe1QmH5k3T+rOCNU0MkTlVLYbH5z1UBVq3q6hhGOUmHx4tqabWaxHuXxpa6 8WeWNxa8gonZkSEtmGhdKWTvHFEXTaEl5SXyYOt5BMm5Ln X-Received: by 2002:a05:6000:310d:b0:430:ff0c:35f9 with SMTP id ffacd0b85a97d-4356a082e2dmr403974f8f.48.1768504696733; Thu, 15 Jan 2026 11:18:16 -0800 (PST) Received: from [127.0.1.1] (bba-94-59-215-181.alshamil.net.ae. [94.59.215.181]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43569921dedsm692734f8f.9.2026.01.15.11.18.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Jan 2026 11:18:16 -0800 (PST) From: "Anton D. Stavinskii" Date: Thu, 15 Jan 2026 23:17:42 +0400 Subject: [PATCH 5/8] dt-bindings: sound: sophgo: add CV1800B internal DAC codec Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260115-cv1800b-i2s-driver-v1-5-e8b22b8578ab@gmail.com> References: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> In-Reply-To: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> To: Liam Girdwood , Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen Wang , Inochi Amaoto , Jaroslav Kysela , Takashi Iwai , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-sound@vger.kernel.org, devicetree@vger.kernel.org, sophgo@lists.linux.dev, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, "Anton D. Stavinskii" X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768504677; l=1672; i=stavinsky@gmail.com; s=20260115; h=from:subject:message-id; bh=DQtXugkjv8oX6MRmxxnR9guqKGpU+4+ND0DSGzuSelE=; b=yM+zC4fx7IIosib9wWNkVnBDpFynlEiv6ynEXZvFjIYVeO78hrI1gJgz8ZSXSXR1lUTlJNP4a qleFH+mRy5KCKhR5BVRssDGDyFSa0R4d9EPyWyCc2OxMY1+wN1/pcIG X-Developer-Key: i=stavinsky@gmail.com; a=ed25519; pk=2WxGZ1zd1vQwSPFCSks6zrADqUDBUdtq39lElk4ZE7Q= Document the internal DAC audio codec integrated in the Sophgo CV1800B SoC. Signed-off-by: Anton D. Stavinskii --- .../bindings/sound/sophgo,cv1800b-sound-dac.yaml | 43 ++++++++++++++++++= ++++ 1 file changed, 43 insertions(+) diff --git a/Documentation/devicetree/bindings/sound/sophgo,cv1800b-sound-d= ac.yaml b/Documentation/devicetree/bindings/sound/sophgo,cv1800b-sound-dac.= yaml new file mode 100644 index 000000000000..2a35e38dc7f9 --- /dev/null +++ b/Documentation/devicetree/bindings/sound/sophgo,cv1800b-sound-dac.yaml @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/sound/sophgo,cv1800b-sound-dac.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Sophgo CV1800B internal DAC audio codec + +maintainers: + - Anton D. Stavinskii + +description: | + Internal DAC audio codec integrated in the Sophgo CV1800B SoC. + The codec exposes a single playback DAI and is intended to be connected = to an + I2S/TDM controller via an ASoC machine driver. + +properties: + compatible: + const: sophgo,cv1800b-sound-dac + + reg: + maxItems: 1 + description: | + Register base address and size of the internal DAC codec register bl= ock. + + "#sound-dai-cells": + const: 0 + +required: + - compatible + - reg + - "#sound-dai-cells" + +additionalProperties: false + +examples: + - | + audio-codec@300A000 { + compatible =3D "sophgo,cv1800b-sound-dac"; + #sound-dai-cells =3D <0>; + reg =3D <0x0300A000 0x100>; + }; +... --=20 2.43.0 From nobody Sun Feb 8 05:37:15 2026 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.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 A2BE92F1FDA for ; Thu, 15 Jan 2026 19:18:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504703; cv=none; b=mKDV0yVfuHMsv+jbiCPXrfPxxLFvt99sOP4KqyTcKK7cgAyy7vv1afg/+BvOEPC38Qcp/mGcrSBHXao3ppzCSrkt1M6cOzhnJblhbO4ZKH0zalIQLxXGoTS3JV0eHuXJ9oXVqOtJVuaw8PXOWLjzTtbJvnXvgkskTDTyzcBSY3E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504703; c=relaxed/simple; bh=KrPmfmoDlhB5aHZakfTJ0DcCmCsvnj5DBdRQf3ocXWI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JDk2yi5qFRuF01vVvCSuDrv28Bd2t83/j7hxrOr6OcLbB0z4s2vmwrYqO4wn9jCUhopqujElH8kRXI1TZuhf6CCLOXGi8aCHBKHrMgUH70SwwYTvjzmbcplusdVbARjAqw2QAi7dbeFW5xFRdWcDNTxGAsQbrhUS7kmO/vy0rPE= 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=Am+0aRXI; arc=none smtp.client-ip=209.85.221.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="Am+0aRXI" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-42fbad1fa90so1196953f8f.0 for ; Thu, 15 Jan 2026 11:18:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768504700; x=1769109500; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Xc1juLftWyA1wDHyb+/Z3FwNIJ+75ZFh3R/kOCHvlHU=; b=Am+0aRXIXIvR3eK7Q/296RVakUfTb6QBs7fYfbi9uCJqiecjkNQvfRX9/thYdtmbjJ qAzsr/NdVyezUkFqnnYcdITq0MLZc330Tlpo3McBTu/pTVMyxiKeR1BOT9+zw8OjxiMn +tWia+Up/Hs541g6BeIwapOxLDbkVZc0iXAGFEgF4svBAiEZJ8/EGjMyj7voDnryFkPY xN7RB043NsA45mMnSxR7ct1KBe0Qt9HBJPFrcn4ZwEOPvsMSTfA9AQMxmgQrjNwlbrEu j0Hwf5/P/YVUzuvO02mGvNKwVyFwOx0F2Gmt+31QNxX/E3u/rZpYF0YHGBOgEnNAJWpM O9+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768504700; x=1769109500; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Xc1juLftWyA1wDHyb+/Z3FwNIJ+75ZFh3R/kOCHvlHU=; b=so8qyM849Qs9SnPg9HzwP6E+HmP0iFrCRggJ9AYknoKCk4DKh3UqrFHBqpKBIjlVY8 IIDwLkxT5bdy9fC+Romm5hn49szeENLyMlvhqNJkUY6KZh/Lk2QzQ0+mjWilYPldPXOu cuZUqYULahf5KC9IMFO7zwBHw1W0F/cE8W8v9kMlB91ubXjt/KHR9KXSaTdsmV/TVhBK U9usT8K6iHnYOQbZEVKfq9yWveYrRDyG3AEX1Cns8ksnH2eJRtLcxt73frjwzdy3nfGT IoV7bkxehuAqQqFjJ4cLeys60KlKbIt1B+B/bMTT/AZmFY01mGkNpgvsjbDOfTn64zD8 ICrA== X-Forwarded-Encrypted: i=1; AJvYcCWldg6zhkduaMMicL+f6M10EYkHKOxnfFSLwDXXANXjBGIxdDNddUehRhOJQ98EaFYxhmMSp3fK6AH1J7g=@vger.kernel.org X-Gm-Message-State: AOJu0Yxyz70d6LNsUDCOuIoYfZv13dCwnTjrQ3qO1izyYkUzhThfiiD4 8Rpo6tJrKlxeAKDo4ZbLT22e6MA2UZ0dy15gWUJYL5RN0Rngq1U/JSvZ X-Gm-Gg: AY/fxX58/ruLkUQca5MnTtzZAxJk0qXr+vJEguJ7GBxFgc3mR4YLuwLbEpO0laztMzT LYMfF2Lkf/xTVK/M5tkgqJUiRmsqB8YPr+1PH8Y0XswealZMxtuU7ZPDpu0+N+TUscfQrq04C76 PA8UNdy98EgDctkl+nv8ASCfc04vB3XKGzD2crFlUiGTv+hKYCfwnLktKs+gRGbzf1D/Z8V9jlm B4Ex93WuCVpBXkqjsYrV8/4qa9umWI2rpLh2MAyAZAYpyJqyvcca3n5+xnlXCeJXZQmb4sKEKZ4 3BcDY8Mr1PzJvR8X4RutA2Ir7squQA9U+KWZuLRjuFXfV9VAqS57a0Q7eFTnfpqosxiF6qIVUIB rVT8Dvnylmf/+tw2xEKVOoTlBHO2ikG/j9uJKBn3gc2D+ZxK7vRIPpFg4Ydh9y9l/KJ+v63puVF 7+lLi8qcDG55ZjdU4yLMamVHQtNJopyKc9GZZ76PPZa/anCmZ4t+oeaqo= X-Received: by 2002:a05:6000:4383:b0:431:9dd:2cca with SMTP id ffacd0b85a97d-4356997f0c2mr532115f8f.7.1768504699943; Thu, 15 Jan 2026 11:18:19 -0800 (PST) Received: from [127.0.1.1] (bba-94-59-215-181.alshamil.net.ae. [94.59.215.181]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43569921dedsm692734f8f.9.2026.01.15.11.18.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Jan 2026 11:18:19 -0800 (PST) From: "Anton D. Stavinskii" Date: Thu, 15 Jan 2026 23:17:43 +0400 Subject: [PATCH 6/8] ASoC: sophgo: add CV1800B internal DAC codec driver Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260115-cv1800b-i2s-driver-v1-6-e8b22b8578ab@gmail.com> References: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> In-Reply-To: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> To: Liam Girdwood , Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen Wang , Inochi Amaoto , Jaroslav Kysela , Takashi Iwai , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-sound@vger.kernel.org, devicetree@vger.kernel.org, sophgo@lists.linux.dev, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, "Anton D. Stavinskii" X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768504677; l=7294; i=stavinsky@gmail.com; s=20260115; h=from:subject:message-id; bh=KrPmfmoDlhB5aHZakfTJ0DcCmCsvnj5DBdRQf3ocXWI=; b=4iVlJNPj0IUBoHXVhipUHhAxzzbmClMq/SoiDq3Kf5XuqRc/D9PKwiTGGrS3BrHRfQoKSjKT8 HMjs7tQ0MBlCjw0HAcwo6edhkYtDhD1Quk2VjVYpIA0XHaza4Tzeetw X-Developer-Key: i=stavinsky@gmail.com; a=ed25519; pk=2WxGZ1zd1vQwSPFCSks6zrADqUDBUdtq39lElk4ZE7Q= Codec DAI endpoint for TXDAC + basic controls. Signed-off-by: Anton D. Stavinskii --- sound/soc/sophgo/Kconfig | 11 +- sound/soc/sophgo/Makefile | 1 + sound/soc/sophgo/cv1800b-sound-dac.c | 204 +++++++++++++++++++++++++++++++= ++++ 3 files changed, 215 insertions(+), 1 deletion(-) diff --git a/sound/soc/sophgo/Kconfig b/sound/soc/sophgo/Kconfig index 813ab30d6da3..e7c617b44db6 100644 --- a/sound/soc/sophgo/Kconfig +++ b/sound/soc/sophgo/Kconfig @@ -23,10 +23,19 @@ config SND_SOC_CV1800B_ADC_CODEC help This driver provides an ASoC codec DAI for capture and basic control of the RXADC registers. - Say Y or M to build support for the Sophgo CV1800B internal analog ADC codec block (RXADC). The module will be called cv1800b-sound-adc =20 +config SND_SOC_CV1800B_DAC_CODEC + tristate "Sophgo CV1800B/SG2002 internal DAC codec" + depends on SND_SOC + help + This driver provides an ASoC codec DAI for playback and basic + control of the TXDAC registers. + + Say Y or M to build support for the Sophgo CV1800B + internal analog DAC codec block (TXDAC). + The module will be called cv1800b-sound-dac =20 endmenu diff --git a/sound/soc/sophgo/Makefile b/sound/soc/sophgo/Makefile index c654d6059cbd..ec8dd31efddd 100644 --- a/sound/soc/sophgo/Makefile +++ b/sound/soc/sophgo/Makefile @@ -2,3 +2,4 @@ # Sophgo Platform Support obj-$(CONFIG_SND_SOC_CV1800B_TDM) +=3D cv1800b-tdm.o obj-$(CONFIG_SND_SOC_CV1800B_ADC_CODEC) +=3D cv1800b-sound-adc.o +obj-$(CONFIG_SND_SOC_CV1800B_DAC_CODEC) +=3D cv1800b-sound-dac.o diff --git a/sound/soc/sophgo/cv1800b-sound-dac.c b/sound/soc/sophgo/cv1800= b-sound-dac.c new file mode 100644 index 000000000000..ccf386174639 --- /dev/null +++ b/sound/soc/sophgo/cv1800b-sound-dac.c @@ -0,0 +1,204 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Internal DAC codec for cv1800b based CPUs + */ + +#include +#include +#include +#include +#include +#include + +#define CV1800B_TXDAC_CTRL0 0x00 +#define CV1800B_TXDAC_CTRL1 0x04 +#define CV1800B_TXDAC_STATUS 0x08 +#define CV1800B_TXDAC_AFE0 0x0c +#define CV1800B_TXDAC_AFE1 0x10 +#define CV1800B_TXDAC_ANA0 0x20 +#define CV1800B_TXDAC_ANA1 0x24 +#define CV1800B_TXDAC_ANA2 0x28 + +/* cv1800b_TXDAC_CTRL0 */ +#define REG_TXDAC_EN GENMASK(0, 0) +#define REG_I2S_RX_EN GENMASK(1, 1) + +/* cv1800b_TXDAC_CTRL1 */ +#define REG_TXDAC_CIC_OPT GENMASK(1, 0) + +/* cv1800b_TXDAC_AFE0 */ +#define REG_TXDAC_INIT_DLY_CNT GENMASK(5, 0) + +/* cv1800b_TXDAC_ANA2 */ +#define TXDAC_OW_VAL_L_MASK GENMASK(7, 0) +#define TXDAC_OW_VAL_R_MASK GENMASK(15, 8) +#define TXDAC_OW_EN_L_MASK GENMASK(16, 16) +#define TXDAC_OW_EN_R_MASK GENMASK(17, 17) + +struct cv1800b_priv { + void __iomem *regs; + struct device *dev; +}; + +enum decimation_values { + DECIMATION_64 =3D 0, + DECIMATION_128, + DECIMATION_256, + DECIMATION_512, +}; + +static void cv1800b_dac_enable(struct cv1800b_priv *priv, bool enable) +{ + u32 val; + + val =3D readl(priv->regs + CV1800B_TXDAC_CTRL0); + val =3D u32_replace_bits(val, enable, REG_TXDAC_EN); + val =3D u32_replace_bits(val, enable, REG_I2S_RX_EN); + writel(val, priv->regs + CV1800B_TXDAC_CTRL0); +} + +static void cv1800b_dac_mute(struct cv1800b_priv *priv, bool enable) +{ + u32 val; + + val =3D readl(priv->regs + CV1800B_TXDAC_ANA2); + val =3D u32_replace_bits(val, enable, TXDAC_OW_EN_L_MASK); + val =3D u32_replace_bits(val, enable, TXDAC_OW_EN_R_MASK); + writel(val, priv->regs + CV1800B_TXDAC_ANA2); +} + +static int cv1800b_dac_decimation(struct cv1800b_priv *priv, u8 dec) +{ + u32 val; + + if (dec > 3) + return -EINVAL; + + val =3D readl(priv->regs + CV1800B_TXDAC_CTRL1); + val =3D u32_replace_bits(val, dec, REG_TXDAC_CIC_OPT); + writel(val, priv->regs + CV1800B_TXDAC_CTRL1); + return 0; +} + +static int cv1800b_dac_dly(struct cv1800b_priv *priv, u32 dly) +{ + u32 val; + + if (dly > 63) + return -EINVAL; + + val =3D readl(priv->regs + CV1800B_TXDAC_AFE0); + val =3D u32_replace_bits(val, dly, REG_TXDAC_INIT_DLY_CNT); + writel(val, priv->regs + CV1800B_TXDAC_AFE0); + return 0; +} + +static int cv1800b_dac_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct cv1800b_priv *priv =3D snd_soc_dai_get_drvdata(dai); + int ret; + unsigned int rate =3D params_rate(params); + + if (rate !=3D 48000) { + dev_err(priv->dev, "rate %u is not supported\n", rate); + return -EINVAL; + } + + cv1800b_dac_mute(priv, false); + /* minimal decimation for 48kHz is 64*/ + ret =3D cv1800b_dac_decimation(priv, DECIMATION_64); + if (ret) + return ret; + + /* value is taken from vendors driver 48kHz + * tested on sg2000 and sg2002. + */ + ret =3D cv1800b_dac_dly(priv, 0x19); + if (ret) + return ret; + + return 0; +} + +static int cv1800b_dac_dai_trigger(struct snd_pcm_substream *substream, in= t cmd, + struct snd_soc_dai *dai) +{ + struct cv1800b_priv *priv =3D snd_soc_dai_get_drvdata(dai); + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + cv1800b_dac_enable(priv, true); + break; + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + cv1800b_dac_enable(priv, false); + break; + default: + return -EINVAL; + } + + return 0; +} + +static const struct snd_soc_dai_ops cv1800b_dac_dai_ops =3D { + .hw_params =3D cv1800b_dac_hw_params, + .trigger =3D cv1800b_dac_dai_trigger, +}; + +static struct snd_soc_dai_driver cv1800b_dac_dai =3D { + .name =3D "dac-hifi", + .playback =3D { .stream_name =3D "DAC Playback", + .channels_min =3D 2, + .channels_max =3D 2, + .rates =3D SNDRV_PCM_RATE_48000, + .formats =3D SNDRV_PCM_FMTBIT_S16_LE }, + .ops =3D &cv1800b_dac_dai_ops, +}; + +static const struct snd_soc_component_driver cv1800b_dac_component =3D { + .name =3D "cv1800b-dac-codec", +}; + +static int cv1800b_dac_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct cv1800b_priv *priv; + + priv =3D devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->dev =3D dev; + priv->regs =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(priv->regs)) + return PTR_ERR(priv->regs); + + platform_set_drvdata(pdev, priv); + return devm_snd_soc_register_component(&pdev->dev, + &cv1800b_dac_component, + &cv1800b_dac_dai, 1); +} + +static const struct of_device_id cv1800b_dac_of_match[] =3D { + { .compatible =3D "sophgo,cv1800b-sound-dac" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, cv1800b_dac_of_match); + +static struct platform_driver cv1800b_dac_driver =3D { + .probe =3D cv1800b_dac_probe, + .driver =3D { + .name =3D "cv1800b-dac-codec", + .of_match_table =3D cv1800b_dac_of_match, + }, +}; +module_platform_driver(cv1800b_dac_driver); + +MODULE_DESCRIPTION("DAC codec for CV1800B"); +MODULE_AUTHOR("Anton D. Stavinskii "); +MODULE_LICENSE("GPL"); --=20 2.43.0 From nobody Sun Feb 8 05:37:15 2026 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (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 B680E2FCBF0 for ; Thu, 15 Jan 2026 19:18:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504707; cv=none; b=bmD5uP/Scx1fDOREMzaRfGJysQQnTYB3S7w1JxC7jiS3UfjDRyZdTIJgmaNHYZG2If8ND5Jdp3F9fU3QoChh/uWFYWKtLUhr9q10n7mdFMNBIKayJ74BQCWj5Z6zHLBbJrTjONAmkeMRUwjf38pmqWZJHorV3j77EC0ADyqtxl4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504707; c=relaxed/simple; bh=ZvpnRa7g8hCkE7r1q64LPBBaiWff0x2lLnMd+0VKnb0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=b4/111uf3/Z4P+XNaPVF3yTJmxrrx8Xjj3XMXHOqkYJfYMRfaREfRWyP2Mu9eujmsxjAttTGdN5tN1UJP9iPWx4/nZ5LqGOL6fYe97Vd1KZdJyPwzSVpjVTh7yu8NCCenMlkq+1IUYsI+LboS4BZ4iNl/L8UkuyeP84nOlOHKJo= 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=ZwCJdi7A; arc=none smtp.client-ip=209.85.128.51 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="ZwCJdi7A" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-47ee3a63300so12796355e9.2 for ; Thu, 15 Jan 2026 11:18:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768504703; x=1769109503; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=9bZybh6ajNmTP3emcxjHSZEZGR4b5MsX3LqH44SKh2E=; b=ZwCJdi7ApXOmT/0pOHuGsR4hf9tODJBPxzqRxrs0tSBoCawEjWPllrBLoGwVOHGe3Y AUw+UQISBOKR2PxDneoe10CjI0XkduyJlAttFlNXdsB1Hv5t+EIhZ7+UhWibRJ7GG1gW Yn2xf6Dxri4DEgwNadFUxWKVuoj5nkeNIpIzXEVbQ9MSVOqxocFO6av4AdD9F9Qmi2RI DC/spXs/ZlKhC6ST1PQe+oxiA3TJ24CtxkZXXHKdnfp0iObuPgrLmlUt5yS37iYltqvA uWimG4KKZXmOE+C3WOKI1fIOD1ukow/whWbQMwibR1z3YknEoGJKCjYl9MkEOm8lL3aF t/KA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768504703; x=1769109503; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=9bZybh6ajNmTP3emcxjHSZEZGR4b5MsX3LqH44SKh2E=; b=s+CtnlS9K9Oj7TUovX9swe2ENXRXT2jytzYmRJNfgAdlBcuoZ0aGnIo7dc6EW/oo6N eDod1myFHVpGXZhpgL2Or77J31gnjUJ2ivIOkLcVkhNLLIx6zqIalP9C39bs/hcNvKUb 6DX4vCdIWmaXtSZJ0qlUtPa2I7aGDV6trE3Ip7MqjGCy6ZfP7jkjJfkXL9N2BFb5V4qH gGmSBg21bKUz88qdPjyjCG9kxk6vwnxo97g7ZCMJaTZJnrwwtPffSJ8ujhZyUWMQvj4M smYPUljcHuSMG4NtLpYmxokEQzQIee59HaV46lLp1+rNwJg9ncyDr0ext/ooVc0U6KWS yeCA== X-Forwarded-Encrypted: i=1; AJvYcCXg+brlkEkvXrl2ZseU5SaZwSmF8e+aTbo7Dspty+BvxcQVmCUlfv+8/K747o2oBcvwJaysV/YuN9aFdLk=@vger.kernel.org X-Gm-Message-State: AOJu0YzvOT7dvsd6kOfXUh3tR4LmisKIXv2TKHEV1thlgER0mclk5OJE POZdM9K26WknHlT1FVS5ya8bcqP4aFcvbdPjifuGrUEuf/w38yCcPnAy X-Gm-Gg: AY/fxX5GOlwLRJgz5GaEhIgA1eX9KAOvFw+DhBcxn8Fly6+pcqe+HBS2mccl0w9OO4C bxOl1MbRHyGqSLi8wrfCwySfFjsbuznhdynCgY5jPCG7nyJlwI6qD4zMiUoc4iZpzwrLhKHWLO3 lRXf6gS4f6DHBfiFmLZgYXSoBGiWXSMKL+OtWL0829T8AISGBek2CVAk8BD/+4ykVHijUijZ/Bv rleQ2L5bII6a3jZhUMWOcUoNruaX5NPqt01A11jINpCB9YCtJhpwxNGng+mayiejoA1j7onAbGc xaKnAqGTYRlPWG1YLsZcmj1eC6PcPhySYa5uuCDPN4YMRcTLk+M1Qekua5EcCA0cSLLstlOOJOv sot1P3/7E0mWZsxnJxBk3fihiS/l0AcrG/l0NTZJWUJy6VSHAMJpinnPafK6IwwGHjtWTBAxHrv FE7x26qxWVPgleDh7mWJbzPY/v6+/UURnjNVF6J2E4EWbU X-Received: by 2002:a05:6000:2209:b0:430:f7dc:7e96 with SMTP id ffacd0b85a97d-43569bc59b6mr523652f8f.48.1768504703038; Thu, 15 Jan 2026 11:18:23 -0800 (PST) Received: from [127.0.1.1] (bba-94-59-215-181.alshamil.net.ae. [94.59.215.181]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43569921dedsm692734f8f.9.2026.01.15.11.18.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Jan 2026 11:18:22 -0800 (PST) From: "Anton D. Stavinskii" Date: Thu, 15 Jan 2026 23:17:44 +0400 Subject: [PATCH 7/8] riscv: dts: sophgo: dts nodes for i2s tdm modules Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260115-cv1800b-i2s-driver-v1-7-e8b22b8578ab@gmail.com> References: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> In-Reply-To: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> To: Liam Girdwood , Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen Wang , Inochi Amaoto , Jaroslav Kysela , Takashi Iwai , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-sound@vger.kernel.org, devicetree@vger.kernel.org, sophgo@lists.linux.dev, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, "Anton D. Stavinskii" X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768504677; l=4041; i=stavinsky@gmail.com; s=20260115; h=from:subject:message-id; bh=ZvpnRa7g8hCkE7r1q64LPBBaiWff0x2lLnMd+0VKnb0=; b=vwb7UYqSlXo3rPP9yGKTfWtMY3ZhNyyOZjfBpq/qKetxn106Ow7lZhWEbkNRzwEkQv1jaiQWa 4bJ9F94rEA5BNdFZq1EVeJ1mjB3FJd8ZDKSoSUN8dkyyucDYqKQeG9n X-Developer-Key: i=stavinsky@gmail.com; a=ed25519; pk=2WxGZ1zd1vQwSPFCSks6zrADqUDBUdtq39lElk4ZE7Q= New dts nodes for TDMs and readable DMA names Signed-off-by: Anton D. Stavinskii --- arch/riscv/boot/dts/sophgo/cv180x-dmamux.h | 57 ++++++++++++++++++++++++++= ++++ arch/riscv/boot/dts/sophgo/cv180x.dtsi | 49 +++++++++++++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/arch/riscv/boot/dts/sophgo/cv180x-dmamux.h b/arch/riscv/boot/d= ts/sophgo/cv180x-dmamux.h new file mode 100644 index 000000000000..6314bf6e9dc8 --- /dev/null +++ b/arch/riscv/boot/dts/sophgo/cv180x-dmamux.h @@ -0,0 +1,57 @@ +/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */ +/* + * Copyright (C) 2025 Inochi Amaoto + */ + +#ifndef _SOPHGO_CV18XX_DMAMUX +#define _SOPHGO_CV18XX_DMAMUX + +#define DMA_I2S0_RX 0 +#define DMA_I2S0_TX 1 +#define DMA_I2S1_RX 2 +#define DMA_I2S1_TX 3 +#define DMA_I2S2_RX 4 +#define DMA_I2S2_TX 5 +#define DMA_I2S3_RX 6 +#define DMA_I2S3_TX 7 +#define DMA_UART0_RX 8 +#define DMA_UART0_TX 9 +#define DMA_UART1_RX 10 +#define DMA_UART1_TX 11 +#define DMA_UART2_RX 12 +#define DMA_UART2_TX 13 +#define DMA_UART3_RX 14 +#define DMA_UART3_TX 15 +#define DMA_SPI0_RX 16 +#define DMA_SPI0_TX 17 +#define DMA_SPI1_RX 18 +#define DMA_SPI1_TX 19 +#define DMA_SPI2_RX 20 +#define DMA_SPI2_TX 21 +#define DMA_SPI3_RX 22 +#define DMA_SPI3_TX 23 +#define DMA_I2C0_RX 24 +#define DMA_I2C0_TX 25 +#define DMA_I2C1_RX 26 +#define DMA_I2C1_TX 27 +#define DMA_I2C2_RX 28 +#define DMA_I2C2_TX 29 +#define DMA_I2C3_RX 30 +#define DMA_I2C3_TX 31 +#define DMA_I2C4_RX 32 +#define DMA_I2C4_TX 33 +#define DMA_TDM0_RX 34 +#define DMA_TDM0_TX 35 +#define DMA_TDM1_RX 36 +#define DMA_AUDSRC 37 +#define DMA_SPI_NAND 38 +#define DMA_SPI_NOR 39 +#define DMA_UART4_RX 40 +#define DMA_UART4_TX 41 +#define DMA_SPI_NOR1 42 + +#define DMA_CPU_A53 0 +#define DMA_CPU_C906_0 1 +#define DMA_CPU_C906_1 2 + +#endif // _SOPHGO_CV18XX_DMAMUX diff --git a/arch/riscv/boot/dts/sophgo/cv180x.dtsi b/arch/riscv/boot/dts/s= ophgo/cv180x.dtsi index 06b0ce5a2db7..9dd93e028ba9 100644 --- a/arch/riscv/boot/dts/sophgo/cv180x.dtsi +++ b/arch/riscv/boot/dts/sophgo/cv180x.dtsi @@ -8,6 +8,7 @@ #include #include #include "cv18xx-reset.h" +#include "cv180x-dmamux.h" =20 / { #address-cells =3D <1>; @@ -448,6 +449,54 @@ usb: usb@4340000 { status =3D "disabled"; }; =20 + i2s0: i2s@4100000 { + compatible =3D "sophgo,cv1800b-i2s"; + reg =3D <0x04100000 0x1000>; + #address-cells =3D <1>; + #size-cells =3D <0>; + clocks =3D <&clk CLK_APB_I2S0>, <&clk CLK_SDMA_AUD0>; + clock-names =3D "i2s", "mclk"; + dmas =3D <&dmamux DMA_I2S0_RX 1>, <&dmamux DMA_I2S0_TX 1>; + dma-names =3D "rx", "tx"; + status =3D "disabled"; + }; + + i2s1: i2s@4110000 { + compatible =3D "sophgo,cv1800b-i2s"; + reg =3D <0x04110000 0x1000>; + #address-cells =3D <1>; + #size-cells =3D <0>; + clocks =3D <&clk CLK_APB_I2S1>, <&clk CLK_SDMA_AUD1>; + clock-names =3D "i2s", "mclk"; + dmas =3D <&dmamux DMA_I2S1_RX 1>, <&dmamux DMA_I2S1_TX 1>; + dma-names =3D "rx", "tx"; + status =3D "disabled"; + }; + + i2s2: i2s@4120000 { + compatible =3D "sophgo,cv1800b-i2s"; + reg =3D <0x04120000 0x1000>; + #address-cells =3D <1>; + #size-cells =3D <0>; + clocks =3D <&clk CLK_APB_I2S2>, <&clk CLK_SDMA_AUD2>; + clock-names =3D "i2s", "mclk"; + dmas =3D <&dmamux DMA_I2S2_RX 1>, <&dmamux DMA_I2S2_TX 1>; + dma-names =3D "rx", "tx"; + status =3D "disabled"; + }; + + i2s3: i2s@4130000 { + compatible =3D "sophgo,cv1800b-i2s"; + reg =3D <0x04130000 0x1000>; + #address-cells =3D <1>; + #size-cells =3D <0>; + clocks =3D <&clk CLK_APB_I2S3>, <&clk CLK_SDMA_AUD3>; + clock-names =3D "i2s", "mclk"; + dmas =3D <&dmamux DMA_I2S3_RX 1>, <&dmamux DMA_I2S3_TX 1>; + dma-names =3D "rx", "tx"; + status =3D "disabled"; + }; + rtc@5025000 { compatible =3D "sophgo,cv1800b-rtc", "syscon"; reg =3D <0x5025000 0x2000>; --=20 2.43.0 From nobody Sun Feb 8 05:37:15 2026 Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) (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 2CFDB2FC006 for ; Thu, 15 Jan 2026 19:18:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504710; cv=none; b=ntnxpYr/AxTDF2tpWP4qeGTzDm9sqPRl+lQODnpXOsw1IX8tIkQcWUTnFAKmC+o/FVeji5SZV3G/Bdn1s3Cp9Agx/ru+kizJMT+/itNoDOgiPXs+yezPHyD0WST5WOc7K2fLDPv4zpiBR5LFICw0APia0UVJAtexMBYjvCW6gMU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768504710; c=relaxed/simple; bh=9hhnvku6/o7SnlNe4s7OxE/c/yY1MeLPXn9ZiuwHDts=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JrY5lnsHnN/X1ycsBCw6LhOFPqkR1yBu2jzr0WowmR1/G0Z3lvngAKReMEMmV0aZz0uZn/whM4Sz4SF9tLsglsSkFxLqUGr5PQO/QeE3j0WdRuEAkZc+8dKiJ8Ael0BK9vGAirtTka+YmhD3YdRlyTn5Q4Ks8ypsGXy+bWeH57I= 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=D/vJjUJf; arc=none smtp.client-ip=209.85.221.43 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="D/vJjUJf" Received: by mail-wr1-f43.google.com with SMTP id ffacd0b85a97d-4327555464cso728417f8f.1 for ; Thu, 15 Jan 2026 11:18:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768504706; x=1769109506; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=u4OBbtgA8tqfAE3cwS/lYCrnVUiM8rMD+darqSO7wyo=; b=D/vJjUJfz8n1ndJ9FhhzeB/0Nf/qhk6TuIV6uvN+qiv31HQ8CiZp2g2jJFYbbSQo2N PBgk8q3lNIfaml8JLF5Tm+4O+jORkFahAxAC78O9kpNX0SJlwLbyz9f+UDeoFA1CCcpt FaNinXLnInENznRLixzqXOcjiK6KnrbV0CzuvHYyBxWKzVpzqs7b1OrfvZs1YoAerKmE tLKeuIi/MePBsDnesybxEWwmIUqYNO1SpWQD8L1Xy5WQsGgvoH8jdaZ4lXj2r9FXd+1F s+aXtnJSch4iBfbBQFyk3VXzBJ2KovC2gnNOKxAqN8sSzozlW+1+r5h0r0pA6zhmML4O YnLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768504706; x=1769109506; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=u4OBbtgA8tqfAE3cwS/lYCrnVUiM8rMD+darqSO7wyo=; b=U1Tv4RcHsRh+WSVTZmgnnKedqRz1Xh+ke+VAohmen9yRpxSJ/jUVjgkUHCroxgt5ht 8svVnQ2ZAAWPDlCMSJbj1wwSffZiozHhFpifoF8sYEPoT1KVHzqgg2LC8ZxVw3eimKZX VOqtZRit4yp7CiuLR69Fkjea/DlfUiBw2Qy5WteKsEQ04SCL8xL1SHpAAIeLfLQmLytJ CQA3YB5PZPKr291BoyPFfvSHhJDxqC3oU6rqAEDQK6eYsvZcciDOZj0CFEMUSeblocN7 HpxJeXbE2lMMkYVseFsuKpQLaoOaNtV78CTzkK9Ys9F10yMyb6eJLD1LDlVUxVT+SV3F 2uIg== X-Forwarded-Encrypted: i=1; AJvYcCWT7KQ+8Ia/ELqBhdYZe9SAGC4Ddudc/5pZsjb4x95fiLirveAFePvVzCxFsaaSqsVB2Pfz/ktF72MC3y0=@vger.kernel.org X-Gm-Message-State: AOJu0YxPyw7JVZjLmr7to90u8CF2XacP+gXAlTiZPJvWYgspZVHujU53 pdMRToaAZcBP6rsNXKlGkRzBNJiTEjQwz9VC9aDVyUCxuwMY4e4vgXh0 X-Gm-Gg: AY/fxX7k2Fm3HCm3JKWpgae4e6keMFlGDpyw5ahBCh4/FSquPlt7R0RcD4JkEUtKgA7 mVbh4V7kYPpiCyB3A1fsB8WiCLsb0wIp14cMT0CfX2DnV3BkreGL9ppO0LbwH37oBzm1dOD0ZCv kT7zn5JHQ/KZ9rPXL+UOUi4C4oBOm1jR8HmWbaC+Oq4NY6AQge+zLaiy4Rn4X/cVhqF53IGvG4p Ea+XZWxqUFyEJA3QwQpkLKJzZiatuxGxiU2i+WB4zq6fqfVdiwsruJWbAfWmEkO0RCgZldWXeZ6 +4NnTpMWDWMx/LpJPenm4r4oeY6Aitd5iWeTFBg3cqxiV9FkV/jBuGh6LgixABbpDoRc7ZR9ehp KChiwe8AvGfUtb05VsWTyHPyCTqkL9WfX+ePfwekZ3Xf5PbEZSTgc+Mk8RcyexBCgnVN0r3IDGu eB79sW70K4W4KxO3SXtrYOM2jgtrStUrSdkI1xueZNcISF X-Received: by 2002:a5d:5848:0:b0:42c:b8fd:21b4 with SMTP id ffacd0b85a97d-43569bd3483mr527130f8f.57.1768504706222; Thu, 15 Jan 2026 11:18:26 -0800 (PST) Received: from [127.0.1.1] (bba-94-59-215-181.alshamil.net.ae. [94.59.215.181]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43569921dedsm692734f8f.9.2026.01.15.11.18.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Jan 2026 11:18:25 -0800 (PST) From: "Anton D. Stavinskii" Date: Thu, 15 Jan 2026 23:17:45 +0400 Subject: [PATCH 8/8] riscv: dts: sophgo: add Milk-V Duo 256M board dts Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260115-cv1800b-i2s-driver-v1-8-e8b22b8578ab@gmail.com> References: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> In-Reply-To: <20260115-cv1800b-i2s-driver-v1-0-e8b22b8578ab@gmail.com> To: Liam Girdwood , Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen Wang , Inochi Amaoto , Jaroslav Kysela , Takashi Iwai , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-sound@vger.kernel.org, devicetree@vger.kernel.org, sophgo@lists.linux.dev, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, "Anton D. Stavinskii" X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768504677; l=6398; i=stavinsky@gmail.com; s=20260115; h=from:subject:message-id; bh=9hhnvku6/o7SnlNe4s7OxE/c/yY1MeLPXn9ZiuwHDts=; b=j7D/duGQ4GkjR/PUiJLYxY2ySpoiZWhKC8trthmiOSLexzpyG9Kh+TZAgY8WBeTjjKbHh/F7s iKkJ7H/r284CqabbvOv7ff/QWJ2jz2zIhswlcsz/Ux6bUvDo5XxUoDn X-Developer-Key: i=stavinsky@gmail.com; a=ed25519; pk=2WxGZ1zd1vQwSPFCSks6zrADqUDBUdtq39lElk4ZE7Q= Example of usage internal dac/adc and external I2S mic The example shows how to use the card and will actually work other boards. Fixed clocks needed to make simple card make initial .set_sysclk with proper clock rates. Same for DAC. I2S3 has to be started not only for DAC but for the ADC also because it provides mclk for both. dai-link@2 will only work if registers are set according to this issue https://github.com/sophgo/sophgo-doc/issues/174#event-21395297524 in other case i2s2 will not output clocks and data. Those changes are not connected to the driver itself, but for another subsystem which is not yet ipmlemented. The following config properly works for MilkV Duo/256Mm, Module. Basically everything with sg2000/sg2002 but on some boards i2s2 output pins are soldered to Ethernet module. In Milk 256M they are free to use as external DAC/ADC. Signed-off-by: Anton D. Stavinskii --- arch/riscv/boot/dts/sophgo/Makefile | 1 + .../boot/dts/sophgo/sg2002-milkv-duo-256m.dts | 231 +++++++++++++++++= ++++ 2 files changed, 232 insertions(+) diff --git a/arch/riscv/boot/dts/sophgo/Makefile b/arch/riscv/boot/dts/soph= go/Makefile index 6f65526d4193..c8901ff680cb 100644 --- a/arch/riscv/boot/dts/sophgo/Makefile +++ b/arch/riscv/boot/dts/sophgo/Makefile @@ -6,3 +6,4 @@ dtb-$(CONFIG_ARCH_SOPHGO) +=3D sg2042-milkv-pioneer.dtb dtb-$(CONFIG_ARCH_SOPHGO) +=3D sg2042-evb-v1.dtb dtb-$(CONFIG_ARCH_SOPHGO) +=3D sg2042-evb-v2.dtb dtb-$(CONFIG_ARCH_SOPHGO) +=3D sg2044-sophgo-srd3-10.dtb +dtb-$(CONFIG_ARCH_SOPHGO) +=3D sg2002-milkv-duo-256m.dtb diff --git a/arch/riscv/boot/dts/sophgo/sg2002-milkv-duo-256m.dts b/arch/ri= scv/boot/dts/sophgo/sg2002-milkv-duo-256m.dts new file mode 100644 index 000000000000..cc33c4355969 --- /dev/null +++ b/arch/riscv/boot/dts/sophgo/sg2002-milkv-duo-256m.dts @@ -0,0 +1,231 @@ +// SPDX-License-Identifier: (GPL-2.0 OR MIT) +/* + * Copyright (C) 2024 Thomas Bonnefille + */ + +/dts-v1/; + +#include "sg2002.dtsi" + +/ { + model =3D "Milk-V duo 256M"; + compatible =3D "milkv,duo-256m", + "sipeed,licheerv-nano", + "sophgo,sg2002"; + + aliases { + gpio0 =3D &gpio0; + gpio1 =3D &gpio1; + gpio2 =3D &gpio2; + gpio3 =3D &gpio3; + serial0 =3D &uart0; + serial1 =3D &uart1; + serial2 =3D &uart2; + serial3 =3D &uart3; + serial4 =3D &uart4; + }; + + chosen { + stdout-path =3D "serial0:115200n8"; + }; +}; + +&osc { + clock-frequency =3D <25000000>; +}; + +&pinctrl { + uart0_cfg: uart0-cfg { + uart0-pins { + pinmux =3D , + ; + bias-pull-up; + drive-strength-microamp =3D <10800>; + power-source =3D <3300>; + }; + }; + + sdhci0_cfg: sdhci0-cfg { + sdhci0-clk-pins { + pinmux =3D ; + bias-pull-up; + drive-strength-microamp =3D <16100>; + power-source =3D <3300>; + }; + + sdhci0-cmd-pins { + pinmux =3D ; + bias-pull-up; + drive-strength-microamp =3D <10800>; + power-source =3D <3300>; + }; + + sdhci0-data-pins { + pinmux =3D , + , + , + ; + bias-pull-up; + drive-strength-microamp =3D <10800>; + power-source =3D <3300>; + }; + + sdhci0-cd-pins { + pinmux =3D ; + bias-pull-up; + drive-strength-microamp =3D <10800>; + power-source =3D <3300>; + }; + }; +}; + +&sdhci0 { + pinctrl-0 =3D <&sdhci0_cfg>; + pinctrl-names =3D "default"; + status =3D "okay"; + bus-width =3D <4>; + no-1-8-v; + no-mmc; + no-sdio; + disable-wp; +}; + +&usb { + dr_mode =3D "peripheral"; + status =3D "okay"; + g-rx-fifo-size =3D <1536>; + g-tx-fifo-size =3D <128 128 64 64 64 64 32 32>; +}; + +&uart0 { + pinctrl-0 =3D <&uart0_cfg>; + pinctrl-names =3D "default"; + status =3D "okay"; +}; + +&dmac { + status =3D "okay"; +}; + +&dmamux { + status =3D "okay"; +}; + +&pinctrl { + i2s2_cfg: i2s2-cfg { + i2s2-out-pins { + pinmux =3D , + , + ; + + drive-strength-microamp =3D <15700>; + power-source =3D <1800>; + }; + + i2s2-in-pins { + pinmux =3D ; + power-source =3D <1800>; + }; + }; +}; + +&i2s0 { + #sound-dai-cells =3D <0>; + status =3D "okay"; +}; + +&i2s2 { + pinctrl-0 =3D <&i2s2_cfg>; + pinctrl-names =3D "default"; + #sound-dai-cells =3D <0>; + status =3D "okay"; +}; + +&i2s3 { + #sound-dai-cells =3D <0>; + status =3D "okay"; +}; + +/ { + int_adc: codec@300a100 { + compatible =3D "sophgo,cv1800b-sound-adc"; + #sound-dai-cells =3D <0>; + reg =3D <0x300a100 0x100>; + }; + + int_dac: codec@300a000 { + compatible =3D "sophgo,cv1800b-sound-dac"; + #sound-dai-cells =3D <0>; + reg =3D <0x300a000 0x100>; + }; + + ext_adc: my-ext-adc { + compatible =3D "invensense,ics43432"; + #sound-dai-cells =3D <0>; + }; + + sound { + compatible =3D "simple-audio-card"; + simple-audio-card,name =3D "cv1800b card"; + #address-cells =3D <1>; + #size-cells =3D <0>; + + simple-audio-card,dai-link@0 { + reg =3D <0>; + format =3D "i2s"; + bitclock-master =3D <&clock_master0>; + frame-master =3D <&clock_master0>; + + codec { + sound-dai =3D <&int_dac>; + }; + + clock_master0: cpu { + system-clock-frequency =3D <12288000>; + system-clock-fixed; + system-clock-direction-out; + mclk-fs =3D <256>; + sound-dai =3D <&i2s3>; + }; + }; + + simple-audio-card,dai-link@1 { + reg =3D <1>; + format =3D "i2s"; + bitclock-master =3D <&clock_master1>; + frame-master =3D <&clock_master1>; + + clock_master1: codec { + mclk-fs =3D <256>; + system-clock-frequency =3D <12288000>; + system-clock-fixed; + sound-dai =3D <&int_adc>; + }; + + cpu { + mclk-fs =3D <256>; + system-clock-frequency =3D <12288000>; + system-clock-fixed; + sound-dai =3D <&i2s0>; + }; + }; + + simple-audio-card,dai-link@2 { + reg =3D <2>; + format =3D "i2s"; + bitclock-master =3D <&clock_master2>; + frame-master =3D <&clock_master2>; + + codec { + sound-dai =3D <&ext_adc>; + }; + + clock_master2: cpu { + mclk-fs =3D <256>; + system-clock-frequency =3D <12288000>; + system-clock-fixed; + sound-dai =3D <&i2s2>; + }; + }; + }; +}; --=20 2.43.0