From: Kevin Hilman <khilman-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
To: Jon Hunter <jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
Cc: Grygorii Strashko
<grygorii.strashko-l0cyMroinI0@public.gmane.org>,
Thomas Gleixner <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>,
Jason Cooper <jason-NLaQJdtUoK4Be96aLqz0jA@public.gmane.org>,
Marc Zyngier <marc.zyngier-5wv7dgnIgG8@public.gmane.org>,
Rob Herring <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
Pawel Moll <pawel.moll-5wv7dgnIgG8@public.gmane.org>,
Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org>,
Ian Campbell
<ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org>,
Kumar Gala <galak-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>,
Stephen Warren <swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>,
Thierry Reding
<thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
Geert Uytterhoeven
<geert-Td1EMuHUCqxL1ZNQvxDV9g@public.gmane.org>,
Lars-Peter Clausen <lars-Qo5EllUWu/uELgA04lAiVw@public.gmane.org>,
Linus Walleij
<linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH V5 4/9] genirq: Add runtime power management support for IRQ chips
Date: Thu, 09 Jun 2016 15:56:54 -0700 [thread overview]
Message-ID: <7htwh2c6o9.fsf@baylibre.com> (raw)
In-Reply-To: <5755917A.7070704-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> (Jon Hunter's message of "Mon, 6 Jun 2016 16:06:34 +0100")
Jon Hunter <jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> writes:
> On 06/06/16 15:36, Grygorii Strashko wrote:
>> On 06/06/2016 05:30 PM, Jon Hunter wrote:
>>>
>>> On 06/06/16 15:13, Grygorii Strashko wrote:
>>>> On 06/06/2016 02:53 PM, Jon Hunter wrote:
>>>>> Some IRQ chips may be located in a power domain outside of the CPU
>>>>> subsystem and hence will require device specific runtime power
>>>>> management. In order to support such IRQ chips, add a pointer for a
>>>>> device structure to the irq_chip structure, and if this pointer is
>>>>> populated by the IRQ chip driver and CONFIG_PM is selected in the kernel
>>>>> configuration, then the pm_runtime_get/put APIs for this chip will be
>>>>> called when an IRQ is requested/freed, respectively.
>>>>>
>>>>> Signed-off-by: Jon Hunter <jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
>>>>> Reviewed-by: Kevin Hilman <khilman-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
>>>>> Reviewed-by: Marc Zyngier <marc.zyngier-5wv7dgnIgG8@public.gmane.org>
>>>>> ---
>>>>> include/linux/irq.h | 4 ++++
>>>>> kernel/irq/chip.c | 35 +++++++++++++++++++++++++++++++++++
>>>>> kernel/irq/internals.h | 1 +
>>>>> kernel/irq/manage.c | 31 ++++++++++++++++++++++++++++++-
>>>>> 4 files changed, 70 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/include/linux/irq.h b/include/linux/irq.h
>>>>> index 4d758a7c604a..6c92a847394d 100644
>>>>> --- a/include/linux/irq.h
>>>>> +++ b/include/linux/irq.h
>>>>> @@ -315,6 +315,7 @@ static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d)
>>>>> /**
>>>>> * struct irq_chip - hardware interrupt chip descriptor
>>>>> *
>>>>> + * @parent_device: pointer to parent device for irqchip
>>>>> * @name: name for /proc/interrupts
>>>>> * @irq_startup: start up the interrupt (defaults to ->enable if NULL)
>>>>> * @irq_shutdown: shut down the interrupt (defaults to ->disable if NULL)
>>>>> @@ -354,6 +355,7 @@ static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d)
>>>>> * @flags: chip specific flags
>>>>> */
>>>>> struct irq_chip {
>>>>> + struct device *parent_device;
>>>>> const char *name;
>>>>> unsigned int (*irq_startup)(struct irq_data *data);
>>>>> void (*irq_shutdown)(struct irq_data *data);
>>>>> @@ -488,6 +490,8 @@ extern void handle_bad_irq(struct irq_desc *desc);
>>>>> extern void handle_nested_irq(unsigned int irq);
>>>>>
>>>>> extern int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg);
>>>>> +extern int irq_chip_pm_get(struct irq_data *data);
>>>>> +extern int irq_chip_pm_put(struct irq_data *data);
>>>>> #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
>>>>> extern void irq_chip_enable_parent(struct irq_data *data);
>>>>> extern void irq_chip_disable_parent(struct irq_data *data);
>>>>> diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
>>>>> index 2f9f2b0e79f2..b09226e895c7 100644
>>>>> --- a/kernel/irq/chip.c
>>>>> +++ b/kernel/irq/chip.c
>>>>> @@ -1093,3 +1093,38 @@ int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
>>>>>
>>>>> return 0;
>>>>> }
>>>>> +
>>>>> +/**
>>>>> + * irq_chip_pm_get - Enable power for an IRQ chip
>>>>> + * @data: Pointer to interrupt specific data
>>>>> + *
>>>>> + * Enable the power to the IRQ chip referenced by the interrupt data
>>>>> + * structure.
>>>>> + */
>>>>> +int irq_chip_pm_get(struct irq_data *data)
>>>>> +{
>>>>> + int retval = 0;
>>>>> +
>>>>> + if (IS_ENABLED(CONFIG_PM) && data->chip->parent_device)
>>>>> + retval = pm_runtime_get_sync(data->chip->parent_device);
>>>>
>>>> Sry, for the late comment - above require pm_runtime_put_noidle(data->chip->parent_device);
>>>> in case of failure.
>>>
>>> No problem. Sorry, can you elaborate? I am not familiar with the
>>> _put_noidle().
>>>
>>
>> Question here in use counter - pm_runtime_get_sync() will increment usage_count
>> always and it will not decrement it in case of failure.
>> pm_runtime_put_noidle() expected to restore usage_count state (-1).
>
> Thanks was not aware of that.
>
> Kevin, Marc, given that you have reviewed this one, are you ok with the
> above change Grygorii is proposing?
Yes, that's the right thing to do on error.
Kevin
WARNING: multiple messages have this Message-ID (diff)
From: Kevin Hilman <khilman@baylibre.com>
To: Jon Hunter <jonathanh@nvidia.com>
Cc: Grygorii Strashko <grygorii.strashko@ti.com>,
Thomas Gleixner <tglx@linutronix.de>,
Jason Cooper <jason@lakedaemon.net>,
Marc Zyngier <marc.zyngier@arm.com>,
Rob Herring <robh+dt@kernel.org>, Pawel Moll <pawel.moll@arm.com>,
"Mark Rutland" <mark.rutland@arm.com>,
Ian Campbell <ijc+devicetree@hellion.org.uk>,
Kumar Gala <galak@codeaurora.org>,
Stephen Warren <swarren@wwwdotorg.org>,
Thierry Reding <thierry.reding@gmail.com>,
Geert Uytterhoeven <geert@linux-m68k.org>,
Lars-Peter Clausen <lars@metafoo.de>,
Linus Walleij <linus.walleij@linaro.org>,
<linux-tegra@vger.kernel.org>, <devicetree@vger.kernel.org>,
<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH V5 4/9] genirq: Add runtime power management support for IRQ chips
Date: Thu, 09 Jun 2016 15:56:54 -0700 [thread overview]
Message-ID: <7htwh2c6o9.fsf@baylibre.com> (raw)
In-Reply-To: <5755917A.7070704@nvidia.com> (Jon Hunter's message of "Mon, 6 Jun 2016 16:06:34 +0100")
Jon Hunter <jonathanh@nvidia.com> writes:
> On 06/06/16 15:36, Grygorii Strashko wrote:
>> On 06/06/2016 05:30 PM, Jon Hunter wrote:
>>>
>>> On 06/06/16 15:13, Grygorii Strashko wrote:
>>>> On 06/06/2016 02:53 PM, Jon Hunter wrote:
>>>>> Some IRQ chips may be located in a power domain outside of the CPU
>>>>> subsystem and hence will require device specific runtime power
>>>>> management. In order to support such IRQ chips, add a pointer for a
>>>>> device structure to the irq_chip structure, and if this pointer is
>>>>> populated by the IRQ chip driver and CONFIG_PM is selected in the kernel
>>>>> configuration, then the pm_runtime_get/put APIs for this chip will be
>>>>> called when an IRQ is requested/freed, respectively.
>>>>>
>>>>> Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
>>>>> Reviewed-by: Kevin Hilman <khilman@baylibre.com>
>>>>> Reviewed-by: Marc Zyngier <marc.zyngier@arm.com>
>>>>> ---
>>>>> include/linux/irq.h | 4 ++++
>>>>> kernel/irq/chip.c | 35 +++++++++++++++++++++++++++++++++++
>>>>> kernel/irq/internals.h | 1 +
>>>>> kernel/irq/manage.c | 31 ++++++++++++++++++++++++++++++-
>>>>> 4 files changed, 70 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/include/linux/irq.h b/include/linux/irq.h
>>>>> index 4d758a7c604a..6c92a847394d 100644
>>>>> --- a/include/linux/irq.h
>>>>> +++ b/include/linux/irq.h
>>>>> @@ -315,6 +315,7 @@ static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d)
>>>>> /**
>>>>> * struct irq_chip - hardware interrupt chip descriptor
>>>>> *
>>>>> + * @parent_device: pointer to parent device for irqchip
>>>>> * @name: name for /proc/interrupts
>>>>> * @irq_startup: start up the interrupt (defaults to ->enable if NULL)
>>>>> * @irq_shutdown: shut down the interrupt (defaults to ->disable if NULL)
>>>>> @@ -354,6 +355,7 @@ static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d)
>>>>> * @flags: chip specific flags
>>>>> */
>>>>> struct irq_chip {
>>>>> + struct device *parent_device;
>>>>> const char *name;
>>>>> unsigned int (*irq_startup)(struct irq_data *data);
>>>>> void (*irq_shutdown)(struct irq_data *data);
>>>>> @@ -488,6 +490,8 @@ extern void handle_bad_irq(struct irq_desc *desc);
>>>>> extern void handle_nested_irq(unsigned int irq);
>>>>>
>>>>> extern int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg);
>>>>> +extern int irq_chip_pm_get(struct irq_data *data);
>>>>> +extern int irq_chip_pm_put(struct irq_data *data);
>>>>> #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
>>>>> extern void irq_chip_enable_parent(struct irq_data *data);
>>>>> extern void irq_chip_disable_parent(struct irq_data *data);
>>>>> diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
>>>>> index 2f9f2b0e79f2..b09226e895c7 100644
>>>>> --- a/kernel/irq/chip.c
>>>>> +++ b/kernel/irq/chip.c
>>>>> @@ -1093,3 +1093,38 @@ int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
>>>>>
>>>>> return 0;
>>>>> }
>>>>> +
>>>>> +/**
>>>>> + * irq_chip_pm_get - Enable power for an IRQ chip
>>>>> + * @data: Pointer to interrupt specific data
>>>>> + *
>>>>> + * Enable the power to the IRQ chip referenced by the interrupt data
>>>>> + * structure.
>>>>> + */
>>>>> +int irq_chip_pm_get(struct irq_data *data)
>>>>> +{
>>>>> + int retval = 0;
>>>>> +
>>>>> + if (IS_ENABLED(CONFIG_PM) && data->chip->parent_device)
>>>>> + retval = pm_runtime_get_sync(data->chip->parent_device);
>>>>
>>>> Sry, for the late comment - above require pm_runtime_put_noidle(data->chip->parent_device);
>>>> in case of failure.
>>>
>>> No problem. Sorry, can you elaborate? I am not familiar with the
>>> _put_noidle().
>>>
>>
>> Question here in use counter - pm_runtime_get_sync() will increment usage_count
>> always and it will not decrement it in case of failure.
>> pm_runtime_put_noidle() expected to restore usage_count state (-1).
>
> Thanks was not aware of that.
>
> Kevin, Marc, given that you have reviewed this one, are you ok with the
> above change Grygorii is proposing?
Yes, that's the right thing to do on error.
Kevin
next prev parent reply other threads:[~2016-06-09 22:56 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-06 11:53 [PATCH V5 0/9] Add support for Tegra210 AGIC Jon Hunter
2016-06-06 11:53 ` Jon Hunter
2016-06-06 11:53 ` [PATCH V5 1/9] irqdomain: Fix handling of type settings for existing mappings Jon Hunter
2016-06-06 11:53 ` Jon Hunter
2016-06-06 11:53 ` [PATCH V5 2/9] genirq: Look-up trigger type if not specified by caller Jon Hunter
2016-06-06 11:53 ` Jon Hunter
2016-06-06 11:53 ` [PATCH V5 3/9] irqdomain: Don't set type when mapping an IRQ Jon Hunter
2016-06-06 11:53 ` Jon Hunter
2016-06-06 11:53 ` [PATCH V5 4/9] genirq: Add runtime power management support for IRQ chips Jon Hunter
2016-06-06 11:53 ` Jon Hunter
2016-06-06 14:13 ` Grygorii Strashko
2016-06-06 14:13 ` Grygorii Strashko
[not found] ` <57558523.9070700-l0cyMroinI0@public.gmane.org>
2016-06-06 14:30 ` Jon Hunter
2016-06-06 14:30 ` Jon Hunter
2016-06-06 14:36 ` Grygorii Strashko
2016-06-06 14:36 ` Grygorii Strashko
2016-06-06 15:06 ` Jon Hunter
2016-06-06 15:06 ` Jon Hunter
[not found] ` <5755917A.7070704-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2016-06-06 16:08 ` Marc Zyngier
2016-06-06 16:08 ` Marc Zyngier
2016-06-09 22:56 ` Kevin Hilman [this message]
2016-06-09 22:56 ` Kevin Hilman
[not found] ` <7htwh2c6o9.fsf-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
2016-06-10 8:05 ` Jon Hunter
2016-06-10 8:05 ` Jon Hunter
2016-06-06 11:53 ` [PATCH V5 5/9] irqchip/gic: Isolate early GIC initialisation code Jon Hunter
2016-06-06 11:53 ` Jon Hunter
[not found] ` <1465214023-8299-1-git-send-email-jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2016-06-06 11:53 ` [PATCH V5 6/9] irqchip/gic: Add helper function for chip initialisation Jon Hunter
2016-06-06 11:53 ` Jon Hunter
2016-06-06 11:53 ` [PATCH V5 9/9] irqchip/gic: Add platform driver for non-root GICs that require RPM Jon Hunter
2016-06-06 11:53 ` Jon Hunter
2016-06-06 11:53 ` [PATCH V5 7/9] irqchip/gic: Prepare for adding platform driver Jon Hunter
2016-06-06 11:53 ` Jon Hunter
2016-06-06 12:39 ` Jon Hunter
2016-06-06 12:39 ` Jon Hunter
2016-06-06 11:53 ` [PATCH V5 8/9] dt-bindings: arm-gic: Add documentation for Tegra210 AGIC Jon Hunter
2016-06-06 11:53 ` 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=7htwh2c6o9.fsf@baylibre.com \
--to=khilman-rdvid1duhrbwk0htik3j/w@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=galak-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
--cc=geert-Td1EMuHUCqxL1ZNQvxDV9g@public.gmane.org \
--cc=grygorii.strashko-l0cyMroinI0@public.gmane.org \
--cc=ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org \
--cc=jason-NLaQJdtUoK4Be96aLqz0jA@public.gmane.org \
--cc=jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org \
--cc=lars-Qo5EllUWu/uELgA04lAiVw@public.gmane.org \
--cc=linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=marc.zyngier-5wv7dgnIgG8@public.gmane.org \
--cc=mark.rutland-5wv7dgnIgG8@public.gmane.org \
--cc=pawel.moll-5wv7dgnIgG8@public.gmane.org \
--cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org \
--cc=tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org \
--cc=thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
/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.