Unverified Commit 8c0821cc authored by Stefan Binding's avatar Stefan Binding Committed by Mark Brown
Browse files

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: default avatarStefan Binding <sbinding@opensource.cirrus.com>
Reviewed-by: default avatarRichard Fitzgerald <rf@opensource.cirrus.com>
Link: https://patch.msgid.link/20250407151842.143393-3-sbinding@opensource.cirrus.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 9ea280f3
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -267,6 +267,14 @@ struct cs35l56_spi_payload {
} __packed;
static_assert(sizeof(struct cs35l56_spi_payload) == 10);

struct cs35l56_fw_reg {
	unsigned int fw_ver;
	unsigned int halo_state;
	unsigned int pm_cur_stat;
	unsigned int prot_sts;
	unsigned int transducer_actual_ps;
};

struct cs35l56_base {
	struct device *dev;
	struct regmap *regmap;
@@ -283,6 +291,7 @@ struct cs35l56_base {
	struct cirrus_amp_cal_data cal_data;
	struct gpio_desc *reset_gpio;
	struct cs35l56_spi_payload *spi_payload_buf;
	const struct cs35l56_fw_reg *fw_reg;
};

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

extern const struct cs35l56_fw_reg cs35l56_fw_reg;

extern const struct cirrus_amp_cal_controls cs35l56_calibration_controls;

extern const char * const cs35l56_tx_input_texts[CS35L56_NUM_INPUT_SRC];
+3 −2
Original line number Diff line number Diff line
@@ -68,7 +68,7 @@ static void cs35l56_hda_play(struct cs35l56_hda *cs35l56)
	if (ret == 0) {
		/* Wait for firmware to enter PS0 power state */
		ret = regmap_read_poll_timeout(cs35l56->base.regmap,
					       CS35L56_TRANSDUCER_ACTUAL_PS,
					       cs35l56->base.fw_reg->transducer_actual_ps,
					       val, (val == CS35L56_PS0),
					       CS35L56_PS0_POLL_US,
					       CS35L56_PS0_TIMEOUT_US);
@@ -665,7 +665,8 @@ static void cs35l56_hda_fw_load(struct cs35l56_hda *cs35l56)

	regcache_sync(cs35l56->base.regmap);

	regmap_clear_bits(cs35l56->base.regmap, CS35L56_PROTECTION_STATUS,
	regmap_clear_bits(cs35l56->base.regmap,
			  cs35l56->base.fw_reg->prot_sts,
			  CS35L56_FIRMWARE_MISSING);
	cs35l56->base.fw_patched = true;

+3 −0
Original line number Diff line number Diff line
@@ -26,6 +26,9 @@ static int cs35l56_hda_i2c_probe(struct i2c_client *clt)
#ifdef CS35L56_WAKE_HOLD_TIME_US
	cs35l56->base.can_hibernate = true;
#endif

	cs35l56->base.fw_reg = &cs35l56_fw_reg;

	cs35l56->base.regmap = devm_regmap_init_i2c(clt, &cs35l56_regmap_i2c);
	if (IS_ERR(cs35l56->base.regmap)) {
		ret = PTR_ERR(cs35l56->base.regmap);
+3 −0
Original line number Diff line number Diff line
@@ -29,6 +29,9 @@ static int cs35l56_hda_spi_probe(struct spi_device *spi)
#ifdef CS35L56_WAKE_HOLD_TIME_US
	cs35l56->base.can_hibernate = true;
#endif

	cs35l56->base.fw_reg = &cs35l56_fw_reg;

	cs35l56->base.regmap = devm_regmap_init_spi(spi, &cs35l56_regmap_spi);
	if (IS_ERR(cs35l56->base.regmap)) {
		ret = PTR_ERR(cs35l56->base.regmap);
+1 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ static int cs35l56_i2c_probe(struct i2c_client *client)
	switch (id) {
	case 0x3556:
		regmap_config = &cs35l56_regmap_i2c;
		cs35l56->base.fw_reg = &cs35l56_fw_reg;
		break;
	default:
		return -ENODEV;
Loading