Skip to contentSkip to conversation

tsc2005 touchscreen: implement disable attribute

PATCH Pavel Machek 4 participants 5 messages Nov 9, 2014 – Nov 10, 2014

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

Implement disable attribute for tsc2005 touchscreen. It is useful to avoid wakeups when phone is in the pocket.

---

[This is from Pali's n900 tree that is GPL, so that is okay, but maybe I should get his sign-off here?]

drivers/input/touchscreen/tsc2005.c +48 -4
index 52380b6..ec1c276 100644
@@ -147,6 +147,7 @@ struct tsc2005 {
 
 	unsigned int		x_plate_ohm;
 
+	bool			disabled;
 	bool			opened;
 	bool			suspended;
 
@@ -384,6 +385,48 @@ static void __tsc2005_enable(struct tsc2005 *ts)
 
 }
 
+static ssize_t tsc2005_disable_show(struct device *dev,
+				    struct device_attribute *attr, char *buf)
+{
+	struct spi_device *spi = to_spi_device(dev);
+	struct tsc2005 *ts = spi_get_drvdata(spi);
+
+	return sprintf(buf, "%u\n", ts->disabled);
+}
+
+static ssize_t tsc2005_disable_store(struct device *dev,
+				     struct device_attribute *attr,
+				     const char *buf, size_t count)
+{
+	struct spi_device *spi = to_spi_device(dev);
+	struct tsc2005 *ts = spi_get_drvdata(spi);
+	unsigned long val;
+	int error;
+
+	error = kstrtoul(buf, 10, &val);
+	if (error)
+		return error;
+
+	mutex_lock(&ts->mutex);
+
+	if (!ts->suspended && ts->opened) {
+		if (val) {
+			if (!ts->disabled)
+				__tsc2005_disable(ts);
+		} else {
+			if (ts->disabled)
+				__tsc2005_enable(ts);
+		}
+	}
+
+	ts->disabled = !!val;
+
+	mutex_unlock(&ts->mutex);
+
+	return count;
+}
+static DEVICE_ATTR(disable, 0664, tsc2005_disable_show, tsc2005_disable_store);
+
 static ssize_t tsc2005_selftest_show(struct device *dev,
 				     struct device_attribute *attr,
 				     char *buf)
@@ -466,6 +509,7 @@ out:
 static DEVICE_ATTR(selftest, S_IRUGO, tsc2005_selftest_show, NULL);
 
 static struct attribute *tsc2005_attrs[] = {
+	&dev_attr_disable.attr,
 	&dev_attr_selftest.attr,
 	NULL
 };
@@ -551,7 +595,7 @@ static int tsc2005_open(struct input_dev *input)
 
 	mutex_lock(&ts->mutex);
 
-	if (!ts->suspended)
+	if (!ts->suspended && !ts->disabled)
 		__tsc2005_enable(ts);
 
 	ts->opened = true;
@@ -567,7 +611,7 @@ static void tsc2005_close(struct input_dev *input)
 
 	mutex_lock(&ts->mutex);
 
-	if (!ts->suspended)
+	if (!ts->suspended && !ts->disabled)
 		__tsc2005_disable(ts);
 
 	ts->opened = false;
@@ -781,7 +825,7 @@ static int tsc2005_suspend(struct device *dev)
 
 	mutex_lock(&ts->mutex);
 
-	if (!ts->suspended && ts->opened)
+	if (!ts->suspended && !ts->disabled && ts->opened)
 		__tsc2005_disable(ts);
 
 	ts->suspended = true;
@@ -798,7 +842,7 @@ static int tsc2005_resume(struct device *dev)
 
 	mutex_lock(&ts->mutex);
 
-	if (ts->suspended && ts->opened)
+	if (ts->suspended && !ts->disabled && ts->opened)
 		__tsc2005_enable(ts);
 
 	ts->suspended = false;
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#1 lore raw

Hi,

Quoted 2 lines · Pavel Machek

Implement disable attribute for tsc2005 touchscreen. It is useful to avoid wakeups when phone is in the pocket.

I don't think this should be some driver specific sysfs node. Instead a generic method from the input subsystem should be used.

-- Sebastian
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20141109/f6b2e45d/attachment.sig>

#2 lore raw
Quoted 11 lines · On Sunday 09 November 2014 13:40:25 Sebastian Reichel wrote:

Hi,

Quoted 2 lines · Pavel Machek

Implement disable attribute for tsc2005 touchscreen. It is useful to avoid wakeups when phone is in the pocket.

I don't think this should be some driver specific sysfs node. Instead a generic method from the input subsystem should be used.

-- Sebastian

Yes. I would like to see generic method to turn off input device (or just "mute" it if device does not support turn off). Similar problem is also on laptops or other portable devices. E.g when I close LID of my laptop I want to turn off internal input devices (keyboard, touchpad, trackstick) without need to unload evdev Xserver drivers (or killing Xserver). Another use case is to turn off keyboard (also from kernel tty on Ctrl+Alt+Fx) which cannot be unplugged (internal laptop keyboard).

CCed Dmitry, what do you think about it?

Signature · 9 lines
Pali Roh?r
pali.rohar at gmail.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20141109/867a9e56/attachment.sig>
maintainer
#3 lore raw
Quoted 22 lines · Pali Roh?r
Quoted 11 lines · On Sunday 09 November 2014 13:40:25 Sebastian Reichel wrote:

Hi,

Quoted 2 lines · Pavel Machek

Implement disable attribute for tsc2005 touchscreen. It is useful to avoid wakeups when phone is in the pocket.

I don't think this should be some driver specific sysfs node. Instead a generic method from the input subsystem should be used.

-- Sebastian

Yes. I would like to see generic method to turn off input device (or just "mute" it if device does not support turn off). Similar problem is also on laptops or other portable devices. E.g when I close LID of my laptop I want to turn off internal input devices (keyboard, touchpad, trackstick) without need to unload evdev Xserver drivers (or killing Xserver). Another use case is to turn off keyboard (also from kernel tty on Ctrl+Alt+Fx) which cannot be unplugged (internal laptop keyboard).

Quoted 1 line

CCed Dmitry, what do you think about it?

Actually I'd like it to be not limited to input devices but rater try doing it at the device core level, if possible. I am sure there are IIO and other devices that could be forcibly turned off/put into low power mode under certain circumstances.

There were some talks about it with Rafael, but we never come with anything concrete.

Thanks.

Signature · 1 line
Dmitry
#4 lore raw
Quoted 5 lines · On Sunday 09 November 2014 21:01:42 Dmitry Torokhov wrote:
Quoted 4 lines · Pali Roh?r
Quoted 3 lines · On Sunday 09 November 2014 13:40:25 Sebastian Reichel wrote:

Hi,

On Sun, Nov 09, 2014 at 12:56:37PM +0100, Pavel Machek

Quoted 27 lines · wrote:
Quoted 19 lines
Quoted 8 lines
Quoted 2 lines

Implement disable attribute for tsc2005 touchscreen. It is useful to avoid wakeups when phone is in the pocket.

I don't think this should be some driver specific sysfs node. Instead a generic method from the input subsystem should be used.

-- Sebastian

Yes. I would like to see generic method to turn off input device (or just "mute" it if device does not support turn off). Similar problem is also on laptops or other portable devices. E.g when I close LID of my laptop I want to turn off internal input devices (keyboard, touchpad, trackstick) without need to unload evdev Xserver drivers (or killing Xserver). Another use case is to turn off keyboard (also from kernel tty on Ctrl+Alt+Fx) which cannot be unplugged (internal laptop keyboard).

Quoted 1 line

CCed Dmitry, what do you think about it?

Actually I'd like it to be not limited to input devices but rater try doing it at the device core level, if possible. I am sure there are IIO and other devices that could be forcibly turned off/put into low power mode under certain circumstances.

Quoted 4 lines

There were some talks about it with Rafael, but we never come with anything concrete.

Thanks.

Ok. What about adding sysfs node disable which accept value 0/1?

Signature · 9 lines
Pali Roh?r
pali.rohar at gmail.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20141110/eaa42bf7/attachment.sig>