#
# If the property is missing, user-space can assume:
# ID_INPUT_JOYSTICK_INTEGRATION=external
+#
+# By default i8042, i2c, and rmi devices are assumed to be internal,
+# bluetooth devices are assumed to be external, usb devices are assumed
+# to be internal when connected to a PCB port and external otherwise.
-joystick:bluetooth:*
- ID_INPUT_JOYSTICK_INTEGRATION=external
-
-###########################################################
-# GPD
-###########################################################
-
-# GPD Win, Classic and XBox 360 compat modes
-joystick:usb:v11c5p5507*
-joystick:usb:v045ep028e*
- ID_INPUT_JOYSTICK_INTEGRATION=internal
+# Example entry; vid: ffff, pid: 0000; both must be lowecase.
+# this will make this usb joystick to behave as internal.
+#joystick:usb:vffffp0000*
+# ID_INPUT_JOYSTICK_INTEGRATION=internal
# Permitted keys:
# Specify whether a touchpad is a built-in one or external:
# ID_INPUT_TOUCHPAD_INTEGRATION=internal|external
+#
+# By default i8042, i2c, and rmi devices are assumed to be internal,
+# bluetooth devices are assumed to be external, usb devices are assumed
+# to be internal when connected to a PCB port and external otherwise.
-touchpad:i8042:*
-touchpad:rmi:*
-touchpad:usb:*
- ID_INPUT_TOUCHPAD_INTEGRATION=internal
-
-touchpad:bluetooth:*
- ID_INPUT_TOUCHPAD_INTEGRATION=external
-
-###########################################################
-# Apple
-###########################################################
-# Magic Trackpad (1 and 2)
-touchpad:usb:v05acp030e:*
-touchpad:usb:v05acp0265:*
-touchpad:usb:v05acp0324:*
- ID_INPUT_TOUCHPAD_INTEGRATION=external
-
-###########################################################
-# HP Elite x2 1013 G3
-###########################################################
-touchpad:usb:v044ep1221:*
- ID_INPUT_TOUCHPAD_INTEGRATION=external
+# Example entry; vid: ffff, pid: 0000; both must be lowecase.
+# this will make this bluetooth touchpad to behave as internal.
+#touchpad:bluetooth:vffffp0000:*
+# ID_INPUT_TOUCHPAD_INTEGRATION=internal
###########################################################
# Lenovo IdeaPad Duet3 10IGL5 (82AT)
###########################################################
touchpad:bluetooth:v17efp60fa:*
ID_INPUT_TOUCHPAD_INTEGRATION=internal
-
-###########################################################
-# Logitech
-###########################################################
-touchpad:usb:v046d*
- ID_INPUT_TOUCHPAD_INTEGRATION=external
-
-###########################################################
-# Wacom
-###########################################################
-touchpad:usb:v056a*
- ID_INPUT_TOUCHPAD_INTEGRATION=external
SUBSYSTEMS=="bluetooth", ENV{ID_BUS}="bluetooth", GOTO="persistent_input_end"
# Bluetooth devices don't always have the bluetooth subsystem
ATTRS{id/bustype}=="0005", ENV{ID_BUS}="bluetooth", GOTO="persistent_input_end"
+SUBSYSTEMS=="acpi", ENV{ID_BUS}="acpi"
+# platform must be before serio as serio can be child
+SUBSYSTEMS=="platform", ENV{ID_BUS}="platform"
+SUBSYSTEMS=="i2c", ENV{ID_BUS}="i2c"
SUBSYSTEMS=="rmi4", ENV{ID_BUS}="rmi"
SUBSYSTEMS=="serio", ENV{ID_BUS}="i8042"
SUBSYSTEMS=="usb", ENV{ID_BUS}=="", IMPORT{builtin}="usb_id"
+# subsystems before (usb, platform, i2c) can be under pci so only set them if we still have no ID_BUS.
+# we could set this the first but will break the ENV{ID_BUS}=="" condition for usb.
+SUBSYSTEMS=="pci", ENV{ID_BUS}=="", ENV{ID_BUS}="pci"
+
# determine class name for persistent symlinks
ENV{ID_INPUT_KEYBOARD}=="?*", ENV{.INPUT_CLASS}="kbd"
ENV{ID_INPUT_MOUSE}=="?*", ENV{.INPUT_CLASS}="mouse"
--- /dev/null
+# do not edit this file, it will be overwritten on update
+
+# ID_INTEGRATION variable tells us if a device is internal (inherent part of the system) or external otherwise.
+# This must be loaded after 60-persistent-*.rules to have ID_BUS.
+
+ACTION=="remove", GOTO="integration_end"
+ENV{ID_BUS}=="", GOTO="integration_end"
+
+# ACPI, platform, PS/2, I2C, RMI and PCI devices: Internal by default.
+ENV{ID_BUS}=="acpi|platform|i8042|i2c|rmi|pci", ENV{ID_INTEGRATION}="internal"
+
+# Bluetooth devices: External by default.
+ENV{ID_BUS}=="bluetooth", ENV{ID_INTEGRATION}="external"
+
+# USB devices: Internal if it's connected to a fixed port, external to a removable or unknown.
+ENV{ID_BUS}=="usb", DRIVERS=="usb", ATTRS{maxchild}=="0", ATTRS{removable}=="fixed", ENV{ID_INTEGRATION}="internal"
+ENV{ID_BUS}=="usb", DRIVERS=="usb", ATTRS{maxchild}=="0", ATTRS{removable}=="removable|unknown", ENV{ID_INTEGRATION}="external"
+
+# libinput compatibility variables, must be loaded before 70-(joystick|touchpad).rules to allow hwdb quirks to override.
+ENV{ID_INPUT}=="", GOTO="integration_libinput_end"
+ENV{ID_INPUT_JOYSTICK}=="1", ENV{ID_INPUT_JOYSTICK_INTEGRATION}="$env{ID_INTEGRATION}"
+ENV{ID_INPUT_TOUCHPAD}=="1", ENV{ID_INPUT_TOUCHPAD_INTEGRATION}="$env{ID_INTEGRATION}"
+LABEL="integration_libinput_end"
+
+LABEL="integration_end"
'60-persistent-v4l.rules',
'60-sensor.rules',
'60-serial.rules',
+ '65-integration.rules',
'70-camera.rules',
'70-joystick.rules',
'70-mouse.rules',