Message ID | 20250321093435.94835-8-paul-pl.chen@mediatek.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Add MediaTek SoC DRM support for MT8196 | expand |
Il 21/03/25 10:33, paul-pl.chen ha scritto: > From: Nancy Lin <nancy.lin@mediatek.com> > > Refactor SOF settings by adding mtk_mutex_get_output_comp_sof() > and extracting SOF logic from mtk_mutex_add_comp() > and mtk_mutex_remove_comp(). > > - Added mtk_mutex_add_comp_sof() and mtk_mutex_remove_comp_sof() > for SOF settings. > - Reused the switch case for SOF IDs. > - Separated MOD and SOF logic. > This also needs more than one commit. The cleanups go in a commit doing only cleanups. > Signed-off-by: Nancy Lin <nancy.lin@mediatek.com> > Signed-off-by: Paul-pl Chen <paul-pl.chen@mediatek.com> > --- > drivers/soc/mediatek/mtk-mutex.c | 121 +++++++++++++++---------- > include/linux/soc/mediatek/mtk-mutex.h | 4 + > 2 files changed, 79 insertions(+), 46 deletions(-) > > diff --git a/drivers/soc/mediatek/mtk-mutex.c b/drivers/soc/mediatek/mtk-mutex.c > index aaa965d4b050..c026ac0e6969 100644 > --- a/drivers/soc/mediatek/mtk-mutex.c > +++ b/drivers/soc/mediatek/mtk-mutex.c > @@ -853,43 +853,84 @@ void mtk_mutex_unprepare(struct mtk_mutex *mutex) > } > EXPORT_SYMBOL_GPL(mtk_mutex_unprepare); > > -void mtk_mutex_add_comp(struct mtk_mutex *mutex, > - enum mtk_ddp_comp_id id) > +static int mtk_mutex_get_output_comp_sof(enum mtk_ddp_comp_id id) > { > - struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx, > - mutex[mutex->id]); > - unsigned int reg; > - unsigned int sof_id; > - unsigned int offset; > - > - WARN_ON(&mtx->mutex[mutex->id] != mutex); > - > switch (id) { > case DDP_COMPONENT_DSI0: > - sof_id = MUTEX_SOF_DSI0; > - break; > + return MUTEX_SOF_DSI0; > case DDP_COMPONENT_DSI1: > - sof_id = MUTEX_SOF_DSI0; > - break; > + return MUTEX_SOF_DSI1; > case DDP_COMPONENT_DSI2: > - sof_id = MUTEX_SOF_DSI2; > - break; > + return MUTEX_SOF_DSI2; > case DDP_COMPONENT_DSI3: > - sof_id = MUTEX_SOF_DSI3; > - break; > + return MUTEX_SOF_DSI3; > case DDP_COMPONENT_DPI0: > - sof_id = MUTEX_SOF_DPI0; > - break; > + return MUTEX_SOF_DPI0; > case DDP_COMPONENT_DPI1: > - sof_id = MUTEX_SOF_DPI1; > - break; > + return MUTEX_SOF_DPI1; > case DDP_COMPONENT_DP_INTF0: > - sof_id = MUTEX_SOF_DP_INTF0; > - break; > + return MUTEX_SOF_DP_INTF0; > case DDP_COMPONENT_DP_INTF1: > - sof_id = MUTEX_SOF_DP_INTF1; > - break; > + return MUTEX_SOF_DP_INTF1; > default: > + break; > + } > + > + return -EINVAL; > +} > + > +void mtk_mutex_add_comp_sof(struct mtk_mutex *mutex, enum mtk_ddp_comp_id id) > +{ > + struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx, > + mutex[mutex->id]); > + int sof_id = mtk_mutex_get_output_comp_sof(id); > + unsigned int offset; > + > + if (sof_id < 0 || sof_id >= DDP_MUTEX_SOF_MAX) > + return; > + > + WARN_ON(&mtx->mutex[mutex->id] != mutex); > + > + offset = DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, mutex->id); > + > + writel_relaxed(mtx->data->mutex_sof[sof_id], > + mtx->regs + offset); fits in one line > +} > +EXPORT_SYMBOL_GPL(mtk_mutex_add_comp_sof); > + > +void mtk_mutex_remove_comp_sof(struct mtk_mutex *mutex, enum mtk_ddp_comp_id id) > +{ > + struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx, > + mutex[mutex->id]); > + unsigned int reg; > + int sof_id = mtk_mutex_get_output_comp_sof(id); > + unsigned int offset; > + > + if (sof_id < 0 || sof_id >= DDP_MUTEX_SOF_MAX) > + return; > + > + WARN_ON(&mtx->mutex[mutex->id] != mutex); > + > + offset = DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, mutex->id); > + reg = readl_relaxed(mtx->regs + offset); > + reg &= ~(1 << mtx->data->mutex_sof[id]); > + > + writel_relaxed(reg, mtx->regs + offset); > +} > +EXPORT_SYMBOL_GPL(mtk_mutex_remove_comp_sof); > + > +void mtk_mutex_add_comp(struct mtk_mutex *mutex, > + enum mtk_ddp_comp_id id) > +{ > + struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx, > + mutex[mutex->id]); > + unsigned int reg; > + unsigned int offset; > + bool is_output_comp = !!mtk_mutex_get_output_comp_sof(id); > + > + WARN_ON(&mtx->mutex[mutex->id] != mutex); > + Looks like you can just do if (is_output_comp) { mtk_mutex_add_comp_sof(mutex, id); return; } if (mtx->data->mutex_mod[id] < 32) { .....etc > + if (!is_output_comp) { > if (mtx->data->mutex_mod[id] < 32) { > offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg, > mutex->id); > @@ -902,12 +943,10 @@ void mtk_mutex_add_comp(struct mtk_mutex *mutex, > reg |= 1 << (mtx->data->mutex_mod[id] - 32); > writel_relaxed(reg, mtx->regs + offset); > } > - return; > } > > - writel_relaxed(mtx->data->mutex_sof[sof_id], > - mtx->regs + > - DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, mutex->id)); > + if (is_output_comp) > + mtk_mutex_add_comp_sof(mutex, id); > } > EXPORT_SYMBOL_GPL(mtk_mutex_add_comp); > > @@ -918,24 +957,11 @@ void mtk_mutex_remove_comp(struct mtk_mutex *mutex, > mutex[mutex->id]); > unsigned int reg; > unsigned int offset; > + bool is_output_comp = !!mtk_mutex_get_output_comp_sof(id); > > WARN_ON(&mtx->mutex[mutex->id] != mutex); > > - switch (id) { > - case DDP_COMPONENT_DSI0: > - case DDP_COMPONENT_DSI1: > - case DDP_COMPONENT_DSI2: > - case DDP_COMPONENT_DSI3: > - case DDP_COMPONENT_DPI0: > - case DDP_COMPONENT_DPI1: > - case DDP_COMPONENT_DP_INTF0: > - case DDP_COMPONENT_DP_INTF1: > - writel_relaxed(MUTEX_SOF_SINGLE_MODE, > - mtx->regs + > - DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, > - mutex->id)); > - break; > - default: > + if (!is_output_comp) { same comment as before. > if (mtx->data->mutex_mod[id] < 32) { > offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg, > mutex->id); > @@ -948,8 +974,11 @@ void mtk_mutex_remove_comp(struct mtk_mutex *mutex, > reg &= ~(1 << (mtx->data->mutex_mod[id] - 32)); > writel_relaxed(reg, mtx->regs + offset); > } > - break; > } > + > + if (is_output_comp) > + mtk_mutex_remove_comp_sof(mutex, id); > + Regards, Angelo
diff --git a/drivers/soc/mediatek/mtk-mutex.c b/drivers/soc/mediatek/mtk-mutex.c index aaa965d4b050..c026ac0e6969 100644 --- a/drivers/soc/mediatek/mtk-mutex.c +++ b/drivers/soc/mediatek/mtk-mutex.c @@ -853,43 +853,84 @@ void mtk_mutex_unprepare(struct mtk_mutex *mutex) } EXPORT_SYMBOL_GPL(mtk_mutex_unprepare); -void mtk_mutex_add_comp(struct mtk_mutex *mutex, - enum mtk_ddp_comp_id id) +static int mtk_mutex_get_output_comp_sof(enum mtk_ddp_comp_id id) { - struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx, - mutex[mutex->id]); - unsigned int reg; - unsigned int sof_id; - unsigned int offset; - - WARN_ON(&mtx->mutex[mutex->id] != mutex); - switch (id) { case DDP_COMPONENT_DSI0: - sof_id = MUTEX_SOF_DSI0; - break; + return MUTEX_SOF_DSI0; case DDP_COMPONENT_DSI1: - sof_id = MUTEX_SOF_DSI0; - break; + return MUTEX_SOF_DSI1; case DDP_COMPONENT_DSI2: - sof_id = MUTEX_SOF_DSI2; - break; + return MUTEX_SOF_DSI2; case DDP_COMPONENT_DSI3: - sof_id = MUTEX_SOF_DSI3; - break; + return MUTEX_SOF_DSI3; case DDP_COMPONENT_DPI0: - sof_id = MUTEX_SOF_DPI0; - break; + return MUTEX_SOF_DPI0; case DDP_COMPONENT_DPI1: - sof_id = MUTEX_SOF_DPI1; - break; + return MUTEX_SOF_DPI1; case DDP_COMPONENT_DP_INTF0: - sof_id = MUTEX_SOF_DP_INTF0; - break; + return MUTEX_SOF_DP_INTF0; case DDP_COMPONENT_DP_INTF1: - sof_id = MUTEX_SOF_DP_INTF1; - break; + return MUTEX_SOF_DP_INTF1; default: + break; + } + + return -EINVAL; +} + +void mtk_mutex_add_comp_sof(struct mtk_mutex *mutex, enum mtk_ddp_comp_id id) +{ + struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx, + mutex[mutex->id]); + int sof_id = mtk_mutex_get_output_comp_sof(id); + unsigned int offset; + + if (sof_id < 0 || sof_id >= DDP_MUTEX_SOF_MAX) + return; + + WARN_ON(&mtx->mutex[mutex->id] != mutex); + + offset = DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, mutex->id); + + writel_relaxed(mtx->data->mutex_sof[sof_id], + mtx->regs + offset); +} +EXPORT_SYMBOL_GPL(mtk_mutex_add_comp_sof); + +void mtk_mutex_remove_comp_sof(struct mtk_mutex *mutex, enum mtk_ddp_comp_id id) +{ + struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx, + mutex[mutex->id]); + unsigned int reg; + int sof_id = mtk_mutex_get_output_comp_sof(id); + unsigned int offset; + + if (sof_id < 0 || sof_id >= DDP_MUTEX_SOF_MAX) + return; + + WARN_ON(&mtx->mutex[mutex->id] != mutex); + + offset = DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, mutex->id); + reg = readl_relaxed(mtx->regs + offset); + reg &= ~(1 << mtx->data->mutex_sof[id]); + + writel_relaxed(reg, mtx->regs + offset); +} +EXPORT_SYMBOL_GPL(mtk_mutex_remove_comp_sof); + +void mtk_mutex_add_comp(struct mtk_mutex *mutex, + enum mtk_ddp_comp_id id) +{ + struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx, + mutex[mutex->id]); + unsigned int reg; + unsigned int offset; + bool is_output_comp = !!mtk_mutex_get_output_comp_sof(id); + + WARN_ON(&mtx->mutex[mutex->id] != mutex); + + if (!is_output_comp) { if (mtx->data->mutex_mod[id] < 32) { offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg, mutex->id); @@ -902,12 +943,10 @@ void mtk_mutex_add_comp(struct mtk_mutex *mutex, reg |= 1 << (mtx->data->mutex_mod[id] - 32); writel_relaxed(reg, mtx->regs + offset); } - return; } - writel_relaxed(mtx->data->mutex_sof[sof_id], - mtx->regs + - DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, mutex->id)); + if (is_output_comp) + mtk_mutex_add_comp_sof(mutex, id); } EXPORT_SYMBOL_GPL(mtk_mutex_add_comp); @@ -918,24 +957,11 @@ void mtk_mutex_remove_comp(struct mtk_mutex *mutex, mutex[mutex->id]); unsigned int reg; unsigned int offset; + bool is_output_comp = !!mtk_mutex_get_output_comp_sof(id); WARN_ON(&mtx->mutex[mutex->id] != mutex); - switch (id) { - case DDP_COMPONENT_DSI0: - case DDP_COMPONENT_DSI1: - case DDP_COMPONENT_DSI2: - case DDP_COMPONENT_DSI3: - case DDP_COMPONENT_DPI0: - case DDP_COMPONENT_DPI1: - case DDP_COMPONENT_DP_INTF0: - case DDP_COMPONENT_DP_INTF1: - writel_relaxed(MUTEX_SOF_SINGLE_MODE, - mtx->regs + - DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, - mutex->id)); - break; - default: + if (!is_output_comp) { if (mtx->data->mutex_mod[id] < 32) { offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg, mutex->id); @@ -948,8 +974,11 @@ void mtk_mutex_remove_comp(struct mtk_mutex *mutex, reg &= ~(1 << (mtx->data->mutex_mod[id] - 32)); writel_relaxed(reg, mtx->regs + offset); } - break; } + + if (is_output_comp) + mtk_mutex_remove_comp_sof(mutex, id); + } EXPORT_SYMBOL_GPL(mtk_mutex_remove_comp); diff --git a/include/linux/soc/mediatek/mtk-mutex.h b/include/linux/soc/mediatek/mtk-mutex.h index 635218e3ac68..515e2d8bfc90 100644 --- a/include/linux/soc/mediatek/mtk-mutex.h +++ b/include/linux/soc/mediatek/mtk-mutex.h @@ -69,6 +69,10 @@ enum mtk_mutex_sof_index { struct mtk_mutex *mtk_mutex_get(struct device *dev); int mtk_mutex_prepare(struct mtk_mutex *mutex); +void mtk_mutex_add_comp_sof(struct mtk_mutex *mutex, + enum mtk_ddp_comp_id id); +void mtk_mutex_remove_comp_sof(struct mtk_mutex *mutex, + enum mtk_ddp_comp_id id); void mtk_mutex_add_comp(struct mtk_mutex *mutex, enum mtk_ddp_comp_id id); void mtk_mutex_enable(struct mtk_mutex *mutex);