From 44f5f72addf038236d99d235308697bdebd504f6 Mon Sep 17 00:00:00 2001 From: Liav A Date: Thu, 16 Sep 2021 22:24:55 +0300 Subject: [PATCH] Kernel/Devices: Use try_create_device helper for SB16 --- Kernel/Devices/DeviceManagement.cpp | 4 ++++ Kernel/Devices/DeviceManagement.h | 6 ++++++ Kernel/Devices/SB16.cpp | 24 +++++++----------------- Kernel/Devices/SB16.h | 9 +++++---- Kernel/init.cpp | 5 ++++- 5 files changed, 26 insertions(+), 22 deletions(-) diff --git a/Kernel/Devices/DeviceManagement.cpp b/Kernel/Devices/DeviceManagement.cpp index 41d8d73e21..7b1b409790 100644 --- a/Kernel/Devices/DeviceManagement.cpp +++ b/Kernel/Devices/DeviceManagement.cpp @@ -22,6 +22,10 @@ UNMAP_AFTER_INIT void DeviceManagement::initialize() s_the.ensure_instance(); } +UNMAP_AFTER_INIT void DeviceManagement::attach_sb16_device(SB16 const& device) +{ + m_sb16_device = device; +} UNMAP_AFTER_INIT void DeviceManagement::attach_console_device(ConsoleDevice const& device) { diff --git a/Kernel/Devices/DeviceManagement.h b/Kernel/Devices/DeviceManagement.h index 1cb4553a0d..e61cebf6a5 100644 --- a/Kernel/Devices/DeviceManagement.h +++ b/Kernel/Devices/DeviceManagement.h @@ -18,6 +18,7 @@ #include #include #include +#include #include namespace Kernel { @@ -34,6 +35,9 @@ public: bool is_console_device_attached() const { return !m_console_device.is_null(); } void attach_console_device(ConsoleDevice const&); + // FIXME: Once we have a singleton for managing many sound cards, remove this from here + void attach_sb16_device(SB16 const&); + void after_inserting_device(Badge, Device&); void before_device_removal(Badge, Device&); @@ -57,6 +61,8 @@ public: private: RefPtr m_null_device; RefPtr m_console_device; + // FIXME: Once we have a singleton for managing many sound cards, remove this from here + RefPtr m_sb16_device; MutexProtected> m_devices; }; diff --git a/Kernel/Devices/SB16.cpp b/Kernel/Devices/SB16.cpp index 219d77f7bb..9840ab1c12 100644 --- a/Kernel/Devices/SB16.cpp +++ b/Kernel/Devices/SB16.cpp @@ -5,10 +5,10 @@ */ #include -#include #include #include #include +#include #include #include #include @@ -60,8 +60,6 @@ void SB16::set_sample_rate(uint16_t hz) dsp_write((u8)hz); } -static Singleton s_the; - UNMAP_AFTER_INIT SB16::SB16() : IRQHandler(SB16_DEFAULT_IRQ) // FIXME: We can't change version numbers later, i.e. after the sound card is initialized. @@ -74,7 +72,7 @@ UNMAP_AFTER_INIT SB16::~SB16() { } -UNMAP_AFTER_INIT void SB16::detect() +UNMAP_AFTER_INIT RefPtr SB16::try_detect_and_create() { IO::out8(0x226, 1); IO::delay(32); @@ -82,19 +80,11 @@ UNMAP_AFTER_INIT void SB16::detect() auto data = dsp_read(); if (data != 0xaa) - return; - SB16::create(); -} - -UNMAP_AFTER_INIT void SB16::create() -{ - s_the.ensure_instance(); - s_the->after_inserting(); -} - -SB16& SB16::the() -{ - return *s_the; + return {}; + auto device_or_error = DeviceManagement::try_create_device(); + if (device_or_error.is_error()) + return {}; + return device_or_error.release_value(); } UNMAP_AFTER_INIT void SB16::initialize() diff --git a/Kernel/Devices/SB16.h b/Kernel/Devices/SB16.h index 32a90b9928..443878eaae 100644 --- a/Kernel/Devices/SB16.h +++ b/Kernel/Devices/SB16.h @@ -18,13 +18,12 @@ class SB16; class SB16 final : public IRQHandler , public CharacterDevice { + friend class DeviceManagement; + public: - SB16(); virtual ~SB16() override; - static void detect(); - static void create(); - static SB16& the(); + static RefPtr try_detect_and_create(); // ^CharacterDevice virtual bool can_read(const OpenFileDescription&, size_t) const override; @@ -37,6 +36,8 @@ public: virtual KResult ioctl(OpenFileDescription&, unsigned, Userspace) override; private: + SB16(); + // ^IRQHandler virtual bool handle_irq(const RegisterState&) override; diff --git a/Kernel/init.cpp b/Kernel/init.cpp index 9961547af8..1ea58ec7d2 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -317,7 +317,10 @@ void init_stage2(void*) (void)FullDevice::must_create().leak_ref(); (void)RandomDevice::must_create().leak_ref(); PTYMultiplexer::initialize(); - SB16::detect(); + + // FIXME: Once we have a singleton for managing many sound cards, remove this from here + if (auto device = SB16::try_detect_and_create(); !!device) + DeviceManagement::the().attach_sb16_device(*device); StorageManagement::the().initialize(kernel_command_line().root_device(), kernel_command_line().is_force_pio()); if (VirtualFileSystem::the().mount_root(StorageManagement::the().root_filesystem()).is_error()) {