soc: ti: pruss: Add helper functions to set GPI mode, MII_RT_event and XFR
authorSuman Anna <s-anna@ti.com>
Fri, 14 Apr 2023 04:55:42 +0000 (10:25 +0530)
committerNishanth Menon <nm@ti.com>
Wed, 17 May 2023 14:15:40 +0000 (09:15 -0500)
The PRUSS CFG module is represented as a syscon node and is currently
managed by the PRUSS platform driver. Add easy accessor functions to set
GPI mode, MII_RT event enable/disable and XFR (XIN XOUT) enable/disable
to enable the PRUSS Ethernet usecase. These functions reuse the generic
pruss_cfg_update() API function.

Signed-off-by: Suman Anna <s-anna@ti.com>
Co-developed-by: Grzegorz Jaszczyk <grzegorz.jaszczyk@linaro.org>
Signed-off-by: Grzegorz Jaszczyk <grzegorz.jaszczyk@linaro.org>
Signed-off-by: Puranjay Mohan <p-mohan@ti.com>
Reviewed-by: Roger Quadros <rogerq@kernel.org>
Reviewed-by: Tony Lindgren <tony@atomide.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: MD Danish Anwar <danishanwar@ti.com>
Link: https://lore.kernel.org/r/20230414045542.3249939-5-danishanwar@ti.com
Signed-off-by: Nishanth Menon <nm@ti.com>
drivers/remoteproc/pru_rproc.c
drivers/soc/ti/pruss.c
include/linux/pruss_driver.h

index 095f66130f48e4972cd02a2e0375a9bb78da7e13..54f5ce302e7a2bf3b442295b136797951de62f1f 100644 (file)
@@ -81,21 +81,6 @@ enum pru_iomem {
        PRU_IOMEM_MAX,
 };
 
