Skip to content

MacBook8,1: built-in keyboard/trackpad not working (applespi timeouts) #1954

Description

@jpumfrey

System details

MacBook8,1 MacBook (Retina, 12-inch, Early 2015), Omarchy 3.0

What's wrong?

Let me preface by saying that I'm really glad to see this issue getting a fresh set of eyes. I’ve struggled to get Arch running on this MacBook for years, and support has gradually regressed over time. It's great that you’re taking the time to support these older MacBooks as it helps breathe new life into them and keep them useful.

On a MacBook8,1 (Retina 12", Early 2015) running Omarchy 3.0 with Arch kernel 6.16.8-arch3-1, the built-in keyboard and trackpad fail to function with applespi despite macbook12-spi-driver-dkms being successfully built and installed (rebuilt with limine). The SPI controller initialises correctly and the ACPI child device (APP000D) appears, but the applespi probe consistently times out with -110 errors and never creates an input device node. Crucially, the controller’s assigned IRQ (21) never increments during operation.

Full report & logs

Full report & logs

System details

Mac model and year:
MacBook (Retina, 12-inch, Early 2015)

Identifier:
MacBook8,1

Graphics:
Intel HD Graphics 5300

Omarchy version:
Omarchy 3.0 on Arch Linux kernel 6.16.8-arch3-1

The issue

Built-in keyboard and trackpad do not work.
spi-APP000D:00 exists and applespi does try to bind.
Probe dies with -110 timeouts.
IRQ 21 never increments (stays 0 0 0 0).
Kernel logs show repeated SPI timeouts. Device enumerates as Apple SPI Keyboard, but all transfers fail.

What works / baseline

PCI GSPI controller is present and bound:

00:15.4 Serial IO GSPI Controller #1 (rev 03)
Kernel driver in use: pxa2xx_spi_pci
Interrupt: pin C routed to IRQ 21
Power: D0 (runtime_status=active)

ACPI child device exists and is probed:

/sys/bus/spi/devices/spi-APP000D:00
modalias: acpi:APP000D:APPLE-SPI-TOPCASE:

What fails

  • applespi logs repeated timeouts and aborts probe:
applespi spi-APP000D:00: SPI transfer timed out
applespi spi-APP000D:00: Error reading from device: -110
...
applespi spi-APP000D:00: Timed out waiting for device info
applespi spi-APP000D:00: probe with driver applespi failed with error -110

  • No event node appears for the built-ins, so evtest never lists an Apple SPI device.
  • While the above errors spam the log, IRQ 21 stays at zero:
$ grep -i '00:15\.4' /proc/interrupts
 21:          0          0          0          0 IR-IO-APIC  21-fasteoi   0000:00:15.4

Fixes tried

  • Located the community applespi patch for MacBook8,1 and applied it manually.
  • Installed the matching kernel headers and set up a DKMS build.
  • Module builds succeed cleanly and load without error.
  • Despite this, the driver fails at runtime with -110 timeouts; no input device node is created, and IRQ 21 remains at zero.

Additionally:

  1. Verified intel_lpss, intel_lpss_pci, spi_pxa2xx_pci, spi_pxa2xx_platform, applespi all present.
  2. Forced into initramfs (/etc/mkinitcpio.conf.d/macbook_spi_modules.conf):
MODULES=(intel_lpss intel_lpss_pci spi_pxa2xx_pci spi_pxa2xx_platform applespi)
  1. Ensured early keyboard hooks (/etc/mkinitcpio.conf.d/omarchy_hooks.conf):
HOOKS=(base udev keyboard keymap autodetect microcode modconf kms block encrypt filesystems fsck)
  1. Forced GSPI controller power on:
ACTION=="add", SUBSYSTEM=="pci", KERNELS=="0000:00:15.4", ATTR{power/control}="on"
  1. Confirmed driver binds (/proc/bus/input/devices shows Apple SPI Keyboard).

  2. Booted with irqpoll and irqfixup with no change.

  3. Also tried booting with pcie_aspm=off, acpi_osi=!Darwin and pci=nomsi

  4. Tested older kernels:

  • 6.6.10: Non-UKI boots, still timeouts. UKI fails build (“section would write outside of memory”).
  • 5.15.x LTS: Same UKI error; non-UKI boots, still timeouts.

More diagnostics

  1. Confirm applespi is loaded and bound
~ ✗ lsmod | grep -E 'applespi|spi_pxa2'
spi_pxa2xx_platform    12288  0
applespi               61440  0
spi_pxa2xx_pci         16384  0
spi_pxa2xx_core        36864  2 spi_pxa2xx_pci,spi_pxa2xx_platform
~ ✗ modinfo applespi
filename:       /lib/modules/6.16.8-arch3-1/updates/dkms/applespi.ko.zst
author:         Ronald Tschalär
author:         Federico Lorenzi
description:    MacBook(Pro) SPI Keyboard/Touchpad driver
license:        GPL v2
srcversion:     EFF703274319E0B6D074ACA
alias:          acpi*:APP000D:*
depends:        
name:           applespi
retpoline:      Y
vermagic:       6.16.8-arch3-1 SMP preempt mod_unload 
sig_id:         PKCS#7
signer:         DKMS module signing key
sig_key:        12:E0:6F:B5:20:DD:38:55:0B:A3:15:B4:C8:46:68:80:14:9C:EE:60
sig_hashalgo:   sha512
signature:      27:42:02:FF:B4:97:4B:F2:BD:5A:DC:7C:2E:CF:B3:66:58:D7:C0:8F:
                EC:18:B0:2C:D7:62:2E:5F:F9:35:D8:19:07:14:0F:2D:4F:55:F9:1B:
                C5:7D:69:60:59:50:9A:12:7E:AA:D0:87:54:C1:5D:70:58:42:17:6F:
                7B:43:7F:3F:9A:E6:BA:82:DF:77:63:83:B4:BF:F4:D9:31:79:89:06:
                E8:92:73:29:AA:D4:DF:EA:A0:8E:7D:EE:C6:49:BC:0C:FE:8B:50:BA:
                4E:77:26:F2:1B:5E:9F:1F:1F:34:0A:18:77:9F:0F:1F:56:62:55:3C:
                F7:3F:05:A9:C8:D8:C6:9B:F9:C6:77:13:F5:B7:70:56:B4:E1:8B:79:
                98:B8:2A:8B:EA:E8:11:4F:23:E9:E4:6D:83:D9:5A:42:D8:6E:B3:E2:
                86:92:8E:79:88:5B:A2:A6:46:B4:8A:FB:5C:6E:0B:0E:A0:BB:6F:7C:
                CC:DC:CB:63:5D:2D:39:70:23:DD:B7:96:E8:78:9D:69:76:D8:16:5B:
                A0:DC:FC:D0:A7:91:3B:19:F1:B9:D7:D9:ED:4B:20:4B:83:5A:DB:03:
                91:46:32:76:69:F1:3C:A7:7B:A2:CE:78:56:85:02:D0:4E:6B:37:98:
                0A:E1:2E:44:2E:B6:9C:03:95:FB:64:D9:B3:DB:3E:BF
parm:           fnmode:Mode of Fn key on Apple keyboards (0 = disabled, [1] = fkeyslast, 2 = fkeysfirst) (uint)
parm:           fnremap:Remap Fn key ([0] = no-remap; 1 = left-ctrl, 2 = left-shift, 3 = left-alt, 4 = left-meta, 6 = right-shift, 7 = right-alt, 8 = right-meta) (uint)
parm:           iso_layout:Enable/Disable hardcoded ISO-layout of the keyboard. ([0] = disabled, 1 = enabled) (bool)
parm:           touchpad_dimensions:The pixel dimensions of the touchpad, as XxY+W+H . (string)
parm:           trace_event:Enable early event tracing. It takes the form of a comma-separated list of events to enable. (charp)
  1. Device tree / PCI details
~ ✗ lspci -nnk | grep -A3 -i spi
00:15.4 Serial bus controller [0c80]: Intel Corporation Wildcat Point-LP Serial IO GSPI Controller #1 [8086:9ce6] (rev 03)
        Subsystem: Intel Corporation Wildcat Point-LP Serial IO GSPI Controller #1 [8086:9ce6]
        Kernel driver in use: pxa2xx_spi_pci
        Kernel modules: spi_pxa2xx_pci
00:15.5 Serial controller [0700]: Intel Corporation Wildcat Point-LP Serial IO UART Controller #0 [8086:9ce3] (rev 03)
        Subsystem: Intel Corporation Wildcat Point-LP Serial IO UART Controller #0 [8086:9ce3]
        Kernel driver in use: 8250_lpss

~ ❯ 
~ ✗ sudo dmesg | grep -i -E 'spi|applespi|apple-ib'
[    1.163073] applespi: loading out-of-tree module taints kernel.
[    1.163082] applespi: module verification failed: signature and/or required key missing - tainting kernel
[    1.219180] input: Apple SPI Keyboard as /devices/pci0000:00/0000:00:15.4/spi_master/spi1/spi-APP000D:00/input/input4
[    1.435051] applespi spi-APP000D:00: SPI transfer timed out
[    1.435257] applespi spi-APP000D:00: Error writing to device: -110
[    1.435272] spi_master spi1: failed to transfer one message from queue
[    1.643045] applespi spi-APP000D:00: SPI transfer timed out
[    1.643159] applespi spi-APP000D:00: Error reading from device: -110
[    1.643177] spi_master spi1: failed to transfer one message from queue
[    1.851056] applespi spi-APP000D:00: SPI transfer timed out
[    1.851254] applespi spi-APP000D:00: Error writing to device: -110
[    1.851263] spi_master spi1: failed to transfer one message from queue
[    2.058967] applespi spi-APP000D:00: SPI transfer timed out
[    2.059063] applespi spi-APP000D:00: Error reading from device: -110
[    2.059079] spi_master spi1: failed to transfer one message from queue
[    2.267045] applespi spi-APP000D:00: SPI transfer timed out
[    2.267141] applespi spi-APP000D:00: Error reading from device: -110
[    2.267159] spi_master spi1: failed to transfer one message from queue
[    2.474951] applespi spi-APP000D:00: SPI transfer timed out
[    2.475044] applespi spi-APP000D:00: Error reading from device: -110
[    2.475060] spi_master spi1: failed to transfer one message from queue
[    2.683010] applespi spi-APP000D:00: SPI transfer timed out
[    2.683106] applespi spi-APP000D:00: Error reading from device: -110
[    2.683123] spi_master spi1: failed to transfer one message from queue
[    2.891030] applespi spi-APP000D:00: SPI transfer timed out
[    2.891129] applespi spi-APP000D:00: Error reading from device: -110
[    2.891147] spi_master spi1: failed to transfer one message from queue
[    3.099033] applespi spi-APP000D:00: SPI transfer timed out
[    3.099148] applespi spi-APP000D:00: Error reading from device: -110
[    3.099164] spi_master spi1: failed to transfer one message from queue
[    3.307032] applespi spi-APP000D:00: SPI transfer timed out
[    3.307145] applespi spi-APP000D:00: Error reading from device: -110
[    3.307163] spi_master spi1: failed to transfer one message from queue
[    3.515008] applespi spi-APP000D:00: SPI transfer timed out
[    3.515106] applespi spi-APP000D:00: Error reading from device: -110
[    3.515122] spi_master spi1: failed to transfer one message from queue
[    3.723008] applespi spi-APP000D:00: SPI transfer timed out
[    3.723102] applespi spi-APP000D:00: Error reading from device: -110
[    3.723119] spi_master spi1: failed to transfer one message from queue
[    3.931006] applespi spi-APP000D:00: SPI transfer timed out
[    3.931099] applespi spi-APP000D:00: Error reading from device: -110
[    3.931115] spi_master spi1: failed to transfer one message from queue
[    4.138935] applespi spi-APP000D:00: SPI transfer timed out
[    4.139028] applespi spi-APP000D:00: Error reading from device: -110
[    4.139044] spi_master spi1: failed to transfer one message from queue
[    4.243015] applespi spi-APP000D:00: Timed out waiting for device info
[    4.347019] applespi spi-APP000D:00: SPI transfer timed out
[    4.347118] applespi spi-APP000D:00: Error reading from device: -110
[    4.347137] spi_master spi1: failed to transfer one message from queue
[    4.347455] applespi spi-APP000D:00: probe with driver applespi failed with error -110
[   16.595572] spi-nor spi0.0: supply vcc not found, using dummy regulator
[   16.603920] Creating 1 MTD partitions on "intel-spi":
  1. Udev attributes for the GSPI device
~ ✗ udevadm info -a -p /sys/bus/pci/devices/0000:00:15.4

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:15.4':
    KERNEL=="0000:00:15.4"
    SUBSYSTEM=="pci"
    DRIVER=="pxa2xx_spi_pci"
    ATTR{ari_enabled}=="0"
    ATTR{broken_parity_status}=="0"
    ATTR{class}=="0x0c8000"
    ATTR{consistent_dma_mask_bits}=="32"
    ATTR{d3cold_allowed}=="1"
    ATTR{device}=="0x9ce6"
    ATTR{dma_mask_bits}=="32"
    ATTR{driver_override}=="(null)"
    ATTR{enable}=="1"
    ATTR{irq}=="21"
    ATTR{local_cpulist}=="0-3"
    ATTR{local_cpus}=="f"
    ATTR{msi_bus}=="1"
    ATTR{numa_node}=="-1"
    ATTR{power/autosuspend_delay_ms}=="50"
    ATTR{power/control}=="on"
    ATTR{power/runtime_active_time}=="1864721"
    ATTR{power/runtime_status}=="active"
    ATTR{power/runtime_suspended_time}=="0"
    ATTR{power_state}=="D0"
    ATTR{remove}=="(not readable)"
    ATTR{rescan}=="(not readable)"
    ATTR{resource0}=="(not readable)"
    ATTR{revision}=="0x03"
    ATTR{subsystem_device}=="0x9ce6"
    ATTR{subsystem_vendor}=="0x8086"
    ATTR{vendor}=="0x8086"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""
    ATTRS{power/control}=="auto"
    ATTRS{power/runtime_active_time}=="0"
    ATTRS{power/runtime_status}=="unsupported"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{waiting_for_supplier}=="0"
  1. IRQ mapping
~ ✗ cat /proc/interrupts | grep -i spi
sudo dmesg | grep -i irq
[    0.000000] Command line: quiet splash cryptdevice=PARTUUID=914e32d6-2f9c-4360-9de6-b6ee2d9cb1ec:root root=/dev/mapper/root zswap.enabled=0 rootflags=subvol=@ rw rootfstype=btrfs irqpoll
[    0.073851] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
[    0.073857] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
[    0.098745] Kernel command line: quiet splash cryptdevice=PARTUUID=914e32d6-2f9c-4360-9de6-b6ee2d9cb1ec:root root=/dev/mapper/root zswap.enabled=0 rootflags=subvol=@ rw rootfstype=btrfs irqpoll
[    0.099051] Misrouted IRQ fixup and polling support enabled
[    0.240050] NR_IRQS: 524544, nr_irqs: 728, preallocated irqs: 16
[    0.242617] DMAR-IR: Enabled IRQ remapping in xapic mode
[    0.242622] x2apic: IRQ remapping doesn't support X2APIC mode
[    0.379132] ACPI: PCI: Interrupt link LNKA configured for IRQ 0
[    0.379284] ACPI: PCI: Interrupt link LNKB configured for IRQ 0
[    0.379437] ACPI: PCI: Interrupt link LNKC configured for IRQ 0
[    0.379578] ACPI: PCI: Interrupt link LNKD configured for IRQ 0
[    0.379718] ACPI: PCI: Interrupt link LNKE configured for IRQ 0
[    0.379858] ACPI: PCI: Interrupt link LNKF configured for IRQ 0
[    0.379998] ACPI: PCI: Interrupt link LNKG configured for IRQ 0
[    0.380138] ACPI: PCI: Interrupt link LNKH configured for IRQ 0
[    0.387013] PCI: Using ACPI for IRQ routing
[    0.594205] Serial: 8250/16550 driver, 32 ports, IRQ sharing enabled
[    0.600907] hpet_acpi_add: no address or irqs in _CRS
[   16.072586] 0000:00:15.5: ttyS4 at MMIO 0xc1819000 (irq = 21, base_baud = 2764800) is a 16550A

~ ❯ 

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions