summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen
diff options
context:
space:
mode:
authorJajambo Liao <jajambol@nvidia.com>2013-12-24 13:04:09 +0800
committerLaxman Dewangan <ldewangan@nvidia.com>2014-01-08 03:29:29 -0800
commit4d98e9673ddf5744dce084615c4474ec7af31a23 (patch)
treebe27a5cf4bac705b0119d3f5e0600e470d7013f2 /drivers/input/touchscreen
parent63b73637eb4ad0c85dd7c2e1caaba80850c52b71 (diff)
input: touch: raydium: add DT support to Raydium spi touch
Add device tree support to Raydium touch drivers Bug 1405258 Change-Id: Ie93df28303866fcae73ddfb4ac191c7339adbe83 Signed-off-by: Jajambo Liao <jajambol@nvidia.com> Reviewed-on: http://git-master/r/344059 Reviewed-by: Jordan Nien <jnien@nvidia.com> Reviewed-by: Xiaohui Tao <xtao@nvidia.com> Reviewed-by: Robert Collins <rcollins@nvidia.com> Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Diffstat (limited to 'drivers/input/touchscreen')
-rw-r--r--drivers/input/touchscreen/rm31080a_ts.c111
1 files changed, 107 insertions, 4 deletions
diff --git a/drivers/input/touchscreen/rm31080a_ts.c b/drivers/input/touchscreen/rm31080a_ts.c
index 25e299529816..786dbe49f592 100644
--- a/drivers/input/touchscreen/rm31080a_ts.c
+++ b/drivers/input/touchscreen/rm31080a_ts.c
@@ -25,6 +25,9 @@
#include <linux/slab.h>
#include <linux/fb.h>
#include <linux/gpio.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_gpio.h>
#include <linux/sched.h> /* wake_up_process() */
#include <linux/kthread.h> /* kthread_create(),kthread_run() */
#include <linux/uaccess.h> /* copy_to_user() */
@@ -839,6 +842,74 @@ static u32 rm_tch_ctrl_configure(void)
return u32Flag;
}
+static struct rm_spi_ts_platform_data *rm_ts_parse_dt(struct device *dev,
+ int irq)
+{
+ struct rm_spi_ts_platform_data *pdata;
+ struct device_node *np = dev->of_node;
+ const char *str;
+ int ret, val, irq_gpio;
+
+ pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+ if (!pdata)
+ return ERR_PTR(-ENOMEM);
+
+ pdata->gpio_reset = of_get_named_gpio_flags(np, "reset-gpio", 0, NULL);
+ if (!gpio_is_valid(pdata->gpio_reset)) {
+ dev_err(dev, "Invalid reset-gpio\n");
+ return ERR_PTR(-EINVAL);
+ }
+ ret = gpio_request(pdata->gpio_reset, "reset-gpio");
+ if (ret < 0) {
+ dev_err(dev, "gpio_request fail\n");
+ return ERR_PTR(-EINVAL);
+ }
+ gpio_direction_output(pdata->gpio_reset, 0);
+
+ ret = of_property_read_u32(np, "interrupts", &irq_gpio);
+ if (!gpio_is_valid(irq_gpio)) {
+ dev_err(dev, "Invalid irq-gpio\n");
+ ret = -EINVAL;
+ goto exit_release_reset_gpio;
+ }
+
+ ret = gpio_request(irq_gpio, "irq-gpio");
+ if (ret < 0) {
+ dev_err(dev, "irq_request fail\n");
+ ret = -EINVAL;
+ goto exit_release_reset_gpio;
+ }
+ gpio_direction_input(irq_gpio);
+
+ ret = of_property_read_u32(np, "config", &val);
+ if (ret < 0)
+ goto exit_release_all_gpio;
+ pdata->config = val;
+ ret = of_property_read_u32(np, "platform-id", &val);
+ if (ret < 0)
+ goto exit_release_all_gpio;
+ pdata->platform_id = val;
+ ret = of_property_read_string(np, "name-of-clock", &str);
+ if (ret < 0)
+ goto exit_release_all_gpio;
+ pdata->name_of_clock = (char *)str;
+
+ ret = of_property_read_string(np, "name-of-clock-con", &str);
+ if (ret < 0)
+ goto exit_release_all_gpio;
+ pdata->name_of_clock_con = (char *)str;
+
+ return pdata;
+
+exit_release_all_gpio:
+ gpio_free(irq_gpio);
+
+exit_release_reset_gpio:
+ gpio_free(pdata->gpio_reset);
+ return ERR_PTR(ret);
+
+}
+
int KRL_CMD_CONFIG_1V8_Handler(u8 CMD, u8 OnOff, struct rm_tch_ts *ts)
{
int ret = FAIL;
@@ -2629,6 +2700,17 @@ struct rm_tch_ts *rm_tch_input_init(struct device *dev, unsigned int irq,
ts->input = input_dev;
ts->irq = irq;
+
+ if (dev->of_node) {
+ pr_info("Load platform data from DT.\n");
+ pdata = rm_ts_parse_dt(dev, irq);
+ if (IS_ERR(pdata)) {
+ dev_err(&g_spi->dev, "Raydium - failed to parse dt\n");
+ err = -EINVAL;
+ goto err_free_mem;
+ }
+ dev->platform_data = pdata;
+ }
pdata = dev->platform_data;
if (pdata->name_of_clock || pdata->name_of_clock_con) {
@@ -2733,13 +2815,23 @@ struct rm_tch_ts *rm_tch_input_init(struct device *dev, unsigned int irq,
ts->bops = bops;
ts->dev = dev;
ts->irq = irq;
-
+ if (dev->of_node) {
+ pr_info("Load platform data from DT.\n");
+ pdata = rm_ts_parse_dt(dev, irq);
+ if (IS_ERR(pdata)) {
+ dev_err(&g_spi->dev, "Raydium - failed to parse dt\n");
+ err = -EINVAL;
+ goto err_free_mem;
+ }
+ dev->platform_data = pdata;
+ }
pdata = dev->platform_data;
if (pdata->name_of_clock || pdata->name_of_clock_con) {
ts->clk = clk_get_sys(pdata->name_of_clock,
pdata->name_of_clock_con);
if (IS_ERR(ts->clk)) {
- dev_err(&g_spi->dev, "Raydium - failed to get touch_clk: (%s, %s)\n",
+ dev_err(&g_spi->dev,
+ "Raydium - failed to get touch_clk: (%s, %s)\n",
pdata->name_of_clock, pdata->name_of_clock_con);
err = -EINVAL;
goto err_free_ts_mem;
@@ -2788,8 +2880,10 @@ struct rm_tch_ts *rm_tch_input_init(struct device *dev, unsigned int irq,
__set_bit(EV_SYN, ts->input[index]->evbit);
__set_bit(EV_ABS, ts->input[index]->evbit);
- input_set_abs_params(ts->input[index], ABS_MT_PRESSURE, 0, 0xFF, 0, 0);
- input_set_abs_params(ts->input[index], ABS_MT_TRACKING_ID, 0, 32, 0, 0);
+ input_set_abs_params(ts->input[index],
+ ABS_MT_PRESSURE, 0, 0xFF, 0, 0);
+ input_set_abs_params(ts->input[index],
+ ABS_MT_TRACKING_ID, 0, 32, 0, 0);
if (index != INPUT_DEVICE_FOR_FINGER) {
__set_bit(EV_KEY, ts->input[index]->evbit);
@@ -3280,11 +3374,20 @@ err_spi_speed:
return ret;
}
+static const struct of_device_id rm_ts_dt_match[] = {
+ { .compatible = "raydium,rm_ts_spidev" },
+ { },
+};
+MODULE_DEVICE_TABLE(of, rm_ts_dt_match);
+
static struct spi_driver rm_tch_spi_driver = {
.driver = {
.name = "rm_ts_spidev",
.bus = &spi_bus_type,
.owner = THIS_MODULE,
+#ifdef CONFIG_OF
+ .of_match_table = rm_ts_dt_match,
+#endif
#if !defined(CONFIG_HAS_EARLYSUSPEND)
#ifdef CONFIG_PM
.pm = &rm_tch_pm_ops,