diff mbox

[v2,1/3] gpio: pcf857x: change to devm_request_threaded_irq

Message ID 1377859713-13460-2-git-send-email-george.cherian@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

George Cherian Aug. 30, 2013, 10:48 a.m. UTC
Remove the request_irq and use devm_request_threaded_irq
also cleanup free_irq. devm_* takes care of that.

Signed-off-by: George Cherian <george.cherian@ti.com>
---
 arch/arm/boot/dts/dra7-evm.dts |  2 +-
 drivers/gpio/gpio-pcf857x.c    | 28 ++++++++++++++++++++++++----
 2 files changed, 25 insertions(+), 5 deletions(-)

Comments

Kuninori Morimoto Sept. 2, 2013, 1:20 a.m. UTC | #1
Hi

> Remove the request_irq and use devm_request_threaded_irq
> also cleanup free_irq. devm_* takes care of that.
> 
> Signed-off-by: George Cherian <george.cherian@ti.com>
> ---
>  arch/arm/boot/dts/dra7-evm.dts |  2 +-
>  drivers/gpio/gpio-pcf857x.c    | 28 ++++++++++++++++++++++++----
>  2 files changed, 25 insertions(+), 5 deletions(-)
> 
> diff --git a/arch/arm/boot/dts/dra7-evm.dts b/arch/arm/boot/dts/dra7-evm.dts
> index 8b0738a..39b44bc 100644
> --- a/arch/arm/boot/dts/dra7-evm.dts
> +++ b/arch/arm/boot/dts/dra7-evm.dts
> @@ -65,7 +65,7 @@
>  		n_latch = <0x1408>;
>  		gpio-controller;
>  		#gpio-cells = <2>;
> -		interrupt-parent = <&pcf_20>;
> +		interrupt-parent = <&gpio20>;
>  		interrupts = <14 2>;
>  		interrupt-controller;
>  		#interrupt-cells = <2>;

I'm not sure detail, 
but does above "exchange interrupt-parent" and "using devm_request_threaded_irq()"
have any relationship ?
Separate patch seems nice ?

Best regards
---
Kuninori Morimoto
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
George Cherian Sept. 2, 2013, 2:02 a.m. UTC | #2
On 9/2/2013 6:50 AM, Kuninori Morimoto wrote:
> Hi
>
>> Remove the request_irq and use devm_request_threaded_irq
>> also cleanup free_irq. devm_* takes care of that.
>>
>> Signed-off-by: George Cherian <george.cherian@ti.com>
>> ---
>>   arch/arm/boot/dts/dra7-evm.dts |  2 +-
>>   drivers/gpio/gpio-pcf857x.c    | 28 ++++++++++++++++++++++++----
>>   2 files changed, 25 insertions(+), 5 deletions(-)
>>
>> diff --git a/arch/arm/boot/dts/dra7-evm.dts b/arch/arm/boot/dts/dra7-evm.dts
>> index 8b0738a..39b44bc 100644
>> --- a/arch/arm/boot/dts/dra7-evm.dts
>> +++ b/arch/arm/boot/dts/dra7-evm.dts
>> @@ -65,7 +65,7 @@
>>   		n_latch = <0x1408>;
>>   		gpio-controller;
>>   		#gpio-cells = <2>;
>> -		interrupt-parent = <&pcf_20>;
>> +		interrupt-parent = <&gpio20>;
>>   		interrupts = <14 2>;
>>   		interrupt-controller;
>>   		#interrupt-cells = <2>;
> I'm not sure detail,
> but does above "exchange interrupt-parent" and "using devm_request_threaded_irq()"
> have any relationship ?
Exactly. will resend this change alone.
> Separate patch seems nice ?

okay
> Best regards
> ---
> Kuninori Morimoto
diff mbox

Patch

diff --git a/arch/arm/boot/dts/dra7-evm.dts b/arch/arm/boot/dts/dra7-evm.dts
index 8b0738a..39b44bc 100644
--- a/arch/arm/boot/dts/dra7-evm.dts
+++ b/arch/arm/boot/dts/dra7-evm.dts
@@ -65,7 +65,7 @@ 
 		n_latch = <0x1408>;
 		gpio-controller;
 		#gpio-cells = <2>;
-		interrupt-parent = <&pcf_20>;
+		interrupt-parent = <&gpio20>;
 		interrupts = <14 2>;
 		interrupt-controller;
 		#interrupt-cells = <2>;
diff --git a/drivers/gpio/gpio-pcf857x.c b/drivers/gpio/gpio-pcf857x.c
index 947cff4..4d0d28c 100644
--- a/drivers/gpio/gpio-pcf857x.c
+++ b/drivers/gpio/gpio-pcf857x.c
@@ -191,6 +191,25 @@  static int pcf857x_to_irq(struct gpio_chip *chip, unsigned offset)
 	return irq_create_mapping(gpio->irq_domain, offset);
 }
 
+static irqreturn_t pcf857x_irq(int irq, void *data)
+{
+	struct pcf857x  *gpio = data;
+	unsigned long change, i, status, flags;
+
+	status = gpio->read(gpio->client);
+
+	spin_lock_irqsave(&gpio->slock, flags);
+
+	change = gpio->status ^ status;
+	for_each_set_bit(i, &change, gpio->chip.ngpio)
+		generic_handle_irq(irq_find_mapping(gpio->irq_domain, i));
+	gpio->status = status;
+
+	spin_unlock_irqrestore(&gpio->slock, flags);
+
+	return IRQ_HANDLED;
+}
+
 static void pcf857x_irq_demux_work(struct work_struct *work)
 {
 	struct pcf857x *gpio = container_of(work,
@@ -241,8 +260,6 @@  static void pcf857x_irq_domain_cleanup(struct pcf857x *gpio)
 	if (gpio->irq_domain)
 		irq_domain_remove(gpio->irq_domain);
 
-	if (gpio->irq)
-		free_irq(gpio->irq, gpio);
 }
 
 static int pcf857x_irq_domain_init(struct pcf857x *gpio,
@@ -258,8 +275,11 @@  static int pcf857x_irq_domain_init(struct pcf857x *gpio,
 		goto fail;
 
 	/* enable real irq */
-	status = request_irq(client->irq, pcf857x_irq_demux, 0,
-			     dev_name(&client->dev), gpio);
+	status = devm_request_threaded_irq(&client->dev, client->irq,
+				NULL, pcf857x_irq, IRQF_ONESHOT |
+				IRQF_TRIGGER_FALLING,
+				dev_name(&client->dev), gpio);
+
 	if (status)
 		goto fail;