Re: [PATCH v8 4/7] soc: mediatek: mutex: add functions that operate registers by CMDQ

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Considering that some functions have timing requirements
in specific situation, this patch adds several interface that
operate registers by CMDQ.

Signed-off-by: Moudy Ho <moudy.ho@xxxxxxxxxxxx>
---
  drivers/soc/mediatek/mtk-mutex.c       | 63 +++++++++++++++++++++++++-
  include/linux/soc/mediatek/mtk-mutex.h |  6 +++
  2 files changed, 68 insertions(+), 1 deletion(-)

diff --git a/drivers/soc/mediatek/mtk-mutex.c b/drivers/soc/mediatek/mtk-mutex.c
index adab4c9edc16..874d4c60b844 100644
--- a/drivers/soc/mediatek/mtk-mutex.c
+++ b/drivers/soc/mediatek/mtk-mutex.c
@@ -7,10 +7,12 @@
  #include <linux/iopoll.h>
  #include <linux/module.h>
  #include <linux/of_device.h>
+#include <linux/of_address.h>
  #include <linux/platform_device.h>
  #include <linux/regmap.h>
  #include <linux/soc/mediatek/mtk-mmsys.h>
  #include <linux/soc/mediatek/mtk-mutex.h>
+#include <linux/soc/mediatek/mtk-cmdq.h>
#define MT2701_MUTEX0_MOD0 0x2c
  #define MT2701_MUTEX0_SOF0			0x30
@@ -143,6 +145,8 @@ struct mtk_mutex_ctx {
  	void __iomem			*regs;
  	struct mtk_mutex		mutex[10];
  	const struct mtk_mutex_data	*data;
+	phys_addr_t			addr;
+	u8				subsys_id;
  };
static const unsigned int mt2701_mutex_mod[DDP_COMPONENT_ID_MAX] = {
@@ -442,6 +446,25 @@ void mtk_mutex_remove_comp(struct mtk_mutex *mutex,
  }
  EXPORT_SYMBOL_GPL(mtk_mutex_remove_comp);
+void mtk_mutex_add_mod_by_cmdq(struct mtk_mutex *mutex, u32 mod,
+			       struct mmsys_cmdq_cmd *cmd)
+{
+	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
+						 mutex[mutex->id]);
+	unsigned int offset;
+
+	WARN_ON(&mtx->mutex[mutex->id] != mutex);
+
+	offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg, mutex->id);
+	cmdq_pkt_write_mask(cmd->pkt, mtx->subsys_id, mtx->addr + offset,
+			    mod, mtx->data->mutex_mdp_mod_mask);
+
+	offset = DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, mutex->id);
+	cmdq_pkt_write_mask(cmd->pkt, mtx->subsys_id, mtx->addr + offset,
+			    0, mtx->data->mutex_mdp_sof_mask);
+}
+EXPORT_SYMBOL_GPL(mtk_mutex_add_mod_by_cmdq);
+
  void mtk_mutex_enable(struct mtk_mutex *mutex)
  {
  	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
@@ -453,6 +476,20 @@ void mtk_mutex_enable(struct mtk_mutex *mutex)
  }
  EXPORT_SYMBOL_GPL(mtk_mutex_enable);
+void mtk_mutex_enable_by_cmdq(struct mtk_mutex *mutex,
+			      struct mmsys_cmdq_cmd *cmd)
+{
+	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
+						 mutex[mutex->id]);
+
+	WARN_ON(&mtx->mutex[mutex->id] != mutex);
+
+	cmdq_pkt_write_mask(cmd->pkt, mtx->subsys_id,
+			    mtx->addr + DISP_REG_MUTEX_EN(mutex->id),
+			    0x1, 0x00000001);

(don't use this definition name if not appropriate)
#define MTK_MUTEX_ENABLE	BIT(0)

cmdq_pkt_write_mask(cmd->pkt, mtx->subsys_id,

		    mtx->addr + DISP_REG_MUTEX_EN(mutex->id),

		    MTK_MUTEX_ENABLE, MTK_MUTEX_ENABLE);

...or anyway remove leading zeros.

+}
+EXPORT_SYMBOL_GPL(mtk_mutex_enable_by_cmdq);
+
  void mtk_mutex_disable(struct mtk_mutex *mutex)
  {
  	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
@@ -464,6 +501,20 @@ void mtk_mutex_disable(struct mtk_mutex *mutex)
  }
  EXPORT_SYMBOL_GPL(mtk_mutex_disable);
+void mtk_mutex_disable_by_cmdq(struct mtk_mutex *mutex,
+			       struct mmsys_cmdq_cmd *cmd)
+{
+	struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
+						 mutex[mutex->id]);
+
+	WARN_ON(&mtx->mutex[mutex->id] != mutex);
+
+	cmdq_pkt_write_mask(cmd->pkt, mtx->subsys_id,
+			    mtx->addr + DISP_REG_MUTEX_EN(mutex->id),
+			    0x0, 0x00000001);

cmdq_pkt_write_mask(cmd->pkt, mtx->subsys_id,


		    mtx->addr + DISP_REG_MUTEX_EN(mutex->id),


		    0, MTK_MUTEX_ENABLE);

+}
+EXPORT_SYMBOL_GPL(mtk_mutex_disable_by_cmdq);
+

Regards,
- Angelo





[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux