mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-13 14:14:37 +00:00
ASoC: cs35l56: Bugfixes
Merge series from Richard Fitzgerald <rf@opensource.cirrus.com>: Miscellaneous bugfixes for the cs35l56 codec driver.
This commit is contained in:
commit
59146c3cd3
3 changed files with 25 additions and 17 deletions
|
@ -358,22 +358,11 @@ static int cs35l56_asp_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int f
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void cs35l56_set_asp_slot_positions(struct cs35l56_private *cs35l56,
|
||||
unsigned int reg, unsigned long mask)
|
||||
static unsigned int cs35l56_make_tdm_config_word(unsigned int reg_val, unsigned long mask)
|
||||
{
|
||||
unsigned int reg_val, channel_shift;
|
||||
unsigned int channel_shift;
|
||||
int bit_num;
|
||||
|
||||
/* Init all slots to 63 */
|
||||
switch (reg) {
|
||||
case CS35L56_ASP1_FRAME_CONTROL1:
|
||||
reg_val = 0x3f3f3f3f;
|
||||
break;
|
||||
case CS35L56_ASP1_FRAME_CONTROL5:
|
||||
reg_val = 0x3f3f3f;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Enable consecutive TX1..TXn for each of the slots set in mask */
|
||||
channel_shift = 0;
|
||||
for_each_set_bit(bit_num, &mask, 32) {
|
||||
|
@ -382,7 +371,7 @@ static void cs35l56_set_asp_slot_positions(struct cs35l56_private *cs35l56,
|
|||
channel_shift += 8;
|
||||
}
|
||||
|
||||
regmap_write(cs35l56->base.regmap, reg, reg_val);
|
||||
return reg_val;
|
||||
}
|
||||
|
||||
static int cs35l56_asp_dai_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
|
||||
|
@ -418,8 +407,11 @@ static int cs35l56_asp_dai_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx
|
|||
if (rx_mask == 0)
|
||||
rx_mask = 0xf; // ASPTX1..TX4 in slots 0..3
|
||||
|
||||
cs35l56_set_asp_slot_positions(cs35l56, CS35L56_ASP1_FRAME_CONTROL1, rx_mask);
|
||||
cs35l56_set_asp_slot_positions(cs35l56, CS35L56_ASP1_FRAME_CONTROL5, tx_mask);
|
||||
/* Default unused slots to 63 */
|
||||
regmap_write(cs35l56->base.regmap, CS35L56_ASP1_FRAME_CONTROL1,
|
||||
cs35l56_make_tdm_config_word(0x3f3f3f3f, rx_mask));
|
||||
regmap_write(cs35l56->base.regmap, CS35L56_ASP1_FRAME_CONTROL5,
|
||||
cs35l56_make_tdm_config_word(0x3f3f3f, tx_mask));
|
||||
|
||||
dev_dbg(cs35l56->base.dev, "tdm slot width: %u count: %u tx_mask: %#x rx_mask: %#x\n",
|
||||
cs35l56->asp_slot_width, cs35l56->asp_slot_count, tx_mask, rx_mask);
|
||||
|
@ -960,6 +952,12 @@ int cs35l56_system_resume(struct device *dev)
|
|||
|
||||
dev_dbg(dev, "system_resume\n");
|
||||
|
||||
/*
|
||||
* We might have done a hard reset or the CS35L56 was power-cycled
|
||||
* so wait for control port to be ready.
|
||||
*/
|
||||
cs35l56_wait_control_port_ready();
|
||||
|
||||
/* Undo pm_runtime_force_suspend() before re-enabling the irq */
|
||||
ret = pm_runtime_force_resume(dev);
|
||||
if (cs35l56->base.irq)
|
||||
|
@ -978,6 +976,7 @@ int cs35l56_system_resume(struct device *dev)
|
|||
return ret;
|
||||
|
||||
cs35l56->base.fw_patched = false;
|
||||
wm_adsp_power_down(&cs35l56->dsp);
|
||||
queue_work(cs35l56->dsp_wq, &cs35l56->dsp_work);
|
||||
|
||||
/*
|
||||
|
@ -1077,6 +1076,8 @@ int cs35l56_common_probe(struct cs35l56_private *cs35l56)
|
|||
return dev_err_probe(cs35l56->base.dev, ret, "Failed to enable supplies\n");
|
||||
|
||||
if (cs35l56->base.reset_gpio) {
|
||||
/* ACPI can override GPIOD_OUT_LOW flag so force it to start low */
|
||||
gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
|
||||
cs35l56_wait_min_reset_pulse();
|
||||
gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1);
|
||||
}
|
||||
|
|
|
@ -1025,6 +1025,12 @@ int wm_adsp_power_up(struct wm_adsp *dsp)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(wm_adsp_power_up);
|
||||
|
||||
void wm_adsp_power_down(struct wm_adsp *dsp)
|
||||
{
|
||||
cs_dsp_power_down(&dsp->cs_dsp);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wm_adsp_power_down);
|
||||
|
||||
static void wm_adsp_boot_work(struct work_struct *work)
|
||||
{
|
||||
struct wm_adsp *dsp = container_of(work,
|
||||
|
@ -1046,7 +1052,7 @@ int wm_adsp_early_event(struct snd_soc_dapm_widget *w,
|
|||
queue_work(system_unbound_wq, &dsp->boot_work);
|
||||
break;
|
||||
case SND_SOC_DAPM_PRE_PMD:
|
||||
cs_dsp_power_down(&dsp->cs_dsp);
|
||||
wm_adsp_power_down(dsp);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -92,6 +92,7 @@ int wm_adsp_early_event(struct snd_soc_dapm_widget *w,
|
|||
struct snd_kcontrol *kcontrol, int event);
|
||||
|
||||
int wm_adsp_power_up(struct wm_adsp *dsp);
|
||||
void wm_adsp_power_down(struct wm_adsp *dsp);
|
||||
|
||||
irqreturn_t wm_adsp2_bus_error(int irq, void *data);
|
||||
irqreturn_t wm_halo_bus_error(int irq, void *data);
|
||||
|
|
Loading…
Reference in a new issue