[alsa-devel] [RFC 09/11] ALSA: hda - moved interrupt handler to controller library

Takashi Iwai tiwai at suse.de
Tue Apr 14 07:22:18 CEST 2015


At Tue, 14 Apr 2015 10:13:56 +0530,
Vinod Koul wrote:
> 
> On Mon, Apr 13, 2015 at 02:01:48PM +0200, Takashi Iwai wrote:
> > At Sun, 12 Apr 2015 18:06:16 +0530,
> > Subhransu S. Prusty wrote:
> > > 
> > > From: Jeeja KP <jeeja.kp at intel.com>
> > > 
> > > This will be used by controller legacy and SKL driver
> > > 
> > > Signed-off-by: Jeeja KP <jeeja.kp at intel.com>
> > > Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty at intel.com>
> > > Signed-off-by: Vinod Koul <vinod.koul at intel.com>
> > > ---
> > >  include/sound/hdaudio.h     |  1 +
> > >  sound/hda/hdac_controller.c | 24 ++++++++++++++++++++++++
> > >  2 files changed, 25 insertions(+)
> > > 
> > > diff --git a/include/sound/hdaudio.h b/include/sound/hdaudio.h
> > > index 1f9f4ec..2d62410 100644
> > > --- a/include/sound/hdaudio.h
> > > +++ b/include/sound/hdaudio.h
> > > @@ -293,6 +293,7 @@ void snd_hdac_bus_update_rirb(struct hdac_bus *bus);
> > >  void snd_hdac_bus_handle_stream_irq(struct hdac_bus *bus, unsigned int status,
> > >  				    void (*ack)(struct hdac_bus *,
> > >  						struct hdac_stream *));
> > > +irqreturn_t snd_hdac_bus_interrupt(int irq, void *dev_id);
> > >  
> > >  int snd_hdac_bus_alloc_stream_pages(struct hdac_bus *bus);
> > >  void snd_hdac_bus_free_stream_pages(struct hdac_bus *bus);
> > > diff --git a/sound/hda/hdac_controller.c b/sound/hda/hdac_controller.c
> > > index 4d4e0d6..831cc0d 100644
> > > --- a/sound/hda/hdac_controller.c
> > > +++ b/sound/hda/hdac_controller.c
> > > @@ -5,6 +5,7 @@
> > >  #include <linux/kernel.h>
> > >  #include <linux/delay.h>
> > >  #include <linux/export.h>
> > > +#include <linux/pm_runtime.h>
> > >  #include <sound/core.h>
> > >  #include <sound/hdaudio.h>
> > >  #include <sound/hda_registers.h>
> > > @@ -381,6 +382,29 @@ EXPORT_SYMBOL_GPL(snd_hdac_bus_stop_chip);
> > >  /*
> > >   * interrupt handler
> > >   */
> > > +irqreturn_t snd_hdac_bus_interrupt(int irq, void *dev_id)
> > > +{
> > > +	struct hdac_bus *chip = dev_id;
> > > +	u32 status;
> > > +
> > > +#ifdef CONFIG_PM
> > > +	if (!pm_runtime_active(chip->dev))
> > > +		return IRQ_NONE;
> > > +#endif
> > > +
> > > +	spin_lock(&chip->reg_lock);
> > > +
> > > +	status = azx_readl(chip, INTSTS);
> > > +	if (status == 0 || status == 0xffffffff) {
> > > +		spin_unlock(&chip->reg_lock);
> > > +		return IRQ_NONE;
> > > +	}
> > > +	spin_unlock(&chip->reg_lock);
> > > +
> > > +	return IRQ_WAKE_THREAD;
> > > +}
> > > +EXPORT_SYMBOL_GPL(snd_hdac_bus_interrupt);
> > 
> > Again, this is specific to ASoC driver, so let's keep it local.
> Hmmm, but most of this is based on HDA spec and not doing much wrt driver.
> Moving to ASoC is fine too... WIll move

The assumption of threaded IRQ alone is driver-specific :)


Takashi


More information about the Alsa-devel mailing list