aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/mouse
Commit message (Collapse)AuthorAgeFilesLines
* Merge branch 'for-linus' of ↵Linus Torvalds2010-04-152-1/+1
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Input: wacom - switch mode upon system resume Revert "Input: wacom - merge out and in prox events" Input: matrix_keypad - allow platform to disable key autorepeat Input: ALPS - add signature for HP Pavilion dm3 laptops Input: i8042 - spelling fix Input: sparse-keymap - implement safer freeing of the keymap Input: update the status of the Multitouch X driver project Input: clarify the no-finger event in multitouch protocol Input: bcm5974 - retract efi-broken suspend_resume Input: sparse-keymap - free the right keymap on error
| * Input: ALPS - add signature for HP Pavilion dm3 laptopsChase Douglas2010-04-051-0/+1
| | | | | | | | | | | | | | | | | | | | Tested by a user running Ubuntu 9.10 in the following bug report. BugLink: http://bugs.launchpad.net/bugs/545307 Signed-off-by: Chase Douglas <chase.douglas@canonical.com> Cc: stable@kernel.org Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
| * Input: bcm5974 - retract efi-broken suspend_resumeHenrik Rydberg2010-03-201-1/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | With the recent system-wide improvements on suspend/resume and EFI booting the suspend_resume method of the bcm5974 has broken. When waking up from the S3 state on the MacBookAir, the trackpad is found in a yet unknown state, unable to switch to the proper multitouch mode. The result is a frozen touchpad, and a flood of errors of the kind bcm5974: bad trackpad package, length: 8. This patch retracts the reset_resume method altogether, falling back on the generic unbind/rebind functionality of the usb layer until further investigations can be made as how to reset the device when booting from efi. Signed-off-by: Henrik Rydberg <rydberg@euromail.se> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | include cleanup: Update gfp.h and slab.h includes to prepare for breaking ↵Tejun Heo2010-03-3010-1/+9
|/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | implicit slab.h inclusion from percpu.h percpu.h is included by sched.h and module.h and thus ends up being included when building most .c files. percpu.h includes slab.h which in turn includes gfp.h making everything defined by the two files universally available and complicating inclusion dependencies. percpu.h -> slab.h dependency is about to be removed. Prepare for this change by updating users of gfp and slab facilities include those headers directly instead of assuming availability. As this conversion needs to touch large number of source files, the following script is used as the basis of conversion. http://userweb.kernel.org/~tj/misc/slabh-sweep.py The script does the followings. * Scan files for gfp and slab usages and update includes such that only the necessary includes are there. ie. if only gfp is used, gfp.h, if slab is used, slab.h. * When the script inserts a new include, it looks at the include blocks and try to put the new include such that its order conforms to its surrounding. It's put in the include block which contains core kernel includes, in the same order that the rest are ordered - alphabetical, Christmas tree, rev-Xmas-tree or at the end if there doesn't seem to be any matching order. * If the script can't find a place to put a new include (mostly because the file doesn't have fitting include block), it prints out an error message indicating which .h file needs to be added to the file. The conversion was done in the following steps. 1. The initial automatic conversion of all .c files updated slightly over 4000 files, deleting around 700 includes and adding ~480 gfp.h and ~3000 slab.h inclusions. The script emitted errors for ~400 files. 2. Each error was manually checked. Some didn't need the inclusion, some needed manual addition while adding it to implementation .h or embedding .c file was more appropriate for others. This step added inclusions to around 150 files. 3. The script was run again and the output was compared to the edits from #2 to make sure no file was left behind. 4. Several build tests were done and a couple of problems were fixed. e.g. lib/decompress_*.c used malloc/free() wrappers around slab APIs requiring slab.h to be added manually. 5. The script was run on all .h files but without automatically editing them as sprinkling gfp.h and slab.h inclusions around .h files could easily lead to inclusion dependency hell. Most gfp.h inclusion directives were ignored as stuff from gfp.h was usually wildly available and often used in preprocessor macros. Each slab.h inclusion directive was examined and added manually as necessary. 6. percpu.h was updated not to include slab.h. 7. Build test were done on the following configurations and failures were fixed. CONFIG_GCOV_KERNEL was turned off for all tests (as my distributed build env didn't work with gcov compiles) and a few more options had to be turned off depending on archs to make things build (like ipr on powerpc/64 which failed due to missing writeq). * x86 and x86_64 UP and SMP allmodconfig and a custom test config. * powerpc and powerpc64 SMP allmodconfig * sparc and sparc64 SMP allmodconfig * ia64 SMP allmodconfig * s390 SMP allmodconfig * alpha SMP allmodconfig * um on x86_64 SMP allmodconfig 8. percpu.h modifications were reverted so that it could be applied as a separate patch and serve as bisection point. Given the fact that I had only a couple of failures from tests on step 6, I'm fairly confident about the coverage of this conversion patch. If there is a breakage, it's likely to be something in one of the arch headers which should be easily discoverable easily on most builds of the specific arch. Signed-off-by: Tejun Heo <tj@kernel.org> Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
* Input: ALPS - fix stuck buttons on some touchpadsMartin Buck2010-03-131-30/+17
| | | | | | | | | | Enable button release event redirection to the device that got the button press not only for touchpads with interleaved protocols, but unconditionally for all Alps touchpads. This is required at least for the touchpads in Dell Inspiron 8200 and Latitude d630. Signed-off-by: Martin Buck <mb-tmp-yvahk-vachg@gromit.dyndns.org> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: appletouch - fix integer overflow issueVadim Zaliva2010-03-111-3/+3
| | | | | | | | | | | | | | | | | When reading data from Geyser 2 touchpads used on post Oct 2005 Apple PowerBooks the driver was casting X and Y coordinates values to 'signed char'. Testing on one of such PowerBooks I have noticed that touchpad always generates positive values, but some of them are greater that 127, and thus, when cast to 'signed char' being interpreted as a negative. Such bigger values have been observed infrequently, closer to the edges of a touchpad, so the problem was not very visible. Nevertheless, the patch would potentially improve touchpad driver accuracy. Signed-off-by: Vadim Zaliva <lord@crocodile.org> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: alps - add support for the touchpad on Toshiba Tecra A11-11LThomas Bächler2010-03-091-0/+2
| | | | | | Signed-off-by: Thomas Bächler <thomas@archlinux.org> Cc: stable@kernel.org Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Merge branch 'next' into for-linusDmitry Torokhov2010-02-281-4/+0
|\
| * Merge commit 'v2.6.33-rc5' into nextDmitry Torokhov2010-01-218-52/+88
| |\
| * | Input: psmouse - remove unused 'autocal' parameter from hgpk protocolDmitry Torokhov2010-01-061-4/+0
| | | | | | | | | | | | Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | | Input: psmouse - make sure we don't schedule reconnects after cleanupDmitry Torokhov2010-02-071-1/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | Set state of the device as "initializing" during and after cleanup to ensure that unsolicited data from the device is not passed on. We especially want to avoid processing new device announcements "0xaa 0x00" that can come up before we perform reconnect operation. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | | Input: lifebook - add another Lifebook DMI signatureJon Dodgson2010-01-281-0/+6
| |/ |/| | | | | | | | | | | There are many many ways one can capitalize "Lifebook B Series"... Signed-off-by: Jon Dodgson <crayzeejon@gmail.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: sentelic - fix left/right horizontal scroll mappingTai-hwa Liang2010-01-131-3/+3
| | | | | | | | | | Signed-off-by: Tai-hwa Liang <avatar@sentelic.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: pmouse - move Sentelic probe down the listTai-hwa Liang2010-01-131-13/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | Sentelic probes confuse IBM trackpoints so they stop responding to TP_READ_ID command. See: http://bugzilla.kernel.org/show_bug.cgi?id=14970 Let's move FSP detection lower so it is probed after trackpoint and others, just before we strat probing for Intellimouse Explorer. Signed-off-by: Tai-hwa Liang <avatar@sentelic.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: psmouse - fix Synaptics detection when protocol is disabledDaniel Drake2010-01-073-1/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | For configurations where Synaptics hardware is present but the Synaptics extensions support is not compiled in, the mouse is reprobed and a new device is allocated on every suspend/resume. During probe, psmouse_switch_protocol() calls psmouse_extensions() with set_properties=1. This calls the dummy synaptics_init() which returns an error code, instructing us not to use the synaptics extensions. During resume, psmouse_reconnect() calls psmouse_extensions() with set_properties=0, in which case call to synaptics_init() is bypassed and PSMOUSE_SYNAPTICS is returned. Since the result is different from previous attempt psmouse_reconnect() fails and full re-probe happens. Fix this by tweaking the set_properties=0 codepath in psmouse_extensions() to be more careful about offering PSMOUSE_SYNAPTICS extensions. Signed-off-by: Daniel Drake <dsd@laptop.org> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: bcm5974 - report ABS_MT eventsHenrik Rydberg2010-01-061-1/+43
| | | | | | | | | | | | | | | | | | Make bcm5974 report raw multi-touch (MT) data in the form of ABS_MT events. [dtor@mail.ru: get rid of module option, always report all events] Signed-off-by: Henrik Rydberg <rydberg@euromail.se> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: serio - fix potential deadlock when unbinding driversEric W. Biederman2010-01-061-29/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | sysfs_remove_group() waits for sysfs attributes to be removed, therefore we do not need to worry about driver-specific attributes being accessed after driver has been detached from the device. In fact, attempts to take serio->drv_mutex in attribute methods may lead to the following deadlock: sysfs_read_file() fill_read_buffer() sysfs_get_active_two() psmouse_attr_show_helper() serio_pin_driver() serio_disconnect_driver() mutex_lock(&serio->drv_mutex); <--------> mutex_lock(&serio_drv_mutex); psmouse_disconnect() sysfs_remove_group(... psmouse_attr_group); .... sysfs_deactivate(); wait_for_completion(); Fix this by removing calls to serio_[un]pin_driver() and functions themselves and using driver-private mutexes to serialize access to attribute's set() methods that may change device state. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: lifebook - add CONFIG_DMI dependencyDmitry Torokhov2009-12-292-3/+1
| | | | | | | | | | | | | | | | Lifebook protocol can only be activated if we find known DMI signature. It is useles without DMI. Reported-by: Rakib Mullick <rakib.mullick@gmail.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: psmouse - fix compile warning in hgpk moduleRené Bolldorf2009-12-291-1/+0
| | | | | | | | | | | | The variable 'dev' is unused in function 'hgpk_register'. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: speed up suspend/shutdown for PS/2 mice and keyboardsDmitry Torokhov2009-12-241-1/+4
|/ | | | | | | | | Instead of doing full-blown reset while suspending or shutting down the box use lighter form of reset that should take less time. Tested-by: Alan Stern <stern@rowland.harvard.edu> Tested-by: Rafael J. Wysocki <rjw@sisk.pl> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: ALPS - add interleaved protocol support (Dell E6x00 series)Sebastian Kapfer2009-12-152-27/+228
| | | | | | | | | | | | | | | | | | Properly handle version of the protocol where standard PS/2 packets from trackpoint are stuffed into middle (byte 3-6) of the standard ALPS packets when both the touchpad and trackpoint are used together. The patch is based on work done by Matthew Chapman and additional research done by David Kubicek and Erik Osterholm: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/296610 Many thanks to David Kubicek for his efforts in researching fine points of this new version of the protocol, especially interaction between pad and stick in these models. Signed-off-by: Sebastian Kapfer <sebastian_kapfer@gmx.net> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: ALPS - do not set REL_X/REL_Y capabilities on the touchpadDmitry Torokhov2009-12-111-0/+11
| | | | | | | Relative events are only reported via secondary device therefore device associated with the touchpad should not advertise these capabilities. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: psmouse - remove identification strings from DMI tablesDmitry Torokhov2009-12-042-15/+15
| | | | | | | | The driver does not reference identification strings in DMI tables and since these strings are no longer required by DMI core we can safely remove them and save some memory. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: psmouse - do not carry DMI data aroundDmitry Torokhov2009-12-035-13/+38
| | | | | | | DMI tables use considerable amount of memory. Mark them as __initconst so they will be discarded once module is loaded. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Merge commit 'v2.6.32' into nextDmitry Torokhov2009-12-022-4/+3
|\
| * Input: lifebook - fix settings for CF-72Abner Holsinger2009-11-161-2/+1
| | | | | | | | | | | | | | | | Panasonic CF-72 uses 6-byte protocol and does not need to be tied to a particular port. Signed-off-by: Abner Holsinger <9zabner@gmail.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
| * Input: psmouse - fix breakage introduced by b7802c5c1eaJiri Kosina2009-11-161-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit b7802c5c1ea ("Input: psmouse - use boolean type") caused the synaptics_hardware variable to be completely useless, as it is constantly set to 'true' throughout the whole psmouse_extensions(). This was caused by the following hunk in the commit in question - int synaptics_hardware = 0; + bool synaptics_hardware = true; which is wrong and causes driver to issue extra reset when falling back to bare PS/2 protocol. Signed-off-by: Jiri Kosina <jkosina@suse.cz> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
| * Input: psmouse - remove unneeded '\n' from psmouse.proto parameterTakashi Iwai2009-11-121-1/+1
| | | | | | | | | | | | | | | | The get parameter function should return a string without a life-feed. Otherwise you'll see additional empty line in sysfs parameters file. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: ALPS - add support for touchpads with 4-directional buttonMaxim Levitsky2009-11-201-35/+65
| | | | | | | | | | | | | | | | | | | | | | | | The touchpad on Acer Aspire 5720, 5520 and some other Aspire models (signature 0x73, 0x02, 0x50) has a button that can be rocked in 4 different directions. Make the driver to generate BTN_0..BTN_3 events in response. The Synaptics driver by default maps BTN_0 and BTN_1 to up and down, so there should be no visible changes with the old setup that generated BTN_FORWARD and BTN_BACK (also mapped to up and down). Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: psmouse - rework setting of BTN_MIDDLE capabilityDmitry Torokhov2009-11-205-31/+38
| | | | | | | | | | | | | | | | | | | | Do not start protocol detection assuming that middle mouse is present, instead let individual protocols explicitly set this capability. This fixes issue with Synaptics touchpads pretending that they have middle button when hardware clearly reports otherwise. Reported-and-tested-by: Andrey Borzenkov <arvidjaar@mail.ru> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: lifebook - do not advertise unsupported buttonsDmitry Torokhov2009-11-201-6/+7
| | | | | | | | | | | | | | | | The main input device of Lifebook touchscreens does not generate left/right/middle button events and therefore should not be advertising them in its capabilities. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: elantech - do not advertise relative eventsDmitry Torokhov2009-11-201-0/+1
| | | | | | | | | | | | | | Elantech touchpads work in absolute mode and do not generate relative events so they should not be advertising them. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: touchkit_ps2 - do not advertise unsupported buttonsDmitry Torokhov2009-11-201-1/+2
| | | | | | | | | | | | | | Touchkit PS/2 touchscreen does not have left/right/middle buttons and should not be advertising as capable of generating these events. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Merge commit 'v2.6.32-rc6' into nextDmitry Torokhov2009-11-052-1/+11
|\ \ | |/
| * Input: logips2pp - model 73 is actually TrackMan FXDmitry Torokhov2009-10-181-1/+1
| | | | | | | | | | Reported-and-tested-by: Harald Dunkel <harald.dunkel@t-online.de> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
| * Input: synaptics - add another Protege M300 to rate blacklistDmitry Torokhov2009-10-121-0/+10
| | | | | | | | | | | | | | | | | | | | | | Apparently some of Toshiba Protege M300 identify themselves as "Portable PC" in DMI so we need to add that to the DMI table as well. We need DMI data so we can automatically lower Synaptics reporting rate from 80 to 40 pps to avoid over-taxing their keyboard controllers. Tested-by: Rod Davison <roddavison@gmail.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: synaptic_i2c - make unnecessarily global functions staticDmitry Torokhov2009-11-021-3/+3
| | | | | | | | Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: vsxxxaa - change formatting style to match the rest of the kernelDmitry Torokhov2009-10-131-199/+175
|/ | | | | | | | | - no spaces between function name and opening parenthesis - switch statements were indented too much This makes checkpatch (and me) happy. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: synaptics_i2c - switch to using __cancel_delayed_work()Dmitry Torokhov2009-09-171-19/+32
| | | | | | | | cancel_delayed_work() may spin and therefore should not be used in interrupt contexts. Acked-by: Mike Rapoport <mike@compulab.co.il> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: libps2 - additional locking for i8042 portsDmitry Torokhov2009-09-171-8/+10
| | | | | | | | | | | | | | | | | The serio ports on i8042 are not completely isolated; while we provide enough locking to ensure proper serialization when accessing control and data registers AUX and KBD ports can still have an effect on each other on PS/2 protocol level. The most prominent effect is that issuing a command for the device connected to one port may cause abort of the command currently executing by the device connected to another port. Since i8042 nor serio subsystem are not aware of the details of the PS/2 protocol (length of the commands and their replies and so on) the locking should be done on libps2 level by adding special handling when we see that we are dealing with serio port on i8042. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: bcm5974 - silence uninitialized variables warningsHenrik Rydberg2009-09-131-15/+16
| | | | Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: psmouse - use boolean typeDmitry Torokhov2009-09-1020-125/+133
| | | | Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: add new driver for Sentelic Finger Sensing PadTai-hwa Liang2009-08-196-1/+1000
| | | | | | | | This is the driver for Sentelic Finger Sensing Pad which can be found on MSI WIND Netbook. Signed-off-by: Tai-hwa Liang <avatar@sentelic.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: psmouse - allow defining read-only attributesDmitry Torokhov2009-08-191-5/+16
| | | | Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: combine hil_kbd and hil_ptr driversDmitry Torokhov2009-08-093-456/+0
| | | | | | | | | hil_kbd and hil_ptr look like twins so it makes sense to combine them into a single driver. [deller@gmx.de: add MODULE_ALIAS() entry for mouse] Tested-by: Helge Deller <deller@gmx.de> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio - don't use serio->write() directlyDmitry Torokhov2009-08-052-20/+20
| | | | | | We have a nice wrapper for that. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: hgpk - forced recalibration for the OLPC touchpadPaul Fox2009-08-051-3/+52
| | | | | | | | | | | | | | | | | | | The OLPC XO laptop incorporates a combination touchpad/tablet device which unfortunately requires frequent recalibration. The driver will force this automatically when various suspicious behaviors are observed, and the user can recalibrate manually (with a special keyboard sequence). There's currently no way, however, for an external program to cause recalibration. We can not use the reconnect capability which is already available in /sys because full reset of the touchpad takes 1.1 - 1.2 secons which is too long. This patch creates a new node in /sys which, when written with '1', will force a touchpad recalibration; no other writes (or reads) of this node are supported. Signed-off-by: Paul Fox <pgf@laptop.org> Acked-by: Andres Salomon <dilinger@collabora.co.uk> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: gpio_mouse - use standard driver registration methodSaeed Bishara2009-07-071-6/+5
| | | | | | | | This patch is needed when the gpio's became available only at late stages, for example, when using i2c gpio expander. Signed-off-by: Saeed Bishara <saeed@marvell.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: add driver for Synaptics I2C touchpadMike Rapoport2009-06-193-0/+695
| | | | | | | | | | This driver supports Synaptics I2C touchpad controller on eXeda mobile device. Unfortunaltely it only works in relative mode and thus is not comaptible with Xorg Synaptics driver. Signed-off-by: Igor Grinberg <grinberg@compulab.co.il> Signed-off-by: Mike Rapoport <mike@compulab.co.il> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: synaptics - add support for reporting x/y resolutionTero Saarni2009-06-192-0/+30
| | | | | | | | | | Synaptics uses anisotropic coordinate system. On some wide touchpads vertical resolution can be twice as high as horizontal which causes unequal sensitivity on x/y directions. Add support for reading the resolution with EVIOCGABS ioctl. Signed-off-by: Tero Saarni <tero.saarni@gmail.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>