Browse Source

qcacld-3.0: Add PLD API for devm_request_irq

Add PLD API for devm_request_irq in PLD layer.It can be used
by HIF layer when required.

Change-Id: I1bd08e3c3dc64c47b9792b428322100e12150b27
Naman Padhiar 3 năm trước cách đây
mục cha
commit
24053827cc
2 tập tin đã thay đổi với 80 bổ sung0 xóa
  1. 28 0
      core/pld/inc/pld_common.h
  2. 52 0
      core/pld/src/pld_common.c

+ 28 - 0
core/pld/inc/pld_common.h

@@ -849,6 +849,25 @@ int pld_idle_shutdown(struct device *dev,
  */
 int pld_idle_restart(struct device *dev,
 		     int (*restart_cb)(struct device *dev));
+
+/**
+ * pld_srng_devm_request_irq() - Register IRQ for SRNG
+ * @dev: device
+ * @irq: IRQ number
+ * @handler: IRQ callback function
+ * @irqflags: IRQ flags
+ * @name: IRQ name
+ * @ctx: IRQ context
+ *
+ * Return: 0 for success
+ *         Non zero failure code for errors
+ */
+int pld_srng_devm_request_irq(struct device *dev, int irq,
+			      irq_handler_t handler,
+			      unsigned long irqflags,
+			      const char *name,
+			      void *ctx);
+
 /**
  * pld_srng_request_irq() - Register IRQ for SRNG
  * @dev: device
@@ -865,6 +884,7 @@ int pld_srng_request_irq(struct device *dev, int irq, irq_handler_t handler,
 			 unsigned long irqflags,
 			 const char *name,
 			 void *ctx);
+
 /**
  * pld_srng_free_irq() - Free IRQ for SRNG
  * @dev: device
@@ -1023,6 +1043,14 @@ static inline int pld_nbuf_pre_alloc_free(struct sk_buff *skb)
  */
 enum pld_bus_type pld_get_bus_type(struct device *dev);
 
+static inline int pfrm_devm_request_irq(struct device *dev, unsigned int ce_id,
+					irqreturn_t (*handler)(int, void *),
+					unsigned long flags, const char *name,
+					void *ctx)
+{
+	return pld_srng_devm_request_irq(dev, ce_id, handler, flags, name, ctx);
+}
+
 static inline int pfrm_request_irq(struct device *dev, unsigned int ce_id,
 				   irqreturn_t (*handler)(int, void *),
 				   unsigned long flags, const char *name,

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

@@ -2179,6 +2179,58 @@ int pld_get_user_msi_assignment(struct device *dev, char *user_name,
 	return ret;
 }
 
+/**
+ * pld_srng_devm_request_irq() - Register IRQ for SRNG
+ * @dev: device
+ * @irq: IRQ number
+ * @handler: IRQ callback function
+ * @flags: IRQ flags
+ * @name: IRQ name
+ * @ctx: IRQ context
+ *
+ * Return: 0 for success
+ *         Non zero failure code for errors
+ */
+int pld_srng_devm_request_irq(struct device *dev, int irq,
+			      irq_handler_t handler,
+			      unsigned long irqflags,
+			      const char *devname,
+			      void *dev_data)
+{
+	int ret = 0;
+	enum pld_bus_type type = pld_get_bus_type(dev);
+
+	switch (type) {
+	case PLD_BUS_TYPE_PCIE:
+		ret = devm_request_irq(dev, irq, handler, irqflags,
+				       devname, dev_data);
+		break;
+	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
+		ret = pld_pcie_fw_sim_request_irq(dev, irq, handler,
+						  irqflags, devname,
+						  dev_data);
+		break;
+	case PLD_BUS_TYPE_SNOC:
+	case PLD_BUS_TYPE_SDIO:
+	case PLD_BUS_TYPE_USB:
+	case PLD_BUS_TYPE_SNOC_FW_SIM:
+		pr_err("Not supported on type %d\n", type);
+		ret = -ENODEV;
+		break;
+	case PLD_BUS_TYPE_IPCI:
+		ret = devm_request_irq(dev, irq, handler, irqflags,
+				       devname, dev_data);
+		break;
+	default:
+		pr_err("Invalid device type %d\n", type);
+		ret = -EINVAL;
+		break;
+	}
+
+	return ret;
+}
+
 /**
  * pld_srng_request_irq() - Register IRQ for SRNG
  * @dev: device