Skip to content

Commit c54d2b9

Browse files
Roy-CW.Yehmbgg
authored andcommitted
soc: mediatek: mutex: Add mtk_mutex_set_mod support to set MOD1
Add mtk_mutex_set_mod support to set MOD1 Signed-off-by: Roy-CW.Yeh <roy-cw.yeh@mediatek.com> Signed-off-by: Moudy Ho <moudy.ho@mediatek.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Reviewed-by: Chen-Yu Tsai <wenst@chromium.org> Link: https://lore.kernel.org/r/20230206091109.1324-6-moudy.ho@mediatek.com Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
1 parent dd4f373 commit c54d2b9

1 file changed

Lines changed: 26 additions & 7 deletions

File tree

drivers/soc/mediatek/mtk-mutex.c

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#define DISP_REG_MUTEX(n) (0x24 + 0x20 * (n))
2424
#define DISP_REG_MUTEX_RST(n) (0x28 + 0x20 * (n))
2525
#define DISP_REG_MUTEX_MOD(mutex_mod_reg, n) (mutex_mod_reg + 0x20 * (n))
26+
#define DISP_REG_MUTEX_MOD1(mutex_mod_reg, n) ((mutex_mod_reg) + 0x20 * (n) + 0x4)
2627
#define DISP_REG_MUTEX_SOF(mutex_sof_reg, n) (mutex_sof_reg + 0x20 * (n))
2728
#define DISP_REG_MUTEX_MOD2(n) (0x34 + 0x20 * (n))
2829

@@ -828,7 +829,7 @@ int mtk_mutex_write_mod(struct mtk_mutex *mutex,
828829
struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
829830
mutex[mutex->id]);
830831
unsigned int reg;
831-
unsigned int offset;
832+
u32 reg_offset, id_offset = 0;
832833

833834
WARN_ON(&mtx->mutex[mutex->id] != mutex);
834835

@@ -838,16 +839,34 @@ int mtk_mutex_write_mod(struct mtk_mutex *mutex,
838839
return -EINVAL;
839840
}
840841

841-
offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg,
842-
mutex->id);
843-
reg = readl_relaxed(mtx->regs + offset);
842+
/*
843+
* Some SoCs may have multiple MUTEX_MOD registers as more than 32 mods
844+
* are present, hence requiring multiple 32-bits registers.
845+
*
846+
* The mutex_table_mod fully represents that by defining the number of
847+
* the mod sequentially, later used as a bit number, which can be more
848+
* than 0..31.
849+
*
850+
* In order to retain compatibility with older SoCs, we perform R/W on
851+
* the single 32 bits registers, but this requires us to translate the
852+
* mutex ID bit accordingly.
853+
*/
854+
if (mtx->data->mutex_table_mod[idx] < 32) {
855+
reg_offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg,
856+
mutex->id);
857+
} else {
858+
reg_offset = DISP_REG_MUTEX_MOD1(mtx->data->mutex_mod_reg,
859+
mutex->id);
860+
id_offset = 32;
861+
}
844862

863+
reg = readl_relaxed(mtx->regs + reg_offset);
845864
if (clear)
846-
reg &= ~BIT(mtx->data->mutex_table_mod[idx]);
865+
reg &= ~BIT(mtx->data->mutex_table_mod[idx] - id_offset);
847866
else
848-
reg |= BIT(mtx->data->mutex_table_mod[idx]);
867+
reg |= BIT(mtx->data->mutex_table_mod[idx] - id_offset);
849868

850-
writel_relaxed(reg, mtx->regs + offset);
869+
writel_relaxed(reg, mtx->regs + reg_offset);
851870

852871
return 0;
853872
}

0 commit comments

Comments
 (0)