Skip to content

Commit 8b22786

Browse files
Lucas Tanurebroonie
authored andcommitted
ASoC: cs35l41: Create shared function for errata patches
ASoC and HDA systems require the same errata patches, so move it to the shared code using a function the correctly applies the patches by revision Also, move CS35L41_DSP1_CCM_CORE_CTRL write to errata patch function as is required to be written at boot, but not in regmap_register_patch sequence as will affect waking up from hibernation Signed-off-by: Lucas Tanure <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 062ce05 commit 8b22786

File tree

3 files changed

+93
-89
lines changed

3 files changed

+93
-89
lines changed

include/sound/cs35l41.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -763,5 +763,6 @@ extern struct regmap_config cs35l41_regmap_i2c;
763763
extern struct regmap_config cs35l41_regmap_spi;
764764

765765
int cs35l41_otp_unpack(struct device *dev, struct regmap *regmap);
766+
int cs35l41_register_errata_patch(struct device *dev, struct regmap *reg, unsigned int reg_revid);
766767

767768
#endif /* __CS35L41_H */

sound/soc/codecs/cs35l41-lib.c

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,57 @@ static const struct cs35l41_otp_packed_element_t otp_map_2[CS35L41_NUM_OTP_ELEM]
659659
{ 0x00017044, 0, 24 }, /*LOT_NUMBER*/
660660
};
661661

