in st95hf/core.c [532:601]
static int iso14443_config_fdt(struct st95hf_context *st95context, int wtxm)
{
int result = 0;
struct device *dev = &st95context->spicontext.spidev->dev;
struct nfc_digital_dev *nfcddev = st95context->ddev;
unsigned char pp_typeb;
struct param_list new_params[2];
pp_typeb = cmd_array[CMD_ISO14443B_PROTOCOL_SELECT].cmd_params[2];
if (nfcddev->curr_protocol == NFC_PROTO_ISO14443 &&
st95context->fwi < 4)
st95context->fwi = 4;
new_params[0].param_offset = 2;
if (nfcddev->curr_protocol == NFC_PROTO_ISO14443)
new_params[0].new_param_val = st95context->fwi;
else if (nfcddev->curr_protocol == NFC_PROTO_ISO14443_B)
new_params[0].new_param_val = pp_typeb;
new_params[1].param_offset = 3;
new_params[1].new_param_val = wtxm;
switch (nfcddev->curr_protocol) {
case NFC_PROTO_ISO14443:
result = st95hf_send_recv_cmd(st95context,
CMD_ISO14443A_PROTOCOL_SELECT,
2,
new_params,
true);
if (result) {
dev_err(dev, "WTX type a sel proto, err = 0x%x\n",
result);
return result;
}
/* secondary config. for 14443Type 4A after protocol select */
result = secondary_configuration_type4a(st95context);
if (result) {
dev_err(dev, "WTX type a second. config, err = 0x%x\n",
result);
return result;
}
break;
case NFC_PROTO_ISO14443_B:
result = st95hf_send_recv_cmd(st95context,
CMD_ISO14443B_PROTOCOL_SELECT,
2,
new_params,
true);
if (result) {
dev_err(dev, "WTX type b sel proto, err = 0x%x\n",
result);
return result;
}
/* secondary config. for 14443Type 4B after protocol select */
result = secondary_configuration_type4b(st95context);
if (result) {
dev_err(dev, "WTX type b second. config, err = 0x%x\n",
result);
return result;
}
break;
default:
return -EINVAL;
}
return 0;
}