-/**
- * enum pru_type - PRU core type identifier
- *
- * @PRU_TYPE_PRU: Programmable Real-time Unit
- * @PRU_TYPE_RTU: Auxiliary Programmable Real-Time Unit
- * @PRU_TYPE_TX_PRU: Transmit Programmable Real-Time Unit
- * @PRU_TYPE_MAX: just keep this one at the end
- */
-enum pru_type {
-       PRU_TYPE_PRU = 0,
-       PRU_TYPE_RTU,
-       PRU_TYPE_TX_PRU,
-       PRU_TYPE_MAX,
-};
-
 /**
  * struct pru_private_data - device data for a PRU core
  * @type: type of the PRU core (PRU, RTU, Tx_PRU)
index 2c44913c083bdafe16dc64a9a8030afef383ea32..7fdefee1ed87b37d7643a7a3dbf2ae26576c4f36 100644 (file)
@@ -213,6 +213,77 @@ int pruss_cfg_set_gpmux(struct pruss *pruss, enum pruss_pru_id pru_id, u8 mux)
 }
 EXPORT_SYMBOL_GPL(pruss_cfg_set_gpmux);
 
+/**
+ * pruss_cfg_gpimode() - set the GPI mode of the PRU
+ * @pruss: the pruss instance handle
+ * @pru_id: id of the PRU core within the PRUSS
+ * @mode: GPI mode to set
+ *
+ * Sets the GPI mode for a given PRU by programming the
+ * corresponding PRUSS_CFG_GPCFGx register
+ *
+ * Return: 0 on success, or an error code otherwise
+ */
+int pruss_cfg_gpimode(struct pruss *pruss, enum pruss_pru_id pru_id,
+                     enum pruss_gpi_mode mode)
+{
+       if (pru_id >= PRUSS_NUM_PRUS || mode >= PRUSS_GPI_MODE_MAX)
+               return -EINVAL;
+
+       return pruss_cfg_update(pruss, PRUSS_CFG_GPCFG(pru_id),
+                               PRUSS_GPCFG_PRU_GPI_MODE_MASK,
+                               mode << PRUSS_GPCFG_PRU_GPI_MODE_SHIFT);
+}
+EXPORT_SYMBOL_GPL(pruss_cfg_gpimode);
+
+/**
+ * pruss_cfg_miirt_enable() - Enable/disable MII RT Events
+ * @pruss: the pruss instance
+ * @enable: enable/disable
+ *
+ * Enable/disable the MII RT Events for the PRUSS.
+ *
+ * Return: 0 on success, or an error code otherwise
+ */
+int pruss_cfg_miirt_enable(struct pruss *pruss, bool enable)
+{
+       u32 set = enable ? PRUSS_MII_RT_EVENT_EN : 0;
+
+       return pruss_cfg_update(pruss, PRUSS_CFG_MII_RT,
+                               PRUSS_MII_RT_EVENT_EN, set);
+}
+EXPORT_SYMBOL_GPL(pruss_cfg_miirt_enable);
+
+/**
+ * pruss_cfg_xfr_enable() - Enable/disable XIN XOUT shift functionality
+ * @pruss: the pruss instance
+ * @pru_type: PRU core type identifier
+ * @enable: enable/disable
+ *
+ * Return: 0 on success, or an error code otherwise
+ */
+int pruss_cfg_xfr_enable(struct pruss *pruss, enum pru_type pru_type,
+                        bool enable)
+{
+       u32 mask, set;
+
+       switch (pru_type) {
+       case PRU_TYPE_PRU:
+               mask = PRUSS_SPP_XFER_SHIFT_EN;
+               break;
+       case PRU_TYPE_RTU:
+               mask = PRUSS_SPP_RTU_XFR_SHIFT_EN;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       set = enable ? mask : 0;
+
+       return pruss_cfg_update(pruss, PRUSS_CFG_SPP, mask, set);
+}
+EXPORT_SYMBOL_GPL(pruss_cfg_xfr_enable);
+
 static void pruss_of_free_clk_provider(void *data)
 {
        struct device_node *clk_mux_np = data;
index 5bb8897724a91bff2db8a98745ec7f5e3ea2cb68..c9a31c567e85bf0e3b14aa1e1e00d5118a2550ea 100644 (file)
@@ -32,6 +32,33 @@ enum pruss_gp_mux_sel {
        PRUSS_GP_MUX_SEL_MAX,
 };
 
+/*
+ * enum pruss_gpi_mode - PRUSS GPI configuration modes, used
+ *                      to program the PRUSS_GPCFG0/1 registers
+ */
+enum pruss_gpi_mode {
+       PRUSS_GPI_MODE_DIRECT,
+       PRUSS_GPI_MODE_PARALLEL,
+       PRUSS_GPI_MODE_28BIT_SHIFT,
+       PRUSS_GPI_MODE_MII,
+       PRUSS_GPI_MODE_MAX,
+};
+
+/**
+ * enum pru_type - PRU core type identifier
+ *
+ * @PRU_TYPE_PRU: Programmable Real-time Unit
+ * @PRU_TYPE_RTU: Auxiliary Programmable Real-Time Unit
+ * @PRU_TYPE_TX_PRU: Transmit Programmable Real-Time Unit
+ * @PRU_TYPE_MAX: just keep this one at the end
+ */
+enum pru_type {
+       PRU_TYPE_PRU,
+       PRU_TYPE_RTU,
+       PRU_TYPE_TX_PRU,
+       PRU_TYPE_MAX,
+};
+
 /*
  * enum pruss_mem - PRUSS memory range identifiers
  */
@@ -86,6 +113,11 @@ int pruss_release_mem_region(struct pruss *pruss,
                             struct pruss_mem_region *region);
 int pruss_cfg_get_gpmux(struct pruss *pruss, enum pruss_pru_id pru_id, u8 *mux);
 int pruss_cfg_set_gpmux(struct pruss *pruss, enum pruss_pru_id pru_id, u8 mux);
+int pruss_cfg_gpimode(struct pruss *pruss, enum pruss_pru_id pru_id,
+                     enum pruss_gpi_mode mode);
+int pruss_cfg_miirt_enable(struct pruss *pruss, bool enable);
+int pruss_cfg_xfr_enable(struct pruss *pruss, enum pru_type pru_type,
+                        bool enable);
 
 #else
 
@@ -121,6 +153,25 @@ static inline int pruss_cfg_set_gpmux(struct pruss *pruss,
        return ERR_PTR(-EOPNOTSUPP);
 }
 
+static inline int pruss_cfg_gpimode(struct pruss *pruss,
+                                   enum pruss_pru_id pru_id,
+                                   enum pruss_gpi_mode mode)
+{
+       return ERR_PTR(-EOPNOTSUPP);
+}
+
+static inline int pruss_cfg_miirt_enable(struct pruss *pruss, bool enable)
+{
+       return ERR_PTR(-EOPNOTSUPP);
+}
+
+static inline int pruss_cfg_xfr_enable(struct pruss *pruss,
+                                      enum pru_type pru_type,
+                                      bool enable);
+{
+       return ERR_PTR(-EOPNOTSUPP);
+}
+
 #endif /* CONFIG_TI_PRUSS */
 
 #endif /* _PRUSS_DRIVER_H_ */