S: Maintained
F: drivers/mailbox/mailbox-altera.c
+ + ++++ALTERA PIO DRIVER
+ + ++++S: Maintained
+ + ++++F: drivers/gpio/gpio-altera.c
+ + ++++
ALTERA TRIPLE SPEED ETHERNET DRIVER
F: include/linux/amd-iommu.h
AMD KFD
- - ----T: git git://people.freedesktop.org/~gabbayo/linux.git
- - ----S: Supported
- - ----F: drivers/gpu/drm/amd/amdkfd/
+ + ++++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
F: drivers/media/rc/meson-ir.c
N: meson[x68]
+ + ++++ARM/Annapurna Labs ALPINE ARCHITECTURE
+ + ++++S: Maintained
+ + ++++F: arch/arm/mach-alpine/
+ + ++++
ARM/ATMEL AT91RM9200 AND AT91SAM ARM ARCHITECTURES
- - ----W: http://maxim.org.za/at91_26.html
W: http://www.linux4sam.org
S: Supported
F: arch/arm/mach-at91/
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
- - ----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
+ + ++++S: Maintained
+ + ++++N: digicolor
+ + ++++
ARM/EBSA110 MACHINE SUPPORT
S: Maintained
- - ----ARM/Marvell Armada 370 and Armada XP SOC support
+ + ++++ARM/Marvell Kirkwood and Armada 370, 375, 38x, XP SOC support
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
S: Maintained
F: arch/arm/mach-berlin/
+ + ++++F: arch/arm/boot/dts/berlin*
+ + ++++
ARM/Marvell Dove/MV78xx0/Orion SOC support
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
ARM/Mediatek SoC support
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
- - ----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
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
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
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
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>
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>
S: Supported
F: drivers/misc/atmel-ssc.c
F: drivers/media/radio/radio-aztech*
B43 WIRELESS DRIVER
W: http://wireless.kernel.org/en/users/Drivers/b43
- - ----S: Maintained
+ + ++++S: Odd Fixes
F: drivers/net/wireless/b43/
B43LEGACY WIRELESS DRIVER
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>
S: Maintained
F: drivers/video/backlight/
F: fs/befs/
BECKHOFF CX5020 ETHERCAT MASTER DRIVER
- - ----S: Maintained
- - ----F: drivers/net/ethernet/ec_bhf.c
+ + ++++S: Maintained
+ + ++++F: drivers/net/ethernet/ec_bhf.c
BFS FILE SYSTEM
F: drivers/net/ethernet/broadcom/bnx2x/
BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITECTURE
T: git git://github.com/broadcom/mach-bcm
S: Maintained
F: drivers/usb/gadget/udc/bcm63xx_udc.*
BROADCOM BCM7XXX ARM ARCHITECTURE
S: Maintained
F: drivers/usb/chipidea/
+ + ++++CHIPONE ICN8318 I2C TOUCHSCREEN DRIVER
+ + ++++S: Maintained
+ + ++++F: Documentation/devicetree/bindings/input/touchscreen/chipone_icn8318.txt
+ + ++++F: drivers/input/touchscreen/chipone_icn8318.c
+ + ++++
CHROME HARDWARE PLATFORM SUPPORT
S: Maintained
CLK API
S: Maintained
F: include/linux/clk.h
COMMON CLK FRAMEWORK
- - ----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)
- - ----W: http://www.chelsio.com
- - ----S: Supported
- - ----F: drivers/scsi/cxgbi/cxgb3i
+ + ++++W: http://www.chelsio.com
+ + ++++S: Supported
+ + ++++F: drivers/scsi/cxgbi/cxgb3i
CXGB3 IWARP RNIC DRIVER (IW_CXGB3)
F: drivers/net/ethernet/chelsio/cxgb4/
CXGB4 ISCSI DRIVER (CXGB4I)
- - ----W: http://www.chelsio.com
- - ----S: Supported
- - ----F: drivers/scsi/cxgbi/cxgb4i
+ + ++++W: http://www.chelsio.com
+ + ++++S: Supported
+ + ++++F: drivers/scsi/cxgbi/cxgb4i
CXGB4 IWARP RNIC DRIVER (IW_CXGB4)
DELL LAPTOP DRIVER
S: Maintained
F: drivers/platform/x86/dell-laptop.c
+ + ++++DELL LAPTOP FREEFALL DRIVER
+ + ++++S: Maintained
+ + ++++F: drivers/platform/x86/dell-smo8800.c
+ + ++++
DELL LAPTOP SMM DRIVER
S: Maintained
DELL WMI EXTRAS DRIVER
S: Maintained
F: drivers/platform/x86/dell-wmi.c
F: drivers/firmware/dmi_scan.c
F: include/linux/dmi.h
- - ----DOCKING STATION DRIVER
- - ----S: Supported
- - ----F: drivers/acpi/dock.c
- - ----
DOCUMENTATION
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
+ + ++++S: Maintained
+ + ++++F: drivers/gpu/drm/rockchip/
+ + ++++F: Documentation/devicetree/bindings/video/rockchip*
+ + ++++
DSBR100 USB FM RADIO DRIVER
F: Documentation/extcon/
EXYNOS DP DRIVER
- - ----M: Jingoo Han <jg1.han@samsung.com>
+ + ++++M: Jingoo Han <jingoohan1@gmail.com>
S: Maintained
F: drivers/gpu/drm/exynos/exynos_dp*
F: drivers/phy/
F: include/linux/phy/
+ + ++++GENERIC PM DOMAINS
+ + ++++S: Supported
+ + ++++F: drivers/base/power/domain*.c
+ + ++++F: include/linux/pm_domain.h
+ + ++++
GENERIC UIO DRIVER FOR PCI DEVICES
GFS2 FILE SYSTEM
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
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
T: git git://linuxtv.org/media_tree.git
S: Maintained
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
+++++ +++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
S: Maintained
F: drivers/ipack/
+ + ++++INGENIC JZ4780 DMA Driver
+ + ++++S: Maintained
+ + ++++F: drivers/dma/dma-jz4780.c
+ + ++++
INTEGRITY MEASUREMENT ARCHITECTURE (IMA)
F: drivers/video/fbdev/imsttfb.c
INFINIBAND SUBSYSTEM
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
INTEL WIRELESS WIMAX CONNECTION 2400
S: Supported
W: http://linuxwimax.org
F: Documentation/wimax/README.i2400m
F: include/linux/ipmi*
F: include/uapi/linux/ipmi*
+ + ++++QCOM AUDIO (ASoC) DRIVERS
+ + ++++S: Supported
+ + ++++F: sound/soc/qcom/
+ + ++++
IPS SCSI RAID DRIVER
LED SUBSYSTEM
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
W: http://www.penguinppc.org/
S: Maintained
F: drivers/media/dvb-frontends/m88rs2000*
- - ----M88TS2022 MEDIA DRIVER
- - ----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
MELLANOX ETHERNET DRIVER (mlx4_en)
S: Supported
W: http://www.mellanox.com
F: drivers/watchdog/mena21_wdt.c
MEN CHAMELEON BUS (mcb)
S: Supported
F: drivers/mcb/
F: include/linux/mcb.h
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
+ + ++++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
F: drivers/block/nvme*
F: include/linux/nvme.h
+ + ++++NXP-NCI NFC DRIVER
+ + ++++S: Supported
+ + ++++F: drivers/nfc/nxp-nci
+ + ++++
NXP TDA998X DRM DRIVER
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
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
+ + ++++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
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>
F: drivers/pci/host/pci-exynos.c
PCI DRIVER FOR SYNOPSIS DESIGNWARE
S: Maintained
F: drivers/pci/host/*designware*
F: drivers/pci/host/pci-host-generic.c
PCIE DRIVER FOR ST SPEAR13XX
- - ----S: Maintained
+ + ++++S: Orphan
F: drivers/pci/host/*spear*
PCMCIA SUBSYSTEM
S: Maintained
QAT DRIVER
- - ----S: Supported
- - ----F: drivers/crypto/qat/
+ + ++++S: Supported
+ + ++++F: drivers/crypto/qat/
QIB DRIVER
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
+ + ++++S: Supported
+ + ++++F: drivers/block/pmem.c
+ + ++++
RANDOM NUMBER DRIVER
S: Maintained
REAL TIME CLOCK (RTC) SUBSYSTEM
Q: http://patchwork.ozlabs.org/project/rtc-linux/list/
S: Maintained
S390 NETWORK DRIVERS
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>
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>
- - ----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
+ + ++++Emulex 10Gbps NIC BE2, BE3-R, Lancer, Skyhawk-R DRIVER
W: http://www.emulex.com
S: Supported
F: drivers/net/ethernet/emulex/benet/
+ + ++++EMULEX ONECONNECT ROCE DRIVER
+ + ++++W: http://www.emulex.com
+ + ++++S: Supported
+ + ++++F: drivers/infiniband/hw/ocrdma/
+ + ++++
SFC NETWORK DRIVER
S: Maintained
F: drivers/media/platform/am437x/
+ + ++++OV2659 OMNIVISION SENSOR DRIVER
+ + ++++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
TIPC NETWORK LAYER
- - ----M: Allan Stephens <allan.stephens@windriver.com>
+ + ++++M: Ying Xue <ying.xue@windriver.com>
W: http://tipc.sourceforge.net/
F: drivers/platform/x86/topstar-laptop.c
TOSHIBA ACPI EXTRAS DRIVER
- - ----S: Orphan
+ + ++++S: Maintained
F: drivers/platform/x86/toshiba_acpi.c
+ + ++++TOSHIBA BLUETOOTH DRIVER
+ + ++++S: Maintained
+ + ++++F: drivers/platform/x86/toshiba_bluetooth.c
+ + ++++
+ + ++++TOSHIBA HDD ACTIVE PROTECTION SENSOR DRIVER
+ + ++++S: Maintained
+ + ++++F: drivers/platform/x86/toshiba_haps.c
+ + ++++
TOSHIBA SMM DRIVER
TPM DEVICE DRIVER
W: http://tpmdd.sourceforge.net
Q: git git://github.com/PeterHuewe/linux-tpmdd.git
F: include/uapi/linux/cdrom.h
UNISYS S-PAR DRIVERS
- - ----S: Supported
- - ----F: drivers/staging/unisys/
+ + ++++S: Supported
+ + ++++F: drivers/staging/unisys/
UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER
F: include/uapi/linux/virtio_console.h
VIRTIO CORE, NET AND BLOCK DRIVERS
S: Maintained
F: drivers/vhost/
F: include/uapi/linux/vhost.h
+ + ++++VIRTIO INPUT DRIVER
+ + ++++S: Maintained
+ + ++++F: drivers/virtio/virtio_input.c
+ + ++++F: include/uapi/linux/virtio_input.h
+ + ++++
VIA RHINE NETWORK DRIVER
S: Maintained
S: Maintained
F: drivers/misc/vmw_balloon.c
+ + ++++VMWARE VMMOUSE SUBDRIVER
+ + ++++S: Maintained
+ + ++++F: drivers/input/mouse/vmmouse.c
+ + ++++F: drivers/input/mouse/vmmouse.h
+ + ++++
VMWARE VMXNET3 ETHERNET DRIVER
WIMAX STACK
S: Supported
W: http://linuxwimax.org
F: Documentation/wimax/README.wimax
S: Maintained
F: drivers/tty/serial/uartlite.c
+ + ++++XILINX VIDEO IP CORES
+ + ++++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
ZRAM COMPRESSED RAM BLOCK DEVICE DRVIER
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
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) },
{ }
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) },