summaryrefslogtreecommitdiffstats
path: root/drivers/nfc
diff options
context:
space:
mode:
authorMark A. Greer <mgreer@animalcreek.com>2014-03-25 08:54:36 -0700
committerSamuel Ortiz <sameo@linux.intel.com>2014-04-22 00:37:27 +0200
commitebcc5a0d08e6a680558ed74f5dd724427ff5a29b (patch)
treebd3d6034c195a32dbe03f5b0f49cca99043e0ce4 /drivers/nfc
parent12e9ade309db51e7ea26be3b4fd5bc6057ddc175 (diff)
downloadlinux-ebcc5a0d08e6a680558ed74f5dd724427ff5a29b.tar.bz2
NFC: trf7970a: Set correct Vin voltage in Chip Status Control register
Currently, the trf7970a driver assumes that the Vin voltage is 5V when it writes to the 'Chip Status Control' register. That may not be correct so use the regulator facility to get the Vin voltage and set the VRS5_3 bit correctly when writing to that register. Signed-off-by: Mark A. Greer <mgreer@animalcreek.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/nfc')
-rw-r--r--drivers/nfc/trf7970a.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/nfc/trf7970a.c b/drivers/nfc/trf7970a.c
index 352aaab807b6..203d86fb1d54 100644
--- a/drivers/nfc/trf7970a.c
+++ b/drivers/nfc/trf7970a.c
@@ -336,6 +336,7 @@ struct trf7970a {
struct sk_buff *rx_skb;
nfc_digital_cmd_complete_t cb;
void *cb_arg;
+ u8 chip_status_ctrl;
u8 iso_ctrl;
u8 iso_ctrl_tech;
u8 modulator_sys_clk_ctrl;
@@ -779,8 +780,7 @@ static int trf7970a_init(struct trf7970a *trf)
trf->special_fcn_reg1 = 0;
ret = trf7970a_write(trf, TRF7970A_CHIP_STATUS_CTRL,
- TRF7970A_CHIP_STATUS_RF_ON |
- TRF7970A_CHIP_STATUS_VRS5_3);
+ trf->chip_status_ctrl | TRF7970A_CHIP_STATUS_RF_ON);
if (ret)
goto err_out;
@@ -1245,7 +1245,7 @@ static int trf7970a_probe(struct spi_device *spi)
struct device_node *np = spi->dev.of_node;
const struct spi_device_id *id = spi_get_device_id(spi);
struct trf7970a *trf;
- int ret;
+ int uvolts, ret;
if (!np) {
dev_err(&spi->dev, "No Device Tree entry\n");
@@ -1315,6 +1315,11 @@ static int trf7970a_probe(struct spi_device *spi)
goto err_destroy_lock;
}
+ uvolts = regulator_get_voltage(trf->regulator);
+
+ if (uvolts > 4000000)
+ trf->chip_status_ctrl = TRF7970A_CHIP_STATUS_VRS5_3;
+
trf->powering_up = true;
trf->ddev = nfc_digital_allocate_device(&trf7970a_nfc_ops,