How to define gpio irq with device tree
Hui Wang
jason77.wang at gmail.com
Tue Aug 14 01:46:46 EDT 2012
Shawn Guo wrote:
> On Fri, Aug 10, 2012 at 02:30:59PM +0200, Knut Wohlrab wrote:
>
>> Hello,
>>
>> I try the touch screen of a iMX6 SabreLite evaluation board. The
>> used eGalax touch controller worked fine with a 3.2.x kernel [1]. As
>> mentioned there [2] I merge the basic device tree support to the
>> actual driver (see patch [4]) and add the touch definition to
>> arch/arm/boot/dts/imx6q-sabrelite.dts [3].
>>
>> The driver seems to start but the interrupt never occurs.
>>
>> The pinmux and I2C configuration seems correct. I did a simple test
>> with polling the interrupt gpio (see "POLLTEST" in patch [4]) and
>> got coordinates matching to the movements on the screen.
>>
>> How to configure the gpio irq correctly?
>>
>> Anybody solved to work with the eGalax touch and iMX6 SabreLite with
>> kernel > 3.2?
>>
>>
> I'm not interested in reviewing those out-of-tree codes to see what
> goes wrong there. But I just quickly enabled the driver for
> imx6q-sabrelite board with the following changes against latest
> mainline. And the interrupt seems working for me.
>
>
I generated a similar patch on the last week, only the linux-input part.
please refer to https://patchwork.kernel.org/patch/1293451/
For mach dts part:
diff --git a/arch/arm/boot/dts/imx6q-sabrelite.dts
b/arch/arm/boot/dts/imx6q-sabrelite.dts
index d42e851..71fcd12 100644
--- a/arch/arm/boot/dts/imx6q-sabrelite.dts
+++ b/arch/arm/boot/dts/imx6q-sabrelite.dts
@@ -53,6 +53,7 @@
fsl,pins = <
144 0x80000000 /* MX6Q_PAD_EIM_D22__GPIO_3_22 */
121 0x80000000 /* MX6Q_PAD_EIM_D19__GPIO_3_19 */
+ 972 0x10 /* MX6Q_PAD_GPIO_9__GPIO_1_9 */
>;
};
};
@@ -114,6 +115,21 @@
VDDIO-supply = <®_3p3v>;
};
};
+
+ i2c at 021a8000 { /* I2C3 */
+ status = "okay";
+ clock-frequency = <100000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_i2c3_1>;
+
+ egalax_ts at 04 {
+ compatible = "eeti,egalax_ts";
+ reg = <0x04>;
+ interrupt-parent = <&gpio1>;
+ interrupts = <9 2>;
+ irq-gpio = <&gpio1 9 0>;
+ };
+ };
};
};
diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi
index 3d3c64b..ebbd624 100644
--- a/arch/arm/boot/dts/imx6q.dtsi
+++ b/arch/arm/boot/dts/imx6q.dtsi
@@ -545,6 +545,14 @@
};
};
+
+ i2c3 {
+ pinctrl_i2c3_1: i2c3grp-1 {
+ fsl,pins = <1013 0x4001b8b1 /* MX6Q_PAD_GPIO_5__I2C3_SCL */
+ 1037 0x4001b8b1>; /* MX6Q_PAD_GPIO_16__I2C3_SDA */
+ };
+ };
+
serial2 {
pinctrl_serial2_1: serial2grp-1 {
fsl,pins = <183 0x1b0b1 /* MX6Q_PAD_EIM_D26__UART2_TXD */
> Regards,
> Shawn
>
> --8<---
>
> diff --git a/arch/arm/boot/dts/imx6q-sabrelite.dts b/arch/arm/boot/dts/imx6q-sabrelite.dts
> index 72f30f3..c8511c1 100644
> --- a/arch/arm/boot/dts/imx6q-sabrelite.dts
> +++ b/arch/arm/boot/dts/imx6q-sabrelite.dts
> @@ -115,6 +115,21 @@
> VDDIO-supply = <®_3p3v>;
> };
> };
> +
> + i2c at 021a8000 { /* I2C3 */
> + status = "okay";
> + clock-frequency = <400000>;
> + pinctrl-names = "default";
> + pinctrl-0 = <&pinctrl_i2c3_1>;
> +
> + egalax at 04 {
> + compatible = "eeti,egalax";
> + reg = <0x04>;
> + interrupt-parent = <&gpio1>;
> + interrupts = <9 0x8>;
> + wakeup-gpios = <&gpio1 9 0>;
> + };
> + };
> };
> };
>
> diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi
> index 3d3c64b..bbf5196 100644
> --- a/arch/arm/boot/dts/imx6q.dtsi
> +++ b/arch/arm/boot/dts/imx6q.dtsi
> @@ -545,6 +545,13 @@
> };
> };
>
> + i2c3 {
> + pinctrl_i2c3_1: i2c3grp-1 {
> + fsl,pins = <1013 0x4001b8b1 /* MX6Q_PAD_GPIO_5__I2C3_SCL */
> + 1037 0x4001b8b1>; /* MX6Q_PAD_GPIO_16__I2C3_SDA */
> + };
> + };
> +
> serial2 {
> pinctrl_serial2_1: serial2grp-1 {
> fsl,pins = <183 0x1b0b1 /* MX6Q_PAD_EIM_D26__UART2_TXD */
> diff --git a/drivers/input/touchscreen/egalax_ts.c b/drivers/input/touchscreen/egalax_ts.c
> index 70524dd..013011d 100644
> --- a/drivers/input/touchscreen/egalax_ts.c
> +++ b/drivers/input/touchscreen/egalax_ts.c
> @@ -28,6 +28,8 @@
> #include <linux/slab.h>
> #include <linux/bitops.h>
> #include <linux/input/mt.h>
> +#include <linux/of_device.h>
> +#include <linux/of_gpio.h>
>
> /*
> * Mouse Mode: some panel may configure the controller to mouse mode,
> @@ -122,7 +124,7 @@ static irqreturn_t egalax_ts_interrupt(int irq, void *dev_id)
> /* wake up controller by an falling edge of interrupt gpio. */
> static int egalax_wake_up_device(struct i2c_client *client)
> {
> - int gpio = irq_to_gpio(client->irq);
> + int gpio = of_get_named_gpio(client->dev.of_node, "wakeup-gpios", 0);
> int ret;
>
> ret = gpio_request(gpio, "egalax_irq");
> @@ -251,6 +253,12 @@ static const struct i2c_device_id egalax_ts_id[] = {
> };
> MODULE_DEVICE_TABLE(i2c, egalax_ts_id);
>
> +static struct of_device_id egalax_ts_dt_ids[] = {
> + { .compatible = "eeti,egalax" },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, egalax_ts_dt_ids);
> +
> #ifdef CONFIG_PM_SLEEP
> static int egalax_ts_suspend(struct device *dev)
> {
> @@ -279,6 +287,7 @@ static struct i2c_driver egalax_ts_driver = {
> .name = "egalax_ts",
> .owner = THIS_MODULE,
> .pm = &egalax_ts_pm_ops,
> + .of_match_table = egalax_ts_dt_ids,
> },
> .id_table = egalax_ts_id,
> .probe = egalax_ts_probe,
>
More information about the linux-arm-kernel
mailing list