Skip to content

Commit d0236f1

Browse files
committed
Merge tag 'optee-simplify-i2c-access_for-v5.12' of git://git.linaro.org/people/jens.wiklander/linux-tee into arm/drivers
Simplify i2c acess in OP-TEE driver * tag 'optee-simplify-i2c-access_for-v5.12' of git://git.linaro.org/people/jens.wiklander/linux-tee: optee: simplify i2c access Link: https://lore.kernel.org/soc/20210208125853.GA288348%40jade Signed-off-by: Arnd Bergmann <[email protected]>
2 parents 7deff44 + 67bc809 commit d0236f1

File tree

1 file changed

+16
-15
lines changed

1 file changed

+16
-15
lines changed

drivers/tee/optee/rpc.c

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,9 @@ static void handle_rpc_func_cmd_get_time(struct optee_msg_arg *arg)
5555
static 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;
133134
bad:

0 commit comments

Comments
 (0)