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