diff mbox

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

Message ID 1428842178-7105-10-git-send-email-subhransu.s.prusty@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Subhransu S. Prusty April 12, 2015, 12:36 p.m. UTC
From: Jeeja KP <jeeja.kp@intel.com>

This will be used by controller legacy and SKL driver

Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
---
 include/sound/hdaudio.h     |  1 +
 sound/hda/hdac_controller.c | 24 ++++++++++++++++++++++++
 2 files changed, 25 insertions(+)

Comments

Takashi Iwai April 13, 2015, 12:01 p.m. UTC | #1
At Sun, 12 Apr 2015 18:06:16 +0530,
Subhransu S. Prusty wrote:
> 
> From: Jeeja KP <jeeja.kp@intel.com>
> 
> This will be used by controller legacy and SKL driver
> 
> Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
> Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
> Signed-off-by: Vinod Koul <vinod.koul@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.


thanks,

Takashi
Vinod Koul April 14, 2015, 4:43 a.m. UTC | #2
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@intel.com>
> > 
> > This will be used by controller legacy and SKL driver
> > 
> > Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
> > Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
> > Signed-off-by: Vinod Koul <vinod.koul@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
Takashi Iwai April 14, 2015, 5:22 a.m. UTC | #3
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@intel.com>
> > > 
> > > This will be used by controller legacy and SKL driver
> > > 
> > > Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
> > > Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
> > > Signed-off-by: Vinod Koul <vinod.koul@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
diff mbox

Patch

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);
+
 void snd_hdac_bus_handle_stream_irq(struct hdac_bus *bus, unsigned int status,
 				    void (*ack)(struct hdac_bus *,
 						struct hdac_stream *))