devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: James Calligeros <jcalligeros99@gmail.com>
To: Liam Girdwood <lgirdwood@gmail.com>,
	Mark Brown <broonie@kernel.org>,
	 Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>,
	 Shenghao Ding <shenghao-ding@ti.com>, Kevin Lu <kevin-lu@ti.com>,
	 Baojun Xu <baojun.xu@ti.com>, Dan Murphy <dmurphy@ti.com>,
	 Rob Herring <robh@kernel.org>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	 Conor Dooley <conor+dt@kernel.org>,
	Shi Fu <shifu0704@thundersoft.com>
Cc: "Alyssa Rosenzweig" <alyssa@rosenzweig.io>,
	"Martin Povišer" <povik+lin@cutebit.org>,
	"Hector Martin" <marcan@marcan.st>,
	linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org,
	devicetree@vger.kernel.org, asahi@lists.linux.dev,
	"James Calligeros" <jcalligeros99@gmail.com>
Subject: [PATCH 03/27] ASoC: tas2764: Extend driver to SN012776
Date: Sat, 15 Feb 2025 10:02:36 +1000	[thread overview]
Message-ID: <20250215-apple-codec-changes-v1-3-723569b21b19@gmail.com> (raw)
In-Reply-To: <20250215-apple-codec-changes-v1-0-723569b21b19@gmail.com>

From: Martin Povišer <povik+lin@cutebit.org>

SN012776 is a speaker amp chip found in Apple's 2021 laptops. It appears
similar and more-or-less compatible to TAS2764. Extend the TAS2764
driver with some SN012776 specifics and configure the chip assuming
it's in one of the Apple machines.

This driver already partially depended on CONFIG_OF/Devicetree, so
drop the pretence that it doesn't, too.

Signed-off-by: Martin Povišer <povik+lin@cutebit.org>
Signed-off-by: James Calligeros <jcalligeros99@gmail.com>
---
 sound/soc/codecs/Kconfig   |  1 +
 sound/soc/codecs/tas2764.c | 46 ++++++++++++++++++++++---
 sound/soc/codecs/tas2764.h |  3 ++
 3 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index ee35f3aa55216534037257b45f405a2af06c4872..0636b1f7a178a9ed8050e1567c18b94d446ac564 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -1965,6 +1965,7 @@ config SND_SOC_TAS2562
 config SND_SOC_TAS2764
 	tristate "Texas Instruments TAS2764 Mono Audio amplifier"
 	depends on I2C
+	depends on OF
 
 config SND_SOC_TAS2770
 	tristate "Texas Instruments TAS2770 speaker amplifier"
diff --git a/sound/soc/codecs/tas2764.c b/sound/soc/codecs/tas2764.c
index d482cd194c08c5c443b82c665de7a6d96531ef2e..e04b8ecab819402b8c3d2b81a2a447730802e968 100644
--- a/sound/soc/codecs/tas2764.c
+++ b/sound/soc/codecs/tas2764.c
@@ -14,6 +14,7 @@
 #include <linux/regulator/consumer.h>
 #include <linux/regmap.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/slab.h>
 #include <sound/soc.h>
 #include <sound/pcm.h>
@@ -23,6 +24,11 @@
 
 #include "tas2764.h"
 
+enum tas2764_devid {
+	DEVID_TAS2764  = 0,
+	DEVID_SN012776 = 1
+};
+
 struct tas2764_priv {
 	struct snd_soc_component *component;
 	struct gpio_desc *reset_gpio;
@@ -30,7 +36,8 @@ struct tas2764_priv {
 	struct regmap *regmap;
 	struct device *dev;
 	int irq;
-	
+	enum tas2764_devid devid;
+
 	int v_sense_slot;
 	int i_sense_slot;
 
@@ -526,10 +533,16 @@ static struct snd_soc_dai_driver tas2764_dai_driver[] = {
 	},
 };
 
+static uint8_t sn012776_bop_presets[] = {
+	0x01, 0x32, 0x02, 0x22, 0x83, 0x2d, 0x80, 0x02, 0x06,
+	0x32, 0x46, 0x30, 0x02, 0x06, 0x38, 0x40, 0x30, 0x02,
+	0x06, 0x3e, 0x37, 0x30, 0xff, 0xe6
+};
+
 static int tas2764_codec_probe(struct snd_soc_component *component)
 {
 	struct tas2764_priv *tas2764 = snd_soc_component_get_drvdata(component);
-	int ret;
+	int ret, i;
 
 	tas2764->component = component;
 
@@ -578,6 +591,23 @@ static int tas2764_codec_probe(struct snd_soc_component *component)
 	if (ret < 0)
 		return ret;
 
+	if (tas2764->devid == DEVID_SN012776) {
+		ret = snd_soc_component_update_bits(component, TAS2764_PWR_CTRL,
+					TAS2764_PWR_CTRL_BOP_SRC,
+					TAS2764_PWR_CTRL_BOP_SRC);
+		if (ret < 0)
+			return ret;
+
+		for (i = 0; i < ARRAY_SIZE(sn012776_bop_presets); i++) {
+			ret = snd_soc_component_write(component,
+						TAS2764_BOP_CFG0 + i,
+						sn012776_bop_presets[i]);
+
+			if (ret < 0)
+				return ret;
+		}
+	}
+
 	return 0;
 }
 
@@ -697,6 +727,8 @@ static int tas2764_parse_dt(struct device *dev, struct tas2764_priv *tas2764)
 	return 0;
 }
 