662+
static const struct reg_sequence cs35l41_reva0_errata_patch[] = {
663+
{ 0x00000040, 0x00005555 },
664+
{ 0x00000040, 0x0000AAAA },
665+
{ 0x00003854, 0x05180240 },
666+
{ CS35L41_VIMON_SPKMON_RESYNC, 0x00000000 },
667+
{ 0x00004310, 0x00000000 },
668+
{ CS35L41_VPVBST_FS_SEL, 0x00000000 },
669+
{ CS35L41_OTP_TRIM_30, 0x9091A1C8 },
670+
{ 0x00003014, 0x0200EE0E },
671+
{ CS35L41_BSTCVRT_DCM_CTRL, 0x00000051 },
672+
{ 0x00000054, 0x00000004 },
673+
{ CS35L41_IRQ1_DB3, 0x00000000 },
674+
{ CS35L41_IRQ2_DB3, 0x00000000 },
675+
{ CS35L41_DSP1_YM_ACCEL_PL0_PRI, 0x00000000 },
676+
{ CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000 },
677+
{ 0x00000040, 0x0000CCCC },
678+
{ 0x00000040, 0x00003333 },
679+
{ CS35L41_PWR_CTRL2, 0x00000000 },
680+
{ CS35L41_AMP_GAIN_CTRL, 0x00000000 },
681+
};
682+
683+
static const struct reg_sequence cs35l41_revb0_errata_patch[] = {
684+
{ 0x00000040, 0x00005555 },
685+
{ 0x00000040, 0x0000AAAA },
686+
{ CS35L41_VIMON_SPKMON_RESYNC, 0x00000000 },
687+
{ 0x00004310, 0x00000000 },
688+
{ CS35L41_VPVBST_FS_SEL, 0x00000000 },
689+
{ CS35L41_BSTCVRT_DCM_CTRL, 0x00000051 },
690+
{ CS35L41_DSP1_YM_ACCEL_PL0_PRI, 0x00000000 },
691+
{ CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000 },
692+
{ 0x00000040, 0x0000CCCC },
693+
{ 0x00000040, 0x00003333 },
694+
{ CS35L41_PWR_CTRL2, 0x00000000 },
695+
{ CS35L41_AMP_GAIN_CTRL, 0x00000000 },
696+
};
697+
698+
static const struct reg_sequence cs35l41_revb2_errata_patch[] = {
699+
{ 0x00000040, 0x00005555 },
700+
{ 0x00000040, 0x0000AAAA },
701+
{ CS35L41_VIMON_SPKMON_RESYNC, 0x00000000 },
702+
{ 0x00004310, 0x00000000 },
703+
{ CS35L41_VPVBST_FS_SEL, 0x00000000 },
704+
{ CS35L41_BSTCVRT_DCM_CTRL, 0x00000051 },
705+
{ CS35L41_DSP1_YM_ACCEL_PL0_PRI, 0x00000000 },
706+
{ CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000 },
707+
{ 0x00000040, 0x0000CCCC },
708+
{ 0x00000040, 0x00003333 },
709+
{ CS35L41_PWR_CTRL2, 0x00000000 },
710+
{ CS35L41_AMP_GAIN_CTRL, 0x00000000 },
711+
};
712+
662713
static const struct cs35l41_otp_map_element_t cs35l41_otp_map_map[] = {
663714
{
664715
.id = 0x01,
@@ -845,6 +896,44 @@ int cs35l41_otp_unpack(struct device *dev, struct regmap *regmap)
845896
}
846897
EXPORT_SYMBOL_GPL(cs35l41_otp_unpack);
847898

899+
int cs35l41_register_errata_patch(struct device *dev, struct regmap *reg, unsigned int reg_revid)
900+
{
901+
char *rev;
902+
int ret;
903+
904+
switch (reg_revid) {
905+
case CS35L41_REVID_A0:
906+
ret = regmap_register_patch(reg, cs35l41_reva0_errata_patch,
907+
ARRAY_SIZE(cs35l41_reva0_errata_patch));
908+
rev = "A0";
909+
break;
910+
case CS35L41_REVID_B0:
911+
ret = regmap_register_patch(reg, cs35l41_revb0_errata_patch,
912+
ARRAY_SIZE(cs35l41_revb0_errata_patch));
913+
rev = "B0";
914+
break;
915+
case CS35L41_REVID_B2:
916+
ret = regmap_register_patch(reg, cs35l41_revb2_errata_patch,
917+
ARRAY_SIZE(cs35l41_revb2_errata_patch));
918+
rev = "B2";
919+
break;
920+
default:
921+
ret = -EINVAL;
922+
rev = "XX";
923+
break;
924+
}
925+
926+
if (ret)
927+
dev_err(dev, "Failed to apply %s errata patch: %d\n", rev, ret);
928+
929+
ret = regmap_write(reg, CS35L41_DSP1_CCM_CORE_CTRL, 0);
930+
if (ret < 0)
931+
dev_err(dev, "Write CCM_CORE_CTRL failed: %d\n", ret);
932+
933+
return ret;
934+
}
935+
EXPORT_SYMBOL_GPL(cs35l41_register_errata_patch);
936+
848937
MODULE_DESCRIPTION("CS35L41 library");
849938
MODULE_AUTHOR("David Rhodes, Cirrus Logic Inc, <[email protected]>");
850939
MODULE_AUTHOR("Lucas Tanure, Cirrus Logic Inc, <[email protected]>");

sound/soc/codecs/cs35l41.c

Lines changed: 3 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,57 +1271,6 @@ static int cs35l41_handle_pdata(struct device *dev,
12711271
return 0;
12721272
}
12731273

1274-
static const struct reg_sequence cs35l41_reva0_errata_patch[] = {
1275-
{ 0x00000040, 0x00005555 },
1276-
{ 0x00000040, 0x0000AAAA },
1277-
{ 0x00003854, 0x05180240 },
1278-
{ CS35L41_VIMON_SPKMON_RESYNC, 0x00000000 },
1279-
{ 0x00004310, 0x00000000 },
1280-
{ CS35L41_VPVBST_FS_SEL, 0x00000000 },
1281-
{ CS35L41_OTP_TRIM_30, 0x9091A1C8 },
1282-
{ 0x00003014, 0x0200EE0E },
1283-
{ CS35L41_BSTCVRT_DCM_CTRL, 0x00000051 },
1284-
{ 0x00000054, 0x00000004 },
1285-
{ CS35L41_IRQ1_DB3, 0x00000000 },
1286-
{ CS35L41_IRQ2_DB3, 0x00000000 },
1287-
{ CS35L41_DSP1_YM_ACCEL_PL0_PRI, 0x00000000 },
1288-
{ CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000 },
1289-
{ 0x00000040, 0x0000CCCC },
1290-
{ 0x00000040, 0x00003333 },
1291-
{ CS35L41_PWR_CTRL2, 0x00000000 },
1292-
{ CS35L41_AMP_GAIN_CTRL, 0x00000000 },
1293-
};
1294-
1295-
static const struct reg_sequence cs35l41_revb0_errata_patch[] = {
1296-
{ 0x00000040, 0x00005555 },
1297-
{ 0x00000040, 0x0000AAAA },
1298-
{ CS35L41_VIMON_SPKMON_RESYNC, 0x00000000 },
1299-
{ 0x00004310, 0x00000000 },
1300-
{ CS35L41_VPVBST_FS_SEL, 0x00000000 },
1301-
{ CS35L41_BSTCVRT_DCM_CTRL, 0x00000051 },
1302-
{ CS35L41_DSP1_YM_ACCEL_PL0_PRI, 0x00000000 },
1303-
{ CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000 },
1304-
{ 0x00000040, 0x0000CCCC },
1305-
{ 0x00000040, 0x00003333 },
1306-
{ CS35L41_PWR_CTRL2, 0x00000000 },
1307-
{ CS35L41_AMP_GAIN_CTRL, 0x00000000 },
1308-
};
1309-
1310-
static const struct reg_sequence cs35l41_revb2_errata_patch[] = {
1311-
{ 0x00000040, 0x00005555 },
1312-
{ 0x00000040, 0x0000AAAA },
1313-
{ CS35L41_VIMON_SPKMON_RESYNC, 0x00000000 },
1314-
{ 0x00004310, 0x00000000 },
1315-
{ CS35L41_VPVBST_FS_SEL, 0x00000000 },
1316-
{ CS35L41_BSTCVRT_DCM_CTRL, 0x00000051 },
1317-
{ CS35L41_DSP1_YM_ACCEL_PL0_PRI, 0x00000000 },
1318-
{ CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000 },
1319-
{ 0x00000040, 0x0000CCCC },
1320-
{ 0x00000040, 0x00003333 },
1321-
{ CS35L41_PWR_CTRL2, 0x00000000 },
1322-
{ CS35L41_AMP_GAIN_CTRL, 0x00000000 },
1323-
};
1324-
13251274
static const struct reg_sequence cs35l41_fs_errata_patch[] = {
13261275
{ CS35L41_DSP1_RX1_RATE, 0x00000001 },
13271276
{ CS35L41_DSP1_RX2_RATE, 0x00000001 },
@@ -1501,38 +1450,9 @@ int cs35l41_probe(struct cs35l41_private *cs35l41,
15011450
goto err;
15021451
}
15031452

1504-
switch (reg_revid) {
1505-
case CS35L41_REVID_A0:
1506-
ret = regmap_register_patch(cs35l41->regmap,
1507-
cs35l41_reva0_errata_patch,
1508-
ARRAY_SIZE(cs35l41_reva0_errata_patch));
1509-
if (ret < 0) {
1510-
dev_err(cs35l41->dev,
1511-
"Failed to apply A0 errata patch: %d\n", ret);
1512-
goto err;
1513-
}
1514-
break;
1515-
case CS35L41_REVID_B0:
1516-
ret = regmap_register_patch(cs35l41->regmap,
1517-
cs35l41_revb0_errata_patch,
1518-
ARRAY_SIZE(cs35l41_revb0_errata_patch));
1519-
if (ret < 0) {
1520-
dev_err(cs35l41->dev,
1521-
"Failed to apply B0 errata patch: %d\n", ret);
1522-
goto err;
1523-
}
1524-
break;
1525-
case CS35L41_REVID_B2:
1526-
ret = regmap_register_patch(cs35l41->regmap,
1527-
cs35l41_revb2_errata_patch,
1528-
ARRAY_SIZE(cs35l41_revb2_errata_patch));
1529-
if (ret < 0) {
1530-
dev_err(cs35l41->dev,
1531-
"Failed to apply B2 errata patch: %d\n", ret);
1532-
goto err;
1533-
}
1534-
break;
1535-
}
1453+
ret = cs35l41_register_errata_patch(cs35l41->dev, cs35l41->regmap, reg_revid);
1454+
if (ret)
1455+
goto err;
15361456

15371457
irq_pol = cs35l41_irq_gpio_config(cs35l41);
15381458

@@ -1556,12 +1476,6 @@ int cs35l41_probe(struct cs35l41_private *cs35l41,
15561476
goto err;
15571477
}
15581478

1559-
ret = regmap_write(cs35l41->regmap, CS35L41_DSP1_CCM_CORE_CTRL, 0);
1560-
if (ret < 0) {
1561-
dev_err(cs35l41->dev, "Write CCM_CORE_CTRL failed: %d\n", ret);
1562-
goto err;
1563-
}
1564-
15651479
ret = cs35l41_set_pdata(cs35l41);
15661480
if (ret < 0) {
15671481
dev_err(cs35l41->dev, "Set pdata failed: %d\n", ret);

0 commit comments

Comments
 (0)