xref: /optee_os/core/drivers/crypto/se050/glue/i2c.c (revision 039e02df2716a0ed886b56e1e07b7ac1d8597228)
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