+static const struct of_device_id tas2764_of_match[];
+
 static int tas2764_i2c_probe(struct i2c_client *client)
 {
 	struct tas2764_priv *tas2764;
@@ -707,6 +739,11 @@ static int tas2764_i2c_probe(struct i2c_client *client)
 	if (!tas2764)
 		return -ENOMEM;
 
+	if (device_is_compatible(&client->dev, "ti,sn012776"))
+		tas2764->devid = DEVID_SN012776;
+	else
+		tas2764->devid = DEVID_TAS2764;
+
 	tas2764->dev = &client->dev;
 	tas2764->irq = client->irq;
 	i2c_set_clientdata(client, tas2764);
@@ -741,13 +778,12 @@ static const struct i2c_device_id tas2764_i2c_id[] = {
 };
 MODULE_DEVICE_TABLE(i2c, tas2764_i2c_id);
 
-#if defined(CONFIG_OF)
 static const struct of_device_id tas2764_of_match[] = {
-	{ .compatible = "ti,tas2764" },
+	{ .compatible = "ti,tas2764",  },
+	{ .compatible = "ti,sn012776", },
 	{},
 };
 MODULE_DEVICE_TABLE(of, tas2764_of_match);
-#endif
 
 static struct i2c_driver tas2764_i2c_driver = {
 	.driver = {
diff --git a/sound/soc/codecs/tas2764.h b/sound/soc/codecs/tas2764.h
index 168af772a898ffd1c5e96c50df77ff6225f704cd..0a40166040e7e877ca5d23db6cb65531af12c40b 100644
--- a/sound/soc/codecs/tas2764.h
+++ b/sound/soc/codecs/tas2764.h
@@ -29,6 +29,7 @@
 #define TAS2764_PWR_CTRL_ACTIVE		0x0
 #define TAS2764_PWR_CTRL_MUTE		BIT(0)
 #define TAS2764_PWR_CTRL_SHUTDOWN	BIT(1)
+#define TAS2764_PWR_CTRL_BOP_SRC	BIT(7)
 
 #define TAS2764_VSENSE_POWER_EN		3
 #define TAS2764_ISENSE_POWER_EN		4
@@ -110,4 +111,6 @@
 #define TAS2764_INT_CLK_CFG             TAS2764_REG(0x0, 0x5c)
 #define TAS2764_INT_CLK_CFG_IRQZ_CLR    BIT(2)
 
+#define TAS2764_BOP_CFG0                TAS2764_REG(0X0, 0x1d)
+
 #endif /* __TAS2764__ */

-- 
2.48.1


  parent reply	other threads:[~2025-02-15  0:03 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-15  0:02 [PATCH 00/27] ASoC: tas27{64,70}: improve support for Apple codec variants James Calligeros
2025-02-15  0:02 ` [PATCH 01/27] ASoC: dt-bindings: tas27xx: add compatible for SN012776 James Calligeros
2025-02-15  0:02 ` [PATCH 02/27] ASoC: dt-bindings: tas2770: add compatible for TAS5770L James Calligeros
2025-02-15  0:02 ` James Calligeros [this message]
2025-02-16 22:58   ` [PATCH 03/27] ASoC: tas2764: Extend driver to SN012776 Alyssa Rosenzweig
2025-02-16 23:54     ` Mark Brown
2025-02-15  0:02 ` [PATCH 04/27] ASoC: tas2764: Add control concerning overcurrent events James Calligeros
2025-02-15  0:16   ` Martin Povišer
2025-02-15  0:02 ` [PATCH 05/27] ASoC: tas2770: Factor out set_ivsense_slots James Calligeros
2025-02-15  0:02 ` [PATCH 06/27] ASoC: tas2770: Fix and redo I/V sense TDM slot setting logic James Calligeros
2025-02-15  0:02 ` [PATCH 07/27] ASoC: tas2764: Reinit cache on part reset James Calligeros
2025-02-15  0:02 ` [PATCH 08/27] ASoC: tas2764: Configure zeroing of SDOUT slots James Calligeros
2025-02-15  0:02 ` [PATCH 09/27] ASoC: tas2764: Apply Apple quirks James Calligeros
2025-02-16 23:01   ` Alyssa Rosenzweig
2025-02-15  0:02 ` [PATCH 10/27] ASoC: tas2764: Raise regmap range maximum James Calligeros
2025-02-15  0:02 ` [PATCH 11/27] ASoC: tas2770: Export 'die_temp' to sysfs James Calligeros
2025-02-16 23:56   ` Mark Brown
2025-02-15  0:02 ` [PATCH 12/27] ASoC: tas2764: " James Calligeros
2025-02-15  0:02 ` [PATCH 13/27] ASoC: tas2764: Crop SDOUT zero-out mask based on BCLK ratio James Calligeros
2025-02-15  0:02 ` [PATCH 14/27] ASoC: tas2764: Enable main IRQs James Calligeros
2025-02-15  0:02 ` [PATCH 15/27] ASoC: tas2764: Power up/down amp on mute ops James Calligeros
2025-02-15  0:02 ` [PATCH 16/27] ASoC: tas2764: Add SDZ regulator James Calligeros
2025-02-15  0:02 ` [PATCH 17/27] ASoC: tas2764: Add reg defaults for TAS2764_INT_CLK_CFG James Calligeros
2025-02-15  0:02 ` [PATCH 18/27] ASoC: tas2764: Mark SW_RESET as volatile James Calligeros
2025-02-15  0:02 ` [PATCH 19/27] ASoC: tas2764: Fix power control mask James Calligeros
2025-02-16 23:58   ` Mark Brown
2025-02-15  0:02 ` [PATCH 20/27] ASoC: tas2764: Wait for ramp-down after shutdown James Calligeros
2025-02-15  0:02 ` [PATCH 21/27] ASoC: tas2770: Add SDZ regulator James Calligeros
2025-02-15  0:02 ` [PATCH 22/27] ASoC: tas2770: Power cycle amp on ISENSE/VSENSE change James Calligeros
2025-02-15  0:02 ` [PATCH 23/27] ASoC: tas2770: Add zero-fill and pull-down controls James Calligeros
2025-02-15  0:02 ` [PATCH 24/27] ASoC: tas2770: Support setting the PDM TX slot James Calligeros
2025-02-15  0:02 ` [PATCH 25/27] ASoC: tas2770: Fix volume scale James Calligeros
2025-02-17  0:00   ` Mark Brown
2025-02-15  0:02 ` [PATCH 26/27] ASoC: tas2764: Set the SDOUT polarity correctly James Calligeros
2025-02-15  0:03 ` [PATCH 27/27] ASoC: tas2770: " James Calligeros
2025-02-15  0:39 ` [PATCH 00/27] ASoC: tas27{64,70}: improve support for Apple codec variants Neal Gompa
2025-02-16 23:03 ` Alyssa Rosenzweig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250215-apple-codec-changes-v1-3-723569b21b19@gmail.com \
    --to=jcalligeros99@gmail.com \
    --cc=alyssa@rosenzweig.io \
    --cc=asahi@lists.linux.dev \
    --cc=baojun.xu@ti.com \
    --cc=broonie@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=dmurphy@ti.com \
    --cc=kevin-lu@ti.com \
    --cc=krzk+dt@kernel.org \
    --cc=lgirdwood@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sound@vger.kernel.org \
    --cc=marcan@marcan.st \
    --cc=perex@perex.cz \
    --cc=povik+lin@cutebit.org \
    --cc=robh@kernel.org \
    --cc=shenghao-ding@ti.com \
    --cc=shifu0704@thundersoft.com \
    --cc=tiwai@suse.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).