Skip to content

Commit caf7c1f

Browse files
Stefan Bindingtiwai
authored andcommitted
ASoC: cs35l41: Move cs35l41_set_cspl_mbox_cmd to shared code
This function is used to control the DSP Firmware for cs35l41, and will be needed by the cs35l41 hda driver, when firmware support is added. Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com> Signed-off-by: Vitaly Rodionov <vitalyr@opensource.cirrus.com> Acked-by: Charles Keepax <ckeepax@opensource.cirrus.com> Link: https://lore.kernel.org/r/20220509214703.4482-7-vitalyr@opensource.cirrus.com Signed-off-by: Takashi Iwai <tiwai@suse.de>
1 parent de8cab7 commit caf7c1f

4 files changed

Lines changed: 82 additions & 82 deletions

File tree

include/sound/cs35l41.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,24 @@ struct cs35l41_otp_map_element_t {
801801
u32 word_offset;
802802
};
803803

804+
enum cs35l41_cspl_mbox_status {
805+
CSPL_MBOX_STS_RUNNING = 0,
806+
CSPL_MBOX_STS_PAUSED = 1,
807+
CSPL_MBOX_STS_RDY_FOR_REINIT = 2,
808+
};
809+
810+
enum cs35l41_cspl_mbox_cmd {
811+
CSPL_MBOX_CMD_NONE = 0,
812+
CSPL_MBOX_CMD_PAUSE = 1,
813+
CSPL_MBOX_CMD_RESUME = 2,
814+
CSPL_MBOX_CMD_REINIT = 3,
815+
CSPL_MBOX_CMD_STOP_PRE_REINIT = 4,
816+
CSPL_MBOX_CMD_HIBERNATE = 5,
817+
CSPL_MBOX_CMD_OUT_OF_HIBERNATE = 6,
818+
CSPL_MBOX_CMD_UNKNOWN_CMD = -1,
819+
CSPL_MBOX_CMD_INVALID_SEQUENCE = -2,
820+
};
821+
804822
/*
805823
* IRQs
806824
*/
@@ -859,6 +877,8 @@ int cs35l41_set_channels(struct device *dev, struct regmap *reg,
859877
unsigned int tx_num, unsigned int *tx_slot,
860878
unsigned int rx_num, unsigned int *rx_slot);
861879
int cs35l41_gpio_config(struct regmap *regmap, struct cs35l41_hw_cfg *hw_cfg);
880+
int cs35l41_set_cspl_mbox_cmd(struct device *dev, struct regmap *regmap,
881+
enum cs35l41_cspl_mbox_cmd cmd);
862882
int cs35l41_init_boost(struct device *dev, struct regmap *regmap,
863883
struct cs35l41_hw_cfg *hw_cfg);
864884
bool cs35l41_safe_reset(struct regmap *regmap, enum cs35l41_boost_type b_type);

sound/soc/codecs/cs35l41-lib.c

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,6 +1206,63 @@ int cs35l41_gpio_config(struct regmap *regmap, struct cs35l41_hw_cfg *hw_cfg)
12061206
}
12071207
EXPORT_SYMBOL_GPL(cs35l41_gpio_config);
12081208

