瀏覽代碼

Merge branch 'topic/4.19/am65x' of git://git.ti.com/rpmsg/remoteproc into rpmsg-ti-linux-4.19.y

Pull in the dedicated AM65x remoteproc topic branch that drops the
MII-RT management from the PRUSS platform driver and some cleanup
in the PRUSS INTC platform drivers. The pruss_regmap_read() and
pruss_regmap_update() API are also cleaned up and renamed to
pruss_cfg_read() and pruss_cfg_update() respectively.

* 'topic/4.19/am65x' of git://git.ti.com/rpmsg/remoteproc:
  soc: ti: pruss: Rename pruss_regmap_read()/update() API
  soc: ti: pruss: Drop MII-RT management from PRUSS driver
  soc: ti: pruss: Remove stale iep variable
  irqchip/irq-pruss-intc: Use bitmap to simplify event configuration

Signed-off-by: Suman Anna <s-anna@ti.com>
Suman Anna 6 年之前
父節點
當前提交
967a10879b
共有 4 個文件被更改,包括 57 次插入105 次删除
  1. 23 30
      drivers/irqchip/irq-pruss-intc.c
  2. 16 41
      drivers/soc/ti/pruss.c
  3. 14 25
      include/linux/pruss.h
  4. 4 9
      include/linux/pruss_driver.h

+ 23 - 30
drivers/irqchip/irq-pruss-intc.c

@@ -7,6 +7,7 @@
  *	Suman Anna <s-anna@ti.com>
  */
 
+#include <linux/bitmap.h>
 #include <linux/irq.h>
 #include <linux/irqchip/chained_irq.h>
 #include <linux/irqdomain.h>
