Linux CachyOS on a 7″ Mini Laptop: Fixing Touchscreen After Suspend and Screen Rotation

Applies to: Arch Linux, CachyOS, and other Linux distributions
Hardware: Generic 7″ mini laptops with Intel Celeron J4115 (and similar), Goodix GT911 touchscreen
Symptoms:

  • Touchscreen stops responding after waking from suspend
  • Screen is rotated 90° in the wrong direction at boot and on the login screen

Background

Cheap Chinese mini laptops — sold under various brand names (Alaaner, BINTEC, and others) — are increasingly popular as ultra-portable Linux machines. They typically feature a 7-inch IPS touchscreen, Intel Celeron J4115, 12GB DDR4, and run Linux surprisingly well.

However, two persistent annoyances appear when running Linux on these devices:

  1. The touchscreen stops working after the system wakes from suspend.
  2. The display is physically rotated 90°, so the boot screen, login screen, and desktop all appear sideways by default.

This guide covers all three fixes: boot screen rotation (Limine menu + fbcon), login screen rotation, and the touchscreen suspend bug.


Part 1: Boot Screen Rotation (Limine)

CachyOS uses the Limine bootloader. Limine v10+ natively supports interface rotation via the interface_rotation option in limine.conf.

Step 1 — Add rotation to limine.conf

sudo nano /boot/limine.conf

Add the following line at the very top of the file, before any entries:

interface_rotation: 90

Valid values are 0, 90, 180, 270. On this hardware, 90 is correct. Reboot to verify before proceeding.

Note: /boot/limine.conf is regenerated on every kernel update by limine-update. The next step ensures the rotation setting survives updates automatically.

Step 2 — Make it permanent with a pacman hook

sudo mkdir -p /etc/pacman.d/hooks
sudo nano /etc/pacman.d/hooks/limine-rotation.hook

ini

[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = limine
Target = limine-mkinitcpio-hook
Target = linux-cachyos
Target = linux-cachyos-lts

[Action]
Description = Add interface_rotation to limine.conf
When = PostTransaction
Exec = /bin/sh -c 'grep -q "interface_rotation" /boot/limine.conf || sed -i "1s/^/interface_rotation: 90\n/" /boot/limine.conf'

This hook runs after any kernel or Limine update and adds the rotation line if it’s missing.

Step 3 — Rotate the fbcon boot text

The Limine menu is now rotated, but the Linux kernel’s framebuffer console (the text scrolling during boot) needs a separate parameter. Add it to /etc/default/limine:

sudo nano /etc/default/limine

Add:

KERNEL_CMDLINE[default]+="fbcon=rotate:1"

Then regenerate:

sudo limine-update

fbcon=rotate:1 = 90° clockwise. If text appears upside down, try rotate:3 instead.


Part 2: Login Screen Rotation (plasmalogin / KDE Plasma)

CachyOS with KDE Plasma uses plasmalogin as the display manager, running on Wayland. This means xrandr-based solutions won’t work. The correct approach is to copy KWin’s display configuration to the plasmalogin user.

Step 1 — Configure rotation in System Settings

Go to System Settings → Display and Monitor → Display Configuration, select your internal display (DSI-1), set the orientation to 90° Counter-Clockwise, and click Apply.

Alternatively, from the terminal:

kscreen-doctor output.DSI-1.rotation.right

Note: On this hardware, rotation.right (270°) is the correct value for the physical screen orientation. Try rotation.left if the screen ends up upside down.

Step 2 — Locate the KWin output config

KDE Plasma stores display configuration in:

cat ~/.config/kwinoutputconfig.json

You should see "transform": "Rotated270" for your DSI-1 entry.

Step 3 — Copy config to plasmalogin

sudo mkdir -p /var/lib/plasmalogin/.config
sudo cp ~/.config/kwinoutputconfig.json /var/lib/plasmalogin/.config/
sudo chown -R plasmalogin:plasmalogin /var/lib/plasmalogin/.config/

Step 4 — Restart plasmalogin

sudo systemctl restart plasmalogin

The login screen should now appear correctly rotated.

Note for SDDM users: If your system uses SDDM on X11 instead of plasmalogin, try create /etc/sddm.conf.d/display.conf pointing to an Xsetup script that calls xrandr --output DSI-1 --rotate left. The plasmalogin/kwinoutputconfig approach above is specific to Wayland-based display managers.


Part 3: Touchscreen Stops Working After Suspend (Goodix GT911)

Diagnosis

Confirm you have a Goodix touchscreen:

sudo dmesg | grep -i "touch\|goodix"

You should see something like:

[  10.833142] Goodix-TS i2c-GDIX1002:00: ID 911, version: 1060
[  10.838322] input: Goodix Capacitive TouchScreen as /devices/...

Confirm the driver is built-in (not a loadable module):

sudo modprobe -r goodix
# Expected output: modprobe: FATAL: Module goodix not found.

Since the driver is compiled directly into the kernel, the usual modprobe -r / modprobe trick doesn’t work. Instead, we use the kernel’s sysfs bind/unbind interface.

Step 1 — Test manually

After waking from suspend, run:

echo "i2c-GDIX1002:00" | sudo tee /sys/bus/i2c/drivers/Goodix-TS/unbind
echo "i2c-GDIX1002:00" | sudo tee /sys/bus/i2c/drivers/Goodix-TS/bind

If the touchscreen starts responding again, proceed to step 2.

Step 2 — Create a systemd service

sudo nano /etc/systemd/system/touchscreen-resume.service

ini

[Unit]
Description=Reload Goodix touchscreen after resume
After=suspend.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo "i2c-GDIX1002:00" > /sys/bus/i2c/drivers/Goodix-TS/unbind && echo "i2c-GDIX1002:00" > /sys/bus/i2c/drivers/Goodix-TS/bind'

[Install]
WantedBy=suspend.target

Step 3 — Enable the service

sudo systemctl daemon-reload
sudo systemctl enable touchscreen-resume.service

Step 4 — Test

Suspend your machine, wake it up, and verify the touchscreen works. You can also check the service ran correctly:

systemctl status touchscreen-resume.service

Why This Works

The unbind command tells the kernel to detach the Goodix driver from the I2C device. The bind command re-attaches it, triggering a full driver re-initialization — effectively resetting the touchscreen controller. This achieves the same result as modprobe -r / modprobe, but via the sysfs interface since the driver is built-in.


Notes

  • The device path i2c-GDIX1002:00 may differ on your hardware. Check yours with:
    ls /sys/bus/i2c/drivers/Goodix-TS/
  • Tested on CachyOS with kernel 6.19.6-1-cachyos and 6.18.16-1-cachyos-lts, KDE Plasma on Wayland, Limine bootloader v10+
  • For hibernate support, add hibernate.target to WantedBy in the systemd service
  • The fbcon=rotate parameter affects only the Linux framebuffer console. Once the graphical session starts, rotation is handled by KWin via kwinoutputconfig.json
  • The interface_rotation option in limine.conf requires Limine v10 or newer