All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jon Hunter <jonathanh@nvidia.com>
To: Thomas Gleixner <tglx@linutronix.de>,
	Jason Cooper <jason@lakedaemon.net>,
	Marc Zyngier <marc.zyngier@arm.com>
Cc: Stephen Warren <swarren@wwwdotorg.org>,
	Thierry Reding <thierry.reding@gmail.com>,
	Kevin Hilman <khilman@kernel.org>,
	Geert Uytterhoeven <geert@linux-m68k.org>,
	linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org,
	Jon Hunter <jonathanh@nvidia.com>
Subject: [RFC PATCH 1/2] genirq: Add runtime resume/suspend support for IRQ chips
Date: Tue, 10 Nov 2015 14:39:36 +0000	[thread overview]
Message-ID: <1447166377-19707-2-git-send-email-jonathanh@nvidia.com> (raw)
In-Reply-To: <1447166377-19707-1-git-send-email-jonathanh@nvidia.com>

Some IRQ chips may be located in a power domain outside of the CPU subsystem
and hence will require device specific runtime power management. Ideally,
rather than adding more functions to the irq_chip_ops function table, using
existing chip functions such as irq_startup/shutdown or
irq_request/release_resources() would be best. However, these existing chip
functions are called in the context of a spinlock which is not ideal for
power management operations that may take some time to power up a domain.

Two possible solutions are:
1. Move existing chip operators such as irq_request/release_resources()
   outside of the spinlock and use these helpers.
2. Add new chip operators that are called outside of any spinlocks while
   setting up and freeing an IRQ.

Not knowing whether we can safely move irq_request/release_resources() to
outside the spinlock (but hopefully this will solicit some feedback), add
new chip operators for runtime resuming and suspending of an IRQ chip.

With this change the irqchip clocks will be enabled/disabled on allocating
and freeing interrupts.

Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
---
 include/linux/irq.h    |  4 ++++
 kernel/irq/internals.h | 17 +++++++++++++++++
 kernel/irq/manage.c    |  7 +++++++
 3 files changed, 28 insertions(+)

diff --git a/include/linux/irq.h b/include/linux/irq.h
index 3c1c96786248..a29050cfb5f6 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -329,6 +329,8 @@ static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d)
  *			chip, when one or more interrupts are installed
  * @irq_resume:		function called from core code on resume once per chip,
  *			when one ore more interrupts are installed
+ * @irq_runtime_suspend:function called to runtime suspend a chip
+ * @irq_runtime_resume:	function called to runtime resume a chip
  * @irq_pm_shutdown:	function called from core code on shutdown once per chip
  * @irq_calc_mask:	Optional function to set irq_data.mask for special cases
  * @irq_print_chip:	optional to print special chip info in show_interrupts
@@ -369,6 +371,8 @@ struct irq_chip {
 
 	void		(*irq_suspend)(struct irq_data *data);
 	void		(*irq_resume)(struct irq_data *data);
+	int		(*irq_runtime_suspend)(struct irq_data *data);
+	int		(*irq_runtime_resume)(struct irq_data *data);
 	void		(*irq_pm_shutdown)(struct irq_data *data);
 
 	void		(*irq_calc_mask)(struct irq_data *data);
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h
index 05c2188271b8..187e49369c16 100644
--- a/kernel/irq/internals.h
+++ b/kernel/irq/internals.h
@@ -125,6 +125,23 @@ static inline void chip_bus_sync_unlock(struct irq_desc *desc)
 		desc->irq_data.chip->irq_bus_sync_unlock(&desc->irq_data);
 }
 
+/* Inline functions for support of irq chips that require runtime pm */
+static inline int chip_runtime_resume(struct irq_desc *desc)
+{
+	if (!desc->irq_data.chip->irq_runtime_resume)
+		return 0;
+
+	return desc->irq_data.chip->irq_runtime_resume(&desc->irq_data);
+}
+
+static inline int chip_runtime_suspend(struct irq_desc *desc)
+{
+	if (!desc->irq_data.chip->irq_runtime_suspend)
+		return 0;
+
+	return desc->irq_data.chip->irq_runtime_suspend(&desc->irq_data);
+}
+
 #define _IRQ_DESC_CHECK		(1 << 0)
 #define _IRQ_DESC_PERCPU	(1 << 1)
 
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index 0eebaeef317b..66e33df73140 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -1116,6 +1116,10 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
 	if (!try_module_get(desc->owner))
 		return -ENODEV;
 
