Message ID | 20141109115636.GA3106@amd (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Hi, On Sun, Nov 09, 2014 at 12:56:37PM +0100, Pavel Machek wrote: > 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
On Sunday 09 November 2014 13:40:25 Sebastian Reichel wrote: > Hi, > > On Sun, Nov 09, 2014 at 12:56:37PM +0100, Pavel Machek wrote: > > 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?
On Sun, Nov 09, 2014 at 01:49:19PM +0100, Pali Rohár wrote: > On Sunday 09 November 2014 13:40:25 Sebastian Reichel wrote: > > Hi, > > > > On Sun, Nov 09, 2014 at 12:56:37PM +0100, Pavel Machek wrote: > > > 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? 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.
On Sunday 09 November 2014 21:01:42 Dmitry Torokhov wrote: > On Sun, Nov 09, 2014 at 01:49:19PM +0100, Pali Rohár wrote: > > On Sunday 09 November 2014 13:40:25 Sebastian Reichel wrote: > > > Hi, > > > > > > On Sun, Nov 09, 2014 at 12:56:37PM +0100, Pavel Machek wrote: > > > > 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? > > 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. Ok. What about adding sysfs node disable which accept value 0/1?
diff --git a/drivers/input/touchscreen/tsc2005.c b/drivers/input/touchscreen/tsc2005.c index 52380b6..ec1c276 100644 --- a/drivers/input/touchscreen/tsc2005.c +++ b/drivers/input/touchscreen/tsc2005.c @@ -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;
Implement disable attribute for tsc2005 touchscreen. It is useful to avoid wakeups when phone is in the pocket. Signed-off-by: Pavel Machek <pavel@ucw.cz> --- [This is from Pali's n900 tree that is GPL, so that is okay, but maybe I should get his sign-off here?]