diff options
Diffstat (limited to 'drivers/nfc/nfcmrvl/main.c')
-rw-r--r-- | drivers/nfc/nfcmrvl/main.c | 66 |
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 | ||
94 | struct nfcmrvl_private *nfcmrvl_nci_register_dev(void *drv_data, | 95 | struct 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 | ||
170 | int nfcmrvl_nci_recv_frame(struct nfcmrvl_private *priv, struct sk_buff *skb) | 172 | int 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 | |||
216 | int 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 | |||
241 | int nfcmrvl_parse_dt(struct device_node *node, | ||
242 | struct nfcmrvl_platform_data *pdata) | ||
243 | { | ||
244 | return -ENODEV; | ||
245 | } | ||
246 | |||
247 | #endif | ||
248 | EXPORT_SYMBOL_GPL(nfcmrvl_parse_dt); | ||
249 | |||
212 | MODULE_AUTHOR("Marvell International Ltd."); | 250 | MODULE_AUTHOR("Marvell International Ltd."); |
213 | MODULE_DESCRIPTION("Marvell NFC driver ver " VERSION); | 251 | MODULE_DESCRIPTION("Marvell NFC driver ver " VERSION); |
214 | MODULE_VERSION(VERSION); | 252 | MODULE_VERSION(VERSION); |