@@ -168,11 +169,12 @@ int pruss_intc_configure(struct pruss *pruss,
 	int i, idx;
 	s8 ch, host;
 	u32 num_events, num_intrs, num_regs;
-	u32 *sysevt_mask = NULL;
 	u32 ch_mask = 0;
 	u32 host_mask = 0;
 	int ret = 0;
 	u32 val;
+	unsigned long *sysevt_bitmap;
+	u32 *sysevts;
 
 	intc = to_pruss_intc(pruss);
 	if (!intc)
@@ -182,9 +184,10 @@ int pruss_intc_configure(struct pruss *pruss,
 	num_intrs = intc->data->num_host_intrs;
 	num_regs = DIV_ROUND_UP(num_events, 32);
 
-	sysevt_mask = kcalloc(num_regs, sizeof(*sysevt_mask), GFP_KERNEL);
-	if (!sysevt_mask)
+	sysevt_bitmap = bitmap_zalloc(num_events, GFP_KERNEL);
+	if (!sysevt_bitmap)
 		return -ENOMEM;
+	sysevts = (u32 *)sysevt_bitmap;
 
 	mutex_lock(&intc->lock);
 
@@ -212,7 +215,7 @@ int pruss_intc_configure(struct pruss *pruss,
 		val = pruss_intc_read_reg(intc, PRU_INTC_CMR(idx));
 		val |= ch << ((i & 3) * 8);
 		pruss_intc_write_reg(intc, PRU_INTC_CMR(idx), val);
-		sysevt_mask[i / 32] |= BIT(i % 32);
+		bitmap_set(sysevt_bitmap, i, 1);
 		ch_mask |= BIT(ch);
 
 		dev_dbg(dev, "SYSEV%d -> CH%d (CMR%d 0x%08x)\n", i, ch, idx,
@@ -260,21 +263,15 @@ int pruss_intc_configure(struct pruss *pruss,
 			pruss_intc_read_reg(intc, PRU_INTC_HMR(idx)));
 	}
 
-	if (num_events == MAX_PRU_SYS_EVENTS) {
-		dev_info(dev, "configured system_events[63-0] = 0x%08x.%08x",
-			 sysevt_mask[1], sysevt_mask[0]);
-	} else if (num_events == MAX_PRU_SYS_EVENTS_K3) {
-		dev_info(dev, "configured system_events[159-0] = 0x%08x.%08x.%08x.%08x.%08x",
-			 sysevt_mask[4], sysevt_mask[3],  sysevt_mask[2],
-			 sysevt_mask[1],  sysevt_mask[0]);
-	}
+	dev_info(dev, "configured system_events[%d-0] = %*pb\n",
+		 num_events - 1, num_events, sysevt_bitmap);
 	dev_info(dev, "configured intr_channels = 0x%08x host_intr = 0x%08x\n",
 		 ch_mask, host_mask);
 
 	/* enable system events, writing 0 has no-effect */
 	for (i = 0; i < num_regs; i++) {
-		pruss_intc_write_reg(intc, PRU_INTC_ESR(i), sysevt_mask[i]);
-		pruss_intc_write_reg(intc, PRU_INTC_SECR(i), sysevt_mask[i]);
+		pruss_intc_write_reg(intc, PRU_INTC_ESR(i), sysevts[i]);
+		pruss_intc_write_reg(intc, PRU_INTC_SECR(i), sysevts[i]);
 	}
 
 	/* enable host interrupts */
@@ -290,7 +287,7 @@ int pruss_intc_configure(struct pruss *pruss,
 
 unlock:
 	mutex_unlock(&intc->lock);
-	kfree(sysevt_mask);
+	bitmap_free(sysevt_bitmap);
 	return ret;
 }
 EXPORT_SYMBOL_GPL(pruss_intc_configure);
@@ -312,8 +309,9 @@ int pruss_intc_unconfigure(struct pruss *pruss,
 	int i;
 	s8 ch, host;
 	u32 num_events, num_intrs, num_regs;
-	u32 *sysevt_mask = NULL;
 	u32 host_mask = 0;
+	unsigned long *sysevt_bitmap;
+	u32 *sysevts;
 
 	intc = to_pruss_intc(pruss);
 	if (!intc)
@@ -323,9 +321,10 @@ int pruss_intc_unconfigure(struct pruss *pruss,
 	num_intrs = intc->data->num_host_intrs;
 	num_regs = DIV_ROUND_UP(num_events, 32);
 
-	sysevt_mask = kcalloc(num_regs, sizeof(*sysevt_mask), GFP_KERNEL);
-	if (!sysevt_mask)
+	sysevt_bitmap = bitmap_zalloc(num_events, GFP_KERNEL);
+	if (!sysevt_bitmap)
 		return -ENOMEM;
+	sysevts = (u32 *)sysevt_bitmap;
 
 	mutex_lock(&intc->lock);
 
@@ -336,7 +335,7 @@ int pruss_intc_unconfigure(struct pruss *pruss,
 
 		/* mark sysevent free in global map */
 		intc->config_map.sysev_to_ch[i] = -1;
-		sysevt_mask[i / 32] |= BIT(i % 32);
+		bitmap_set(sysevt_bitmap, i, 1);
 	}
 
 	for (i = 0; i < num_intrs; i++) {
@@ -349,21 +348,15 @@ int pruss_intc_unconfigure(struct pruss *pruss,
 		host_mask |= BIT(host);
 	}
 
-	if (num_events == MAX_PRU_SYS_EVENTS) {
-		dev_info(dev, "unconfigured system_events[63-0] = 0x%08x.%08x",
-			 sysevt_mask[1], sysevt_mask[0]);
-	} else if (num_events == MAX_PRU_SYS_EVENTS_K3) {
-		dev_info(dev, "unconfigured system_events[159-0] = 0x%08x.%08x.%08x.%08x.%08x",
-			 sysevt_mask[4], sysevt_mask[3],  sysevt_mask[2],
-			 sysevt_mask[1],  sysevt_mask[0]);
-	}
+	dev_info(dev, "unconfigured system_events[%d-0] = %*pb\n",
+		 num_events - 1, num_events, sysevt_bitmap);
 	dev_info(dev, "unconfigured host_intr = 0x%08x\n", host_mask);
 
 	for (i = 0; i < num_regs; i++) {
 		/* disable system events, writing 0 has no-effect */
-		pruss_intc_write_reg(intc, PRU_INTC_ECR(i), sysevt_mask[i]);
+		pruss_intc_write_reg(intc, PRU_INTC_ECR(i), sysevts[i]);
 		/* clear any pending status */
-		pruss_intc_write_reg(intc, PRU_INTC_SECR(i), sysevt_mask[i]);
+		pruss_intc_write_reg(intc, PRU_INTC_SECR(i), sysevts[i]);
 	}
 
 	/* disable host interrupts */
@@ -374,7 +367,7 @@ int pruss_intc_unconfigure(struct pruss *pruss,
 
 	intc->host_mask &= ~host_mask;
 	mutex_unlock(&intc->lock);
-	kfree(sysevt_mask);
+	bitmap_free(sysevt_bitmap);
 
 	return 0;
 }

+ 16 - 41
drivers/soc/ti/pruss.c

@@ -176,59 +176,45 @@ int pruss_release_mem_region(struct pruss *pruss,
 EXPORT_SYMBOL_GPL(pruss_release_mem_region);
 
 /**
- * pruss_regmap_read() - read a PRUSS syscon sub-module register
+ * pruss_cfg_read() - read a PRUSS CFG sub-module register
  * @pruss: the pruss instance handle
- * @mod: the pruss syscon sub-module identifier
- * @reg: register offset within the sub-module
+ * @reg: register offset within the CFG sub-module
  * @val: pointer to return the value in
  *
- * Reads a given register within one of the PRUSS sub-modules represented
- * by a syscon and returns it through the passed-in @val pointer
+ * Reads a given register within the PRUSS CFG sub-module and
+ * returns it through the passed-in @val pointer
  *
  * Returns 0 on success, or an error code otherwise
  */
-int pruss_regmap_read(struct pruss *pruss, enum pruss_syscon mod,
-		      unsigned int reg, unsigned int *val)
+int pruss_cfg_read(struct pruss *pruss, unsigned int reg, unsigned int *val)
 {
-	struct regmap *map;
-
-	if (IS_ERR_OR_NULL(pruss) || mod < PRUSS_SYSCON_CFG ||
-	    mod >= PRUSS_SYSCON_MAX)
+	if (IS_ERR_OR_NULL(pruss))
 		return -EINVAL;
 
-	map = (mod == PRUSS_SYSCON_CFG) ? pruss->cfg : pruss->mii_rt;
-
-	return regmap_read(map, reg, val);
+	return regmap_read(pruss->cfg, reg, val);
 }
-EXPORT_SYMBOL_GPL(pruss_regmap_read);
+EXPORT_SYMBOL_GPL(pruss_cfg_read);
 
 /**
- * pruss_regmap_update() - configure a PRUSS syscon sub-module register
+ * pruss_cfg_update() - configure a PRUSS CFG sub-module register
  * @pruss: the pruss instance handle
- * @mod: the pruss syscon sub-module identifier
- * @reg: register offset within the sub-module
+ * @reg: register offset within the CFG sub-module
  * @mask: bit mask to use for programming the @val
  * @val: value to write
  *
- * Programs a given register within one of the PRUSS sub-modules represented
- * by a syscon
+ * Programs a given register within the PRUSS CFG sub-module
  *
  * Returns 0 on success, or an error code otherwise
  */
-int pruss_regmap_update(struct pruss *pruss, enum pruss_syscon mod,
-			unsigned int reg, unsigned int mask, unsigned int val)
+int pruss_cfg_update(struct pruss *pruss, unsigned int reg,
+		     unsigned int mask, unsigned int val)
 {
-	struct regmap *map;
-
-	if (IS_ERR_OR_NULL(pruss) || mod < PRUSS_SYSCON_CFG ||
-	    mod >= PRUSS_SYSCON_MAX)
+	if (IS_ERR_OR_NULL(pruss))
 		return -EINVAL;
 
-	map = (mod == PRUSS_SYSCON_CFG) ? pruss->cfg : pruss->mii_rt;
-
-	return regmap_update_bits(map, reg, mask, val);
+	return regmap_update_bits(pruss->cfg, reg, mask, val);
 }
-EXPORT_SYMBOL_GPL(pruss_regmap_update);
+EXPORT_SYMBOL_GPL(pruss_cfg_update);
 
 static const
 struct pruss_private_data *pruss_get_private_data(struct platform_device *pdev)
@@ -404,17 +390,6 @@ skip_mux:
 		return PTR_ERR(pruss->cfg);
 	}
 
-	np = of_get_child_by_name(node, "mii-rt");
-	if (!np) {
-		dev_err(dev, "%pOF is missing mii-rt node\n", np);
-		return -ENODEV;
-	}
-
-	pruss->mii_rt = syscon_node_to_regmap(np);
-	of_node_put(np);
-	if (IS_ERR(pruss->mii_rt))
-		return -ENODEV;
-
 	np = of_get_child_by_name(node, "memories");
 	if (!np) {
 		dev_err(dev, "%pOF is missing memories node\n", np);

+ 14 - 25
include/linux/pruss.h

@@ -104,15 +104,6 @@ enum pruss_gpi_mode {
 	PRUSS_GPI_MODE_MII,
 };
 
-/**
- * enum pruss_syscon - PRUSS sub-module syscon identifiers
- */
-enum pruss_syscon {
-	PRUSS_SYSCON_CFG = 0,
-	PRUSS_SYSCON_MII_RT,
-	PRUSS_SYSCON_MAX,
-};
-
 /**
  * enum pruss_pru_id - PRU core identifiers
  */
@@ -169,10 +160,9 @@ int pruss_request_mem_region(struct pruss *pruss, enum pruss_mem mem_id,
 			     struct pruss_mem_region *region);
 int pruss_release_mem_region(struct pruss *pruss,
 			     struct pruss_mem_region *region);
-int pruss_regmap_read(struct pruss *pruss, enum pruss_syscon mod,
-		      unsigned int reg, unsigned int *val);
-int pruss_regmap_update(struct pruss *pruss, enum pruss_syscon mod,
-			unsigned int reg, unsigned int mask, unsigned int val);
+int pruss_cfg_read(struct pruss *pruss, unsigned int reg, unsigned int *val);
+int pruss_cfg_update(struct pruss *pruss, unsigned int reg,
+		     unsigned int mask, unsigned int val);
 int pruss_intc_trigger(unsigned int irq);
 
 #else
@@ -197,15 +187,14 @@ static inline int pruss_release_mem_region(struct pruss *pruss,
 	return -ENOTSUPP;
 }
 
-static inline int pruss_regmap_read(struct pruss *pruss, enum pruss_syscon mod,
-				    unsigned int reg, unsigned int *val)
+static inline int pruss_cfg_read(struct pruss *pruss, unsigned int reg,
+				 unsigned int *val)
 {
 	return -ENOTSUPP;
 }
 
-static inline int pruss_regmap_update(struct pruss *pruss,
-				      enum pruss_syscon mod, unsigned int reg,
-				      unsigned int mask, unsigned int val)
+static inline int pruss_cfg_update(struct pruss *pruss, unsigned int reg,
+				   unsigned int mask, unsigned int val)
 {
 	return -ENOTSUPP;
 }
@@ -265,9 +254,9 @@ static inline int pruss_cfg_gpimode(struct pruss *pruss, struct rproc *pru,
 	if (id < 0)
 		return -EINVAL;
 
-	return pruss_regmap_update(pruss, PRUSS_SYSCON_CFG, PRUSS_CFG_GPCFG(id),
-				   PRUSS_GPCFG_PRU_GPI_MODE_MASK,
-				   mode << PRUSS_GPCFG_PRU_GPI_MODE_SHIFT);
+	return pruss_cfg_update(pruss, PRUSS_CFG_GPCFG(id),
+				PRUSS_GPCFG_PRU_GPI_MODE_MASK,
+				mode << PRUSS_GPCFG_PRU_GPI_MODE_SHIFT);
 }
 
 /**
@@ -281,8 +270,8 @@ static inline int pruss_cfg_miirt_enable(struct pruss *pruss, bool enable)
 {
 	u32 set = enable ? PRUSS_MII_RT_EVENT_EN : 0;
 
-	return pruss_regmap_update(pruss, PRUSS_SYSCON_CFG, PRUSS_CFG_MII_RT,
-				   PRUSS_MII_RT_EVENT_EN, set);
+	return pruss_cfg_update(pruss, PRUSS_CFG_MII_RT,
+				PRUSS_MII_RT_EVENT_EN, set);
 }
 
 /**
@@ -294,8 +283,8 @@ static inline int pruss_cfg_xfr_enable(struct pruss *pruss, bool enable)
 {
 	u32 set = enable ? PRUSS_SPP_XFER_SHIFT_EN : 0;
 
-	return pruss_regmap_update(pruss, PRUSS_SYSCON_CFG, PRUSS_CFG_SPP,
-				   PRUSS_SPP_XFER_SHIFT_EN, set);
+	return pruss_cfg_update(pruss, PRUSS_CFG_SPP,
+				PRUSS_SPP_XFER_SHIFT_EN, set);
 }
 
 #endif /* __LINUX_PRUSS_H */

+ 4 - 9
include/linux/pruss_driver.h

@@ -41,8 +41,6 @@ struct pruss_intc_config {
  * @dev: pruss device pointer
  * @cfg_base: base iomap for CFG region
  * @cfg: regmap for config region
- * @iep: regmap for IEP sub-module
- * @mii_rt: regmap for MII_RT sub-module
  * @mem_regions: data for each of the PRUSS memory regions
  * @mem_in_use: to indicate if memory resource is in use
  * @lock: mutex to serialize access to resources
@@ -51,8 +49,6 @@ struct pruss {
 	struct device *dev;
 	void __iomem *cfg_base;
 	struct regmap *cfg;
-	struct regmap *iep;
-	struct regmap *mii_rt;
 	struct pruss_mem_region mem_regions[PRUSS_MEM_MAX];
 	struct pruss_mem_region *mem_in_use[PRUSS_MEM_MAX];
 	struct mutex lock; /* PRU resource lock */
@@ -77,8 +73,7 @@ static inline int pruss_cfg_get_gpmux(struct pruss *pruss,
 	int ret = 0;
 	u32 val;
 
-	ret = pruss_regmap_read(pruss, PRUSS_SYSCON_CFG,
-				PRUSS_CFG_GPCFG(id), &val);
+	ret = pruss_cfg_read(pruss, PRUSS_CFG_GPCFG(id), &val);
 	if (!ret)
 		*mux = (u8)((val & PRUSS_GPCFG_PRU_MUX_SEL_MASK) >>
 			    PRUSS_GPCFG_PRU_MUX_SEL_SHIFT);
@@ -97,9 +92,9 @@ static inline int pruss_cfg_set_gpmux(struct pruss *pruss,
 	if (mux >= PRUSS_GP_MUX_SEL_MAX)
 		return -EINVAL;
 
-	return pruss_regmap_update(pruss, PRUSS_SYSCON_CFG, PRUSS_CFG_GPCFG(id),
-				   PRUSS_GPCFG_PRU_MUX_SEL_MASK,
-				  (u32)mux << PRUSS_GPCFG_PRU_MUX_SEL_SHIFT);
+	return pruss_cfg_update(pruss, PRUSS_CFG_GPCFG(id),
+				PRUSS_GPCFG_PRU_MUX_SEL_MASK,
+				(u32)mux << PRUSS_GPCFG_PRU_MUX_SEL_SHIFT);
 }
 
 #endif	/* _PRUSS_DRIVER_H_ */