Skip to content

Commit 8c0821c

Browse files
Stefan Bindingbroonie
authored andcommitted
ASoC: cs35l56: Add struct to index firmware registers
Firmware based registers may be different addresses across different device ids and revision ids. Create a structure to store and access these addresses. Signed-off-by: Stefan Binding <[email protected]> Reviewed-by: Richard Fitzgerald <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 9ea280f commit 8c0821c

File tree

9 files changed

+61
-13
lines changed

9 files changed

+61
-13
lines changed

include/sound/cs35l56.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,14 @@ struct cs35l56_spi_payload {
267267
} __packed;
268268
static_assert(sizeof(struct cs35l56_spi_payload) == 10);
269269

270+
struct cs35l56_fw_reg {
271+
unsigned int fw_ver;
272+
unsigned int halo_state;
273+
unsigned int pm_cur_stat;
274+
unsigned int prot_sts;
275+
unsigned int transducer_actual_ps;
276+
};
277+
270278
struct cs35l56_base {
271279
struct device *dev;
272280
struct regmap *regmap;
@@ -283,6 +291,7 @@ struct cs35l56_base {
283291
struct cirrus_amp_cal_data cal_data;
284292
struct gpio_desc *reset_gpio;
285293
struct cs35l56_spi_payload *spi_payload_buf;
294+
const struct cs35l56_fw_reg *fw_reg;
286295
};
287296

288297
static inline bool cs35l56_is_otp_register(unsigned int reg)
@@ -311,6 +320,8 @@ extern const struct regmap_config cs35l56_regmap_i2c;
311320
extern const struct regmap_config cs35l56_regmap_spi;
312321
extern const struct regmap_config cs35l56_regmap_sdw;
313322

323+
extern const struct cs35l56_fw_reg cs35l56_fw_reg;
324+
314325
extern const struct cirrus_amp_cal_controls cs35l56_calibration_controls;
315326

316327
extern const char * const cs35l56_tx_input_texts[CS35L56_NUM_INPUT_SRC];

sound/pci/hda/cs35l56_hda.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ static void cs35l56_hda_play(struct cs35l56_hda *cs35l56)
6868
if (ret == 0) {
6969
/* Wait for firmware to enter PS0 power state */
7070
ret = regmap_read_poll_timeout(cs35l56->base.regmap,
71-
CS35L56_TRANSDUCER_ACTUAL_PS,
71+
cs35l56->base.fw_reg->transducer_actual_ps,
7272
val, (val == CS35L56_PS0),
7373
CS35L56_PS0_POLL_US,
7474
CS35L56_PS0_TIMEOUT_US);
@@ -665,7 +665,8 @@ static void cs35l56_hda_fw_load(struct cs35l56_hda *cs35l56)
665665

666666
regcache_sync(cs35l56->base.regmap);
667667

668-
regmap_clear_bits(cs35l56->base.regmap, CS35L56_PROTECTION_STATUS,
668+
regmap_clear_bits(cs35l56->base.regmap,
669+
cs35l56->base.fw_reg->prot_sts,
669670
CS35L56_FIRMWARE_MISSING);
670671
cs35l56->base.fw_patched = true;
671672

sound/pci/hda/cs35l56_hda_i2c.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ static int cs35l56_hda_i2c_probe(struct i2c_client *clt)
2626
#ifdef CS35L56_WAKE_HOLD_TIME_US
2727
cs35l56->base.can_hibernate = true;
2828
#endif
29+
30+
cs35l56->base.fw_reg = &cs35l56_fw_reg;
31+
2932
cs35l56->base.regmap = devm_regmap_init_i2c(clt, &cs35l56_regmap_i2c);
3033
if (IS_ERR(cs35l56->base.regmap)) {
3134
ret = PTR_ERR(cs35l56->base.regmap);

sound/pci/hda/cs35l56_hda_spi.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ static int cs35l56_hda_spi_probe(struct spi_device *spi)
2929
#ifdef CS35L56_WAKE_HOLD_TIME_US
3030
cs35l56->base.can_hibernate = true;
3131
#endif
32+
33+
cs35l56->base.fw_reg = &cs35l56_fw_reg;
34+
3235
cs35l56->base.regmap = devm_regmap_init_spi(spi, &cs35l56_regmap_spi);
3336
if (IS_ERR(cs35l56->base.regmap)) {
3437
ret = PTR_ERR(cs35l56->base.regmap);

sound/soc/codecs/cs35l56-i2c.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ static int cs35l56_i2c_probe(struct i2c_client *client)
3535
switch (id) {
3636
case 0x3556:
3737
regmap_config = &cs35l56_regmap_i2c;
38+
cs35l56->base.fw_reg = &cs35l56_fw_reg;
3839
break;
3940
default:
4041
return -ENODEV;

sound/soc/codecs/cs35l56-sdw.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,7 @@ static int cs35l56_sdw_probe(struct sdw_slave *peripheral, const struct sdw_devi
526526
case 0x3556:
527527
case 0x3557:
528528
regmap_config = &cs35l56_regmap_sdw;
529+
cs35l56->base.fw_reg = &cs35l56_fw_reg;
529530
break;
530531
default:
531532
return -ENODEV;

sound/soc/codecs/cs35l56-shared.c

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,8 @@ int cs35l56_firmware_shutdown(struct cs35l56_base *cs35l56_base)
253253
if (ret)
254254
return ret;
255255

256-
ret = regmap_read_poll_timeout(cs35l56_base->regmap, CS35L56_DSP1_PM_CUR_STATE,
256+
ret = regmap_read_poll_timeout(cs35l56_base->regmap,
257+
cs35l56_base->fw_reg->pm_cur_stat,
257258
val, (val == CS35L56_HALO_STATE_SHUTDOWN),
258259
CS35L56_HALO_STATE_POLL_US,
259260
CS35L56_HALO_STATE_TIMEOUT_US);
@@ -278,7 +279,9 @@ int cs35l56_wait_for_firmware_boot(struct cs35l56_base *cs35l56_base)
278279
CS35L56_HALO_STATE_POLL_US,
279280
CS35L56_HALO_STATE_TIMEOUT_US,
280281
false,
281-
cs35l56_base->regmap, CS35L56_DSP1_HALO_STATE, &val);
282+
cs35l56_base->regmap,
283+
cs35l56_base->fw_reg->halo_state,
284+
&val);
282285

283286
if (poll_ret) {
284287
dev_err(cs35l56_base->dev, "Firmware boot timed out(%d): HALO_STATE=%#x\n",
@@ -395,9 +398,17 @@ void cs35l56_system_reset(struct cs35l56_base *cs35l56_base, bool is_soundwire)
395398
return;
396399
}
397400

398-
regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
399-
cs35l56_system_reset_seq,
400-
ARRAY_SIZE(cs35l56_system_reset_seq));
401+
switch (cs35l56_base->type) {
402+
case 0x54:
403+
case 0x56:
404+
case 0x57:
405+
regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
406+
cs35l56_system_reset_seq,
407+
ARRAY_SIZE(cs35l56_system_reset_seq));
408+
break;
409+
default:
410+
break;
411+
}
401412

402413
/* On SoundWire the registers won't be accessible until it re-enumerates. */
403414
if (is_soundwire)
@@ -514,7 +525,9 @@ int cs35l56_is_fw_reload_needed(struct cs35l56_base *cs35l56_base)
514525
return ret;
515526
}
516527

517-
ret = regmap_read(cs35l56_base->regmap, CS35L56_PROTECTION_STATUS, &val);
528+
ret = regmap_read(cs35l56_base->regmap,
529+
cs35l56_base->fw_reg->prot_sts,
530+
&val);
518531
if (ret)
519532
dev_err(cs35l56_base->dev, "Failed to read PROTECTION_STATUS: %d\n", ret);
520533
else
@@ -562,7 +575,7 @@ int cs35l56_runtime_suspend_common(struct cs35l56_base *cs35l56_base)
562575

563576
/* Firmware must have entered a power-save state */
564577
ret = regmap_read_poll_timeout(cs35l56_base->regmap,
565-
CS35L56_TRANSDUCER_ACTUAL_PS,
578+
cs35l56_base->fw_reg->transducer_actual_ps,
566579
val, (val >= CS35L56_PS3),
567580
CS35L56_PS3_POLL_US,
568581
CS35L56_PS3_TIMEOUT_US);
@@ -752,15 +765,17 @@ int cs35l56_read_prot_status(struct cs35l56_base *cs35l56_base,
752765
unsigned int prot_status;
753766
int ret;
754767

755-
ret = regmap_read(cs35l56_base->regmap, CS35L56_PROTECTION_STATUS, &prot_status);
768+
ret = regmap_read(cs35l56_base->regmap,
769+
cs35l56_base->fw_reg->prot_sts, &prot_status);
756770
if (ret) {
757771
dev_err(cs35l56_base->dev, "Get PROTECTION_STATUS failed: %d\n", ret);
758772
return ret;
759773
}
760774

761775
*fw_missing = !!(prot_status & CS35L56_FIRMWARE_MISSING);
762776

763-
ret = regmap_read(cs35l56_base->regmap, CS35L56_DSP1_FW_VER, fw_version);
777+
ret = regmap_read(cs35l56_base->regmap,
778+
cs35l56_base->fw_reg->fw_ver, fw_version);
764779
if (ret) {
765780
dev_err(cs35l56_base->dev, "Get FW VER failed: %d\n", ret);
766781
return ret;
@@ -1045,6 +1060,15 @@ const struct regmap_config cs35l56_regmap_sdw = {
10451060
};
10461061
EXPORT_SYMBOL_NS_GPL(cs35l56_regmap_sdw, "SND_SOC_CS35L56_SHARED");
10471062

1063+
const struct cs35l56_fw_reg cs35l56_fw_reg = {
1064+
.fw_ver = CS35L56_DSP1_FW_VER,
1065+
.halo_state = CS35L56_DSP1_HALO_STATE,
1066+
.pm_cur_stat = CS35L56_DSP1_PM_CUR_STATE,
1067+
.prot_sts = CS35L56_PROTECTION_STATUS,
1068+
.transducer_actual_ps = CS35L56_TRANSDUCER_ACTUAL_PS,
1069+
};
1070+
EXPORT_SYMBOL_NS_GPL(cs35l56_fw_reg, "SND_SOC_CS35L56_SHARED");
1071+
10481072
MODULE_DESCRIPTION("ASoC CS35L56 Shared");
10491073
MODULE_AUTHOR("Richard Fitzgerald <[email protected]>");
10501074
MODULE_AUTHOR("Simon Trimmer <[email protected]>");

sound/soc/codecs/cs35l56-spi.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ static int cs35l56_spi_probe(struct spi_device *spi)
2525
return -ENOMEM;
2626

2727
spi_set_drvdata(spi, cs35l56);
28+
29+
cs35l56->base.fw_reg = &cs35l56_fw_reg;
30+
2831
cs35l56->base.regmap = devm_regmap_init_spi(spi, regmap_config);
2932
if (IS_ERR(cs35l56->base.regmap)) {
3033
ret = PTR_ERR(cs35l56->base.regmap);

sound/soc/codecs/cs35l56.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ static int cs35l56_play_event(struct snd_soc_dapm_widget *w,
174174
case SND_SOC_DAPM_POST_PMU:
175175
/* Wait for firmware to enter PS0 power state */
176176
ret = regmap_read_poll_timeout(cs35l56->base.regmap,
177-
CS35L56_TRANSDUCER_ACTUAL_PS,
177+
cs35l56->base.fw_reg->transducer_actual_ps,
178178
val, (val == CS35L56_PS0),
179179
CS35L56_PS0_POLL_US,
180180
CS35L56_PS0_TIMEOUT_US);
@@ -760,7 +760,8 @@ static void cs35l56_patch(struct cs35l56_private *cs35l56, bool firmware_missing
760760
goto err_unlock;
761761
}
762762

763-
regmap_clear_bits(cs35l56->base.regmap, CS35L56_PROTECTION_STATUS,
763+
regmap_clear_bits(cs35l56->base.regmap,
764+
cs35l56->base.fw_reg->prot_sts,
764765
CS35L56_FIRMWARE_MISSING);
765766
cs35l56->base.fw_patched = true;
766767

0 commit comments

Comments
 (0)