Message ID | 1349860323-12786-2-git-send-email-jason77.wang@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Hui, On Wed, Oct 10, 2012 at 05:12:01PM +0800, Hui Wang wrote: > The irq_to_gpio() is old, most platforms use GENERIC_GPIO framework > and don't support this API anymore. > > The i.MX6q sabrelite platform equips an egalax touchscreen controller, > and this platform already transfered to GENERIC_GPIO framework, to > support this driver, we use a more generic way to get gpio. Unfortunately this does break the driver for platforms that do still support irq_to_gpio and have not transitioned to device tree (yet?). It looks like the API suffered from premature deletion... I really do not want to add a new platform data structure with only gpio in it, is there a better way to detect if irq_to_gpio() (even if only a stub) is available? Thanks.
Add LAKML ... On Wed, Oct 10, 2012 at 09:30:36AM -0700, Dmitry Torokhov wrote: > Hi Hui, > > On Wed, Oct 10, 2012 at 05:12:01PM +0800, Hui Wang wrote: > > The irq_to_gpio() is old, most platforms use GENERIC_GPIO framework > > and don't support this API anymore. > > > > The i.MX6q sabrelite platform equips an egalax touchscreen controller, > > and this platform already transfered to GENERIC_GPIO framework, to > > support this driver, we use a more generic way to get gpio. > > Unfortunately this does break the driver for platforms that do still > support irq_to_gpio and have not transitioned to device tree (yet?). > It looks like the API suffered from premature deletion... > > I really do not want to add a new platform data structure with only gpio > in it, is there a better way to detect if irq_to_gpio() (even if only a > stub) is available? > If CONFIG_ARCH_HAVE_CUSTOM_GPIO_H is not enabled for an architecture, the irq_to_gpio() in include/linux/gpio.h will tell unavailability by returning -EINVAL. But ARM architecture still selects ARCH_HAVE_CUSTOM_GPIO_H because there are still some platforms having mach/gpio.h. We may also need a stub irq_to_gpio simply returning -EINVAL into arch/arm/include/asm/gpio.h when platform does not provide irq_to_gpio, so that driver can detect if irq_to_gpio() is available. And that stub can be removed later when we deselect ARCH_HAVE_CUSTOM_GPIO_H for ARM architecture. Shawn -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Shawn Guo wrote: > Add LAKML ... > > On Wed, Oct 10, 2012 at 09:30:36AM -0700, Dmitry Torokhov wrote: > >> Hi Hui, >> >> On Wed, Oct 10, 2012 at 05:12:01PM +0800, Hui Wang wrote: >> >>> The irq_to_gpio() is old, most platforms use GENERIC_GPIO framework >>> and don't support this API anymore. >>> >>> The i.MX6q sabrelite platform equips an egalax touchscreen controller, >>> and this platform already transfered to GENERIC_GPIO framework, to >>> support this driver, we use a more generic way to get gpio. >>> >> Unfortunately this does break the driver for platforms that do still >> support irq_to_gpio and have not transitioned to device tree (yet?). >> It looks like the API suffered from premature deletion... >> >> I really do not want to add a new platform data structure with only gpio >> in it, is there a better way to detect if irq_to_gpio() (even if only a >> stub) is available? >> >> > If CONFIG_ARCH_HAVE_CUSTOM_GPIO_H is not enabled for an architecture, > the irq_to_gpio() in include/linux/gpio.h will tell unavailability by > returning -EINVAL. But ARM > So far, the only way i can figure out is to add following in the arch/arm/include/asm/gpio.h static inline int arm_irq_to_gpio(unsigned int irq) { return -EINVAL; } #ifndef irq_to_gpio #define irq_to_gpio arm_irq_to_gpio #endif And remove all irq_to_gpio() function definitions in the arch/arm/, if mach want a specific irq_to_gpio, they can use macro to define their own. Regards, Hui. -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Oct 11, 2012 at 04:55:40PM +0800, Shawn Guo wrote: > Add LAKML ... > > On Wed, Oct 10, 2012 at 09:30:36AM -0700, Dmitry Torokhov wrote: > > Hi Hui, > > > > On Wed, Oct 10, 2012 at 05:12:01PM +0800, Hui Wang wrote: > > > The irq_to_gpio() is old, most platforms use GENERIC_GPIO framework > > > and don't support this API anymore. > > > > > > The i.MX6q sabrelite platform equips an egalax touchscreen controller, > > > and this platform already transfered to GENERIC_GPIO framework, to > > > support this driver, we use a more generic way to get gpio. > > > > Unfortunately this does break the driver for platforms that do still > > support irq_to_gpio and have not transitioned to device tree (yet?). > > It looks like the API suffered from premature deletion... > > > > I really do not want to add a new platform data structure with only gpio > > in it, is there a better way to detect if irq_to_gpio() (even if only a > > stub) is available? > > > If CONFIG_ARCH_HAVE_CUSTOM_GPIO_H is not enabled for an architecture, > the irq_to_gpio() in include/linux/gpio.h will tell unavailability by > returning -EINVAL. But ARM architecture still selects ARCH_HAVE_CUSTOM_GPIO_H > because there are still some platforms having mach/gpio.h. > > We may also need a stub irq_to_gpio simply returning -EINVAL into > arch/arm/include/asm/gpio.h when platform does not provide irq_to_gpio, > so that driver can detect if irq_to_gpio() is available. And that > stub can be removed later when we deselect ARCH_HAVE_CUSTOM_GPIO_H > for ARM architecture. Or fix the drivers using irq_to_gpio() not to use it. I thought we had resolved to do that already, with Grant's agreement that irq_to_gpio() needed to die. (Mainly because neither gpiolib nor the IRQ layer provides any assistance for irq_to_gpio(), so it's not possible to make it work for all GPIOs in the system, especially when GPIOs are allocated dynamically.) -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wednesday 10 October 2012, Dmitry Torokhov wrote: > On Wed, Oct 10, 2012 at 05:12:01PM +0800, Hui Wang wrote: > > The irq_to_gpio() is old, most platforms use GENERIC_GPIO framework > > and don't support this API anymore. > > > > The i.MX6q sabrelite platform equips an egalax touchscreen controller, > > and this platform already transfered to GENERIC_GPIO framework, to > > support this driver, we use a more generic way to get gpio. > > Unfortunately this does break the driver for platforms that do still > support irq_to_gpio and have not transitioned to device tree (yet?). > It looks like the API suffered from premature deletion... The API was changed after all users of irq_to_gpio on ARM were assumed to be converted. The remaining users either had patches back then that were not merged in time or were merged after the conversion. Right now what we have left are: drivers/ata/pata_rb532_cf.c: blackfin specific, not for ARM drivers/input/touchscreen/egalax_ts.c: currently broken, patches were sent a few times drivers/pcmcia/db1xxx_ss.c: MIPS specific drivers/power/tosa_battery.c: has been broken for a long time, ARM PXA specific drivers/staging/iio/accel/lis3l02dq_core.c: patch was sent recently, will get merged into 3.7 egalax_ts is currently the only thing that prevents us from building allyesconfig on ARM. > I really do not want to add a new platform data structure with only gpio > in it, is there a better way to detect if irq_to_gpio() (even if only a > stub) is available? There are no platforms in the mainline kernel that define an egalax_ts platforms_device, I think we can safely assume all users are either DT based, or they need out of tree patches anyway. Arnd -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/input/touchscreen/egalax_ts.c b/drivers/input/touchscreen/egalax_ts.c index c1e3460..1901f52 100644 --- a/drivers/input/touchscreen/egalax_ts.c +++ b/drivers/input/touchscreen/egalax_ts.c @@ -28,6 +28,7 @@ #include <linux/slab.h> #include <linux/bitops.h> #include <linux/input/mt.h> +#include <linux/of_gpio.h> /* * Mouse Mode: some panel may configure the controller to mouse mode, @@ -122,8 +123,15 @@ 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 ret; + struct device_node *np = client->dev.of_node; + int gpio, ret; + + if (!np) + return -ENODEV; + + gpio = of_get_named_gpio(np, "wakeup-gpios", 0); + if (!gpio_is_valid(gpio)) + return -ENODEV; ret = gpio_request(gpio, "egalax_irq"); if (ret < 0) { @@ -181,7 +189,12 @@ static int __devinit egalax_ts_probe(struct i2c_client *client, ts->input_dev = input_dev; /* controller may be in sleep, wake it up. */ - egalax_wake_up_device(client); + ret = egalax_wake_up_device(client); + if (ret < 0) { + dev_err(&client->dev, "Failed to wake up the controller\n"); + error = ret; + goto err_free_dev; + } ret = egalax_firmware_version(client); if (ret < 0) { @@ -274,11 +287,17 @@ static int egalax_ts_resume(struct device *dev) static SIMPLE_DEV_PM_OPS(egalax_ts_pm_ops, egalax_ts_suspend, egalax_ts_resume); +static struct of_device_id egalax_ts_dt_ids[] = { + { .compatible = "eeti,egalax_ts" }, + { /* sentinel */ } +}; + static struct i2c_driver egalax_ts_driver = { .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,