1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * NCI based driver for Samsung S3FWRN5 NFC chip |
4 | * |
5 | * Copyright (C) 2015 Samsung Electrnoics |
6 | * Robert Baldyga <r.baldyga@samsung.com> |
7 | */ |
8 | |
9 | #ifndef __LOCAL_S3FWRN5_H_ |
10 | #define __LOCAL_S3FWRN5_H_ |
11 | |
12 | #include <linux/nfc.h> |
13 | |
14 | #include <net/nfc/nci_core.h> |
15 | |
16 | #include "firmware.h" |
17 | |
18 | enum s3fwrn5_mode { |
19 | S3FWRN5_MODE_COLD, |
20 | S3FWRN5_MODE_NCI, |
21 | S3FWRN5_MODE_FW, |
22 | }; |
23 | |
24 | struct s3fwrn5_phy_ops { |
25 | void (*set_wake)(void *id, bool sleep); |
26 | void (*set_mode)(void *id, enum s3fwrn5_mode); |
27 | enum s3fwrn5_mode (*get_mode)(void *id); |
28 | int (*write)(void *id, struct sk_buff *skb); |
29 | }; |
30 | |
31 | struct s3fwrn5_info { |
32 | struct nci_dev *ndev; |
33 | void *phy_id; |
34 | struct device *pdev; |
35 | |
36 | const struct s3fwrn5_phy_ops *phy_ops; |
37 | |
38 | struct s3fwrn5_fw_info fw_info; |
39 | |
40 | struct mutex mutex; |
41 | }; |
42 | |
43 | static inline int s3fwrn5_set_mode(struct s3fwrn5_info *info, |
44 | enum s3fwrn5_mode mode) |
45 | { |
46 | if (!info->phy_ops->set_mode) |
47 | return -EOPNOTSUPP; |
48 | |
49 | info->phy_ops->set_mode(info->phy_id, mode); |
50 | |
51 | return 0; |
52 | } |
53 | |
54 | static inline enum s3fwrn5_mode s3fwrn5_get_mode(struct s3fwrn5_info *info) |
55 | { |
56 | if (!info->phy_ops->get_mode) |
57 | return -EOPNOTSUPP; |
58 | |
59 | return info->phy_ops->get_mode(info->phy_id); |
60 | } |
61 | |
62 | static inline int s3fwrn5_set_wake(struct s3fwrn5_info *info, bool wake) |
63 | { |
64 | if (!info->phy_ops->set_wake) |
65 | return -EOPNOTSUPP; |
66 | |
67 | info->phy_ops->set_wake(info->phy_id, wake); |
68 | |
69 | return 0; |
70 | } |
71 | |
72 | static inline int s3fwrn5_write(struct s3fwrn5_info *info, struct sk_buff *skb) |
73 | { |
74 | if (!info->phy_ops->write) |
75 | return -EOPNOTSUPP; |
76 | |
77 | return info->phy_ops->write(info->phy_id, skb); |
78 | } |
79 | |
80 | int s3fwrn5_probe(struct nci_dev **ndev, void *phy_id, struct device *pdev, |
81 | const struct s3fwrn5_phy_ops *phy_ops); |
82 | void s3fwrn5_remove(struct nci_dev *ndev); |
83 | |
84 | int s3fwrn5_recv_frame(struct nci_dev *ndev, struct sk_buff *skb, |
85 | enum s3fwrn5_mode mode); |
86 | |
87 | #endif /* __LOCAL_S3FWRN5_H_ */ |
88 | |