18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * NCI based driver for Samsung S3FWRN5 NFC chip
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2015 Samsung Electrnoics
68c2ecf20Sopenharmony_ci * Robert Baldyga <r.baldyga@samsung.com>
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifndef __LOCAL_S3FWRN5_H_
108c2ecf20Sopenharmony_ci#define __LOCAL_S3FWRN5_H_
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/nfc.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <net/nfc/nci_core.h>
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#include "firmware.h"
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_cienum s3fwrn5_mode {
198c2ecf20Sopenharmony_ci	S3FWRN5_MODE_COLD,
208c2ecf20Sopenharmony_ci	S3FWRN5_MODE_NCI,
218c2ecf20Sopenharmony_ci	S3FWRN5_MODE_FW,
228c2ecf20Sopenharmony_ci};
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_cistruct s3fwrn5_phy_ops {
258c2ecf20Sopenharmony_ci	void (*set_wake)(void *id, bool sleep);
268c2ecf20Sopenharmony_ci	void (*set_mode)(void *id, enum s3fwrn5_mode);
278c2ecf20Sopenharmony_ci	enum s3fwrn5_mode (*get_mode)(void *id);
288c2ecf20Sopenharmony_ci	int (*write)(void *id, struct sk_buff *skb);
298c2ecf20Sopenharmony_ci};
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistruct s3fwrn5_info {
328c2ecf20Sopenharmony_ci	struct nci_dev *ndev;
338c2ecf20Sopenharmony_ci	void *phy_id;
348c2ecf20Sopenharmony_ci	struct device *pdev;
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci	const struct s3fwrn5_phy_ops *phy_ops;
378c2ecf20Sopenharmony_ci	unsigned int max_payload;
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	struct s3fwrn5_fw_info fw_info;
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	struct mutex mutex;
428c2ecf20Sopenharmony_ci};
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cistatic inline int s3fwrn5_set_mode(struct s3fwrn5_info *info,
458c2ecf20Sopenharmony_ci	enum s3fwrn5_mode mode)
468c2ecf20Sopenharmony_ci{
478c2ecf20Sopenharmony_ci	if (!info->phy_ops->set_mode)
488c2ecf20Sopenharmony_ci		return -ENOTSUPP;
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci	info->phy_ops->set_mode(info->phy_id, mode);
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci	return 0;
538c2ecf20Sopenharmony_ci}
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_cistatic inline enum s3fwrn5_mode s3fwrn5_get_mode(struct s3fwrn5_info *info)
568c2ecf20Sopenharmony_ci{
578c2ecf20Sopenharmony_ci	if (!info->phy_ops->get_mode)
588c2ecf20Sopenharmony_ci		return -ENOTSUPP;
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci	return info->phy_ops->get_mode(info->phy_id);
618c2ecf20Sopenharmony_ci}
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_cistatic inline int s3fwrn5_set_wake(struct s3fwrn5_info *info, bool wake)
648c2ecf20Sopenharmony_ci{
658c2ecf20Sopenharmony_ci	if (!info->phy_ops->set_wake)
668c2ecf20Sopenharmony_ci		return -ENOTSUPP;
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci	info->phy_ops->set_wake(info->phy_id, wake);
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci	return 0;
718c2ecf20Sopenharmony_ci}
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_cistatic inline int s3fwrn5_write(struct s3fwrn5_info *info, struct sk_buff *skb)
748c2ecf20Sopenharmony_ci{
758c2ecf20Sopenharmony_ci	if (!info->phy_ops->write)
768c2ecf20Sopenharmony_ci		return -ENOTSUPP;
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci	return info->phy_ops->write(info->phy_id, skb);
798c2ecf20Sopenharmony_ci}
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ciint s3fwrn5_probe(struct nci_dev **ndev, void *phy_id, struct device *pdev,
828c2ecf20Sopenharmony_ci	const struct s3fwrn5_phy_ops *phy_ops, unsigned int max_payload);
838c2ecf20Sopenharmony_civoid s3fwrn5_remove(struct nci_dev *ndev);
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ciint s3fwrn5_recv_frame(struct nci_dev *ndev, struct sk_buff *skb,
868c2ecf20Sopenharmony_ci	enum s3fwrn5_mode mode);
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci#endif /* __LOCAL_S3FWRN5_H_ */
89