From 7e6be8a849b353dccd636d8a0f06901ec8308ce6 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Fri, 24 Dec 2021 13:05:35 -0600 Subject: [PATCH] Add i2c block write with register parameter functions --- i2c_smbus/i2c_smbus.cpp | 20 ++++++++++++++++---- i2c_smbus/i2c_smbus.h | 8 ++++++-- i2c_smbus/i2c_smbus_amdadl.cpp | 2 +- i2c_smbus/i2c_smbus_amdadl.h | 2 +- i2c_smbus/i2c_smbus_i801.cpp | 2 +- i2c_smbus/i2c_smbus_i801.h | 2 +- i2c_smbus/i2c_smbus_linux.cpp | 2 +- i2c_smbus/i2c_smbus_linux.h | 2 +- i2c_smbus/i2c_smbus_nct6775.cpp | 2 +- i2c_smbus/i2c_smbus_nct6775.h | 2 +- i2c_smbus/i2c_smbus_nvapi.cpp | 2 +- i2c_smbus/i2c_smbus_nvapi.h | 2 +- i2c_smbus/i2c_smbus_piix4.cpp | 2 +- i2c_smbus/i2c_smbus_piix4.h | 2 +- 14 files changed, 34 insertions(+), 18 deletions(-) diff --git a/i2c_smbus/i2c_smbus.cpp b/i2c_smbus/i2c_smbus.cpp index 50e32d927..57131f4e5 100644 --- a/i2c_smbus/i2c_smbus.cpp +++ b/i2c_smbus/i2c_smbus.cpp @@ -183,12 +183,14 @@ s32 i2c_smbus_interface::i2c_smbus_xfer_call(u8 addr, char read_write, u8 comman return(i2c_ret); } -s32 i2c_smbus_interface::i2c_xfer_call(u8 addr, char read_write, int* size, u8 *data) +s32 i2c_smbus_interface::i2c_xfer_call(u8 addr, char read_write, int reg_size, u8* reg_data, int* size, u8 *data) { i2c_smbus_xfer_mutex.lock(); i2c_addr = addr; i2c_read_write = read_write; + i2c_reg_size = reg_size; + i2c_reg_data = reg_data; i2c_size = size; i2c_data = data; smbus_xfer = false; @@ -210,12 +212,22 @@ s32 i2c_smbus_interface::i2c_xfer_call(u8 addr, char read_write, int* size, u8 * s32 i2c_smbus_interface::i2c_read_block(u8 addr, int* size, u8* data) { - return i2c_xfer_call(addr, I2C_SMBUS_READ, size, data); + return i2c_xfer_call(addr, I2C_SMBUS_READ, 0, NULL, size, data); } s32 i2c_smbus_interface::i2c_write_block(u8 addr, int size, u8 *data) { - return i2c_xfer_call(addr, I2C_SMBUS_WRITE, &size, data); + return i2c_xfer_call(addr, I2C_SMBUS_WRITE, 0, NULL, &size, data); +} + +s32 i2c_smbus_interface::i2c_read_block_reg(u8 addr, int reg_size, u8* reg_data, int* size, u8* data) +{ + return i2c_xfer_call(addr, I2C_SMBUS_READ, reg_size, reg_data, size, data); +} + +s32 i2c_smbus_interface::i2c_write_block_reg(u8 addr, int reg_size, u8* reg_data, int size, u8 *data) +{ + return i2c_xfer_call(addr, I2C_SMBUS_WRITE, reg_size, reg_data, &size, data); } void i2c_smbus_interface::i2c_smbus_thread_function() @@ -238,7 +250,7 @@ void i2c_smbus_interface::i2c_smbus_thread_function() } else { - i2c_ret = i2c_xfer(i2c_addr, i2c_read_write, i2c_size, i2c_data); + i2c_ret = i2c_xfer(i2c_addr, i2c_read_write, i2c_reg_size, i2c_reg_data, i2c_size, i2c_data); } std::unique_lock done_lock(i2c_smbus_done_mutex); diff --git a/i2c_smbus/i2c_smbus.h b/i2c_smbus/i2c_smbus.h index 0da279595..fcd887fd6 100644 --- a/i2c_smbus/i2c_smbus.h +++ b/i2c_smbus/i2c_smbus.h @@ -103,13 +103,15 @@ public: //Addtional functions added for pure I2C block operations s32 i2c_read_block(u8 addr, int* size, u8* data); s32 i2c_write_block(u8 addr, int size, u8* data); + s32 i2c_read_block_reg(u8 addr, int reg_size, u8* reg_data, int* size, u8* data); + s32 i2c_write_block_reg(u8 addr, int reg_size, u8* reg_data, int size, u8* data); //Handle SMBus and I2C transfer calls in a single thread s32 i2c_smbus_xfer_call(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data); - s32 i2c_xfer_call(u8 addr, char read_write, int* size, u8 *data); + s32 i2c_xfer_call(u8 addr, char read_write, int reg_size, u8* reg_data, int* size, u8 *data); virtual s32 i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data) = 0; - virtual s32 i2c_xfer(u8 addr, char read_write, int* size, u8* data) = 0; + virtual s32 i2c_xfer(u8 addr, char read_write, int reg_size, u8* reg_data, int* size, u8* data) = 0; private: std::thread * i2c_smbus_thread; @@ -130,8 +132,10 @@ private: u16 i2c_command; int i2c_size_smbus; int* i2c_size; + int i2c_reg_size; i2c_smbus_data* i2c_data_smbus; u8* i2c_data; + u8* i2c_reg_data; s32 i2c_ret; bool smbus_xfer; }; diff --git a/i2c_smbus/i2c_smbus_amdadl.cpp b/i2c_smbus/i2c_smbus_amdadl.cpp index 71155d474..99ba4c04c 100644 --- a/i2c_smbus/i2c_smbus_amdadl.cpp +++ b/i2c_smbus/i2c_smbus_amdadl.cpp @@ -194,7 +194,7 @@ s32 i2c_smbus_amdadl::i2c_smbus_xfer(u8 addr, char read_write, u8 command, int s return (ret); }; -s32 i2c_smbus_amdadl::i2c_xfer(u8 addr, char read_write, int* size, u8* data) +s32 i2c_smbus_amdadl::i2c_xfer(u8 addr, char read_write, int reg_size, u8* reg_data, int* size, u8* data) { return -1; } diff --git a/i2c_smbus/i2c_smbus_amdadl.h b/i2c_smbus/i2c_smbus_amdadl.h index c91d0273e..c7f3b6277 100644 --- a/i2c_smbus/i2c_smbus_amdadl.h +++ b/i2c_smbus/i2c_smbus_amdadl.h @@ -30,6 +30,6 @@ public: private: s32 i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data); - s32 i2c_xfer(u8 addr, char read_write, int* size, u8* data); + s32 i2c_xfer(u8 addr, char read_write, int reg_size, u8* reg_data, int* size, u8* data); ADL_CONTEXT_HANDLE context = NULL; }; diff --git a/i2c_smbus/i2c_smbus_i801.cpp b/i2c_smbus/i2c_smbus_i801.cpp index cd9c9cc10..f54eb08d5 100644 --- a/i2c_smbus/i2c_smbus_i801.cpp +++ b/i2c_smbus/i2c_smbus_i801.cpp @@ -484,7 +484,7 @@ s32 i2c_smbus_i801::i2c_smbus_xfer(u8 addr, char read_write, u8 command, int siz return i801_access(addr, read_write, command, size, data); } -s32 i2c_smbus_i801::i2c_xfer(u8 addr, char read_write, int* size, u8* data) +s32 i2c_smbus_i801::i2c_xfer(u8 addr, char read_write, int reg_size, u8* reg_data, int* size, u8* data) { return -1; } diff --git a/i2c_smbus/i2c_smbus_i801.h b/i2c_smbus/i2c_smbus_i801.h index 5d59ddab7..8692bf9e6 100644 --- a/i2c_smbus/i2c_smbus_i801.h +++ b/i2c_smbus/i2c_smbus_i801.h @@ -92,5 +92,5 @@ private: int i801_wait_byte_done(); int i801_wait_intr(); s32 i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data); - s32 i2c_xfer(u8 addr, char read_write, int* size, u8* data); + s32 i2c_xfer(u8 addr, char read_write, int reg_size, u8* reg_data, int* size, u8* data); }; \ No newline at end of file diff --git a/i2c_smbus/i2c_smbus_linux.cpp b/i2c_smbus/i2c_smbus_linux.cpp index a020b078b..d981b1ff1 100644 --- a/i2c_smbus/i2c_smbus_linux.cpp +++ b/i2c_smbus/i2c_smbus_linux.cpp @@ -30,7 +30,7 @@ s32 i2c_smbus_linux::i2c_smbus_xfer(u8 addr, char read_write, u8 command, int si return ioctl(handle, I2C_SMBUS, &args); } -s32 i2c_smbus_linux::i2c_xfer(u8 addr, char read_write, int* size, u8* data) +s32 i2c_smbus_linux::i2c_xfer(u8 addr, char read_write, int reg_size, u8* reg_data, int* size, u8* data) { i2c_rdwr_ioctl_data rdwr; i2c_msg msg; diff --git a/i2c_smbus/i2c_smbus_linux.h b/i2c_smbus/i2c_smbus_linux.h index fc037086a..91f0d97d6 100644 --- a/i2c_smbus/i2c_smbus_linux.h +++ b/i2c_smbus/i2c_smbus_linux.h @@ -16,5 +16,5 @@ public: private: s32 i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data); - s32 i2c_xfer(u8 addr, char read_write, int* size, u8* data); + s32 i2c_xfer(u8 addr, char read_write, int reg_size, u8* reg_data, int* size, u8* data); }; diff --git a/i2c_smbus/i2c_smbus_nct6775.cpp b/i2c_smbus/i2c_smbus_nct6775.cpp index 80ce9fd99..9559e8a54 100644 --- a/i2c_smbus/i2c_smbus_nct6775.cpp +++ b/i2c_smbus/i2c_smbus_nct6775.cpp @@ -189,7 +189,7 @@ s32 i2c_smbus_nct6775::i2c_smbus_xfer(u8 addr, char read_write, u8 command, int return nct6775_access(addr, read_write, command, size, data); } -s32 i2c_smbus_nct6775::i2c_xfer(u8 addr, char read_write, int* size, u8* data) +s32 i2c_smbus_nct6775::i2c_xfer(u8 addr, char read_write, int reg_size, u8* reg_data, int* size, u8* data) { return -1; } diff --git a/i2c_smbus/i2c_smbus_nct6775.h b/i2c_smbus/i2c_smbus_nct6775.h index a9af8fb7d..a944d22de 100644 --- a/i2c_smbus/i2c_smbus_nct6775.h +++ b/i2c_smbus/i2c_smbus_nct6775.h @@ -53,6 +53,6 @@ public: private: s32 nct6775_access(u16 addr, char read_write, u8 command, int size, i2c_smbus_data *data); s32 i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data); - s32 i2c_xfer(u8 addr, char read_write, int* size, u8* data); + s32 i2c_xfer(u8 addr, char read_write, int reg_size, u8* reg_data, int* size, u8* data); }; diff --git a/i2c_smbus/i2c_smbus_nvapi.cpp b/i2c_smbus/i2c_smbus_nvapi.cpp index d78e0e083..d5804bd46 100644 --- a/i2c_smbus/i2c_smbus_nvapi.cpp +++ b/i2c_smbus/i2c_smbus_nvapi.cpp @@ -118,7 +118,7 @@ s32 i2c_smbus_nvapi::i2c_smbus_xfer(u8 addr, char read_write, u8 command, int mo return(ret); } -s32 i2c_smbus_nvapi::i2c_xfer(u8 addr, char read_write, int* size, u8* data) +s32 i2c_smbus_nvapi::i2c_xfer(u8 addr, char read_write, int reg_size, u8* reg_data, int* size, u8* data) { NV_STATUS ret; unsigned int unknown = 0; diff --git a/i2c_smbus/i2c_smbus_nvapi.h b/i2c_smbus/i2c_smbus_nvapi.h index 70ce7a41a..e53f2d4b6 100644 --- a/i2c_smbus/i2c_smbus_nvapi.h +++ b/i2c_smbus/i2c_smbus_nvapi.h @@ -21,6 +21,6 @@ public: private: s32 i2c_smbus_xfer(u8 addr, char read_write, u8 command, int mode, i2c_smbus_data* data); - s32 i2c_xfer(u8 addr, char read_write, int* size, u8* data); + s32 i2c_xfer(u8 addr, char read_write, int reg_size, u8* reg_data, int* size, u8* data); NV_PHYSICAL_GPU_HANDLE handle; }; diff --git a/i2c_smbus/i2c_smbus_piix4.cpp b/i2c_smbus/i2c_smbus_piix4.cpp index 124092ae5..17c0ce86a 100644 --- a/i2c_smbus/i2c_smbus_piix4.cpp +++ b/i2c_smbus/i2c_smbus_piix4.cpp @@ -178,7 +178,7 @@ s32 i2c_smbus_piix4::i2c_smbus_xfer(u8 addr, char read_write, u8 command, int si return piix4_access(addr, read_write, command, size, data); } -s32 i2c_smbus_piix4::i2c_xfer(u8 addr, char read_write, int* size, u8* data) +s32 i2c_smbus_piix4::i2c_xfer(u8 addr, char read_write, int reg_size, u8* reg_data, int* size, u8* data) { return -1; } diff --git a/i2c_smbus/i2c_smbus_piix4.h b/i2c_smbus/i2c_smbus_piix4.h index fe3308d6e..92d5c4c64 100644 --- a/i2c_smbus/i2c_smbus_piix4.h +++ b/i2c_smbus/i2c_smbus_piix4.h @@ -45,5 +45,5 @@ private: int piix4_transaction(); s32 piix4_access(u16 addr, char read_write, u8 command, int size, i2c_smbus_data *data); s32 i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data); - s32 i2c_xfer(u8 addr, char read_write, int* size, u8* data); + s32 i2c_xfer(u8 addr, char read_write, int reg_size, u8* reg_data, int* size, u8* data); }; \ No newline at end of file