|
@@ -124,6 +124,9 @@
|
|
|
NFC_PROTO_ISO15693_MASK | NFC_PROTO_NFC_DEP_MASK)
|
|
NFC_PROTO_ISO15693_MASK | NFC_PROTO_NFC_DEP_MASK)
|
|
|
|
|
|
|
|
#define TRF7970A_AUTOSUSPEND_DELAY 30000 /* 30 seconds */
|
|
#define TRF7970A_AUTOSUSPEND_DELAY 30000 /* 30 seconds */
|
|
|
|
|
+#define TRF7970A_13MHZ_CLOCK_FREQUENCY 13560000
|
|
|
|
|
+#define TRF7970A_27MHZ_CLOCK_FREQUENCY 27120000
|
|
|
|
|
+
|
|
|
|
|
|
|
|
#define TRF7970A_RX_SKB_ALLOC_SIZE 256
|
|
#define TRF7970A_RX_SKB_ALLOC_SIZE 256
|
|
|
|
|
|
|
@@ -1056,12 +1059,11 @@ static int trf7970a_init(struct trf7970a *trf)
|
|
|
|
|
|
|
|
trf->chip_status_ctrl &= ~TRF7970A_CHIP_STATUS_RF_ON;
|
|
trf->chip_status_ctrl &= ~TRF7970A_CHIP_STATUS_RF_ON;
|
|
|
|
|
|
|
|
- ret = trf7970a_write(trf, TRF7970A_MODULATOR_SYS_CLK_CTRL, 0);
|
|
|
|
|
|
|
+ ret = trf7970a_write(trf, TRF7970A_MODULATOR_SYS_CLK_CTRL,
|
|
|
|
|
+ trf->modulator_sys_clk_ctrl);
|
|
|
if (ret)
|
|
if (ret)
|
|
|
goto err_out;
|
|
goto err_out;
|
|
|
|
|
|
|
|
- trf->modulator_sys_clk_ctrl = 0;
|
|
|
|
|
-
|
|
|
|
|
ret = trf7970a_write(trf, TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS,
|
|
ret = trf7970a_write(trf, TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS,
|
|
|
TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLH_96 |
|
|
TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLH_96 |
|
|
|
TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLL_32);
|
|
TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLL_32);
|
|
@@ -1181,27 +1183,37 @@ static int trf7970a_in_config_rf_tech(struct trf7970a *trf, int tech)
|
|
|
switch (tech) {
|
|
switch (tech) {
|
|
|
case NFC_DIGITAL_RF_TECH_106A:
|
|
case NFC_DIGITAL_RF_TECH_106A:
|
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443A_106;
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443A_106;
|
|
|
- trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK;
|
|
|
|
|
|
|
+ trf->modulator_sys_clk_ctrl =
|
|
|
|
|
+ (trf->modulator_sys_clk_ctrl & 0xf8) |
|
|
|
|
|
+ TRF7970A_MODULATOR_DEPTH_OOK;
|
|
|
trf->guard_time = TRF7970A_GUARD_TIME_NFCA;
|
|
trf->guard_time = TRF7970A_GUARD_TIME_NFCA;
|
|
|
break;
|
|
break;
|
|
|
case NFC_DIGITAL_RF_TECH_106B:
|
|
case NFC_DIGITAL_RF_TECH_106B:
|
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443B_106;
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443B_106;
|
|
|
- trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
|
|
|
|
|
|
|
+ trf->modulator_sys_clk_ctrl =
|
|
|
|
|
+ (trf->modulator_sys_clk_ctrl & 0xf8) |
|
|
|
|
|
+ TRF7970A_MODULATOR_DEPTH_ASK10;
|
|
|
trf->guard_time = TRF7970A_GUARD_TIME_NFCB;
|
|
trf->guard_time = TRF7970A_GUARD_TIME_NFCB;
|
|
|
break;
|
|
break;
|
|
|
case NFC_DIGITAL_RF_TECH_212F:
|
|
case NFC_DIGITAL_RF_TECH_212F:
|
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_212;
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_212;
|
|
|
- trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
|
|
|
|
|
|
|
+ trf->modulator_sys_clk_ctrl =
|
|
|
|
|
+ (trf->modulator_sys_clk_ctrl & 0xf8) |
|
|
|
|
|
+ TRF7970A_MODULATOR_DEPTH_ASK10;
|
|
|
trf->guard_time = TRF7970A_GUARD_TIME_NFCF;
|
|
trf->guard_time = TRF7970A_GUARD_TIME_NFCF;
|
|
|
break;
|
|
break;
|
|
|
case NFC_DIGITAL_RF_TECH_424F:
|
|
case NFC_DIGITAL_RF_TECH_424F:
|
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_424;
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_424;
|
|
|
- trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
|
|
|
|
|
|
|
+ trf->modulator_sys_clk_ctrl =
|
|
|
|
|
+ (trf->modulator_sys_clk_ctrl & 0xf8) |
|
|
|
|
|
+ TRF7970A_MODULATOR_DEPTH_ASK10;
|
|
|
trf->guard_time = TRF7970A_GUARD_TIME_NFCF;
|
|
trf->guard_time = TRF7970A_GUARD_TIME_NFCF;
|
|
|
break;
|
|
break;
|
|
|
case NFC_DIGITAL_RF_TECH_ISO15693:
|
|
case NFC_DIGITAL_RF_TECH_ISO15693:
|
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_15693_SGL_1OF4_2648;
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_15693_SGL_1OF4_2648;
|
|
|
- trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK;
|
|
|
|
|
|
|
+ trf->modulator_sys_clk_ctrl =
|
|
|
|
|
+ (trf->modulator_sys_clk_ctrl & 0xf8) |
|
|
|
|
|
+ TRF7970A_MODULATOR_DEPTH_OOK;
|
|
|
trf->guard_time = TRF7970A_GUARD_TIME_15693;
|
|
trf->guard_time = TRF7970A_GUARD_TIME_15693;
|
|
|
break;
|
|
break;
|
|
|
default:
|
|
default:
|
|
@@ -1571,17 +1583,23 @@ static int trf7970a_tg_config_rf_tech(struct trf7970a *trf, int tech)
|
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE |
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE |
|
|
|
TRF7970A_ISO_CTRL_NFC_CE |
|
|
TRF7970A_ISO_CTRL_NFC_CE |
|
|
|
TRF7970A_ISO_CTRL_NFC_CE_14443A;
|
|
TRF7970A_ISO_CTRL_NFC_CE_14443A;
|
|
|
- trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK;
|
|
|
|
|
|
|
+ trf->modulator_sys_clk_ctrl =
|
|
|
|
|
+ (trf->modulator_sys_clk_ctrl & 0xf8) |
|
|
|
|
|
+ TRF7970A_MODULATOR_DEPTH_OOK;
|
|
|
break;
|
|
break;
|
|
|
case NFC_DIGITAL_RF_TECH_212F:
|
|
case NFC_DIGITAL_RF_TECH_212F:
|
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE |
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE |
|
|
|
TRF7970A_ISO_CTRL_NFC_NFCF_212;
|
|
TRF7970A_ISO_CTRL_NFC_NFCF_212;
|
|
|
- trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
|
|
|
|
|
|
|
+ trf->modulator_sys_clk_ctrl =
|
|
|
|
|
+ (trf->modulator_sys_clk_ctrl & 0xf8) |
|
|
|
|
|
+ TRF7970A_MODULATOR_DEPTH_ASK10;
|
|
|
break;
|
|
break;
|
|
|
case NFC_DIGITAL_RF_TECH_424F:
|
|
case NFC_DIGITAL_RF_TECH_424F:
|
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE |
|
|
trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE |
|
|
|
TRF7970A_ISO_CTRL_NFC_NFCF_424;
|
|
TRF7970A_ISO_CTRL_NFC_NFCF_424;
|
|
|
- trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
|
|
|
|
|
|
|
+ trf->modulator_sys_clk_ctrl =
|
|
|
|
|
+ (trf->modulator_sys_clk_ctrl & 0xf8) |
|
|
|
|
|
+ TRF7970A_MODULATOR_DEPTH_ASK10;
|
|
|
break;
|
|
break;
|
|
|
default:
|
|
default:
|
|
|
dev_dbg(trf->dev, "Unsupported rf technology: %d\n", tech);
|
|
dev_dbg(trf->dev, "Unsupported rf technology: %d\n", tech);
|
|
@@ -1990,6 +2008,7 @@ static int trf7970a_probe(struct spi_device *spi)
|
|
|
struct device_node *np = spi->dev.of_node;
|
|
struct device_node *np = spi->dev.of_node;
|
|
|
struct trf7970a *trf;
|
|
struct trf7970a *trf;
|
|
|
int uvolts, autosuspend_delay, ret;
|
|
int uvolts, autosuspend_delay, ret;
|
|
|
|
|
+ u32 clk_freq = TRF7970A_13MHZ_CLOCK_FREQUENCY;
|
|
|
|
|
|
|
|
if (!np) {
|
|
if (!np) {
|
|
|
dev_err(&spi->dev, "No Device Tree entry\n");
|
|
dev_err(&spi->dev, "No Device Tree entry\n");
|
|
@@ -2045,6 +2064,15 @@ static int trf7970a_probe(struct spi_device *spi)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ of_property_read_u32(np, "clock-frequency", &clk_freq);
|
|
|
|
|
+ if ((clk_freq != TRF7970A_27MHZ_CLOCK_FREQUENCY) ||
|
|
|
|
|
+ (clk_freq != TRF7970A_13MHZ_CLOCK_FREQUENCY)) {
|
|
|
|
|
+ dev_err(trf->dev,
|
|
|
|
|
+ "clock-frequency (%u Hz) unsupported\n",
|
|
|
|
|
+ clk_freq);
|
|
|
|
|
+ return -EINVAL;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
if (of_property_read_bool(np, "en2-rf-quirk"))
|
|
if (of_property_read_bool(np, "en2-rf-quirk"))
|
|
|
trf->quirks |= TRF7970A_QUIRK_EN2_MUST_STAY_LOW;
|
|
trf->quirks |= TRF7970A_QUIRK_EN2_MUST_STAY_LOW;
|
|
|
|
|
|