+	ret = chip_runtime_resume(desc);
+	if (ret < 0)
+		return ret;
+
 	new->irq = irq;
 
 	/*
@@ -1393,6 +1397,7 @@ out_thread:
 		put_task_struct(t);
 	}
 out_mput:
+	chip_runtime_suspend(desc);
 	module_put(desc->owner);
 	return ret;
 }
@@ -1506,6 +1511,7 @@ static struct irqaction *__free_irq(unsigned int irq, void *dev_id)
 		}
 	}
 
+	chip_runtime_suspend(desc);
 	module_put(desc->owner);
 	kfree(action->secondary);
 	return action;
@@ -1792,6 +1798,7 @@ static struct irqaction *__free_percpu_irq(unsigned int irq, void __percpu *dev_
 
 	unregister_handler_proc(irq, action);
 
+	chip_runtime_suspend(desc);
 	module_put(desc->owner);
 	return action;
 
-- 
2.1.4

  reply	other threads:[~2015-11-10 14:39 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-10 14:39 [RFC PATCH 0/2] Add support for Tegra210 AGIC Jon Hunter
2015-11-10 14:39 ` Jon Hunter [this message]
     [not found]   ` <1447166377-19707-2-git-send-email-jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2015-11-10 15:26     ` [RFC PATCH 1/2] genirq: Add runtime resume/suspend support for IRQ chips Thomas Gleixner
2015-11-10 15:26       ` Thomas Gleixner
2015-11-10 15:58       ` Jon Hunter
2015-11-10 15:58         ` Jon Hunter
     [not found]         ` <56421421.8070807-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2015-11-10 16:47           ` Grygorii Strashko
2015-11-10 16:47             ` Grygorii Strashko
     [not found]             ` <56421FA5.4020801-l0cyMroinI0@public.gmane.org>
2015-11-10 18:07               ` Lars-Peter Clausen
2015-11-10 18:07                 ` Lars-Peter Clausen
     [not found]                 ` <56423245.1040602-Qo5EllUWu/uELgA04lAiVw@public.gmane.org>
2015-11-11 10:13                   ` Jon Hunter
2015-11-11 10:13                     ` Jon Hunter
     [not found]                     ` <564314D9.9040502-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2015-11-11 15:41                       ` Grygorii Strashko
2015-11-11 15:41                         ` Grygorii Strashko
     [not found]                         ` <564361AE.4070303-l0cyMroinI0@public.gmane.org>
2015-11-12 10:59                           ` Jon Hunter
2015-11-12 10:59                             ` Jon Hunter
     [not found]                             ` <5644710D.7080108-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2015-11-12 13:20                               ` Lars-Peter Clausen
2015-11-12 13:20                                 ` Lars-Peter Clausen
2015-11-12 13:29                                 ` Grygorii Strashko
2015-11-12 13:29                                   ` Grygorii Strashko
     [not found]                                   ` <5644943E.1060102-l0cyMroinI0@public.gmane.org>
2015-11-12 13:34                                     ` Lars-Peter Clausen
2015-11-12 13:34                                       ` Lars-Peter Clausen
     [not found]                                       ` <5644957D.6060202-Qo5EllUWu/uELgA04lAiVw@public.gmane.org>
2015-11-13 18:07                                         ` Grygorii Strashko
2015-11-13 18:07                                           ` Grygorii Strashko
2015-11-12 13:35                                 ` Jon Hunter
2015-11-12 13:35                                   ` Jon Hunter
2015-11-12 13:47                                   ` Lars-Peter Clausen
     [not found]                                     ` <5644986B.5030901-Qo5EllUWu/uELgA04lAiVw@public.gmane.org>
2015-11-12 14:02                                       ` Jon Hunter
2015-11-12 14:02                                         ` Jon Hunter
     [not found]                                         ` <56449BF0.9090408-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2015-11-12 14:37                                           ` Lars-Peter Clausen
2015-11-12 14:37                                             ` Lars-Peter Clausen
     [not found]                                             ` <5644A418.2020906-Qo5EllUWu/uELgA04lAiVw@public.gmane.org>
2015-11-12 15:38                                               ` Jon Hunter
2015-11-12 15:38                                                 ` Jon Hunter
2015-11-12 17:04         ` Sören Brinkmann
2015-11-12 17:04           ` Sören Brinkmann
2015-11-12 23:20   ` Kevin Hilman
     [not found]     ` <7hio56dctz.fsf-1D3HCaltpLuhEniVeURVKkEOCMrvLtNR@public.gmane.org>
2015-11-13  9:01       ` Jon Hunter
2015-11-13  9:01         ` Jon Hunter
     [not found]         ` <5645A6F6.6020202-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2015-11-13 20:01           ` Thomas Gleixner
2015-11-13 20:01             ` Thomas Gleixner
2015-11-16  9:46             ` Jon Hunter
2015-11-16  9:46               ` Jon Hunter
2015-11-16  9:49               ` Geert Uytterhoeven
     [not found]                 ` <CAMuHMdXazgRcw=+O-w+PsZpwiW8iCwZ8MmhNSjcOoZGRP45Y6Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-11-16 10:34                   ` Jon Hunter
2015-11-16 10:34                     ` Jon Hunter
     [not found]                     ` <5649B135.8050800-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2015-11-16 10:48                       ` Geert Uytterhoeven
2015-11-16 10:48                         ` Geert Uytterhoeven
     [not found]                         ` <CAMuHMdW2L1gYO7cNjeeaBTcQQdEXc9q45E1sZj-=TPwokkGx2g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-11-17 11:57                           ` Jon Hunter
2015-11-17 11:57                             ` Jon Hunter
2015-11-10 14:39 ` [RFC PATCH 2/2] irqchip/gic: Add support for tegra AGIC interrupt controller Jon Hunter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1447166377-19707-2-git-send-email-jonathanh@nvidia.com \
    --to=jonathanh@nvidia.com \
    --cc=geert@linux-m68k.org \
    --cc=jason@lakedaemon.net \
    --cc=khilman@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=marc.zyngier@arm.com \
    --cc=swarren@wwwdotorg.org \
    --cc=tglx@linutronix.de \
    --cc=thierry.reding@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.