linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Kishon Vijay Abraham I <kishon@ti.com>
To: Bjorn Helgaas <bhelgaas@google.com>,
	Jonathan Corbet <corbet@lwn.net>,
	Rob Herring <robh+dt@kernel.org>, Jon Mason <jdmason@kudzu.us>,
	Dave Jiang <dave.jiang@intel.com>,
	Allen Hubbe <allenbh@gmail.com>,
	Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Mark Rutland <mark.rutland@arm.com>, <kishon@ti.com>,
	<linux-pci@vger.kernel.org>, <linux-doc@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>, <devicetree@vger.kernel.org>,
	<linux-ntb@googlegroups.com>
Subject: [RFC PATCH 06/21] PCI: endpoint: Add API to create EPF device from device tree
Date: Thu, 26 Sep 2019 16:59:18 +0530	[thread overview]
Message-ID: <20190926112933.8922-7-kishon@ti.com> (raw)
In-Reply-To: <20190926112933.8922-1-kishon@ti.com>

Add API to create EPF device from device tree and the device managed
interface corresponding to it. This is added in order to define
an endpoint function completely from device tree.

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
 drivers/pci/endpoint/pci-epf-core.c | 68 +++++++++++++++++++++++++++++
 include/linux/pci-epf.h             |  6 +++
 2 files changed, 74 insertions(+)

diff --git a/drivers/pci/endpoint/pci-epf-core.c b/drivers/pci/endpoint/pci-epf-core.c
index 16feff8cad50..c74c7cc6d8bd 100644
--- a/drivers/pci/endpoint/pci-epf-core.c
+++ b/drivers/pci/endpoint/pci-epf-core.c
@@ -529,6 +529,73 @@ struct pci_epf *pci_epf_create(const char *name)
 }
 EXPORT_SYMBOL_GPL(pci_epf_create);
 
