162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * NCI based driver for Samsung S3FWRN5 NFC chip
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2015 Samsung Electrnoics
662306a36Sopenharmony_ci * Robert Baldyga <r.baldyga@samsung.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef __LOCAL_S3FWRN5_H_
1062306a36Sopenharmony_ci#define __LOCAL_S3FWRN5_H_
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/nfc.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <net/nfc/nci_core.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include "firmware.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cienum s3fwrn5_mode {
1962306a36Sopenharmony_ci	S3FWRN5_MODE_COLD,
2062306a36Sopenharmony_ci	S3FWRN5_MODE_NCI,
2162306a36Sopenharmony_ci	S3FWRN5_MODE_FW,
2262306a36Sopenharmony_ci};
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistruct s3fwrn5_phy_ops {
2562306a36Sopenharmony_ci	void (*set_wake)(void *id, bool sleep);
2662306a36Sopenharmony_ci	void (*set_mode)(void *id, enum s3fwrn5_mode);
2762306a36Sopenharmony_ci	enum s3fwrn5_mode (*get_mode)(void *id);
2862306a36Sopenharmony_ci	int (*write)(void *id, struct sk_buff *skb);
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistruct s3fwrn5_info {
3262306a36Sopenharmony_ci	struct nci_dev *ndev;
3362306a36Sopenharmony_ci	void *phy_id;
3462306a36Sopenharmony_ci	struct device *pdev;
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	const struct s3fwrn5_phy_ops *phy_ops;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	struct s3fwrn5_fw_info fw_info;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	struct mutex mutex;
4162306a36Sopenharmony_ci};
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistatic inline int s3fwrn5_set_mode(struct s3fwrn5_info *info,
4462306a36Sopenharmony_ci	enum s3fwrn5_mode mode)
4562306a36Sopenharmony_ci{
4662306a36Sopenharmony_ci	if (!info->phy_ops->set_mode)
4762306a36Sopenharmony_ci		return -EOPNOTSUPP;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	info->phy_ops->set_mode(info->phy_id, mode);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	return 0;
5262306a36Sopenharmony_ci}
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistatic inline enum s3fwrn5_mode s3fwrn5_get_mode(struct s3fwrn5_info *info)
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci	if (!info->phy_ops->get_mode)
5762306a36Sopenharmony_ci		return -EOPNOTSUPP;
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	return info->phy_ops->get_mode(info->phy_id);
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistatic inline int s3fwrn5_set_wake(struct s3fwrn5_info *info, bool wake)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	if (!info->phy_ops->set_wake)
6562306a36Sopenharmony_ci		return -EOPNOTSUPP;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	info->phy_ops->set_wake(info->phy_id, wake);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	return 0;
7062306a36Sopenharmony_ci}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistatic inline int s3fwrn5_write(struct s3fwrn5_info *info, struct sk_buff *skb)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	if (!info->phy_ops->write)
7562306a36Sopenharmony_ci		return -EOPNOTSUPP;
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	return info->phy_ops->write(info->phy_id, skb);
7862306a36Sopenharmony_ci}
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ciint s3fwrn5_probe(struct nci_dev **ndev, void *phy_id, struct device *pdev,
8162306a36Sopenharmony_ci	const struct s3fwrn5_phy_ops *phy_ops);
8262306a36Sopenharmony_civoid s3fwrn5_remove(struct nci_dev *ndev);
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ciint s3fwrn5_recv_frame(struct nci_dev *ndev, struct sk_buff *skb,
8562306a36Sopenharmony_ci	enum s3fwrn5_mode mode);
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci#endif /* __LOCAL_S3FWRN5_H_ */
88