diff options
| author | Wengang Wu <wgw@motorola.com> | 2014-05-13 10:25:04 -0500 |
|---|---|---|
| committer | Wengang Wu <wgw@motorola.com> | 2014-05-13 18:42:49 +0000 |
| commit | e20f75277013675bb520add337411c3172fa9ad6 (patch) | |
| tree | dd90e92eae5bac4c42d57d5cb99f687b9ed29de7 | |
| parent | f002179303194a87804e89fc6912ced761e992b4 (diff) | |
| download | olio-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.dtsi | 18 | ||||
| -rw-r--r-- | drivers/input/touchscreen/atmxt.c | 65 | ||||
| -rw-r--r-- | drivers/mfd/m4sensorhub-core.c | 7 |
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: |