Add comprehensive documentation for Lenovo ThinkPad Gentoo Linux setup including: - Complete system configuration guides (power, Bluetooth, WiFi, audio) - Hardware setup documentation (touchpad, touchscreen, DisplayLink) - Management scripts with ZSH completions - Kernel configuration (6.12.41-gentoo-x86_64) - Lid automation and monitor management - Battery conservation system - User guides and troubleshooting Repository includes .gitignore to exclude logs, temporary files, and secrets. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
7.9 KiB
Touchpad and Touchscreen Setup
Date: 2025-11-05
Problem
Both touchpad and touchscreen were not functional despite being detected by the system.
Hardware Details
Touchpad
- Model: ELAN901C
- Type: I2C HID device
- ACPI Path: ELAN901C:00
- Modalias:
acpi:ELAN901C:PNP0C50: - I2C Bus: i2c-3 (AMDI0010:00)
- Sysfs Path:
/sys/bus/i2c/devices/i2c-ELAN901C:00
Touchscreen
- Model: ELAN0678
- Type: I2C HID multitouch display
- ACPI Path: ELAN0678:00
- Modalias:
acpi:ELAN0678:PNP0C50: - I2C Bus: i2c-4 (AMDI0010:01)
- Sysfs Path:
/sys/bus/i2c/devices/i2c-ELAN0678:00
Root Cause Analysis
The kernel was missing two critical configurations:
- I2C HID ACPI binding support (
CONFIG_I2C_HID_ACPI) - Required for ACPI-based I2C HID devices - AMD GPIO/Pinctrl support (
CONFIG_PINCTRL_AMD) - Required for GPIO interrupts on AMD platforms
Original Kernel Configuration (First Issue)
CONFIG_I2C_HID=m
# CONFIG_I2C_HID_ACPI is not set ← Problem #1!
# CONFIG_I2C_HID_OF is not set
Second Issue Discovered After First Reboot
# CONFIG_PINCTRL_AMD is not set ← Problem #2!
Why both are needed:
CONFIG_I2C_HID_ACPI: Allows the i2c-hid driver to bind to ACPI devices (PNP0C50)CONFIG_PINCTRL_AMD: Provides GPIO support for interrupt handling on AMD platforms
Without PINCTRL_AMD, the i2c-hid-acpi driver would hang when trying to configure device interrupts.
PNP0C50 Identifier
Both devices use PNP0C50, which is the ACPI HID (Hardware ID) for "HID over I2C" devices. This is a standard identifier for touchpads and touchscreens that communicate via I2C protocol using the HID standard.
Solution
Step 1: Enable I2C HID ACPI in Kernel Config
cd /usr/src/linux
sudo scripts/config --module I2C_HID_ACPI
# or: sudo sed -i 's/# CONFIG_I2C_HID_ACPI is not set/CONFIG_I2C_HID_ACPI=m/' .config
Step 2: Enable AMD Pinctrl Support
CRITICAL: This must be built-in (=y), not a module, because it provides GPIO interrupt support needed early in boot.
cd /usr/src/linux
sudo scripts/config --enable PINCTRL_AMD
Verification:
grep "CONFIG_I2C_HID_ACPI\|CONFIG_PINCTRL_AMD" .config
# Should output:
# CONFIG_I2C_HID_ACPI=m
# CONFIG_PINCTRL_AMD=y
Step 3: Rebuild Kernel
cd /usr/src/linux
sudo genkernel --makeopts=-j16 all
Build History:
- First rebuild: November 5, 2025 08:27 (added CONFIG_I2C_HID_ACPI)
- Second rebuild: November 5, 2025 09:44 (attempted PINCTRL_AMD)
- Final rebuild: November 5, 2025 ~10:00 (properly added CONFIG_PINCTRL_AMD=y)
Important Notes:
- Use
--no-mrproperto preserve existing kernel config when doing incremental changes - When enabling new options with dependencies, sometimes a full rebuild without
--no-mrproperis needed --makeopts=-j16: Uses all 16 CPU threads for parallel compilation
Step 4: Verify Build
# Check i2c-hid modules
find /lib/modules/6.12.41-gentoo-x86_64/ -name "*i2c*hid*.ko*"
# Verify PINCTRL_AMD is built-in (not a module)
zcat /proc/config.gz | grep PINCTRL_AMD
# Should show: CONFIG_PINCTRL_AMD=y (after reboot with new kernel)
Expected modules:
/lib/modules/6.12.41-gentoo-x86_64/kernel/drivers/hid/i2c-hid/i2c-hid.ko
/lib/modules/6.12.41-gentoo-x86_64/kernel/drivers/hid/i2c-hid/i2c-hid-acpi.ko
Note: PINCTRL_AMD won't appear as a .ko file because it's built-in to the kernel.
Step 5: Create Kernel Backup
# Create timestamped backup of previous kernel
sudo cp /boot/vmlinuz-6.12.41-gentoo-x86_64.old /boot/vmlinuz-6.12.41-gentoo-x86_64.backup-20251105
sudo cp /boot/initramfs-6.12.41-gentoo-x86_64.img.old /boot/initramfs-6.12.41-gentoo-x86_64.img.backup-20251105
sudo cp /boot/System.map-6.12.41-gentoo-x86_64.old /boot/System.map-6.12.41-gentoo-x86_64.backup-20251105
Step 6: Reboot (Required)
The new kernel and modules are in place:
/boot/vmlinuz-6.12.41-gentoo-x86_64(Nov 5 ~10:00 - final build)/boot/initramfs-6.12.41-gentoo-x86_64.img(Nov 5 ~10:00)
No GRUB changes needed - GRUB already boots from these filenames.
Post-Reboot Verification
Check Module Loading
# Check if i2c-hid-acpi module is loaded
lsmod | grep i2c_hid
# Expected output:
# i2c_hid_acpi 16384 0
# i2c_hid 32768 1 i2c_hid_acpi
Check Input Devices
# List all input devices
cat /proc/bus/input/devices
# Should now show ELAN901C touchpad and ELAN0678 touchscreen
Check with libinput
# List all input devices recognized by libinput
libinput list-devices
# Should show both touchpad and touchscreen with capabilities
Test Functionality
Touchpad:
- Single finger: Cursor movement
- Two finger scroll: Vertical/horizontal scrolling
- Two finger tap: Right click
- Palm rejection: Should ignore accidental touches
Touchscreen:
- Single touch: Cursor movement and click
- Multi-touch: Pinch to zoom, two-finger gestures
- Touch accuracy: Should be precise across entire display
Auto-Load Configuration (If Needed)
If the module doesn't load automatically after reboot, create an auto-load config:
# Create module auto-load configuration
echo "i2c-hid-acpi" | sudo tee /etc/modules-load.d/i2c-hid.conf
# Verify
cat /etc/modules-load.d/i2c-hid.conf
Troubleshooting
Module Not Loading
# Try loading manually
sudo modprobe i2c-hid-acpi
# Check kernel messages
dmesg | grep -i "i2c.*hid\|elan"
Devices Not Recognized
# Check if devices are still on I2C bus
ls -la /sys/bus/i2c/devices/ | grep ELAN
# Check device status
cat /sys/bus/i2c/devices/i2c-ELAN901C:00/uevent
cat /sys/bus/i2c/devices/i2c-ELAN0678:00/uevent
Verify Kernel Config
# Check running kernel config
zcat /proc/config.gz | grep I2C_HID
# Should show:
# CONFIG_I2C_HID=m
# CONFIG_I2C_HID_ACPI=m
Files Modified/Created
Kernel Configuration
/usr/src/linux/.config- Enabled CONFIG_I2C_HID_ACPI=m
Kernel Files
/boot/vmlinuz-6.12.41-gentoo-x86_64- New kernel (Nov 5 08:27)/boot/initramfs-6.12.41-gentoo-x86_64.img- New initramfs (Nov 5 08:41)/boot/System.map-6.12.41-gentoo-x86_64- New symbol map
Backups
/boot/vmlinuz-6.12.41-gentoo-x86_64.old- Automatic genkernel backup/boot/vmlinuz-6.12.41-gentoo-x86_64.backup-20251105- Manual backup- Similar for initramfs and System.map
Kernel Modules
/lib/modules/6.12.41-gentoo-x86_64/kernel/drivers/hid/i2c-hid/i2c-hid-acpi.ko- New module
Configuration (to be created if needed)
/etc/modules-load.d/i2c-hid.conf- Auto-load configuration (if needed)
Key Learnings
-
I2C HID ACPI is Essential: Modern laptops use I2C HID with ACPI binding for touchpads and touchscreens. Generic I2C HID support (
CONFIG_I2C_HID) is not sufficient. -
PNP0C50 = HID over I2C: The ACPI identifier
PNP0C50is the standard ID for devices using the HID over I2C protocol. -
Module Dependencies:
i2c-hid-acpidepends oni2c-hid- Both must be enabled for ACPI-based I2C HID devices to work
-
Fast Incremental Rebuilds: Using
--no-clean --no-mrproperwith genkernel allows for fast incremental rebuilds when only adding a single module. -
Device Detection vs Functionality: Devices can appear on the I2C bus (
/sys/bus/i2c/devices/) but remain non-functional without the proper driver module.
References
- ACPI specification: PNP0C50 = HID over I2C Device
- Linux kernel:
drivers/hid/i2c-hid/ - ELAN touchpad/touchscreen drivers: Built into i2c-hid-acpi module
Status
Current: ✅ WORKING - Both touchpad and touchscreen fully functional!
Verified:
- Touchpad cursor movement and multi-finger gestures working
- Touchscreen touch and multitouch input working
- Modules load automatically (i2c-hid-acpi)
- CONFIG_PINCTRL_AMD=y enabled and functional
Last Updated: 2025-11-05 (Verified working after manual kernel compilation)