How to Fix Touchpad Not Working on Fedora

Your touchpad is likely disabled in the kernel, blocked by the firewall or SELinux, or missing the correct driver configuration.

Your touchpad stopped working after an upgrade or sleep cycle

You upgraded from Fedora 40 to 41, or your laptop woke from sleep, and the touchpad is dead. The cursor won't move. You can't click. You're stuck with an external mouse or keyboard shortcuts to navigate. This happens more often than you think, usually because the kernel module didn't load, libinput got confused, or a BIOS setting flipped during a firmware update. A botched driver state can leave you unable to use the system comfortably. Run these checks from a terminal to restore input.

What is actually happening

The touchpad stack has three layers. The kernel talks to the hardware via a driver module like psmouse or i2c-hid. The userspace driver, libinput, translates raw hardware events into cursor movements and clicks. The desktop environment or window manager listens to libinput and moves the pointer on screen.

If the kernel module is missing, the hardware is invisible. If libinput is disabled, the hardware is visible but ignored. If the desktop environment has a toggle turned off, the input is blocked at the top. Most touchpad failures happen at the kernel module level or the libinput configuration level. SELinux and firewalls rarely block local input devices. Focus on the driver stack first.

Check detection and enable the device

Start by checking if the kernel sees the device. Run libinput list-devices to see what the userspace driver knows about.

libinput list-devices | grep -A 15 "Touchpad"
# WHY: Lists all input devices recognized by libinput.
# WHY: grep filters the output to show only the touchpad section and 15 lines after.
# WHY: This confirms if the device is detected and whether libinput has marked it as disabled.

If the output shows the touchpad but includes Disabled: yes, the device is detected but turned off in software. Re-enable it with xinput. First, get the exact device name.

xinput list | grep -i touchpad
# WHY: Finds the exact device name and ID number for your touchpad.
# WHY: xinput list shows all input devices in a flat hierarchy.
# WHY: grep filters for touchpad to isolate the relevant line.

Use the name from that output to enable the device.

xinput enable "SynPS/2 Synaptics TouchPad"
# WHY: Replaces the name with your actual device name from the previous output.
# WHY: xinput enable flips the software toggle back to active immediately.
# WHY: This change persists only until the next reboot or session restart.

Test the cursor now. If it moves, the issue was a software toggle. If the touchpad doesn't appear in libinput list-devices at all, the kernel module is likely missing.

Load the kernel module

Fedora loads modules automatically, but auto-detection fails on newer hardware or after a kernel update. Check for the psmouse module, which handles most PS/2 touchpads.

lsmod | grep psmouse
# WHY: Checks if the psmouse kernel module is currently loaded in memory.
# WHY: lsmod lists all loaded kernel modules.
# WHY: grep filters for psmouse to see if the driver is active.

If nothing shows up, load the module manually.

sudo modprobe psmouse
# WHY: Loads the psmouse module into the running kernel immediately.
# WHY: sudo grants the root privileges required to modify kernel state.
# WHY: modprobe handles dependencies automatically so you don't need to load helper modules.

Test the touchpad. If it works, make the change permanent. Fedora uses modules-load.d to load modules at boot. Create a configuration file in /etc/. Never edit files in /usr/lib/ as those ship with packages and get overwritten.

echo "psmouse" | sudo tee /etc/modules-load.d/touchpad.conf
# WHY: Creates a config file that tells systemd to load psmouse at boot.
# WHY: /etc/modules-load.d/ is the correct location for user-added module configs.
# WHY: tee writes the content to the file while preserving root ownership.

Handle I2C HID touchpads

Modern laptops often use I2C HID touchpads instead of PS/2. If psmouse didn't help, check i2c_hid.

lsmod | grep i2c_hid
# WHY: Checks for the I2C HID driver used by many modern touchpads.
# WHY: I2C devices communicate over a different bus than legacy PS/2 ports.
# WHY: Some touchpads require i2c_hid_acpi as well.

Load the module if it's missing. Some devices also need the ACPI helper.

sudo modprobe i2c_hid
sudo modprobe i2c_hid_acpi
# WHY: Loads the I2C HID driver and its ACPI companion module.
# WHY: i2c_hid_acpi bridges the ACPI firmware interface to the HID driver.
# WHY: Both modules may be required for the device to enumerate correctly.

Add both to the boot config if this fixes the issue.

printf "i2c_hid\ni2c_hid_acpi\n" | sudo tee /etc/modules-load.d/touchpad.conf
# WHY: Writes multiple module names to the config file.
# WHY: printf ensures each module is on a separate line.
# WHY: systemd reads each line as a module to load at boot.

Debug raw events

If the touchpad is enabled but behaves erratically, use libinput debug-events to see raw events. This tool prints every motion and click as it happens.

sudo libinput debug-events
# WHY: Runs libinput in debug mode to print raw input events.
# WHY: sudo is required to access the raw input devices directly.
# WHY: This helps distinguish between hardware noise and driver bugs.

Move the touchpad. If you see motion events, the driver is working. If you see nothing, the kernel isn't sending events. If you see events but the cursor doesn't move, the desktop environment is filtering them. This isolates the problem layer. Press Ctrl+C to stop the debug output.

Update the system

Before diving into manual fixes, ensure your system is current. Fedora updates kernel drivers frequently. Run dnf upgrade --refresh to force a metadata refresh and pull the latest packages. This command is the standard weekly maintenance routine. dnf system-upgrade is for crossing major releases. Don't conflate them.

sudo dnf upgrade --refresh
# WHY: Updates all packages and refreshes repository metadata.
# WHY: --refresh forces dnf to download new metadata even if cached.
# WHY: This ensures you have the latest kernel modules and libinput versions.

Reboot after a major kernel update. The new kernel must be running for new modules to take effect.

Verify the fix

Run libinput list-devices again. The touchpad should appear without Disabled: yes. Move the cursor. Click. If the cursor moves, the fix is solid.

libinput list-devices | grep -A 5 "Touchpad"
# WHY: Confirms the device is listed and enabled.
# WHY: A successful check shows Enabled: yes and no error flags.
# WHY: This validates the fix before you reboot or close the terminal.

Reboot before you declare victory. A module loaded manually won't survive a restart unless you added the config file.

Common pitfalls

Check BIOS/UEFI settings. Some laptops have a function key combo like Fn+F9 that disables the touchpad. Fedora respects this hardware toggle. Check the BIOS if the device is completely missing from libinput and lsmod.

SELinux denials are rare for touchpads. If you see avc: denied in the logs, don't disable SELinux. Check journalctl -t setroubleshoot. It provides a one-line summary of the denial. If a custom application is trying to access the device directly, you might need a policy adjustment. Most users never hit this.

Avoid evdev configuration files. Fedora dropped evdev support for touchpads years ago. libinput is the only supported driver. Creating an xorg.conf file for evdev will likely break input entirely or be ignored. Stick to libinput. If libinput is broken, file a bug report against libinput or the kernel. Don't regress to evdev.

Trust the package manager. Manual file edits drift, snapshots stay. If you edit X11 configs, you are fighting the upstream design.

Decision matrix

Use xinput enable when the device is detected but software-disabled. Use modprobe when the kernel module failed to load automatically. Use /etc/modules-load.d/ when you need the module to load at boot after a manual fix. Use journalctl -k when the module loads but the device is unresponsive. Use BIOS settings when the hardware is completely invisible to the OS. Stay on libinput for all modern Fedora systems. Avoid evdev configuration files as they are deprecated and unsupported.

Where to go next