diff mbox

[v2] mfd: mc13xxx: Set the irq type.

Message ID 1483112613-18092-1-git-send-email-lilja.magnus@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Magnus Lilja Dec. 30, 2016, 3:43 p.m. UTC
Commit 10f9edaeaa30 ("mfd: mc13xxx: Use regmap irq framework for
interrupts") removed the passing of the IRQF_TRIGGER_HIGH flag when
registering the interrupt.
This commit fixes that problem by setting the IRQF_TRIGGER_HIGH flag in
case no irq type is set via irqd framework (e.g. device tree). In the
latter case the irq flag from irqd is used.

Tested on i.MX31 PDK hardware.

Fixes: 10f9edaeaa30 ("mfd: mc13xxx: Use regmap irq framework for interrupts")
Cc: <stable@vger.kernel.org> # 3.18.x
Cc: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Magnus Lilja <lilja.magnus@gmail.com>
---
Changes from v1 (which was part of a patch series):
  - Now uses irqd_-functions to check if irq type is defined
  - Added Fixes: and Cc: to stable kernel.

 drivers/mfd/mc13xxx-core.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

Comments

Fabio Estevam Dec. 30, 2016, 5:55 p.m. UTC | #1
On Fri, Dec 30, 2016 at 1:43 PM, Magnus Lilja <lilja.magnus@gmail.com> wrote:
> Commit 10f9edaeaa30 ("mfd: mc13xxx: Use regmap irq framework for
> interrupts") removed the passing of the IRQF_TRIGGER_HIGH flag when
> registering the interrupt.
> This commit fixes that problem by setting the IRQF_TRIGGER_HIGH flag in
> case no irq type is set via irqd framework (e.g. device tree). In the
> latter case the irq flag from irqd is used.
>
> Tested on i.MX31 PDK hardware.
>
> Fixes: 10f9edaeaa30 ("mfd: mc13xxx: Use regmap irq framework for interrupts")
> Cc: <stable@vger.kernel.org> # 3.18.x
> Cc: Lee Jones <lee.jones@linaro.org>
> Signed-off-by: Magnus Lilja <lilja.magnus@gmail.com>

Reviewed-by: Fabio Estevam <fabio.estevam@nxp.com>
Lee Jones Jan. 4, 2017, 11:09 a.m. UTC | #2
On Fri, 30 Dec 2016, Magnus Lilja wrote:

> Commit 10f9edaeaa30 ("mfd: mc13xxx: Use regmap irq framework for
> interrupts") removed the passing of the IRQF_TRIGGER_HIGH flag when
> registering the interrupt.
> This commit fixes that problem by setting the IRQF_TRIGGER_HIGH flag in
> case no irq type is set via irqd framework (e.g. device tree). In the
> latter case the irq flag from irqd is used.

This looks like a hack.

Why can't you set the trigger type in Device Tree instead?

> Tested on i.MX31 PDK hardware.
> 
> Fixes: 10f9edaeaa30 ("mfd: mc13xxx: Use regmap irq framework for interrupts")
> Cc: <stable@vger.kernel.org> # 3.18.x
> Cc: Lee Jones <lee.jones@linaro.org>
> Signed-off-by: Magnus Lilja <lilja.magnus@gmail.com>
> ---
> Changes from v1 (which was part of a patch series):
>   - Now uses irqd_-functions to check if irq type is defined
>   - Added Fixes: and Cc: to stable kernel.
> 
>  drivers/mfd/mc13xxx-core.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c
> index d7f54e4..e1757ea 100644
> --- a/drivers/mfd/mc13xxx-core.c
> +++ b/drivers/mfd/mc13xxx-core.c
> @@ -15,6 +15,7 @@
>  #include <linux/of_device.h>
>  #include <linux/platform_device.h>
>  #include <linux/mfd/core.h>
> +#include <linux/irq.h>
>  
>  #include "mc13xxx.h"
>  
> @@ -410,6 +411,7 @@ int mc13xxx_common_init(struct device *dev)
>  	struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
>  	u32 revision;
>  	int i, ret;
> +	unsigned int flags;
>  
>  	mc13xxx->dev = dev;
>  
> @@ -440,7 +442,11 @@ int mc13xxx_common_init(struct device *dev)
>  	mc13xxx->irq_chip.irqs = mc13xxx->irqs;
>  	mc13xxx->irq_chip.num_irqs = ARRAY_SIZE(mc13xxx->irqs);
>  
> -	ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq, IRQF_ONESHOT,
> +	flags = irqd_get_trigger_type(irq_get_irq_data(mc13xxx->irq));
> +	flags = (flags == IRQ_TYPE_NONE) ? IRQF_TRIGGER_HIGH : flags;
> +
> +	ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq,
> +				  IRQF_ONESHOT | flags,
>  				  0, &mc13xxx->irq_chip, &mc13xxx->irq_data);
>  	if (ret)
>  		return ret;
Magnus Lilja Jan. 4, 2017, 5:32 p.m. UTC | #3
Hi,

On 4 January 2017 at 12:09, Lee Jones <lee.jones@linaro.org> wrote:
> On Fri, 30 Dec 2016, Magnus Lilja wrote:
>
>> Commit 10f9edaeaa30 ("mfd: mc13xxx: Use regmap irq framework for
>> interrupts") removed the passing of the IRQF_TRIGGER_HIGH flag when
>> registering the interrupt.
>> This commit fixes that problem by setting the IRQF_TRIGGER_HIGH flag in
>> case no irq type is set via irqd framework (e.g. device tree). In the
>> latter case the irq flag from irqd is used.
>
> This looks like a hack.
>
> Why can't you set the trigger type in Device Tree instead?

The i.MX31 PDK board has not, like many (all?) i.MX31 boards, not been
converted to use device tree yet. I think there is work in progress in
this area. However, as the IRQF_TRIGGER problem also affects several
stable kernel series (since 3.18.x) I thought it was worthwhile to fix
this.

Regards, Magnus

>> Tested on i.MX31 PDK hardware.
>>
>> Fixes: 10f9edaeaa30 ("mfd: mc13xxx: Use regmap irq framework for interrupts")
>> Cc: <stable@vger.kernel.org> # 3.18.x
>> Cc: Lee Jones <lee.jones@linaro.org>
>> Signed-off-by: Magnus Lilja <lilja.magnus@gmail.com>
>> ---
>> Changes from v1 (which was part of a patch series):
>>   - Now uses irqd_-functions to check if irq type is defined
>>   - Added Fixes: and Cc: to stable kernel.
>>
>>  drivers/mfd/mc13xxx-core.c | 8 +++++++-
>>  1 file changed, 7 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c
>> index d7f54e4..e1757ea 100644
>> --- a/drivers/mfd/mc13xxx-core.c
>> +++ b/drivers/mfd/mc13xxx-core.c
>> @@ -15,6 +15,7 @@
>>  #include <linux/of_device.h>
>>  #include <linux/platform_device.h>
>>  #include <linux/mfd/core.h>
>> +#include <linux/irq.h>
>>
>>  #include "mc13xxx.h"
>>
>> @@ -410,6 +411,7 @@ int mc13xxx_common_init(struct device *dev)
>>       struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
>>       u32 revision;
>>       int i, ret;
>> +     unsigned int flags;
>>
>>       mc13xxx->dev = dev;
>>
>> @@ -440,7 +442,11 @@ int mc13xxx_common_init(struct device *dev)
>>       mc13xxx->irq_chip.irqs = mc13xxx->irqs;
>>       mc13xxx->irq_chip.num_irqs = ARRAY_SIZE(mc13xxx->irqs);
>>
>> -     ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq, IRQF_ONESHOT,
>> +     flags = irqd_get_trigger_type(irq_get_irq_data(mc13xxx->irq));
>> +     flags = (flags == IRQ_TYPE_NONE) ? IRQF_TRIGGER_HIGH : flags;
>> +
>> +     ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq,
>> +                               IRQF_ONESHOT | flags,
>>                                 0, &mc13xxx->irq_chip, &mc13xxx->irq_data);
>>       if (ret)
>>               return ret;
>
> --
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog
Lee Jones Jan. 5, 2017, 7:51 a.m. UTC | #4
Thomas,

On Wed, 04 Jan 2017, Magnus Lilja wrote:
> On 4 January 2017 at 12:09, Lee Jones <lee.jones@linaro.org> wrote:
> > On Fri, 30 Dec 2016, Magnus Lilja wrote:
> >
> >> Commit 10f9edaeaa30 ("mfd: mc13xxx: Use regmap irq framework for
> >> interrupts") removed the passing of the IRQF_TRIGGER_HIGH flag when
> >> registering the interrupt.
> >> This commit fixes that problem by setting the IRQF_TRIGGER_HIGH flag in
> >> case no irq type is set via irqd framework (e.g. device tree). In the
> >> latter case the irq flag from irqd is used.
> >
> > This looks like a hack.
> >
> > Why can't you set the trigger type in Device Tree instead?
> 
> The i.MX31 PDK board has not, like many (all?) i.MX31 boards, not been
> converted to use device tree yet. I think there is work in progress in
> this area. However, as the IRQF_TRIGGER problem also affects several
> stable kernel series (since 3.18.x) I thought it was worthwhile to fix
> this.

I would like Thomas' advice on this.

> >> Tested on i.MX31 PDK hardware.
> >>
> >> Fixes: 10f9edaeaa30 ("mfd: mc13xxx: Use regmap irq framework for interrupts")
> >> Cc: <stable@vger.kernel.org> # 3.18.x
> >> Cc: Lee Jones <lee.jones@linaro.org>
> >> Signed-off-by: Magnus Lilja <lilja.magnus@gmail.com>
> >> ---
> >> Changes from v1 (which was part of a patch series):
> >>   - Now uses irqd_-functions to check if irq type is defined
> >>   - Added Fixes: and Cc: to stable kernel.
> >>
> >>  drivers/mfd/mc13xxx-core.c | 8 +++++++-
> >>  1 file changed, 7 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c
> >> index d7f54e4..e1757ea 100644
> >> --- a/drivers/mfd/mc13xxx-core.c
> >> +++ b/drivers/mfd/mc13xxx-core.c
> >> @@ -15,6 +15,7 @@
> >>  #include <linux/of_device.h>
> >>  #include <linux/platform_device.h>
> >>  #include <linux/mfd/core.h>
> >> +#include <linux/irq.h>
> >>
> >>  #include "mc13xxx.h"
> >>
> >> @@ -410,6 +411,7 @@ int mc13xxx_common_init(struct device *dev)
> >>       struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
> >>       u32 revision;
> >>       int i, ret;
> >> +     unsigned int flags;
> >>
> >>       mc13xxx->dev = dev;
> >>
> >> @@ -440,7 +442,11 @@ int mc13xxx_common_init(struct device *dev)
> >>       mc13xxx->irq_chip.irqs = mc13xxx->irqs;
> >>       mc13xxx->irq_chip.num_irqs = ARRAY_SIZE(mc13xxx->irqs);
> >>
> >> -     ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq, IRQF_ONESHOT,
> >> +     flags = irqd_get_trigger_type(irq_get_irq_data(mc13xxx->irq));
> >> +     flags = (flags == IRQ_TYPE_NONE) ? IRQF_TRIGGER_HIGH : flags;
> >> +
> >> +     ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq,
> >> +                               IRQF_ONESHOT | flags,
> >>                                 0, &mc13xxx->irq_chip, &mc13xxx->irq_data);
> >>       if (ret)
> >>               return ret;
> >
Magnus Lilja July 21, 2017, 7:36 a.m. UTC | #5
Lee, Thomas,

I don't think I saw an answer from Thomas in this matter.

( http://lists.infradead.org/pipermail/linux-arm-kernel/2017-January/476699.html
)

Regards, Magnus

On 5 January 2017 at 08:51, Lee Jones <lee.jones@linaro.org> wrote:
> Thomas,
>
> On Wed, 04 Jan 2017, Magnus Lilja wrote:
>> On 4 January 2017 at 12:09, Lee Jones <lee.jones@linaro.org> wrote:
>> > On Fri, 30 Dec 2016, Magnus Lilja wrote:
>> >
>> >> Commit 10f9edaeaa30 ("mfd: mc13xxx: Use regmap irq framework for
>> >> interrupts") removed the passing of the IRQF_TRIGGER_HIGH flag when
>> >> registering the interrupt.
>> >> This commit fixes that problem by setting the IRQF_TRIGGER_HIGH flag in
>> >> case no irq type is set via irqd framework (e.g. device tree). In the
>> >> latter case the irq flag from irqd is used.
>> >
>> > This looks like a hack.
>> >
>> > Why can't you set the trigger type in Device Tree instead?
>>
>> The i.MX31 PDK board has not, like many (all?) i.MX31 boards, not been
>> converted to use device tree yet. I think there is work in progress in
>> this area. However, as the IRQF_TRIGGER problem also affects several
>> stable kernel series (since 3.18.x) I thought it was worthwhile to fix
>> this.
>
> I would like Thomas' advice on this.
>
>> >> Tested on i.MX31 PDK hardware.
>> >>
>> >> Fixes: 10f9edaeaa30 ("mfd: mc13xxx: Use regmap irq framework for interrupts")
>> >> Cc: <stable@vger.kernel.org> # 3.18.x
>> >> Cc: Lee Jones <lee.jones@linaro.org>
>> >> Signed-off-by: Magnus Lilja <lilja.magnus@gmail.com>
>> >> ---
>> >> Changes from v1 (which was part of a patch series):
>> >>   - Now uses irqd_-functions to check if irq type is defined
>> >>   - Added Fixes: and Cc: to stable kernel.
>> >>
>> >>  drivers/mfd/mc13xxx-core.c | 8 +++++++-
>> >>  1 file changed, 7 insertions(+), 1 deletion(-)
>> >>
>> >> diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c
>> >> index d7f54e4..e1757ea 100644
>> >> --- a/drivers/mfd/mc13xxx-core.c
>> >> +++ b/drivers/mfd/mc13xxx-core.c
>> >> @@ -15,6 +15,7 @@
>> >>  #include <linux/of_device.h>
>> >>  #include <linux/platform_device.h>
>> >>  #include <linux/mfd/core.h>
>> >> +#include <linux/irq.h>
>> >>
>> >>  #include "mc13xxx.h"
>> >>
>> >> @@ -410,6 +411,7 @@ int mc13xxx_common_init(struct device *dev)
>> >>       struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
>> >>       u32 revision;
>> >>       int i, ret;
>> >> +     unsigned int flags;
>> >>
>> >>       mc13xxx->dev = dev;
>> >>
>> >> @@ -440,7 +442,11 @@ int mc13xxx_common_init(struct device *dev)
>> >>       mc13xxx->irq_chip.irqs = mc13xxx->irqs;
>> >>       mc13xxx->irq_chip.num_irqs = ARRAY_SIZE(mc13xxx->irqs);
>> >>
>> >> -     ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq, IRQF_ONESHOT,
>> >> +     flags = irqd_get_trigger_type(irq_get_irq_data(mc13xxx->irq));
>> >> +     flags = (flags == IRQ_TYPE_NONE) ? IRQF_TRIGGER_HIGH : flags;
>> >> +
>> >> +     ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq,
>> >> +                               IRQF_ONESHOT | flags,
>> >>                                 0, &mc13xxx->irq_chip, &mc13xxx->irq_data);
>> >>       if (ret)
>> >>               return ret;
>> >
>
> --
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog
Lee Jones July 25, 2017, 9:12 a.m. UTC | #6
On Fri, 21 Jul 2017, Magnus Lilja wrote:

> Lee, Thomas,
> 
> I don't think I saw an answer from Thomas in this matter.
> 
> ( http://lists.infradead.org/pipermail/linux-arm-kernel/2017-January/476699.html
> )

No, me either.

Hopefully he will reply now.

> On 5 January 2017 at 08:51, Lee Jones <lee.jones@linaro.org> wrote:
> > Thomas,
> >
> > On Wed, 04 Jan 2017, Magnus Lilja wrote:
> >> On 4 January 2017 at 12:09, Lee Jones <lee.jones@linaro.org> wrote:
> >> > On Fri, 30 Dec 2016, Magnus Lilja wrote:
> >> >
> >> >> Commit 10f9edaeaa30 ("mfd: mc13xxx: Use regmap irq framework for
> >> >> interrupts") removed the passing of the IRQF_TRIGGER_HIGH flag when
> >> >> registering the interrupt.
> >> >> This commit fixes that problem by setting the IRQF_TRIGGER_HIGH flag in
> >> >> case no irq type is set via irqd framework (e.g. device tree). In the
> >> >> latter case the irq flag from irqd is used.
> >> >
> >> > This looks like a hack.
> >> >
> >> > Why can't you set the trigger type in Device Tree instead?
> >>
> >> The i.MX31 PDK board has not, like many (all?) i.MX31 boards, not been
> >> converted to use device tree yet. I think there is work in progress in
> >> this area. However, as the IRQF_TRIGGER problem also affects several
> >> stable kernel series (since 3.18.x) I thought it was worthwhile to fix
> >> this.
> >
> > I would like Thomas' advice on this.
> >
> >> >> Tested on i.MX31 PDK hardware.
> >> >>
> >> >> Fixes: 10f9edaeaa30 ("mfd: mc13xxx: Use regmap irq framework for interrupts")
> >> >> Cc: <stable@vger.kernel.org> # 3.18.x
> >> >> Cc: Lee Jones <lee.jones@linaro.org>
> >> >> Signed-off-by: Magnus Lilja <lilja.magnus@gmail.com>
> >> >> ---
> >> >> Changes from v1 (which was part of a patch series):
> >> >>   - Now uses irqd_-functions to check if irq type is defined
> >> >>   - Added Fixes: and Cc: to stable kernel.
> >> >>
> >> >>  drivers/mfd/mc13xxx-core.c | 8 +++++++-
> >> >>  1 file changed, 7 insertions(+), 1 deletion(-)
> >> >>
> >> >> diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c
> >> >> index d7f54e4..e1757ea 100644
> >> >> --- a/drivers/mfd/mc13xxx-core.c
> >> >> +++ b/drivers/mfd/mc13xxx-core.c
> >> >> @@ -15,6 +15,7 @@
> >> >>  #include <linux/of_device.h>
> >> >>  #include <linux/platform_device.h>
> >> >>  #include <linux/mfd/core.h>
> >> >> +#include <linux/irq.h>
> >> >>
> >> >>  #include "mc13xxx.h"
> >> >>
> >> >> @@ -410,6 +411,7 @@ int mc13xxx_common_init(struct device *dev)
> >> >>       struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
> >> >>       u32 revision;
> >> >>       int i, ret;
> >> >> +     unsigned int flags;
> >> >>
> >> >>       mc13xxx->dev = dev;
> >> >>
> >> >> @@ -440,7 +442,11 @@ int mc13xxx_common_init(struct device *dev)
> >> >>       mc13xxx->irq_chip.irqs = mc13xxx->irqs;
> >> >>       mc13xxx->irq_chip.num_irqs = ARRAY_SIZE(mc13xxx->irqs);
> >> >>
> >> >> -     ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq, IRQF_ONESHOT,
> >> >> +     flags = irqd_get_trigger_type(irq_get_irq_data(mc13xxx->irq));
> >> >> +     flags = (flags == IRQ_TYPE_NONE) ? IRQF_TRIGGER_HIGH : flags;
> >> >> +
> >> >> +     ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq,
> >> >> +                               IRQF_ONESHOT | flags,
> >> >>                                 0, &mc13xxx->irq_chip, &mc13xxx->irq_data);
> >> >>       if (ret)
> >> >>               return ret;
> >> >
> >
diff mbox

Patch

diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c
index d7f54e4..e1757ea 100644
--- a/drivers/mfd/mc13xxx-core.c
+++ b/drivers/mfd/mc13xxx-core.c
@@ -15,6 +15,7 @@ 
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/mfd/core.h>
+#include <linux/irq.h>
 
 #include "mc13xxx.h"
 
@@ -410,6 +411,7 @@  int mc13xxx_common_init(struct device *dev)
 	struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
 	u32 revision;
 	int i, ret;
+	unsigned int flags;
 
 	mc13xxx->dev = dev;
 
@@ -440,7 +442,11 @@  int mc13xxx_common_init(struct device *dev)
 	mc13xxx->irq_chip.irqs = mc13xxx->irqs;
 	mc13xxx->irq_chip.num_irqs = ARRAY_SIZE(mc13xxx->irqs);
 
-	ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq, IRQF_ONESHOT,
+	flags = irqd_get_trigger_type(irq_get_irq_data(mc13xxx->irq));
+	flags = (flags == IRQ_TYPE_NONE) ? IRQF_TRIGGER_HIGH : flags;
+
+	ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq,
+				  IRQF_ONESHOT | flags,
 				  0, &mc13xxx->irq_chip, &mc13xxx->irq_data);
 	if (ret)
 		return ret;