Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dc14bdef authored by Vincent Cuissard's avatar Vincent Cuissard Committed by Samuel Ortiz
Browse files

NFC: nfcmrvl: add platform_data and DT configuration



Declare nfcmrvl platform_data structure and few DT parameters
for nfcmrvl driver.

Signed-off-by: default avatarVincent Cuissard <cuissard@marvell.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 9961127d
Loading
Loading
Loading
Loading
+52 −14
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <linux/module.h>
#include <linux/gpio.h>
#include <linux/delay.h>
#include <linux/of_gpio.h>
#include <linux/nfc.h>
#include <net/nfc/nci.h>
#include <net/nfc/nci_core.h>
@@ -65,7 +66,7 @@ static int nfcmrvl_nci_send(struct nci_dev *ndev, struct sk_buff *skb)
	if (!test_bit(NFCMRVL_NCI_RUNNING, &priv->flags))
		return -EBUSY;

	if (priv->hci_muxed) {
	if (priv->config.hci_muxed) {
		unsigned char *hdr;
		unsigned char len = skb->len;

@@ -94,7 +95,7 @@ static struct nci_ops nfcmrvl_nci_ops = {
struct nfcmrvl_private *nfcmrvl_nci_register_dev(void *drv_data,
				struct nfcmrvl_if_ops *ops,
				struct device *dev,
						 unsigned int flags)
				struct nfcmrvl_platform_data *pdata)
{
	struct nfcmrvl_private *priv;
	int rc;
@@ -108,23 +109,24 @@ struct nfcmrvl_private *nfcmrvl_nci_register_dev(void *drv_data,
	priv->drv_data = drv_data;
	priv->if_ops = ops;
	priv->dev = dev;
	priv->hci_muxed = (flags & NFCMRVL_DEV_FLAG_HCI_MUXED) ? 1 : 0;
	priv->reset_n_io = NFCMRVL_DEV_FLAG_GET_RESET_N_IO(flags);

	if (priv->reset_n_io) {
	memcpy(&priv->config, pdata, sizeof(*pdata));

	if (priv->config.reset_n_io) {
		rc = devm_gpio_request_one(dev,
					   priv->reset_n_io,
					   priv->config.reset_n_io,
					   GPIOF_OUT_INIT_LOW,
					   "nfcmrvl_reset_n");
		if (rc < 0)
			nfc_err(dev, "failed to request reset_n io\n");
	}

	if (priv->hci_muxed)
	if (priv->config.hci_muxed)
		headroom = NFCMRVL_HCI_EVENT_HEADER_SIZE;

	protocols = NFC_PROTO_JEWEL_MASK
		| NFC_PROTO_MIFARE_MASK | NFC_PROTO_FELICA_MASK
		| NFC_PROTO_MIFARE_MASK
		| NFC_PROTO_FELICA_MASK
		| NFC_PROTO_ISO14443_MASK
		| NFC_PROTO_ISO14443_B_MASK
		| NFC_PROTO_NFC_DEP_MASK;
@@ -169,7 +171,7 @@ EXPORT_SYMBOL_GPL(nfcmrvl_nci_unregister_dev);

int nfcmrvl_nci_recv_frame(struct nfcmrvl_private *priv, struct sk_buff *skb)
{
	if (priv->hci_muxed) {
	if (priv->config.hci_muxed) {
		if (skb->data[0] == NFCMRVL_HCI_EVENT_CODE &&
		    skb->data[1] == NFCMRVL_HCI_NFC_EVENT_CODE) {
			/* Data packet, let's extract NCI payload */
@@ -200,15 +202,51 @@ void nfcmrvl_chip_reset(struct nfcmrvl_private *priv)
	 * To be improved.
	 */

	if (priv->reset_n_io) {
	if (priv->config.reset_n_io) {
		nfc_info(priv->dev, "reset the chip\n");
		gpio_set_value(priv->reset_n_io, 0);
		gpio_set_value(priv->config.reset_n_io, 0);
		usleep_range(5000, 10000);
		gpio_set_value(priv->reset_n_io, 1);
		gpio_set_value(priv->config.reset_n_io, 1);
	} else
		nfc_info(priv->dev, "no reset available on this interface\n");
}

#ifdef CONFIG_OF

int nfcmrvl_parse_dt(struct device_node *node,
		     struct nfcmrvl_platform_data *pdata)
{
	int reset_n_io;

	reset_n_io = of_get_named_gpio(node, "reset-n-io", 0);
	if (reset_n_io < 0) {
		pr_info("no reset-n-io config\n");
		reset_n_io = 0;
	} else if (!gpio_is_valid(reset_n_io)) {
		pr_err("invalid reset-n-io GPIO\n");
		return reset_n_io;
	}
	pdata->reset_n_io = reset_n_io;

	if (of_find_property(node, "hci-muxed", NULL))
		pdata->hci_muxed = 1;
	else
		pdata->hci_muxed = 0;

	return 0;
}

#else

int nfcmrvl_parse_dt(struct device_node *node,
		     struct nfcmrvl_platform_data *pdata)
{
	return -ENODEV;
}

#endif
EXPORT_SYMBOL_GPL(nfcmrvl_parse_dt);

MODULE_AUTHOR("Marvell International Ltd.");
MODULE_DESCRIPTION("Marvell NFC driver ver " VERSION);
MODULE_VERSION(VERSION);
+25 −11
Original line number Diff line number Diff line
@@ -16,6 +16,11 @@
 * this warranty disclaimer.
 **/

#ifndef _NFCMRVL_H_
#define _NFCMRVL_H_

#include <linux/platform_data/nfcmrvl.h>

/* Define private flags: */
#define NFCMRVL_NCI_RUNNING			1

@@ -38,22 +43,25 @@
#define NFCMRVL_HCI_OGF				0x81
#define NFCMRVL_HCI_OCF				0xFE

#define NFCMRVL_DEV_FLAG_HCI_MUXED		(1 << 0)
#define NFCMRVL_DEV_FLAG_SET_RESET_N_IO(X)	((X) << 16)
#define NFCMRVL_DEV_FLAG_GET_RESET_N_IO(X)	((X) >> 16)

struct nfcmrvl_private {

	/* Tell if NCI packets are encapsulated in HCI ones */
	int hci_muxed;
	unsigned long flags;

	/* Platform configuration */
	struct nfcmrvl_platform_data config;

	struct nci_dev *ndev;

	/* Reset IO (0 if not available) */
	int reset_n_io;
	/*
	** PHY related information
	*/

	unsigned long flags;
	/* PHY driver context */
	void *drv_data;
	/* PHY device */
	struct device *dev;
	/* Low level driver ops */
	struct nfcmrvl_if_ops *if_ops;
};

@@ -68,6 +76,12 @@ int nfcmrvl_nci_recv_frame(struct nfcmrvl_private *priv, struct sk_buff *skb);
struct nfcmrvl_private *nfcmrvl_nci_register_dev(void *drv_data,
				struct nfcmrvl_if_ops *ops,
				struct device *dev,
						 unsigned int flags);
				struct nfcmrvl_platform_data *pdata);


void nfcmrvl_chip_reset(struct nfcmrvl_private *priv);

int nfcmrvl_parse_dt(struct device_node *node,
		     struct nfcmrvl_platform_data *pdata);

#endif
+5 −1
Original line number Diff line number Diff line
@@ -302,6 +302,10 @@ static int nfcmrvl_probe(struct usb_interface *intf,
	struct nfcmrvl_private *priv;
	int i;
	struct usb_device *udev = interface_to_usbdev(intf);
	struct nfcmrvl_platform_data config;

	/* No configuration for USB */
	memset(&config, 0, sizeof(config));

	nfc_info(&udev->dev, "intf %p id %p\n", intf, id);

@@ -339,7 +343,7 @@ static int nfcmrvl_probe(struct usb_interface *intf,
	init_usb_anchor(&drv_data->deferred);

	priv = nfcmrvl_nci_register_dev(drv_data, &usb_ops,
					&drv_data->udev->dev, 0);
					&drv_data->udev->dev, &config);
	if (IS_ERR(priv))
		return PTR_ERR(priv);

+31 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2015, Marvell International Ltd.
 *
 * This software file (the "File") is distributed by Marvell International
 * Ltd. under the terms of the GNU General Public License Version 2, June 1991
 * (the "License").  You may use, redistribute and/or modify this File in
 * accordance with the terms and conditions of the License, a copy of which
 * is available on the worldwide web at
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
 *
 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
 * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
 * this warranty disclaimer.
 */

#ifndef _NFCMRVL_PTF_H_
#define _NFCMRVL_PTF_H_

struct nfcmrvl_platform_data {
	/*
	 * Generic
	 */

	/* GPIO that is wired to RESET_N signal */
	unsigned int reset_n_io;
	/* Tell if transport is muxed in HCI one */
	unsigned int hci_muxed;
};

#endif /* _NFCMRVL_PTF_H_ */