1*225c3081SDmitry Torokhov/// Detect HID drivers that initialize force-feedback after hid_hw_start() 2*225c3081SDmitry Torokhov/// when HID_CONNECT_HIDINPUT is used. This is a lifecycle violation as 3*225c3081SDmitry Torokhov/// the input device is already registered. 4*225c3081SDmitry Torokhov// 5*225c3081SDmitry Torokhov// Confidence: High 6*225c3081SDmitry Torokhov// Copyright: (C) 2026 Gemini. GPLv2. 7*225c3081SDmitry Torokhov 8*225c3081SDmitry Torokhovvirtual report 9*225c3081SDmitry Torokhov 10*225c3081SDmitry Torokhov@r@ 11*225c3081SDmitry Torokhovidentifier probe_fn; 12*225c3081SDmitry Torokhovexpression hdev, flags; 13*225c3081SDmitry Torokhovposition p1, p2; 14*225c3081SDmitry Torokhov@@ 15*225c3081SDmitry Torokhov 16*225c3081SDmitry Torokhovprobe_fn(struct hid_device *hdev, ...) { 17*225c3081SDmitry Torokhov <... 18*225c3081SDmitry Torokhov hid_hw_start@p1(hdev, flags) 19*225c3081SDmitry Torokhov ... 20*225c3081SDmitry Torokhov \(input_ff_create\|input_ff_create_memless\)@p2(...) 21*225c3081SDmitry Torokhov ...> 22*225c3081SDmitry Torokhov} 23*225c3081SDmitry Torokhov 24*225c3081SDmitry Torokhov@script:python depends on report@ 25*225c3081SDmitry Torokhovp1 << r.p1; 26*225c3081SDmitry Torokhovp2 << r.p2; 27*225c3081SDmitry Torokhovflags << r.flags; 28*225c3081SDmitry Torokhov@@ 29*225c3081SDmitry Torokhov 30*225c3081SDmitry Torokhov# Check if flags include HID_CONNECT_HIDINPUT (0x01) or HID_CONNECT_DEFAULT (0x0f) 31*225c3081SDmitry Torokhov# Note: HID_CONNECT_DEFAULT is 0x0f, HID_CONNECT_HIDINPUT is 0x01 32*225c3081SDmitry Torokhovif "HID_CONNECT_HIDINPUT" in flags or "HID_CONNECT_DEFAULT" in flags: 33*225c3081SDmitry Torokhov msg = "WARNING: force-feedback initialized after hid_hw_start() with HID_CONNECT_HIDINPUT. Input device is already registered at this point. Use .input_configured() instead." 34*225c3081SDmitry Torokhov coccilib.report.print_report(p2[0], msg) 35