@@ -55,8 +55,9 @@ static void handle_rpc_func_cmd_get_time(struct optee_msg_arg *arg)
5555static void handle_rpc_func_cmd_i2c_transfer (struct tee_context * ctx ,
5656 struct optee_msg_arg * arg )
5757{
58- struct i2c_client client = { 0 };
5958 struct tee_param * params ;
59+ struct i2c_adapter * adapter ;
60+ struct i2c_msg msg = { };
6061 size_t i ;
6162 int ret = - EOPNOTSUPP ;
6263 u8 attr [] = {
@@ -86,48 +87,48 @@ static void handle_rpc_func_cmd_i2c_transfer(struct tee_context *ctx,
8687 goto bad ;
8788 }
8889
89- client . adapter = i2c_get_adapter (params [0 ].u .value .b );
90- if (!client . adapter )
90+ adapter = i2c_get_adapter (params [0 ].u .value .b );
91+ if (!adapter )
9192 goto bad ;
9293
9394 if (params [1 ].u .value .a & OPTEE_RPC_I2C_FLAGS_TEN_BIT ) {
94- if (!i2c_check_functionality (client . adapter ,
95+ if (!i2c_check_functionality (adapter ,
9596 I2C_FUNC_10BIT_ADDR )) {
96- i2c_put_adapter (client . adapter );
97+ i2c_put_adapter (adapter );
9798 goto bad ;
9899 }
99100
100- client .flags = I2C_CLIENT_TEN ;
101+ msg .flags = I2C_M_TEN ;
101102 }
102103
103- client .addr = params [0 ].u .value .c ;
104- snprintf (client .name , I2C_NAME_SIZE , "i2c%d" , client .adapter -> nr );
104+ msg .addr = params [0 ].u .value .c ;
105+ msg .buf = params [2 ].u .memref .shm -> kaddr ;
106+ msg .len = params [2 ].u .memref .size ;
105107
106108 switch (params [0 ].u .value .a ) {
107109 case OPTEE_RPC_I2C_TRANSFER_RD :
108- ret = i2c_master_recv (& client , params [2 ].u .memref .shm -> kaddr ,
109- params [2 ].u .memref .size );
110+ msg .flags |= I2C_M_RD ;
110111 break ;
111112 case OPTEE_RPC_I2C_TRANSFER_WR :
112- ret = i2c_master_send (& client , params [2 ].u .memref .shm -> kaddr ,
113- params [2 ].u .memref .size );
114113 break ;
115114 default :
116- i2c_put_adapter (client . adapter );
115+ i2c_put_adapter (adapter );
117116 goto bad ;
118117 }
119118
119+ ret = i2c_transfer (adapter , & msg , 1 );
120+
120121 if (ret < 0 ) {
121122 arg -> ret = TEEC_ERROR_COMMUNICATION ;
122123 } else {
123- params [3 ].u .value .a = ret ;
124+ params [3 ].u .value .a = msg . len ;
124125 if (optee_to_msg_param (arg -> params , arg -> num_params , params ))
125126 arg -> ret = TEEC_ERROR_BAD_PARAMETERS ;
126127 else
127128 arg -> ret = TEEC_SUCCESS ;
128129 }
129130
130- i2c_put_adapter (client . adapter );
131+ i2c_put_adapter (adapter );
131132 kfree (params );
132133 return ;
133134bad :
0 commit comments