|
@@ -40,6 +40,8 @@ static void azx_clear_corbrp(struct hdac_bus *bus)
|
|
|
*/
|
|
|
void snd_hdac_bus_init_cmd_io(struct hdac_bus *bus)
|
|
|
{
|
|
|
+ WARN_ON_ONCE(!bus->rb.area);
|
|
|
+
|
|
|
spin_lock_irq(&bus->reg_lock);
|
|
|
/* CORB set up */
|
|
|
bus->corb.addr = bus->rb.addr;
|
|
@@ -479,13 +481,15 @@ bool snd_hdac_bus_init_chip(struct hdac_bus *bus, bool full_reset)
|
|
|
/* reset controller */
|
|
|
azx_reset(bus, full_reset);
|
|
|
|
|
|
- /* initialize interrupts */
|
|
|
+ /* clear interrupts */
|
|
|
azx_int_clear(bus);
|
|
|
- azx_int_enable(bus);
|
|
|
|
|
|
/* initialize the codec command I/O */
|
|
|
snd_hdac_bus_init_cmd_io(bus);
|
|
|
|
|
|
+ /* enable interrupts after CORB/RIRB buffers are initialized above */
|
|
|
+ azx_int_enable(bus);
|
|
|
+
|
|
|
/* program the position buffer */
|
|
|
if (bus->use_posbuf && bus->posbuf.addr) {
|
|
|
snd_hdac_chip_writel(bus, DPLBASE, (u32)bus->posbuf.addr);
|