From: Nick Dyer <nick.dyer@itdev.co.uk>
To: Dmitry Torokhov <dmitry.torokhov@gmail.com>,
Daniel Kurtz <djkurtz@chromium.org>,
Henrik Rydberg <rydberg@euromail.se>,
Joonyoung Shim <jy0922.shim@samsung.com>,
Alan.Bowens@atmel.com, linux-input@vger.kernel.org,
linux-kernel@vger.kernel.org, pmeerw@pmeerw.net,
bleung@chromium.org, olofj@chromium.org
Cc: Nick Dyer <nick.dyer@itdev.co.uk>
Subject: [PATCH 49/53] Input: atmel_mxt_ts - Add regulator control support
Date: Wed, 5 Jun 2013 18:37:42 +0100 [thread overview]
Message-ID: <1370453866-16534-50-git-send-email-nick.dyer@itdev.co.uk> (raw)
In-Reply-To: <1370453866-16534-1-git-send-email-nick.dyer@itdev.co.uk>
Allow the driver to optionally manage enabling/disable power to the touch
controller itself. If the regulators are not present then use the deep sleep
power mode instead.
For a correct power on sequence, it is required that we have control over the
RESET line.
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
Acked-by: Benson Leung <bleung@chromium.org>
---
drivers/input/touchscreen/atmel_mxt_ts.c | 95 +++++++++++++++++++++++++++---
include/linux/i2c/atmel_mxt_ts.h | 1 +
2 files changed, 89 insertions(+), 7 deletions(-)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 8e19ab1..ce676a1 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -24,6 +24,8 @@
#include <linux/input/mt.h>
#include <linux/interrupt.h>
#include <linux/slab.h>
+#include <linux/regulator/consumer.h>
+#include <linux/gpio.h>
/* Firmware files */
#define MXT_FW_NAME "maxtouch.fw"
@@ -152,6 +154,8 @@ struct t9_range {
#define MXT_FW_RESET_TIME 3000 /* msec */
#define MXT_FW_CHG_TIMEOUT 300 /* msec */
#define MXT_WAKEUP_TIME 25 /* msec */
+#define MXT_REGULATOR_DELAY 150 /* msec */
+#define MXT_POWERON_DELAY 150 /* msec */
/* Command to unlock bootloader */
#define MXT_UNLOCK_CMD_MSB 0xaa
@@ -220,6 +224,9 @@ struct mxt_data {
u8 num_stylusids;
unsigned long t15_keystatus;
bool use_retrigen_workaround;
+ bool use_regulator;
+ struct regulator *reg_vdd;
+ struct regulator *reg_avdd;
/* Cached parameters from object table */
u16 T5_address;
@@ -1843,6 +1850,66 @@ static int mxt_read_t9_resolution(struct mxt_data *data)
return 0;
}
+static void mxt_regulator_enable(struct mxt_data *data)
+{
+ gpio_set_value(data->pdata->gpio_reset, 0);
+
+ regulator_enable(data->reg_vdd);
+ regulator_enable(data->reg_avdd);
+ msleep(MXT_REGULATOR_DELAY);
+
+ INIT_COMPLETION(data->bl_completion);
+ gpio_set_value(data->pdata->gpio_reset, 1);
+ mxt_wait_for_completion(data, &data->bl_completion, MXT_POWERON_DELAY);
+}
+
+static void mxt_regulator_disable(struct mxt_data *data)
+{
+ regulator_disable(data->reg_vdd);
+ regulator_disable(data->reg_avdd);
+}
+
+static void mxt_probe_regulators(struct mxt_data *data)
+{
+ struct device *dev = &data->client->dev;
+ int error;
+
+ /* According to maXTouch power sequencing specification, RESET line
+ * must be kept low until some time after regulators come up to
+ * voltage */
+ if (!data->pdata->gpio_reset) {
+ dev_warn(dev, "Must have reset GPIO to use regulator support\n");
+ goto fail;
+ }
+
+ data->reg_vdd = regulator_get(dev, "vdd");
+ if (IS_ERR(data->reg_vdd)) {
+ error = PTR_ERR(data->reg_vdd);
+ dev_err(dev, "Error %d getting vdd regulator\n", error);
+ goto fail;
+ }
+
+ data->reg_avdd = regulator_get(dev, "avdd");
+ if (IS_ERR(data->reg_vdd)) {
+ error = PTR_ERR(data->reg_vdd);
+ dev_err(dev, "Error %d getting avdd regulator\n", error);
+ goto fail_release;
+ }
+
+ data->use_regulator = true;
+ mxt_regulator_enable(data);
+
+ dev_dbg(dev, "Initialised regulators\n");
+ return;
+
+fail_release:
+ regulator_put(data->reg_vdd);
+fail:
+ data->reg_vdd = NULL;
+ data->reg_avdd = NULL;
+ data->use_regulator = false;
+}
+
static int mxt_initialize(struct mxt_data *data)
{
struct i2c_client *client = data->client;
@@ -2037,6 +2104,9 @@ static int mxt_load_fw(struct device *dev, const char *fn)
goto release_firmware;
if (data->suspended) {
+ if (data->use_regulator)
+ mxt_regulator_enable(data);
+
enable_irq(data->irq);
data->suspended = false;
}
@@ -2281,14 +2351,18 @@ static void mxt_start(struct mxt_data *data)
if (!data->suspended || data->in_bootloader)
return;
- /* Discard any touch messages still in message buffer from before chip
- * went to sleep */
- mxt_process_messages_until_invalid(data);
+ if (data->use_regulator) {
+ mxt_regulator_enable(data);
+ } else {
+ /* Discard any messages still in message buffer from before
+ * chip went to sleep */
+ mxt_process_messages_until_invalid(data);
- mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN);
+ mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN);
- /* Recalibrate since chip has been in deep sleep */
- mxt_t6_command(data, MXT_COMMAND_CALIBRATE, 1, false);
+ /* Recalibrate since chip has been in deep sleep */
+ mxt_t6_command(data, MXT_COMMAND_CALIBRATE, 1, false);
+ }
mxt_acquire_irq(data);
data->enable_reporting = true;
@@ -2303,7 +2377,10 @@ static void mxt_stop(struct mxt_data *data)
data->enable_reporting = false;
disable_irq(data->irq);
- mxt_set_t7_power_cfg(data, MXT_POWER_CFG_DEEPSLEEP);
+ if (data->use_regulator)
+ mxt_regulator_disable(data);
+ else
+ mxt_set_t7_power_cfg(data, MXT_POWER_CFG_DEEPSLEEP);
mxt_reset_slots(data);
data->suspended = true;
@@ -2491,6 +2568,8 @@ static int mxt_probe(struct i2c_client *client,
goto err_free_pdata;
}
+ mxt_probe_regulators(data);
+
disable_irq(data->irq);
error = mxt_initialize(data);
@@ -2554,6 +2633,8 @@ static int mxt_remove(struct i2c_client *client)
sysfs_remove_group(&client->dev.kobj, &mxt_attr_group);
free_irq(data->irq, data);
input_unregister_device(data->input_dev);
+ regulator_put(data->reg_avdd);
+ regulator_put(data->reg_vdd);
mxt_free_object_table(data);
if (!dev_get_platdata(&data->client->dev))
kfree(data->pdata);
diff --git a/include/linux/i2c/atmel_mxt_ts.h b/include/linux/i2c/atmel_mxt_ts.h
index b7d2092..a01f2e8 100644
--- a/include/linux/i2c/atmel_mxt_ts.h
+++ b/include/linux/i2c/atmel_mxt_ts.h
@@ -22,6 +22,7 @@ struct mxt_platform_data {
const unsigned int *t19_keymap;
int t15_num_keys;
const unsigned int *t15_keymap;
+ unsigned long gpio_reset;
};
#endif /* __LINUX_ATMEL_MXT_TS_H */
--
1.7.10.4
next prev parent reply other threads:[~2013-06-05 18:01 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-05 17:36 Atmel updates to atmel_mxt_ts touch controller driver - v5 Daniel Kurtz <djkurtz@chromium.org>, Henrik Rydberg <rydberg@euromail.se>, Joonyoung Shim <jy0922.shim@samsung.com>, Alan.Bowens@atmel.com, linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, pmeerw@pmeerw.net, bleung@chromium.org, olofj@chromium.org Nick Dyer
2013-06-05 17:36 ` [PATCH 01/53] Input: atmel_mxt_ts - Remove unnecessary platform data Nick Dyer
2013-06-05 17:36 ` [PATCH 02/53] Input: atmel_mxt_ts - Improve T19 GPIO keys handling Nick Dyer
2013-06-05 17:36 ` [PATCH 03/53] Input: atmel_mxt_ts - Return IRQ_NONE when interrupt handler fails Nick Dyer
2013-06-05 17:36 ` [PATCH 04/53] Input: atmel_mxt_ts - define helper functions for size and instances Nick Dyer
2013-06-05 17:36 ` [PATCH 05/53] Input: atmel_mxt_ts - Select FW_LOADER for firmware code Nick Dyer
2013-06-05 17:36 ` [PATCH 06/53] Input: atmel_mxt_ts - wait for CHG assert in mxt_check_bootloader Nick Dyer
2013-06-05 17:37 ` [PATCH 07/53] Input: atmel_mxt_ts - wait for CHG after bootloader resets Nick Dyer
2013-06-05 17:37 ` [PATCH 08/53] Input: atmel_mxt_ts - Initialise IRQ before probing Nick Dyer
2013-06-05 17:37 ` [PATCH 09/53] Input: atmel_mxt_ts - Make wait-after-reset period compatible with all chips Nick Dyer
2013-06-05 17:37 ` [PATCH 10/53] Input: atmel_mxt_ts - Add memory access interface via sysfs Nick Dyer
2013-06-05 17:57 ` Dmitry Torokhov
2013-06-05 18:45 ` Nick Dyer
2013-06-05 19:04 ` Dmitry Torokhov
2013-06-05 20:31 ` Nick Dyer
2013-06-05 21:07 ` Dmitry Torokhov
2013-06-05 21:36 ` Nick Dyer
2013-06-06 10:03 ` Mark Brown
2013-06-06 10:31 ` Nick Dyer
2013-06-06 10:55 ` Mark Brown
2013-06-06 11:17 ` Nick Dyer
2013-06-06 13:16 ` Mark Brown
2013-06-06 16:13 ` Nick Dyer
2013-06-06 16:46 ` Mark Brown
2013-06-07 15:12 ` Nick Dyer
2013-06-07 15:41 ` Mark Brown
2013-06-07 16:11 ` Nick Dyer
2013-06-07 16:47 ` Mark Brown
2013-06-11 10:39 ` Nick Dyer
2013-06-11 11:47 ` Mark Brown
2013-06-11 12:16 ` Nick Dyer
2013-06-19 18:59 ` Mark Brown
2013-06-21 16:16 ` Nick Dyer
2013-07-02 10:11 ` Mark Brown
2013-07-11 7:41 ` Nick Dyer
2013-07-11 10:30 ` Mark Brown
2013-06-06 9:48 ` Mark Brown
2013-06-06 10:40 ` Nick Dyer
2013-06-06 10:46 ` Mark Brown
2013-06-06 11:00 ` Nick Dyer
2013-06-06 11:14 ` Mark Brown
2013-06-06 11:34 ` Nick Dyer
2013-06-06 13:21 ` Mark Brown
2013-06-06 18:01 ` Greg KH
2013-06-07 14:47 ` Nick Dyer
2013-06-05 17:37 ` [PATCH 11/53] Input: atmel_mxt_ts - Implement debug output for messages Nick Dyer
2013-06-05 17:37 ` [PATCH 12/53] Input: atmel_mxt_ts - Improve error reporting and debug Nick Dyer
2013-06-05 17:37 ` [PATCH 13/53] Input: atmel_mxt_ts - Implement CRC check for configuration data Nick Dyer
2013-06-05 17:37 ` [PATCH 14/53] Input: atmel_mxt_ts - Download device config using firmware loader Nick Dyer
2013-06-05 17:37 ` [PATCH 15/53] Input: atmel_mxt_ts - Calculate and check CRC in config file Nick Dyer
2013-06-05 17:37 ` [PATCH 16/53] Input: atmel_mxt_ts - Add additional bootloader addresses Nick Dyer
2013-06-05 17:37 ` [PATCH 17/53] Input: atmel_mxt_ts - Read and report bootloader version Nick Dyer
2013-06-05 17:37 ` [PATCH 18/53] Input: atmel_mxt_ts - Implement bootloader frame retries Nick Dyer
2013-06-05 17:37 ` [PATCH 19/53] Input: atmel_mxt_ts - Improve bootloader progress output Nick Dyer
2013-06-05 17:37 ` [PATCH 20/53] Input: atmel_mxt_ts - Add check for incorrect firmware file format Nick Dyer
2013-06-05 17:37 ` [PATCH 21/53] Input: atmel_mxt_ts - Read screen config from chip Nick Dyer
2013-06-05 17:37 ` [PATCH 22/53] Input: atmel_mxt_ts - Set default irqflags when there is no pdata Nick Dyer
2013-06-05 17:37 ` [PATCH 23/53] Input: atmel_mxt_ts - Use deep sleep mode when stopped Nick Dyer
2013-06-05 17:37 ` [PATCH 24/53] Input: atmel_mxt_ts - Add shutdown function Nick Dyer
2013-06-05 17:37 ` [PATCH 25/53] Input: atmel_mxt_ts - Rename pressure to amplitude to match spec Nick Dyer
2013-06-05 17:37 ` [PATCH 26/53] Input: atmel_mxt_ts - Rename touchscreen defines to include T9 Nick Dyer
2013-06-05 17:37 ` [PATCH 27/53] Input: atmel_mxt_ts - Handle multiple input reports in one message Nick Dyer
2013-06-05 17:37 ` [PATCH 28/53] Input: atmel_mxt_ts - Move input device init into separate function Nick Dyer
2013-06-05 17:37 ` [PATCH 29/53] Input: atmel_mxt_ts - Handle APP_CRC_FAIL on startup Nick Dyer
2013-06-05 17:37 ` [PATCH 30/53] Input: atmel_mxt_ts - Handle bootloader previously unlocked Nick Dyer
2013-06-05 17:37 ` [PATCH 31/53] Input: atmel_mxt_ts - Add bootloader addresses for new chips Nick Dyer
2013-06-05 17:37 ` [PATCH 32/53] Input: atmel_mxt_ts - Recover from bootloader on probe Nick Dyer
2013-06-05 17:37 ` [PATCH 33/53] Input: atmel_mxt_ts - Add support for dynamic message size Nick Dyer
2013-06-05 17:37 ` [PATCH 34/53] Input: atmel_mxt_ts - Decode T6 status messages Nick Dyer
2013-06-05 17:37 ` [PATCH 35/53] Input: atmel_mxt_ts - Split message handler into separate functions Nick Dyer
2013-06-05 17:37 ` [PATCH 36/53] Input: atmel_mxt_ts - Implement T44 message handling Nick Dyer
2013-06-05 17:37 ` [PATCH 37/53] Input: atmel_mxt_ts - Output status from T48 Noise Supression Nick Dyer
2013-06-05 17:37 ` [PATCH 38/53] Input: atmel_mxt_ts - Output status from T42 Touch Suppression Nick Dyer
2013-06-05 17:37 ` [PATCH 39/53] Input: atmel_mxt_ts - Implement vector/orientation support Nick Dyer
2013-06-05 17:37 ` [PATCH 40/53] Input: atmel_mxt_ts - implement I2C retries Nick Dyer
2013-06-05 17:37 ` [PATCH 41/53] Input: atmel_mxt_ts - Implement T63 Active Stylus support Nick Dyer
2013-06-05 17:37 ` [PATCH 42/53] Input: atmel_mxt_ts - Implement support for T15 Key Array Nick Dyer
2013-06-05 17:37 ` [PATCH 43/53] Input: atmel_mxt_ts - Remove unused defines Nick Dyer
2013-06-05 17:37 ` [PATCH 44/53] Input: atmel_mxt_ts - Verify Information Block checksum on probe Nick Dyer
2013-06-07 18:37 ` Yufeng Shen
2013-06-10 9:35 ` Nick Dyer
2013-06-05 17:37 ` [PATCH 45/53] Input: atmel_mxt_ts - Use T18 RETRIGEN to handle IRQF_TRIGGER_LOW Nick Dyer
2013-06-05 17:37 ` [PATCH 46/53] Input: atmel_mxt_ts - Handle reports from T47 Stylus object Nick Dyer
2013-06-05 17:37 ` [PATCH 47/53] Input: atmel_mxt_ts - Release touch state during suspend Nick Dyer
2013-06-05 17:37 ` [PATCH 48/53] Input: atmel_mxt_ts - Initialize power config before and after downloading cfg Nick Dyer
2013-06-05 17:37 ` Nick Dyer [this message]
2013-06-05 17:37 ` [PATCH 50/53] Input: atmel_mxt_ts - Implement support for T100 touch object Nick Dyer
2013-06-05 17:37 ` [PATCH 51/53] Input: atmel_mxt_ts - Allow specification of firmware file name Nick Dyer
2013-06-05 17:37 ` [PATCH 52/53] Input: atmel_mxt_ts - Handle cfg filename via pdata/sysfs Nick Dyer
2013-06-05 17:37 ` [PATCH 53/53] Input: atmel_mxt_ts - Only use first T9 instance Nick Dyer
2013-06-06 19:18 ` Atmel updates to atmel_mxt_ts touch controller driver - v5 Daniel Kurtz <djkurtz@chromium.org>, Henrik Rydberg <rydberg@euromail.se>, Joonyoung Shim <jy0922.shim@samsung.com>, Alan.Bowens@atmel.com, linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, pmeerw@pmeerw.net, bleung@chromium.org, olofj@chromium.org Dmitry Torokhov
[not found] ` <CAPDwgkPdtj0Th8P+y9e5O7swARfzS40sG1A3Ba=pAmeXfMx0Dw@mail.gmail.com>
2013-06-06 19:46 ` Dmitry Torokhov
2013-06-07 20:21 ` Yufeng Shen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1370453866-16534-50-git-send-email-nick.dyer@itdev.co.uk \
--to=nick.dyer@itdev.co.uk \
--cc=Alan.Bowens@atmel.com \
--cc=bleung@chromium.org \
--cc=djkurtz@chromium.org \
--cc=dmitry.torokhov@gmail.com \
--cc=jy0922.shim@samsung.com \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=olofj@chromium.org \
--cc=pmeerw@pmeerw.net \
--cc=rydberg@euromail.se \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®