1209+
static bool cs35l41_check_cspl_mbox_sts(enum cs35l41_cspl_mbox_cmd cmd,
1210+
enum cs35l41_cspl_mbox_status sts)
1211+
{
1212+
switch (cmd) {
1213+
case CSPL_MBOX_CMD_NONE:
1214+
case CSPL_MBOX_CMD_UNKNOWN_CMD:
1215+
return true;
1216+
case CSPL_MBOX_CMD_PAUSE:
1217+
case CSPL_MBOX_CMD_OUT_OF_HIBERNATE:
1218+
return (sts == CSPL_MBOX_STS_PAUSED);
1219+
case CSPL_MBOX_CMD_RESUME:
1220+
return (sts == CSPL_MBOX_STS_RUNNING);
1221+
case CSPL_MBOX_CMD_REINIT:
1222+
return (sts == CSPL_MBOX_STS_RUNNING);
1223+
case CSPL_MBOX_CMD_STOP_PRE_REINIT:
1224+
return (sts == CSPL_MBOX_STS_RDY_FOR_REINIT);
1225+
default:
1226+
return false;
1227+
}
1228+
}
1229+
1230+
int cs35l41_set_cspl_mbox_cmd(struct device *dev, struct regmap *regmap,
1231+
enum cs35l41_cspl_mbox_cmd cmd)
1232+
{
1233+
unsigned int sts = 0, i;
1234+
int ret;
1235+
1236+
// Set mailbox cmd
1237+
ret = regmap_write(regmap, CS35L41_DSP_VIRT1_MBOX_1, cmd);
1238+
if (ret < 0) {
1239+
if (cmd != CSPL_MBOX_CMD_OUT_OF_HIBERNATE)
1240+
dev_err(dev, "Failed to write MBOX: %d\n", ret);
1241+
return ret;
1242+
}
1243+
1244+
// Read mailbox status and verify it is appropriate for the given cmd
1245+
for (i = 0; i < 5; i++) {
1246+
usleep_range(1000, 1100);
1247+
1248+
ret = regmap_read(regmap, CS35L41_DSP_MBOX_2, &sts);
1249+
if (ret < 0) {
1250+
dev_err(dev, "Failed to read MBOX STS: %d\n", ret);
1251+
continue;
1252+
}
1253+
1254+
if (!cs35l41_check_cspl_mbox_sts(cmd, sts))
1255+
dev_dbg(dev, "[%u] cmd %u returned invalid sts %u", i, cmd, sts);
1256+
else
1257+
return 0;
1258+
}
1259+
1260+
dev_err(dev, "Failed to set mailbox cmd %u (status %u)\n", cmd, sts);
1261+
1262+
return -ENOMSG;
1263+
}
1264+
EXPORT_SYMBOL_GPL(cs35l41_set_cspl_mbox_cmd);
1265+
12091266
MODULE_DESCRIPTION("CS35L41 library");
12101267
MODULE_AUTHOR("David Rhodes, Cirrus Logic Inc, <david.rhodes@cirrus.com>");
12111268
MODULE_AUTHOR("Lucas Tanure, Cirrus Logic Inc, <tanureal@opensource.cirrus.com>");

sound/soc/codecs/cs35l41.c

Lines changed: 5 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -208,67 +208,6 @@ static int cs35l41_dsp_preload_ev(struct snd_soc_dapm_widget *w,
208208
}
209209
}
210210

