S: Maintained
F: drivers/mailbox/mailbox-altera.c
+ + ++++ALTERA PIO DRIVER
+ + ++++M: Tien Hock Loh <thloh@altera.com>
+ + ++++L: linux-gpio@vger.kernel.org
+ + ++++S: Maintained
+ + ++++F: drivers/gpio/gpio-altera.c
+ + ++++
ALTERA TRIPLE SPEED ETHERNET DRIVER
M: Vince Bridgers <vbridger@opensource.altera.com>
L: netdev@vger.kernel.org
F: include/linux/amd-iommu.h
AMD KFD
- - ----M: Oded Gabbay <oded.gabbay@amd.com>
- - ----L: dri-devel@lists.freedesktop.org
- - ----T: git git://people.freedesktop.org/~gabbayo/linux.git
- - ----S: Supported
- - ----F: drivers/gpu/drm/amd/amdkfd/
+ + ++++M: Oded Gabbay <oded.gabbay@amd.com>
+ + ++++L: dri-devel@lists.freedesktop.org
+ + ++++T: git git://people.freedesktop.org/~gabbayo/linux.git
+ + ++++S: Supported
+ + ++++F: drivers/gpu/drm/amd/amdkfd/
F: drivers/gpu/drm/amd/include/cik_structs.h
F: drivers/gpu/drm/amd/include/kgd_kfd_interface.h
- - ----F: drivers/gpu/drm/radeon/radeon_kfd.c
- - ----F: drivers/gpu/drm/radeon/radeon_kfd.h
- - ----F: include/uapi/linux/kfd_ioctl.h
+ + ++++F: drivers/gpu/drm/radeon/radeon_kfd.c
+ + ++++F: drivers/gpu/drm/radeon/radeon_kfd.h
+ + ++++F: include/uapi/linux/kfd_ioctl.h
AMD MICROCODE UPDATE SUPPORT
M: Borislav Petkov <bp@alien8.de>
F: drivers/media/rc/meson-ir.c
N: meson[x68]
+ + ++++ARM/Annapurna Labs ALPINE ARCHITECTURE
+ + ++++M: Tsahee Zidenberg <tsahee@annapurnalabs.com>
+ + ++++S: Maintained
+ + ++++F: arch/arm/mach-alpine/
+ + ++++
ARM/ATMEL AT91RM9200 AND AT91SAM ARM ARCHITECTURES
- - ----M: Andrew Victor <linux@maxim.org.za>
M: Nicolas Ferre <nicolas.ferre@atmel.com>
+ + ++++M: Alexandre Belloni <alexandre.belloni@free-electrons.com>
M: Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
- - ----W: http://maxim.org.za/at91_26.html
W: http://www.linux4sam.org
S: Supported
F: arch/arm/mach-at91/
M: Mathieu Poirier <mathieu.poirier@linaro.org>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Maintained
- - ----F: drivers/coresight/*
+ + ++++F: drivers/hwtracing/coresight/*
F: Documentation/trace/coresight.txt
F: Documentation/devicetree/bindings/arm/coresight.txt
F: Documentation/ABI/testing/sysfs-bus-coresight-devices-*
ARM/CORTINA SYSTEMS GEMINI ARM ARCHITECTURE
M: Hans Ulli Kroll <ulli.kroll@googlemail.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
- - ----T: git git://git.berlios.de/gemini-board
+ + ++++T: git git://github.com/ulli-kroll/linux.git
S: Maintained
F: arch/arm/mach-gemini/
F: drivers/clocksource/timer-atlas7.c
N: [^a-z]sirf
+ + ++++ARM/CONEXANT DIGICOLOR MACHINE SUPPORT
+ + ++++M: Baruch Siach <baruch@tkos.co.il>
+ + ++++L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+ + ++++S: Maintained
+ + ++++N: digicolor
+ + ++++
ARM/EBSA110 MACHINE SUPPORT
M: Russell King <linux@arm.linux.org.uk>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
M: Philipp Zabel <philipp.zabel@gmail.com>
S: Maintained
- - ----ARM/Marvell Armada 370 and Armada XP SOC support
+ + ++++ARM/Marvell Kirkwood and Armada 370, 375, 38x, XP SOC support
M: Jason Cooper <jason@lakedaemon.net>
M: Andrew Lunn <andrew@lunn.ch>
M: Gregory Clement <gregory.clement@free-electrons.com>
S: Maintained
F: arch/arm/mach-mvebu/
F: drivers/rtc/rtc-armada38x.c
+ + ++++F: arch/arm/boot/dts/armada*
+ + ++++F: arch/arm/boot/dts/kirkwood*
+ + ++++
ARM/Marvell Berlin SoC support
M: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Maintained
F: arch/arm/mach-berlin/
+ + ++++F: arch/arm/boot/dts/berlin*
+ + ++++
ARM/Marvell Dove/MV78xx0/Orion SOC support
M: Jason Cooper <jason@lakedaemon.net>
F: arch/arm/mach-mv78xx0/
F: arch/arm/mach-orion5x/
F: arch/arm/plat-orion/
+ + ++++F: arch/arm/boot/dts/dove*
+ + ++++F: arch/arm/boot/dts/orion5x*
+ + ++++
ARM/Orion SoC/Technologic Systems TS-78xx platform support
M: Alexander Clouter <alex@digriz.org.uk>
ARM/Mediatek SoC support
M: Matthias Brugger <matthias.bgg@gmail.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+ + ++++L: linux-mediatek@lists.infradead.org (moderated for non-subscribers)
S: Maintained
F: arch/arm/boot/dts/mt6*
F: arch/arm/boot/dts/mt8*
W: http://wiki.openmoko.org/wiki/Neo_FreeRunner
S: Supported
- - ----ARM/QUALCOMM MSM MACHINE SUPPORT
- - ----M: David Brown <davidb@codeaurora.org>
- - ----M: Daniel Walker <dwalker@fifo99.com>
- - ----M: Bryan Huntsman <bryanh@codeaurora.org>
- - ----L: linux-arm-msm@vger.kernel.org
- - ----F: arch/arm/mach-msm/
- - ----F: drivers/video/fbdev/msm/
- - ----F: drivers/mmc/host/msm_sdcc.c
- - ----F: drivers/mmc/host/msm_sdcc.h
- - ----F: drivers/tty/serial/msm_serial.h
- - ----F: drivers/tty/serial/msm_serial.c
- - ----F: drivers/*/pm8???-*
- - ----F: drivers/mfd/ssbi.c
- - ----T: git git://git.kernel.org/pub/scm/linux/kernel/git/davidb/linux-msm.git
- - ----S: Maintained
- - ----
ARM/TOSA MACHINE SUPPORT
M: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
M: Dirk Opfer <dirk@opfer-online.de>
S: Maintained
F: arch/arm/mach-qcom/
F: drivers/soc/qcom/
+ + ++++F: drivers/tty/serial/msm_serial.h
+ + ++++F: drivers/tty/serial/msm_serial.c
+ + ++++F: drivers/*/pm8???-*
+ + ++++F: drivers/mfd/ssbi.c
+ + ++++F: drivers/firmware/qcom_scm.c
T: git git://git.kernel.org/pub/scm/linux/kernel/git/galak/linux-qcom.git
ARM/RADISYS ENP2611 MACHINE SUPPORT
ARM/SAMSUNG EXYNOS ARM ARCHITECTURES
M: Kukjin Kim <kgene@kernel.org>
+ + ++++M: Krzysztof Kozlowski <k.kozlowski@samsung.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
S: Maintained
F: arch/arm/boot/dts/r7s*
F: arch/arm/boot/dts/r8a*
F: arch/arm/boot/dts/sh*
- - ----F: arch/arm/configs/ape6evm_defconfig
F: arch/arm/configs/armadillo800eva_defconfig
F: arch/arm/configs/bockw_defconfig
F: arch/arm/configs/kzm9g_defconfig
- - ----F: arch/arm/configs/mackerel_defconfig
F: arch/arm/configs/marzen_defconfig
F: arch/arm/configs/shmobile_defconfig
F: arch/arm/include/debug/renesas-scif.S
M: Dinh Nguyen <dinguyen@opensource.altera.com>
S: Maintained
F: arch/arm/mach-socfpga/
+ + ++++F: arch/arm/boot/dts/socfpga*
+ + ++++F: arch/arm/configs/socfpga_defconfig
W: http://www.rocketboards.org
- - ----T: git://git.rocketboards.org/linux-socfpga.git
- - ----T: git://git.rocketboards.org/linux-socfpga-next.git
+ + ++++T: git git://git.kernel.org/pub/scm/linux/kernel/git/dinguyen/linux.git
ARM/SOCFPGA CLOCK FRAMEWORK SUPPORT
M: Dinh Nguyen <dinguyen@opensource.altera.com>
F: drivers/tty/serial/atmel_serial.c
ATMEL Audio ALSA driver
- - ----M: Bo Shen <voice.shen@atmel.com>
+ + ++++M: Nicolas Ferre <nicolas.ferre@atmel.com>
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
S: Supported
F: sound/soc/atmel
F: drivers/spi/spi-atmel.*
ATMEL SSC DRIVER
- - ----M: Bo Shen <voice.shen@atmel.com>
+ + ++++M: Nicolas Ferre <nicolas.ferre@atmel.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Supported
F: drivers/misc/atmel-ssc.c
F: drivers/media/radio/radio-aztech*
B43 WIRELESS DRIVER
- - ----M: Stefano Brivio <stefano.brivio@polimi.it>
L: linux-wireless@vger.kernel.org
L: b43-dev@lists.infradead.org
W: http://wireless.kernel.org/en/users/Drivers/b43
- - ----S: Maintained
+ + ++++S: Odd Fixes
F: drivers/net/wireless/b43/
B43LEGACY WIRELESS DRIVER
M: Larry Finger <Larry.Finger@lwfinger.net>
- - ----M: Stefano Brivio <stefano.brivio@polimi.it>
L: linux-wireless@vger.kernel.org
L: b43-dev@lists.infradead.org
W: http://wireless.kernel.org/en/users/Drivers/b43
F: drivers/net/wireless/b43legacy/
BACKLIGHT CLASS/SUBSYSTEM
- - ----M: Jingoo Han <jg1.han@samsung.com>
+ + ++++M: Jingoo Han <jingoohan1@gmail.com>
M: Lee Jones <lee.jones@linaro.org>
S: Maintained
F: drivers/video/backlight/
F: fs/befs/
BECKHOFF CX5020 ETHERCAT MASTER DRIVER
- - ----M: Dariusz Marcinkiewicz <reksio@newterm.pl>
- - ----L: netdev@vger.kernel.org
- - ----S: Maintained
- - ----F: drivers/net/ethernet/ec_bhf.c
+ + ++++M: Dariusz Marcinkiewicz <reksio@newterm.pl>
+ + ++++L: netdev@vger.kernel.org
+ + ++++S: Maintained
+ + ++++F: drivers/net/ethernet/ec_bhf.c
BFS FILE SYSTEM
M: "Tigran A. Aivazian" <tigran@aivazian.fsnet.co.uk>
F: drivers/net/ethernet/broadcom/bnx2x/
BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITECTURE
- - ----M: Christian Daudt <bcm@fixthebug.org>
M: Florian Fainelli <f.fainelli@gmail.com>
+ + ++++M: Ray Jui <rjui@broadcom.com>
+ + ++++M: Scott Branden <sbranden@broadcom.com>
L: bcm-kernel-feedback-list@broadcom.com
T: git git://github.com/broadcom/mach-bcm
S: Maintained
F: drivers/usb/gadget/udc/bcm63xx_udc.*
BROADCOM BCM7XXX ARM ARCHITECTURE
- - ----M: Marc Carino <marc.ceeeee@gmail.com>
M: Brian Norris <computersforpeace@gmail.com>
M: Gregory Fong <gregory.0xf0@gmail.com>
M: Florian Fainelli <f.fainelli@gmail.com>
S: Maintained
F: drivers/usb/chipidea/
+ + ++++CHIPONE ICN8318 I2C TOUCHSCREEN DRIVER
+ + ++++M: Hans de Goede <hdegoede@redhat.com>
+ + ++++L: linux-input@vger.kernel.org
+ + ++++S: Maintained
+ + ++++F: Documentation/devicetree/bindings/input/touchscreen/chipone_icn8318.txt
+ + ++++F: drivers/input/touchscreen/chipone_icn8318.c
+ + ++++
CHROME HARDWARE PLATFORM SUPPORT
M: Olof Johansson <olof@lixom.net>
S: Maintained
CLK API
M: Russell King <linux@arm.linux.org.uk>
+ + ++++L: linux-clk@vger.kernel.org
S: Maintained
F: include/linux/clk.h
COMMON CLK FRAMEWORK
M: Mike Turquette <mturquette@linaro.org>
M: Stephen Boyd <sboyd@codeaurora.org>
- - ----L: linux-kernel@vger.kernel.org
+ + ++++L: linux-clk@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git
S: Maintained
F: drivers/clk/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6.git
S: Maintained
F: Documentation/crypto/
+ + ++++F: Documentation/DocBook/crypto-API.tmpl
F: arch/*/crypto/
F: crypto/
F: drivers/crypto/
F: drivers/net/ethernet/chelsio/cxgb3/
CXGB3 ISCSI DRIVER (CXGB3I)
- - ----M: Karen Xie <kxie@chelsio.com>
- - ----L: linux-scsi@vger.kernel.org
- - ----W: http://www.chelsio.com
- - ----S: Supported
- - ----F: drivers/scsi/cxgbi/cxgb3i
+ + ++++M: Karen Xie <kxie@chelsio.com>
+ + ++++L: linux-scsi@vger.kernel.org
+ + ++++W: http://www.chelsio.com
+ + ++++S: Supported
+ + ++++F: drivers/scsi/cxgbi/cxgb3i
CXGB3 IWARP RNIC DRIVER (IW_CXGB3)
M: Steve Wise <swise@chelsio.com>
F: drivers/net/ethernet/chelsio/cxgb4/
CXGB4 ISCSI DRIVER (CXGB4I)
- - ----M: Karen Xie <kxie@chelsio.com>
- - ----L: linux-scsi@vger.kernel.org
- - ----W: http://www.chelsio.com
- - ----S: Supported
- - ----F: drivers/scsi/cxgbi/cxgb4i
+ + ++++M: Karen Xie <kxie@chelsio.com>
+ + ++++L: linux-scsi@vger.kernel.org
+ + ++++W: http://www.chelsio.com
+ + ++++S: Supported
+ + ++++F: drivers/scsi/cxgbi/cxgb4i
CXGB4 IWARP RNIC DRIVER (IW_CXGB4)
M: Steve Wise <swise@chelsio.com>
DELL LAPTOP DRIVER
M: Matthew Garrett <mjg59@srcf.ucam.org>
+ + ++++M: Pali Rohár <pali.rohar@gmail.com>
L: platform-driver-x86@vger.kernel.org
S: Maintained
F: drivers/platform/x86/dell-laptop.c
+ + ++++DELL LAPTOP FREEFALL DRIVER
+ + ++++M: Pali Rohár <pali.rohar@gmail.com>
+ + ++++S: Maintained
+ + ++++F: drivers/platform/x86/dell-smo8800.c
+ + ++++
DELL LAPTOP SMM DRIVER
M: Guenter Roeck <linux@roeck-us.net>
S: Maintained
DELL WMI EXTRAS DRIVER
M: Matthew Garrett <mjg59@srcf.ucam.org>
+ + ++++M: Pali Rohár <pali.rohar@gmail.com>
S: Maintained
F: drivers/platform/x86/dell-wmi.c
F: drivers/firmware/dmi_scan.c
F: include/linux/dmi.h
- - ----DOCKING STATION DRIVER
- - ----M: Shaohua Li <shaohua.li@intel.com>
- - ----L: linux-acpi@vger.kernel.org
- - ----S: Supported
- - ----F: drivers/acpi/dock.c
- - ----
DOCUMENTATION
M: Jonathan Corbet <corbet@lwn.net>
L: linux-doc@vger.kernel.org
F: Documentation/
X: Documentation/ABI/
X: Documentation/devicetree/
- - ----X: Documentation/[a-z][a-z]_[A-Z][A-Z]/
+ + ++++X: Documentation/acpi
+ + ++++X: Documentation/power
+ + ++++X: Documentation/spi
T: git git://git.lwn.net/linux-2.6.git docs-next
DOUBLETALK DRIVER
S: Supported
F: drivers/gpu/drm/rcar-du/
F: drivers/gpu/drm/shmobile/
- - ----F: include/linux/platform_data/rcar-du.h
F: include/linux/platform_data/shmob_drm.h
+ + ++++DRM DRIVERS FOR ROCKCHIP
+ + ++++M: Mark Yao <mark.yao@rock-chips.com>
+ + ++++L: dri-devel@lists.freedesktop.org
+ + ++++S: Maintained
+ + ++++F: drivers/gpu/drm/rockchip/
+ + ++++F: Documentation/devicetree/bindings/video/rockchip*
+ + ++++
DSBR100 USB FM RADIO DRIVER
M: Alexey Klimov <klimov.linux@gmail.com>
L: linux-media@vger.kernel.org
F: Documentation/extcon/
EXYNOS DP DRIVER
- - ----M: Jingoo Han <jg1.han@samsung.com>
+ + ++++M: Jingoo Han <jingoohan1@gmail.com>
L: dri-devel@lists.freedesktop.org
S: Maintained
F: drivers/gpu/drm/exynos/exynos_dp*
F: drivers/phy/
F: include/linux/phy/
+ + ++++GENERIC PM DOMAINS
+ + ++++M: "Rafael J. Wysocki" <rjw@rjwysocki.net>
+ + ++++M: Kevin Hilman <khilman@kernel.org>
+ + ++++M: Ulf Hansson <ulf.hansson@linaro.org>
+ + ++++L: linux-pm@vger.kernel.org
+ + ++++S: Supported
+ + ++++F: drivers/base/power/domain*.c
+ + ++++F: include/linux/pm_domain.h
+ + ++++
GENERIC UIO DRIVER FOR PCI DEVICES
M: "Michael S. Tsirkin" <mst@redhat.com>
L: kvm@vger.kernel.org
GFS2 FILE SYSTEM
M: Steven Whitehouse <swhiteho@redhat.com>
+ + ++++M: Bob Peterson <rpeterso@redhat.com>
L: cluster-devel@redhat.com
W: http://sources.redhat.com/cluster/
- - ----T: git git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-3.0-fixes.git
- - ----T: git git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-3.0-nmw.git
+ + ++++T: git git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2.git
S: Supported
F: Documentation/filesystems/gfs2*.txt
F: fs/gfs2/
F: include/uapi/linux/gfs2_ondisk.h
GIGASET ISDN DRIVERS
- - ----M: Hansjoerg Lipp <hjlipp@web.de>
- - ----M: Tilman Schmidt <tilman@imap.cc>
+ + ++++M: Paul Bolle <pebolle@tiscali.nl>
L: gigaset307x-common@lists.sourceforge.net
W: http://gigaset307x.sourceforge.net/
- - ----S: Maintained
+ + ++++S: Odd Fixes
F: Documentation/isdn/README.gigaset
F: drivers/isdn/gigaset/
F: include/uapi/linux/gigaset_dev.h
F: block/partitions/efi.*
STK1160 USB VIDEO CAPTURE DRIVER
- - ----M: Ezequiel Garcia <elezegarcia@gmail.com>
+ + ++++M: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
L: linux-media@vger.kernel.org
T: git git://linuxtv.org/media_tree.git
S: Maintained
M: Guenter Roeck <linux@roeck-us.net>
L: lm-sensors@lm-sensors.org
W: http://www.lm-sensors.org/
- - ----T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-hwmon/
+ + ++++T: quilt http://jdelvare.nerim.net/devel/linux/jdelvare-hwmon/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
S: Maintained
F: Documentation/hwmon/
F: include/linux/hid*
F: include/uapi/linux/hid*
+++++ +++HID SENSOR HUB DRIVERS
+++++ +++M: Jiri Kosina <jkosina@suse.cz>
+++++ +++M: Jonathan Cameron <jic23@kernel.org>
+++++ +++M: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
+++++ +++L: linux-input@vger.kernel.org
+++++ +++L: linux-iio@vger.kernel.org
+++++ +++S: Maintained
+++++ +++F: Documentation/hid/hid-sensor*
+++++ +++F: drivers/hid/hid-sensor-*
+++++ +++F: drivers/iio/*/hid-*
+++++ +++F: include/linux/hid-sensor-*
+++++ +++
HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS
M: Thomas Gleixner <tglx@linutronix.de>
L: linux-kernel@vger.kernel.org
S: Maintained
F: drivers/ipack/
+ + ++++INGENIC JZ4780 DMA Driver
+ + ++++M: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>
+ + ++++S: Maintained
+ + ++++F: drivers/dma/dma-jz4780.c
+ + ++++
INTEGRITY MEASUREMENT ARCHITECTURE (IMA)
M: Mimi Zohar <zohar@linux.vnet.ibm.com>
M: Dmitry Kasatkin <dmitry.kasatkin@gmail.com>
F: drivers/video/fbdev/imsttfb.c
INFINIBAND SUBSYSTEM
- - ----M: Roland Dreier <roland@kernel.org>
+ + ++++M: Doug Ledford <dledford@redhat.com>
M: Sean Hefty <sean.hefty@intel.com>
M: Hal Rosenstock <hal.rosenstock@gmail.com>
L: linux-rdma@vger.kernel.org
W: http://www.openfabrics.org/
Q: http://patchwork.kernel.org/project/linux-rdma/list/
- - ----T: git git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git
+ + ++++T: git git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma.git
S: Supported
F: Documentation/infiniband/
F: drivers/infiniband/
F: include/uapi/linux/if_infiniband.h
+ + ++++F: include/uapi/rdma/
+ + ++++F: include/rdma/
INOTIFY
M: John McCutchan <john@johnmccutchan.com>
INTEL WIRELESS WIMAX CONNECTION 2400
M: Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
M: linux-wimax@intel.com
- - ----L: wimax@linuxwimax.org (subscribers-only)
+ + ++++L: wimax@linuxwimax.org (subscribers-only)
S: Supported
W: http://linuxwimax.org
F: Documentation/wimax/README.i2400m
F: include/linux/ipmi*
F: include/uapi/linux/ipmi*
+ + ++++QCOM AUDIO (ASoC) DRIVERS
+ + ++++M: Patrick Lai <plai@codeaurora.org>
+ + ++++M: Banajit Goswami <bgoswami@codeaurora.org>
+ + ++++L: alsa-devel@alsa-project.org (moderated for non-subscribers)
+ + ++++S: Supported
+ + ++++F: sound/soc/qcom/
+ + ++++
IPS SCSI RAID DRIVER
M: Adaptec OEM Raid Solutions <aacraid@adaptec.com>
L: linux-scsi@vger.kernel.org
LED SUBSYSTEM
M: Bryan Wu <cooloney@gmail.com>
M: Richard Purdie <rpurdie@rpsys.net>
+ + ++++M: Jacek Anaszewski <j.anaszewski@samsung.com>
L: linux-leds@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds.git
S: Maintained
F: arch/powerpc/platforms/52xx/
LINUX FOR POWERPC EMBEDDED PPC4XX
- - ----M: Alistair Popple <alistair@popple.id.au>
+ + ++++M: Alistair Popple <alistair@popple.id.au>
M: Matt Porter <mporter@kernel.crashing.org>
W: http://www.penguinppc.org/
L: linuxppc-dev@lists.ozlabs.org
S: Maintained
F: drivers/media/dvb-frontends/m88rs2000*
- - ----M88TS2022 MEDIA DRIVER
- - ----M: Antti Palosaari <crope@iki.fi>
- - ----L: linux-media@vger.kernel.org
- - ----W: http://linuxtv.org/
- - ----W: http://palosaari.fi/linux/
- - ----Q: http://patchwork.linuxtv.org/project/linux-media/list/
- - ----T: git git://linuxtv.org/anttip/media_tree.git
- - ----S: Maintained
- - ----F: drivers/media/tuners/m88ts2022*
- - ----
MA901 MASTERKIT USB FM RADIO DRIVER
M: Alexey Klimov <klimov.linux@gmail.com>
L: linux-media@vger.kernel.org
MELLANOX ETHERNET DRIVER (mlx4_en)
M: Amir Vadai <amirv@mellanox.com>
+ + ++++M: Ido Shamay <idos@mellanox.com>
L: netdev@vger.kernel.org
S: Supported
W: http://www.mellanox.com
F: drivers/watchdog/mena21_wdt.c
MEN CHAMELEON BUS (mcb)
- - ----M: Johannes Thumshirn <johannes.thumshirn@men.de>
+ + ++++M: Johannes Thumshirn <johannes.thumshirn@men.de>
S: Supported
F: drivers/mcb/
F: include/linux/mcb.h
L: linux-media@vger.kernel.org
T: git git://linuxtv.org/media_tree.git
S: Maintained
+ + ++++F: Documentation/devicetree/bindings/media/i2c/mt9v032.txt
F: drivers/media/i2c/mt9v032.c
F: include/media/mt9v032.h
S: Maintained
F: arch/nios2/
+ + ++++NOKIA N900 POWER SUPPLY DRIVERS
+ + ++++M: Pali Rohár <pali.rohar@gmail.com>
+ + ++++S: Maintained
+ + ++++F: include/linux/power/bq2415x_charger.h
+ + ++++F: include/linux/power/bq27x00_battery.h
+ + ++++F: include/linux/power/isp1704_charger.h
+ + ++++F: drivers/power/bq2415x_charger.c
+ + ++++F: drivers/power/bq27x00_battery.c
+ + ++++F: drivers/power/isp1704_charger.c
+ + ++++F: drivers/power/rx51_battery.c
+ + ++++
NTB DRIVER
M: Jon Mason <jdmason@kudzu.us>
M: Dave Jiang <dave.jiang@intel.com>
F: drivers/block/nvme*
F: include/linux/nvme.h
+ + ++++NXP-NCI NFC DRIVER
+ + ++++M: Clément Perrochaud <clement.perrochaud@effinnov.com>
+ + ++++R: Charles Gorand <charles.gorand@effinnov.com>
+ + ++++L: linux-nfc@lists.01.org (moderated for non-subscribers)
+ + ++++S: Supported
+ + ++++F: drivers/nfc/nxp-nci
+ + ++++
NXP TDA998X DRM DRIVER
M: Russell King <rmk+kernel@arm.linux.org.uk>
S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
S: Maintained
F: arch/arm/*omap*/
+ + ++++F: arch/arm/configs/omap1_defconfig
+ + ++++F: arch/arm/configs/omap2plus_defconfig
F: drivers/i2c/busses/i2c-omap.c
F: drivers/irqchip/irq-omap-intc.c
F: drivers/mfd/*omap*.c
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
L: linux-media@vger.kernel.org
S: Maintained
+ + ++++F: Documentation/devicetree/bindings/media/ti,omap3isp.txt
F: drivers/media/platform/omap3isp/
F: drivers/staging/media/omap4iss/
F: arch/*/boot/dts/
F: include/dt-bindings/
+ + ++++OPEN FIRMWARE AND DEVICE TREE OVERLAYS
+ + ++++M: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
+ + ++++L: devicetree@vger.kernel.org
+ + ++++S: Maintained
+ + ++++F: Documentation/devicetree/dynamic-resolution-notes.txt
+ + ++++F: Documentation/devicetree/overlay-notes.txt
+ + ++++F: drivers/of/overlay.c
+ + ++++F: drivers/of/resolver.c
+ + ++++
OPENRISC ARCHITECTURE
M: Jonas Bonn <jonas@southpole.se>
W: http://openrisc.net
F: drivers/pci/host/*rcar*
PCI DRIVER FOR SAMSUNG EXYNOS
- - ----M: Jingoo Han <jg1.han@samsung.com>
+ + ++++M: Jingoo Han <jingoohan1@gmail.com>
L: linux-pci@vger.kernel.org
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
F: drivers/pci/host/pci-exynos.c
PCI DRIVER FOR SYNOPSIS DESIGNWARE
- - ----M: Mohit Kumar <mohit.kumar@st.com>
- - ----M: Jingoo Han <jg1.han@samsung.com>
+ + ++++M: Jingoo Han <jingoohan1@gmail.com>
L: linux-pci@vger.kernel.org
S: Maintained
F: drivers/pci/host/*designware*
F: drivers/pci/host/pci-host-generic.c
PCIE DRIVER FOR ST SPEAR13XX
- - ----M: Mohit Kumar <mohit.kumar@st.com>
L: linux-pci@vger.kernel.org
- - ----S: Maintained
+ + ++++S: Orphan
F: drivers/pci/host/*spear*
PCMCIA SUBSYSTEM
S: Maintained
QAT DRIVER
- - ----M: Tadeusz Struk <tadeusz.struk@intel.com>
- - ----L: qat-linux@intel.com
- - ----S: Supported
- - ----F: drivers/crypto/qat/
+ + ++++M: Tadeusz Struk <tadeusz.struk@intel.com>
+ + ++++L: qat-linux@intel.com
+ + ++++S: Supported
+ + ++++F: drivers/crypto/qat/
QIB DRIVER
M: Mike Marciniszyn <infinipath@intel.com>
F: drivers/net/wireless/rt2x00/
RAMDISK RAM BLOCK DEVICE DRIVER
- - ----M: Nick Piggin <npiggin@kernel.dk>
+ + ++++M: Jens Axboe <axboe@kernel.dk>
S: Maintained
F: Documentation/blockdev/ramdisk.txt
F: drivers/block/brd.c
+ + ++++PERSISTENT MEMORY DRIVER
+ + ++++M: Ross Zwisler <ross.zwisler@linux.intel.com>
+ + ++++L: linux-nvdimm@lists.01.org
+ + ++++S: Supported
+ + ++++F: drivers/block/pmem.c
+ + ++++
RANDOM NUMBER DRIVER
M: "Theodore Ts'o" <tytso@mit.edu>
S: Maintained
REAL TIME CLOCK (RTC) SUBSYSTEM
M: Alessandro Zummo <a.zummo@towertech.it>
+ + ++++M: Alexandre Belloni <alexandre.belloni@free-electrons.com>
L: rtc-linux@googlegroups.com
Q: http://patchwork.ozlabs.org/project/rtc-linux/list/
S: Maintained
S390 NETWORK DRIVERS
M: Ursula Braun <ursula.braun@de.ibm.com>
- - ----M: Frank Blaschka <blaschka@linux.vnet.ibm.com>
M: linux390@de.ibm.com
L: linux-s390@vger.kernel.org
W: http://www.ibm.com/developerworks/linux/linux390/
F: sound/soc/samsung/
SAMSUNG FRAMEBUFFER DRIVER
- - ----M: Jingoo Han <jg1.han@samsung.com>
+ + ++++M: Jingoo Han <jingoohan1@gmail.com>
L: linux-fbdev@vger.kernel.org
S: Maintained
F: drivers/video/fbdev/s3c-fb.c
F: include/scsi/sg.h
SCSI SUBSYSTEM
- - ----M: "James E.J. Bottomley" <JBottomley@parallels.com>
+ + ++++M: "James E.J. Bottomley" <JBottomley@odin.com>
L: linux-scsi@vger.kernel.org
- - ----T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
- - ----T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git
- - ----T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-pending-2.6.git
+ + ++++T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi.git
S: Maintained
F: drivers/scsi/
F: include/scsi/
S: Supported
F: drivers/scsi/be2iscsi/
- - ----SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER
- - ----M: Sathya Perla <sathya.perla@emulex.com>
- - ----M: Subbu Seetharaman <subbu.seetharaman@emulex.com>
- - ----M: Ajit Khaparde <ajit.khaparde@emulex.com>
+ + ++++Emulex 10Gbps NIC BE2, BE3-R, Lancer, Skyhawk-R DRIVER
+ + ++++M: Sathya Perla <sathya.perla@avagotech.com>
+ + ++++M: Ajit Khaparde <ajit.khaparde@avagotech.com>
+ + ++++M: Padmanabh Ratnakar <padmanabh.ratnakar@avagotech.com>
+ + ++++M: Sriharsha Basavapatna <sriharsha.basavapatna@avagotech.com>
L: netdev@vger.kernel.org
W: http://www.emulex.com
S: Supported
F: drivers/net/ethernet/emulex/benet/
+ + ++++EMULEX ONECONNECT ROCE DRIVER
+ + ++++M: Selvin Xavier <selvin.xavier@emulex.com>
+ + ++++M: Devesh Sharma <devesh.sharma@emulex.com>
+ + ++++M: Mitesh Ahuja <mitesh.ahuja@emulex.com>
+ + ++++L: linux-rdma@vger.kernel.org
+ + ++++W: http://www.emulex.com
+ + ++++S: Supported
+ + ++++F: drivers/infiniband/hw/ocrdma/
+ + ++++
SFC NETWORK DRIVER
M: Solarflare linux maintainers <linux-net-drivers@solarflare.com>
M: Shradha Shah <sshah@solarflare.com>
S: Maintained
F: drivers/media/platform/am437x/
+ + ++++OV2659 OMNIVISION SENSOR DRIVER
+ + ++++M: Lad, Prabhakar <prabhakar.csengg@gmail.com>
+ + ++++L: linux-media@vger.kernel.org
+ + ++++W: http://linuxtv.org/
+ + ++++Q: http://patchwork.linuxtv.org/project/linux-media/list/
+ + ++++T: git git://linuxtv.org/mhadli/v4l-dvb-davinci_devices.git
+ + ++++S: Maintained
+ + ++++F: drivers/media/i2c/ov2659.c
+ + ++++F: include/media/ov2659.h
+ + ++++
SIS 190 ETHERNET DRIVER
M: Francois Romieu <romieu@fr.zoreil.com>
L: netdev@vger.kernel.org
TIPC NETWORK LAYER
M: Jon Maloy <jon.maloy@ericsson.com>
- - ----M: Allan Stephens <allan.stephens@windriver.com>
+ + ++++M: Ying Xue <ying.xue@windriver.com>
L: netdev@vger.kernel.org (core kernel code)
L: tipc-discussion@lists.sourceforge.net (user apps, general discussion)
W: http://tipc.sourceforge.net/
F: drivers/platform/x86/topstar-laptop.c
TOSHIBA ACPI EXTRAS DRIVER
+ + ++++M: Azael Avalos <coproscefalo@gmail.com>
L: platform-driver-x86@vger.kernel.org
- - ----S: Orphan
+ + ++++S: Maintained
F: drivers/platform/x86/toshiba_acpi.c
+ + ++++TOSHIBA BLUETOOTH DRIVER
+ + ++++M: Azael Avalos <coproscefalo@gmail.com>
+ + ++++L: platform-driver-x86@vger.kernel.org
+ + ++++S: Maintained
+ + ++++F: drivers/platform/x86/toshiba_bluetooth.c
+ + ++++
+ + ++++TOSHIBA HDD ACTIVE PROTECTION SENSOR DRIVER
+ + ++++M: Azael Avalos <coproscefalo@gmail.com>
+ + ++++L: platform-driver-x86@vger.kernel.org
+ + ++++S: Maintained
+ + ++++F: drivers/platform/x86/toshiba_haps.c
+ + ++++
TOSHIBA SMM DRIVER
M: Jonathan Buzzard <jonathan@buzzard.org.uk>
L: tlinux-users@tce.toshiba-dme.co.jp
TPM DEVICE DRIVER
M: Peter Huewe <peterhuewe@gmx.de>
M: Marcel Selhorst <tpmdd@selhorst.net>
+ + ++++R: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
W: http://tpmdd.sourceforge.net
L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
Q: git git://github.com/PeterHuewe/linux-tpmdd.git
F: include/uapi/linux/cdrom.h
UNISYS S-PAR DRIVERS
- - ----M: Benjamin Romer <benjamin.romer@unisys.com>
- - ----M: David Kershner <david.kershner@unisys.com>
- - ----L: sparmaintainer@unisys.com (Unisys internal)
- - ----S: Supported
- - ----F: drivers/staging/unisys/
+ + ++++M: Benjamin Romer <benjamin.romer@unisys.com>
+ + ++++M: David Kershner <david.kershner@unisys.com>
+ + ++++L: sparmaintainer@unisys.com (Unisys internal)
+ + ++++S: Supported
+ + ++++F: drivers/staging/unisys/
UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER
M: Vinayak Holikatti <vinholikatti@gmail.com>
F: include/uapi/linux/virtio_console.h
VIRTIO CORE, NET AND BLOCK DRIVERS
- - ----M: Rusty Russell <rusty@rustcorp.com.au>
M: "Michael S. Tsirkin" <mst@redhat.com>
L: virtualization@lists.linux-foundation.org
S: Maintained
F: drivers/vhost/
F: include/uapi/linux/vhost.h
+ + ++++VIRTIO INPUT DRIVER
+ + ++++M: Gerd Hoffmann <kraxel@redhat.com>
+ + ++++S: Maintained
+ + ++++F: drivers/virtio/virtio_input.c
+ + ++++F: include/uapi/linux/virtio_input.h
+ + ++++
VIA RHINE NETWORK DRIVER
M: Roger Luethi <rl@hellgate.ch>
S: Maintained
S: Maintained
F: drivers/misc/vmw_balloon.c
+ + ++++VMWARE VMMOUSE SUBDRIVER
+ + ++++M: "VMware Graphics" <linux-graphics-maintainer@vmware.com>
+ + ++++M: "VMware, Inc." <pv-drivers@vmware.com>
+ + ++++L: linux-input@vger.kernel.org
+ + ++++S: Maintained
+ + ++++F: drivers/input/mouse/vmmouse.c
+ + ++++F: drivers/input/mouse/vmmouse.h
+ + ++++
VMWARE VMXNET3 ETHERNET DRIVER
M: Shreyas Bhatewara <sbhatewara@vmware.com>
M: "VMware, Inc." <pv-drivers@vmware.com>
WIMAX STACK
M: Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
M: linux-wimax@intel.com
- - ----L: wimax@linuxwimax.org (subscribers-only)
+ + ++++L: wimax@linuxwimax.org (subscribers-only)
S: Supported
W: http://linuxwimax.org
F: Documentation/wimax/README.wimax
S: Maintained
F: drivers/tty/serial/uartlite.c
+ + ++++XILINX VIDEO IP CORES
+ + ++++M: Hyun Kwon <hyun.kwon@xilinx.com>
+ + ++++M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+ + ++++L: linux-media@vger.kernel.org
+ + ++++T: git git://linuxtv.org/media_tree.git
+ + ++++S: Supported
+ + ++++F: Documentation/devicetree/bindings/media/xilinx/
+ + ++++F: drivers/media/platform/xilinx/
+ + ++++F: include/uapi/linux/xilinx-v4l2-controls.h
+ + ++++
XILLYBUS DRIVER
M: Eli Billauer <eli.billauer@gmail.com>
L: linux-kernel@vger.kernel.org
ZRAM COMPRESSED RAM BLOCK DEVICE DRVIER
M: Minchan Kim <minchan@kernel.org>
M: Nitin Gupta <ngupta@vflare.org>
+ + ++++R: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
L: linux-kernel@vger.kernel.org
S: Maintained
F: drivers/block/zram/
S: Maintained
F: mm/zsmalloc.c
F: include/linux/zsmalloc.h
+ + ++++F: Documentation/vm/zsmalloc.txt
ZSWAP COMPRESSED SWAP CACHING
M: Seth Jennings <sjennings@variantweb.net>
if (hid->vendor == USB_VENDOR_ID_MICROSOFT &&
(hid->product == USB_DEVICE_ID_MS_TYPE_COVER_3 ||
-------- hid->product == USB_DEVICE_ID_MS_TYPE_COVER_3_JP) &&
++++++++ hid->product == USB_DEVICE_ID_MS_TYPE_COVER_3_JP ||
++++++++ hid->product == USB_DEVICE_ID_MS_POWER_COVER) &&
hid->group == HID_GROUP_MULTITOUCH)
hid->group = HID_GROUP_GENERIC;
* Search linux-kernel and linux-usb-devel archives for "hid-core extract".
*/
--------static __u32 extract(const struct hid_device *hid, __u8 *report,
++++++++__u32 hid_field_extract(const struct hid_device *hid, __u8 *report,
unsigned offset, unsigned n)
{
u64 x;
if (n > 32)
-------- hid_warn(hid, "extract() called with n (%d) > 32! (%s)\n",
++++++++ hid_warn(hid, "hid_field_extract() called with n (%d) > 32! (%s)\n",
n, current->comm);
report += offset >> 3; /* adjust byte index */
x = (x >> offset) & ((1ULL << n) - 1); /* extract bit field */
return (u32) x;
}
++++++++EXPORT_SYMBOL_GPL(hid_field_extract);
/*
* "implement" : set bits in a little endian bit stream.
for (n = 0; n < count; n++) {
value[n] = min < 0 ?
-------- snto32(extract(hid, data, offset + n * size, size),
-------- size) :
-------- extract(hid, data, offset + n * size, size);
++++++++ snto32(hid_field_extract(hid, data, offset + n * size,
++++++++ size), size) :
++++++++ hid_field_extract(hid, data, offset + n * size, size);
/* Ignore report if ErrorRollOver */
if (!(field->flags & HID_MAIN_ITEM_VARIABLE) &&
{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPKBD) },
{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_CUSBKBD) },
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_CBTKBD) },
++ ++++++ { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPPRODOCK) },
#endif
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) },
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) },
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_OFFICE_KB) },
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3) },
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3_JP) },
++++++++ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER) },
{ HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) },
{ HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL) },
{ HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) },
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_PS3_BDREMOTE) },
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER) },
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER) },
+++++++ + { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER) },
+++++++ + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_MOTION_CONTROLLER) },
+++++++ + { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) },
+++++++ + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) },
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE) },
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
------- - { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) },
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER) },
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER) },
{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_3_PRO) },
{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_DUAL_BOX_PRO) },
{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_5_PRO) },
++++++ ++ { HID_USB_DEVICE(USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII) },
{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH) },
{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH) },
{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_Q_PAD) },
{ HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0001) },
{ HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0002) },
{ HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0004) },
-------- { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_4_PHIDGETSERVO_30) },
-------- { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_1_PHIDGETSERVO_30) },
-------- { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_0_4_IF_KIT) },
-------- { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_16_16_IF_KIT) },
-------- { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_8_8_8_IF_KIT) },
-------- { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_7_IF_KIT) },
-------- { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_8_IF_KIT) },
-------- { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_PHIDGET_MOTORCONTROL) },
{ HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_SUPER_Q2) },
{ HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_GOGOPEN) },
{ HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_PENPOWER) },
{ HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_WTP) },
{ HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_DPAD) },
#endif
-------- { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO) },
-------- { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) },
-------- { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) },
-------- { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) },
-------- { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LCSPEC) },
-------- { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20) },
-------- { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20) },
-------- { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_8_8_4_IF_KIT) },
{ HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) },
{ HID_USB_DEVICE(USB_VENDOR_ID_RISO_KAGAKU, USB_DEVICE_ID_RI_KA_WEBMAIL) },
{ }
#define USB_DEVICE_ID_ATEN_2PORTKVM 0x2204
#define USB_DEVICE_ID_ATEN_4PORTKVM 0x2205
#define USB_DEVICE_ID_ATEN_4PORTKVMC 0x2208
+ ++++#define USB_DEVICE_ID_ATEN_CS682 0x2213
#define USB_VENDOR_ID_ATMEL 0x03eb
#define USB_DEVICE_ID_ATMEL_MULTITOUCH 0x211c
#define USB_DEVICE_ID_CHICONY_TACTICAL_PAD 0x0418
#define USB_DEVICE_ID_CHICONY_MULTI_TOUCH 0xb19d
#define USB_DEVICE_ID_CHICONY_WIRELESS 0x0618
++++++++#define USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE 0x1053
#define USB_DEVICE_ID_CHICONY_WIRELESS2 0x1123
#define USB_DEVICE_ID_CHICONY_AK1D 0x1125
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_010A 0x010a
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
--------#define USB_VENDOR_ID_GLAB 0x06c2
--------#define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038
--------#define USB_DEVICE_ID_1_PHIDGETSERVO_30 0x0039
--------#define USB_DEVICE_ID_0_0_4_IF_KIT 0x0040
--------#define USB_DEVICE_ID_0_16_16_IF_KIT 0x0044
--------#define USB_DEVICE_ID_8_8_8_IF_KIT 0x0045
--------#define USB_DEVICE_ID_0_8_7_IF_KIT 0x0051
--------#define USB_DEVICE_ID_0_8_8_IF_KIT 0x0053
--------#define USB_DEVICE_ID_PHIDGET_MOTORCONTROL 0x0058
--------
#define USB_VENDOR_ID_GOODTOUCH 0x1aad
#define USB_DEVICE_ID_GOODTOUCH_000f 0x000f
#define USB_DEVICE_ID_LENOVO_TPKBD 0x6009
#define USB_DEVICE_ID_LENOVO_CUSBKBD 0x6047
#define USB_DEVICE_ID_LENOVO_CBTKBD 0x6048
++ ++++++#define USB_DEVICE_ID_LENOVO_TPPRODOCK 0x6067
#define USB_VENDOR_ID_LG 0x1fd2
#define USB_DEVICE_ID_LG_MULTITOUCH 0x0064
#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9
#define USB_DEVICE_ID_MS_TYPE_COVER_3 0x07dc
#define USB_DEVICE_ID_MS_TYPE_COVER_3_JP 0x07dd
++++++++#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
#define USB_VENDOR_ID_MOJO 0x8282
#define USB_DEVICE_ID_RETRO_ADAPTER 0x3201
#define USB_DEVICE_ID_SONY_PS3_BDREMOTE 0x0306
#define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268
#define USB_DEVICE_ID_SONY_PS4_CONTROLLER 0x05c4
+++++++ +#define USB_DEVICE_ID_SONY_MOTION_CONTROLLER 0x03d5
#define USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER 0x042f
#define USB_DEVICE_ID_SONY_BUZZ_CONTROLLER 0x0002
#define USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER 0x1000
#define USB_DEVICE_ID_VELLEMAN_K8061_FIRST 0x8061
#define USB_DEVICE_ID_VELLEMAN_K8061_LAST 0x8068
--------#define USB_VENDOR_ID_VERNIER 0x08f7
--------#define USB_DEVICE_ID_VERNIER_LABPRO 0x0001
--------#define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002
--------#define USB_DEVICE_ID_VERNIER_SKIP 0x0003
--------#define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004
--------#define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006
--------
#define USB_VENDOR_ID_VTL 0x0306
#define USB_DEVICE_ID_VTL_MULTITOUCH_FF3F 0xff3f
#define USB_VENDOR_ID_WISEGROUP 0x0925
#define USB_DEVICE_ID_SMARTJOY_PLUS 0x0005
--------#define USB_DEVICE_ID_1_PHIDGETSERVO_20 0x8101
--------#define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104
--------#define USB_DEVICE_ID_8_8_4_IF_KIT 0x8201
#define USB_DEVICE_ID_SUPER_JOY_BOX_3 0x8888
#define USB_DEVICE_ID_QUAD_USB_JOYPAD 0x8800
#define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866
#define USB_VENDOR_ID_RISO_KAGAKU 0x1294 /* Riso Kagaku Corp. */
#define USB_DEVICE_ID_RI_KA_WEBMAIL 0x1320 /* Webmail Notifier */
++++++++#define USB_VENDOR_ID_MULTIPLE_1781 0x1781
++++++++#define USB_DEVICE_ID_RAPHNET_4NES4SNES_OLD 0x0a8d
++++++++
++++++++#define USB_VENDOR_ID_DRACAL_RAPHNET 0x289b
++++++++#define USB_DEVICE_ID_RAPHNET_2NES2SNES 0x0002
++++++++#define USB_DEVICE_ID_RAPHNET_4NES4SNES 0x0003
++++++++
#endif
#define map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c))
++ ++++++static const __u8 lenovo_pro_dock_need_fixup_collection[] = {
++ ++++++ 0x05, 0x88, /* Usage Page (Vendor Usage Page 0x88) */
++ ++++++ 0x09, 0x01, /* Usage (Vendor Usage 0x01) */
++ ++++++ 0xa1, 0x01, /* Collection (Application) */
++ ++++++ 0x85, 0x04, /* Report ID (4) */
++ ++++++ 0x19, 0x00, /* Usage Minimum (0) */
++ ++++++ 0x2a, 0xff, 0xff, /* Usage Maximum (65535) */
++ ++++++};
++ ++++++
++ ++++++static __u8 *lenovo_report_fixup(struct hid_device *hdev, __u8 *rdesc,
++ ++++++ unsigned int *rsize)
++ ++++++{
++ ++++++ switch (hdev->product) {
++ ++++++ case USB_DEVICE_ID_LENOVO_TPPRODOCK:
++ ++++++ /* the fixups that need to be done:
++ ++++++ * - get a reasonable usage max for the vendor collection
++ ++++++ * 0x8801 from the report ID 4
++ ++++++ */
++ ++++++ if (*rsize >= 153 &&
++ ++++++ memcmp(&rdesc[140], lenovo_pro_dock_need_fixup_collection,
++ ++++++ sizeof(lenovo_pro_dock_need_fixup_collection)) == 0) {
++ ++++++ rdesc[151] = 0x01;
++ ++++++ rdesc[152] = 0x00;
++ ++++++ }
++ ++++++ break;
++ ++++++ }
++ ++++++ return rdesc;
++ ++++++}
++ ++++++
static int lenovo_input_mapping_tpkbd(struct hid_device *hdev,
struct hid_input *hi, struct hid_field *field,
struct hid_usage *usage, unsigned long **bit, int *max)
GFP_KERNEL);
if (data_pointer == NULL) {
hid_err(hdev, "Could not allocate memory for driver data\n");
-------- return -ENOMEM;
++++++++ ret = -ENOMEM;
++++++++ goto err;
}
// set same default values as windows driver
name_micmute = devm_kzalloc(&hdev->dev, name_sz, GFP_KERNEL);
if (name_mute == NULL || name_micmute == NULL) {
hid_err(hdev, "Could not allocate memory for led data\n");
-------- return -ENOMEM;
++++++++ ret = -ENOMEM;
++++++++ goto err;
}
snprintf(name_mute, name_sz, "%s:amber:mute", dev_name(dev));
snprintf(name_micmute, name_sz, "%s:amber:micmute", dev_name(dev));
lenovo_features_set_tpkbd(hdev);
return 0;
++++++++err:
++++++++ sysfs_remove_group(&hdev->dev.kobj, &lenovo_attr_group_tpkbd);
++++++++ return ret;
}
static int lenovo_probe_cptkbd(struct hid_device *hdev)
hid_hw_stop(hdev);
}
++ ++++++static void lenovo_input_configured(struct hid_device *hdev,
++ ++++++ struct hid_input *hi)
++ ++++++{
++ ++++++ switch (hdev->product) {
++ ++++++ case USB_DEVICE_ID_LENOVO_TPKBD:
++ ++++++ case USB_DEVICE_ID_LENOVO_CUSBKBD:
++ ++++++ case USB_DEVICE_ID_LENOVO_CBTKBD:
++ ++++++ if (test_bit(EV_REL, hi->input->evbit)) {
++ ++++++ /* set only for trackpoint device */
++ ++++++ __set_bit(INPUT_PROP_POINTER, hi->input->propbit);
++ ++++++ __set_bit(INPUT_PROP_POINTING_STICK,
++ ++++++ hi->input->propbit);
++ ++++++ }
++ ++++++ break;
++ ++++++ }
++ ++++++}
++ ++++++
++ ++++++
static const struct hid_device_id lenovo_devices[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPKBD) },
{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_CUSBKBD) },
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_CBTKBD) },
++ ++++++ { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPPRODOCK) },
{ }
};
static struct hid_driver lenovo_driver = {
.name = "lenovo",
.id_table = lenovo_devices,
++ ++++++ .input_configured = lenovo_input_configured,
.input_mapping = lenovo_input_mapping,
.probe = lenovo_probe,
.remove = lenovo_remove,
.raw_event = lenovo_raw_event,
++ ++++++ .report_fixup = lenovo_report_fixup,
};
module_hid_driver(lenovo_driver);
#define RMI_SET_RMI_MODE_REPORT_ID 0x0f /* Feature Report */
/* flags */
--------#define RMI_READ_REQUEST_PENDING BIT(0)
--------#define RMI_READ_DATA_PENDING BIT(1)
--------#define RMI_STARTED BIT(2)
++++++++#define RMI_READ_REQUEST_PENDING 0
++++++++#define RMI_READ_DATA_PENDING 1
++++++++#define RMI_STARTED 2
/* device flags */
#define RMI_DEVICE BIT(0)
static int rmi_populate(struct hid_device *hdev)
{
++++ ++++ struct rmi_data *data = hid_get_drvdata(hdev);
int ret;
ret = rmi_scan_pdt(hdev);
return ret;
}
---- ---- ret = rmi_populate_f30(hdev);
---- ---- if (ret)
---- ---- hid_warn(hdev, "Error while initializing F30 (%d).\n", ret);
++++ ++++ if (!(data->device_flags & RMI_DEVICE_HAS_PHYS_BUTTONS)) {
++++ ++++ ret = rmi_populate_f30(hdev);
++++ ++++ if (ret)
++++ ++++ hid_warn(hdev, "Error while initializing F30 (%d).\n", ret);
++++ ++++ }
return 0;
}
#include <linux/i2c/i2c-hid.h>
/* flags */
--------#define I2C_HID_STARTED (1 << 0)
--------#define I2C_HID_RESET_PENDING (1 << 1)
--------#define I2C_HID_READ_PENDING (1 << 2)
++++++++#define I2C_HID_STARTED 0
++++++++#define I2C_HID_RESET_PENDING 1
++++++++#define I2C_HID_READ_PENDING 2
#define I2C_HID_PWR_ON 0x00
#define I2C_HID_PWR_SLEEP 0x01
union acpi_object *obj;
struct acpi_device *adev;
acpi_handle handle;
+ ++++ int ret;
handle = ACPI_HANDLE(&client->dev);
if (!handle || acpi_bus_get_device(handle, &adev))
pdata->hid_descriptor_address = obj->integer.value;
ACPI_FREE(obj);
- ---- return acpi_dev_add_driver_gpios(adev, i2c_hid_acpi_gpios);
+ ++++ /* GPIOs are optional */
+ ++++ ret = acpi_dev_add_driver_gpios(adev, i2c_hid_acpi_gpios);
+ ++++ return ret < 0 && ret != -ENXIO ? ret : 0;
}
static const struct acpi_device_id i2c_hid_acpi_match[] = {
hid->driver_data = client;
hid->ll_driver = &i2c_hid_ll_driver;
hid->dev.parent = &client->dev;
- ------- ACPI_COMPANION_SET(&hid->dev, ACPI_COMPANION(&client->dev));
hid->bus = BUS_I2C;
hid->version = le16_to_cpu(ihid->hdesc.bcdVersion);
hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID);
{ USB_VENDOR_ID_ETURBOTOUCH, USB_DEVICE_ID_ETURBOTOUCH_2968, HID_QUIRK_MULTI_INPUT },
{ USB_VENDOR_ID_GREENASIA, USB_DEVICE_ID_GREENASIA_DUAL_USB_JOYPAD, HID_QUIRK_MULTI_INPUT },
{ USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS },
------ -- { USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII, HID_QUIRK_MULTI_INPUT },
{ USB_VENDOR_ID_TOUCHPACK, USB_DEVICE_ID_TOUCHPACK_RTS, HID_QUIRK_MULTI_INPUT },
{ USB_VENDOR_ID_AIREN, USB_DEVICE_ID_AIREN_SLIMPLUS, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET },
+ ++++ { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS682, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FIGHTERSTICK, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_COMBATSTICK, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FLIGHT_SIM_ECLIPSE_YOKE, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_PRO_PEDALS, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET },
++++++++ { USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE, HID_QUIRK_ALWAYS_POLL },
{ USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ELAN_TOUCHSCREEN, HID_QUIRK_ALWAYS_POLL },
{ USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ELAN_TOUCHSCREEN_009B, HID_QUIRK_ALWAYS_POLL },
{ USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET },
{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3, HID_QUIRK_NO_INIT_REPORTS },
{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3_JP, HID_QUIRK_NO_INIT_REPORTS },
++++++++ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER, HID_QUIRK_NO_INIT_REPORTS },
{ USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL, HID_QUIRK_NO_INIT_REPORTS },
{ USB_VENDOR_ID_NEXIO, USB_DEVICE_ID_NEXIO_MULTITOUCH_PTI0750, HID_QUIRK_NO_INIT_REPORTS },
{ USB_VENDOR_ID_NOVATEK, USB_DEVICE_ID_NOVATEK_MOUSE, HID_QUIRK_NO_INIT_REPORTS },
{ USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_QUAD_HD, HID_QUIRK_NO_INIT_REPORTS },
{ USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_TP_V103, HID_QUIRK_NO_INIT_REPORTS },
{ USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A096, HID_QUIRK_NO_INIT_INPUT_REPORTS },
++++++++ { USB_VENDOR_ID_MULTIPLE_1781, USB_DEVICE_ID_RAPHNET_4NES4SNES_OLD, HID_QUIRK_MULTI_INPUT },
++++++++ { USB_VENDOR_ID_DRACAL_RAPHNET, USB_DEVICE_ID_RAPHNET_2NES2SNES, HID_QUIRK_MULTI_INPUT },
++++++++ { USB_VENDOR_ID_DRACAL_RAPHNET, USB_DEVICE_ID_RAPHNET_4NES4SNES, HID_QUIRK_MULTI_INPUT },
{ 0, 0 }
};
static int wacom_penpartner_irq(struct wacom_wac *wacom)
{
unsigned char *data = wacom->data;
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->pen_input;
switch (data[0]) {
case 1:
{
struct wacom_features *features = &wacom->features;
unsigned char *data = wacom->data;
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->pen_input;
int prox, pressure;
if (data[0] != WACOM_REPORT_PENABLED) {
static int wacom_ptu_irq(struct wacom_wac *wacom)
{
unsigned char *data = wacom->data;
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->pen_input;
if (data[0] != WACOM_REPORT_PENABLED) {
dev_dbg(input->dev.parent,
static int wacom_dtu_irq(struct wacom_wac *wacom)
{
unsigned char *data = wacom->data;
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->pen_input;
int prox = data[1] & 0x20;
dev_dbg(input->dev.parent,
static int wacom_dtus_irq(struct wacom_wac *wacom)
{
char *data = wacom->data;
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->pen_input;
unsigned short prox, pressure = 0;
if (data[0] != WACOM_REPORT_DTUS && data[0] != WACOM_REPORT_DTUSPAD) {
{
struct wacom_features *features = &wacom->features;
unsigned char *data = wacom->data;
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->pen_input;
struct input_dev *pad_input = wacom->pad_input;
int battery_capacity, ps_connected;
int prox;
{
struct wacom_features *features = &wacom->features;
unsigned char *data = wacom->data;
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->pen_input;
int idx = 0;
/* tool number */
{
struct wacom_features *features = &wacom->features;
unsigned char *data = wacom->data;
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->pen_input;
unsigned int t;
/* general pen packet */
{
struct wacom_features *features = &wacom->features;
unsigned char *data = wacom->data;
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->pen_input;
unsigned int t;
int idx = 0, result;
memcpy(wacom->data, data, 10);
wacom_intuos_irq(wacom);
-------- input_sync(wacom->input);
++++++++ input_sync(wacom->pen_input);
if (wacom->pad_input)
input_sync(wacom->pad_input);
}
ps_connected);
break;
default:
-------- dev_dbg(wacom->input->dev.parent,
++++++++ dev_dbg(wacom->pen_input->dev.parent,
"Unknown report: %d,%d size:%zu\n",
data[0], data[1], len);
return 0;
static int wacom_wac_finger_count_touches(struct wacom_wac *wacom)
{
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->touch_input;
unsigned touch_max = wacom->features.touch_max;
int count = 0;
int i;
- --- /* non-HID_GENERIC single touch input doesn't call this routine */
- --- if ((touch_max == 1) && (wacom->features.type == HID_GENERIC))
- --- return wacom->hid_data.tipswitch &&
+ ++++ if (!touch_max)
+ ++++ return 0;
+ ++++
-- -- /* non-HID_GENERIC single touch input doesn't call this routine */
-- -- if ((touch_max == 1) && (wacom->features.type == HID_GENERIC))
-- -- return wacom->hid_data.tipswitch &&
++++++++ if (touch_max == 1)
++++++++ return test_bit(BTN_TOUCH, input->key) &&
!wacom->shared->stylus_in_proximity;
for (i = 0; i < input->mt->num_slots; i++) {
static int wacom_24hdt_irq(struct wacom_wac *wacom)
{
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->touch_input;
unsigned char *data = wacom->data;
int i;
int current_num_contacts = data[61];
static int wacom_mt_touch(struct wacom_wac *wacom)
{
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->touch_input;
unsigned char *data = wacom->data;
int i;
int current_num_contacts = data[2];
static int wacom_tpc_mt_touch(struct wacom_wac *wacom)
{
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->touch_input;
unsigned char *data = wacom->data;
int i;
static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len)
{
unsigned char *data = wacom->data;
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->touch_input;
bool prox = !wacom->shared->stylus_in_proximity;
int x = 0, y = 0;
static int wacom_tpc_pen(struct wacom_wac *wacom)
{
unsigned char *data = wacom->data;
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->pen_input;
bool prox = data[1] & 0x20;
if (!wacom->shared->stylus_in_proximity) /* first in prox */
{
unsigned char *data = wacom->data;
-------- dev_dbg(wacom->input->dev.parent,
-------- "%s: received report #%d\n", __func__, data[0]);
++++++++ if (wacom->pen_input)
++++++++ dev_dbg(wacom->pen_input->dev.parent,
++++++++ "%s: received report #%d\n", __func__, data[0]);
++++++++ else if (wacom->touch_input)
++++++++ dev_dbg(wacom->touch_input->dev.parent,
++++++++ "%s: received report #%d\n", __func__, data[0]);
switch (len) {
case WACOM_PKGLEN_TPC1FG:
return 0;
}
-------- static void wacom_map_usage(struct wacom *wacom, struct hid_usage *usage,
++++++++ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
struct hid_field *field, __u8 type, __u16 code, int fuzz)
{
-------- struct wacom_wac *wacom_wac = &wacom->wacom_wac;
-------- struct input_dev *input = wacom_wac->input;
int fmin = field->logical_minimum;
int fmax = field->logical_maximum;
struct hid_field *field, struct hid_usage *usage)
{
struct wacom *wacom = hid_get_drvdata(hdev);
++++++++ struct wacom_wac *wacom_wac = &wacom->wacom_wac;
++++++++ struct input_dev *input = wacom_wac->pen_input;
switch (usage->hid) {
case HID_GD_X:
-------- wacom_map_usage(wacom, usage, field, EV_ABS, ABS_X, 4);
++++++++ wacom_map_usage(input, usage, field, EV_ABS, ABS_X, 4);
break;
case HID_GD_Y:
-------- wacom_map_usage(wacom, usage, field, EV_ABS, ABS_Y, 4);
++++++++ wacom_map_usage(input, usage, field, EV_ABS, ABS_Y, 4);
break;
case HID_DG_TIPPRESSURE:
-------- wacom_map_usage(wacom, usage, field, EV_ABS, ABS_PRESSURE, 0);
++++++++ wacom_map_usage(input, usage, field, EV_ABS, ABS_PRESSURE, 0);
break;
case HID_DG_INRANGE:
-------- wacom_map_usage(wacom, usage, field, EV_KEY, BTN_TOOL_PEN, 0);
++++++++ wacom_map_usage(input, usage, field, EV_KEY, BTN_TOOL_PEN, 0);
break;
case HID_DG_INVERT:
-------- wacom_map_usage(wacom, usage, field, EV_KEY,
++++++++ wacom_map_usage(input, usage, field, EV_KEY,
BTN_TOOL_RUBBER, 0);
break;
case HID_DG_ERASER:
case HID_DG_TIPSWITCH:
-------- wacom_map_usage(wacom, usage, field, EV_KEY, BTN_TOUCH, 0);
++++++++ wacom_map_usage(input, usage, field, EV_KEY, BTN_TOUCH, 0);
break;
case HID_DG_BARRELSWITCH:
-------- wacom_map_usage(wacom, usage, field, EV_KEY, BTN_STYLUS, 0);
++++++++ wacom_map_usage(input, usage, field, EV_KEY, BTN_STYLUS, 0);
break;
case HID_DG_BARRELSWITCH2:
-------- wacom_map_usage(wacom, usage, field, EV_KEY, BTN_STYLUS2, 0);
++++++++ wacom_map_usage(input, usage, field, EV_KEY, BTN_STYLUS2, 0);
break;
case HID_DG_TOOLSERIALNUMBER:
-------- wacom_map_usage(wacom, usage, field, EV_MSC, MSC_SERIAL, 0);
++++++++ wacom_map_usage(input, usage, field, EV_MSC, MSC_SERIAL, 0);
break;
}
}
{
struct wacom *wacom = hid_get_drvdata(hdev);
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
-------- struct input_dev *input = wacom_wac->input;
++++++++ struct input_dev *input = wacom_wac->pen_input;
/* checking which Tool / tip switch to send */
switch (usage->hid) {
{
struct wacom *wacom = hid_get_drvdata(hdev);
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
-------- struct input_dev *input = wacom_wac->input;
++++++++ struct input_dev *input = wacom_wac->pen_input;
bool prox = wacom_wac->hid_data.inrange_state;
if (!wacom_wac->shared->stylus_in_proximity) /* first in prox */
struct wacom *wacom = hid_get_drvdata(hdev);
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
struct wacom_features *features = &wacom_wac->features;
++++++++ struct input_dev *input = wacom_wac->touch_input;
unsigned touch_max = wacom_wac->features.touch_max;
switch (usage->hid) {
case HID_GD_X:
features->last_slot_field = usage->hid;
if (touch_max == 1)
-------- wacom_map_usage(wacom, usage, field, EV_ABS, ABS_X, 4);
++++++++ wacom_map_usage(input, usage, field, EV_ABS, ABS_X, 4);
else
-------- wacom_map_usage(wacom, usage, field, EV_ABS,
++++++++ wacom_map_usage(input, usage, field, EV_ABS,
ABS_MT_POSITION_X, 4);
break;
case HID_GD_Y:
features->last_slot_field = usage->hid;
if (touch_max == 1)
-------- wacom_map_usage(wacom, usage, field, EV_ABS, ABS_Y, 4);
++++++++ wacom_map_usage(input, usage, field, EV_ABS, ABS_Y, 4);
else
-------- wacom_map_usage(wacom, usage, field, EV_ABS,
++++++++ wacom_map_usage(input, usage, field, EV_ABS,
ABS_MT_POSITION_Y, 4);
break;
case HID_DG_CONTACTID:
break;
case HID_DG_TIPSWITCH:
features->last_slot_field = usage->hid;
-------- wacom_map_usage(wacom, usage, field, EV_KEY, BTN_TOUCH, 0);
++++++++ wacom_map_usage(input, usage, field, EV_KEY, BTN_TOUCH, 0);
break;
}
}
if (usage->usage_index + 1 == field->report_count) {
if (usage->hid == wacom_wac->features.last_slot_field)
-------- wacom_wac_finger_slot(wacom_wac, wacom_wac->input);
++++++++ wacom_wac_finger_slot(wacom_wac, wacom_wac->touch_input);
}
return 0;
{
struct wacom *wacom = hid_get_drvdata(hdev);
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
-------- struct input_dev *input = wacom_wac->input;
++++++++ struct input_dev *input = wacom_wac->touch_input;
unsigned touch_max = wacom_wac->features.touch_max;
if (touch_max > 1)
{
struct wacom *wacom = hid_get_drvdata(hdev);
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
-------- struct input_dev *input = wacom_wac->input;
/* currently, only direct devices have proper hid report descriptors */
-------- __set_bit(INPUT_PROP_DIRECT, input->propbit);
++++++++ __set_bit(INPUT_PROP_DIRECT, wacom_wac->pen_input->propbit);
++++++++ __set_bit(INPUT_PROP_DIRECT, wacom_wac->touch_input->propbit);
if (WACOM_PEN_FIELD(field))
return wacom_wac_pen_usage_mapping(hdev, field, usage);
static int wacom_bpt_touch(struct wacom_wac *wacom)
{
struct wacom_features *features = &wacom->features;
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->touch_input;
struct input_dev *pad_input = wacom->pad_input;
unsigned char *data = wacom->data;
int i;
static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data)
{
struct wacom_features *features = &wacom->features;
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->touch_input;
bool touch = data[1] & 0x80;
int slot = input_mt_get_slot_by_key(input, data[0]);
static int wacom_bpt3_touch(struct wacom_wac *wacom)
{
-------- struct input_dev *input = wacom->input;
unsigned char *data = wacom->data;
int count = data[1] & 0x07;
int i;
wacom_bpt3_button_msg(wacom, data + offset);
}
-------- input_mt_sync_frame(input);
-------- wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
++++++++
++++++++ /* only update the touch if we actually have a touchpad */
++++++++ if (wacom->touch_registered) {
++++++++ input_mt_sync_frame(wacom->touch_input);
++++++++ wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
++++++++ }
return 1;
}
static int wacom_bpt_pen(struct wacom_wac *wacom)
{
struct wacom_features *features = &wacom->features;
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->pen_input;
unsigned char *data = wacom->data;
int prox = 0, x = 0, y = 0, p = 0, d = 0, pen = 0, btn1 = 0, btn2 = 0;
static int wacom_bamboo_pad_touch_event(struct wacom_wac *wacom,
unsigned char *data)
{
-------- struct input_dev *input = wacom->input;
++++++++ struct input_dev *input = wacom->touch_input;
unsigned char *finger_data, prefix;
unsigned id;
int x, y;
}
if (sync) {
-------- input_sync(wacom_wac->input);
++++++++ if (wacom_wac->pen_input)
++++++++ input_sync(wacom_wac->pen_input);
++++++++ if (wacom_wac->touch_input)
++++++++ input_sync(wacom_wac->touch_input);
if (wacom_wac->pad_input)
input_sync(wacom_wac->pad_input);
}
static void wacom_setup_cintiq(struct wacom_wac *wacom_wac)
{
-------- struct input_dev *input_dev = wacom_wac->input;
++++++++ struct input_dev *input_dev = wacom_wac->pen_input;
input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
static void wacom_setup_intuos(struct wacom_wac *wacom_wac)
{
-------- struct input_dev *input_dev = wacom_wac->input;
++++++++ struct input_dev *input_dev = wacom_wac->pen_input;
input_set_capability(input_dev, EV_REL, REL_WHEEL);
input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0);
}
-------- void wacom_setup_device_quirks(struct wacom_features *features)
++++++++ void wacom_setup_device_quirks(struct wacom *wacom)
{
++++++++ struct wacom_features *features = &wacom->wacom_wac.features;
++++++++
++++++++ /* The pen and pad share the same interface on most devices */
++++++++ if (features->type == GRAPHIRE_BT || features->type == WACOM_G4 ||
++++++++ features->type == DTUS || features->type == WACOM_MO ||
++++++++ (features->type >= INTUOS3S && features->type <= WACOM_13HD &&
++++++++ features->type != INTUOSHT)) {
++++++++ if (features->device_type & WACOM_DEVICETYPE_PEN)
++++++++ features->device_type |= WACOM_DEVICETYPE_PAD;
++++++++ }
/* touch device found but size is not defined. use default */
-------- if (features->device_type == BTN_TOOL_FINGER && !features->x_max) {
++++++++ if (features->device_type & WACOM_DEVICETYPE_TOUCH && !features->x_max) {
features->x_max = 1023;
features->y_max = 1023;
}
++++++++ /*
++++++++ * Intuos5/Pro and Bamboo 3rd gen have no useful data about its
++++++++ * touch interface in its HID descriptor. If this is the touch
++++++++ * interface (PacketSize of WACOM_PKGLEN_BBTOUCH3), override the
++++++++ * tablet values.
++++++++ */
++++++++ if ((features->type >= INTUOS5S && features->type <= INTUOSHT) ||
++++++++ (features->type == BAMBOO_PT)) {
++++++++ if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
++++++++ if (features->touch_max)
++++++++ features->device_type |= WACOM_DEVICETYPE_TOUCH;
++++++++ if (features->type == BAMBOO_PT || features->type == INTUOSHT)
++++++++ features->device_type |= WACOM_DEVICETYPE_PAD;
++++++++
++++++++ features->x_max = 4096;
++++++++ features->y_max = 4096;
++++++++ }
++++++++ }
++++++++
++++++++ /*
++++++++ * Raw Wacom-mode pen and touch events both come from interface
++++++++ * 0, whose HID descriptor has an application usage of 0xFF0D
++++++++ * (i.e., WACOM_VENDORDEFINED_PEN). We route pen packets back
++++++++ * out through the HID_GENERIC device created for interface 1,
++++++++ * so rewrite this one to be of type BTN_TOOL_FINGER.
++++++++ */
++++++++ if (features->type == BAMBOO_PAD)
++++++++ features->device_type |= WACOM_DEVICETYPE_TOUCH;
++++++++
++++++++ if (wacom->hdev->bus == BUS_BLUETOOTH)
++++++++ features->quirks |= WACOM_QUIRK_BATTERY;
++++++++
/* quirk for bamboo touch with 2 low res touches */
if (features->type == BAMBOO_PT &&
features->pktlen == WACOM_PKGLEN_BBTOUCH) {
features->quirks |= WACOM_QUIRK_NO_INPUT;
/* must be monitor interface if no device_type set */
-------- if (!features->device_type) {
++++++++ if (features->device_type == WACOM_DEVICETYPE_NONE) {
features->quirks |= WACOM_QUIRK_MONITOR;
features->quirks |= WACOM_QUIRK_BATTERY;
}
}
}
-------- static void wacom_abs_set_axis(struct input_dev *input_dev,
-------- struct wacom_wac *wacom_wac)
-------- {
-------- struct wacom_features *features = &wacom_wac->features;
--------
-------- if (features->device_type == BTN_TOOL_PEN) {
-------- input_set_abs_params(input_dev, ABS_X, features->x_min,
-------- features->x_max, features->x_fuzz, 0);
-------- input_set_abs_params(input_dev, ABS_Y, features->y_min,
-------- features->y_max, features->y_fuzz, 0);
-------- input_set_abs_params(input_dev, ABS_PRESSURE, 0,
-------- features->pressure_max, features->pressure_fuzz, 0);
--------
-------- /* penabled devices have fixed resolution for each model */
-------- input_abs_set_res(input_dev, ABS_X, features->x_resolution);
-------- input_abs_set_res(input_dev, ABS_Y, features->y_resolution);
-------- } else {
-------- if (features->touch_max == 1) {
-------- input_set_abs_params(input_dev, ABS_X, 0,
-------- features->x_max, features->x_fuzz, 0);
-------- input_set_abs_params(input_dev, ABS_Y, 0,
-------- features->y_max, features->y_fuzz, 0);
-------- input_abs_set_res(input_dev, ABS_X,
-------- features->x_resolution);
-------- input_abs_set_res(input_dev, ABS_Y,
-------- features->y_resolution);
-------- }
--------
-------- if (features->touch_max > 1) {
-------- input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0,
-------- features->x_max, features->x_fuzz, 0);
-------- input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0,
-------- features->y_max, features->y_fuzz, 0);
-------- input_abs_set_res(input_dev, ABS_MT_POSITION_X,
-------- features->x_resolution);
-------- input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
-------- features->y_resolution);
-------- }
-------- }
-------- }
--------
-------- int wacom_setup_pentouch_input_capabilities(struct input_dev *input_dev,
++++++++ int wacom_setup_pen_input_capabilities(struct input_dev *input_dev,
struct wacom_wac *wacom_wac)
{
struct wacom_features *features = &wacom_wac->features;
input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
++++++++ if (!(features->device_type & WACOM_DEVICETYPE_PEN))
++++++++ return -ENODEV;
++++++++
if (features->type == HID_GENERIC)
/* setup has already been done */
return 0;
__set_bit(BTN_TOUCH, input_dev->keybit);
__set_bit(ABS_MISC, input_dev->absbit);
-------- wacom_abs_set_axis(input_dev, wacom_wac);
++++++++ input_set_abs_params(input_dev, ABS_X, features->x_min,
++++++++ features->x_max, features->x_fuzz, 0);
++++++++ input_set_abs_params(input_dev, ABS_Y, features->y_min,
++++++++ features->y_max, features->y_fuzz, 0);
++++++++ input_set_abs_params(input_dev, ABS_PRESSURE, 0,
++++++++ features->pressure_max, features->pressure_fuzz, 0);
++++++++
++++++++ /* penabled devices have fixed resolution for each model */
++++++++ input_abs_set_res(input_dev, ABS_X, features->x_resolution);
++++++++ input_abs_set_res(input_dev, ABS_Y, features->y_resolution);
++++++++
switch (features->type) {
case GRAPHIRE_BT:
case INTUOSPS:
__set_bit(INPUT_PROP_POINTER, input_dev->propbit);
-------- if (features->device_type == BTN_TOOL_PEN) {
-------- input_set_abs_params(input_dev, ABS_DISTANCE, 0,
-------- features->distance_max,
-------- 0, 0);
--------
-------- input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
-------- input_abs_set_res(input_dev, ABS_Z, 287);
++++++++ input_set_abs_params(input_dev, ABS_DISTANCE, 0,
++++++++ features->distance_max,
++++++++ 0, 0);
-------- wacom_setup_intuos(wacom_wac);
-------- } else if (features->device_type == BTN_TOOL_FINGER) {
-------- __clear_bit(ABS_MISC, input_dev->absbit);
++++++++ input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
++++++++ input_abs_set_res(input_dev, ABS_Z, 287);
-------- input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
-------- 0, features->x_max, 0, 0);
-------- input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR,
-------- 0, features->y_max, 0, 0);
-------- input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
-------- }
++++++++ wacom_setup_intuos(wacom_wac);
break;
case WACOM_24HDT:
-------- if (features->device_type == BTN_TOOL_FINGER) {
-------- input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, features->x_max, 0, 0);
-------- input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, features->x_max, 0, 0);
-------- input_set_abs_params(input_dev, ABS_MT_WIDTH_MINOR, 0, features->y_max, 0, 0);
-------- input_set_abs_params(input_dev, ABS_MT_ORIENTATION, 0, 1, 0, 0);
-------- }
-------- /* fall through */
--------
case WACOM_27QHDT:
case MTSCREEN:
case MTTPC:
case MTTPC_B:
case TABLETPC2FG:
-------- if (features->device_type == BTN_TOOL_FINGER && features->touch_max > 1)
-------- input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_DIRECT);
-------- /* fall through */
--------
case TABLETPC:
case TABLETPCE:
__clear_bit(ABS_MISC, input_dev->absbit);
--------
-------- __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
--------
-------- if (features->device_type != BTN_TOOL_PEN)
-------- break; /* no need to process stylus stuff */
--------
/* fall through */
case DTUS:
break;
case INTUOSHT:
-------- if (features->touch_max &&
-------- features->device_type == BTN_TOOL_FINGER) {
-------- input_dev->evbit[0] |= BIT_MASK(EV_SW);
-------- __set_bit(SW_MUTE_DEVICE, input_dev->swbit);
-------- }
-------- /* fall through */
--------
case BAMBOO_PT:
__clear_bit(ABS_MISC, input_dev->absbit);
-------- if (features->device_type == BTN_TOOL_FINGER) {
++++++++ __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
++++++++ __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
++++++++ __set_bit(BTN_TOOL_PEN, input_dev->keybit);
++++++++ __set_bit(BTN_STYLUS, input_dev->keybit);
++++++++ __set_bit(BTN_STYLUS2, input_dev->keybit);
++++++++ input_set_abs_params(input_dev, ABS_DISTANCE, 0,
++++++++ features->distance_max,
++++++++ 0, 0);
++++++++ break;
++++++++ case BAMBOO_PAD:
++++++++ __clear_bit(ABS_MISC, input_dev->absbit);
++++++++ break;
++++++++ }
++++++++ return 0;
++++++++ }
-------- if (features->touch_max) {
-------- if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
-------- input_set_abs_params(input_dev,
-------- ABS_MT_TOUCH_MAJOR,
-------- 0, features->x_max, 0, 0);
-------- input_set_abs_params(input_dev,
-------- ABS_MT_TOUCH_MINOR,
-------- 0, features->y_max, 0, 0);
-------- }
-------- input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
-------- } else {
-------- /* buttons/keys only interface */
-------- __clear_bit(ABS_X, input_dev->absbit);
-------- __clear_bit(ABS_Y, input_dev->absbit);
-------- __clear_bit(BTN_TOUCH, input_dev->keybit);
++++++++ int wacom_setup_touch_input_capabilities(struct input_dev *input_dev,
++++++++ struct wacom_wac *wacom_wac)
++++++++ {
++++++++ struct wacom_features *features = &wacom_wac->features;
-------- /* PAD is setup by wacom_setup_pad_input_capabilities later */
-------- return 1;
-------- }
-------- } else if (features->device_type == BTN_TOOL_PEN) {
-------- __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
-------- __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
-------- __set_bit(BTN_TOOL_PEN, input_dev->keybit);
-------- __set_bit(BTN_STYLUS, input_dev->keybit);
-------- __set_bit(BTN_STYLUS2, input_dev->keybit);
-------- input_set_abs_params(input_dev, ABS_DISTANCE, 0,
-------- features->distance_max,
-------- 0, 0);
++++++++ input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
++++++++
++++++++ if (!(features->device_type & WACOM_DEVICETYPE_TOUCH))
++++++++ return -ENODEV;
++++++++
++++++++ if (features->type == HID_GENERIC)
++++++++ /* setup has already been done */
++++++++ return 0;
++++++++
++++++++ __set_bit(BTN_TOUCH, input_dev->keybit);
++++++++
++++++++ if (features->touch_max == 1) {
++++++++ input_set_abs_params(input_dev, ABS_X, 0,
++++++++ features->x_max, features->x_fuzz, 0);
++++++++ input_set_abs_params(input_dev, ABS_Y, 0,
++++++++ features->y_max, features->y_fuzz, 0);
++++++++ input_abs_set_res(input_dev, ABS_X,
++++++++ features->x_resolution);
++++++++ input_abs_set_res(input_dev, ABS_Y,
++++++++ features->y_resolution);
++++++++ }
++++++++ else if (features->touch_max > 1) {
++++++++ input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0,
++++++++ features->x_max, features->x_fuzz, 0);
++++++++ input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0,
++++++++ features->y_max, features->y_fuzz, 0);
++++++++ input_abs_set_res(input_dev, ABS_MT_POSITION_X,
++++++++ features->x_resolution);
++++++++ input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
++++++++ features->y_resolution);
++++++++ }
++++++++
++++++++ switch (features->type) {
++++++++ case INTUOS5:
++++++++ case INTUOS5L:
++++++++ case INTUOSPM:
++++++++ case INTUOSPL:
++++++++ case INTUOS5S:
++++++++ case INTUOSPS:
++++++++ __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
++++++++
++++++++ input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, features->x_max, 0, 0);
++++++++ input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, 0, features->y_max, 0, 0);
++++++++ input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
++++++++ break;
++++++++
++++++++ case WACOM_24HDT:
++++++++ input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, features->x_max, 0, 0);
++++++++ input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, features->x_max, 0, 0);
++++++++ input_set_abs_params(input_dev, ABS_MT_WIDTH_MINOR, 0, features->y_max, 0, 0);
++++++++ input_set_abs_params(input_dev, ABS_MT_ORIENTATION, 0, 1, 0, 0);
++++++++ /* fall through */
++++++++
++++++++ case WACOM_27QHDT:
++++++++ case MTSCREEN:
++++++++ case MTTPC:
++++++++ case MTTPC_B:
++++++++ case TABLETPC2FG:
++++++++ input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_DIRECT);
++++++++ /*fall through */
++++++++
++++++++ case TABLETPC:
++++++++ case TABLETPCE:
++++++++ __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
++++++++ break;
++++++++
++++++++ case INTUOSHT:
++++++++ input_dev->evbit[0] |= BIT_MASK(EV_SW);
++++++++ __set_bit(SW_MUTE_DEVICE, input_dev->swbit);
++++++++ /* fall through */
++++++++
++++++++ case BAMBOO_PT:
++++++++ if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
++++++++ input_set_abs_params(input_dev,
++++++++ ABS_MT_TOUCH_MAJOR,
++++++++ 0, features->x_max, 0, 0);
++++++++ input_set_abs_params(input_dev,
++++++++ ABS_MT_TOUCH_MINOR,
++++++++ 0, features->y_max, 0, 0);
}
++++++++ input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
break;
++++++++
case BAMBOO_PAD:
-------- __clear_bit(ABS_MISC, input_dev->absbit);
input_mt_init_slots(input_dev, features->touch_max,
INPUT_MT_POINTER);
__set_bit(BTN_LEFT, input_dev->keybit);
struct wacom_features *features = &wacom_wac->features;
int i;
++++++++ if (!(features->device_type & WACOM_DEVICETYPE_PAD))
++++++++ return -ENODEV;
++++++++
input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
/* kept for making legacy xf86-input-wacom working with the wheels */
case INTUOS5S:
case INTUOSPS:
-------- /* touch interface does not have the pad device */
-------- if (features->device_type != BTN_TOOL_PEN)
-------- return -ENODEV;
--------
for (i = 0; i < 7; i++)
__set_bit(BTN_0 + i, input_dev->keybit);
case INTUOSHT:
case BAMBOO_PT:
-------- /* pad device is on the touch interface */
-------- if ((features->device_type != BTN_TOOL_FINGER) ||
-------- /* Bamboo Pen only tablet does not have pad */
-------- ((features->type == BAMBOO_PT) && !features->touch_max))
-------- return -ENODEV;
--------
__clear_bit(ABS_MISC, input_dev->absbit);
__set_bit(BTN_LEFT, input_dev->keybit);
{ "Wacom DTU1031X", 22472, 12728, 511, 0,
DTUSX, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
WACOM_DTU_OFFSET, WACOM_DTU_OFFSET };
++++++++ static const struct wacom_features wacom_features_0x336 =
++++++++ { "Wacom DTU1141", 23472, 13203, 1023, 0,
++++++++ DTUS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
static const struct wacom_features wacom_features_0x57 =
{ "Wacom DTK2241", 95640, 54060, 2047, 63,
DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
{ USB_DEVICE_WACOM(0x32F) },
{ USB_DEVICE_WACOM(0x333) },
{ USB_DEVICE_WACOM(0x335) },
++++++++ { USB_DEVICE_WACOM(0x336) },
{ USB_DEVICE_WACOM(0x4001) },
{ USB_DEVICE_WACOM(0x4004) },
{ USB_DEVICE_WACOM(0x5000) },