aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/nfc/nfcmrvl/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/nfc/nfcmrvl/main.c')
-rw-r--r--drivers/nfc/nfcmrvl/main.c66
1 files changed, 52 insertions, 14 deletions
diff --git a/drivers/nfc/nfcmrvl/main.c b/drivers/nfc/nfcmrvl/main.c
index 708aad28c567..e317a69a4560 100644
--- a/drivers/nfc/nfcmrvl/main.c
+++ b/drivers/nfc/nfcmrvl/main.c
@@ -19,6 +19,7 @@
19#include <linux/module.h> 19#include <linux/module.h>
20#include <linux/gpio.h> 20#include <linux/gpio.h>
21#include <linux/delay.h> 21#include <linux/delay.h>
22#include <linux/of_gpio.h>
22#include <linux/nfc.h> 23#include <linux/nfc.h>
23#include <net/nfc/nci.h> 24#include <net/nfc/nci.h>
24#include <net/nfc/nci_core.h> 25#include <net/nfc/nci_core.h>
@@ -65,7 +66,7 @@ static int nfcmrvl_nci_send(struct nci_dev *ndev, struct sk_buff *skb)
65 if (!test_bit(NFCMRVL_NCI_RUNNING, &priv->flags)) 66 if (!test_bit(NFCMRVL_NCI_RUNNING, &priv->flags))
66 return -EBUSY; 67 return -EBUSY;
67 68
68 if (priv->hci_muxed) { 69 if (priv->config.hci_muxed) {
69 unsigned char *hdr; 70 unsigned char *hdr;
70 unsigned char len = skb->len; 71 unsigned char len = skb->len;
71 72
@@ -92,9 +93,9 @@ static struct nci_ops nfcmrvl_nci_ops = {
92}; 93};
93 94
94struct nfcmrvl_private *nfcmrvl_nci_register_dev(void *drv_data, 95struct nfcmrvl_private *nfcmrvl_nci_register_dev(void *drv_data,
95 struct nfcmrvl_if_ops *ops, 96 struct nfcmrvl_if_ops *ops,
96 struct device *dev, 97 struct device *dev,
97 unsigned int flags) 98 struct nfcmrvl_platform_data *pdata)
98{ 99{
99 struct nfcmrvl_private *priv; 100 struct nfcmrvl_private *priv;
100 int rc; 101 int rc;
@@ -108,23 +109,24 @@ struct nfcmrvl_private *nfcmrvl_nci_register_dev(void *drv_data,
108 priv->drv_data = drv_data; 109 priv->drv_data = drv_data;
109 priv->if_ops = ops; 110 priv->if_ops = ops;
110 priv->dev = dev; 111 priv->dev = dev;
111 priv->hci_muxed = (flags & NFCMRVL_DEV_FLAG_HCI_MUXED) ? 1 : 0;
112 priv->reset_n_io = NFCMRVL_DEV_FLAG_GET_RESET_N_IO(flags);
113 112
114 if (priv->reset_n_io) { 113 memcpy(&priv->config, pdata, sizeof(*pdata));
114
115 if (priv->config.reset_n_io) {
115 rc = devm_gpio_request_one(dev, 116 rc = devm_gpio_request_one(dev,
116 priv->reset_n_io, 117 priv->config.reset_n_io,
117 GPIOF_OUT_INIT_LOW, 118 GPIOF_OUT_INIT_LOW,
118 "nfcmrvl_reset_n"); 119 "nfcmrvl_reset_n");
119 if (rc < 0) 120 if (rc < 0)
120 nfc_err(dev, "failed to request reset_n io\n"); 121 nfc_err(dev, "failed to request reset_n io\n");
121 } 122 }
122 123
123 if (priv->hci_muxed) 124 if (priv->config.hci_muxed)
124 headroom = NFCMRVL_HCI_EVENT_HEADER_SIZE; 125 headroom = NFCMRVL_HCI_EVENT_HEADER_SIZE;
125 126
126 protocols = NFC_PROTO_JEWEL_MASK 127 protocols = NFC_PROTO_JEWEL_MASK
127 | NFC_PROTO_MIFARE_MASK | NFC_PROTO_FELICA_MASK 128 | NFC_PROTO_MIFARE_MASK
129 | NFC_PROTO_FELICA_MASK
128 | NFC_PROTO_ISO14443_MASK 130 | NFC_PROTO_ISO14443_MASK
129 | NFC_PROTO_ISO14443_B_MASK 131 | NFC_PROTO_ISO14443_B_MASK
130 | NFC_PROTO_NFC_DEP_MASK; 132 | NFC_PROTO_NFC_DEP_MASK;
@@ -169,7 +171,7 @@ EXPORT_SYMBOL_GPL(nfcmrvl_nci_unregister_dev);
169 171
170int nfcmrvl_nci_recv_frame(struct nfcmrvl_private *priv, struct sk_buff *skb) 172int nfcmrvl_nci_recv_frame(struct nfcmrvl_private *priv, struct sk_buff *skb)
171{ 173{
172 if (priv->hci_muxed) { 174 if (priv->config.hci_muxed) {
173 if (skb->data[0] == NFCMRVL_HCI_EVENT_CODE && 175 if (skb->data[0] == NFCMRVL_HCI_EVENT_CODE &&
174 skb->data[1] == NFCMRVL_HCI_NFC_EVENT_CODE) { 176 skb->data[1] == NFCMRVL_HCI_NFC_EVENT_CODE) {
175 /* Data packet, let's extract NCI payload */ 177 /* Data packet, let's extract NCI payload */
@@ -200,15 +202,51 @@ void nfcmrvl_chip_reset(struct nfcmrvl_private *priv)
200 * To be improved. 202 * To be improved.
201 */ 203 */
202 204
203 if (priv->reset_n_io) { 205 if (priv->config.reset_n_io) {
204 nfc_info(priv->dev, "reset the chip\n"); 206 nfc_info(priv->dev, "reset the chip\n");
205 gpio_set_value(priv->reset_n_io, 0); 207 gpio_set_value(priv->config.reset_n_io, 0);
206 usleep_range(5000, 10000); 208 usleep_range(5000, 10000);
207 gpio_set_value(priv->reset_n_io, 1); 209 gpio_set_value(priv->config.reset_n_io, 1);
208 } else 210 } else
209 nfc_info(priv->dev, "no reset available on this interface\n"); 211 nfc_info(priv->dev, "no reset available on this interface\n");
210} 212}
211 213
214#ifdef CONFIG_OF
215
216int nfcmrvl_parse_dt(struct device_node *node,
217 struct nfcmrvl_platform_data *pdata)
218{
219 int reset_n_io;
220
221 reset_n_io = of_get_named_gpio(node, "reset-n-io", 0);
222 if (reset_n_io < 0) {
223 pr_info("no reset-n-io config\n");
224 reset_n_io = 0;
225 } else if (!gpio_is_valid(reset_n_io)) {
226 pr_err("invalid reset-n-io GPIO\n");
227 return reset_n_io;
228 }
229 pdata->reset_n_io = reset_n_io;
230
231 if (of_find_property(node, "hci-muxed", NULL))
232 pdata->hci_muxed = 1;
233 else
234 pdata->hci_muxed = 0;
235
236 return 0;
237}
238
239#else
240
241int nfcmrvl_parse_dt(struct device_node *node,
242 struct nfcmrvl_platform_data *pdata)
243{
244 return -ENODEV;
245}
246
247#endif
248EXPORT_SYMBOL_GPL(nfcmrvl_parse_dt);
249
212MODULE_AUTHOR("Marvell International Ltd."); 250MODULE_AUTHOR("Marvell International Ltd.");
213MODULE_DESCRIPTION("Marvell NFC driver ver " VERSION); 251MODULE_DESCRIPTION("Marvell NFC driver ver " VERSION);
214MODULE_VERSION(VERSION); 252MODULE_VERSION(VERSION);