Skip to content

Commit 8a6fd33

Browse files
AaronDotbroonie
authored andcommitted
ASoC: loongson: Combined regmap definitions
Previously, the regmap configuration for Loongson I2S controller was duplicated in both PCI and platform glue drivers. Move the common regmap configuration into the shared loongson_i2s.c to avoid code duplication and centralize register access handling. While moving, adjust the following: - Mark RX_DATA/TX_DATA/I2S_CTRL as volatile registers. The PCI version incorrectly marked CFG/CFG1 as volatile, which prevented proper regcache synchronization. - Change cache type from REGCACHE_FLAT to REGCACHE_MAPLE. The register map is sparse and the number of registers is small; MAPLE tree provides better scalability and is the recommended cache type for modern regmap users. Also, the following warning for the i2s_plat driver will be eliminated: loongson-i2s-plat loongson-i2s: using zero-initialized flat cache, this may cause unexpected behavior. Signed-off-by: Binbin Zhou <zhoubinbin@loongson.cn> Link: https://patch.msgid.link/e32d24479fc382dc3de6aded6351c13b43b6391d.1780304703.git.zhoubinbin@loongson.cn Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 90c6f9c commit 8a6fd33

4 files changed

Lines changed: 56 additions & 63 deletions

File tree

sound/soc/loongson/loongson_i2s.c

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ static int i2s_suspend(struct device *dev)
254254
struct loongson_i2s *i2s = dev_get_drvdata(dev);
255255

256256
regcache_cache_only(i2s->regmap, true);
257+
regcache_mark_dirty(i2s->regmap);
257258

258259
return 0;
259260
}
@@ -263,7 +264,7 @@ static int i2s_resume(struct device *dev)
263264
struct loongson_i2s *i2s = dev_get_drvdata(dev);
264265

265266
regcache_cache_only(i2s->regmap, false);
266-
regcache_mark_dirty(i2s->regmap);
267+
267268
return regcache_sync(i2s->regmap);
268269
}
269270

@@ -272,5 +273,58 @@ const struct dev_pm_ops loongson_i2s_pm = {
272273
};
273274
EXPORT_SYMBOL_GPL(loongson_i2s_pm);
274275

276+
static bool loongson_i2s_rd_reg(struct device *dev, unsigned int reg)
277+
{
278+
switch (reg) {
279+
case LS_I2S_VER:
280+
case LS_I2S_CFG:
281+
case LS_I2S_CTRL:
282+
case LS_I2S_RX_DATA:
283+
case LS_I2S_TX_DATA:
284+
case LS_I2S_CFG1:
285+
return true;
286+
default:
287+
return false;
288+
};
289+
}
290+
291+
static bool loongson_i2s_wr_reg(struct device *dev, unsigned int reg)
292+
{
293+
switch (reg) {
294+
case LS_I2S_CFG:
295+
case LS_I2S_CTRL:
296+
case LS_I2S_RX_DATA:
297+
case LS_I2S_TX_DATA:
298+
case LS_I2S_CFG1:
299+
return true;
300+
default:
301+
return false;
302+
};
303+
}
304+
305+
static bool loongson_i2s_volatile_reg(struct device *dev, unsigned int reg)
306+
{
307+
switch (reg) {
308+
case LS_I2S_CTRL:
309+
case LS_I2S_RX_DATA:
310+
case LS_I2S_TX_DATA:
311+
return true;
312+
default:
313+
return false;
314+
};
315+
}
316+
317+
const struct regmap_config loongson_i2s_regmap_config = {
318+
.reg_bits = 32,
319+
.reg_stride = 4,
320+
.val_bits = 32,
321+
.max_register = LS_I2S_CFG1,
322+
.readable_reg = loongson_i2s_rd_reg,
323+
.writeable_reg = loongson_i2s_wr_reg,
324+
.volatile_reg = loongson_i2s_volatile_reg,
325+
.cache_type = REGCACHE_MAPLE,
326+
};
327+
EXPORT_SYMBOL_GPL(loongson_i2s_regmap_config);
328+
275329
MODULE_LICENSE("GPL");
276330
MODULE_DESCRIPTION("Common functions for loongson I2S controller driver");

sound/soc/loongson/loongson_i2s.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ struct loongson_i2s {
6565
u32 sysclk;
6666
};
6767

68+
extern const struct regmap_config loongson_i2s_regmap_config;
6869
extern const struct dev_pm_ops loongson_i2s_pm;
6970
extern struct snd_soc_dai_driver loongson_i2s_dai;
7071

sound/soc/loongson/loongson_i2s_pci.c

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -18,60 +18,6 @@
1818

1919
#define DRIVER_NAME "loongson-i2s-pci"
2020

21-
static bool loongson_i2s_wr_reg(struct device *dev, unsigned int reg)
22-
{
23-
switch (reg) {
24-
case LS_I2S_CFG:
25-
case LS_I2S_CTRL:
26-
case LS_I2S_RX_DATA:
27-
case LS_I2S_TX_DATA:
28-
case LS_I2S_CFG1:
29-
return true;
30-
default:
31-
return false;
32-
};
33-
}
34-
35-
static bool loongson_i2s_rd_reg(struct device *dev, unsigned int reg)
36-
{
37-
switch (reg) {
38-
case LS_I2S_VER:
39-
case LS_I2S_CFG:
40-
case LS_I2S_CTRL:
41-
case LS_I2S_RX_DATA:
42-
case LS_I2S_TX_DATA:
43-
case LS_I2S_CFG1:
44-
return true;
45-
default:
46-
return false;
47-
};
48-
}
49-
50-
static bool loongson_i2s_volatile_reg(struct device *dev, unsigned int reg)
51-
{
52-
switch (reg) {
53-
case LS_I2S_CFG:
54-
case LS_I2S_CTRL:
55-
case LS_I2S_RX_DATA:
56-
case LS_I2S_TX_DATA:
57-
case LS_I2S_CFG1:
58-
return true;
59-
default:
60-
return false;
61-
};
62-
}
63-
64-
static const struct regmap_config loongson_i2s_regmap_config = {
65-
.reg_bits = 32,
66-
.reg_stride = 4,
67-
.val_bits = 32,
68-
.max_register = LS_I2S_CFG1,
69-
.writeable_reg = loongson_i2s_wr_reg,
70-
.readable_reg = loongson_i2s_rd_reg,
71-
.volatile_reg = loongson_i2s_volatile_reg,
72-
.cache_type = REGCACHE_FLAT,
73-
};
74-
7521
static int loongson_i2s_pci_probe(struct pci_dev *pdev,
7622
const struct pci_device_id *pid)
7723
{

sound/soc/loongson/loongson_i2s_plat.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,6 @@ static const struct snd_soc_component_driver loongson_i2s_component_driver = {
8585
.open = loongson_pcm_open,
8686
};
8787

88-
static const struct regmap_config loongson_i2s_regmap_config = {
89-
.reg_bits = 32,
90-
.reg_stride = 4,
91-
.val_bits = 32,
92-
.max_register = 0x14,
93-
.cache_type = REGCACHE_FLAT,
94-
};
95-
9688
static int loongson_i2s_apbdma_config(struct platform_device *pdev)
9789
{
9890
int val;

0 commit comments

Comments
 (0)