1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Marvell NFC driver
4  *
5  * Copyright (C) 2014-2015, Marvell International Ltd.
6  */
7 
8 #ifndef _NFCMRVL_H_
9 #define _NFCMRVL_H_
10 
11 #include <linux/platform_data/nfcmrvl.h>
12 
13 #include "fw_dnld.h"
14 
15 /* Define private flags: */
16 #define NFCMRVL_NCI_RUNNING			1
17 #define NFCMRVL_PHY_ERROR			2
18 
19 #define NFCMRVL_EXT_COEX_ID			0xE0
20 #define NFCMRVL_NOT_ALLOWED_ID			0xE1
21 #define NFCMRVL_ACTIVE_ID			0xE2
22 #define NFCMRVL_EXT_COEX_ENABLE			1
23 #define NFCMRVL_GPIO_PIN_NFC_NOT_ALLOWED	0xA
24 #define NFCMRVL_GPIO_PIN_NFC_ACTIVE		0xB
25 #define NFCMRVL_NCI_MAX_EVENT_SIZE		260
26 
27 /*
28  * NCI FW Parameters
29  */
30 
31 #define NFCMRVL_PB_BAIL_OUT			0x11
32 #define NFCMRVL_PROP_REF_CLOCK			0xF0
33 #define NFCMRVL_PROP_SET_HI_CONFIG		0xF1
34 
35 /*
36  * HCI defines
37  */
38 
39 #define NFCMRVL_HCI_EVENT_HEADER_SIZE		0x04
40 #define NFCMRVL_HCI_EVENT_CODE			0x04
41 #define NFCMRVL_HCI_NFC_EVENT_CODE		0xFF
42 #define NFCMRVL_HCI_COMMAND_CODE		0x01
43 #define NFCMRVL_HCI_OGF				0x81
44 #define NFCMRVL_HCI_OCF				0xFE
45 
46 enum nfcmrvl_phy {
47 	NFCMRVL_PHY_USB		= 0,
48 	NFCMRVL_PHY_UART	= 1,
49 	NFCMRVL_PHY_I2C		= 2,
50 	NFCMRVL_PHY_SPI		= 3,
51 };
52 
53 struct nfcmrvl_private {
54 
55 	unsigned long flags;
56 
57 	/* Platform configuration */
58 	struct nfcmrvl_platform_data config;
59 
60 	/* Parent dev */
61 	struct nci_dev *ndev;
62 
63 	/* FW download context */
64 	struct nfcmrvl_fw_dnld fw_dnld;
65 
66 	/* FW download support */
67 	bool support_fw_dnld;
68 
69 	/*
70 	 * PHY related information
71 	 */
72 
73 	/* PHY driver context */
74 	void *drv_data;
75 	/* PHY device */
76 	struct device *dev;
77 	/* PHY type */
78 	enum nfcmrvl_phy phy;
79 	/* Low level driver ops */
80 	const struct nfcmrvl_if_ops *if_ops;
81 };
82 
83 struct nfcmrvl_if_ops {
84 	int (*nci_open) (struct nfcmrvl_private *priv);
85 	int (*nci_close) (struct nfcmrvl_private *priv);
86 	int (*nci_send) (struct nfcmrvl_private *priv, struct sk_buff *skb);
87 	void (*nci_update_config)(struct nfcmrvl_private *priv,
88 				  const void *param);
89 };
90 
91 void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv);
92 int nfcmrvl_nci_recv_frame(struct nfcmrvl_private *priv, struct sk_buff *skb);
93 struct nfcmrvl_private *nfcmrvl_nci_register_dev(enum nfcmrvl_phy phy,
94 				void *drv_data,
95 				const struct nfcmrvl_if_ops *ops,
96 				struct device *dev,
97 				const struct nfcmrvl_platform_data *pdata);
98 
99 
100 void nfcmrvl_chip_reset(struct nfcmrvl_private *priv);
101 void nfcmrvl_chip_halt(struct nfcmrvl_private *priv);
102 
103 int nfcmrvl_parse_dt(struct device_node *node,
104 		     struct nfcmrvl_platform_data *pdata);
105 
106 #endif
107