summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWengang Wu <wgw@motorola.com>2014-05-13 10:25:04 -0500
committerWengang Wu <wgw@motorola.com>2014-05-13 18:42:49 +0000
commite20f75277013675bb520add337411c3172fa9ad6 (patch)
treedd90e92eae5bac4c42d57d5cb99f687b9ed29de7
parentf002179303194a87804e89fc6912ced761e992b4 (diff)
downloadolio-linux-3.10-e20f75277013675bb520add337411c3172fa9ad6.tar.xz
olio-linux-3.10-e20f75277013675bb520add337411c3172fa9ad6.zip
IKXCLOCK-1268 Touch: support new snowflake sensor
Change-Id: I78aeb27e8d34be5f20536332563599e11764016d
-rw-r--r--arch/arm/boot/dts/omap3-minnow.dtsi18
-rw-r--r--drivers/input/touchscreen/atmxt.c65
-rw-r--r--drivers/mfd/m4sensorhub-core.c7
3 files changed, 85 insertions, 5 deletions
diff --git a/arch/arm/boot/dts/omap3-minnow.dtsi b/arch/arm/boot/dts/omap3-minnow.dtsi
index a496d9135e1..a818a15cb5a 100644
--- a/arch/arm/boot/dts/omap3-minnow.dtsi
+++ b/arch/arm/boot/dts/omap3-minnow.dtsi
@@ -261,7 +261,10 @@
wakeup-source;
gpios = <&gpio4 3 0>, /* IRQ gpio-099 */
<&gpio6 4 0>; /* RESET gpio-164*/
- atmel,atmxt-tdat-filename = "atmxt-r2.tdat";
+ atmel,atmxt-tdat-filename = "atmxt-r2.tdat", "atmxt-r3.tdat";
+ pinctrl-names = "pullup", "pulldown";
+ pinctrl-0 = <&atmxt_int_pullup>;
+ pinctrl-1 = <&atmxt_int_pulldown>;
};
};
@@ -546,7 +549,6 @@
0x0dc 0x004 /* CAM_HS, MODE4 | OUTPUT */
0x0ea 0x004 /* MUXCAM_D2, MODE4 | OUTPUT */
0x0e4 0x004 /* CAM_FLD, MODE4 | OUTPUT */
- 0x0e6 0x411c /* CAM_D0, MODE4 | INPUT_PULLUP | OFFWAKEUP */
0x122 0x004 /* SIM_CLK, MODE4 | OUTPUT */
0x124 0x00f /* SIM_PWRCTRL, MODE7 | PULLDOWN */
0x13e 0x00F /* MCBSP3_DR, MODE7 | PULLDOWN */
@@ -677,6 +679,18 @@
0x1a2 0x4104 /* MCSPI1_CS2, MODE4 | INPUT | OFFWAKEUP */
>;
};
+
+ atmxt_int_pullup: pinmux_atmxt_int_pullup {
+ pinctrl-single,pins = <
+ 0x0e6 0x411c /* CAM_D0, MODE4 | INPUT_PULLUP | OFFWAKEUP */
+ >;
+ };
+
+ atmxt_int_pulldown: pinmux_atmxt_int_pulldown {
+ pinctrl-single,pins = <
+ 0x0e6 0x10c /* CAM_D0, MODE4 | INPUT_PULLDOWN */
+ >;
+ };
};
&omap3_pmx_wkup{
diff --git a/drivers/input/touchscreen/atmxt.c b/drivers/input/touchscreen/atmxt.c
index f5b4b3274e9..80028f13b21 100644
--- a/drivers/input/touchscreen/atmxt.c
+++ b/drivers/input/touchscreen/atmxt.c
@@ -177,12 +177,73 @@ atmxt_of_init(struct i2c_client *client)
return pdata;
}
+
+static int atmxt_pctrl_sel_state(struct device *dev, struct pinctrl *pctrl,
+ const char *state)
+{
+ int r;
+ struct pinctrl_state *pctrl_state = pinctrl_lookup_state(pctrl, state);
+ if (IS_ERR(pctrl_state)) {
+ dev_err(dev, "no %s pinctrl state\n", state);
+ return PTR_ERR(pctrl_state);
+ }
+ r = pinctrl_select_state(pctrl, pctrl_state);
+ if (r)
+ dev_err(dev, "failed to activate pinctrl %s\n", state);
+ return r;
+}
+
+inline int atmxt_tdat_detect_snowflake(struct i2c_client *client,
+ struct touch_platform_data *pdata)
+{
+ int r;
+ struct pinctrl *pctrl = devm_pinctrl_get(&client->dev);
+ if (IS_ERR(pctrl)) {
+ dev_err(&client->dev, "no pinctrl handle\n");
+ return PTR_ERR(pctrl);
+ }
+ /* To detect new snowflake touch sensor, it needs set touch_irq
+ * to pull-down, then read it back, the low value means snowflake
+ * touch is connected
+ */
+
+ r = atmxt_pctrl_sel_state(&client->dev, pctrl, "pulldown");
+ if (r)
+ goto exit;
+
+ msleep(1);
+ if (gpio_get_value(pdata->gpio_interrupt) == 0) {
+ /* detected snowflake, replace tdat file name */
+ const char *fp = NULL;
+ r = of_property_read_string_index(client->dev.of_node,
+ "atmel,atmxt-tdat-filename",
+ 1, &fp);
+ if (r) {
+ dev_err(&client->dev, "no snowflake tdat file defined\n");
+ goto exit;
+ }
+ pdata->filename = (char *)fp;
+ }
+
+ r = atmxt_pctrl_sel_state(&client->dev, pctrl, "pullup");
+ dev_dbg(&client->dev, "tdat file is %s\n", pdata->filename);
+
+exit:
+ devm_pinctrl_put(pctrl);
+ return r;
+}
#else
static inline struct touch_platform_data *
atmxt_of_init(struct i2c_client *client)
{
return NULL;
}
+
+inline int atmxt_tdat_detect_snowflake(struct i2c_client *client,
+ struct touch_platform_data *pdata)
+{
+ return 0
+}
#endif
static void atmxt_irq_work_func(struct work_struct *work)
@@ -282,6 +343,10 @@ static int atmxt_probe(struct i2c_client *client,
if (err < 0)
goto atmxt_probe_fail;
+ err = atmxt_tdat_detect_snowflake(client, dd->pdata);
+ if (err < 0)
+ goto atmxt_probe_fail;
+
#ifdef CONFIG_HAS_EARLYSUSPEND
dd->es.level = EARLY_SUSPEND_LEVEL_DISABLE_FB;
dd->es.suspend = atmxt_early_suspend;
diff --git a/drivers/mfd/m4sensorhub-core.c b/drivers/mfd/m4sensorhub-core.c
index f6f56229ac0..168b59f7bd0 100644
--- a/drivers/mfd/m4sensorhub-core.c
+++ b/drivers/mfd/m4sensorhub-core.c
@@ -194,7 +194,10 @@ static int m4sensorhub_hw_init(struct m4sensorhub_data *m4sensorhub,
gpio, err);
goto error_reset;
}
- gpio_direction_output(gpio, 1);
+ /* hold M4 reset till M4 load firmware procduce starts
+ * this is needed for snowflake touch determination
+ */
+ gpio_direction_output(gpio, 0);
m4sensorhub->hwconfig.reset_gpio = gpio;
gpio = of_get_named_gpio_flags(node, "mot,wake-gpio", 0, NULL);
@@ -237,8 +240,6 @@ static int m4sensorhub_hw_init(struct m4sensorhub_data *m4sensorhub,
gpio_direction_output(gpio, 0);
m4sensorhub->hwconfig.mpu_9150_en_gpio = gpio;
- m4sensorhub_hw_reset(m4sensorhub);
-
return 0;
error_enable: