summaryrefslogtreecommitdiffstats
path: root/drivers/nfc/trf7970a.c
diff options
context:
space:
mode:
authorMark A. Greer <mgreer@animalcreek.com>2014-09-02 18:12:24 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2014-09-07 17:13:43 -0400
commit4e64eff837fb682dfb2a1188fb036d75ec57375c (patch)
treed28e1807b9f0c7a694975b7464574fbaecfc5a57 /drivers/nfc/trf7970a.c
parenta08e54549e743ea3704da939f92caf3eaa8471d3 (diff)
NFC: trf7970a: Add RF technology specific guard times
When turning on the RF field, the driver must wait an RF-technology-specific amount of time (known as the guard time) before modulating the field. Currently, the driver waits 5 ms but that is too short for NFCF and too long for ISO/IEC 15693. Fix this by determining the guard time when the RF technology is set and delaying that amount of time when turning on the RF field. Signed-off-by: Mark A. Greer <mgreer@animalcreek.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/nfc/trf7970a.c')
-rw-r--r--drivers/nfc/trf7970a.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/nfc/trf7970a.c b/drivers/nfc/trf7970a.c
index ce9686c44350..22485e703849 100644
--- a/drivers/nfc/trf7970a.c
+++ b/drivers/nfc/trf7970a.c
@@ -134,6 +134,12 @@
134#define TRF7970A_WAIT_FOR_FIFO_DRAIN_TIMEOUT 3 134#define TRF7970A_WAIT_FOR_FIFO_DRAIN_TIMEOUT 3
135#define TRF7970A_WAIT_TO_ISSUE_ISO15693_EOF 20 135#define TRF7970A_WAIT_TO_ISSUE_ISO15693_EOF 20
136 136
137/* Guard times for various RF technologies (in us) */
138#define TRF7970A_GUARD_TIME_NFCA 5000
139#define TRF7970A_GUARD_TIME_NFCB 5000
140#define TRF7970A_GUARD_TIME_NFCF 20000
141#define TRF7970A_GUARD_TIME_15693 1000
142
137/* Quirks */ 143/* Quirks */
138/* Erratum: When reading IRQ Status register on trf7970a, we must issue a 144/* Erratum: When reading IRQ Status register on trf7970a, we must issue a
139 * read continuous command for IRQ Status and Collision Position registers. 145 * read continuous command for IRQ Status and Collision Position registers.
@@ -351,6 +357,7 @@ struct trf7970a {
351 u8 iso_ctrl_tech; 357 u8 iso_ctrl_tech;
352 u8 modulator_sys_clk_ctrl; 358 u8 modulator_sys_clk_ctrl;
353 u8 special_fcn_reg1; 359 u8 special_fcn_reg1;
360 unsigned int guard_time;
354 int technology; 361 int technology;
355 int framing; 362 int framing;
356 u8 tx_cmd; 363 u8 tx_cmd;
@@ -887,22 +894,27 @@ static int trf7970a_config_rf_tech(struct trf7970a *trf, int tech)
887 case NFC_DIGITAL_RF_TECH_106A: 894 case NFC_DIGITAL_RF_TECH_106A:
888 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443A_106; 895 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443A_106;
889 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK; 896 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK;
897 trf->guard_time = TRF7970A_GUARD_TIME_NFCA;
890 break; 898 break;
891 case NFC_DIGITAL_RF_TECH_106B: 899 case NFC_DIGITAL_RF_TECH_106B:
892 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443B_106; 900 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443B_106;
893 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10; 901 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
902 trf->guard_time = TRF7970A_GUARD_TIME_NFCB;
894 break; 903 break;
895 case NFC_DIGITAL_RF_TECH_212F: 904 case NFC_DIGITAL_RF_TECH_212F:
896 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_212; 905 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_212;
897 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10; 906 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
907 trf->guard_time = TRF7970A_GUARD_TIME_NFCF;
898 break; 908 break;
899 case NFC_DIGITAL_RF_TECH_424F: 909 case NFC_DIGITAL_RF_TECH_424F:
900 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_424; 910 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_424;
901 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10; 911 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
912 trf->guard_time = TRF7970A_GUARD_TIME_NFCF;
902 break; 913 break;
903 case NFC_DIGITAL_RF_TECH_ISO15693: 914 case NFC_DIGITAL_RF_TECH_ISO15693:
904 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_15693_SGL_1OF4_2648; 915 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_15693_SGL_1OF4_2648;
905 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK; 916 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK;
917 trf->guard_time = TRF7970A_GUARD_TIME_15693;
906 break; 918 break;
907 default: 919 default:
908 dev_dbg(trf->dev, "Unsupported rf technology: %d\n", tech); 920 dev_dbg(trf->dev, "Unsupported rf technology: %d\n", tech);
@@ -971,7 +983,7 @@ static int trf7970a_config_framing(struct trf7970a *trf, int framing)
971 983
972 trf->chip_status_ctrl |= TRF7970A_CHIP_STATUS_RF_ON; 984 trf->chip_status_ctrl |= TRF7970A_CHIP_STATUS_RF_ON;
973 985
974 usleep_range(5000, 6000); 986 usleep_range(trf->guard_time, trf->guard_time + 1000);
975 } 987 }
976 988
977 return 0; 989 return 0;