summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Yu <jack.yu@realtek.com>2026-07-16 14:15:36 +0800
committerMark Brown <broonie@kernel.org>2026-07-30 13:26:07 +0100
commitef9c8eb307046afa797befd84e6c741cd8954dfc (patch)
tree97096fae83ce598d737f46afee0d1f4e6b8db165
parent522d7baa39e913700782cd22514ec04ac80ca036 (diff)
ASoC: rt1320-sdw: Add settings to support more base clock frequency
Add settings to support more base clock frequency on different platform. Signed-off-by: Jack Yu <jack.yu@realtek.com> Link: https://patch.msgid.link/20260716061536.1563252-1-jack.yu@realtek.com Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/codecs/rt1320-sdw.c36
-rw-r--r--sound/soc/codecs/rt1320-sdw.h7
2 files changed, 42 insertions, 1 deletions
diff --git a/sound/soc/codecs/rt1320-sdw.c b/sound/soc/codecs/rt1320-sdw.c
index a30fb575918d..3a5eebcfefdd 100644
--- a/sound/soc/codecs/rt1320-sdw.c
+++ b/sound/soc/codecs/rt1320-sdw.c
@@ -836,6 +836,7 @@ static const struct reg_default rt1320_mbq_defaults[] = {
static bool rt1320_readable_register(struct device *dev, unsigned int reg)
{
switch (reg) {
+ case 0x004d:
case 0xc000 ... 0xc086:
case 0xc400 ... 0xc409:
case 0xc480 ... 0xc48f:
@@ -946,6 +947,7 @@ static bool rt1320_readable_register(struct device *dev, unsigned int reg)
static bool rt1320_volatile_register(struct device *dev, unsigned int reg)
{
switch (reg) {
+ case 0x004d:
case 0xc000:
case 0xc003:
case 0xc081:
@@ -3383,6 +3385,37 @@ static int rt1320_sdw_pcm_hw_free(struct snd_pcm_substream *substream,
return 0;
}
+static int rt1320_bus_config(struct sdw_slave *slave,
+ struct sdw_bus_params *params)
+{
+ struct rt1320_sdw_priv *rt1320 = dev_get_drvdata(&slave->dev);
+ unsigned int clk_base;
+
+ regmap_read(rt1320->regmap, 0x004d, &clk_base);
+ dev_dbg(&rt1320->sdw_slave->dev, "%s clk_base=%x", __func__, clk_base);
+
+ switch (clk_base) {
+ case RT1320_CLK_FREQ_19_2_MHZ:
+ case RT1320_CLK_FREQ_24MHZ:
+ regmap_write(rt1320->regmap, 0xc600, 0x04);
+ regmap_write(rt1320->regmap, 0xc601, 0x83);
+ regmap_write(rt1320->regmap, 0xc602, 0x1f);
+ regmap_write(rt1320->regmap, 0xc603, 0x40);
+ break;
+ case RT1320_CLK_FREQ_24_576MHZ:
+ case RT1320_CLK_FREQ_22_5792MHZ:
+ regmap_write(rt1320->regmap, 0xc600, 0x07);
+ regmap_write(rt1320->regmap, 0xc601, 0x80);
+ regmap_write(rt1320->regmap, 0xc602, 0x0f);
+ regmap_write(rt1320->regmap, 0xc603, 0x40);
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
/*
* slave_ops: callbacks for get_clock_stop_mode, clock_stop and
* port_prep are not defined for now
@@ -3390,12 +3423,13 @@ static int rt1320_sdw_pcm_hw_free(struct snd_pcm_substream *substream,
static const struct sdw_slave_ops rt1320_slave_ops = {
.read_prop = rt1320_read_prop,
.update_status = rt1320_update_status,
+ .bus_config = rt1320_bus_config,
};
static int rt1320_sdw_component_probe(struct snd_soc_component *component)
{
- int ret;
struct rt1320_sdw_priv *rt1320 = snd_soc_component_get_drvdata(component);
+ int ret;
rt1320->component = component;
diff --git a/sound/soc/codecs/rt1320-sdw.h b/sound/soc/codecs/rt1320-sdw.h
index bc0f78e03529..df9ccdf92d36 100644
--- a/sound/soc/codecs/rt1320-sdw.h
+++ b/sound/soc/codecs/rt1320-sdw.h
@@ -175,6 +175,13 @@ enum rt1320_rw_type {
RT1320_PARAM_READ = 3,
};
+enum {
+ RT1320_CLK_FREQ_19_2_MHZ = 1,
+ RT1320_CLK_FREQ_24MHZ = 2,
+ RT1320_CLK_FREQ_24_576MHZ = 3,
+ RT1320_CLK_FREQ_22_5792MHZ = 4,
+};
+
struct rt1320_sdw_priv {
struct snd_soc_component *component;
struct regmap *regmap;