From nobody Fri Oct 2 10:08:42 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 94650394EA7; Sun, 2 Aug 2026 12:42:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785674567; cv=none; b=MQGJ467H6Rkv22kZ5sB0QW/bta5HPpzw+/FTeFib3sm6Mpj8QaMfO8GqBhU7ZnkjRl28YO9z8zwBocZ9HJ8xwEmvlwEXXDWUXE4Pi2Zagap8Ti+QK2GzomNfFg4U1LUw8upOBaLyT3gsA0XR8T9NokpuptsxTD2TYA5+pvN4O4E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785674567; c=relaxed/simple; bh=gMz6c1u7vOhvnOY9ulQRhpy2xb4L/wbzVkIxYSZQCTs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QVoYBmZ9zkGYeXo2xa8ZAt/RCnmjHUUvp6h43CiZZX8D4NCw0BeQly4sFtZ8xv8OfqWyaaDUqwiOoRmaqd2R4fH5QU1RHbXfcCOJyInfQiZZjRKOgWJmywJPW0pcXU2g0O1EnPRdW0gVabZP2wS8SldJY0MApVZGnuuwbpgStqU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=tXro9iJy; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="tXro9iJy" Received: by smtp.kernel.org (Postfix) with ESMTPS id 17B89C2BCF7; Sun, 2 Aug 2026 12:42:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1785674567; bh=gMz6c1u7vOhvnOY9ulQRhpy2xb4L/wbzVkIxYSZQCTs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=tXro9iJyrljHF4Czg0o/jkUn3DOT/9/sPyYHNX4fW0+Vz7lrf7MisDEy6lvXGErnG D2MqdjZQzBY49TjVwNQzxKT3EBWdxQvyEMQwAzMH2Vu0IEp8U7ID2oEQSHysEJtFTW eMJd2QdFH/fEV9cQGp8W8NrGwN0tkkypyALXuqqWQ8QK6bf59UtG0zAMbGZfKntRaO P1/wqg9UXL2BAvtywIlcp2eiNA3MOTPbpvrK1bowXs3TJGpKgm9gAgZwrGc3c4gRWC iaSDk6S1ZsMDpp/D38cF6pdlMxk/PzhRwiJLdPC6Ds2C61Px8ivnypQrAwHS4VDcat en9rNCmkIC6gw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id EC84EC55171; Sun, 2 Aug 2026 12:42:46 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Sun, 02 Aug 2026 14:42:40 +0200 Subject: [PATCH RFC 1/3] dt-bindings: sound: Add NXP TFA98XX TFA2 amplifier 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: <20260802-tfa98xx-upstream-v1-1-4dd55cdd658a@ixit.cz> References: <20260802-tfa98xx-upstream-v1-0-4dd55cdd658a@ixit.cz> In-Reply-To: <20260802-tfa98xx-upstream-v1-0-4dd55cdd658a@ixit.cz> To: Liam Girdwood , Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jaroslav Kysela , Takashi Iwai , Bjorn Andersson , Konrad Dybcio Cc: linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, phone-devel@vger.kernel.org, David Heidelberg X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1851; i=david@ixit.cz; h=from:subject:message-id; bh=ViUxE0LC3t90pmsmZSY5+bZF4yD/3WG8f30yBWITCnw=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBqbztFvRluDR502lw7/NRrEIgLQC8sh6Ek71XsZ KJ5ZupFntWJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCam87RQAKCRBgAj/E00kg cqA9EAC3OE2BeZ1AqxbrtO7HUJMae20TUw2B+T7GH0/Jb0n7YF0GznXb20tw+/pmLxx/NG6zx9m dmh+aphYXRhoEUn2rXsxLcRn/t24DYiYV+hJ9R8qHCf1HuEZoh5LssODei9PV4G2wpW1kfQfWgP 20k56fREItfh9gy5OLAIEieYrjsn2yWghPpP8WrlSh9T9cxikj46tj4SQBSO0xTN36hLqVO1Cq4 SmtdSNIVLtheR04tcqHsclcMMX976B9AtuSjKxADuxAvj4vb5lg92Nfczy8L7/NetJiPpPLjAUD iPdhmz68WU6BRCigOtceqlVlSRLCKDIx29ChAoFuF05d8v6zvw1iogWBvrJ/CXJjIyDxkx64Gpg xm7RCFKOZde+9NmH23IGYBFd723uu/3aOFbg+mhErJAg2qZLY+UylfAL7MOjIICswuiIY+LrF2x S4o227Um7/LPcTxOZjnObBTLKyFV1jBB2bV6gIlpGH6nUVlojNcLlApgpwF0UjS3bMyd8yBbgMh TwOqTuaRh9PWLn2aHRKrimiVG7HmdIAbNytKAA2HoOw1Vp6xwz4OEgeP8hhRgZe4FHmjlAzspFR X0+yG5gf8gdNhMPe8arbn9t4oz9vas7KfSYAqOEdvzlr6o5CevuLMzcvKTGDm/t7uTgitgJFYTa l4JRlZ1Wba33U0g== X-Developer-Key: i=david@ixit.cz; a=openpgp; fpr=D77A09CFEEDC2BBD53A7047460023FC4D3492072 X-Endpoint-Received: by B4 Relay for david@ixit.cz/default with auth_id=355 X-Original-From: David Heidelberg Reply-To: david@ixit.cz From: David Heidelberg Add a YAML devicetree binding schema for the NXP/Goodix TFA98XX TFA2 family of I2C-controlled smart speaker amplifiers with on-chip DSP. The binding covers supported chip variants (TFA9872 through TFA9912) and documents the optional reset and IRQ GPIO properties. Signed-off-by: David Heidelberg --- .../devicetree/bindings/sound/nxp,tfa98xx.yaml | 54 ++++++++++++++++++= ++++ 1 file changed, 54 insertions(+) diff --git a/Documentation/devicetree/bindings/sound/nxp,tfa98xx.yaml b/Doc= umentation/devicetree/bindings/sound/nxp,tfa98xx.yaml new file mode 100644 index 0000000000000..e80c046894454 --- /dev/null +++ b/Documentation/devicetree/bindings/sound/nxp,tfa98xx.yaml @@ -0,0 +1,54 @@ +# SPDX-License-Identifier: (GPL-2.0-only) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/sound/nxp,tfa98xx.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: NXP/Goodix TFA98xx (TFA2) smart speaker amplifiers + +maintainers: + - David Heidelberg + +description: + The TFA98xx (TFA2) family are I2C-controlled class-D speaker amplifiers + with an integrated CoolFlux DSP. + +allOf: + - $ref: dai-common.yaml# + +properties: + compatible: + enum: + - nxp,tfa9894 + + reg: + maxItems: 1 + + reset-gpios: + maxItems: 1 + + '#sound-dai-cells': + const: 0 + +required: + - compatible + - reg + - '#sound-dai-cells' + +unevaluatedProperties: false + +examples: + - | + #include + + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + + audio-codec@34 { + compatible =3D "nxp,tfa9894"; + reg =3D <0x34>; + reset-gpios =3D <&tlmm 69 GPIO_ACTIVE_HIGH>; + #sound-dai-cells =3D <0>; + }; + }; --=20 2.53.0 From nobody Fri Oct 2 10:08:42 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 945843932D3; Sun, 2 Aug 2026 12:42:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785674567; cv=none; b=jr9Fky9PqZX3lF8Dly8zpTR0uatfRv9jV7AeM/68RGyVdgl/lP7joI7Alv/DDwUhevy1krJBLMSkrMx0OcPtAzzdOByz0MUThtFR0yconivaNCd8tzrCVdoXVqSyBFJp6PW3BJCP+DeIcyEQFFOwK+4mR+B8hOkXapTd/YMySaU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785674567; c=relaxed/simple; bh=dLxSJzv2UWOzRvP95fh9FJoPAClDbsB61RPr9lhb/hw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SJuheN5DALKSOx7ZcTrygNSa4kqoRff46OXvSG8kAyDr5ADwzuQMCT5yXbYdeiTMG33aLUVJFnqF1OJx/1Q2rmiCs4g/FA92k3bsnrPWNyy5DagJEHAYtehwuvsm8xBnZo0cwrpQlSgseXTHOiXEHlS54i+52eCFfp7KUrCOSe8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=F/+bfHCj; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="F/+bfHCj" Received: by smtp.kernel.org (Postfix) with ESMTPS id 25D9FC2BCFA; Sun, 2 Aug 2026 12:42:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1785674567; bh=dLxSJzv2UWOzRvP95fh9FJoPAClDbsB61RPr9lhb/hw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=F/+bfHCjKscl0Qm9VW38+89flY+GO02Ve42os3anaPWVH7WrM9jkadkORwuRDGorh H9kYTcnAo3YpL1ysmYAVpyKsRAf+X6c1PCt0xU/DIq9JiK67U10vTLwKjWltqcg70J DlYcutdh4aZQtA/bvdMqdicuCoxwt4lihVlXrSfGZAjrkQxyP3k+Dhoersd8MLZph1 4iVKnWWQtz+OAz9NI44pNE8N/1GhBc7Zdzw0/XvsVTTgH/YH81nBswvOXNKjKPAx/l UBpaciA4k+ZhPP/QevS6cNO2RqJMb/ZeYXUsI3R5qHhw3R3FX/Cu/lJTT2HOq6NTG9 7OdhpLU7Q/tqQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 07BE8C55177; Sun, 2 Aug 2026 12:42:47 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Sun, 02 Aug 2026 14:42:41 +0200 Subject: [PATCH RFC 2/3] ASoC: codecs: tfa98xx: add driver for TFA2 amplifiers 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: <20260802-tfa98xx-upstream-v1-2-4dd55cdd658a@ixit.cz> References: <20260802-tfa98xx-upstream-v1-0-4dd55cdd658a@ixit.cz> In-Reply-To: <20260802-tfa98xx-upstream-v1-0-4dd55cdd658a@ixit.cz> To: Liam Girdwood , Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jaroslav Kysela , Takashi Iwai , Bjorn Andersson , Konrad Dybcio Cc: linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, phone-devel@vger.kernel.org, David Heidelberg X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=18634; i=david@ixit.cz; h=from:subject:message-id; bh=7SjC9HMs6Mozs0FNkOsN/7PmllqSmYLQE/c6eBud4Fs=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBqbztFMwbh+lv/w3geSSQ87SQESJa533q5eu6lE iUViv0F8dqJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCam87RQAKCRBgAj/E00kg cl8WD/wLgSUMBI1On8liDFYZXl8sjteltoNS/zIV3yNubiXsALJtD3xkDBPGQgYsS2bXXKlNvoS RgzbzET3gflweVZLo6KK4m9AzBehb9Ega1P2YRyiZsBb8hkJOy1Ga+KEFkx2D2R/QB9JBKdBAq9 RFrFZUtgAlpKEuthfaFzylj1MyvVi4O1YbmYnJqNW6AZJPgoHspphP91nobWS5q5+r0XjHYORWp VgDlDjMxlLKbtqsj6hvXwwlNs+y/ofzuzqXPjTvcPWW4ScpdJuEY669tT4JcZUKL0GmAq41MQRn OySGKhEsrrc2AT2C9C7C/iRWdBJqX4Q8oUTS1kHyg5r6+aEKuPyFJWarUaVVs8A6v6d0OrTb4+B hR/lx7lRLJ2jp5HXqv/koavmgE+N6TeFeorhvUN+Uhyc/PetQ4/4Irq9+stTVaxl42TMfachpJr bCLMDpTJ3qzxeUfENf0hqVB4uT3QtatDcZ+l7qvNVixn9US5+P9Nl5egnqTGOIfoFsF2IZMyoR+ D+JUtVxW9okiPq11OByjUuqvTI5s64DwTBXibMfVbM90UiNWwB4p760Bo2nFUK9jK53+MRFr5q0 BijogtoWjaNUTLbDeoQcbXQh/0WtGGHfUQHbJdZNYP5HJ+infOxDZvBdw6g5zFYSla+hHLpHbxr BEFggjkRkfitVPA== X-Developer-Key: i=david@ixit.cz; a=openpgp; fpr=D77A09CFEEDC2BBD53A7047460023FC4D3492072 X-Endpoint-Received: by B4 Relay for david@ixit.cz/default with auth_id=355 X-Original-From: David Heidelberg Reply-To: david@ixit.cz From: David Heidelberg Add a driver for the NXP/Goodix TFA98xx (TFA2) smart speaker amplifiers, initially supporting the TFA9894 found on the OnePlus 6T. The per-die revision power-on correction sequences are transcribed from the vendor driver. Like the existing TFA1 driver, this bypasses the built-in CoolFlux DSP, which needs an undocumented vendor firmware container to run. On TFA2 the AMPC bit hands control over the amplifier to the DSP and is set out of reset, so both CFE and AMPC have to be cleared for the amplifier enable to be driven through DAPM. The amplifier input is taken straight from the TDM interface. Speaker protection and volume control are consequently not available. Signed-off-by: David Heidelberg --- MAINTAINERS | 7 + sound/soc/codecs/Kconfig | 11 ++ sound/soc/codecs/Makefile | 2 + sound/soc/codecs/tfa98xx.c | 421 +++++++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 441 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 56b337a064478..f41a7d70bab7e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -19735,16 +19735,23 @@ F: drivers/nfc/nxp-nci =20 NXP/Goodix TFA989X (TFA1) DRIVER M: Stephan Gerhold L: linux-sound@vger.kernel.org S: Maintained F: Documentation/devicetree/bindings/sound/nxp,tfa989x.yaml F: sound/soc/codecs/tfa989x.c =20 +NXP/GOODIX TFA98XX (TFA2) DRIVER +M: David Heidelberg +L: linux-sound@vger.kernel.org +S: Maintained +F: Documentation/devicetree/bindings/sound/nxp,tfa98xx.yaml +F: sound/soc/codecs/tfa98xx.c + NZXT-KRAKEN2 HARDWARE MONITORING DRIVER M: Jonas Malaco L: linux-hwmon@vger.kernel.org S: Maintained F: Documentation/hwmon/nzxt-kraken2.rst F: drivers/hwmon/nzxt-kraken2.c =20 NZXT-KRAKEN3 HARDWARE MONITORING DRIVER diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index bfd81ca89110e..db4d519627ae1 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -275,16 +275,17 @@ config SND_SOC_ALL_CODECS imply SND_SOC_TAS2781_I2C imply SND_SOC_TAS2783_SDW imply SND_SOC_TAS5086 imply SND_SOC_TAS571X imply SND_SOC_TAS5720 imply SND_SOC_TAS6424 imply SND_SOC_TAS675X imply SND_SOC_TDA7419 + imply SND_SOC_TFA98XX imply SND_SOC_TFA9879 imply SND_SOC_TFA989X imply SND_SOC_TLV320ADC3XXX imply SND_SOC_TLV320ADCX140 imply SND_SOC_TLV320AIC23_I2C imply SND_SOC_TLV320AIC23_SPI imply SND_SOC_TLV320AIC26 imply SND_SOC_TLV320AIC31XX @@ -2291,16 +2292,26 @@ config SND_SOC_TFA989X depends on I2C select REGMAP_I2C help Enable support for NXP (now Goodix) TFA989X (TFA1 family) speaker amplifiers, e.g. TFA9895. Note that the driver currently bypasses the built-in "CoolFlux DSP" and does not support (hardware) volume control. =20 +config SND_SOC_TFA98XX + tristate "NXP/Goodix TFA98XX (TFA2) amplifiers" + depends on I2C + select REGMAP_I2C + help + Enable support for NXP (now Goodix) TFA98XX (TFA2 family) smart + speaker amplifiers, e.g. TFA9894. + Note that the driver bypasses the built-in "CoolFlux DSP" and + therefore provides no speaker protection or volume control. + config SND_SOC_TLV320ADC3XXX tristate "Texas Instruments TLV320ADC3001/3101 audio ADC" depends on I2C depends on GPIOLIB help Enable support for Texas Instruments TLV320ADC3001 and TLV320ADC3101 ADCs. =20 diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index d2a689006d69c..b1f811452cdab 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile @@ -327,16 +327,17 @@ snd-soc-tda7419-y :=3D tda7419.o snd-soc-tas2770-y :=3D tas2770.o snd-soc-tas2781-comlib-y :=3D tas2781-comlib.o snd-soc-tas2781-comlib-i2c-y :=3D tas2781-comlib-i2c.o snd-soc-tas2781-fmwlib-y :=3D tas2781-fmwlib.o snd-soc-tas2781-i2c-y :=3D tas2781-i2c.o snd-soc-tas2783-sdw-y :=3D tas2783-sdw.o snd-soc-tfa9879-y :=3D tfa9879.o snd-soc-tfa989x-y :=3D tfa989x.o +snd-soc-tfa98xx-y :=3D tfa98xx.o snd-soc-tlv320adc3xxx-y :=3D tlv320adc3xxx.o snd-soc-tlv320aic23-y :=3D tlv320aic23.o snd-soc-tlv320aic23-i2c-y :=3D tlv320aic23-i2c.o snd-soc-tlv320aic23-spi-y :=3D tlv320aic23-spi.o snd-soc-tlv320aic26-y :=3D tlv320aic26.o snd-soc-tlv320aic31xx-y :=3D tlv320aic31xx.o snd-soc-tlv320aic32x4-y :=3D tlv320aic32x4.o tlv320aic32x4-clk.o snd-soc-tlv320aic32x4-i2c-y :=3D tlv320aic32x4-i2c.o @@ -769,16 +770,17 @@ obj-$(CONFIG_SND_SOC_TAS571X) +=3D snd-soc-tas571x.o obj-$(CONFIG_SND_SOC_TAS5720) +=3D snd-soc-tas5720.o obj-$(CONFIG_SND_SOC_TAS5805M) +=3D snd-soc-tas5805m.o obj-$(CONFIG_SND_SOC_TAS6424) +=3D snd-soc-tas6424.o obj-$(CONFIG_SND_SOC_TAS675X) +=3D snd-soc-tas675x.o obj-$(CONFIG_SND_SOC_TDA7419) +=3D snd-soc-tda7419.o obj-$(CONFIG_SND_SOC_TAS2770) +=3D snd-soc-tas2770.o obj-$(CONFIG_SND_SOC_TFA9879) +=3D snd-soc-tfa9879.o obj-$(CONFIG_SND_SOC_TFA989X) +=3D snd-soc-tfa989x.o +obj-$(CONFIG_SND_SOC_TFA98XX) +=3D snd-soc-tfa98xx.o obj-$(CONFIG_SND_SOC_TLV320ADC3XXX) +=3D snd-soc-tlv320adc3xxx.o obj-$(CONFIG_SND_SOC_TLV320AIC23) +=3D snd-soc-tlv320aic23.o obj-$(CONFIG_SND_SOC_TLV320AIC23_I2C) +=3D snd-soc-tlv320aic23-i2c.o obj-$(CONFIG_SND_SOC_TLV320AIC23_SPI) +=3D snd-soc-tlv320aic23-spi.o obj-$(CONFIG_SND_SOC_TLV320AIC26) +=3D snd-soc-tlv320aic26.o obj-$(CONFIG_SND_SOC_TLV320AIC31XX) +=3D snd-soc-tlv320aic31xx.o obj-$(CONFIG_SND_SOC_TLV320AIC32X4) +=3D snd-soc-tlv320aic32x4.o obj-$(CONFIG_SND_SOC_TLV320AIC32X4_I2C) +=3D snd-soc-tlv320aic32x4-i2c.o diff --git a/sound/soc/codecs/tfa98xx.c b/sound/soc/codecs/tfa98xx.c new file mode 100644 index 0000000000000..c84abb8db207a --- /dev/null +++ b/sound/soc/codecs/tfa98xx.c @@ -0,0 +1,421 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Driver for NXP/Goodix TFA98xx (TFA2) smart speaker amplifiers. + * + * Copyright David Heidelberg + * + * Register sequences taken from the NXP/Goodix vendor driver: + * Copyright NXP Semiconductors + * Copyright GOODIX + * + * These amplifiers contain a CoolFlux DSP which needs a vendor-specific + * firmware container to run. This driver keeps the DSP disabled and feeds + * the TDM input straight to the amplifier, so the speaker protection + * (excursion and thermal modelling) provided by the DSP is not available. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TFA98XX_SYS_CTRL0 0x00 +#define TFA98XX_SYS_CTRL0_PWDN 0 /* power down */ +#define TFA98XX_SYS_CTRL0_CFE 2 /* enable CoolFlux DSP */ +#define TFA98XX_SYS_CTRL0_AMPE 3 /* enable amplifier */ +#define TFA98XX_SYS_CTRL0_AMPC 6 /* amplifier enabled by DSP */ + +#define TFA98XX_SYS_CTRL1 0x01 +#define TFA98XX_SYS_CTRL1_AMPINSEL_MSK GENMASK(1, 0) /* amp input select */ +#define TFA98XX_SYS_CTRL1_MANSCONF BIT(2) /* I2C settings configured */ + +#define TFA98XX_AUDIO_CTRL 0x02 +#define TFA98XX_AUDIO_CTRL_AUDFS_MSK GENMASK(3, 0) /* sample rate */ + +#define TFA98XX_REVISION 0x03 +#define TFA98XX_REVISION_ID_MSK GENMASK(7, 0) + +/* Status and live-data registers, 0x10..0x1f */ +#define TFA98XX_STATUS_FIRST 0x10 +#define TFA98XX_STATUS_LAST 0x1f + +#define TFA98XX_TDM_CFG0 0x20 +#define TFA98XX_TDM_CFG0_TDME BIT(0) /* enable interface */ +#define TFA98XX_TDM_CFG0_TDMSPKE BIT(1) /* enable audio sink */ + +#define TFA98XX_TDM_CFG1 0x21 +#define TFA98XX_TDM_CFG1_NBCK_MSK GENMASK(3, 0) /* BCK to FS ratio */ + +#define TFA98XX_TDM_CFG2 0x22 +#define TFA98XX_TDM_CFG2_SLLN_MSK GENMASK(4, 0) /* bits per slot */ +#define TFA98XX_TDM_CFG2_SSIZE_MSK GENMASK(14, 10) /* sample size */ + +#define TFA98XX_TDM_CFG3 0x23 +#define TFA98XX_TDM_CFG3_SPKS_MSK GENMASK(3, 0) /* slot for sink 0 */ + +#define TFA98XX_KEY1 0x0f +#define TFA98XX_KEY1_UNHIDE 0x5a6b + +#define TFA9894_REVISION 0x94 + +struct tfa98xx_rev { + unsigned int rev; + const struct reg_sequence *init; + unsigned int num_init; +}; + +struct tfa98xx_chip { + unsigned int id; + const struct tfa98xx_rev *revs; + unsigned int num_revs; +}; + +struct tfa98xx { + struct regmap *regmap; +}; + +/* + * Correction of the power-on defaults, taken verbatim from the vendor + * driver. The values differ per die revision. + */ +static const struct reg_sequence tfa9894_rev0a_init[] =3D { + { 0x00, 0xa245 }, { 0x02, 0x51e8 }, { 0x52, 0xbe17 }, + { 0x57, 0x0344 }, { 0x61, 0x0033 }, { 0x71, 0x00cf }, + { 0x72, 0x34a9 }, { 0x73, 0x3808 }, { 0x76, 0x0067 }, + { 0x80, 0x0000 }, { 0x81, 0x5715 }, { 0x82, 0x0104 }, +}; + +static const struct reg_sequence tfa9894_rev1a_init[] =3D { + { 0x00, 0xa245 }, { 0x01, 0x15da }, { 0x02, 0x5288 }, + { 0x52, 0xbe17 }, { 0x53, 0x0dbe }, { 0x56, 0x05c3 }, + { 0x57, 0x0344 }, { 0x61, 0x0032 }, { 0x71, 0x00cf }, + { 0x72, 0x34a9 }, { 0x73, 0x38c8 }, { 0x76, 0x0067 }, + { 0x80, 0x0000 }, { 0x81, 0x5799 }, { 0x82, 0x0104 }, +}; + +static const struct reg_sequence tfa9894_rev2a_init[] =3D { + { 0x01, 0x15da }, { 0x02, 0x51e8 }, { 0x04, 0x0200 }, + { 0x52, 0xbe17 }, { 0x53, 0x0dbe }, { 0x57, 0x0344 }, + { 0x61, 0x0032 }, { 0x71, 0x6ecf }, { 0x72, 0xb4a9 }, + { 0x73, 0x38c8 }, { 0x76, 0x0067 }, { 0x80, 0x0000 }, + { 0x81, 0x5799 }, { 0x82, 0x0104 }, +}; + +static const struct tfa98xx_rev tfa9894_revs[] =3D { + { 0x0a94, tfa9894_rev0a_init, ARRAY_SIZE(tfa9894_rev0a_init) }, + { 0x1a94, tfa9894_rev1a_init, ARRAY_SIZE(tfa9894_rev1a_init) }, + { 0x2a94, tfa9894_rev2a_init, ARRAY_SIZE(tfa9894_rev2a_init) }, + { 0x3a94, tfa9894_rev2a_init, ARRAY_SIZE(tfa9894_rev2a_init) }, +}; + +static const struct tfa98xx_chip tfa9894_chip =3D { + .id =3D TFA9894_REVISION, + .revs =3D tfa9894_revs, + .num_revs =3D ARRAY_SIZE(tfa9894_revs), +}; + +static bool tfa98xx_volatile_reg(struct device *dev, unsigned int reg) +{ + return reg >=3D TFA98XX_STATUS_FIRST && reg <=3D TFA98XX_STATUS_LAST; +} + +static bool tfa98xx_writeable_reg(struct device *dev, unsigned int reg) +{ + return reg !=3D TFA98XX_REVISION && !tfa98xx_volatile_reg(dev, reg); +} + +static const struct regmap_config tfa98xx_regmap =3D { + .reg_bits =3D 8, + .val_bits =3D 16, + + .max_register =3D 0xff, + .writeable_reg =3D tfa98xx_writeable_reg, + .volatile_reg =3D tfa98xx_volatile_reg, + .cache_type =3D REGCACHE_MAPLE, +}; + +static const struct snd_soc_dapm_widget tfa98xx_dapm_widgets[] =3D { + SND_SOC_DAPM_OUTPUT("OUT"), + SND_SOC_DAPM_SUPPLY("POWER", TFA98XX_SYS_CTRL0, + TFA98XX_SYS_CTRL0_PWDN, 1, NULL, 0), + SND_SOC_DAPM_OUT_DRV("AMPE", TFA98XX_SYS_CTRL0, + TFA98XX_SYS_CTRL0_AMPE, 0, NULL, 0), + + SND_SOC_DAPM_AIF_IN("AIFIN", "HiFi Playback", 0, SND_SOC_NOPM, 0, 0), +}; + +static const struct snd_soc_dapm_route tfa98xx_dapm_routes[] =3D { + { "OUT", NULL, "AMPE" }, + { "AMPE", NULL, "POWER" }, + { "AMPE", NULL, "AIFIN" }, +}; + +static const struct snd_soc_component_driver tfa98xx_component =3D { + .dapm_widgets =3D tfa98xx_dapm_widgets, + .num_dapm_widgets =3D ARRAY_SIZE(tfa98xx_dapm_widgets), + .dapm_routes =3D tfa98xx_dapm_routes, + .num_dapm_routes =3D ARRAY_SIZE(tfa98xx_dapm_routes), + .use_pmdown_time =3D 1, + .endianness =3D 1, +}; + +/* Indexed by the AUDFS field value */ +static const unsigned int tfa98xx_rates[] =3D { + 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 +}; + +static int tfa98xx_find_sample_rate(unsigned int rate) +{ + int i; + + for (i =3D 0; i < ARRAY_SIZE(tfa98xx_rates); ++i) + if (tfa98xx_rates[i] =3D=3D rate) + return i; + + return -EINVAL; +} + +static int tfa98xx_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct snd_soc_component *component =3D dai->component; + unsigned int nbck, slotlen, samplesize; + int sr, ret; + + sr =3D tfa98xx_find_sample_rate(params_rate(params)); + if (sr < 0) + return sr; + + switch (params_width(params)) { + case 16: + /* 16-bit sample in a 16-bit slot, 32 BCK per frame */ + nbck =3D 0; + slotlen =3D 16 - 1; + samplesize =3D 16 - 1; + break; + case 24: + case 32: + /* 24-bit sample in a 32-bit slot, 64 BCK per frame */ + nbck =3D 2; + slotlen =3D 32 - 1; + samplesize =3D 24 - 1; + break; + default: + return -EINVAL; + } + + ret =3D snd_soc_component_update_bits(component, TFA98XX_AUDIO_CTRL, + TFA98XX_AUDIO_CTRL_AUDFS_MSK, + FIELD_PREP(TFA98XX_AUDIO_CTRL_AUDFS_MSK, sr)); + if (ret < 0) + return ret; + + /* The interface must be disabled while its framing is reprogrammed */ + ret =3D snd_soc_component_update_bits(component, TFA98XX_TDM_CFG0, + TFA98XX_TDM_CFG0_TDME, 0); + if (ret < 0) + return ret; + + ret =3D snd_soc_component_update_bits(component, TFA98XX_TDM_CFG1, + TFA98XX_TDM_CFG1_NBCK_MSK, + FIELD_PREP(TFA98XX_TDM_CFG1_NBCK_MSK, nbck)); + if (ret < 0) + return ret; + + ret =3D snd_soc_component_update_bits(component, TFA98XX_TDM_CFG2, + TFA98XX_TDM_CFG2_SLLN_MSK | + TFA98XX_TDM_CFG2_SSIZE_MSK, + FIELD_PREP(TFA98XX_TDM_CFG2_SLLN_MSK, slotlen) | + FIELD_PREP(TFA98XX_TDM_CFG2_SSIZE_MSK, samplesize)); + if (ret < 0) + return ret; + + return snd_soc_component_update_bits(component, TFA98XX_TDM_CFG0, + TFA98XX_TDM_CFG0_TDME, + TFA98XX_TDM_CFG0_TDME); +} + +static int tfa98xx_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) +{ + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_I2S: + case SND_SOC_DAIFMT_DSP_A: + break; + default: + return -EINVAL; + } + + if ((fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) !=3D SND_SOC_DAIFMT_CBC_CF= C) + return -EINVAL; + + return 0; +} + +static const struct snd_soc_dai_ops tfa98xx_dai_ops =3D { + .hw_params =3D tfa98xx_hw_params, + .set_fmt =3D tfa98xx_set_fmt, +}; + +static struct snd_soc_dai_driver tfa98xx_dai =3D { + .name =3D "tfa98xx-hifi", + .playback =3D { + .stream_name =3D "HiFi Playback", + .formats =3D SNDRV_PCM_FMTBIT_S16_LE | + SNDRV_PCM_FMTBIT_S24_LE | + SNDRV_PCM_FMTBIT_S32_LE, + .rates =3D SNDRV_PCM_RATE_8000_48000, + .rate_min =3D 8000, + .rate_max =3D 48000, + .channels_min =3D 1, + .channels_max =3D 2, + }, + .ops =3D &tfa98xx_dai_ops, +}; + +static int tfa98xx_init(struct regmap *regmap, const struct tfa98xx_rev *r= ev) +{ + int ret; + + /* The correction sequences touch registers behind the hide key */ + ret =3D regmap_write(regmap, TFA98XX_KEY1, TFA98XX_KEY1_UNHIDE); + if (ret) + return ret; + + ret =3D regmap_multi_reg_write(regmap, rev->init, rev->num_init); + if (ret) + return ret; + + ret =3D regmap_write(regmap, TFA98XX_KEY1, 0); + if (ret) + return ret; + + /* + * Bypass the CoolFlux DSP: without the vendor firmware container it has + * nothing to run. AMPC hands control over the amplifier to the DSP and + * is set out of reset, so it has to be cleared as well - otherwise AMPE + * has no effect and the amplifier stays silent. + */ + ret =3D regmap_clear_bits(regmap, TFA98XX_SYS_CTRL0, + BIT(TFA98XX_SYS_CTRL0_CFE) | + BIT(TFA98XX_SYS_CTRL0_AMPC)); + if (ret) + return ret; + + /* Take the amplifier input straight from the TDM interface */ + ret =3D regmap_update_bits(regmap, TFA98XX_SYS_CTRL1, + TFA98XX_SYS_CTRL1_AMPINSEL_MSK, 0); + if (ret) + return ret; + + /* + * Tell the hardware manager that the I2C configuration is complete, + * otherwise it never leaves the wait-for-settings state. The amplifier + * stays powered down until DAPM clears PWDN. + */ + ret =3D regmap_set_bits(regmap, TFA98XX_SYS_CTRL1, + TFA98XX_SYS_CTRL1_MANSCONF); + if (ret) + return ret; + + /* Route slot 0 of the TDM frame into the amplifier */ + ret =3D regmap_update_bits(regmap, TFA98XX_TDM_CFG3, + TFA98XX_TDM_CFG3_SPKS_MSK, + FIELD_PREP(TFA98XX_TDM_CFG3_SPKS_MSK, 0)); + if (ret) + return ret; + + return regmap_set_bits(regmap, TFA98XX_TDM_CFG0, + TFA98XX_TDM_CFG0_TDMSPKE); +} + +static int tfa98xx_i2c_probe(struct i2c_client *i2c) +{ + struct device *dev =3D &i2c->dev; + const struct tfa98xx_chip *chip; + struct gpio_desc *reset_gpiod; + struct tfa98xx *tfa98xx; + unsigned int rev, i; + int ret; + + chip =3D i2c_get_match_data(i2c); + if (!chip) + return -EINVAL; + + tfa98xx =3D devm_kzalloc(dev, sizeof(*tfa98xx), GFP_KERNEL); + if (!tfa98xx) + return -ENOMEM; + + tfa98xx->regmap =3D devm_regmap_init_i2c(i2c, &tfa98xx_regmap); + if (IS_ERR(tfa98xx->regmap)) + return dev_err_probe(dev, PTR_ERR(tfa98xx->regmap), + "Failed to initialize regmap\n"); + + i2c_set_clientdata(i2c, tfa98xx); + + reset_gpiod =3D devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); + if (IS_ERR(reset_gpiod)) + return dev_err_probe(dev, PTR_ERR(reset_gpiod), + "Failed to get reset GPIO\n"); + + if (reset_gpiod) { + fsleep(1000); + gpiod_set_value_cansleep(reset_gpiod, 0); + fsleep(1000); + } + + ret =3D regmap_read(tfa98xx->regmap, TFA98XX_REVISION, &rev); + if (ret) + return dev_err_probe(dev, ret, + "Failed to read revision register\n"); + + if (FIELD_GET(TFA98XX_REVISION_ID_MSK, rev) !=3D chip->id) + return dev_err_probe(dev, -ENODEV, + "Unexpected device revision 0x%04x\n", rev); + + for (i =3D 0; i < chip->num_revs; i++) + if (chip->revs[i].rev =3D=3D rev) + break; + + if (i =3D=3D chip->num_revs) + return dev_err_probe(dev, -ENODEV, + "Unsupported die revision 0x%04x\n", rev); + + ret =3D tfa98xx_init(tfa98xx->regmap, &chip->revs[i]); + if (ret) + return dev_err_probe(dev, ret, "Failed to initialize device\n"); + + return devm_snd_soc_register_component(dev, &tfa98xx_component, + &tfa98xx_dai, 1); +} + +static const struct i2c_device_id tfa98xx_i2c_id[] =3D { + { "tfa9894", (kernel_ulong_t)&tfa9894_chip }, + { } +}; +MODULE_DEVICE_TABLE(i2c, tfa98xx_i2c_id); + +static const struct of_device_id tfa98xx_of_match[] =3D { + { .compatible =3D "nxp,tfa9894", .data =3D &tfa9894_chip }, + { } +}; +MODULE_DEVICE_TABLE(of, tfa98xx_of_match); + +static struct i2c_driver tfa98xx_i2c_driver =3D { + .driver =3D { + .name =3D "tfa98xx", + .of_match_table =3D tfa98xx_of_match, + }, + .probe =3D tfa98xx_i2c_probe, + .id_table =3D tfa98xx_i2c_id, +}; +module_i2c_driver(tfa98xx_i2c_driver); + +MODULE_DESCRIPTION("ASoC NXP/Goodix TFA98xx (TFA2) amplifier driver"); +MODULE_AUTHOR("David Heidelberg "); +MODULE_LICENSE("GPL"); --=20 2.53.0 From nobody Fri Oct 2 10:08:42 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 943B137FF71; Sun, 2 Aug 2026 12:42:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785674567; cv=none; b=SXxAUix3Qaa4iOIA+eQ9ITqI4OG7t4YTWL8R349aY06S9qJRUA/ugIn1LUu9O/TIDlm/hdHLtVy3yJViwyYL5gbH8QmURTUC9sYVdEw4+29vhCwg2bv4Ni9RhOn5l6itNINTSSthLPcWENxfgdaGCWNoAdMnOafVsFly1dk/zGg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785674567; c=relaxed/simple; bh=4B6gKl6L4B5cbSfsMIHj7jK5v5UehpJ/1gfsYkUJPQo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GxBQbZmSCAU7o2loY8zPsMLfPynpPCxem40r19fD8rm6PE0vun1SedUcLKW22hbOdjtZmLiOn4nfjuKSmwFdy6OSW0I8sUieDGHyrUFlMr3KIPgT4wN083lLrRVHBEx4gfNiR79vr6tYPExRl/evPbWOn5dmMRCEv3RrZF4uIA8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=h78AXXQC; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="h78AXXQC" Received: by smtp.kernel.org (Postfix) with ESMTPS id 35688C2BCFB; Sun, 2 Aug 2026 12:42:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1785674567; bh=4B6gKl6L4B5cbSfsMIHj7jK5v5UehpJ/1gfsYkUJPQo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=h78AXXQCCWo8ayi4+958/tHY2LdLJ18s8orQfbRjIiLpE3wVwCqUrREzSCkrb7Q9W ZInPMzeamz6gMr4jWsE+vlwYDv4bi0I4CaVNRX3F5sBFEDEnI825/ayPJw9nnoZz4P 3ChaMMii2iIsHddTiaCygLH4/cD4+iFp0WmZWvWXNnqRbJkM3457G2LvVfwqOKG1IT LgI4JRi2L54+XoicrMLTnc0tjbG5qpD0xA6qEB07nliv4VYSV3M7lEpTVBEjp5uQVy 6O1t2jPIiCPx2NdZTFjmd9XJAqt35oh7LnOBKbL6u680Qu6t7v4j8uf2Th4HR3k3h0 3BJoJxinIXpDg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 15C75C55162; Sun, 2 Aug 2026 12:42:47 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Sun, 02 Aug 2026 14:42:42 +0200 Subject: [PATCH RFC 3/3] arm64: dts: qcom: sdm845-oneplus-fajita: Enable speaker 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: <20260802-tfa98xx-upstream-v1-3-4dd55cdd658a@ixit.cz> References: <20260802-tfa98xx-upstream-v1-0-4dd55cdd658a@ixit.cz> In-Reply-To: <20260802-tfa98xx-upstream-v1-0-4dd55cdd658a@ixit.cz> To: Liam Girdwood , Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jaroslav Kysela , Takashi Iwai , Bjorn Andersson , Konrad Dybcio Cc: linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, phone-devel@vger.kernel.org, David Heidelberg X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1636; i=david@ixit.cz; h=from:subject:message-id; bh=jfc8/ssQ2PwWrFcsQPsWbLM3HVG5aaZh0yH7VMAE9ek=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBqbztF/6V6YQjlQWKENweA8e5wnpFz2pRL0gABo dwJeCYJgvKJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCam87RQAKCRBgAj/E00kg cr3IEACX+Q7zD82+2I8YuD02BBGDQyaEHjodKUiZBChlOvJmhsdvK4GwmGRTn501vqrnD4taycD lwcSH8jzYADB94qysIuNbw1cMGJA8QuCYasa9wfDLpGLKXWnt5wSKmhzZB/ESoMO2bnXKoHX58Q b4i49dzobd31gFjfLysbp79Xk989pqUGk/D99BfFmBrMovSDWgy4mh0vz2hAV0a9kJr1FtKTdiK KbmLXHWES3DpmjlSzFQPUWnyd7+paMHySe/rEe7mPlwWZcWK1VIPA57aWSddRXx+RHD32pBC+F/ LyOfIOLs0qkTI9wHuJnb8wwmNu3Chj2I0cc1uYVmJSQlDm8zP2Wl0FDAoQNyyORosNlT2JhF4Z3 Dg10IZ5d6afohpuqZJSS4Hou1VOmn61in2j/v69znKYX46QHLGdwUpEGrz1T0aUPyl8t48Jat0U SjnpPFQbdmQvYPlCsM4KxEDODAPfl+GhxDa894ppdcZHjjjTzwESA266cCcH44bT62ofuNuS20G Wrntx+M/YDpkfTKKCRIYtdbQE8ICL7sx9nk8Y2s9+t+WNdChVF+Vw/FI3FNu8Y5Wf/7Psq6f/XV UrawLiaSL7QFQMWBWboaKM49xrQax+/L8euU2Om93s0Npo6uGcQcZBFcrfkf2J+AGw9MPB8MKbZ RJfhKVGcVLJYoQA== X-Developer-Key: i=david@ixit.cz; a=openpgp; fpr=D77A09CFEEDC2BBD53A7047460023FC4D3492072 X-Endpoint-Received: by B4 Relay for david@ixit.cz/default with auth_id=355 X-Original-From: David Heidelberg Reply-To: david@ixit.cz From: David Heidelberg OnePlus 6 uses NXP TFA9894 audio codec. Enable it. Signed-off-by: David Heidelberg --- arch/arm64/boot/dts/qcom/sdm845-oneplus-fajita.dts | 22 +++++++++++++++---= ---- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/sdm845-oneplus-fajita.dts b/arch/arm6= 4/boot/dts/qcom/sdm845-oneplus-fajita.dts index 0542333a83579..cb08aab4740a4 100644 --- a/arch/arm64/boot/dts/qcom/sdm845-oneplus-fajita.dts +++ b/arch/arm64/boot/dts/qcom/sdm845-oneplus-fajita.dts @@ -35,17 +35,26 @@ &display_panel { compatible =3D "samsung,s6e3fc2x01-ams641rw", "samsung,s6e3fc2x01"; }; =20 &framebuffer { height =3D <2340>; }; =20 &i2c4 { - /* nxp,tfa9894 @ 0x34 */ + clock-frequency =3D <400000>; + + status =3D "okay"; + + tfa9894_codec: audio-codec@34 { + compatible =3D "nxp,tfa9894"; + reg =3D <0x34>; + reset-gpios =3D <&tlmm 69 GPIO_ACTIVE_HIGH>; + #sound-dai-cells =3D <0>; + }; }; =20 &bq27441_fg { monitored-battery =3D <&battery>; }; =20 &sound { model =3D "OnePlus 6T"; @@ -56,22 +65,21 @@ &sound { "AMIC4", "MIC BIAS1", "AMIC5", "MIC BIAS3"; }; =20 &pmi8998_charger { monitored-battery =3D <&battery>; }; =20 -/* - * The TFA9894 codec is currently unsupported. - * We need to delete the node to allow the soundcard - * to probe for headphones/earpiece. - */ -/delete-node/ &speaker_playback_dai; +&speaker_playback_dai { + codec { + sound-dai =3D <&tfa9894_codec>; + }; +}; =20 &rmi4_f12 { touchscreen-y-mm =3D <148>; }; =20 &wcd9340 { qcom,micbias1-microvolt =3D <2700000>; qcom,micbias2-microvolt =3D <2700000>; --=20 2.53.0