diff mbox

[v2,1/1] Input: gpio_keys - add device tree support for interrupt only keys

Message ID 1415808176-13282-1-git-send-email-alexander.stein@systec-electronic.com
State Accepted, archived
Commit f2d347ff70be453e861304448cb2f32ff94d40e9
Headers show

Commit Message

Alexander Stein Nov. 12, 2014, 4:02 p.m. UTC
This features already exists for board config setups. Add support for
device tree based systems.

Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
---
Please note: Due to current lack of hardware I could not test it yet. V2
includes the changes proposed by Dmitry.

Changes in v2:
* Added device tree bindings
* IRQ is only parsed and mapped when there is no "gpios" property

 .../devicetree/bindings/input/gpio-keys.txt        | 10 ++++++-
 drivers/input/keyboard/gpio_keys.c                 | 34 +++++++++++++---------
 2 files changed, 29 insertions(+), 15 deletions(-)

Comments

Arnd Bergmann Nov. 12, 2014, 4:04 p.m. UTC | #1
On Wednesday 12 November 2014 17:02:56 Alexander Stein wrote:
> This features already exists for board config setups. Add support for
> device tree based systems.
> 
> Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
> ---
> Please note: Due to current lack of hardware I could not test it yet. V2
> includes the changes proposed by Dmitry.
> 
> Changes in v2:
> * Added device tree bindings
> * IRQ is only parsed and mapped when there is no "gpios" property
> 

Can you list one or more examples in the patch description?
Are these systems that don't expose the GPIO controller with a
standalone driver, or systems that really actually connect the
buttons to an interrupt pin?

	Arnd
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Alexander Stein Nov. 12, 2014, 4:38 p.m. UTC | #2
On Wednesday 12 November 2014 17:04:57, Arnd Bergmann wrote:
> On Wednesday 12 November 2014 17:02:56 Alexander Stein wrote:
> > This features already exists for board config setups. Add support for
> > device tree based systems.
> > 
> > Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
> > ---
> > Please note: Due to current lack of hardware I could not test it yet. V2
> > includes the changes proposed by Dmitry.
> > 
> > Changes in v2:
> > * Added device tree bindings
> > * IRQ is only parsed and mapped when there is no "gpios" property
> > 
> 
> Can you list one or more examples in the patch description?
> Are these systems that don't expose the GPIO controller with a
> standalone driver, or systems that really actually connect the
> buttons to an interrupt pin?

You mean a use case? I came to this situation to test interrupt polarity on a microcontroller, thus a simple /IRQ pin, no GPIO at all. So in the end I have an input just connected to an interrupt line.
I noticed gpio_keys using platform data only can be used for this setup. So I added this support for device tree.

Best regards,
Alexander

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Arnd Bergmann Nov. 12, 2014, 7:16 p.m. UTC | #3
On Wednesday 12 November 2014 17:38:31 Alexander Stein wrote:
> On Wednesday 12 November 2014 17:04:57, Arnd Bergmann wrote:
> > On Wednesday 12 November 2014 17:02:56 Alexander Stein wrote:
> > > This features already exists for board config setups. Add support for
> > > device tree based systems.
> > > 
> > > Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
> > > ---
> > > Please note: Due to current lack of hardware I could not test it yet. V2
> > > includes the changes proposed by Dmitry.
> > > 
> > > Changes in v2:
> > > * Added device tree bindings
> > > * IRQ is only parsed and mapped when there is no "gpios" property
> > > 
> > 
> > Can you list one or more examples in the patch description?
> > Are these systems that don't expose the GPIO controller with a
> > standalone driver, or systems that really actually connect the
> > buttons to an interrupt pin?
> 
> You mean a use case? I came to this situation to test interrupt polarity on a microcontroller, thus a simple /IRQ pin, no GPIO at all. So in the end I have an input just connected to an interrupt line.
> I noticed gpio_keys using platform data only can be used for this setup. So I added this support for device tree.
> 

