diff options
author | Mark A. Greer <mgreer@animalcreek.com> | 2014-09-02 18:12:24 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2014-09-07 17:13:43 -0400 |
commit | 4e64eff837fb682dfb2a1188fb036d75ec57375c (patch) | |
tree | d28e1807b9f0c7a694975b7464574fbaecfc5a57 /drivers/nfc/trf7970a.c | |
parent | a08e54549e743ea3704da939f92caf3eaa8471d3 (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.c | 14 |
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; |