in st95hf/core.c [375:449]
static int st95hf_select_protocol(struct st95hf_context *stcontext, int type)
{
int result = 0;
struct device *dev;
dev = &stcontext->nfcdev->dev;
switch (type) {
case NFC_DIGITAL_RF_TECH_106A:
stcontext->current_rf_tech = NFC_DIGITAL_RF_TECH_106A;
result = st95hf_send_recv_cmd(stcontext,
CMD_ISO14443A_PROTOCOL_SELECT,
0,
NULL,
true);
if (result) {
dev_err(dev, "protocol sel, err = 0x%x\n",
result);
return result;
}
/* secondary config. for 14443Type 4A after protocol select */
result = secondary_configuration_type4a(stcontext);
if (result) {
dev_err(dev, "type a secondary config, err = 0x%x\n",
result);
return result;
}
break;
case NFC_DIGITAL_RF_TECH_106B:
stcontext->current_rf_tech = NFC_DIGITAL_RF_TECH_106B;
result = st95hf_send_recv_cmd(stcontext,
CMD_ISO14443B_PROTOCOL_SELECT,
0,
NULL,
true);
if (result) {
dev_err(dev, "protocol sel send, err = 0x%x\n",
result);
return result;
}
/*
* delay of 5-6 ms is required after select protocol
* command in case of ISO14443 Type B
*/
usleep_range(50000, 60000);
/* secondary config. for 14443Type 4B after protocol select */
result = secondary_configuration_type4b(stcontext);
if (result) {
dev_err(dev, "type b secondary config, err = 0x%x\n",
result);
return result;
}
break;
case NFC_DIGITAL_RF_TECH_ISO15693:
stcontext->current_rf_tech = NFC_DIGITAL_RF_TECH_ISO15693;
result = st95hf_send_recv_cmd(stcontext,
CMD_ISO15693_PROTOCOL_SELECT,
0,
NULL,
true);
if (result) {
dev_err(dev, "protocol sel send, err = 0x%x\n",
result);
return result;
}
break;
default:
return -EINVAL;
}
return 0;
}