mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 04:13:31 +00:00
162 lines
4.5 KiB
Diff
162 lines
4.5 KiB
Diff
From 11d06018fefa454eff591ade9181e20a23acff48 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Martin=20Povi=C5=A1er?= <povik+lin@cutebit.org>
|
|
Date: Fri, 11 Mar 2022 11:55:44 +0100
|
|
Subject: [PATCH 081/171] ASoC: tas2764: Extend driver to SN012776
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
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.
|
|
|
|
Signed-off-by: Martin Povišer <povik+lin@cutebit.org>
|
|
---
|
|
sound/soc/codecs/tas2764.c | 51 ++++++++++++++++++++++++++++++++++----
|
|
sound/soc/codecs/tas2764.h | 3 +++
|
|
2 files changed, 49 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/sound/soc/codecs/tas2764.c b/sound/soc/codecs/tas2764.c
|
|
index 4cb788f3e5f7..dd36c99e633b 100644
|
|
--- a/sound/soc/codecs/tas2764.c
|
|
+++ b/sound/soc/codecs/tas2764.c
|
|
@@ -16,6 +16,7 @@
|
|
#include <linux/regmap.h>
|
|
#include <linux/of.h>
|
|
#include <linux/of_gpio.h>
|
|
+#include <linux/of_device.h>
|
|
#include <linux/slab.h>
|
|
#include <sound/soc.h>
|
|
#include <sound/pcm.h>
|
|
@@ -25,13 +26,20 @@
|
|
|
|
#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;
|
|
struct gpio_desc *sdz_gpio;
|
|
struct regmap *regmap;
|
|
struct device *dev;
|
|
-
|
|
+
|
|
+ enum tas2764_devid devid;
|
|
+
|
|
int v_sense_slot;
|
|
int i_sense_slot;
|
|
};
|
|
@@ -502,10 +510,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;
|
|
|
|
@@ -532,6 +546,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;
|
|
}
|
|
|
|
@@ -631,9 +662,12 @@ 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;
|
|
+ const struct of_device_id *of_id = NULL;
|
|
int result;
|
|
|
|
tas2764 = devm_kzalloc(&client->dev, sizeof(struct tas2764_priv),
|
|
@@ -641,6 +675,14 @@ static int tas2764_i2c_probe(struct i2c_client *client)
|
|
if (!tas2764)
|
|
return -ENOMEM;
|
|
|
|
+ if (client->dev.of_node)
|
|
+ of_id = of_match_device(tas2764_of_match, &client->dev);
|
|
+
|
|
+ if (of_id)
|
|
+ tas2764->devid = (enum tas2764_devid) of_id->data;
|
|
+ else
|
|
+ tas2764->devid = DEVID_TAS2764;
|
|
+
|
|
tas2764->dev = &client->dev;
|
|
i2c_set_clientdata(client, tas2764);
|
|
dev_set_drvdata(&client->dev, tas2764);
|
|
@@ -674,13 +716,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", .data = (void*) DEVID_TAS2764 },
|
|
+ { .compatible = "ti,sn012776", .data = (void*) DEVID_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 f015f22a083b..d7e171a9480c 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
|
|
@@ -87,4 +88,6 @@
|
|
#define TAS2764_TDM_CFG6_ISNS_ENABLE BIT(6)
|
|
#define TAS2764_TDM_CFG6_50_MASK GENMASK(5, 0)
|
|
|
|
+#define TAS2764_BOP_CFG0 TAS2764_REG(0X0, 0x1d)
|
|
+
|
|
#endif /* __TAS2764__ */
|
|
--
|
|
2.34.1
|
|
|