NFC: trf7970a: add device tree option for 27MHz clock
The TRF7970A has configuration options to support hardware designs which use a 27.12MHz clock. This commit adds a device tree option 'clock-frequency' to support configuring the this chip for default 13.56MHz clock or the optional 27.12MHz clock. Acked-by: Rob Herring <robh@kernel.org> Acked-by: Mark Greer <mgreer@animalcreek.com> Signed-off-by: Geoff Lansberry <geoff@kuvee.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
parent
2891f2d5c1
commit
837eb4d21e
@ -21,6 +21,7 @@ Optional SoC Specific Properties:
|
|||||||
- t5t-rmb-extra-byte-quirk: Specify that the trf7970a has the erratum
|
- t5t-rmb-extra-byte-quirk: Specify that the trf7970a has the erratum
|
||||||
where an extra byte is returned by Read Multiple Block commands issued
|
where an extra byte is returned by Read Multiple Block commands issued
|
||||||
to Type 5 tags.
|
to Type 5 tags.
|
||||||
|
- clock-frequency: Set to specify that the input frequency to the trf7970a is 13560000Hz or 27120000Hz
|
||||||
|
|
||||||
Example (for ARM-based BeagleBone with TRF7970A on SPI1):
|
Example (for ARM-based BeagleBone with TRF7970A on SPI1):
|
||||||
|
|
||||||
@ -43,6 +44,7 @@ Example (for ARM-based BeagleBone with TRF7970A on SPI1):
|
|||||||
irq-status-read-quirk;
|
irq-status-read-quirk;
|
||||||
en2-rf-quirk;
|
en2-rf-quirk;
|
||||||
t5t-rmb-extra-byte-quirk;
|
t5t-rmb-extra-byte-quirk;
|
||||||
|
clock-frequency = <27120000>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user