I meant a specific board file that uses this, which can't be converted
to DT without your change.

	Arnd
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Alexander Stein Nov. 13, 2014, 10:35 a.m. UTC | #4
On Wednesday 12 November 2014 20:16:06, Arnd Bergmann wrote:
> On Wednesday 12 November 2014 17:38:31 Alexander Stein wrote:
> > On Wednesday 12 November 2014 17:04:57, Arnd Bergmann wrote:
> > > On Wednesday 12 November 2014 17:02:56 Alexander Stein wrote:
> > > > This features already exists for board config setups. Add support for
> > > > device tree based systems.
> > > > 
> > > > Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
> > > > ---
> > > > Please note: Due to current lack of hardware I could not test it yet. V2
> > > > includes the changes proposed by Dmitry.
> > > > 
> > > > Changes in v2:
> > > > * Added device tree bindings
> > > > * IRQ is only parsed and mapped when there is no "gpios" property
> > > > 
> > > 
> > > Can you list one or more examples in the patch description?
> > > Are these systems that don't expose the GPIO controller with a
> > > standalone driver, or systems that really actually connect the
> > > buttons to an interrupt pin?
> > 
> > You mean a use case? I came to this situation to test interrupt polarity on a microcontroller, thus a simple /IRQ pin, no GPIO at all. So in the end I have an input just connected to an interrupt line.
> > I noticed gpio_keys using platform data only can be used for this setup. So I added this support for device tree.
> > 
> 
> I meant a specific board file that uses this, which can't be converted
> to DT without your change.

I've searched (hopefully) the complete arch/ tree on v3.18-rc4 for struct gpio_keys_button and checked each occurrence. I didn't found any usage of IRQ based input keys.

Best regards,
Alexander

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Arnd Bergmann Nov. 13, 2014, 10:47 a.m. UTC | #5
On Thursday 13 November 2014 11:35:42 Alexander Stein wrote:
> On Wednesday 12 November 2014 20:16:06, Arnd Bergmann wrote:
> > On Wednesday 12 November 2014 17:38:31 Alexander Stein wrote:
> > > On Wednesday 12 November 2014 17:04:57, Arnd Bergmann wrote:
> > > > On Wednesday 12 November 2014 17:02:56 Alexander Stein wrote:
> > > > > This features already exists for board config setups. Add support for
> > > > > device tree based systems.
> > > > > 
> > > > > Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
> > > > > ---
> > > > > Please note: Due to current lack of hardware I could not test it yet. V2
> > > > > includes the changes proposed by Dmitry.
> > > > > 
> > > > > Changes in v2:
> > > > > * Added device tree bindings
> > > > > * IRQ is only parsed and mapped when there is no "gpios" property
> > > > > 
> > > > 
> > > > Can you list one or more examples in the patch description?
> > > > Are these systems that don't expose the GPIO controller with a
> > > > standalone driver, or systems that really actually connect the
> > > > buttons to an interrupt pin?
> > > 
> > > You mean a use case? I came to this situation to test interrupt polarity on a microcontroller, thus a simple /IRQ pin, no GPIO at all. So in the end I have an input just connected to an interrupt line.
> > > I noticed gpio_keys using platform data only can be used for this setup. So I added this support for device tree.
> > > 
> > 
> > I meant a specific board file that uses this, which can't be converted
> > to DT without your change.
> 
> I've searched (hopefully) the complete arch/ tree on v3.18-rc4 for
> struct gpio_keys_button and checked each occurrence. I didn't found
> any usage of IRQ based input keys.

Ok, I see.

I notice that Laxman Dewangan initially added the feature as part of
(I assume) work on Tegra, but these days Tegra is DT-only so it can't
actually get used for that any more.

