NFC: pn544: Add firmware operations hci ops
authorEric Lapuyade <eric.lapuyade@linux.intel.com>
Fri, 19 Jul 2013 12:58:39 +0000 (14:58 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Tue, 13 Aug 2013 23:13:33 +0000 (01:13 +0200)
The firmware operation callback is passed by the physical layer to the
hci driver during probe. All the driver does is to store it and call it
when the fw_upload hci ops is invoked.

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/mei.c
drivers/nfc/pn544/pn544.c
drivers/nfc/pn544/pn544.h

index e09c8982596c3354fcf6e7527b0fae4962d30fe2..017dc61effc824145f7d5206b3f86087ab0e9c15 100644 (file)
@@ -428,7 +428,7 @@ static int pn544_hci_i2c_probe(struct i2c_client *client,
 
        r = pn544_hci_probe(phy, &i2c_phy_ops, LLC_SHDLC_NAME,
                            PN544_I2C_FRAME_HEADROOM, PN544_I2C_FRAME_TAILROOM,
-                           PN544_HCI_I2C_LLC_MAX_PAYLOAD, &phy->hdev);
+                           PN544_HCI_I2C_LLC_MAX_PAYLOAD, NULL, &phy->hdev);
        if (r < 0)
                goto err_hci;
 
index b5d3d18179eb1da92d35700a8f06fd91ad6a7666..ee67de50c36fc47d57551db072f6c9a474ae8afc 100644 (file)
@@ -45,7 +45,7 @@ static int pn544_mei_probe(struct mei_cl_device *device,
 
        r = pn544_hci_probe(phy, &mei_phy_ops, LLC_NOP_NAME,
                            MEI_NFC_HEADER_SIZE, 0, MEI_NFC_MAX_HCI_PAYLOAD,
-                           &phy->hdev);
+                           NULL, &phy->hdev);
        if (r < 0) {
                nfc_mei_phy_free(phy);
 
index 1d4b38c036fb97233e7ddaf25c39fbe83bb80e35..078e62feba1715e9c4cc3bfd246e6c947082735b 100644 (file)
@@ -127,6 +127,8 @@ struct pn544_hci_info {
        int async_cb_type;
        data_exchange_cb_t async_cb;
        void *async_cb_context;
+
+       fw_download_t fw_download;
 };
 
 static int pn544_hci_open(struct nfc_hci_dev *hdev)
@@ -779,6 +781,17 @@ exit:
        return r;
 }
 
+static int pn544_hci_fw_download(struct nfc_hci_dev *hdev,
+                                const char *firmware_name)
+{
+       struct pn544_hci_info *info = nfc_hci_get_clientdata(hdev);
+
+       if (info->fw_download == NULL)
+               return -ENOTSUPP;
+
+       return info->fw_download(info->phy_id, firmware_name);
+}
+
 static struct nfc_hci_ops pn544_hci_ops = {
        .open = pn544_hci_open,
        .close = pn544_hci_close,
@@ -793,11 +806,12 @@ static struct nfc_hci_ops pn544_hci_ops = {
        .tm_send = pn544_hci_tm_send,
        .check_presence = pn544_hci_check_presence,
        .event_received = pn544_hci_event_received,
+       .fw_download = pn544_hci_fw_download,
 };
 
 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)
+                   fw_download_t fw_download, struct nfc_hci_dev **hdev)
 {
        struct pn544_hci_info *info;
        u32 protocols;
@@ -813,6 +827,7 @@ int pn544_hci_probe(void *phy_id, struct nfc_phy_ops *phy_ops, char *llc_name,
 
        info->phy_ops = phy_ops;
        info->phy_id = phy_id;
+       info->fw_download = fw_download;
        info->state = PN544_ST_COLD;
        mutex_init(&info->info_lock);
 
index d689f0ac64aa59e90974d480f9b2dc9a9f6fa87c..01020e5854437e29b5bb254e14b2e920eefb29fc 100644 (file)
 #define PN544_HCI_MODE 0
 #define PN544_FW_MODE 1
 
+typedef int (*fw_download_t)(void *context, const char *firmware_name);
+
 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);
+                   fw_download_t fw_download, struct nfc_hci_dev **hdev);
 void pn544_hci_remove(struct nfc_hci_dev *hdev);
 
 #endif /* __LOCAL_PN544_H_ */
This page took 0.039528 seconds and 5 git commands to generate.