sound: don't call skl_init_chip() to reset intel skl soc
[ Upstream commit 75383f8d39d4c0fb96083dd460b7b139fbdac492 ] Internally, skl_init_chip() calls snd_hdac_bus_init_chip() which 1) sets bus->chip_init to prevent multiple entrances before device is stopped; 2) enables interrupt. We shouldn't use it for the purpose of resetting device only because 1) when we really want to initialize device, we won't be able to do so; 2) we are ready to handle interrupt yet, and kernel crashes when interrupt comes in. Rename azx_reset() to snd_hdac_bus_reset_link(), and use it to reset device properly. Fixes: 60767abcea3d ("ASoC: Intel: Skylake: Reset the controller in probe") Reviewed-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Yu Zhao <yuzhao@google.com> Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
2af2b70c10
commit
37ca1cc8d4
@ -357,6 +357,7 @@ void snd_hdac_bus_init_cmd_io(struct hdac_bus *bus);
|
||||
void snd_hdac_bus_stop_cmd_io(struct hdac_bus *bus);
|
||||
void snd_hdac_bus_enter_link_reset(struct hdac_bus *bus);
|
||||
void snd_hdac_bus_exit_link_reset(struct hdac_bus *bus);
|
||||
int snd_hdac_bus_reset_link(struct hdac_bus *bus, bool full_reset);
|
||||
|
||||
void snd_hdac_bus_update_rirb(struct hdac_bus *bus);
|
||||
int snd_hdac_bus_handle_stream_irq(struct hdac_bus *bus, unsigned int status,
|
||||
|
@ -384,7 +384,7 @@ void snd_hdac_bus_exit_link_reset(struct hdac_bus *bus)
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_bus_exit_link_reset);
|
||||
|
||||
/* reset codec link */
|
||||
static int azx_reset(struct hdac_bus *bus, bool full_reset)
|
||||
int snd_hdac_bus_reset_link(struct hdac_bus *bus, bool full_reset)
|
||||
{
|
||||
if (!full_reset)
|
||||
goto skip_reset;
|
||||
@ -409,7 +409,7 @@ static int azx_reset(struct hdac_bus *bus, bool full_reset)
|
||||
skip_reset:
|
||||
/* check to see if controller is ready */
|
||||
if (!snd_hdac_chip_readb(bus, GCTL)) {
|
||||
dev_dbg(bus->dev, "azx_reset: controller not ready!\n");
|
||||
dev_dbg(bus->dev, "controller not ready!\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
@ -424,6 +424,7 @@ static int azx_reset(struct hdac_bus *bus, bool full_reset)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_bus_reset_link);
|
||||
|
||||
/* enable interrupts */
|
||||
static void azx_int_enable(struct hdac_bus *bus)
|
||||
@ -478,7 +479,7 @@ bool snd_hdac_bus_init_chip(struct hdac_bus *bus, bool full_reset)
|
||||
return false;
|
||||
|
||||
/* reset controller */
|
||||
azx_reset(bus, full_reset);
|
||||
snd_hdac_bus_reset_link(bus, full_reset);
|
||||
|
||||
/* clear interrupts */
|
||||
azx_int_clear(bus);
|
||||
|
@ -698,7 +698,7 @@ static int skl_first_init(struct hdac_ext_bus *ebus)
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
skl_init_chip(bus, true);
|
||||
snd_hdac_bus_reset_link(bus, true);
|
||||
|
||||
snd_hdac_bus_parse_capabilities(bus);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user