1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (C) Foundries Ltd. 2020 - All Rights Reserved 4 * Author: Jorge Ramirez <jorge@foundries.io> 5 */ 6 7 #include <compiler.h> 8 #include <glue.h> 9 #include <i2c_native.h> 10 #include <initcall.h> 11 #include <kernel/rpc_io_i2c.h> 12 #include <phNxpEsePal_i2c.h> 13 14 static TEE_Result (*transfer)(struct rpc_i2c_request *req, size_t *bytes); 15 16 static int i2c_transfer(uint8_t *buffer, int len, enum rpc_i2c_mode mode) 17 { 18 struct rpc_i2c_request request = { 19 .bus = CFG_CORE_SE05X_I2C_BUS, 20 .chip = SMCOM_I2C_ADDRESS >> 1, 21 .mode = mode, 22 .buffer = buffer, 23 .buffer_len = len, 24 .flags = 0, 25 }; 26 size_t bytes = 0; 27 int retry = 5; 28 29 do { 30 if ((*transfer)(&request, &bytes) == TEE_SUCCESS) 31 return bytes; 32 } while (--retry); 33 34 return -1; 35 } 36 37 int glue_i2c_read(uint8_t *buffer, int len) 38 { 39 return i2c_transfer(buffer, len, RPC_I2C_MODE_READ); 40 } 41 42 int glue_i2c_write(uint8_t *buffer, int len) 43 { 44 return i2c_transfer(buffer, len, RPC_I2C_MODE_WRITE); 45 } 46 47 int glue_i2c_init(void) 48 { 49 if (transfer == rpc_io_i2c_transfer) 50 return 0; 51 52 transfer = native_i2c_transfer; 53 54 return native_i2c_init(); 55 } 56 57 static TEE_Result load_trampoline(void) 58 { 59 transfer = rpc_io_i2c_transfer; 60 61 return TEE_SUCCESS; 62 } 63 64 boot_final(load_trampoline); 65