If we have a real usecase, I think we can still take your patch, but
my impression at the moment is that it may be better to instead
remove the feature entirely by reverting d8ee4a1c9052 ("Input:
gpio_keys - add support for interrupt only keys").

Regarding your initial use case of testing interrupt polarity, would
you have been able to do the same thing by looking at the interrupt
count in /proc/interrupts?

	Arnd
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Alexander Stein Nov. 13, 2014, 10:52 a.m. UTC | #6
On Thursday 13 November 2014 11:47:13, Arnd Bergmann wrote:
> Regarding your initial use case of testing interrupt polarity, would
> you have been able to do the same thing by looking at the interrupt
> count in /proc/interrupts?

This is only possible if some driver actually requests this interrupt, no?

Best regards,
Alexander
Laxman Dewangan Nov. 13, 2014, 10:59 a.m. UTC | #7
On Thursday 13 November 2014 04:17 PM, Arnd Bergmann wrote:
> On Thursday 13 November 2014 11:35:42 Alexander Stein wrote:
>> On Wednesday 12 November 2014 20:16:06, Arnd Bergmann wrote:
>>> On Wednesday 12 November 2014 17:38:31 Alexander Stein wrote:
>>>> On Wednesday 12 November 2014 17:04:57, Arnd Bergmann wrote:
>>>>> On Wednesday 12 November 2014 17:02:56 Alexander Stein wrote:
>>>>>> This features already exists for board config setups. Add support for
>>>>>> device tree based systems.
>>>>>>
>>>>>> Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
>>>>>> ---
>>>>>> Please note: Due to current lack of hardware I could not test it yet. V2
>>>>>> includes the changes proposed by Dmitry.
>>>>>>
>>>>>> Changes in v2:
>>>>>> * Added device tree bindings
>>>>>> * IRQ is only parsed and mapped when there is no "gpios" property
>>>>>>
>>>>> Can you list one or more examples in the patch description?
>>>>> Are these systems that don't expose the GPIO controller with a
>>>>> standalone driver, or systems that really actually connect the
>>>>> buttons to an interrupt pin?
>>>> You mean a use case? I came to this situation to test interrupt polarity on a microcontroller, thus a simple /IRQ pin, no GPIO at all. So in the end I have an input just connected to an interrupt line.
>>>> I noticed gpio_keys using platform data only can be used for this setup. So I added this support for device tree.
>>>>
>>> I meant a specific board file that uses this, which can't be converted
>>> to DT without your change.
>> I've searched (hopefully) the complete arch/ tree on v3.18-rc4 for
>> struct gpio_keys_button and checked each occurrence. I didn't found
>> any usage of IRQ based input keys.
> Ok, I see.
>
> I notice that Laxman Dewangan initially added the feature as part of
> (I assume) work on Tegra, but these days Tegra is DT-only so it can't
> actually get used for that any more.
>
> If we have a real usecase, I think we can still take your patch, but
> my impression at the moment is that it may be better to instead
> remove the feature entirely by reverting d8ee4a1c9052 ("Input:
> gpio_keys - add support for interrupt only keys").
>
> Regarding your initial use case of testing interrupt polarity, would
> you have been able to do the same thing by looking at the interrupt
> count in /proc/interrupts?
>

Yes, I posted patch for interrupt key on context on key connected to 
PMIC-Onkey.
On PMIC, there is onkey pin input which generates interrupt only when it 
toggles. So if we have key (power key on our platforms) connected to 
this pin then we will only get interrupt from PMIC.
Instead of implementing full interrupt key driver, I added this support 
on existing gpio keys.

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Arnd Bergmann Nov. 13, 2014, 11 a.m. UTC | #8
On Thursday 13 November 2014 11:52:48 Alexander Stein wrote:
> On Thursday 13 November 2014 11:47:13, Arnd Bergmann wrote:
> > Regarding your initial use case of testing interrupt polarity, would
> > you have been able to do the same thing by looking at the interrupt
> > count in /proc/interrupts?
> 
> This is only possible if some driver actually requests this interrupt, no?

Yes, I think that is correct, at least with sparseirq, which is now the
default. For interrupts that are mapped by the irqchip, you can look
up the number of spurious interrupts in /proc/irq/<nr>/spurious.

	Arnd
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Laxman Dewangan Nov. 13, 2014, 11:02 a.m. UTC | #9
On Thursday 13 November 2014 04:30 PM, Arnd Bergmann wrote:
> On Thursday 13 November 2014 11:52:48 Alexander Stein wrote:
>> On Thursday 13 November 2014 11:47:13, Arnd Bergmann wrote:
>>> Regarding your initial use case of testing interrupt polarity, would
>>> you have been able to do the same thing by looking at the interrupt
>>> count in /proc/interrupts?
>> This is only possible if some driver actually requests this interrupt, no?
> Yes, I think that is correct, at least with sparseirq, which is now the
> default. For interrupts that are mapped by the irqchip, you can look
> up the number of spurious interrupts in /proc/irq/<nr>/spurious.
>
>
yes, I came across multiple PMIC(TPS65910, MAXIM, Ricoh)  module which 
generates interrupt when their On-key pin get toggle. Key is connected 
with this pin of PMIC and for on-key driver, we are using the gpio-keys 
driver by passing interrupt number instead of complete new driver.

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Arnd Bergmann Nov. 13, 2014, 11:05 a.m. UTC | #10
On Thursday 13 November 2014 16:29:02 Laxman Dewangan wrote:
> On Thursday 13 November 2014 04:17 PM, Arnd Bergmann wrote:
> > I notice that Laxman Dewangan initially added the feature as part of
> > (I assume) work on Tegra, but these days Tegra is DT-only so it can't
> > actually get used for that any more.
> >
> > If we have a real usecase, I think we can still take your patch, but
> > my impression at the moment is that it may be better to instead
> > remove the feature entirely by reverting d8ee4a1c9052 ("Input:
> > gpio_keys - add support for interrupt only keys").
> >
> > Regarding your initial use case of testing interrupt polarity, would
> > you have been able to do the same thing by looking at the interrupt
> > count in /proc/interrupts?
> >
> 
> Yes, I posted patch for interrupt key on context on key connected to 
> PMIC-Onkey.
> On PMIC, there is onkey pin input which generates interrupt only when it 
> toggles. So if we have key (power key on our platforms) connected to 
> this pin then we will only get interrupt from PMIC.
> Instead of implementing full interrupt key driver, I added this support 
> on existing gpio keys.

So is this code still in place, and do you think it's worthwhile to
have a DT binding for it?

Could the PMIC register a gpio controller instead?

	Arnd
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Laxman Dewangan Nov. 13, 2014, 11:17 a.m. UTC | #11
On Thursday 13 November 2014 04:35 PM, Arnd Bergmann wrote:
> On Thursday 13 November 2014 16:29:02 Laxman Dewangan wrote:
>>
>> Yes, I posted patch for interrupt key on context on key connected to
>> PMIC-Onkey.
>> On PMIC, there is onkey pin input which generates interrupt only when it
>> toggles. So if we have key (power key on our platforms) connected to
>> this pin then we will only get interrupt from PMIC.
>> Instead of implementing full interrupt key driver, I added this support
>> on existing gpio keys.
> So is this code still in place, and do you think it's worthwhile to
> have a DT binding for it?
>
> Could the PMIC register a gpio controller instead?
>
>

This pin is not supported as GPIO and so exporting the functionality 
through GPIO is not feasible until we treat the onkey as GPIO pin 
without actual gpio functionality i..e only interrupt functionality.



--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/input/gpio-keys.txt b/Documentation/devicetree/bindings/input/gpio-keys.txt
index 5c2c021..a4a38fc 100644
--- a/Documentation/devicetree/bindings/input/gpio-keys.txt
+++ b/Documentation/devicetree/bindings/input/gpio-keys.txt
@@ -10,10 +10,13 @@  Optional properties:
 Each button (key) is represented as a sub-node of "gpio-keys":
 Subnode properties:
 
-	- gpios: OF device-tree gpio specification.
 	- label: Descriptive name of the key.
 	- linux,code: Keycode to emit.
 
+Required mutual exclusive subnode-properties:
+	- gpios: OF device-tree gpio specification.
+	- interrupts: the interrupt line for that input
+
 Optional subnode-properties:
 	- linux,input-type: Specify event type this button/key generates.
 	  If not specified defaults to <1> == EV_KEY.
@@ -33,4 +36,9 @@  Example nodes:
 				linux,code = <103>;
 				gpios = <&gpio1 0 1>;
 			};
+			button@22 {
+				label = "GPIO Key DOWN";
+				linux,code = <108>;
+				interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
+			};
 			...
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
index 8c98e97..ce0d909 100644
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -29,6 +29,7 @@ 
 #include <linux/of.h>
 #include <linux/of_platform.h>
 #include <linux/of_gpio.h>
+#include <linux/of_irq.h>
 #include <linux/spinlock.h>
 
 struct gpio_button_data {
@@ -617,28 +618,33 @@  gpio_keys_get_devtree_pdata(struct device *dev)
 
 	i = 0;
 	for_each_child_of_node(node, pp) {
-		int gpio;
+		int gpio = -1;
+		int irq;
 		enum of_gpio_flags flags;
 
 		if (!of_find_property(pp, "gpios", NULL)) {
-			pdata->nbuttons--;
-			dev_warn(dev, "Found button without gpios\n");
-			continue;
-		}
-
-		gpio = of_get_gpio_flags(pp, 0, &flags);
-		if (gpio < 0) {
-			error = gpio;
-			if (error != -EPROBE_DEFER)
-				dev_err(dev,
-					"Failed to get gpio flags, error: %d\n",
-					error);
-			return ERR_PTR(error);
+			irq = irq_of_parse_and_map(pp, 0);
+			if (irq == 0) {
+				pdata->nbuttons--;
+				dev_warn(dev, "Found button without gpios or irqs\n");
+				continue;
+			}
+		} else {
+			gpio = of_get_gpio_flags(pp, 0, &flags);
+			if (gpio < 0) {
+				error = gpio;
+				if (error != -EPROBE_DEFER)
+					dev_err(dev,
+						"Failed to get gpio flags, error: %d\n",
+						error);
+				return ERR_PTR(error);
+			}
 		}
 
 		button = &pdata->buttons[i++];
 
 		button->gpio = gpio;
+		button->irq = irq;
 		button->active_low = flags & OF_GPIO_ACTIVE_LOW;
 
 		if (of_property_read_u32(pp, "linux,code", &button->code)) {