NFC: pn544: i2c: Add firmware download mode power-on support
authorEric Lapuyade <eric.lapuyade@linux.intel.com>
Fri, 19 Jul 2013 12:57:13 +0000 (14:57 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Tue, 13 Aug 2013 23:08:12 +0000 (01:08 +0200)
This is in preparation for pn544-i2c firmware download feature, where we
need to know if we're in regular or firmware upload mode.

Signed-off-by: Eric Lapuyade <eric.lapuyade@intel.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/nfc/pn544/i2c.c
drivers/nfc/pn544/pn544.c
drivers/nfc/pn544/pn544.h

index 8cf64c1..e09c898 100644 (file)
@@ -65,6 +65,7 @@ struct pn544_i2c_phy {
        unsigned int en_polarity;
 
        int powered;
+       int run_mode;
 
        int hard_fault;         /*
                                 * < 0 if hardware error occured (e.g. i2c err)
@@ -122,15 +123,22 @@ out:
        gpio_set_value(phy->gpio_en, !phy->en_polarity);
 }
 
+static void pn544_hci_i2c_enable_mode(struct pn544_i2c_phy *phy, int run_mode)
+{
+       gpio_set_value(phy->gpio_fw, run_mode == PN544_FW_MODE ? 1 : 0);
+       gpio_set_value(phy->gpio_en, phy->en_polarity);
+       usleep_range(10000, 15000);
+
+       phy->run_mode = run_mode;
+}
+
 static int pn544_hci_i2c_enable(void *phy_id)
 {
        struct pn544_i2c_phy *phy = phy_id;
 
        pr_info(DRIVER_DESC ": %s\n", __func__);
 
-       gpio_set_value(phy->gpio_fw, 0);
-       gpio_set_value(phy->gpio_en, phy->en_polarity);
-       usleep_range(10000, 15000);
+       pn544_hci_i2c_enable_mode(phy, PN544_HCI_MODE);
 
        phy->powered = 1;
 
index 0d17da7..1d4b38c 100644 (file)
@@ -31,9 +31,6 @@
 /* Timing restrictions (ms) */
 #define PN544_HCI_RESETVEN_TIME                30
 
-#define HCI_MODE 0
-#define FW_MODE 1
-
 enum pn544_state {
        PN544_ST_COLD,
        PN544_ST_FW_READY,
index f47c645..d689f0a 100644 (file)
@@ -24,6 +24,9 @@
 
 #define DRIVER_DESC "HCI NFC driver for PN544"
 
+#define PN544_HCI_MODE 0
+#define PN544_FW_MODE 1
+
 int pn544_hci_probe(void *phy_id, struct nfc_phy_ops *phy_ops, char *llc_name,
                    int phy_headroom, int phy_tailroom, int phy_payload,
                    struct nfc_hci_dev **hdev);