From mboxrd@z Thu Jan 1 00:00:00 1970 From: jason77.wang@gmail.com (Hui Wang) Date: Tue, 14 Aug 2012 13:46:46 +0800 Subject: How to define gpio irq with device tree In-Reply-To: <20120814041841.GA30782@S2101-09.ap.freescale.net> References: <5024FF03.1070805@de.bosch.com> <20120814041841.GA30782@S2101-09.ap.freescale.net> Message-ID: <5029E646.5090900@gmail.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org 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 > #include > #include > +#include > +#include > > /* > * 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, >