in st95hf/core.c [243:302]
static int st95hf_send_recv_cmd(struct st95hf_context *st95context,
enum st95hf_cmd_list cmd,
int no_modif,
struct param_list *list_array,
bool recv_res)
{
unsigned char spi_cmd_buffer[MAX_CMD_LEN];
int i, ret;
struct device *dev = &st95context->spicontext.spidev->dev;
if (cmd_array[cmd].cmd_len > MAX_CMD_LEN)
return -EINVAL;
if (cmd_array[cmd].no_cmd_params < no_modif)
return -EINVAL;
if (no_modif && !list_array)
return -EINVAL;
spi_cmd_buffer[0] = ST95HF_COMMAND_SEND;
spi_cmd_buffer[1] = cmd_array[cmd].cmd_id;
spi_cmd_buffer[2] = cmd_array[cmd].no_cmd_params;
memcpy(&spi_cmd_buffer[3], cmd_array[cmd].cmd_params,
spi_cmd_buffer[2]);
for (i = 0; i < no_modif; i++) {
if (list_array[i].param_offset >= cmd_array[cmd].no_cmd_params)
return -EINVAL;
spi_cmd_buffer[3 + list_array[i].param_offset] =
list_array[i].new_param_val;
}
ret = st95hf_spi_send(&st95context->spicontext,
spi_cmd_buffer,
cmd_array[cmd].cmd_len,
cmd_array[cmd].req);
if (ret) {
dev_err(dev, "st95hf_spi_send failed with error %d\n", ret);
return ret;
}
if (cmd_array[cmd].req == SYNC && recv_res) {
unsigned char st95hf_response_arr[2];
ret = st95hf_spi_recv_response(&st95context->spicontext,
st95hf_response_arr);
if (ret < 0) {
dev_err(dev, "spi error from st95hf_spi_recv_response(), err = 0x%x\n",
ret);
return ret;
}
if (st95hf_response_arr[0]) {
dev_err(dev, "st95hf error from st95hf_spi_recv_response(), err = 0x%x\n",
st95hf_response_arr[0]);
return -EIO;
}
}
return 0;
}