diff --git a/Kernel/Arch/x86_64/ISABus/I8042Controller.cpp b/Kernel/Arch/x86_64/ISABus/I8042Controller.cpp index 3b80df2cb1d..e593c19b870 100644 --- a/Kernel/Arch/x86_64/ISABus/I8042Controller.cpp +++ b/Kernel/Arch/x86_64/ISABus/I8042Controller.cpp @@ -19,15 +19,6 @@ UNMAP_AFTER_INIT NonnullLockRefPtr I8042Controller::initialize( return adopt_lock_ref(*new I8042Controller()); } -LockRefPtr I8042Controller::mouse() const -{ - return m_mouse_device; -} -LockRefPtr I8042Controller::keyboard() const -{ - return m_keyboard_device; -} - UNMAP_AFTER_INIT I8042Controller::I8042Controller() { } diff --git a/Kernel/Arch/x86_64/ISABus/I8042Controller.h b/Kernel/Arch/x86_64/ISABus/I8042Controller.h index c73997150b1..6ef1015208d 100644 --- a/Kernel/Arch/x86_64/ISABus/I8042Controller.h +++ b/Kernel/Arch/x86_64/ISABus/I8042Controller.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include #include @@ -84,7 +85,7 @@ protected: class PS2KeyboardDevice; class PS2MouseDevice; class HIDManagement; -class I8042Controller final : public AtomicRefCounted { +class I8042Controller final : public HIDController { friend class PS2KeyboardDevice; friend class PS2MouseDevice; @@ -133,9 +134,6 @@ public: bool irq_process_input_buffer(HIDDevice::Type); - LockRefPtr mouse() const; - LockRefPtr keyboard() const; - // Note: This function exists only for the initialization process of the controller bool check_existence_via_probing(Badge); diff --git a/Kernel/Devices/HID/Controller.h b/Kernel/Devices/HID/Controller.h new file mode 100644 index 00000000000..1d8868297c2 --- /dev/null +++ b/Kernel/Devices/HID/Controller.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Kernel { + +class HIDManagement; +class HIDController : public AtomicRefCounted { + friend class HIDManagement; + +public: + virtual ~HIDController() = default; + +protected: + HIDController() = default; + +private: + IntrusiveListNode> m_list_node; +}; + +} diff --git a/Kernel/Devices/HID/Management.cpp b/Kernel/Devices/HID/Management.cpp index 8338b6cf86c..9c7be9ca5d6 100644 --- a/Kernel/Devices/HID/Management.cpp +++ b/Kernel/Devices/HID/Management.cpp @@ -152,13 +152,11 @@ UNMAP_AFTER_INIT ErrorOr HIDManagement::enumerate() // Note: If we happen to not have i8042 just return "gracefully" for now. if (!has_i8042_controller) return {}; - m_i8042_controller = i8042_controller; - TRY(m_i8042_controller->detect_devices()); - if (m_i8042_controller->mouse()) - m_hid_devices.append(m_i8042_controller->mouse().release_nonnull()); - - if (m_i8042_controller->keyboard()) - m_hid_devices.append(m_i8042_controller->keyboard().release_nonnull()); + if (auto result_or_error = i8042_controller->detect_devices(); result_or_error.is_error()) + return {}; + m_hid_controllers.with([&](auto& list) { + list.append(i8042_controller); + }); #endif return {}; } diff --git a/Kernel/Devices/HID/Management.h b/Kernel/Devices/HID/Management.h index c1acb1f6be9..d55eb0d7242 100644 --- a/Kernel/Devices/HID/Management.h +++ b/Kernel/Devices/HID/Management.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -61,11 +62,9 @@ private: size_t m_mouse_minor_number { 0 }; size_t m_keyboard_minor_number { 0 }; KeyboardClient* m_client { nullptr }; -#if ARCH(X86_64) - LockRefPtr m_i8042_controller; -#endif - Vector> m_hid_devices; - Spinlock m_client_lock {}; + + SpinlockProtected, LockRank::None> m_hid_controllers; + Spinlock m_client_lock; }; class KeyboardClient {