+/**
+ * pci_epf_of_create() - create a new PCI EPF device from device tree node
+ * @node: the device node of the PCI EPF device.
+ *
+ * Invoke to create a new PCI EPF device by providing a device tree node
+ * with compatible property.
+ */
+struct pci_epf *pci_epf_of_create(struct device_node *node)
+{
+	struct pci_epf *epf;
+	const char *compat;
+	int ret;
+
+	of_node_get(node);
+
+	ret = of_property_read_string(node, "compatible", &compat);
+	if (ret) {
+		of_node_put(node);
+		return ERR_PTR(ret);
+	}
+
+	epf = pci_epf_create(compat);
+	if (!IS_ERR(epf))
+		epf->node = node;
+
+	return epf;
+}
+EXPORT_SYMBOL_GPL(pci_epf_of_create);
+
+static void devm_epf_release(struct device *dev, void *res)
+{
+	struct pci_epf *epf = *(struct pci_epf **)res;
+
+	pci_epf_destroy(epf);
+}
+
+/**
+ * devm_pci_epf_of_create() - create a new PCI EPF device from device tree node
+ * @dev: device that is creating the new EPF
+ * @node: the device node of the PCI EPF device.
+ *
+ * Invoke to create a new PCI EPF device by providing a device tree node with
+ * compatible property. While at that, it also associates the device with the
+ * EPF using devres. On driver detach, release function is invoked on the devres
+ * data, where devres data is freed.
+ */
+struct pci_epf *devm_pci_epf_of_create(struct device *dev,
+				       struct device_node *node)
+{
+	struct pci_epf **ptr, *epf;
+
+	ptr = devres_alloc(devm_epf_release, sizeof(*ptr), GFP_KERNEL);
+	if (!ptr)
+		return ERR_PTR(-ENOMEM);
+
+	epf = pci_epf_of_create(node);
+	if (!IS_ERR(epf)) {
+		*ptr = epf;
+		devres_add(dev, ptr);
+	} else {
+		devres_free(ptr);
+	}
+
+	return epf;
+}
+EXPORT_SYMBOL_GPL(devm_pci_epf_of_create);
+
 const struct pci_epf_device_id *
 pci_epf_match_device(const struct pci_epf_device_id *id, struct pci_epf *epf)
 {
@@ -549,6 +616,7 @@ static void pci_epf_dev_release(struct device *dev)
 {
 	struct pci_epf *epf = to_pci_epf(dev);
 
+	of_node_put(epf->node);
 	kfree(epf->name);
 	kfree(epf);
 }
diff --git a/include/linux/pci-epf.h b/include/linux/pci-epf.h
index 02090eb41563..7e997fb656fb 100644
--- a/include/linux/pci-epf.h
+++ b/include/linux/pci-epf.h
@@ -11,6 +11,7 @@
 
 #include <linux/device.h>
 #include <linux/mod_devicetable.h>
+#include <linux/of.h>
 #include <linux/pci.h>
 
 struct pci_epf;
@@ -101,6 +102,7 @@ struct pci_epf_bar {
 /**
  * struct pci_epf - represents the PCI EPF device
  * @dev: the PCI EPF device
+ * @node: the device tree node of the PCI EPF device
  * @name: the name of the PCI EPF device
  * @header: represents standard configuration header
  * @bar: represents the BAR of EPF device
@@ -125,6 +127,7 @@ struct pci_epf_bar {
  */
 struct pci_epf {
 	struct device		dev;
+	struct device_node	*node;
 	const char		*name;
 	struct pci_epf_header	*header;
 	struct pci_epf_bar	bar[6];
@@ -167,6 +170,9 @@ static inline void *epf_get_drvdata(struct pci_epf *epf)
 const struct pci_epf_device_id *
 pci_epf_match_device(const struct pci_epf_device_id *id, struct pci_epf *epf);
 struct pci_epf *pci_epf_create(const char *name);
+struct pci_epf *pci_epf_of_create(struct device_node *node);
+struct pci_epf *devm_pci_epf_of_create(struct device *dev,
+				       struct device_node *node);
 void pci_epf_destroy(struct pci_epf *epf);
 int __pci_epf_register_driver(struct pci_epf_driver *driver,
 			      struct module *owner);
-- 
2.17.1


  parent reply	other threads:[~2019-09-26 11:32 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-26 11:29 [RFC PATCH 00/21] Implement NTB Controller using multiple PCI Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 01/21] dt-bindings: PCI: Endpoint: Add DT bindings for PCI EPF Bus Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 02/21] dt-bindings: PCI: Endpoint: Add DT bindings for PCI EPF Device Kishon Vijay Abraham I
2019-10-15 18:42   ` Rob Herring
2019-10-16  4:45     ` Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 03/21] dt-bindings: PCI: Endpoint: Add DT bindings for PCI EPF NTB Device Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 04/21] Documentation: PCI: Add specification for the *PCI NTB* function device Kishon Vijay Abraham I
2019-11-17 23:26   ` Jon Mason
2019-09-26 11:29 ` [RFC PATCH 05/21] PCI: endpoint: Add API to get reference to EPC from device-tree Kishon Vijay Abraham I
2019-11-17 23:28   ` Jon Mason
2019-09-26 11:29 ` Kishon Vijay Abraham I [this message]
2019-09-26 11:29 ` [RFC PATCH 07/21] PCI: endpoint: Add "pci-epf-bus" driver Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 08/21] PCI: endpoint: Make *_get_first_free_bar() take into account 64 bit BAR Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 09/21] PCI: endpoint: Add helper API to get the 'next' unreserved BAR Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 10/21] PCI: endpoint: Make pci_epf_driver ops optional Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 11/21] PCI: endpoint: Add helper API to populate header with values from DT Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 12/21] PCI: endpoint: Add support to associate secondary EPC with EPF Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 13/21] PCI: endpoint: Add pci_epc_ops to map MSI irq Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 14/21] PCI: cadence: Implement ->msi_map_irq() ops Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 15/21] PCI: endpoint: Remove unused pci_epf_match_device() Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 16/21] PCI: endpoint: Fix missing mutex_unlock in error case Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 17/21] PCI: endpoint: *_free_bar() to return error codes on failure Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 18/21] PCI: endpoint: Add EP function driver to provide NTB functionality Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 19/21] PCI: Add TI J721E device to pci ids Kishon Vijay Abraham I
2019-09-26 11:29 ` [RFC PATCH 20/21] NTB: Add support for EPF PCI-Express Non-Transparent Bridge Kishon Vijay Abraham I
2019-11-17 23:40   ` Jon Mason
2019-09-26 11:29 ` [RFC PATCH 21/21] NTB: tool: Enable the NTB/PCIe link on the local or remote side of bridge Kishon Vijay Abraham I
2019-11-17 23:43 ` [RFC PATCH 00/21] Implement NTB Controller using multiple PCI Jon Mason

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190926112933.8922-7-kishon@ti.com \
    --to=kishon@ti.com \
    --cc=allenbh@gmail.com \
    --cc=bhelgaas@google.com \
    --cc=corbet@lwn.net \
    --cc=dave.jiang@intel.com \
    --cc=devicetree@vger.kernel.org \
    --cc=jdmason@kudzu.us \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-ntb@googlegroups.com \
    --cc=linux-pci@vger.kernel.org \
    --cc=lorenzo.pieralisi@arm.com \
    --cc=mark.rutland@arm.com \
    --cc=robh+dt@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).