From f516970d76bc79119b9bc5f8c08d873a4a5d289b Mon Sep 17 00:00:00 2001 From: berendi Date: Sun, 2 Feb 2025 10:52:30 +0100 Subject: [PATCH] Remove i2c_smbus_thread as mutex already prevents concurrent access --- i2c_smbus/i2c_smbus.cpp | 72 ++----------------------------------------------- i2c_smbus/i2c_smbus.h | 22 --------------- 2 files changed, 2 insertions(+), 92 deletions(-) diff --git a/i2c_smbus/i2c_smbus.cpp b/i2c_smbus/i2c_smbus.cpp index d6fbabbb..2d2c986f 100644 --- a/i2c_smbus/i2c_smbus.cpp +++ b/i2c_smbus/i2c_smbus.cpp @@ -21,25 +21,16 @@ i2c_smbus_interface::i2c_smbus_interface() { - i2c_smbus_start = false; - i2c_smbus_done = false; this->port_id = -1; this->pci_device = -1; this->pci_vendor = -1; this->pci_subsystem_device = -1; this->pci_subsystem_vendor = -1; this->bus_id = -1; - i2c_smbus_thread_running = true; - i2c_smbus_thread = new std::thread(&i2c_smbus_interface::i2c_smbus_thread_function, this); } i2c_smbus_interface::~i2c_smbus_interface() { - i2c_smbus_thread_running = false; - i2c_smbus_start = true; - i2c_smbus_start_cv.notify_all(); - i2c_smbus_thread->join(); - delete i2c_smbus_thread; } s32 i2c_smbus_interface::i2c_smbus_write_quick(u8 addr, u8 value) @@ -166,22 +157,7 @@ s32 i2c_smbus_interface::i2c_smbus_xfer_call(u8 addr, char read_write, u8 comman { i2c_smbus_xfer_mutex.lock(); - i2c_addr = addr; - i2c_read_write = read_write; - i2c_command = command; - i2c_size_smbus = size; - i2c_data_smbus = data; - smbus_xfer = true; - - std::unique_lock start_lock(i2c_smbus_start_mutex); - i2c_smbus_start = true; - i2c_smbus_start_cv.notify_all(); - start_lock.unlock(); - - std::unique_lock done_lock(i2c_smbus_done_mutex); - - i2c_smbus_done_cv.wait(done_lock, [this]{ return i2c_smbus_done.load(); }); - i2c_smbus_done = false; + s32 i2c_ret = i2c_smbus_xfer(addr, read_write, command, size, data); i2c_smbus_xfer_mutex.unlock(); @@ -192,21 +168,7 @@ s32 i2c_smbus_interface::i2c_xfer_call(u8 addr, char read_write, int* size, u8 * { i2c_smbus_xfer_mutex.lock(); - i2c_addr = addr; - i2c_read_write = read_write; - i2c_size = size; - i2c_data = data; - smbus_xfer = false; - - std::unique_lock start_lock(i2c_smbus_start_mutex); - i2c_smbus_start = true; - i2c_smbus_start_cv.notify_all(); - start_lock.unlock(); - - std::unique_lock done_lock(i2c_smbus_done_mutex); - - i2c_smbus_done_cv.wait(done_lock, [this]{ return i2c_smbus_done.load(); }); - i2c_smbus_done = false; + s32 i2c_ret = i2c_xfer(addr, read_write, size, data); i2c_smbus_xfer_mutex.unlock(); @@ -222,33 +184,3 @@ s32 i2c_smbus_interface::i2c_write_block(u8 addr, int size, u8 *data) { return i2c_xfer_call(addr, I2C_SMBUS_WRITE, &size, data); } - -void i2c_smbus_interface::i2c_smbus_thread_function() -{ - while(1) - { - std::unique_lock start_lock(i2c_smbus_start_mutex); - - i2c_smbus_start_cv.wait(start_lock, [this]{ return i2c_smbus_start.load(); }); - i2c_smbus_start = false; - - if (!i2c_smbus_thread_running.load()) - { - break; - } - - if(smbus_xfer) - { - i2c_ret = i2c_smbus_xfer(i2c_addr, i2c_read_write, i2c_command, i2c_size_smbus, i2c_data_smbus); - } - else - { - i2c_ret = i2c_xfer(i2c_addr, i2c_read_write, i2c_size, i2c_data); - } - - std::unique_lock done_lock(i2c_smbus_done_mutex); - i2c_smbus_done = true; - i2c_smbus_done_cv.notify_all(); - done_lock.unlock(); - } -} diff --git a/i2c_smbus/i2c_smbus.h b/i2c_smbus/i2c_smbus.h index 04f8fafd..82d5f4a9 100644 --- a/i2c_smbus/i2c_smbus.h +++ b/i2c_smbus/i2c_smbus.h @@ -89,8 +89,6 @@ public: i2c_smbus_interface(); virtual ~i2c_smbus_interface(); - void i2c_smbus_thread_function(); - //Functions derived from i2c-core.c s32 i2c_smbus_write_quick(u8 addr, u8 value); s32 i2c_smbus_read_byte(u8 addr); @@ -116,28 +114,8 @@ public: virtual s32 i2c_xfer(u8 addr, char read_write, int* size, u8* data) = 0; private: - std::thread * i2c_smbus_thread; - std::atomic i2c_smbus_thread_running; - - std::atomic i2c_smbus_start; - std::condition_variable i2c_smbus_start_cv; - std::mutex i2c_smbus_start_mutex; - - std::atomic i2c_smbus_done; - std::condition_variable i2c_smbus_done_cv; - std::mutex i2c_smbus_done_mutex; - std::mutex i2c_smbus_xfer_mutex; - u8 i2c_addr; - char i2c_read_write; - u8 i2c_command; - int i2c_size_smbus; - int* i2c_size; - i2c_smbus_data* i2c_data_smbus; - u8* i2c_data; - s32 i2c_ret; - bool smbus_xfer; }; #endif /* I2C_SMBUS_H */