mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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
					
				
					 2 changed files with 41 additions and 11 deletions
				
			
		| 
						 | 
				
			
			@ -21,6 +21,7 @@ Optional SoC Specific Properties:
 | 
			
		|||
- t5t-rmb-extra-byte-quirk: Specify that the trf7970a has the erratum
 | 
			
		||||
  where an extra byte is returned by Read Multiple Block commands issued
 | 
			
		||||
  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):
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -43,6 +44,7 @@ Example (for ARM-based BeagleBone with TRF7970A on SPI1):
 | 
			
		|||
		irq-status-read-quirk;
 | 
			
		||||
		en2-rf-quirk;
 | 
			
		||||
		t5t-rmb-extra-byte-quirk;
 | 
			
		||||
		clock-frequency = <27120000>;
 | 
			
		||||
		status = "okay";
 | 
			
		||||
	};
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -124,6 +124,9 @@
 | 
			
		|||
		 NFC_PROTO_ISO15693_MASK | NFC_PROTO_NFC_DEP_MASK)
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1056,12 +1059,11 @@ static int trf7970a_init(struct trf7970a *trf)
 | 
			
		|||
 | 
			
		||||
	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)
 | 
			
		||||
		goto err_out;
 | 
			
		||||
 | 
			
		||||
	trf->modulator_sys_clk_ctrl = 0;
 | 
			
		||||
 | 
			
		||||
	ret = trf7970a_write(trf, TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS,
 | 
			
		||||
			TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLH_96 |
 | 
			
		||||
			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) {
 | 
			
		||||
	case NFC_DIGITAL_RF_TECH_106A:
 | 
			
		||||
		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;
 | 
			
		||||
		break;
 | 
			
		||||
	case NFC_DIGITAL_RF_TECH_106B:
 | 
			
		||||
		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;
 | 
			
		||||
		break;
 | 
			
		||||
	case NFC_DIGITAL_RF_TECH_212F:
 | 
			
		||||
		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;
 | 
			
		||||
		break;
 | 
			
		||||
	case NFC_DIGITAL_RF_TECH_424F:
 | 
			
		||||
		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;
 | 
			
		||||
		break;
 | 
			
		||||
	case NFC_DIGITAL_RF_TECH_ISO15693:
 | 
			
		||||
		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;
 | 
			
		||||
		break;
 | 
			
		||||
	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 |
 | 
			
		||||
			TRF7970A_ISO_CTRL_NFC_CE |
 | 
			
		||||
			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;
 | 
			
		||||
	case NFC_DIGITAL_RF_TECH_212F:
 | 
			
		||||
		trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE |
 | 
			
		||||
			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;
 | 
			
		||||
	case NFC_DIGITAL_RF_TECH_424F:
 | 
			
		||||
		trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE |
 | 
			
		||||
			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;
 | 
			
		||||
	default:
 | 
			
		||||
		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 trf7970a *trf;
 | 
			
		||||
	int uvolts, autosuspend_delay, ret;
 | 
			
		||||
	u32 clk_freq = TRF7970A_13MHZ_CLOCK_FREQUENCY;
 | 
			
		||||
 | 
			
		||||
	if (!np) {
 | 
			
		||||
		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"))
 | 
			
		||||
		trf->quirks |= TRF7970A_QUIRK_EN2_MUST_STAY_LOW;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue