xref: /optee_os/core/drivers/crypto/se050/glue/i2c.c (revision 613c63090b00ac971fb02ac74f7f23e6c751972c)
103889d54SJorge Ramirez-Ortiz // SPDX-License-Identifier: BSD-2-Clause
203889d54SJorge Ramirez-Ortiz /*
303889d54SJorge Ramirez-Ortiz  * Copyright (C) Foundries Ltd. 2020 - All Rights Reserved
403889d54SJorge Ramirez-Ortiz  * Author: Jorge Ramirez <jorge@foundries.io>
503889d54SJorge Ramirez-Ortiz  */
603889d54SJorge Ramirez-Ortiz 
703889d54SJorge Ramirez-Ortiz #include <compiler.h>
8*613c6309SJorge Ramirez-Ortiz #include <config.h>
903889d54SJorge Ramirez-Ortiz #include <glue.h>
1044a3128bSJorge Ramirez-Ortiz #include <i2c_native.h>
1103889d54SJorge Ramirez-Ortiz #include <initcall.h>
1203889d54SJorge Ramirez-Ortiz #include <kernel/rpc_io_i2c.h>
1303889d54SJorge Ramirez-Ortiz #include <phNxpEsePal_i2c.h>
1403889d54SJorge Ramirez-Ortiz 
1503889d54SJorge Ramirez-Ortiz static TEE_Result (*transfer)(struct rpc_i2c_request *req, size_t *bytes);
1603889d54SJorge Ramirez-Ortiz 
i2c_transfer(uint8_t * buffer,int len,enum rpc_i2c_mode mode)1703889d54SJorge Ramirez-Ortiz static int i2c_transfer(uint8_t *buffer, int len, enum rpc_i2c_mode mode)
1803889d54SJorge Ramirez-Ortiz {
1903889d54SJorge Ramirez-Ortiz 	struct rpc_i2c_request request = {
2003889d54SJorge Ramirez-Ortiz 		.bus = CFG_CORE_SE05X_I2C_BUS,
2103889d54SJorge Ramirez-Ortiz 		.chip = SMCOM_I2C_ADDRESS >> 1,
2203889d54SJorge Ramirez-Ortiz 		.mode = mode,
2303889d54SJorge Ramirez-Ortiz 		.buffer = buffer,
2403889d54SJorge Ramirez-Ortiz 		.buffer_len = len,
2503889d54SJorge Ramirez-Ortiz 		.flags = 0,
2603889d54SJorge Ramirez-Ortiz 	};
2703889d54SJorge Ramirez-Ortiz 	size_t bytes = 0;
2803889d54SJorge Ramirez-Ortiz 	int retry = 5;
2903889d54SJorge Ramirez-Ortiz 
3003889d54SJorge Ramirez-Ortiz 	do {
3103889d54SJorge Ramirez-Ortiz 		if ((*transfer)(&request, &bytes) == TEE_SUCCESS)
3203889d54SJorge Ramirez-Ortiz 			return bytes;
3303889d54SJorge Ramirez-Ortiz 	} while (--retry);
3403889d54SJorge Ramirez-Ortiz 
3503889d54SJorge Ramirez-Ortiz 	return -1;
3603889d54SJorge Ramirez-Ortiz }
3703889d54SJorge Ramirez-Ortiz 
glue_i2c_read(uint8_t * buffer,int len)3803889d54SJorge Ramirez-Ortiz int glue_i2c_read(uint8_t *buffer, int len)
3903889d54SJorge Ramirez-Ortiz {
4003889d54SJorge Ramirez-Ortiz 	return i2c_transfer(buffer, len, RPC_I2C_MODE_READ);
4103889d54SJorge Ramirez-Ortiz }
4203889d54SJorge Ramirez-Ortiz 
glue_i2c_write(uint8_t * buffer,int len)4303889d54SJorge Ramirez-Ortiz int glue_i2c_write(uint8_t *buffer, int len)
4403889d54SJorge Ramirez-Ortiz {
4503889d54SJorge Ramirez-Ortiz 	return i2c_transfer(buffer, len, RPC_I2C_MODE_WRITE);
4603889d54SJorge Ramirez-Ortiz }
4703889d54SJorge Ramirez-Ortiz 
glue_i2c_init(void)4803889d54SJorge Ramirez-Ortiz int glue_i2c_init(void)
4903889d54SJorge Ramirez-Ortiz {
502c62c5dcSJerome Forissier 	if (transfer == rpc_io_i2c_transfer)
5103889d54SJorge Ramirez-Ortiz 		return 0;
5203889d54SJorge Ramirez-Ortiz 
532c62c5dcSJerome Forissier 	transfer = native_i2c_transfer;
5403889d54SJorge Ramirez-Ortiz 
5544a3128bSJorge Ramirez-Ortiz 	return native_i2c_init();
5603889d54SJorge Ramirez-Ortiz }
5703889d54SJorge Ramirez-Ortiz 
load_trampoline(void)5803889d54SJorge Ramirez-Ortiz static TEE_Result load_trampoline(void)
5903889d54SJorge Ramirez-Ortiz {
60*613c6309SJorge Ramirez-Ortiz 	if (IS_ENABLED(CFG_CORE_SE05X_I2C_TRAMPOLINE))
612c62c5dcSJerome Forissier 		transfer = rpc_io_i2c_transfer;
6203889d54SJorge Ramirez-Ortiz 
6303889d54SJorge Ramirez-Ortiz 	return TEE_SUCCESS;
6403889d54SJorge Ramirez-Ortiz }
6503889d54SJorge Ramirez-Ortiz 
6603889d54SJorge Ramirez-Ortiz boot_final(load_trampoline);
67