211-
static bool cs35l41_check_cspl_mbox_sts(enum cs35l41_cspl_mbox_cmd cmd,
212-
enum cs35l41_cspl_mbox_status sts)
213-
{
214-
switch (cmd) {
215-
case CSPL_MBOX_CMD_NONE:
216-
case CSPL_MBOX_CMD_UNKNOWN_CMD:
217-
return true;
218-
case CSPL_MBOX_CMD_PAUSE:
219-
case CSPL_MBOX_CMD_OUT_OF_HIBERNATE:
220-
return (sts == CSPL_MBOX_STS_PAUSED);
221-
case CSPL_MBOX_CMD_RESUME:
222-
return (sts == CSPL_MBOX_STS_RUNNING);
223-
case CSPL_MBOX_CMD_REINIT:
224-
return (sts == CSPL_MBOX_STS_RUNNING);
225-
case CSPL_MBOX_CMD_STOP_PRE_REINIT:
226-
return (sts == CSPL_MBOX_STS_RDY_FOR_REINIT);
227-
default:
228-
return false;
229-
}
230-
}
231-
232-
static int cs35l41_set_cspl_mbox_cmd(struct cs35l41_private *cs35l41,
233-
enum cs35l41_cspl_mbox_cmd cmd)
234-
{
235-
unsigned int sts = 0, i;
236-
int ret;
237-
238-
// Set mailbox cmd
239-
ret = regmap_write(cs35l41->regmap, CS35L41_DSP_VIRT1_MBOX_1, cmd);
240-
if (ret < 0) {
241-
if (cmd != CSPL_MBOX_CMD_OUT_OF_HIBERNATE)
242-
dev_err(cs35l41->dev, "Failed to write MBOX: %d\n", ret);
243-
return ret;
244-
}
245-
246-
// Read mailbox status and verify it is appropriate for the given cmd
247-
for (i = 0; i < 5; i++) {
248-
usleep_range(1000, 1100);
249-
250-
ret = regmap_read(cs35l41->regmap, CS35L41_DSP_MBOX_2, &sts);
251-
if (ret < 0) {
252-
dev_err(cs35l41->dev, "Failed to read MBOX STS: %d\n", ret);
253-
continue;
254-
}
255-
256-
if (!cs35l41_check_cspl_mbox_sts(cmd, sts)) {
257-
dev_dbg(cs35l41->dev,
258-
"[%u] cmd %u returned invalid sts %u",
259-
i, cmd, sts);
260-
} else {
261-
return 0;
262-
}
263-
}
264-
265-
dev_err(cs35l41->dev,
266-
"Failed to set mailbox cmd %u (status %u)\n",
267-
cmd, sts);
268-
269-
return -ENOMSG;
270-
}
271-
272211
static int cs35l41_dsp_audio_ev(struct snd_soc_dapm_widget *w,
273212
struct snd_kcontrol *kcontrol, int event)
274213
{
@@ -299,9 +238,11 @@ static int cs35l41_dsp_audio_ev(struct snd_soc_dapm_widget *w,
299238
return -EINVAL;
300239
}
301240

302-
return cs35l41_set_cspl_mbox_cmd(cs35l41, CSPL_MBOX_CMD_RESUME);
241+
return cs35l41_set_cspl_mbox_cmd(cs35l41->dev, cs35l41->regmap,
242+
CSPL_MBOX_CMD_RESUME);
303243
case SND_SOC_DAPM_PRE_PMD:
304-
return cs35l41_set_cspl_mbox_cmd(cs35l41, CSPL_MBOX_CMD_PAUSE);
244+
return cs35l41_set_cspl_mbox_cmd(cs35l41->dev, cs35l41->regmap,
245+
CSPL_MBOX_CMD_PAUSE);
305246
default:
306247
return 0;
307248
}
@@ -1475,7 +1416,7 @@ static int cs35l41_exit_hibernate(struct cs35l41_private *cs35l41)
14751416
dev_dbg(cs35l41->dev, "Exit hibernate\n");
14761417

14771418
for (j = 0; j < wake_retries; j++) {
1478-
ret = cs35l41_set_cspl_mbox_cmd(cs35l41,
1419+
ret = cs35l41_set_cspl_mbox_cmd(cs35l41->dev, cs35l41->regmap,
14791420
CSPL_MBOX_CMD_OUT_OF_HIBERNATE);
14801421
if (!ret)
14811422
break;

sound/soc/codecs/cs35l41.h

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,6 @@
2323

2424
extern const struct dev_pm_ops cs35l41_pm_ops;
2525

26-
enum cs35l41_cspl_mbox_status {
27-
CSPL_MBOX_STS_RUNNING = 0,
28-
CSPL_MBOX_STS_PAUSED = 1,
29-
CSPL_MBOX_STS_RDY_FOR_REINIT = 2,
30-
};
31-
32-
enum cs35l41_cspl_mbox_cmd {
33-
CSPL_MBOX_CMD_NONE = 0,
34-
CSPL_MBOX_CMD_PAUSE = 1,
35-
CSPL_MBOX_CMD_RESUME = 2,
36-
CSPL_MBOX_CMD_REINIT = 3,
37-
CSPL_MBOX_CMD_STOP_PRE_REINIT = 4,
38-
CSPL_MBOX_CMD_HIBERNATE = 5,
39-
CSPL_MBOX_CMD_OUT_OF_HIBERNATE = 6,
40-
CSPL_MBOX_CMD_UNKNOWN_CMD = -1,
41-
CSPL_MBOX_CMD_INVALID_SEQUENCE = -2,
42-
};
43-
4426
struct cs35l41_private {
4527
struct wm_adsp dsp; /* needs to be first member */
4628
struct snd_soc_codec *codec;

0 commit comments

Comments
 (0)