forked from luck/tmp_suning_uos_patched
Input: egalax_ts - get gpio from devicetree
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. Add a return value checking for waking up the controller in the probe function, this guarantee only a workable device can pass init. [dmitry.torokhov@gmail.com: Make driver depend on CONFIG_OF as it is now required.] Acked-by Zhang Jiejing <jiejing.zhang@freescale.com> Reviewed-by: Shawn Guo <shawn.guo@linaro.org> Signed-off-by: Hui Wang <jason77.wang@gmail.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
0cc8d6a9d2
commit
ae495e844a
@ -0,0 +1,19 @@
|
|||||||
|
* EETI eGalax Multiple Touch Controller
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible: must be "eeti,egalax_ts"
|
||||||
|
- reg: i2c slave address
|
||||||
|
- interrupt-parent: the phandle for the interrupt controller
|
||||||
|
- interrupts: touch controller interrupt
|
||||||
|
- wakeup-gpios: the gpio pin to be used for waking up the controller
|
||||||
|
as well as uased as irq pin
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
egalax_ts@04 {
|
||||||
|
compatible = "eeti,egalax_ts";
|
||||||
|
reg = <0x04>;
|
||||||
|
interrupt-parent = <&gpio1>;
|
||||||
|
interrupts = <9 2>;
|
||||||
|
wakeup-gpios = <&gpio1 9 0>;
|
||||||
|
};
|
@ -239,7 +239,7 @@ config TOUCHSCREEN_EETI
|
|||||||
|
|
||||||
config TOUCHSCREEN_EGALAX
|
config TOUCHSCREEN_EGALAX
|
||||||
tristate "EETI eGalax multi-touch panel support"
|
tristate "EETI eGalax multi-touch panel support"
|
||||||
depends on I2C
|
depends on I2C && OF
|
||||||
help
|
help
|
||||||
Say Y here to enable support for I2C connected EETI
|
Say Y here to enable support for I2C connected EETI
|
||||||
eGalax multi-touch panels.
|
eGalax multi-touch panels.
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
#include <linux/input/mt.h>
|
#include <linux/input/mt.h>
|
||||||
|
#include <linux/of_gpio.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mouse Mode: some panel may configure the controller to mouse mode,
|
* Mouse Mode: some panel may configure the controller to mouse mode,
|
||||||
@ -122,9 +123,17 @@ static irqreturn_t egalax_ts_interrupt(int irq, void *dev_id)
|
|||||||
/* wake up controller by an falling edge of interrupt gpio. */
|
/* wake up controller by an falling edge of interrupt gpio. */
|
||||||
static int egalax_wake_up_device(struct i2c_client *client)
|
static int egalax_wake_up_device(struct i2c_client *client)
|
||||||
{
|
{
|
||||||
int gpio = irq_to_gpio(client->irq);
|
struct device_node *np = client->dev.of_node;
|
||||||
|
int gpio;
|
||||||
int ret;
|
int 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");
|
ret = gpio_request(gpio, "egalax_irq");
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&client->dev,
|
dev_err(&client->dev,
|
||||||
@ -181,7 +190,11 @@ static int __devinit egalax_ts_probe(struct i2c_client *client,
|
|||||||
ts->input_dev = input_dev;
|
ts->input_dev = input_dev;
|
||||||
|
|
||||||
/* controller may be in sleep, wake it up. */
|
/* controller may be in sleep, wake it up. */
|
||||||
egalax_wake_up_device(client);
|
error = egalax_wake_up_device(client);
|
||||||
|
if (error) {
|
||||||
|
dev_err(&client->dev, "Failed to wake up the controller\n");
|
||||||
|
goto err_free_dev;
|
||||||
|
}
|
||||||
|
|
||||||
ret = egalax_firmware_version(client);
|
ret = egalax_firmware_version(client);
|
||||||
if (ret < 0) {
|
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 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 = {
|
static struct i2c_driver egalax_ts_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "egalax_ts",
|
.name = "egalax_ts",
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.pm = &egalax_ts_pm_ops,
|
.pm = &egalax_ts_pm_ops,
|
||||||
|
.of_match_table = of_match_ptr(egalax_ts_dt_ids),
|
||||||
},
|
},
|
||||||
.id_table = egalax_ts_id,
|
.id_table = egalax_ts_id,
|
||||||
.probe = egalax_ts_probe,
|
.probe = egalax_ts_probe,
|
||||||
|
Loading…
Reference in New Issue
Block a user