ソースを参照

qcacld-3.0: Provide common functions of adding/deleting dev node

Provide common functions of adding/deleting dev node from PLD
global context. These two APIs should be called in probe/remove
callback functions.

CRs-Fixed: 1023650
Change-Id: Iff8157ab4396266ffb013700076d4107a3a21566
Yuanyuan Liu 8 年 前
コミット
5e25f531b5
4 ファイル変更62 行追加44 行削除
  1. 52 0
      core/pld/src/pld_common.c
  2. 4 0
      core/pld/src/pld_internal.h
  3. 3 22
      core/pld/src/pld_pcie.c
  4. 3 22
      core/pld/src/pld_snoc.c

+ 52 - 0
core/pld/src/pld_common.c

@@ -116,6 +116,58 @@ struct pld_context *pld_get_global_context(void)
 	return pld_ctx;
 }
 
+/**
+ * pld_add_dev() - Add dev node to global context
+ * @pld_context: PLD global context
+ * @dev: device
+ * @type: Bus type
+ *
+ * Return: 0 for success
+ *         Non zero failure code for errors
+ */
+int pld_add_dev(struct pld_context *pld_context,
+		struct device *dev, enum pld_bus_type type)
+{
+	unsigned long flags;
+	struct dev_node *dev_node;
+
+	dev_node = kzalloc(sizeof(*dev_node), GFP_KERNEL);
+	if (dev_node == NULL)
+		return -ENOMEM;
+
+	dev_node->dev = dev;
+	dev_node->bus_type = type;
+
+	spin_lock_irqsave(&pld_context->pld_lock, flags);
+	list_add_tail(&dev_node->list, &pld_context->dev_list);
+	spin_unlock_irqrestore(&pld_context->pld_lock, flags);
+
+	return 0;
+}
+
+/**
+ * pld_del_dev() - Delete dev node from global context
+ * @pld_context: PLD global context
+ * @dev: device
+ *
+ * Return: void
+ */
+void pld_del_dev(struct pld_context *pld_context,
+		 struct device *dev)
+{
+	unsigned long flags;
+	struct dev_node *dev_node, *tmp;
+
+	spin_lock_irqsave(&pld_context->pld_lock, flags);
+	list_for_each_entry_safe(dev_node, tmp, &pld_context->dev_list, list) {
+		if (dev_node->dev == dev) {
+			list_del(&dev_node->list);
+			kfree(dev_node);
+		}
+	}
+	spin_unlock_irqrestore(&pld_context->pld_lock, flags);
+}
+
 /**
  * pld_get_bus_type() - Bus type of the device
  * @dev: device

+ 4 - 0
core/pld/src/pld_internal.h

@@ -42,5 +42,9 @@ struct pld_context {
 };
 
 struct pld_context *pld_get_global_context(void);
+int pld_add_dev(struct pld_context *pld_context,
+		struct device *dev, enum pld_bus_type type);
+void pld_del_dev(struct pld_context *pld_context,
+		 struct device *dev);
 
 #endif

+ 3 - 22
core/pld/src/pld_pcie.c

@@ -60,8 +60,6 @@ static int pld_pcie_probe(struct pci_dev *pdev,
 			  const struct pci_device_id *id)
 {
 	struct pld_context *pld_context;
-	unsigned long flags;
-	struct dev_node *dev_node;
 	int ret = 0;
 
 	pld_context = pld_get_global_context();
@@ -70,17 +68,9 @@ static int pld_pcie_probe(struct pci_dev *pdev,
 		goto out;
 	}
 
-	dev_node = kzalloc(sizeof(*dev_node), GFP_KERNEL);
-	if (dev_node == NULL) {
-		ret = -ENOMEM;
+	ret = pld_add_dev(pld_context, &pdev->dev, PLD_BUS_TYPE_PCIE);
+	if (ret)
 		goto out;
-	}
-	dev_node->dev = &pdev->dev;
-	dev_node->bus_type = PLD_BUS_TYPE_PCIE;
-
-	spin_lock_irqsave(&pld_context->pld_lock, flags);
-	list_add_tail(&dev_node->list, &pld_context->dev_list);
-	spin_unlock_irqrestore(&pld_context->pld_lock, flags);
 
 	return pld_context->ops->probe(&pdev->dev,
 		       PLD_BUS_TYPE_PCIE, pdev, (void *)id);
@@ -101,8 +91,6 @@ out:
 static void pld_pcie_remove(struct pci_dev *pdev)
 {
 	struct pld_context *pld_context;
-	unsigned long flags;
-	struct dev_node *dev_node, *tmp;
 
 	pld_context = pld_get_global_context();
 
@@ -111,14 +99,7 @@ static void pld_pcie_remove(struct pci_dev *pdev)
 
 	pld_context->ops->remove(&pdev->dev, PLD_BUS_TYPE_PCIE);
 
-	spin_lock_irqsave(&pld_context->pld_lock, flags);
-	list_for_each_entry_safe(dev_node, tmp, &pld_context->dev_list, list) {
-		if (dev_node->dev == &pdev->dev) {
-			list_del(&dev_node->list);
-			kfree(dev_node);
-		}
-	}
-	spin_unlock_irqrestore(&pld_context->pld_lock, flags);
+	pld_del_dev(pld_context, &pdev->dev);
 }
 
 #ifdef CONFIG_PLD_PCIE_CNSS

+ 3 - 22
core/pld/src/pld_snoc.c

@@ -50,8 +50,6 @@
 static int pld_snoc_probe(struct device *dev)
 {
 	struct pld_context *pld_context;
-	unsigned long flags;
-	struct dev_node *dev_node;
 	int ret = 0;
 
 	pld_context = pld_get_global_context();
@@ -60,17 +58,9 @@ static int pld_snoc_probe(struct device *dev)
 		goto out;
 	}
 
-	dev_node = kzalloc(sizeof(*dev_node), GFP_KERNEL);
-	if (dev_node == NULL) {
-		ret = -ENOMEM;
+	ret = pld_add_dev(pld_context, dev, PLD_BUS_TYPE_SNOC);
+	if (ret)
 		goto out;
-	}
-	dev_node->dev = dev;
-	dev_node->bus_type = PLD_BUS_TYPE_SNOC;
-
-	spin_lock_irqsave(&pld_context->pld_lock, flags);
-	list_add_tail(&dev_node->list, &pld_context->dev_list);
-	spin_unlock_irqrestore(&pld_context->pld_lock, flags);
 
 	return pld_context->ops->probe(dev, PLD_BUS_TYPE_SNOC,
 				       NULL, NULL);
@@ -91,8 +81,6 @@ out:
 static void pld_snoc_remove(struct device *dev)
 {
 	struct pld_context *pld_context;
-	unsigned long flags;
-	struct dev_node *dev_node, *tmp;
 
 	pld_context = pld_get_global_context();
 
@@ -101,14 +89,7 @@ static void pld_snoc_remove(struct device *dev)
 
 	pld_context->ops->remove(dev, PLD_BUS_TYPE_SNOC);
 
-	spin_lock_irqsave(&pld_context->pld_lock, flags);
-	list_for_each_entry_safe(dev_node, tmp, &pld_context->dev_list, list) {
-		if (dev_node->dev == dev) {
-			list_del(&dev_node->list);
-			kfree(dev_node);
-		}
-	}
-	spin_unlock_irqrestore(&pld_context->pld_lock, flags);
+	pld_del_dev(pld_context, dev);
 }
 
 /**