Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Copyright (c) 2015 MediaTek Inc.
0004  */
0005 
0006 #include <linux/clk.h>
0007 #include <linux/iopoll.h>
0008 #include <linux/module.h>
0009 #include <linux/of_device.h>
0010 #include <linux/of_address.h>
0011 #include <linux/platform_device.h>
0012 #include <linux/regmap.h>
0013 #include <linux/soc/mediatek/mtk-mmsys.h>
0014 #include <linux/soc/mediatek/mtk-mutex.h>
0015 #include <linux/soc/mediatek/mtk-cmdq.h>
0016 
0017 #define MT2701_MUTEX0_MOD0          0x2c
0018 #define MT2701_MUTEX0_SOF0          0x30
0019 #define MT8183_MUTEX0_MOD0          0x30
0020 #define MT8183_MUTEX0_SOF0          0x2c
0021 
0022 #define DISP_REG_MUTEX_EN(n)            (0x20 + 0x20 * (n))
0023 #define DISP_REG_MUTEX(n)           (0x24 + 0x20 * (n))
0024 #define DISP_REG_MUTEX_RST(n)           (0x28 + 0x20 * (n))
0025 #define DISP_REG_MUTEX_MOD(mutex_mod_reg, n)    (mutex_mod_reg + 0x20 * (n))
0026 #define DISP_REG_MUTEX_SOF(mutex_sof_reg, n)    (mutex_sof_reg + 0x20 * (n))
0027 #define DISP_REG_MUTEX_MOD2(n)          (0x34 + 0x20 * (n))
0028 
0029 #define INT_MUTEX               BIT(1)
0030 
0031 #define MT8186_MUTEX_MOD_DISP_OVL0      0
0032 #define MT8186_MUTEX_MOD_DISP_OVL0_2L       1
0033 #define MT8186_MUTEX_MOD_DISP_RDMA0     2
0034 #define MT8186_MUTEX_MOD_DISP_COLOR0        4
0035 #define MT8186_MUTEX_MOD_DISP_CCORR0        5
0036 #define MT8186_MUTEX_MOD_DISP_AAL0      7
0037 #define MT8186_MUTEX_MOD_DISP_GAMMA0        8
0038 #define MT8186_MUTEX_MOD_DISP_POSTMASK0     9
0039 #define MT8186_MUTEX_MOD_DISP_DITHER0       10
0040 #define MT8186_MUTEX_MOD_DISP_RDMA1     17
0041 
0042 #define MT8186_MUTEX_SOF_SINGLE_MODE        0
0043 #define MT8186_MUTEX_SOF_DSI0           1
0044 #define MT8186_MUTEX_SOF_DPI0           2
0045 #define MT8186_MUTEX_EOF_DSI0           (MT8186_MUTEX_SOF_DSI0 << 6)
0046 #define MT8186_MUTEX_EOF_DPI0           (MT8186_MUTEX_SOF_DPI0 << 6)
0047 
0048 #define MT8167_MUTEX_MOD_DISP_PWM       1
0049 #define MT8167_MUTEX_MOD_DISP_OVL0      6
0050 #define MT8167_MUTEX_MOD_DISP_OVL1      7
0051 #define MT8167_MUTEX_MOD_DISP_RDMA0     8
0052 #define MT8167_MUTEX_MOD_DISP_RDMA1     9
0053 #define MT8167_MUTEX_MOD_DISP_WDMA0     10
0054 #define MT8167_MUTEX_MOD_DISP_CCORR     11
0055 #define MT8167_MUTEX_MOD_DISP_COLOR     12
0056 #define MT8167_MUTEX_MOD_DISP_AAL       13
0057 #define MT8167_MUTEX_MOD_DISP_GAMMA     14
0058 #define MT8167_MUTEX_MOD_DISP_DITHER        15
0059 #define MT8167_MUTEX_MOD_DISP_UFOE      16
0060 
0061 #define MT8192_MUTEX_MOD_DISP_OVL0      0
0062 #define MT8192_MUTEX_MOD_DISP_OVL0_2L       1
0063 #define MT8192_MUTEX_MOD_DISP_RDMA0     2
0064 #define MT8192_MUTEX_MOD_DISP_COLOR0        4
0065 #define MT8192_MUTEX_MOD_DISP_CCORR0        5
0066 #define MT8192_MUTEX_MOD_DISP_AAL0      6
0067 #define MT8192_MUTEX_MOD_DISP_GAMMA0        7
0068 #define MT8192_MUTEX_MOD_DISP_POSTMASK0     8
0069 #define MT8192_MUTEX_MOD_DISP_DITHER0       9
0070 #define MT8192_MUTEX_MOD_DISP_OVL2_2L       16
0071 #define MT8192_MUTEX_MOD_DISP_RDMA4     17
0072 
0073 #define MT8183_MUTEX_MOD_DISP_RDMA0     0
0074 #define MT8183_MUTEX_MOD_DISP_RDMA1     1
0075 #define MT8183_MUTEX_MOD_DISP_OVL0      9
0076 #define MT8183_MUTEX_MOD_DISP_OVL0_2L       10
0077 #define MT8183_MUTEX_MOD_DISP_OVL1_2L       11
0078 #define MT8183_MUTEX_MOD_DISP_WDMA0     12
0079 #define MT8183_MUTEX_MOD_DISP_COLOR0        13
0080 #define MT8183_MUTEX_MOD_DISP_CCORR0        14
0081 #define MT8183_MUTEX_MOD_DISP_AAL0      15
0082 #define MT8183_MUTEX_MOD_DISP_GAMMA0        16
0083 #define MT8183_MUTEX_MOD_DISP_DITHER0       17
0084 
0085 #define MT8183_MUTEX_MOD_MDP_RDMA0      2
0086 #define MT8183_MUTEX_MOD_MDP_RSZ0       4
0087 #define MT8183_MUTEX_MOD_MDP_RSZ1       5
0088 #define MT8183_MUTEX_MOD_MDP_TDSHP0     6
0089 #define MT8183_MUTEX_MOD_MDP_WROT0      7
0090 #define MT8183_MUTEX_MOD_MDP_WDMA       8
0091 #define MT8183_MUTEX_MOD_MDP_AAL0       23
0092 #define MT8183_MUTEX_MOD_MDP_CCORR0     24
0093 
0094 #define MT8173_MUTEX_MOD_DISP_OVL0      11
0095 #define MT8173_MUTEX_MOD_DISP_OVL1      12
0096 #define MT8173_MUTEX_MOD_DISP_RDMA0     13
0097 #define MT8173_MUTEX_MOD_DISP_RDMA1     14
0098 #define MT8173_MUTEX_MOD_DISP_RDMA2     15
0099 #define MT8173_MUTEX_MOD_DISP_WDMA0     16
0100 #define MT8173_MUTEX_MOD_DISP_WDMA1     17
0101 #define MT8173_MUTEX_MOD_DISP_COLOR0        18
0102 #define MT8173_MUTEX_MOD_DISP_COLOR1        19
0103 #define MT8173_MUTEX_MOD_DISP_AAL       20
0104 #define MT8173_MUTEX_MOD_DISP_GAMMA     21
0105 #define MT8173_MUTEX_MOD_DISP_UFOE      22
0106 #define MT8173_MUTEX_MOD_DISP_PWM0      23
0107 #define MT8173_MUTEX_MOD_DISP_PWM1      24
0108 #define MT8173_MUTEX_MOD_DISP_OD        25
0109 
0110 #define MT8195_MUTEX_MOD_DISP_OVL0      0
0111 #define MT8195_MUTEX_MOD_DISP_WDMA0     1
0112 #define MT8195_MUTEX_MOD_DISP_RDMA0     2
0113 #define MT8195_MUTEX_MOD_DISP_COLOR0        3
0114 #define MT8195_MUTEX_MOD_DISP_CCORR0        4
0115 #define MT8195_MUTEX_MOD_DISP_AAL0      5
0116 #define MT8195_MUTEX_MOD_DISP_GAMMA0        6
0117 #define MT8195_MUTEX_MOD_DISP_DITHER0       7
0118 #define MT8195_MUTEX_MOD_DISP_DSI0      8
0119 #define MT8195_MUTEX_MOD_DISP_DSC_WRAP0_CORE0   9
0120 #define MT8195_MUTEX_MOD_DISP_VPP_MERGE     20
0121 #define MT8195_MUTEX_MOD_DISP_DP_INTF0      21
0122 #define MT8195_MUTEX_MOD_DISP_PWM0      27
0123 
0124 #define MT8365_MUTEX_MOD_DISP_OVL0      7
0125 #define MT8365_MUTEX_MOD_DISP_OVL0_2L       8
0126 #define MT8365_MUTEX_MOD_DISP_RDMA0     9
0127 #define MT8365_MUTEX_MOD_DISP_RDMA1     10
0128 #define MT8365_MUTEX_MOD_DISP_WDMA0     11
0129 #define MT8365_MUTEX_MOD_DISP_COLOR0        12
0130 #define MT8365_MUTEX_MOD_DISP_CCORR     13
0131 #define MT8365_MUTEX_MOD_DISP_AAL       14
0132 #define MT8365_MUTEX_MOD_DISP_GAMMA     15
0133 #define MT8365_MUTEX_MOD_DISP_DITHER        16
0134 #define MT8365_MUTEX_MOD_DISP_DSI0      17
0135 #define MT8365_MUTEX_MOD_DISP_PWM0      20
0136 #define MT8365_MUTEX_MOD_DISP_DPI0      22
0137 
0138 #define MT2712_MUTEX_MOD_DISP_PWM2      10
0139 #define MT2712_MUTEX_MOD_DISP_OVL0      11
0140 #define MT2712_MUTEX_MOD_DISP_OVL1      12
0141 #define MT2712_MUTEX_MOD_DISP_RDMA0     13
0142 #define MT2712_MUTEX_MOD_DISP_RDMA1     14
0143 #define MT2712_MUTEX_MOD_DISP_RDMA2     15
0144 #define MT2712_MUTEX_MOD_DISP_WDMA0     16
0145 #define MT2712_MUTEX_MOD_DISP_WDMA1     17
0146 #define MT2712_MUTEX_MOD_DISP_COLOR0        18
0147 #define MT2712_MUTEX_MOD_DISP_COLOR1        19
0148 #define MT2712_MUTEX_MOD_DISP_AAL0      20
0149 #define MT2712_MUTEX_MOD_DISP_UFOE      22
0150 #define MT2712_MUTEX_MOD_DISP_PWM0      23
0151 #define MT2712_MUTEX_MOD_DISP_PWM1      24
0152 #define MT2712_MUTEX_MOD_DISP_OD0       25
0153 #define MT2712_MUTEX_MOD2_DISP_AAL1     33
0154 #define MT2712_MUTEX_MOD2_DISP_OD1      34
0155 
0156 #define MT2701_MUTEX_MOD_DISP_OVL       3
0157 #define MT2701_MUTEX_MOD_DISP_WDMA      6
0158 #define MT2701_MUTEX_MOD_DISP_COLOR     7
0159 #define MT2701_MUTEX_MOD_DISP_BLS       9
0160 #define MT2701_MUTEX_MOD_DISP_RDMA0     10
0161 #define MT2701_MUTEX_MOD_DISP_RDMA1     12
0162 
0163 #define MT2712_MUTEX_SOF_SINGLE_MODE        0
0164 #define MT2712_MUTEX_SOF_DSI0           1
0165 #define MT2712_MUTEX_SOF_DSI1           2
0166 #define MT2712_MUTEX_SOF_DPI0           3
0167 #define MT2712_MUTEX_SOF_DPI1           4
0168 #define MT2712_MUTEX_SOF_DSI2           5
0169 #define MT2712_MUTEX_SOF_DSI3           6
0170 #define MT8167_MUTEX_SOF_DPI0           2
0171 #define MT8167_MUTEX_SOF_DPI1           3
0172 #define MT8183_MUTEX_SOF_DSI0           1
0173 #define MT8183_MUTEX_SOF_DPI0           2
0174 #define MT8195_MUTEX_SOF_DSI0           1
0175 #define MT8195_MUTEX_SOF_DSI1           2
0176 #define MT8195_MUTEX_SOF_DP_INTF0       3
0177 #define MT8195_MUTEX_SOF_DP_INTF1       4
0178 #define MT8195_MUTEX_SOF_DPI0           6 /* for HDMI_TX */
0179 #define MT8195_MUTEX_SOF_DPI1           5 /* for digital video out */
0180 
0181 #define MT8183_MUTEX_EOF_DSI0           (MT8183_MUTEX_SOF_DSI0 << 6)
0182 #define MT8183_MUTEX_EOF_DPI0           (MT8183_MUTEX_SOF_DPI0 << 6)
0183 #define MT8195_MUTEX_EOF_DSI0           (MT8195_MUTEX_SOF_DSI0 << 7)
0184 #define MT8195_MUTEX_EOF_DSI1           (MT8195_MUTEX_SOF_DSI1 << 7)
0185 #define MT8195_MUTEX_EOF_DP_INTF0       (MT8195_MUTEX_SOF_DP_INTF0 << 7)
0186 #define MT8195_MUTEX_EOF_DP_INTF1       (MT8195_MUTEX_SOF_DP_INTF1 << 7)
0187 #define MT8195_MUTEX_EOF_DPI0           (MT8195_MUTEX_SOF_DPI0 << 7)
0188 #define MT8195_MUTEX_EOF_DPI1           (MT8195_MUTEX_SOF_DPI1 << 7)
0189 
0190 struct mtk_mutex {
0191     int id;
0192     bool claimed;
0193 };
0194 
0195 enum mtk_mutex_sof_id {
0196     MUTEX_SOF_SINGLE_MODE,
0197     MUTEX_SOF_DSI0,
0198     MUTEX_SOF_DSI1,
0199     MUTEX_SOF_DPI0,
0200     MUTEX_SOF_DPI1,
0201     MUTEX_SOF_DSI2,
0202     MUTEX_SOF_DSI3,
0203     MUTEX_SOF_DP_INTF0,
0204     MUTEX_SOF_DP_INTF1,
0205     DDP_MUTEX_SOF_MAX,
0206 };
0207 
0208 struct mtk_mutex_data {
0209     const unsigned int *mutex_mod;
0210     const unsigned int *mutex_sof;
0211     const unsigned int mutex_mod_reg;
0212     const unsigned int mutex_sof_reg;
0213     const unsigned int *mutex_table_mod;
0214     const bool no_clk;
0215 };
0216 
0217 struct mtk_mutex_ctx {
0218     struct device           *dev;
0219     struct clk          *clk;
0220     void __iomem            *regs;
0221     struct mtk_mutex        mutex[10];
0222     const struct mtk_mutex_data *data;
0223     phys_addr_t         addr;
0224     struct cmdq_client_reg      cmdq_reg;
0225 };
0226 
0227 static const unsigned int mt2701_mutex_mod[DDP_COMPONENT_ID_MAX] = {
0228     [DDP_COMPONENT_BLS] = MT2701_MUTEX_MOD_DISP_BLS,
0229     [DDP_COMPONENT_COLOR0] = MT2701_MUTEX_MOD_DISP_COLOR,
0230     [DDP_COMPONENT_OVL0] = MT2701_MUTEX_MOD_DISP_OVL,
0231     [DDP_COMPONENT_RDMA0] = MT2701_MUTEX_MOD_DISP_RDMA0,
0232     [DDP_COMPONENT_RDMA1] = MT2701_MUTEX_MOD_DISP_RDMA1,
0233     [DDP_COMPONENT_WDMA0] = MT2701_MUTEX_MOD_DISP_WDMA,
0234 };
0235 
0236 static const unsigned int mt2712_mutex_mod[DDP_COMPONENT_ID_MAX] = {
0237     [DDP_COMPONENT_AAL0] = MT2712_MUTEX_MOD_DISP_AAL0,
0238     [DDP_COMPONENT_AAL1] = MT2712_MUTEX_MOD2_DISP_AAL1,
0239     [DDP_COMPONENT_COLOR0] = MT2712_MUTEX_MOD_DISP_COLOR0,
0240     [DDP_COMPONENT_COLOR1] = MT2712_MUTEX_MOD_DISP_COLOR1,
0241     [DDP_COMPONENT_OD0] = MT2712_MUTEX_MOD_DISP_OD0,
0242     [DDP_COMPONENT_OD1] = MT2712_MUTEX_MOD2_DISP_OD1,
0243     [DDP_COMPONENT_OVL0] = MT2712_MUTEX_MOD_DISP_OVL0,
0244     [DDP_COMPONENT_OVL1] = MT2712_MUTEX_MOD_DISP_OVL1,
0245     [DDP_COMPONENT_PWM0] = MT2712_MUTEX_MOD_DISP_PWM0,
0246     [DDP_COMPONENT_PWM1] = MT2712_MUTEX_MOD_DISP_PWM1,
0247     [DDP_COMPONENT_PWM2] = MT2712_MUTEX_MOD_DISP_PWM2,
0248     [DDP_COMPONENT_RDMA0] = MT2712_MUTEX_MOD_DISP_RDMA0,
0249     [DDP_COMPONENT_RDMA1] = MT2712_MUTEX_MOD_DISP_RDMA1,
0250     [DDP_COMPONENT_RDMA2] = MT2712_MUTEX_MOD_DISP_RDMA2,
0251     [DDP_COMPONENT_UFOE] = MT2712_MUTEX_MOD_DISP_UFOE,
0252     [DDP_COMPONENT_WDMA0] = MT2712_MUTEX_MOD_DISP_WDMA0,
0253     [DDP_COMPONENT_WDMA1] = MT2712_MUTEX_MOD_DISP_WDMA1,
0254 };
0255 
0256 static const unsigned int mt8167_mutex_mod[DDP_COMPONENT_ID_MAX] = {
0257     [DDP_COMPONENT_AAL0] = MT8167_MUTEX_MOD_DISP_AAL,
0258     [DDP_COMPONENT_CCORR] = MT8167_MUTEX_MOD_DISP_CCORR,
0259     [DDP_COMPONENT_COLOR0] = MT8167_MUTEX_MOD_DISP_COLOR,
0260     [DDP_COMPONENT_DITHER0] = MT8167_MUTEX_MOD_DISP_DITHER,
0261     [DDP_COMPONENT_GAMMA] = MT8167_MUTEX_MOD_DISP_GAMMA,
0262     [DDP_COMPONENT_OVL0] = MT8167_MUTEX_MOD_DISP_OVL0,
0263     [DDP_COMPONENT_OVL1] = MT8167_MUTEX_MOD_DISP_OVL1,
0264     [DDP_COMPONENT_PWM0] = MT8167_MUTEX_MOD_DISP_PWM,
0265     [DDP_COMPONENT_RDMA0] = MT8167_MUTEX_MOD_DISP_RDMA0,
0266     [DDP_COMPONENT_RDMA1] = MT8167_MUTEX_MOD_DISP_RDMA1,
0267     [DDP_COMPONENT_UFOE] = MT8167_MUTEX_MOD_DISP_UFOE,
0268     [DDP_COMPONENT_WDMA0] = MT8167_MUTEX_MOD_DISP_WDMA0,
0269 };
0270 
0271 static const unsigned int mt8173_mutex_mod[DDP_COMPONENT_ID_MAX] = {
0272     [DDP_COMPONENT_AAL0] = MT8173_MUTEX_MOD_DISP_AAL,
0273     [DDP_COMPONENT_COLOR0] = MT8173_MUTEX_MOD_DISP_COLOR0,
0274     [DDP_COMPONENT_COLOR1] = MT8173_MUTEX_MOD_DISP_COLOR1,
0275     [DDP_COMPONENT_GAMMA] = MT8173_MUTEX_MOD_DISP_GAMMA,
0276     [DDP_COMPONENT_OD0] = MT8173_MUTEX_MOD_DISP_OD,
0277     [DDP_COMPONENT_OVL0] = MT8173_MUTEX_MOD_DISP_OVL0,
0278     [DDP_COMPONENT_OVL1] = MT8173_MUTEX_MOD_DISP_OVL1,
0279     [DDP_COMPONENT_PWM0] = MT8173_MUTEX_MOD_DISP_PWM0,
0280     [DDP_COMPONENT_PWM1] = MT8173_MUTEX_MOD_DISP_PWM1,
0281     [DDP_COMPONENT_RDMA0] = MT8173_MUTEX_MOD_DISP_RDMA0,
0282     [DDP_COMPONENT_RDMA1] = MT8173_MUTEX_MOD_DISP_RDMA1,
0283     [DDP_COMPONENT_RDMA2] = MT8173_MUTEX_MOD_DISP_RDMA2,
0284     [DDP_COMPONENT_UFOE] = MT8173_MUTEX_MOD_DISP_UFOE,
0285     [DDP_COMPONENT_WDMA0] = MT8173_MUTEX_MOD_DISP_WDMA0,
0286     [DDP_COMPONENT_WDMA1] = MT8173_MUTEX_MOD_DISP_WDMA1,
0287 };
0288 
0289 static const unsigned int mt8183_mutex_mod[DDP_COMPONENT_ID_MAX] = {
0290     [DDP_COMPONENT_AAL0] = MT8183_MUTEX_MOD_DISP_AAL0,
0291     [DDP_COMPONENT_CCORR] = MT8183_MUTEX_MOD_DISP_CCORR0,
0292     [DDP_COMPONENT_COLOR0] = MT8183_MUTEX_MOD_DISP_COLOR0,
0293     [DDP_COMPONENT_DITHER0] = MT8183_MUTEX_MOD_DISP_DITHER0,
0294     [DDP_COMPONENT_GAMMA] = MT8183_MUTEX_MOD_DISP_GAMMA0,
0295     [DDP_COMPONENT_OVL0] = MT8183_MUTEX_MOD_DISP_OVL0,
0296     [DDP_COMPONENT_OVL_2L0] = MT8183_MUTEX_MOD_DISP_OVL0_2L,
0297     [DDP_COMPONENT_OVL_2L1] = MT8183_MUTEX_MOD_DISP_OVL1_2L,
0298     [DDP_COMPONENT_RDMA0] = MT8183_MUTEX_MOD_DISP_RDMA0,
0299     [DDP_COMPONENT_RDMA1] = MT8183_MUTEX_MOD_DISP_RDMA1,
0300     [DDP_COMPONENT_WDMA0] = MT8183_MUTEX_MOD_DISP_WDMA0,
0301 };
0302 
0303 static const unsigned int mt8183_mutex_table_mod[MUTEX_MOD_IDX_MAX] = {
0304     [MUTEX_MOD_IDX_MDP_RDMA0] = MT8183_MUTEX_MOD_MDP_RDMA0,
0305     [MUTEX_MOD_IDX_MDP_RSZ0] = MT8183_MUTEX_MOD_MDP_RSZ0,
0306     [MUTEX_MOD_IDX_MDP_RSZ1] = MT8183_MUTEX_MOD_MDP_RSZ1,
0307     [MUTEX_MOD_IDX_MDP_TDSHP0] = MT8183_MUTEX_MOD_MDP_TDSHP0,
0308     [MUTEX_MOD_IDX_MDP_WROT0] = MT8183_MUTEX_MOD_MDP_WROT0,
0309     [MUTEX_MOD_IDX_MDP_WDMA] = MT8183_MUTEX_MOD_MDP_WDMA,
0310     [MUTEX_MOD_IDX_MDP_AAL0] = MT8183_MUTEX_MOD_MDP_AAL0,
0311     [MUTEX_MOD_IDX_MDP_CCORR0] = MT8183_MUTEX_MOD_MDP_CCORR0,
0312 };
0313 
0314 static const unsigned int mt8186_mutex_mod[DDP_COMPONENT_ID_MAX] = {
0315     [DDP_COMPONENT_AAL0] = MT8186_MUTEX_MOD_DISP_AAL0,
0316     [DDP_COMPONENT_CCORR] = MT8186_MUTEX_MOD_DISP_CCORR0,
0317     [DDP_COMPONENT_COLOR0] = MT8186_MUTEX_MOD_DISP_COLOR0,
0318     [DDP_COMPONENT_DITHER0] = MT8186_MUTEX_MOD_DISP_DITHER0,
0319     [DDP_COMPONENT_GAMMA] = MT8186_MUTEX_MOD_DISP_GAMMA0,
0320     [DDP_COMPONENT_OVL0] = MT8186_MUTEX_MOD_DISP_OVL0,
0321     [DDP_COMPONENT_OVL_2L0] = MT8186_MUTEX_MOD_DISP_OVL0_2L,
0322     [DDP_COMPONENT_POSTMASK0] = MT8186_MUTEX_MOD_DISP_POSTMASK0,
0323     [DDP_COMPONENT_RDMA0] = MT8186_MUTEX_MOD_DISP_RDMA0,
0324     [DDP_COMPONENT_RDMA1] = MT8186_MUTEX_MOD_DISP_RDMA1,
0325 };
0326 
0327 static const unsigned int mt8192_mutex_mod[DDP_COMPONENT_ID_MAX] = {
0328     [DDP_COMPONENT_AAL0] = MT8192_MUTEX_MOD_DISP_AAL0,
0329     [DDP_COMPONENT_CCORR] = MT8192_MUTEX_MOD_DISP_CCORR0,
0330     [DDP_COMPONENT_COLOR0] = MT8192_MUTEX_MOD_DISP_COLOR0,
0331     [DDP_COMPONENT_DITHER0] = MT8192_MUTEX_MOD_DISP_DITHER0,
0332     [DDP_COMPONENT_GAMMA] = MT8192_MUTEX_MOD_DISP_GAMMA0,
0333     [DDP_COMPONENT_POSTMASK0] = MT8192_MUTEX_MOD_DISP_POSTMASK0,
0334     [DDP_COMPONENT_OVL0] = MT8192_MUTEX_MOD_DISP_OVL0,
0335     [DDP_COMPONENT_OVL_2L0] = MT8192_MUTEX_MOD_DISP_OVL0_2L,
0336     [DDP_COMPONENT_OVL_2L2] = MT8192_MUTEX_MOD_DISP_OVL2_2L,
0337     [DDP_COMPONENT_RDMA0] = MT8192_MUTEX_MOD_DISP_RDMA0,
0338     [DDP_COMPONENT_RDMA4] = MT8192_MUTEX_MOD_DISP_RDMA4,
0339 };
0340 
0341 static const unsigned int mt8195_mutex_mod[DDP_COMPONENT_ID_MAX] = {
0342     [DDP_COMPONENT_OVL0] = MT8195_MUTEX_MOD_DISP_OVL0,
0343     [DDP_COMPONENT_WDMA0] = MT8195_MUTEX_MOD_DISP_WDMA0,
0344     [DDP_COMPONENT_RDMA0] = MT8195_MUTEX_MOD_DISP_RDMA0,
0345     [DDP_COMPONENT_COLOR0] = MT8195_MUTEX_MOD_DISP_COLOR0,
0346     [DDP_COMPONENT_CCORR] = MT8195_MUTEX_MOD_DISP_CCORR0,
0347     [DDP_COMPONENT_AAL0] = MT8195_MUTEX_MOD_DISP_AAL0,
0348     [DDP_COMPONENT_GAMMA] = MT8195_MUTEX_MOD_DISP_GAMMA0,
0349     [DDP_COMPONENT_DITHER0] = MT8195_MUTEX_MOD_DISP_DITHER0,
0350     [DDP_COMPONENT_MERGE0] = MT8195_MUTEX_MOD_DISP_VPP_MERGE,
0351     [DDP_COMPONENT_DSC0] = MT8195_MUTEX_MOD_DISP_DSC_WRAP0_CORE0,
0352     [DDP_COMPONENT_DSI0] = MT8195_MUTEX_MOD_DISP_DSI0,
0353     [DDP_COMPONENT_PWM0] = MT8195_MUTEX_MOD_DISP_PWM0,
0354     [DDP_COMPONENT_DP_INTF0] = MT8195_MUTEX_MOD_DISP_DP_INTF0,
0355 };
0356 
0357 static const unsigned int mt8365_mutex_mod[DDP_COMPONENT_ID_MAX] = {
0358     [DDP_COMPONENT_AAL0] = MT8365_MUTEX_MOD_DISP_AAL,
0359     [DDP_COMPONENT_CCORR] = MT8365_MUTEX_MOD_DISP_CCORR,
0360     [DDP_COMPONENT_COLOR0] = MT8365_MUTEX_MOD_DISP_COLOR0,
0361     [DDP_COMPONENT_DITHER0] = MT8365_MUTEX_MOD_DISP_DITHER,
0362     [DDP_COMPONENT_DPI0] = MT8365_MUTEX_MOD_DISP_DPI0,
0363     [DDP_COMPONENT_DSI0] = MT8365_MUTEX_MOD_DISP_DSI0,
0364     [DDP_COMPONENT_GAMMA] = MT8365_MUTEX_MOD_DISP_GAMMA,
0365     [DDP_COMPONENT_OVL0] = MT8365_MUTEX_MOD_DISP_OVL0,
0366     [DDP_COMPONENT_OVL_2L0] = MT8365_MUTEX_MOD_DISP_OVL0_2L,
0367     [DDP_COMPONENT_PWM0] = MT8365_MUTEX_MOD_DISP_PWM0,
0368     [DDP_COMPONENT_RDMA0] = MT8365_MUTEX_MOD_DISP_RDMA0,
0369     [DDP_COMPONENT_RDMA1] = MT8365_MUTEX_MOD_DISP_RDMA1,
0370     [DDP_COMPONENT_WDMA0] = MT8365_MUTEX_MOD_DISP_WDMA0,
0371 };
0372 
0373 static const unsigned int mt2712_mutex_sof[DDP_MUTEX_SOF_MAX] = {
0374     [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
0375     [MUTEX_SOF_DSI0] = MUTEX_SOF_DSI0,
0376     [MUTEX_SOF_DSI1] = MUTEX_SOF_DSI1,
0377     [MUTEX_SOF_DPI0] = MUTEX_SOF_DPI0,
0378     [MUTEX_SOF_DPI1] = MUTEX_SOF_DPI1,
0379     [MUTEX_SOF_DSI2] = MUTEX_SOF_DSI2,
0380     [MUTEX_SOF_DSI3] = MUTEX_SOF_DSI3,
0381 };
0382 
0383 static const unsigned int mt8167_mutex_sof[DDP_MUTEX_SOF_MAX] = {
0384     [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
0385     [MUTEX_SOF_DSI0] = MUTEX_SOF_DSI0,
0386     [MUTEX_SOF_DPI0] = MT8167_MUTEX_SOF_DPI0,
0387     [MUTEX_SOF_DPI1] = MT8167_MUTEX_SOF_DPI1,
0388 };
0389 
0390 /* Add EOF setting so overlay hardware can receive frame done irq */
0391 static const unsigned int mt8183_mutex_sof[DDP_MUTEX_SOF_MAX] = {
0392     [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
0393     [MUTEX_SOF_DSI0] = MUTEX_SOF_DSI0 | MT8183_MUTEX_EOF_DSI0,
0394     [MUTEX_SOF_DPI0] = MT8183_MUTEX_SOF_DPI0 | MT8183_MUTEX_EOF_DPI0,
0395 };
0396 
0397 static const unsigned int mt8186_mutex_sof[MUTEX_SOF_DSI3 + 1] = {
0398     [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
0399     [MUTEX_SOF_DSI0] = MT8186_MUTEX_SOF_DSI0 | MT8186_MUTEX_EOF_DSI0,
0400     [MUTEX_SOF_DPI0] = MT8186_MUTEX_SOF_DPI0 | MT8186_MUTEX_EOF_DPI0,
0401 };
0402 
0403 /*
0404  * To support refresh mode(video mode), DISP_REG_MUTEX_SOF should
0405  * select the EOF source and configure the EOF plus timing from the
0406  * module that provides the timing signal.
0407  * So that MUTEX can not only send a STREAM_DONE event to GCE
0408  * but also detect the error at end of frame(EAEOF) when EOF signal
0409  * arrives.
0410  */
0411 static const unsigned int mt8195_mutex_sof[DDP_MUTEX_SOF_MAX] = {
0412     [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
0413     [MUTEX_SOF_DSI0] = MT8195_MUTEX_SOF_DSI0 | MT8195_MUTEX_EOF_DSI0,
0414     [MUTEX_SOF_DSI1] = MT8195_MUTEX_SOF_DSI1 | MT8195_MUTEX_EOF_DSI1,
0415     [MUTEX_SOF_DPI0] = MT8195_MUTEX_SOF_DPI0 | MT8195_MUTEX_EOF_DPI0,
0416     [MUTEX_SOF_DPI1] = MT8195_MUTEX_SOF_DPI1 | MT8195_MUTEX_EOF_DPI1,
0417     [MUTEX_SOF_DP_INTF0] =
0418         MT8195_MUTEX_SOF_DP_INTF0 | MT8195_MUTEX_EOF_DP_INTF0,
0419     [MUTEX_SOF_DP_INTF1] =
0420         MT8195_MUTEX_SOF_DP_INTF1 | MT8195_MUTEX_EOF_DP_INTF1,
0421 };
0422 
0423 static const struct mtk_mutex_data mt2701_mutex_driver_data = {
0424     .mutex_mod = mt2701_mutex_mod,
0425     .mutex_sof = mt2712_mutex_sof,
0426     .mutex_mod_reg = MT2701_MUTEX0_MOD0,
0427     .mutex_sof_reg = MT2701_MUTEX0_SOF0,
0428 };
0429 
0430 static const struct mtk_mutex_data mt2712_mutex_driver_data = {
0431     .mutex_mod = mt2712_mutex_mod,
0432     .mutex_sof = mt2712_mutex_sof,
0433     .mutex_mod_reg = MT2701_MUTEX0_MOD0,
0434     .mutex_sof_reg = MT2701_MUTEX0_SOF0,
0435 };
0436 
0437 static const struct mtk_mutex_data mt8167_mutex_driver_data = {
0438     .mutex_mod = mt8167_mutex_mod,
0439     .mutex_sof = mt8167_mutex_sof,
0440     .mutex_mod_reg = MT2701_MUTEX0_MOD0,
0441     .mutex_sof_reg = MT2701_MUTEX0_SOF0,
0442     .no_clk = true,
0443 };
0444 
0445 static const struct mtk_mutex_data mt8173_mutex_driver_data = {
0446     .mutex_mod = mt8173_mutex_mod,
0447     .mutex_sof = mt2712_mutex_sof,
0448     .mutex_mod_reg = MT2701_MUTEX0_MOD0,
0449     .mutex_sof_reg = MT2701_MUTEX0_SOF0,
0450 };
0451 
0452 static const struct mtk_mutex_data mt8183_mutex_driver_data = {
0453     .mutex_mod = mt8183_mutex_mod,
0454     .mutex_sof = mt8183_mutex_sof,
0455     .mutex_mod_reg = MT8183_MUTEX0_MOD0,
0456     .mutex_sof_reg = MT8183_MUTEX0_SOF0,
0457     .mutex_table_mod = mt8183_mutex_table_mod,
0458     .no_clk = true,
0459 };
0460 
0461 static const struct mtk_mutex_data mt8186_mutex_driver_data = {
0462     .mutex_mod = mt8186_mutex_mod,
0463     .mutex_sof = mt8186_mutex_sof,
0464     .mutex_mod_reg = MT8183_MUTEX0_MOD0,
0465     .mutex_sof_reg = MT8183_MUTEX0_SOF0,
0466 };
0467 
0468 static const struct mtk_mutex_data mt8192_mutex_driver_data = {
0469     .mutex_mod = mt8192_mutex_mod,
0470     .mutex_sof = mt8183_mutex_sof,
0471     .mutex_mod_reg = MT8183_MUTEX0_MOD0,
0472     .mutex_sof_reg = MT8183_MUTEX0_SOF0,
0473 };
0474 
0475 static const struct mtk_mutex_data mt8195_mutex_driver_data = {
0476     .mutex_mod = mt8195_mutex_mod,
0477     .mutex_sof = mt8195_mutex_sof,
0478     .mutex_mod_reg = MT8183_MUTEX0_MOD0,
0479     .mutex_sof_reg = MT8183_MUTEX0_SOF0,
0480 };
0481 
0482 static const struct mtk_mutex_data mt8365_mutex_driver_data = {
0483     .mutex_mod = mt8365_mutex_mod,
0484     .mutex_sof = mt8183_mutex_sof,
0485     .mutex_mod_reg = MT8183_MUTEX0_MOD0,
0486     .mutex_sof_reg = MT8183_MUTEX0_SOF0,
0487     .no_clk = true,
0488 };
0489 
0490 struct mtk_mutex *mtk_mutex_get(struct device *dev)
0491 {
0492     struct mtk_mutex_ctx *mtx = dev_get_drvdata(dev);
0493     int i;
0494 
0495     for (i = 0; i < 10; i++)
0496         if (!mtx->mutex[i].claimed) {
0497             mtx->mutex[i].claimed = true;
0498             return &mtx->mutex[i];
0499         }
0500 
0501     return ERR_PTR(-EBUSY);
0502 }
0503 EXPORT_SYMBOL_GPL(mtk_mutex_get);
0504 
0505 void mtk_mutex_put(struct mtk_mutex *mutex)
0506 {
0507     struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
0508                          mutex[mutex->id]);
0509 
0510     WARN_ON(&mtx->mutex[mutex->id] != mutex);
0511 
0512     mutex->claimed = false;
0513 }
0514 EXPORT_SYMBOL_GPL(mtk_mutex_put);
0515 
0516 int mtk_mutex_prepare(struct mtk_mutex *mutex)
0517 {
0518     struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
0519                          mutex[mutex->id]);
0520     return clk_prepare_enable(mtx->clk);
0521 }
0522 EXPORT_SYMBOL_GPL(mtk_mutex_prepare);
0523 
0524 void mtk_mutex_unprepare(struct mtk_mutex *mutex)
0525 {
0526     struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
0527                          mutex[mutex->id]);
0528     clk_disable_unprepare(mtx->clk);
0529 }
0530 EXPORT_SYMBOL_GPL(mtk_mutex_unprepare);
0531 
0532 void mtk_mutex_add_comp(struct mtk_mutex *mutex,
0533             enum mtk_ddp_comp_id id)
0534 {
0535     struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
0536                          mutex[mutex->id]);
0537     unsigned int reg;
0538     unsigned int sof_id;
0539     unsigned int offset;
0540 
0541     WARN_ON(&mtx->mutex[mutex->id] != mutex);
0542 
0543     switch (id) {
0544     case DDP_COMPONENT_DSI0:
0545         sof_id = MUTEX_SOF_DSI0;
0546         break;
0547     case DDP_COMPONENT_DSI1:
0548         sof_id = MUTEX_SOF_DSI0;
0549         break;
0550     case DDP_COMPONENT_DSI2:
0551         sof_id = MUTEX_SOF_DSI2;
0552         break;
0553     case DDP_COMPONENT_DSI3:
0554         sof_id = MUTEX_SOF_DSI3;
0555         break;
0556     case DDP_COMPONENT_DPI0:
0557         sof_id = MUTEX_SOF_DPI0;
0558         break;
0559     case DDP_COMPONENT_DPI1:
0560         sof_id = MUTEX_SOF_DPI1;
0561         break;
0562     case DDP_COMPONENT_DP_INTF0:
0563         sof_id = MUTEX_SOF_DP_INTF0;
0564         break;
0565     default:
0566         if (mtx->data->mutex_mod[id] < 32) {
0567             offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg,
0568                             mutex->id);
0569             reg = readl_relaxed(mtx->regs + offset);
0570             reg |= 1 << mtx->data->mutex_mod[id];
0571             writel_relaxed(reg, mtx->regs + offset);
0572         } else {
0573             offset = DISP_REG_MUTEX_MOD2(mutex->id);
0574             reg = readl_relaxed(mtx->regs + offset);
0575             reg |= 1 << (mtx->data->mutex_mod[id] - 32);
0576             writel_relaxed(reg, mtx->regs + offset);
0577         }
0578         return;
0579     }
0580 
0581     writel_relaxed(mtx->data->mutex_sof[sof_id],
0582                mtx->regs +
0583                DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, mutex->id));
0584 }
0585 EXPORT_SYMBOL_GPL(mtk_mutex_add_comp);
0586 
0587 void mtk_mutex_remove_comp(struct mtk_mutex *mutex,
0588                enum mtk_ddp_comp_id id)
0589 {
0590     struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
0591                          mutex[mutex->id]);
0592     unsigned int reg;
0593     unsigned int offset;
0594 
0595     WARN_ON(&mtx->mutex[mutex->id] != mutex);
0596 
0597     switch (id) {
0598     case DDP_COMPONENT_DSI0:
0599     case DDP_COMPONENT_DSI1:
0600     case DDP_COMPONENT_DSI2:
0601     case DDP_COMPONENT_DSI3:
0602     case DDP_COMPONENT_DPI0:
0603     case DDP_COMPONENT_DPI1:
0604     case DDP_COMPONENT_DP_INTF0:
0605         writel_relaxed(MUTEX_SOF_SINGLE_MODE,
0606                    mtx->regs +
0607                    DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg,
0608                           mutex->id));
0609         break;
0610     default:
0611         if (mtx->data->mutex_mod[id] < 32) {
0612             offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg,
0613                             mutex->id);
0614             reg = readl_relaxed(mtx->regs + offset);
0615             reg &= ~(1 << mtx->data->mutex_mod[id]);
0616             writel_relaxed(reg, mtx->regs + offset);
0617         } else {
0618             offset = DISP_REG_MUTEX_MOD2(mutex->id);
0619             reg = readl_relaxed(mtx->regs + offset);
0620             reg &= ~(1 << (mtx->data->mutex_mod[id] - 32));
0621             writel_relaxed(reg, mtx->regs + offset);
0622         }
0623         break;
0624     }
0625 }
0626 EXPORT_SYMBOL_GPL(mtk_mutex_remove_comp);
0627 
0628 void mtk_mutex_enable(struct mtk_mutex *mutex)
0629 {
0630     struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
0631                          mutex[mutex->id]);
0632 
0633     WARN_ON(&mtx->mutex[mutex->id] != mutex);
0634 
0635     writel(1, mtx->regs + DISP_REG_MUTEX_EN(mutex->id));
0636 }
0637 EXPORT_SYMBOL_GPL(mtk_mutex_enable);
0638 
0639 int mtk_mutex_enable_by_cmdq(struct mtk_mutex *mutex, void *pkt)
0640 {
0641     struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
0642                          mutex[mutex->id]);
0643 #if IS_REACHABLE(CONFIG_MTK_CMDQ)
0644     struct cmdq_pkt *cmdq_pkt = (struct cmdq_pkt *)pkt;
0645 
0646     WARN_ON(&mtx->mutex[mutex->id] != mutex);
0647 
0648     if (!mtx->cmdq_reg.size) {
0649         dev_err(mtx->dev, "mediatek,gce-client-reg hasn't been set");
0650         return -EINVAL;
0651     }
0652 
0653     cmdq_pkt_write(cmdq_pkt, mtx->cmdq_reg.subsys,
0654                mtx->addr + DISP_REG_MUTEX_EN(mutex->id), 1);
0655     return 0;
0656 #else
0657     dev_err(mtx->dev, "Not support for enable MUTEX by CMDQ");
0658     return -ENODEV;
0659 #endif
0660 }
0661 EXPORT_SYMBOL_GPL(mtk_mutex_enable_by_cmdq);
0662 
0663 void mtk_mutex_disable(struct mtk_mutex *mutex)
0664 {
0665     struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
0666                          mutex[mutex->id]);
0667 
0668     WARN_ON(&mtx->mutex[mutex->id] != mutex);
0669 
0670     writel(0, mtx->regs + DISP_REG_MUTEX_EN(mutex->id));
0671 }
0672 EXPORT_SYMBOL_GPL(mtk_mutex_disable);
0673 
0674 void mtk_mutex_acquire(struct mtk_mutex *mutex)
0675 {
0676     struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
0677                          mutex[mutex->id]);
0678     u32 tmp;
0679 
0680     writel(1, mtx->regs + DISP_REG_MUTEX_EN(mutex->id));
0681     writel(1, mtx->regs + DISP_REG_MUTEX(mutex->id));
0682     if (readl_poll_timeout_atomic(mtx->regs + DISP_REG_MUTEX(mutex->id),
0683                       tmp, tmp & INT_MUTEX, 1, 10000))
0684         pr_err("could not acquire mutex %d\n", mutex->id);
0685 }
0686 EXPORT_SYMBOL_GPL(mtk_mutex_acquire);
0687 
0688 void mtk_mutex_release(struct mtk_mutex *mutex)
0689 {
0690     struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
0691                          mutex[mutex->id]);
0692 
0693     writel(0, mtx->regs + DISP_REG_MUTEX(mutex->id));
0694 }
0695 EXPORT_SYMBOL_GPL(mtk_mutex_release);
0696 
0697 int mtk_mutex_write_mod(struct mtk_mutex *mutex,
0698             enum mtk_mutex_mod_index idx, bool clear)
0699 {
0700     struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
0701                          mutex[mutex->id]);
0702     unsigned int reg;
0703     unsigned int offset;
0704 
0705     WARN_ON(&mtx->mutex[mutex->id] != mutex);
0706 
0707     if (idx < MUTEX_MOD_IDX_MDP_RDMA0 ||
0708         idx >= MUTEX_MOD_IDX_MAX) {
0709         dev_err(mtx->dev, "Not supported MOD table index : %d", idx);
0710         return -EINVAL;
0711     }
0712 
0713     offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg,
0714                     mutex->id);
0715     reg = readl_relaxed(mtx->regs + offset);
0716 
0717     if (clear)
0718         reg &= ~BIT(mtx->data->mutex_table_mod[idx]);
0719     else
0720         reg |= BIT(mtx->data->mutex_table_mod[idx]);
0721 
0722     writel_relaxed(reg, mtx->regs + offset);
0723 
0724     return 0;
0725 }
0726 EXPORT_SYMBOL_GPL(mtk_mutex_write_mod);
0727 
0728 int mtk_mutex_write_sof(struct mtk_mutex *mutex,
0729             enum mtk_mutex_sof_index idx)
0730 {
0731     struct mtk_mutex_ctx *mtx = container_of(mutex, struct mtk_mutex_ctx,
0732                          mutex[mutex->id]);
0733 
0734     WARN_ON(&mtx->mutex[mutex->id] != mutex);
0735 
0736     if (idx < MUTEX_SOF_IDX_SINGLE_MODE ||
0737         idx >= MUTEX_SOF_IDX_MAX) {
0738         dev_err(mtx->dev, "Not supported SOF index : %d", idx);
0739         return -EINVAL;
0740     }
0741 
0742     writel_relaxed(idx, mtx->regs +
0743                DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, mutex->id));
0744 
0745     return 0;
0746 }
0747 EXPORT_SYMBOL_GPL(mtk_mutex_write_sof);
0748 
0749 static int mtk_mutex_probe(struct platform_device *pdev)
0750 {
0751     struct device *dev = &pdev->dev;
0752     struct mtk_mutex_ctx *mtx;
0753     struct resource *regs;
0754     int i;
0755 #if IS_REACHABLE(CONFIG_MTK_CMDQ)
0756     int ret;
0757 #endif
0758 
0759     mtx = devm_kzalloc(dev, sizeof(*mtx), GFP_KERNEL);
0760     if (!mtx)
0761         return -ENOMEM;
0762 
0763     for (i = 0; i < 10; i++)
0764         mtx->mutex[i].id = i;
0765 
0766     mtx->data = of_device_get_match_data(dev);
0767 
0768     if (!mtx->data->no_clk) {
0769         mtx->clk = devm_clk_get(dev, NULL);
0770         if (IS_ERR(mtx->clk)) {
0771             if (PTR_ERR(mtx->clk) != -EPROBE_DEFER)
0772                 dev_err(dev, "Failed to get clock\n");
0773             return PTR_ERR(mtx->clk);
0774         }
0775     }
0776 
0777     mtx->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &regs);
0778     if (IS_ERR(mtx->regs)) {
0779         dev_err(dev, "Failed to map mutex registers\n");
0780         return PTR_ERR(mtx->regs);
0781     }
0782     mtx->addr = regs->start;
0783 
0784 #if IS_REACHABLE(CONFIG_MTK_CMDQ)
0785     ret = cmdq_dev_get_client_reg(dev, &mtx->cmdq_reg, 0);
0786     if (ret)
0787         dev_dbg(dev, "No mediatek,gce-client-reg!\n");
0788 #endif
0789 
0790     platform_set_drvdata(pdev, mtx);
0791 
0792     return 0;
0793 }
0794 
0795 static int mtk_mutex_remove(struct platform_device *pdev)
0796 {
0797     return 0;
0798 }
0799 
0800 static const struct of_device_id mutex_driver_dt_match[] = {
0801     { .compatible = "mediatek,mt2701-disp-mutex",
0802       .data = &mt2701_mutex_driver_data},
0803     { .compatible = "mediatek,mt2712-disp-mutex",
0804       .data = &mt2712_mutex_driver_data},
0805     { .compatible = "mediatek,mt8167-disp-mutex",
0806       .data = &mt8167_mutex_driver_data},
0807     { .compatible = "mediatek,mt8173-disp-mutex",
0808       .data = &mt8173_mutex_driver_data},
0809     { .compatible = "mediatek,mt8183-disp-mutex",
0810       .data = &mt8183_mutex_driver_data},
0811     { .compatible = "mediatek,mt8186-disp-mutex",
0812       .data = &mt8186_mutex_driver_data},
0813     { .compatible = "mediatek,mt8192-disp-mutex",
0814       .data = &mt8192_mutex_driver_data},
0815     { .compatible = "mediatek,mt8195-disp-mutex",
0816       .data = &mt8195_mutex_driver_data},
0817     { .compatible = "mediatek,mt8365-disp-mutex",
0818       .data = &mt8365_mutex_driver_data},
0819     {},
0820 };
0821 MODULE_DEVICE_TABLE(of, mutex_driver_dt_match);
0822 
0823 static struct platform_driver mtk_mutex_driver = {
0824     .probe      = mtk_mutex_probe,
0825     .remove     = mtk_mutex_remove,
0826     .driver     = {
0827         .name   = "mediatek-mutex",
0828         .owner  = THIS_MODULE,
0829         .of_match_table = mutex_driver_dt_match,
0830     },
0831 };
0832 
0833 builtin_platform_driver(mtk_mutex_driver);