blob: ca78b03bc03b37782f572c9b0e1144efba90e67c [file] [log] [blame]
xjb04a4022021-11-25 15:01:52 +08001// SPDX-License-Identifier: GPL-2.0
2//
3// Copyright (c) 2015 Pengutronix, Sascha Hauer <kernel@pengutronix.de>
4
5#include <linux/clk.h>
6#include <linux/init.h>
7#include <linux/io.h>
8#include <linux/iopoll.h>
9#include <linux/mfd/syscon.h>
10#include <linux/of_device.h>
11#include <linux/platform_device.h>
12#include <linux/pm_domain.h>
13#include <linux/pm_opp.h>
14#include <linux/regulator/consumer.h>
15#include <linux/slab.h>
16#include <linux/soc/mediatek/infracfg.h>
17#include <linux/soc/mediatek/scpsys-ext.h>
18
19#include <dt-bindings/power/mt2701-power.h>
20#include <dt-bindings/power/mt2712-power.h>
21#include <dt-bindings/power/mt6797-power.h>
22#include <dt-bindings/power/mt6779-power.h>
23#include <dt-bindings/power/mt7622-power.h>
24#include <dt-bindings/power/mt7623a-power.h>
25#include <dt-bindings/power/mt8173-power.h>
26#include <dt-bindings/power/mt6880-power.h>
27#include <dt-bindings/power/mt6890-power.h>
rjw6a17d8f2023-02-03 14:08:22 +080028/*Typethree add for tcxo power problem 2023/01/30 start*/
29#include <linux/gpio.h>
30/*Typethree add for tcxo power problem 2023/01/30 end*/
xjb04a4022021-11-25 15:01:52 +080031#include "mtk-scpsys.h"
32
33#define MTCMOS_BRINGUP 0
34#define MTK_POLL_DELAY_US 10
35#define MTK_POLL_TIMEOUT USEC_PER_SEC
36
37#define MTK_SCPD_ACTIVE_WAKEUP BIT(0)
38#define MTK_SCPD_FWAIT_SRAM BIT(1)
39#define MTK_SCPD_STRICT_BUSP BIT(2)
40#define MTK_SCPD_ALWAYS_ON BIT(3)
41#define MTK_SCPD_MD_OPS BIT(4)
42#define MTK_SCPD_NETSYS_OPS BIT(5)
rjw2e8229f2022-02-15 21:08:12 +080043#define MTK_SCPD_HSM_OPS BIT(6)
xjb04a4022021-11-25 15:01:52 +080044#define MTK_SCPD_CAPS(_scpd, _x) ((_scpd)->data->caps & (_x))
45
46#define SPM_VDE_PWR_CON 0x0210
47#define SPM_MFG_PWR_CON 0x0214
48#define SPM_VEN_PWR_CON 0x0230
49#define SPM_ISP_PWR_CON 0x0238
50#define SPM_DIS_PWR_CON 0x023c
51#define SPM_CONN_PWR_CON 0x0280
52#define SPM_VEN2_PWR_CON 0x0298
53#define SPM_AUDIO_PWR_CON 0x029c /* MT8173, MT2712 */
54#define SPM_BDP_PWR_CON 0x029c /* MT2701 */
55#define SPM_ETH_PWR_CON 0x02a0
56#define SPM_HIF_PWR_CON 0x02a4
57#define SPM_IFR_MSC_PWR_CON 0x02a8
58#define SPM_MFG_2D_PWR_CON 0x02c0
59#define SPM_MFG_ASYNC_PWR_CON 0x02c4
60#define SPM_USB_PWR_CON 0x02cc
61#define SPM_USB2_PWR_CON 0x02d4 /* MT2712 */
62#define SPM_ETHSYS_PWR_CON 0x02e0 /* MT7622 */
63#define SPM_HIF0_PWR_CON 0x02e4 /* MT7622 */
64#define SPM_HIF1_PWR_CON 0x02e8 /* MT7622 */
65#define SPM_WB_PWR_CON 0x02ec /* MT7622 */
66/* NETSYS_S_SRAM_CON (0x10006000+0x378)*/
67#define NETSYS_S_SRAM_CON 0x0378
rjwee88d172023-01-12 14:24:13 +080068/* CONN_STATUS (0x10006000+0x62C)*/
69/*Typethree add for tcxo power problem 2023/01/12 start*/
70#define CONN_STATUS 0x062C
71/*Typethree add for tcxo power problem 2023/01/12 end*/
xjb04a4022021-11-25 15:01:52 +080072#define SPM_PWR_STATUS 0x060c
73#define SPM_PWR_STATUS_2ND 0x0610
rjwee88d172023-01-12 14:24:13 +080074/*Typethree add for tcxo power problem 2023/01/12 start*/
75#define CONN_STATUS_BIT BIT(0)
76/*Typethree add for tcxo power problem 2023/01/12 end*/
xjb04a4022021-11-25 15:01:52 +080077#define PWR_RST_B_BIT BIT(0)
78#define PWR_ISO_BIT BIT(1)
79#define PWR_ON_BIT BIT(2)
80#define PWR_ON_2ND_BIT BIT(3)
81#define PWR_CLK_DIS_BIT BIT(4)
82#define PWR_SRAM_CLKISO_BIT BIT(5)
83#define PWR_SRAM_ISOINT_B_BIT BIT(6)
84
85#define PWR_STATUS_CONN BIT(1)
86#define PWR_STATUS_DISP BIT(3)
87#define PWR_STATUS_MFG BIT(4)
88#define PWR_STATUS_ISP BIT(5)
89#define PWR_STATUS_VDEC BIT(7)
90#define PWR_STATUS_BDP BIT(14)
91#define PWR_STATUS_ETH BIT(15)
92#define PWR_STATUS_HIF BIT(16)
93#define PWR_STATUS_IFR_MSC BIT(17)
94#define PWR_STATUS_USB2 BIT(19) /* MT2712 */
95#define PWR_STATUS_VENC_LT BIT(20)
96#define PWR_STATUS_VENC BIT(21)
97#define PWR_STATUS_MFG_2D BIT(22) /* MT8173 */
98#define PWR_STATUS_MFG_ASYNC BIT(23) /* MT8173 */
99#define PWR_STATUS_AUDIO BIT(24) /* MT8173, MT2712 */
100#define PWR_STATUS_USB BIT(25) /* MT8173, MT2712 */
101#define PWR_STATUS_ETHSYS BIT(24) /* MT7622 */
102#define PWR_STATUS_HIF0 BIT(25) /* MT7622 */
103#define PWR_STATUS_HIF1 BIT(26) /* MT7622 */
104#define PWR_STATUS_WB BIT(27) /* MT7622 */
105
106#define MT6880_TOP_AXI_PROT_EN_2_MFG0 (BIT(5) | BIT(6))
107#define MT6880_TOP_AXI_PROT_EN_MFG0 (BIT(21) | BIT(22))
108#define MT6880_TOP_AXI_PROT_EN_1_MFG0 (BIT(21))
109#define MT6880_TOP_AXI_PROT_EN_2_MFG0_2ND (BIT(7))
110#define MT6880_TOP_AXI_PROT_EN_IFR (BIT(7) | BIT(9) | BIT(12) | BIT(20) | BIT(25) | BIT(27))
111#define MT6880_TOP_AXI_PROT_EN_2_IFR (BIT(8) | BIT(14) | BIT(19))
112#define MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_IFR (BIT(6) | BIT(16) | BIT(22) | BIT(23) | BIT(24))
113#define MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_IFR (BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(12) | BIT(13) | BIT(14) | BIT(15) | BIT(16) | BIT(17) | BIT(18))
114#define MT6880_TOP_AXI_PROT_EN_IFR_2ND (BIT(2) | BIT(10) | BIT(14) | BIT(19))
115#define MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_IFR_2ND (BIT(6))
116#define MT6880_TOP_AXI_PROT_EN_IFR_3RD (BIT(4) | BIT(13) | BIT(15) | BIT(16) | BIT(23))
117#define MT6880_TOP_AXI_PROT_EN_1_IFR (BIT(21))
118#define MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_IFR_2ND (BIT(26) | BIT(27) | BIT(28) | BIT(29) | BIT(30) | BIT(31))
119#define MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_IFR_3RD (BIT(0) | BIT(11))
120#define MT6880_TOP_AXI_PROT_EN_IFR_4RD (BIT(28))
121#define MT6880_TOP_AXI_PROT_EN_2_IFR_2ND (BIT(7) | BIT(10) | BIT(11) | BIT(15) | BIT(16) | BIT(17))
122#define MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_ETH (BIT(4) | BIT(17))
123#define MT6880_TOP_AXI_PROT_EN_2_NETSYS (BIT(8) | BIT(9) | BIT(12) | BIT(13) | BIT(14))
124#define MT6880_TOP_AXI_PROT_EN_NETSYS (BIT(10) | BIT(11) | BIT(17) | BIT(18) | BIT(19))
125#define MT6880_TOP_AXI_PROT_EN_NETSYS_2ND (BIT(15) | BIT(23))
126#define MT6880_TOP_AXI_PROT_EN_2_NETSYS_2ND (BIT(10) | BIT(11)| BIT(15))
127#define MT6880_TOP_AXI_PROT_EN_MM_DIS (BIT(10))
128#define MT6880_TOP_AXI_PROT_EN_DIS (BIT(6))
129#define MT6880_TOP_AXI_PROT_EN_MD1 (BIT(7))
130#define MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_MD1 (BIT(2) | BIT(10))
131#define MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_MD1 (BIT(6))
132#define MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_EIP97 (BIT(16))
133#define MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_EIP97 (BIT(18))
134#define MT6880_TOP_AXI_PROT_EN_CONN (BIT(27))
135#define MT6880_TOP_AXI_PROT_EN_CONN_2ND (BIT(14))
136#define MT6880_TOP_AXI_PROT_EN_CONN_3RD (BIT(13))
137#define MT6880_TOP_AXI_PROT_EN_CONN_4RD (BIT(28))
138#define MT6880_TOP_AXI_PROT_EN_1_MCUPM (BIT(27) | BIT(30))
139#define MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_MCUPM (BIT(6))
140#define MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_MSDC (BIT(3) | BIT(16))
141#define MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_SSUSB (BIT(1) | BIT(2))
142#define MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_3_SSUSB (BIT(11))
143
144#define MT6890_TOP_AXI_PROT_EN_2_MFG0 (BIT(5) | BIT(6))
145#define MT6890_TOP_AXI_PROT_EN_MFG0 (BIT(21) | BIT(22))
146#define MT6890_TOP_AXI_PROT_EN_1_MFG0 (BIT(21))
147#define MT6890_TOP_AXI_PROT_EN_2_MFG0_2ND (BIT(7))
148#define MT6890_TOP_AXI_PROT_EN_IFR (BIT(7) | BIT(9) | BIT(12) | BIT(20) | BIT(25) | BIT(27))
149#define MT6890_TOP_AXI_PROT_EN_2_IFR (BIT(8) | BIT(14) | BIT(19))
150#define MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_IFR (BIT(6) | BIT(16) | BIT(22) | BIT(23) | BIT(24))
151#define MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_IFR (BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(12) | BIT(13) | BIT(14) | BIT(15) | BIT(16) | BIT(17) | BIT(18))
152#define MT6890_TOP_AXI_PROT_EN_IFR_2ND (BIT(2) | BIT(10) | BIT(14) | BIT(19))
153#define MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_IFR_2ND (BIT(6))
154#define MT6890_TOP_AXI_PROT_EN_IFR_3RD (BIT(4) | BIT(13) | BIT(15) | BIT(16) | BIT(23))
155#define MT6890_TOP_AXI_PROT_EN_1_IFR (BIT(21))
156#define MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_IFR_2ND (BIT(26) | BIT(27) | BIT(28) | BIT(29) | BIT(30) | BIT(31))
157#define MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_IFR_3RD (BIT(0) | BIT(11))
158#define MT6890_TOP_AXI_PROT_EN_IFR_4RD (BIT(28))
159#define MT6890_TOP_AXI_PROT_EN_2_IFR_2ND (BIT(7) | BIT(10) | BIT(11) | BIT(15) | BIT(16) | BIT(17))
160#define MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_ETH (BIT(4) | BIT(17))
161#define MT6890_TOP_AXI_PROT_EN_2_NETSYS (BIT(8) | BIT(9) | BIT(12) | BIT(13) | BIT(14))
162#define MT6890_TOP_AXI_PROT_EN_NETSYS (BIT(10) | BIT(11) | BIT(17) | BIT(18) | BIT(19))
163#define MT6890_TOP_AXI_PROT_EN_NETSYS_2ND (BIT(15) | BIT(23))
164#define MT6890_TOP_AXI_PROT_EN_2_NETSYS_2ND (BIT(10) | BIT(11)| BIT(15))
165#define MT6890_TOP_AXI_PROT_EN_MM_DIS (BIT(10))
166#define MT6890_TOP_AXI_PROT_EN_DIS (BIT(6))
167#define MT6890_TOP_AXI_PROT_EN_MD1 (BIT(7))
168#define MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_MD1 (BIT(2) | BIT(10))
169#define MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_MD1 (BIT(6))
170#define MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_EIP97 (BIT(16))
171#define MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_EIP97 (BIT(18))
172#define MT6890_TOP_AXI_PROT_EN_CONN (BIT(27))
173#define MT6890_TOP_AXI_PROT_EN_CONN_2ND (BIT(14))
174#define MT6890_TOP_AXI_PROT_EN_CONN_3RD (BIT(13))
175#define MT6890_TOP_AXI_PROT_EN_CONN_4RD (BIT(28))
176#define MT6890_TOP_AXI_PROT_EN_1_MCUPM (BIT(27) | BIT(30))
177#define MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_MCUPM (BIT(6))
178#define MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_MSDC (BIT(3) | BIT(16))
179#define MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_SSUSB (BIT(1) | BIT(2))
180#define MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_3_SSUSB (BIT(11))
rjw2e8229f2022-02-15 21:08:12 +0800181#define MT6890_TOP_AXI_PROT_EN_2_HSM (BIT(19) | BIT(21))
182#define MT6890_TOP_AXI_PROT_EN_HSM (BIT(2) | BIT(3))
183#define MT6890_TOP_AXI_PROT_EN_HSM_2ND (BIT(4))
184#define MT6890_TOP_AXI_PROT_EN_2_HSM_2ND (BIT(16) | BIT(17))
xjb04a4022021-11-25 15:01:52 +0800185
186enum clk_id {
187 CLK_NONE,
188 CLK_MM,
189 CLK_MFG,
190 CLK_VENC,
191 CLK_VENC_LT,
192 CLK_ETHIF,
193 CLK_VDEC,
194 CLK_HIFSEL,
195 CLK_JPGDEC,
196 CLK_AUDIO,
lh0d3f4db2022-09-17 00:16:39 -0700197 CLK_NETSYS1,
198 CLK_NETSYS2,
199 CLK_NETSYS3,
200 CLK_NETSYS4,
201 CLK_NETSYS5,
202 CLK_NETSYS6,
203 CLK_NETSYS7,
204 CLK_NETSYS8,
xjb04a4022021-11-25 15:01:52 +0800205 CLK_ETH1,
206 CLK_ETH2,
207 CLK_ETH3,
208 CLK_ETH4,
209 CLK_EIP97,
rjw2e8229f2022-02-15 21:08:12 +0800210 CLK_HSM,
xjb04a4022021-11-25 15:01:52 +0800211 CLK_MAX,
212};
213
214static const char * const clk_names[] = {
215 NULL,
216 "mm",
217 "mfg",
218 "venc",
219 "venc_lt",
220 "ethif",
221 "vdec",
222 "hif_sel",
223 "jpgdec",
224 "audio",
lh0d3f4db2022-09-17 00:16:39 -0700225 "medsys_sel",
226 "netsys_sel",
227 "netsys_500m_sel",
228 "netsys_med_mcu_sel",
229 "netsys_wed_mcu_sel",
230 "netsys_2x_sel",
231 "sgmii_sel",
232 "sgmii_sbus_sel",
xjb04a4022021-11-25 15:01:52 +0800233 "snps_eth_312p5m_sel",
234 "snps_eth_250m_sel",
235 "snps_ptp_sel",
236 "snps_rmii_sel",
237 "eip97_sel",
rjw2e8229f2022-02-15 21:08:12 +0800238 "hsm_sel",
xjb04a4022021-11-25 15:01:52 +0800239 NULL,
240};
241
242#define MAX_CLKS 8
243#define MAX_SUBSYS_CLKS 20
244
245/**
246 * struct scp_domain_data - scp domain data for power on/off flow
247 * @name: The domain name.
248 * @sta_mask: The mask for power on/off status bit.
249 * @ctl_offs: The offset for main power control register.
250 * @sram_iso_ctrl: The flag to judge if the power domain need to do
251 * the extra sram isolation control.
252 * @sram_pdn_bits: The mask for sram power control bits.
253 * @sram_pdn_ack_bits: The mask for sram power control acked bits.
254 * @bus_prot_mask: The mask for single step bus protection.
255 * @clk_id: The basic clock needs to be enabled before enabling certain
256 * power domains.
257 * @basic_clk_name: provide the same purpose with field "clk_id"
258 * by declaring basic clock prefix name rather than clk_id.
259 * @subsys_clk_prefix: The prefix name of the clocks need to be enabled
260 * before releasing bus protection.
261 * @caps: The flag for active wake-up action.
262 * @bp_table: The mask table for multiple step bus protection.
263 */
264struct scp_domain_data {
265 const char *name;
266 u32 sta_mask;
267 int ctl_offs;
268 bool sram_iso_ctrl;
269 u32 sram_pdn_bits;
270 u32 sram_pdn_ack_bits;
lh0d3f4db2022-09-17 00:16:39 -0700271 u32 sram_pdn_bits1;
xjb04a4022021-11-25 15:01:52 +0800272 u32 sram_pdn_bits2;
273 u32 sram_pdn_ack_bits2;
274 u32 bus_prot_mask;
275 int extb_iso_offs;
276 u32 extb_iso_bits;
277 enum clk_id clk_id[MAX_CLKS];
278 const char *basic_clk_name[MAX_CLKS];
279 const char *subsys_clk_prefix;
280 u8 caps;
281 struct bus_prot bp_table[MAX_STEPS];
282};
283
284struct scp;
285
286struct scp_domain {
287 struct generic_pm_domain genpd;
288 struct scp *scp;
289 struct clk *clk[MAX_CLKS];
290 struct clk *subsys_clk[MAX_SUBSYS_CLKS];
291 const struct scp_domain_data *data;
292 struct regulator *supply;
293};
294
295struct scp_ctrl_reg {
296 int pwr_sta_offs;
297 int pwr_sta2nd_offs;
298};
299
300struct scp {
301 struct scp_domain *domains;
302 struct genpd_onecell_data pd_data;
303 struct device *dev;
304 void __iomem *base;
305 struct regmap *infracfg;
306 struct regmap *infracfg_nao;
307 struct regmap *smi_common;
308 struct scp_ctrl_reg ctrl_reg;
309 bool bus_prot_reg_update;
310};
311
312struct scp_subdomain {
313 int origin;
314 int subdomain;
315};
316
317struct scp_soc_data {
318 const struct scp_domain_data *domains;
319 int num_domains;
320 const struct scp_subdomain *subdomains;
321 int num_subdomains;
322 const struct scp_ctrl_reg regs;
323 bool bus_prot_reg_update;
324};
325
326static BLOCKING_NOTIFIER_HEAD(scpsys_notifier_list);
327
328int register_scpsys_notifier(struct notifier_block *nb)
329{
330 return blocking_notifier_chain_register(&scpsys_notifier_list, nb);
331}
332EXPORT_SYMBOL_GPL(register_scpsys_notifier);
333
334int unregister_scpsys_notifier(struct notifier_block *nb)
335{
336 return blocking_notifier_chain_unregister(&scpsys_notifier_list, nb);
337}
338EXPORT_SYMBOL_GPL(unregister_scpsys_notifier);
339
340static int scpsys_domain_is_on(struct scp_domain *scpd)
341{
342 struct scp *scp = scpd->scp;
343 u32 status, status2;
344
345 status = readl(scp->base + scp->ctrl_reg.pwr_sta_offs) &
346 scpd->data->sta_mask;
347 status2 = readl(scp->base + scp->ctrl_reg.pwr_sta2nd_offs) &
348 scpd->data->sta_mask;
349
350 /*
351 * A domain is on when both status bits are set. If only one is set
352 * return an error. This happens while powering up a domain
353 */
354
355 if (status && status2)
356 return true;
357 if (!status && !status2)
358 return false;
359
360 return -EINVAL;
361}
362
363static int scpsys_md_domain_is_on(struct scp_domain *scpd)
364{
365 struct scp *scp = scpd->scp;
366 u32 status;
367
368 status = readl(scp->base + scp->ctrl_reg.pwr_sta_offs) &
369 scpd->data->sta_mask;
370 /*
371 * A domain is on when the status bit is set.
372 */
373 if (status)
374 return true;
375 return false;
376}
377
378static int scpsys_regulator_enable(struct scp_domain *scpd)
379{
380 if (!scpd->supply)
381 return 0;
382
383 return regulator_enable(scpd->supply);
384}
385
386static int scpsys_regulator_disable(struct scp_domain *scpd)
387{
388 if (!scpd->supply)
389 return 0;
390
391 return regulator_disable(scpd->supply);
392}
393
394static int scpsys_clk_enable(struct clk *clk[], int max_num)
395{
396 int i, ret = 0;
397
398 for (i = 0; i < max_num && clk[i]; i++) {
399 ret = clk_prepare_enable(clk[i]);
400 if (ret) {
401 for (--i; i >= 0; i--)
402 clk_disable_unprepare(clk[i]);
403
404 break;
405 }
406 }
407
408 return ret;
409}
410
411static void scpsys_clk_disable(struct clk *clk[], int max_num)
412{
413 int i;
414
415 for (i = max_num - 1; i >= 0; i--) {
416 if (clk[i])
417 clk_disable_unprepare(clk[i]);
418 }
419}
420
421static int scpsys_sram_enable(struct scp_domain *scpd, void __iomem *ctl_addr)
422{
423 u32 val;
424 u32 pdn_ack = scpd->data->sram_pdn_ack_bits;
425 int tmp;
426
427 val = readl(ctl_addr) & ~scpd->data->sram_pdn_bits;
428 writel(val, ctl_addr);
429
430 /* Either wait until SRAM_PDN_ACK all 0 or have a force wait */
431 if (MTK_SCPD_CAPS(scpd, MTK_SCPD_FWAIT_SRAM)) {
432 /*
433 * Currently, MTK_SCPD_FWAIT_SRAM is necessary only for
434 * MT7622_POWER_DOMAIN_WB and thus just a trivial setup
435 * is applied here.
436 */
437 usleep_range(12000, 12100);
438 } else {
439 /* Either wait until SRAM_PDN_ACK all 1 or 0 */
440 int ret = readl_poll_timeout(ctl_addr, tmp,
441 (tmp & pdn_ack) == 0,
442 MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
443 if (ret < 0)
444 return ret;
445 }
446
447 if (scpd->data->sram_iso_ctrl) {
448 val = readl(ctl_addr) | PWR_SRAM_ISOINT_B_BIT;
449 writel(val, ctl_addr);
450 udelay(1);
451 val &= ~PWR_SRAM_CLKISO_BIT;
452 writel(val, ctl_addr);
453 }
454
455 return 0;
456}
457
458static int scpsys_sram_disable(struct scp_domain *scpd, void __iomem *ctl_addr)
459{
460 u32 val;
461 u32 pdn_ack = scpd->data->sram_pdn_ack_bits;
462 int tmp;
463
464 if (scpd->data->sram_iso_ctrl) {
465 val = readl(ctl_addr);
466 val |= PWR_SRAM_CLKISO_BIT;
467 writel(val, ctl_addr);
468 val &= ~PWR_SRAM_ISOINT_B_BIT;
469 writel(val, ctl_addr);
470 udelay(1);
471 }
472
473 val = readl(ctl_addr) | scpd->data->sram_pdn_bits;
474 writel(val, ctl_addr);
475
476 /* Either wait until SRAM_PDN_ACK all 1 or 0 */
477 return readl_poll_timeout(ctl_addr, tmp,
478 (tmp & pdn_ack) == pdn_ack,
479 MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
480}
481
482static int scpsys_netsys_sram_enable(struct scp_domain *scpd, void __iomem *net_sram_addr)
483{
484 u32 val;
485 u32 pdn_ack = scpd->data->sram_pdn_ack_bits;
486 int tmp;
lh0d3f4db2022-09-17 00:16:39 -0700487 u32 val1;
xjb04a4022021-11-25 15:01:52 +0800488 u32 val2;
489 u32 pdn_ack2 = scpd->data->sram_pdn_ack_bits2;
490 int tmp2;
lh0d3f4db2022-09-17 00:16:39 -0700491 int ret;
492
493pr_notice("netsys SRAM control step 1");
494 val = readl(net_sram_addr) | scpd->data->sram_pdn_bits;
xjb04a4022021-11-25 15:01:52 +0800495 writel(val, net_sram_addr);
496
lh0d3f4db2022-09-17 00:16:39 -0700497 /* Either wait until SRAM_PDN_ACK all 1 or 0 */
498 ret = readl_poll_timeout(net_sram_addr, tmp,
499 (tmp & pdn_ack) == pdn_ack,
500 MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
501 if (ret < 0)
502 return ret;
503
504pr_notice("netsys SRAM control step 2");
505 val1 = readl(net_sram_addr) | scpd->data->sram_pdn_bits1;
506 writel(val1, net_sram_addr);
xjb04a4022021-11-25 15:01:52 +0800507
508/*mt6880 pdn_ack2*/
509
510 val2 = readl(net_sram_addr) & ~scpd->data->sram_pdn_bits2;
511 writel(val2, net_sram_addr);
512
513 /* Either wait until SRAM_PDN_ACK all 0 or have a force wait */
514 if (MTK_SCPD_CAPS(scpd, MTK_SCPD_FWAIT_SRAM)) {
515 /*
516 * Currently, MTK_SCPD_FWAIT_SRAM is necessary only for
517 * MT7622_POWER_DOMAIN_WB and thus just a trivial setup
518 * is applied here.
519 */
520 usleep_range(12000, 12100);
521 } else {
522 /* Either wait until SRAM_PDN_ACK all 1 or 0 */
523 int ret = readl_poll_timeout(net_sram_addr, tmp2,
524 (tmp2 & pdn_ack2) == 0,
525 MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
526 if (ret < 0)
527 return ret;
528 }
529
lh0d3f4db2022-09-17 00:16:39 -0700530pr_notice("netsys SRAM control step 3");
xjb04a4022021-11-25 15:01:52 +0800531 return 0;
532}
533
534static int scpsys_netsys_sram_disable(struct scp_domain *scpd, void __iomem *net_sram_addr)
535{
536 u32 val;
537 u32 pdn_ack = scpd->data->sram_pdn_ack_bits;
538 int tmp;
lh0d3f4db2022-09-17 00:16:39 -0700539 u32 val1;
xjb04a4022021-11-25 15:01:52 +0800540 u32 val2;
541 u32 pdn_ack2 = scpd->data->sram_pdn_ack_bits2;
542 int tmp2;
lh0d3f4db2022-09-17 00:16:39 -0700543 int ret;
xjb04a4022021-11-25 15:01:52 +0800544
lh0d3f4db2022-09-17 00:16:39 -0700545pr_notice("netsys SRAM control step 1");
xjb04a4022021-11-25 15:01:52 +0800546/*mt6880 pdn_ack2*/
547 val2 = readl(net_sram_addr) | scpd->data->sram_pdn_bits2;
548 writel(val2, net_sram_addr);
549
550 /* Either wait until SRAM_PDN_ACK all 1 or 0 */
lh0d3f4db2022-09-17 00:16:39 -0700551 ret = readl_poll_timeout(net_sram_addr, tmp2,
xjb04a4022021-11-25 15:01:52 +0800552 (tmp2 & pdn_ack2) == pdn_ack2,
553 MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
lh0d3f4db2022-09-17 00:16:39 -0700554 if (ret < 0)
555 return ret;
556
557pr_notice("netsys SRAM control step 2");
558 val1 = readl(net_sram_addr) & ~scpd->data->sram_pdn_bits1;
559 writel(val1, net_sram_addr);
560
561/*mt6880 pdn_ack1*/
562 val = readl(net_sram_addr) & ~scpd->data->sram_pdn_bits;
563 writel(val, net_sram_addr);
564
565 /* Either wait until SRAM_PDN_ACK all 0 or have a force wait */
566 if (MTK_SCPD_CAPS(scpd, MTK_SCPD_FWAIT_SRAM)) {
567 /*
568 * Currently, MTK_SCPD_FWAIT_SRAM is necessary only for
569 * MT7622_POWER_DOMAIN_WB and thus just a trivial setup
570 * is applied here.
571 */
572 usleep_range(12000, 12100);
573 } else {
574 /* Either wait until SRAM_PDN_ACK all 1 or 0 */
575 int ret = readl_poll_timeout(net_sram_addr, tmp,
576 (tmp & pdn_ack) == 0,
577 MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
578 if (ret < 0)
579 return ret;
580 }
581
582pr_notice("netsys SRAM control step 3");
583
584 return 0;
xjb04a4022021-11-25 15:01:52 +0800585}
586
587static int scpsys_bus_protect_enable(struct scp_domain *scpd)
588{
589 struct scp *scp = scpd->scp;
590 int ret = 0;
591
592 if (scpd->data->bus_prot_mask) {
593 ret = mtk_infracfg_set_bus_protection(scp->infracfg,
594 scpd->data->bus_prot_mask,
595 scp->bus_prot_reg_update);
596 } else if (scpd->data->bp_table[0].mask) {
597 ret = mtk_scpsys_ext_set_bus_protection(scpd->data->bp_table,
598 scp->infracfg, scp->smi_common,
599 scp->infracfg_nao);
600 }
601
602 return ret;
603}
604
605static int scpsys_bus_protect_disable(struct scp_domain *scpd)
606{
607 struct scp *scp = scpd->scp;
608 int ret = 0;
609
610 if (scpd->data->bus_prot_mask) {
611 ret = mtk_infracfg_clear_bus_protection(scp->infracfg,
612 scpd->data->bus_prot_mask,
613 scp->bus_prot_reg_update);
614 } else if (scpd->data->bp_table[0].mask) {
615 ret = mtk_scpsys_ext_clear_bus_protection(scpd->data->bp_table,
616 scp->infracfg, scp->smi_common,
617 scp->infracfg_nao);
618 }
619
620 return ret;
621}
622
623static void scpsys_extb_iso_down(struct scp_domain *scpd)
624{
625 u32 val;
626 struct scp *scp;
627 void __iomem *ctl_addr;
628
629 if (!scpd->data->extb_iso_offs)
630 return;
631
632 scp = scpd->scp;
633 ctl_addr = scp->base + scpd->data->extb_iso_offs;
634 val = readl(ctl_addr) & ~scpd->data->extb_iso_bits;
635 writel(val, ctl_addr);
636}
637
638static void scpsys_extb_iso_up(struct scp_domain *scpd)
639{
640 u32 val;
641 struct scp *scp;
642 void __iomem *ctl_addr;
643
644 if (!scpd->data->extb_iso_offs)
645 return;
646
647 scp = scpd->scp;
648 ctl_addr = scp->base + scpd->data->extb_iso_offs;
649 val = readl(ctl_addr) | scpd->data->extb_iso_bits;
650 writel(val, ctl_addr);
651}
652
653static int scpsys_power_on(struct generic_pm_domain *genpd)
654{
655 struct scp_domain *scpd = container_of(genpd, struct scp_domain, genpd);
656 struct scp *scp = scpd->scp;
657 void __iomem *ctl_addr = scp->base + scpd->data->ctl_offs;
rjw6a17d8f2023-02-03 14:08:22 +0800658
659 u32 val;
xjb04a4022021-11-25 15:01:52 +0800660 int ret, tmp;
rjw6a17d8f2023-02-03 14:08:22 +0800661
662/*Typethree add for tcxo power problem 2023/01/30 start*/
663 int gpio_81 = gpio_get_value(81+268);
664 int gpio_82 = gpio_get_value(82+268);
665 void __iomem *conn_status_addr = scp->base + CONN_STATUS;
666
667 if (gpio_81 != 0 && gpio_82 == 0) //TCXO open
668 {
669 val = readl(conn_status_addr);
670 if (strcmp(genpd->name, "conn") == 0) {
671 if ((val & CONN_STATUS_BIT) == CONN_STATUS_BIT)
672 dev_err(scp->dev, "gps try to power on\n");
673 else {
674 dev_err(scp->dev, "Skip conn power on\n");
675 return 0;
676 }
677 }
678 }
679/*Typethree add for tcxo power problem 2023/01/30 end*/
xjb04a4022021-11-25 15:01:52 +0800680
681 ret = scpsys_regulator_enable(scpd);
682 if (ret < 0)
683 return ret;
684
685 scpsys_extb_iso_down(scpd);
686
687 ret = scpsys_clk_enable(scpd->clk, MAX_CLKS);
688 if (ret)
689 goto err_clk;
690
691 /* subsys power on */
692 val = readl(ctl_addr);
693 val |= PWR_ON_BIT;
694 writel(val, ctl_addr);
695 val |= PWR_ON_2ND_BIT;
696 writel(val, ctl_addr);
697
698 /* wait until PWR_ACK = 1 */
699 ret = readx_poll_timeout(scpsys_domain_is_on, scpd, tmp, tmp > 0,
700 MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
701 if (ret < 0)
702 goto err_pwr_ack;
703
704 val &= ~PWR_CLK_DIS_BIT;
705 writel(val, ctl_addr);
706
707 val &= ~PWR_ISO_BIT;
708 writel(val, ctl_addr);
709
710 if(strcmp(genpd->name,"ssusb_phy")==0){
711 val &= ~PWR_RST_B_BIT;
712 writel(val, ctl_addr);
713 }
714
rjw2e8229f2022-02-15 21:08:12 +0800715 /* HSM have two special points:
716 * a. Request bus protect before PWR_RST_B.
717 * b. Move the RST_B after SRAM_PDN.
718 */
719 if (MTK_SCPD_CAPS(scpd, MTK_SCPD_HSM_OPS)) {
720 ret = scpsys_bus_protect_disable(scpd);
721 if (ret < 0)
722 goto err_pwr_ack;
723 } else { /* !HSM */
724 val |= PWR_RST_B_BIT;
725 writel(val, ctl_addr);
726 }
xjb04a4022021-11-25 15:01:52 +0800727
728 if (MTK_SCPD_CAPS(scpd, MTK_SCPD_STRICT_BUSP)) {
729 /*
730 * In few Mediatek platforms(e.g. MT6779), the bus protect
731 * policy is stricter, which leads to bus protect release must
732 * be prior to bus access.
733 */
734 ret = scpsys_sram_enable(scpd, ctl_addr);
735 if (ret < 0)
736 goto err_pwr_ack;
737
738 ret = scpsys_bus_protect_disable(scpd);
739 if (ret < 0)
740 goto err_pwr_ack;
741
742 ret = scpsys_clk_enable(scpd->subsys_clk, MAX_SUBSYS_CLKS);
743 if (ret < 0)
744 goto err_pwr_ack;
745 } else {
746 ret = scpsys_clk_enable(scpd->subsys_clk, MAX_SUBSYS_CLKS);
747 if (ret < 0)
748 goto err_pwr_ack;
749
750 ret = scpsys_sram_enable(scpd, ctl_addr);
751 if (ret < 0)
752 goto err_sram;
753
rjw2e8229f2022-02-15 21:08:12 +0800754 /* HSM Move RST_B after SRAM_PDN to 0. */
755 if (MTK_SCPD_CAPS(scpd, MTK_SCPD_HSM_OPS)) {
756 val = readl(ctl_addr);
757 val |= PWR_RST_B_BIT;
758 writel(val, ctl_addr);
759 } else { /* !HSM */
760 ret = scpsys_bus_protect_disable(scpd);
761 if (ret < 0)
762 goto err_sram;
763 }
xjb04a4022021-11-25 15:01:52 +0800764 }
765
766 return 0;
767
768err_sram:
769 scpsys_clk_disable(scpd->subsys_clk, MAX_SUBSYS_CLKS);
770err_pwr_ack:
771 scpsys_clk_disable(scpd->clk, MAX_CLKS);
772err_clk:
773 scpsys_extb_iso_up(scpd);
774 scpsys_regulator_disable(scpd);
775
776 dev_err(scp->dev, "Failed to power on domain %s\n", genpd->name);
777
778 return ret;
779}
780
781static int scpsys_power_off(struct generic_pm_domain *genpd)
782{
783 struct scp_domain *scpd = container_of(genpd, struct scp_domain, genpd);
784 struct scp *scp = scpd->scp;
785 void __iomem *ctl_addr = scp->base + scpd->data->ctl_offs;
rjw6a17d8f2023-02-03 14:08:22 +0800786
xjb04a4022021-11-25 15:01:52 +0800787 u32 val;
788 int ret, tmp;
rjw6a17d8f2023-02-03 14:08:22 +0800789/*Typethree add for tcxo power problem 2023/01/30 start*/
790 int gpio_81 = gpio_get_value(81+268);
791 int gpio_82 = gpio_get_value(82+268);
792 void __iomem *conn_status_addr = scp->base + CONN_STATUS;
xjb04a4022021-11-25 15:01:52 +0800793
rjw6a17d8f2023-02-03 14:08:22 +0800794 if (gpio_81 != 0 && gpio_82 == 0)
795 {
796 val = readl(conn_status_addr);
797 if (strcmp(genpd->name, "conn") == 0) {
798 if ((val & CONN_STATUS_BIT) == CONN_STATUS_BIT)
799 dev_err(scp->dev, "gps try to power off\n");
800 else {
801 dev_err(scp->dev, "Skip conn power off\n");
802 return 0;
803 }
804 }
805 }
806/*Typethree add for tcxo power problem 2023/01/30 end*/
rjwee88d172023-01-12 14:24:13 +0800807
xjb04a4022021-11-25 15:01:52 +0800808 ret = scpsys_bus_protect_enable(scpd);
809 if (ret < 0)
810 goto out;
811
812 ret = scpsys_sram_disable(scpd, ctl_addr);
813 if (ret < 0)
814 goto out;
815
816 scpsys_clk_disable(scpd->subsys_clk, MAX_SUBSYS_CLKS);
817
818 /* subsys power off */
819 val = readl(ctl_addr) | PWR_ISO_BIT;
820 writel(val, ctl_addr);
821
822 if(strcmp(genpd->name,"ssusb_phy")==0)
823 dev_err(scp->dev, "Skip ssusb_phy rst \n");
824 else{
825 val &= ~PWR_RST_B_BIT;
826 writel(val, ctl_addr);
827 }
828
829 val |= PWR_CLK_DIS_BIT;
830 writel(val, ctl_addr);
831
832 val &= ~PWR_ON_BIT;
833 writel(val, ctl_addr);
834
835 val &= ~PWR_ON_2ND_BIT;
836 writel(val, ctl_addr);
837
838 /* wait until PWR_ACK = 0 */
839 ret = readx_poll_timeout(scpsys_domain_is_on, scpd, tmp, tmp == 0,
840 MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
841 if (ret < 0)
842 goto out;
843
844 scpsys_clk_disable(scpd->clk, MAX_CLKS);
845
846 scpsys_extb_iso_up(scpd);
847
848 ret = scpsys_regulator_disable(scpd);
849 if (ret < 0)
850 goto out;
851
852 return 0;
853
854out:
855 dev_err(scp->dev, "Failed to power off domain %s\n", genpd->name);
856
857 return ret;
858}
859
860static int scpsys_md_power_on(struct generic_pm_domain *genpd)
861{
862 struct scp_domain *scpd = container_of(genpd, struct scp_domain, genpd);
863 struct scp *scp = scpd->scp;
864 void __iomem *ctl_addr = scp->base + scpd->data->ctl_offs;
865 u32 val;
866 int ret, tmp;
867
868 ret = scpsys_regulator_enable(scpd);
869 if (ret < 0)
870 return ret;
871
872 scpsys_extb_iso_down(scpd);
873
874 ret = scpsys_clk_enable(scpd->clk, MAX_CLKS);
875 if (ret)
876 goto err_clk;
877
878 /* for md subsys, reset_b is prior to power_on bit */
879 val = readl(ctl_addr);
880 val |= PWR_RST_B_BIT;
881 writel(val, ctl_addr);
882
883 /* subsys power on */
884 val |= PWR_ON_BIT;
885 writel(val, ctl_addr);
886
887 /* wait until PWR_ACK = 1 */
888 ret = readx_poll_timeout(scpsys_md_domain_is_on, scpd, tmp, tmp > 0,
889 MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
890 if (ret < 0)
891 goto err_pwr_ack;
892
893 if (MTK_SCPD_CAPS(scpd, MTK_SCPD_STRICT_BUSP)) {
894 /*
895 * In few Mediatek platforms(e.g. MT6779), the bus protect
896 * policy is stricter, which leads to bus protect release must
897 * be prior to bus access.
898 */
899 ret = scpsys_sram_enable(scpd, ctl_addr);
900 if (ret < 0)
901 goto err_pwr_ack;
902
903 ret = scpsys_bus_protect_disable(scpd);
904 if (ret < 0)
905 goto err_pwr_ack;
906
907 ret = scpsys_clk_enable(scpd->subsys_clk, MAX_SUBSYS_CLKS);
908 if (ret < 0)
909 goto err_pwr_ack;
910 } else {
911 ret = scpsys_clk_enable(scpd->subsys_clk, MAX_SUBSYS_CLKS);
912 if (ret < 0)
913 goto err_pwr_ack;
914
915 ret = scpsys_sram_enable(scpd, ctl_addr);
916 if (ret < 0)
917 goto err_sram;
918
919 ret = scpsys_bus_protect_disable(scpd);
920 if (ret < 0)
921 goto err_sram;
922 }
923
924 return 0;
925
926err_sram:
927 scpsys_clk_disable(scpd->subsys_clk, MAX_SUBSYS_CLKS);
928err_pwr_ack:
929 scpsys_clk_disable(scpd->clk, MAX_CLKS);
930err_clk:
931 scpsys_extb_iso_up(scpd);
932 scpsys_regulator_disable(scpd);
933
934 dev_err(scp->dev, "Failed to power on domain %s\n", genpd->name);
935
936 return ret;
937}
938
939static int scpsys_md_power_off(struct generic_pm_domain *genpd)
940{
941 struct scp_domain *scpd = container_of(genpd, struct scp_domain, genpd);
942 struct scp *scp = scpd->scp;
943 void __iomem *ctl_addr = scp->base + scpd->data->ctl_offs;
944 u32 val;
945 int ret, tmp;
946
947 ret = scpsys_bus_protect_enable(scpd);
948 if (ret < 0)
949 goto out;
950
951 ret = scpsys_sram_disable(scpd, ctl_addr);
952 if (ret < 0)
953 goto out;
954 scpsys_clk_disable(scpd->subsys_clk, MAX_SUBSYS_CLKS);
955
956 /* subsys power off */
957 val = readl(ctl_addr) & ~PWR_ON_BIT;
958 writel(val, ctl_addr);
959
960 /* wait until PWR_ACK = 0 */
961 ret = readx_poll_timeout(scpsys_md_domain_is_on, scpd, tmp, tmp == 0,
962 MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
963 if (ret < 0)
964 goto out;
965
966 /* for md subsys, the isolation is prior to RST_B operation */
967 scpsys_extb_iso_up(scpd);
968
969 val &= ~PWR_RST_B_BIT;
970 writel(val, ctl_addr);
971
972 scpsys_clk_disable(scpd->clk, MAX_CLKS);
973
974 ret = scpsys_regulator_disable(scpd);
975 if (ret < 0)
976 goto out;
977
978 return 0;
979
980out:
981 dev_err(scp->dev, "Failed to power off domain %s\n", genpd->name);
982
983 return ret;
984}
985
986static int scpsys_netsys_power_on(struct generic_pm_domain *genpd)
987{
988 struct scp_domain *scpd = container_of(genpd, struct scp_domain, genpd);
989 struct scp *scp = scpd->scp;
990 void __iomem *ctl_addr = scp->base + scpd->data->ctl_offs;
991 void __iomem *net_sram_addr = scp->base + NETSYS_S_SRAM_CON;
992 u32 val;
993 int ret, tmp;
994
995 ret = scpsys_regulator_enable(scpd);
996 if (ret < 0)
997 return ret;
998
999 scpsys_extb_iso_down(scpd);
1000
1001 ret = scpsys_clk_enable(scpd->clk, MAX_CLKS);
1002 if (ret)
1003 goto err_clk;
1004
1005 /* subsys power on */
1006 val = readl(ctl_addr);
1007 val |= PWR_ON_BIT;
1008 writel(val, ctl_addr);
1009 val |= PWR_ON_2ND_BIT;
1010 writel(val, ctl_addr);
1011
1012 /* wait until PWR_ACK = 1 */
1013 ret = readx_poll_timeout(scpsys_domain_is_on, scpd, tmp, tmp > 0,
1014 MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
1015 if (ret < 0)
1016 goto err_pwr_ack;
1017
1018 val &= ~PWR_CLK_DIS_BIT;
1019 writel(val, ctl_addr);
1020
1021 val &= ~PWR_ISO_BIT;
1022 writel(val, ctl_addr);
1023
1024 /*NET SYS power_con [8] = 0*/
1025 val &= 0xfffffeff;
1026 writel(val, ctl_addr);
1027
1028 val |= PWR_RST_B_BIT;
1029 writel(val, ctl_addr);
1030
1031 if (MTK_SCPD_CAPS(scpd, MTK_SCPD_STRICT_BUSP)) {
1032 /*
1033 * In few Mediatek platforms(e.g. MT6779), the bus protect
1034 * policy is stricter, which leads to bus protect release must
1035 * be prior to bus access.
1036 */
1037 ret = scpsys_netsys_sram_enable(scpd, net_sram_addr);
1038 if (ret < 0)
1039 goto err_pwr_ack;
1040
1041 ret = scpsys_bus_protect_disable(scpd);
1042 if (ret < 0)
1043 goto err_pwr_ack;
1044
1045 ret = scpsys_clk_enable(scpd->subsys_clk, MAX_SUBSYS_CLKS);
1046 if (ret < 0)
1047 goto err_pwr_ack;
1048 } else {
1049 ret = scpsys_clk_enable(scpd->subsys_clk, MAX_SUBSYS_CLKS);
1050 if (ret < 0)
1051 goto err_pwr_ack;
1052
1053 ret = scpsys_netsys_sram_enable(scpd, net_sram_addr);
1054 if (ret < 0)
1055 goto err_sram;
1056
1057 ret = scpsys_bus_protect_disable(scpd);
1058 if (ret < 0)
1059 goto err_sram;
1060 }
1061
1062 return 0;
1063
1064err_sram:
1065 scpsys_clk_disable(scpd->subsys_clk, MAX_SUBSYS_CLKS);
1066err_pwr_ack:
1067 scpsys_clk_disable(scpd->clk, MAX_CLKS);
1068err_clk:
1069 scpsys_extb_iso_up(scpd);
1070 scpsys_regulator_disable(scpd);
1071
1072 dev_err(scp->dev, "Failed to power on domain %s\n", genpd->name);
1073
1074 return ret;
1075}
1076
1077static int scpsys_netsys_power_off(struct generic_pm_domain *genpd)
1078{
1079 struct scp_domain *scpd = container_of(genpd, struct scp_domain, genpd);
1080 struct scp *scp = scpd->scp;
1081 void __iomem *ctl_addr = scp->base + scpd->data->ctl_offs;
1082 void __iomem *net_sram_addr = scp->base + NETSYS_S_SRAM_CON;
1083 u32 val;
1084 int ret, tmp;
1085
1086 ret = scpsys_bus_protect_enable(scpd);
1087 if (ret < 0)
1088 goto out;
1089
1090 /*NET SYS power_con [8] = 1*/
1091 val = readl(ctl_addr) | 0x00000100;
1092 writel(val, ctl_addr);
1093
1094 ret = scpsys_netsys_sram_disable(scpd, net_sram_addr);
1095 if (ret < 0)
1096 goto out;
1097
1098 scpsys_clk_disable(scpd->subsys_clk, MAX_SUBSYS_CLKS);
1099
1100 /* subsys power off */
1101 val = readl(ctl_addr) | PWR_ISO_BIT;
1102 writel(val, ctl_addr);
1103
1104 val &= ~PWR_RST_B_BIT;
1105 writel(val, ctl_addr);
1106
1107 val |= PWR_CLK_DIS_BIT;
1108 writel(val, ctl_addr);
1109
1110 val &= ~PWR_ON_BIT;
1111 writel(val, ctl_addr);
1112
1113 val &= ~PWR_ON_2ND_BIT;
1114 writel(val, ctl_addr);
1115
1116 /* wait until PWR_ACK = 0 */
1117 ret = readx_poll_timeout(scpsys_domain_is_on, scpd, tmp, tmp == 0,
1118 MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
1119 if (ret < 0)
1120 goto out;
1121
1122 scpsys_clk_disable(scpd->clk, MAX_CLKS);
1123
1124 scpsys_extb_iso_up(scpd);
1125
1126 ret = scpsys_regulator_disable(scpd);
1127 if (ret < 0)
1128 goto out;
1129
1130 return 0;
1131
1132out:
1133 dev_err(scp->dev, "Failed to power off domain %s\n", genpd->name);
1134
1135 return ret;
1136}
1137
1138static int init_subsys_clks(struct platform_device *pdev,
1139 const char *prefix, struct clk **clk)
1140{
1141 struct device_node *node = pdev->dev.of_node;
1142 u32 prefix_len, sub_clk_cnt = 0;
1143 struct property *prop;
1144 const char *clk_name;
1145
1146 if (!node) {
1147 dev_err(&pdev->dev, "Cannot find scpsys node: %ld\n",
1148 PTR_ERR(node));
1149 return PTR_ERR(node);
1150 }
1151
1152 prefix_len = strlen(prefix);
1153
1154 of_property_for_each_string(node, "clock-names", prop, clk_name) {
1155 if (!strncmp(clk_name, prefix, prefix_len) &&
1156 (clk_name[prefix_len] == '-')) {
1157 if (sub_clk_cnt >= MAX_SUBSYS_CLKS) {
1158 dev_err(&pdev->dev,
1159 "subsys clk out of range %d\n",
1160 sub_clk_cnt);
1161 return -ENOMEM;
1162 }
1163
1164 clk[sub_clk_cnt] = devm_clk_get(&pdev->dev,
1165 clk_name);
1166
1167 if (IS_ERR(clk)) {
1168 dev_err(&pdev->dev,
1169 "Subsys clk read fail %ld\n",
1170 PTR_ERR(clk));
1171 return PTR_ERR(clk);
1172 }
1173 sub_clk_cnt++;
1174 }
1175 }
1176
1177 return sub_clk_cnt;
1178}
1179
1180static void init_clks(struct platform_device *pdev, struct clk **clk)
1181{
1182 int i;
1183
1184 for (i = CLK_NONE + 1; i < CLK_MAX; i++)
1185 clk[i] = devm_clk_get(&pdev->dev, clk_names[i]);
1186}
1187
1188static int mtk_pd_set_performance(struct generic_pm_domain *genpd,
1189 unsigned int state)
1190{
1191 int i;
1192 struct scp_domain *scpd =
1193 container_of(genpd, struct scp_domain, genpd);
1194 struct scp_event_data scpe;
1195 struct scp *scp = scpd->scp;
1196 struct genpd_onecell_data *pd_data = &scp->pd_data;
1197
1198 for (i = 0; i < pd_data->num_domains; i++) {
1199 if (genpd == pd_data->domains[i]) {
1200 dev_dbg(scp->dev, "%d. %s = %d\n",
1201 i, genpd->name, state);
1202 break;
1203 }
1204 }
1205
1206 if (i == pd_data->num_domains)
1207 return 0;
1208
1209 scpe.event_type = MTK_SCPSYS_PSTATE;
1210 scpe.genpd = genpd;
1211 scpe.domain_id = i;
1212 blocking_notifier_call_chain(&scpsys_notifier_list, state, &scpe);
1213
1214 return 0;
1215}
1216
1217static unsigned int mtk_pd_get_performance(struct generic_pm_domain *genpd,
1218 struct dev_pm_opp *opp)
1219{
1220 struct device_node *np;
1221 unsigned int val = 0;
1222
1223 np = dev_pm_opp_get_of_node(opp);
1224
1225 if (np) {
1226 of_property_read_u32(np, "opp-level", &val);
1227 of_node_put(np);
1228 }
1229
1230 return val;
1231}
1232
1233static struct scp *init_scp(struct platform_device *pdev,
1234 const struct scp_domain_data *scp_domain_data, int num,
1235 const struct scp_ctrl_reg *scp_ctrl_reg,
1236 bool bus_prot_reg_update)
1237{
1238 struct genpd_onecell_data *pd_data;
1239 struct resource *res;
1240 int i, j, count;
1241 struct scp *scp;
1242 struct clk *clk[CLK_MAX];
1243
1244 scp = devm_kzalloc(&pdev->dev, sizeof(*scp), GFP_KERNEL);
1245 if (!scp)
1246 return ERR_PTR(-ENOMEM);
1247
1248 scp->ctrl_reg.pwr_sta_offs = scp_ctrl_reg->pwr_sta_offs;
1249 scp->ctrl_reg.pwr_sta2nd_offs = scp_ctrl_reg->pwr_sta2nd_offs;
1250
1251 scp->bus_prot_reg_update = bus_prot_reg_update;
1252
1253 scp->dev = &pdev->dev;
1254
1255 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1256 scp->base = devm_ioremap_resource(&pdev->dev, res);
1257 if (IS_ERR(scp->base))
1258 return ERR_CAST(scp->base);
1259
1260 scp->domains = devm_kcalloc(&pdev->dev,
1261 num, sizeof(*scp->domains), GFP_KERNEL);
1262 if (!scp->domains)
1263 return ERR_PTR(-ENOMEM);
1264
1265 pd_data = &scp->pd_data;
1266
1267 pd_data->domains = devm_kcalloc(&pdev->dev,
1268 num, sizeof(*pd_data->domains), GFP_KERNEL);
1269 if (!pd_data->domains)
1270 return ERR_PTR(-ENOMEM);
1271
1272 scp->infracfg = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1273 "infracfg");
1274 if (IS_ERR(scp->infracfg)) {
1275 dev_err(&pdev->dev, "Cannot find infracfg controller: %ld\n",
1276 PTR_ERR(scp->infracfg));
1277 return ERR_CAST(scp->infracfg);
1278 }
1279
1280 scp->smi_common = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1281 "smi_comm");
1282
1283 if (scp->smi_common == ERR_PTR(-ENODEV)) {
1284 scp->smi_common = NULL;
1285 } else if (IS_ERR(scp->smi_common)) {
1286 dev_err(&pdev->dev, "Cannot find smi_common controller: %ld\n",
1287 PTR_ERR(scp->smi_common));
1288 return ERR_CAST(scp->smi_common);
1289 }
1290
1291 scp->infracfg_nao = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1292 "infracfg_nao");
1293
1294 if (scp->infracfg_nao == ERR_PTR(-ENODEV)) {
1295 scp->infracfg_nao = NULL;
1296 } else if (IS_ERR(scp->infracfg_nao)) {
1297 dev_err(&pdev->dev, "Cannot find infracfg_nao controller: %ld\n",
1298 PTR_ERR(scp->infracfg_nao));
1299 return ERR_CAST(scp->infracfg_nao);
1300 }
1301
1302 for (i = 0; i < num; i++) {
1303 struct scp_domain *scpd = &scp->domains[i];
1304 const struct scp_domain_data *data = &scp_domain_data[i];
1305
1306 scpd->supply = devm_regulator_get_optional(&pdev->dev, data->name);
1307 if (IS_ERR(scpd->supply)) {
1308 if (PTR_ERR(scpd->supply) == -ENODEV)
1309 scpd->supply = NULL;
1310 else
1311 return ERR_CAST(scpd->supply);
1312 }
1313 }
1314
1315 pd_data->num_domains = num;
1316
1317 init_clks(pdev, clk);
1318
1319 for (i = 0; i < num; i++) {
1320 struct scp_domain *scpd = &scp->domains[i];
1321 struct generic_pm_domain *genpd = &scpd->genpd;
1322 const struct scp_domain_data *data = &scp_domain_data[i];
1323 int clk_cnt;
1324
1325 pd_data->domains[i] = genpd;
1326 scpd->scp = scp;
1327
1328 scpd->data = data;
1329
1330 if (data->clk_id[0]) {
1331 for (j = 0; j < MAX_CLKS && data->clk_id[j]; j++) {
1332 struct clk *c = clk[data->clk_id[j]];
1333
1334 if (IS_ERR(c)) {
1335 dev_err(&pdev->dev,
1336 "%s: clk unavailable\n",
1337 data->name);
1338 return ERR_CAST(c);
1339 }
1340
1341 scpd->clk[j] = c;
1342 }
1343 } else if (data->basic_clk_name[0]) {
1344 for (j = 0; j < MAX_CLKS &&
1345 data->basic_clk_name[j]; j++)
1346 scpd->clk[j] = devm_clk_get(&pdev->dev,
1347 data->basic_clk_name[j]);
1348 }
1349
1350 if (data->subsys_clk_prefix) {
1351 clk_cnt = init_subsys_clks(pdev,
1352 data->subsys_clk_prefix,
1353 scpd->subsys_clk);
1354 if (clk_cnt < 0) {
1355 dev_err(&pdev->dev,
1356 "%s: subsys clk unavailable\n",
1357 data->name);
1358 return ERR_PTR(clk_cnt);
1359 }
1360 }
1361
1362 genpd->name = data->name;
1363
1364 if (MTK_SCPD_CAPS(scpd, MTK_SCPD_MD_OPS)) {
1365 genpd->power_off = scpsys_md_power_off;
1366 genpd->power_on = scpsys_md_power_on;
1367 } else if (MTK_SCPD_CAPS(scpd, MTK_SCPD_NETSYS_OPS)){
1368 genpd->power_off = scpsys_netsys_power_off;
1369 genpd->power_on = scpsys_netsys_power_on;
1370 } else {
1371 genpd->power_off = scpsys_power_off;
1372 genpd->power_on = scpsys_power_on;
1373 }
1374 if (MTK_SCPD_CAPS(scpd, MTK_SCPD_ACTIVE_WAKEUP))
1375 genpd->flags |= GENPD_FLAG_ACTIVE_WAKEUP;
1376 if (MTK_SCPD_CAPS(scpd, MTK_SCPD_ALWAYS_ON))
1377 genpd->flags |= GENPD_FLAG_ALWAYS_ON;
1378 if (MTCMOS_BRINGUP)
1379 genpd->flags |= GENPD_FLAG_ALWAYS_ON;
1380
1381 count = of_count_phandle_with_args(pdev->dev.of_node,
1382 "operating-points-v2", NULL);
1383 if (count > 0) {
1384 genpd->set_performance_state = mtk_pd_set_performance;
1385 genpd->opp_to_performance_state =
1386 mtk_pd_get_performance;
1387 }
1388 }
1389
1390 return scp;
1391}
1392
1393static void mtk_register_power_domains(struct platform_device *pdev,
1394 struct scp *scp, int num)
1395{
1396 struct genpd_onecell_data *pd_data;
1397 int i, ret;
xjb04a4022021-11-25 15:01:52 +08001398 for (i = 0; i < num; i++) {
1399 struct scp_domain *scpd = &scp->domains[i];
1400 struct generic_pm_domain *genpd = &scpd->genpd;
jb.qic6d447c2023-04-17 03:39:21 -07001401 bool on;//jb.qi change for reboot after sleep on 20230417
xjb04a4022021-11-25 15:01:52 +08001402 /*
jb.qic6d447c2023-04-17 03:39:21 -07001403 * Initially turn on the domains to make the domains usable
xjb04a4022021-11-25 15:01:52 +08001404 * with !CONFIG_PM and to get the hardware in sync with the
1405 * software. The unused domains will be switched off during
1406 * late_init time.
jb.qic6d447c2023-04-17 03:39:21 -07001407 * Power on the ssusb/netsys/connectivity by default to let each driver
1408 * disable the clock in case of no usage.
xjb04a4022021-11-25 15:01:52 +08001409 */
jb.qic6d447c2023-04-17 03:39:21 -07001410 /*jb.qi change for reboot after sleep on 20230417 start*/
1411 if (strcmp(genpd->name, "ssusb_phy") == 0 ||
1412 strcmp(genpd->name, "netsys") == 0 ||
1413 strcmp(genpd->name, "conn") == 0) {
1414 on = false;
1415 dev_err(&pdev->dev, "Skip %s pwr_on\n", genpd->name);
1416 } else {
1417 on = !WARN_ON(genpd->power_on(genpd) < 0);
xjb04a4022021-11-25 15:01:52 +08001418 }
1419
jb.qic6d447c2023-04-17 03:39:21 -07001420 pm_genpd_init(genpd, NULL, !on);
1421 /*jb.qi change for reboot after sleep on 20230417 end*/
xjb04a4022021-11-25 15:01:52 +08001422 }
1423
1424 /*
1425 * We are not allowed to fail here since there is no way to unregister
1426 * a power domain. Once registered above we have to keep the domains
1427 * valid.
1428 */
1429
1430 pd_data = &scp->pd_data;
1431
1432 ret = of_genpd_add_provider_onecell(pdev->dev.of_node, pd_data);
1433 if (ret)
1434 dev_err(&pdev->dev, "Failed to add OF provider: %d\n", ret);
1435}
1436
1437/*
1438 * MT2701 power domain support
1439 */
1440
1441static const struct scp_domain_data scp_domain_data_mt2701[] = {
1442 [MT2701_POWER_DOMAIN_CONN] = {
1443 .name = "conn",
1444 .sta_mask = PWR_STATUS_CONN,
1445 .ctl_offs = SPM_CONN_PWR_CON,
1446 .bus_prot_mask = MT2701_TOP_AXI_PROT_EN_CONN_M |
1447 MT2701_TOP_AXI_PROT_EN_CONN_S,
1448 .clk_id = {CLK_NONE},
1449 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1450 },
1451 [MT2701_POWER_DOMAIN_DISP] = {
1452 .name = "disp",
1453 .sta_mask = PWR_STATUS_DISP,
1454 .ctl_offs = SPM_DIS_PWR_CON,
1455 .sram_pdn_bits = GENMASK(11, 8),
1456 .clk_id = {CLK_MM},
1457 .bus_prot_mask = MT2701_TOP_AXI_PROT_EN_MM_M0,
1458 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1459 },
1460 [MT2701_POWER_DOMAIN_MFG] = {
1461 .name = "mfg",
1462 .sta_mask = PWR_STATUS_MFG,
1463 .ctl_offs = SPM_MFG_PWR_CON,
1464 .sram_pdn_bits = GENMASK(11, 8),
1465 .sram_pdn_ack_bits = GENMASK(12, 12),
1466 .clk_id = {CLK_MFG},
1467 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1468 },
1469 [MT2701_POWER_DOMAIN_VDEC] = {
1470 .name = "vdec",
1471 .sta_mask = PWR_STATUS_VDEC,
1472 .ctl_offs = SPM_VDE_PWR_CON,
1473 .sram_pdn_bits = GENMASK(11, 8),
1474 .sram_pdn_ack_bits = GENMASK(12, 12),
1475 .clk_id = {CLK_MM},
1476 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1477 },
1478 [MT2701_POWER_DOMAIN_ISP] = {
1479 .name = "isp",
1480 .sta_mask = PWR_STATUS_ISP,
1481 .ctl_offs = SPM_ISP_PWR_CON,
1482 .sram_pdn_bits = GENMASK(11, 8),
1483 .sram_pdn_ack_bits = GENMASK(13, 12),
1484 .clk_id = {CLK_MM},
1485 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1486 },
1487 [MT2701_POWER_DOMAIN_BDP] = {
1488 .name = "bdp",
1489 .sta_mask = PWR_STATUS_BDP,
1490 .ctl_offs = SPM_BDP_PWR_CON,
1491 .sram_pdn_bits = GENMASK(11, 8),
1492 .clk_id = {CLK_NONE},
1493 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1494 },
1495 [MT2701_POWER_DOMAIN_ETH] = {
1496 .name = "eth",
1497 .sta_mask = PWR_STATUS_ETH,
1498 .ctl_offs = SPM_ETH_PWR_CON,
1499 .sram_pdn_bits = GENMASK(11, 8),
1500 .sram_pdn_ack_bits = GENMASK(15, 12),
1501 .clk_id = {CLK_ETHIF},
1502 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1503 },
1504 [MT2701_POWER_DOMAIN_HIF] = {
1505 .name = "hif",
1506 .sta_mask = PWR_STATUS_HIF,
1507 .ctl_offs = SPM_HIF_PWR_CON,
1508 .sram_pdn_bits = GENMASK(11, 8),
1509 .sram_pdn_ack_bits = GENMASK(15, 12),
1510 .clk_id = {CLK_ETHIF},
1511 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1512 },
1513 [MT2701_POWER_DOMAIN_IFR_MSC] = {
1514 .name = "ifr_msc",
1515 .sta_mask = PWR_STATUS_IFR_MSC,
1516 .ctl_offs = SPM_IFR_MSC_PWR_CON,
1517 .clk_id = {CLK_NONE},
1518 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1519 },
1520};
1521
1522/*
1523 * MT2712 power domain support
1524 */
1525static const struct scp_domain_data scp_domain_data_mt2712[] = {
1526 [MT2712_POWER_DOMAIN_MM] = {
1527 .name = "mm",
1528 .sta_mask = PWR_STATUS_DISP,
1529 .ctl_offs = SPM_DIS_PWR_CON,
1530 .sram_pdn_bits = GENMASK(8, 8),
1531 .sram_pdn_ack_bits = GENMASK(12, 12),
1532 .clk_id = {CLK_MM},
1533 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1534 },
1535 [MT2712_POWER_DOMAIN_VDEC] = {
1536 .name = "vdec",
1537 .sta_mask = PWR_STATUS_VDEC,
1538 .ctl_offs = SPM_VDE_PWR_CON,
1539 .sram_pdn_bits = GENMASK(8, 8),
1540 .sram_pdn_ack_bits = GENMASK(12, 12),
1541 .clk_id = {CLK_MM, CLK_VDEC},
1542 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1543 },
1544 [MT2712_POWER_DOMAIN_VENC] = {
1545 .name = "venc",
1546 .sta_mask = PWR_STATUS_VENC,
1547 .ctl_offs = SPM_VEN_PWR_CON,
1548 .sram_pdn_bits = GENMASK(11, 8),
1549 .sram_pdn_ack_bits = GENMASK(15, 12),
1550 .clk_id = {CLK_MM, CLK_VENC, CLK_JPGDEC},
1551 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1552 },
1553 [MT2712_POWER_DOMAIN_ISP] = {
1554 .name = "isp",
1555 .sta_mask = PWR_STATUS_ISP,
1556 .ctl_offs = SPM_ISP_PWR_CON,
1557 .sram_pdn_bits = GENMASK(11, 8),
1558 .sram_pdn_ack_bits = GENMASK(13, 12),
1559 .clk_id = {CLK_MM},
1560 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1561 },
1562 [MT2712_POWER_DOMAIN_AUDIO] = {
1563 .name = "audio",
1564 .sta_mask = PWR_STATUS_AUDIO,
1565 .ctl_offs = SPM_AUDIO_PWR_CON,
1566 .sram_pdn_bits = GENMASK(11, 8),
1567 .sram_pdn_ack_bits = GENMASK(15, 12),
1568 .clk_id = {CLK_AUDIO},
1569 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1570 },
1571 [MT2712_POWER_DOMAIN_USB] = {
1572 .name = "usb",
1573 .sta_mask = PWR_STATUS_USB,
1574 .ctl_offs = SPM_USB_PWR_CON,
1575 .sram_pdn_bits = GENMASK(10, 8),
1576 .sram_pdn_ack_bits = GENMASK(14, 12),
1577 .clk_id = {CLK_NONE},
1578 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1579 },
1580 [MT2712_POWER_DOMAIN_USB2] = {
1581 .name = "usb2",
1582 .sta_mask = PWR_STATUS_USB2,
1583 .ctl_offs = SPM_USB2_PWR_CON,
1584 .sram_pdn_bits = GENMASK(10, 8),
1585 .sram_pdn_ack_bits = GENMASK(14, 12),
1586 .clk_id = {CLK_NONE},
1587 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1588 },
1589 [MT2712_POWER_DOMAIN_MFG] = {
1590 .name = "mfg",
1591 .sta_mask = PWR_STATUS_MFG,
1592 .ctl_offs = SPM_MFG_PWR_CON,
1593 .sram_pdn_bits = GENMASK(8, 8),
1594 .sram_pdn_ack_bits = GENMASK(16, 16),
1595 .clk_id = {CLK_MFG},
1596 .bus_prot_mask = BIT(14) | BIT(21) | BIT(23),
1597 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1598 },
1599 [MT2712_POWER_DOMAIN_MFG_SC1] = {
1600 .name = "mfg_sc1",
1601 .sta_mask = BIT(22),
1602 .ctl_offs = 0x02c0,
1603 .sram_pdn_bits = GENMASK(8, 8),
1604 .sram_pdn_ack_bits = GENMASK(16, 16),
1605 .clk_id = {CLK_NONE},
1606 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1607 },
1608 [MT2712_POWER_DOMAIN_MFG_SC2] = {
1609 .name = "mfg_sc2",
1610 .sta_mask = BIT(23),
1611 .ctl_offs = 0x02c4,
1612 .sram_pdn_bits = GENMASK(8, 8),
1613 .sram_pdn_ack_bits = GENMASK(16, 16),
1614 .clk_id = {CLK_NONE},
1615 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1616 },
1617 [MT2712_POWER_DOMAIN_MFG_SC3] = {
1618 .name = "mfg_sc3",
1619 .sta_mask = BIT(30),
1620 .ctl_offs = 0x01f8,
1621 .sram_pdn_bits = GENMASK(8, 8),
1622 .sram_pdn_ack_bits = GENMASK(16, 16),
1623 .clk_id = {CLK_NONE},
1624 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1625 },
1626};
1627
1628static const struct scp_subdomain scp_subdomain_mt2712[] = {
1629 {MT2712_POWER_DOMAIN_MM, MT2712_POWER_DOMAIN_VDEC},
1630 {MT2712_POWER_DOMAIN_MM, MT2712_POWER_DOMAIN_VENC},
1631 {MT2712_POWER_DOMAIN_MM, MT2712_POWER_DOMAIN_ISP},
1632 {MT2712_POWER_DOMAIN_MFG, MT2712_POWER_DOMAIN_MFG_SC1},
1633 {MT2712_POWER_DOMAIN_MFG_SC1, MT2712_POWER_DOMAIN_MFG_SC2},
1634 {MT2712_POWER_DOMAIN_MFG_SC2, MT2712_POWER_DOMAIN_MFG_SC3},
1635};
1636
1637/*
1638 * MT6797 power domain support
1639 */
1640
1641static const struct scp_domain_data scp_domain_data_mt6797[] = {
1642 [MT6797_POWER_DOMAIN_VDEC] = {
1643 .name = "vdec",
1644 .sta_mask = BIT(7),
1645 .ctl_offs = 0x300,
1646 .sram_pdn_bits = GENMASK(8, 8),
1647 .sram_pdn_ack_bits = GENMASK(12, 12),
1648 .clk_id = {CLK_VDEC},
1649 },
1650 [MT6797_POWER_DOMAIN_VENC] = {
1651 .name = "venc",
1652 .sta_mask = BIT(21),
1653 .ctl_offs = 0x304,
1654 .sram_pdn_bits = GENMASK(11, 8),
1655 .sram_pdn_ack_bits = GENMASK(15, 12),
1656 .clk_id = {CLK_NONE},
1657 },
1658 [MT6797_POWER_DOMAIN_ISP] = {
1659 .name = "isp",
1660 .sta_mask = BIT(5),
1661 .ctl_offs = 0x308,
1662 .sram_pdn_bits = GENMASK(9, 8),
1663 .sram_pdn_ack_bits = GENMASK(13, 12),
1664 .clk_id = {CLK_NONE},
1665 },
1666 [MT6797_POWER_DOMAIN_MM] = {
1667 .name = "mm",
1668 .sta_mask = BIT(3),
1669 .ctl_offs = 0x30C,
1670 .sram_pdn_bits = GENMASK(8, 8),
1671 .sram_pdn_ack_bits = GENMASK(12, 12),
1672 .clk_id = {CLK_MM},
1673 .bus_prot_mask = (BIT(1) | BIT(2)),
1674 },
1675 [MT6797_POWER_DOMAIN_AUDIO] = {
1676 .name = "audio",
1677 .sta_mask = BIT(24),
1678 .ctl_offs = 0x314,
1679 .sram_pdn_bits = GENMASK(11, 8),
1680 .sram_pdn_ack_bits = GENMASK(15, 12),
1681 .clk_id = {CLK_NONE},
1682 },
1683 [MT6797_POWER_DOMAIN_MFG_ASYNC] = {
1684 .name = "mfg_async",
1685 .sta_mask = BIT(13),
1686 .ctl_offs = 0x334,
1687 .sram_pdn_bits = 0,
1688 .sram_pdn_ack_bits = 0,
1689 .clk_id = {CLK_MFG},
1690 },
1691 [MT6797_POWER_DOMAIN_MJC] = {
1692 .name = "mjc",
1693 .sta_mask = BIT(20),
1694 .ctl_offs = 0x310,
1695 .sram_pdn_bits = GENMASK(8, 8),
1696 .sram_pdn_ack_bits = GENMASK(12, 12),
1697 .clk_id = {CLK_NONE},
1698 },
1699};
1700
1701#define SPM_PWR_STATUS_MT6797 0x0180
1702#define SPM_PWR_STATUS_2ND_MT6797 0x0184
1703
1704static const struct scp_subdomain scp_subdomain_mt6797[] = {
1705 {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_VDEC},
1706 {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_ISP},
1707 {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_VENC},
1708 {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_MJC},
1709};
1710
1711
1712/*
1713 * MT6779 power domain support
1714 */
1715static const struct scp_domain_data scp_domain_data_mt6779[] = {
1716 [MT6779_POWER_DOMAIN_AUDIO] = {
1717 .name = "audio",
1718 .sta_mask = BIT(24),
1719 .ctl_offs = 0x31C,
1720 .sram_pdn_bits = GENMASK(8, 8),
1721 .sram_pdn_ack_bits = GENMASK(12, 12),
1722 .basic_clk_name = {"audio"},
1723 .caps = MTK_SCPD_STRICT_BUSP,
jb.qic6d447c2023-04-17 03:39:21 -07001724 /*jb.qi change for reboot after sleep on 20230417 start*/
xjb04a4022021-11-25 15:01:52 +08001725 .bp_table = {
1726 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR,
1727 0, MT6779_IFR_STA1, BIT(31), BIT(31), 0),
1728 },
jb.qic6d447c2023-04-17 03:39:21 -07001729 /*jb.qi change for reboot after sleep on 20230417 end*/
xjb04a4022021-11-25 15:01:52 +08001730 },
1731
1732 [MT6779_POWER_DOMAIN_MM] = {
1733 .name = "mm",
1734 .sta_mask = BIT(3),
1735 .ctl_offs = 0x30C,
1736 .sram_pdn_bits = GENMASK(8, 8),
1737 .sram_pdn_ack_bits = GENMASK(12, 12),
1738 .basic_clk_name = {"mm"},
1739 .subsys_clk_prefix = "mm",
1740 .caps = MTK_SCPD_STRICT_BUSP,
1741 .bp_table = {
1742
1743 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1744 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1745 BIT(0) | BIT(1) | BIT(3) | BIT(4) |
1746 BIT(5) | BIT(6),
1747 BIT(0) | BIT(1) | BIT(3) | BIT(4) |
1748 BIT(5) | BIT(6), 0),
1749 BUS_PROT(SMI_TYPE, MT6779_SMI_SET, MT6779_SMI_CLR,
1750 0, MT6779_SMI_STA,
1751 GENMASK(7, 0), GENMASK(7, 0), 0),
1752 BUS_PROT(IFR_TYPE, MT6779_IFR1_SET,
1753 MT6779_IFR1_CLR, 0, MT6779_IFR1_STA1,
1754 BIT(16) | BIT(17), BIT(16) | BIT(17), 0),
1755
1756 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR,
1757 0, MT6779_IFR_STA1,
1758 BIT(10) | BIT(11), BIT(10) | BIT(11), 0),
1759 /* WAY EN1 */
1760 BUS_PROT(IFR_WAYEN_TYPE, MT6779_IFR_SI0_SET,
1761 MT6779_IFR_SI0_CLR, 0, MT6779_IFR_SI0_STA,
1762 BIT(6), BIT(24), BIT(24)),
1763 /* WAY EN2 */
1764 BUS_PROT(IFR_WAYEN_TYPE, 0x0, 0x0,
1765 MT6779_IFR_PDN_SI2_CTL, MT6779_IFR_SI2_STA,
1766 BIT(5), BIT(14), BIT(14)),
1767
1768 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR,
1769 0, MT6779_IFR_STA1, BIT(6), BIT(6), 0),
1770 },
1771 },
1772
1773 [MT6779_POWER_DOMAIN_VDE] = {
1774 .name = "vde",
1775 .sta_mask = BIT(31),
1776 .ctl_offs = 0x300,
1777 .sram_pdn_bits = GENMASK(8, 8),
1778 .sram_pdn_ack_bits = GENMASK(12, 12),
1779 .basic_clk_name = {"vdec"},
1780 .subsys_clk_prefix = "vdec",
1781 .caps = MTK_SCPD_STRICT_BUSP,
1782 .bp_table = {
1783 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1784 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1785 BIT(1), BIT(1), 0),
1786 BUS_PROT(SMI_TYPE, MT6779_SMI_SET,
1787 MT6779_SMI_CLR, 0, MT6779_SMI_STA,
1788 BIT(2), BIT(2), 0),
1789 },
1790 },
1791
1792 [MT6779_POWER_DOMAIN_CAM] = {
1793 .name = "cam",
1794 .sta_mask = BIT(25),
1795 .ctl_offs = 0x324,
1796 .sram_pdn_bits = GENMASK(9, 8),
1797 .sram_pdn_ack_bits = GENMASK(13, 12),
1798 .basic_clk_name = {"cam", "ccu"}, /* cam needs 2 clkmuxes */
1799 .subsys_clk_prefix = "cam",
1800 .caps = MTK_SCPD_STRICT_BUSP,
1801 .bp_table = {
1802 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1803 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1804 BIT(4) | BIT(5) | BIT(9) | BIT(13),
1805 BIT(4) | BIT(5) | BIT(9) | BIT(13), 0),
1806 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR,
1807 0, MT6779_IFR_STA1, BIT(28), BIT(28), 0),
1808 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1809 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1810 BIT(11), BIT(11), 0),
1811 BUS_PROT(SMI_TYPE, MT6779_SMI_SET, MT6779_SMI_CLR,
1812 0, MT6779_SMI_STA,
1813 BIT(6) | BIT(7), BIT(6) | BIT(7), 0),
1814 },
1815 },
1816
1817 [MT6779_POWER_DOMAIN_ISP] = {
1818 .name = "isp",
1819 .sta_mask = BIT(5),
1820 .ctl_offs = 0x308,
1821 .sram_pdn_bits = GENMASK(8, 8),
1822 .sram_pdn_ack_bits = GENMASK(12, 12),
1823 .basic_clk_name = {"isp"},
1824 .subsys_clk_prefix = "isp",
1825 .caps = MTK_SCPD_STRICT_BUSP,
1826 .bp_table = {
1827 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1828 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1829 BIT(3) | BIT(8), BIT(3) | BIT(8), 0),
1830 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1831 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1832 BIT(10), BIT(10), 0),
1833 BUS_PROT(SMI_TYPE, MT6779_SMI_SET, MT6779_SMI_CLR,
1834 0, MT6779_SMI_STA, BIT(4), BIT(4), 0),
1835 },
1836 },
1837
1838 [MT6779_POWER_DOMAIN_IPE] = {
1839 .name = "ipe",
1840 .sta_mask = BIT(13),
1841 .ctl_offs = 0x350,
1842 .sram_pdn_bits = GENMASK(8, 8),
1843 .sram_pdn_ack_bits = GENMASK(12, 12),
1844 .basic_clk_name = {"ipe"},
1845 .subsys_clk_prefix = "ipe",
1846 .caps = MTK_SCPD_STRICT_BUSP,
1847 .bp_table = {
1848 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1849 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1850 BIT(6), BIT(6), 0),
1851 BUS_PROT(SMI_TYPE, MT6779_SMI_SET, MT6779_SMI_CLR,
1852 0, MT6779_SMI_STA, BIT(5), BIT(5), 0),
1853 },
1854 },
1855
1856 [MT6779_POWER_DOMAIN_VEN] = {
1857 .name = "ven",
1858 .sta_mask = BIT(21),
1859 .ctl_offs = 0x304,
1860 .sram_pdn_bits = GENMASK(11, 8),
1861 .sram_pdn_ack_bits = GENMASK(15, 12),
1862 .basic_clk_name = {"venc"},
1863 .subsys_clk_prefix = "venc",
1864 .caps = MTK_SCPD_STRICT_BUSP,
1865 .bp_table = {
1866 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1867 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1868 BIT(0), BIT(0), 0),
1869 BUS_PROT(SMI_TYPE, MT6779_SMI_SET,
1870 MT6779_SMI_CLR, 0, MT6779_SMI_STA,
1871 BIT(3), BIT(3), 0),
1872 },
1873 },
1874
1875 [MT6779_POWER_DOMAIN_MFG0] = {
1876 .name = "mfg0",
1877 .sta_mask = BIT(4),
1878 .ctl_offs = 0x328,
1879 .caps = MTK_SCPD_STRICT_BUSP,
1880 },
1881
1882 [MT6779_POWER_DOMAIN_MFG1] = {
1883 .name = "mfg1",
1884 .sta_mask = BIT(7),
1885 .ctl_offs = 0x32C,
1886 .sram_pdn_bits = GENMASK(9, 8),
1887 .sram_pdn_ack_bits = GENMASK(13, 12),
1888 .caps = MTK_SCPD_STRICT_BUSP,
1889 .bp_table = {
1890 BUS_PROT(IFR_TYPE, MT6779_IFR1_SET,
1891 MT6779_IFR1_CLR, 0, MT6779_IFR1_STA1,
1892 BIT(19) | BIT(20) | BIT(21),
1893 BIT(19) | BIT(20) | BIT(21), 0),
1894 BUS_PROT(IFR_TYPE, MT6779_IFR_SET,
1895 MT6779_IFR_CLR, 0, MT6779_IFR_STA1,
1896 BIT(21) | BIT(22), BIT(21) | BIT(22), 0),
1897 },
1898 },
1899
1900 [MT6779_POWER_DOMAIN_MFG2] = {
1901 .name = "mfg2",
1902 .sta_mask = BIT(20),
1903 .ctl_offs = 0x330,
1904 .sram_pdn_bits = GENMASK(8, 8),
1905 .sram_pdn_ack_bits = GENMASK(12, 12),
1906 .caps = MTK_SCPD_STRICT_BUSP,
1907 },
1908
1909 [MT6779_POWER_DOMAIN_MFG3] = {
1910 .name = "mfg3",
1911 .sta_mask = BIT(22),
1912 .ctl_offs = 0x334,
1913 .sram_pdn_bits = GENMASK(8, 8),
1914 .sram_pdn_ack_bits = GENMASK(12, 12),
1915 .caps = MTK_SCPD_STRICT_BUSP,
1916 },
1917
1918 [MT6779_POWER_DOMAIN_CONN] = {
1919 .name = "conn",
1920 .sta_mask = BIT(1),
1921 .ctl_offs = 0x320,
1922 .caps = MTK_SCPD_STRICT_BUSP,
1923 .bp_table = {
1924 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR,
1925 0, MT6779_IFR_STA1, BIT(13) | BIT(18),
1926 BIT(13) | BIT(18), 0),
1927 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR,
1928 0, MT6779_IFR_STA1, BIT(14), BIT(14), 0),
1929 BUS_PROT(IFR_TYPE, MT6779_IFR1_SET,
1930 MT6779_IFR1_CLR, 0, MT6779_IFR1_STA1,
1931 BIT(10), BIT(10), 0),
1932 },
1933 },
1934
1935 [MT6779_POWER_DOMAIN_MD] = {
1936 .name = "md",
1937 .sta_mask = BIT(0),
1938 .ctl_offs = 0x318,
1939 .caps = MTK_SCPD_STRICT_BUSP | MTK_SCPD_MD_OPS,
1940 .extb_iso_offs = 0x3B0,
1941 .extb_iso_bits = BIT(0) | BIT(1),
1942 .bp_table = {
1943 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR, 0,
1944 MT6779_IFR_STA1, BIT(7), BIT(7), 0),
1945 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR, 0,
1946 MT6779_IFR_STA1, BIT(3) | BIT(4),
1947 BIT(3) | BIT(4), 0),
1948 BUS_PROT(IFR_TYPE, MT6779_IFR1_SET, MT6779_IFR1_CLR, 0,
1949 MT6779_IFR1_STA1, BIT(6), BIT(6), 0),
1950 },
1951 },
1952
1953 [MT6779_POWER_DOMAIN_INFRA] = { /* pseudo infra power domain */
1954 .name = "infra",
1955 .sta_mask = BIT(6),
1956 .ctl_offs = 0x3C4,
1957 .caps = MTK_SCPD_STRICT_BUSP | MTK_SCPD_ALWAYS_ON,
1958 },
1959};
1960
1961#define SPM_PWR_STATUS_MT6779 0x0160
1962#define SPM_PWR_STATUS_2ND_MT6779 0x0164
1963
1964static const struct scp_subdomain scp_subdomain_mt6779[] = {
1965 {MT6779_POWER_DOMAIN_MM, MT6779_POWER_DOMAIN_VDE},
1966 {MT6779_POWER_DOMAIN_MM, MT6779_POWER_DOMAIN_CAM},
1967 {MT6779_POWER_DOMAIN_MM, MT6779_POWER_DOMAIN_ISP},
1968 {MT6779_POWER_DOMAIN_MM, MT6779_POWER_DOMAIN_IPE},
1969 {MT6779_POWER_DOMAIN_MM, MT6779_POWER_DOMAIN_VEN},
1970
1971 {MT6779_POWER_DOMAIN_MFG0, MT6779_POWER_DOMAIN_MFG1},
1972 {MT6779_POWER_DOMAIN_MFG1, MT6779_POWER_DOMAIN_MFG2},
1973 {MT6779_POWER_DOMAIN_MFG2, MT6779_POWER_DOMAIN_MFG3},
1974};
1975
1976
1977/*
1978 * MT6880 power domain support
1979 */
1980
1981static const struct scp_domain_data scp_domain_data_mt6880[] = {
1982 [MT6880_POWER_DOMAIN_PEXTP_D_2LX1] = {
1983 .name = "pextp_d_2lx1",
1984 .sta_mask = BIT(12),
1985 .ctl_offs = 0x330,
1986 .sram_pdn_bits = GENMASK(8, 8),
1987 .sram_pdn_ack_bits = GENMASK(12, 12),
1988 },
1989 [MT6880_POWER_DOMAIN_MD1] = {
1990 .name = "md1",
1991 .sta_mask = BIT(0),
1992 .ctl_offs = 0x300,
1993 .caps = MTK_SCPD_MD_OPS,
1994 .extb_iso_offs = 0x398,
1995 .extb_iso_bits = 0x3,
1996 .bp_table = {
1997 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
1998 MT6880_TOP_AXI_PROT_EN_MD1,MT6880_TOP_AXI_PROT_EN_MD1,0),
1999 BUS_PROT(IFR_TYPE, 0x0B84, 0x0B88, 0x0B80, 0x0B90,
2000 MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_MD1,MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_MD1,0),
2001 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2002 MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_MD1,MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_MD1,0),
2003 },
2004 },
2005 [MT6880_POWER_DOMAIN_CONN] = {
2006 .name = "conn",
2007 .sta_mask = BIT(1),
2008 .ctl_offs = 0x304,
2009 .bp_table = {
2010 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2011 MT6880_TOP_AXI_PROT_EN_CONN,MT6880_TOP_AXI_PROT_EN_CONN,0),
2012 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2013 MT6880_TOP_AXI_PROT_EN_CONN_2ND,MT6880_TOP_AXI_PROT_EN_CONN_2ND,0),
2014 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2015 MT6880_TOP_AXI_PROT_EN_CONN_3RD,MT6880_TOP_AXI_PROT_EN_CONN_3RD,0),
2016 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2017 MT6880_TOP_AXI_PROT_EN_CONN_4RD,MT6880_TOP_AXI_PROT_EN_CONN_4RD,0),
2018 },
2019 },
2020 [MT6880_POWER_DOMAIN_MSDC] = {
2021 .name = "msdc",
2022 .sta_mask = BIT(30),
2023 .ctl_offs = 0x3A4,
2024 .sram_pdn_bits = GENMASK(8, 8),
2025 .bp_table = {
2026 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2027 MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_MSDC,MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_MSDC,0),
2028 },
2029 },
2030 [MT6880_POWER_DOMAIN_SSUSB] = {
2031 .name = "ssusb",
2032 .sta_mask = BIT(16),
2033 .ctl_offs = 0x340,
2034 .sram_pdn_bits = GENMASK(8, 8),
2035 .sram_pdn_ack_bits = GENMASK(12, 12),
2036 .bp_table = {
2037 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2038 MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_SSUSB,MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_SSUSB,0),
2039 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2040 MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_3_SSUSB,MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_3_SSUSB,0),
2041 },
2042 },
2043 [MT6880_POWER_DOMAIN_SSUSB_PHY] = {
2044 .name = "ssusb_phy",
2045 .sta_mask = BIT(7),
2046 .ctl_offs = 0x31C,
2047 },
2048 [MT6880_POWER_DOMAIN_PEXTP_D_2LX1_PHY] = {
2049 .name = "pextp_d_2lx1_phy",
2050 .sta_mask = BIT(3),
2051 .ctl_offs = 0x30C,
2052 },
2053};
2054
2055static const struct scp_subdomain scp_subdomain_mt6880[] = {
2056 {MT6880_POWER_DOMAIN_PEXTP_D_2LX1_PHY, MT6880_POWER_DOMAIN_PEXTP_D_2LX1},
2057 {MT6880_POWER_DOMAIN_SSUSB_PHY, MT6880_POWER_DOMAIN_SSUSB},
2058};
2059
2060
2061/*
2062 * MT6890 power domain support
2063 */
2064
2065static const struct scp_domain_data scp_domain_data_mt6890[] = {
2066 [MT6890_POWER_DOMAIN_PEXTP_D_2LX1] = {
2067 .name = "pextp_d_2lx1",
2068 .sta_mask = BIT(12),
2069 .ctl_offs = 0x330,
2070 .sram_pdn_bits = GENMASK(8, 8),
2071 .sram_pdn_ack_bits = GENMASK(12, 12),
2072 },
2073 [MT6890_POWER_DOMAIN_ETH] = {
2074 .name = "eth",
2075 .sta_mask = BIT(15),
2076 .ctl_offs = 0x33C,
2077 .sram_pdn_bits = GENMASK(8, 8),
2078 .sram_pdn_ack_bits = GENMASK(12, 12),
2079 .clk_id = {CLK_ETH1, CLK_ETH2, CLK_ETH3, CLK_ETH4},
2080 .bp_table = {
2081 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2082 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_ETH,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_ETH,0),
2083 },
2084 },
lh0d3f4db2022-09-17 00:16:39 -07002085 [MT6890_POWER_DOMAIN_NETSYS] = {
2086 .name = "netsys",
2087 .sta_mask = BIT(19),
2088 .ctl_offs = 0x34C,
2089 .caps = MTK_SCPD_NETSYS_OPS,
2090 .sram_pdn_bits = GENMASK(4, 4),
2091 .sram_pdn_ack_bits = GENMASK(12, 12),
2092 .sram_pdn_bits1 = GENMASK(1, 1),
2093 .sram_pdn_bits2 = GENMASK(17, 17),
2094 .sram_pdn_ack_bits2 = GENMASK(25, 25),
2095 .clk_id = {CLK_NETSYS1, CLK_NETSYS2, CLK_NETSYS3, CLK_NETSYS4,
2096 CLK_NETSYS5, CLK_NETSYS6, CLK_NETSYS7, CLK_NETSYS8},
jb.qic6d447c2023-04-17 03:39:21 -07002097 .bp_table = {
lh0d3f4db2022-09-17 00:16:39 -07002098 BUS_PROT(IFR_TYPE, 0x0714, 0x0718, 0x0710, 0x0724,
2099 MT6890_TOP_AXI_PROT_EN_2_NETSYS,MT6890_TOP_AXI_PROT_EN_2_NETSYS,0),
2100 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2101 MT6890_TOP_AXI_PROT_EN_NETSYS,MT6890_TOP_AXI_PROT_EN_NETSYS,0),
2102 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2103 MT6890_TOP_AXI_PROT_EN_NETSYS_2ND,MT6890_TOP_AXI_PROT_EN_NETSYS_2ND,0),
2104 BUS_PROT(IFR_TYPE, 0x0714, 0x0718, 0x0710, 0x0724,
2105 MT6890_TOP_AXI_PROT_EN_2_NETSYS_2ND,MT6890_TOP_AXI_PROT_EN_2_NETSYS_2ND,0),
jb.qic6d447c2023-04-17 03:39:21 -07002106 },
lh0d3f4db2022-09-17 00:16:39 -07002107 },
xjb04a4022021-11-25 15:01:52 +08002108 [MT6890_POWER_DOMAIN_AUDIO] = {
2109 .name = "audio",
2110 .sta_mask = BIT(21),
2111 .ctl_offs = 0x354,
2112 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2113 .sram_pdn_bits = GENMASK(8, 8),
2114 .sram_pdn_ack_bits = GENMASK(12, 12),
2115 .clk_id = {CLK_AUDIO},
2116 },
2117 [MT6890_POWER_DOMAIN_MD1] = {
2118 .name = "md1",
2119 .sta_mask = BIT(0),
2120 .ctl_offs = 0x300,
2121 .caps = MTK_SCPD_MD_OPS | MTK_SCPD_ACTIVE_WAKEUP,
2122 .extb_iso_offs = 0x398,
2123 .extb_iso_bits = 0x3,
2124 .bp_table = {
2125 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2126 MT6890_TOP_AXI_PROT_EN_MD1,MT6890_TOP_AXI_PROT_EN_MD1,0),
2127 BUS_PROT(IFR_TYPE, 0x0B84, 0x0B88, 0x0B80, 0x0B90,
2128 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_MD1,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_MD1,0),
2129 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2130 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_MD1,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_MD1,0),
2131 },
2132 },
2133 [MT6890_POWER_DOMAIN_EIP97] = {
2134 .name = "eip97",
2135 .sta_mask = BIT(22),
2136 .ctl_offs = 0x328,
2137 .sram_pdn_bits = GENMASK(8, 8),
2138 .clk_id = {CLK_EIP97},
2139 .bp_table = {
2140 BUS_PROT(IFR_TYPE, 0x0B84, 0x0B88, 0x0B80, 0x0B90,
2141 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_EIP97,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_EIP97,0),
2142 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2143 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_EIP97,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_EIP97,0),
2144 },
2145 },
2146 [MT6890_POWER_DOMAIN_CONN] = {
2147 .name = "conn",
2148 .sta_mask = BIT(1),
2149 .ctl_offs = 0x304,
2150 .bp_table = {
2151 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2152 MT6890_TOP_AXI_PROT_EN_CONN,MT6890_TOP_AXI_PROT_EN_CONN,0),
2153 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2154 MT6890_TOP_AXI_PROT_EN_CONN_2ND,MT6890_TOP_AXI_PROT_EN_CONN_2ND,0),
2155 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2156 MT6890_TOP_AXI_PROT_EN_CONN_3RD,MT6890_TOP_AXI_PROT_EN_CONN_3RD,0),
2157 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2158 MT6890_TOP_AXI_PROT_EN_CONN_4RD,MT6890_TOP_AXI_PROT_EN_CONN_4RD,0),
2159 },
2160 },
2161 [MT6890_POWER_DOMAIN_MSDC] = {
2162 .name = "msdc",
2163 .sta_mask = BIT(30),
2164 .ctl_offs = 0x3A4,
2165 .sram_pdn_bits = GENMASK(8, 8),
2166 .bp_table = {
2167 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2168 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_MSDC,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_MSDC,0),
2169 },
2170 },
2171 [MT6890_POWER_DOMAIN_HSMTOP] = {
2172 .name = "hsmtop",
2173 .sta_mask = BIT(23),
2174 .ctl_offs = 0x344,
2175 .sram_pdn_bits = GENMASK(8, 8),
2176 .sram_pdn_ack_bits = GENMASK(12, 12),
rjw2e8229f2022-02-15 21:08:12 +08002177 .caps = MTK_SCPD_HSM_OPS,
2178 .clk_id = {CLK_HSM},
2179 .bp_table = {
2180 BUS_PROT(IFR_TYPE, 0x0714, 0x0718, 0x0710, 0x0724,
2181 MT6890_TOP_AXI_PROT_EN_2_HSM,
2182 MT6890_TOP_AXI_PROT_EN_2_HSM, 0),
2183 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2184 MT6890_TOP_AXI_PROT_EN_HSM,
2185 MT6890_TOP_AXI_PROT_EN_HSM, 0),
2186 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2187 MT6890_TOP_AXI_PROT_EN_HSM_2ND,
2188 MT6890_TOP_AXI_PROT_EN_HSM_2ND, 0),
2189 BUS_PROT(IFR_TYPE, 0x0714, 0x0718, 0x0710, 0x0724,
2190 MT6890_TOP_AXI_PROT_EN_2_HSM_2ND,
2191 MT6890_TOP_AXI_PROT_EN_2_HSM_2ND, 0),
2192 },
xjb04a4022021-11-25 15:01:52 +08002193 },
2194 [MT6890_POWER_DOMAIN_SSUSB] = {
2195 .name = "ssusb",
2196 .sta_mask = BIT(16),
2197 .ctl_offs = 0x340,
2198 .sram_pdn_bits = GENMASK(8, 8),
2199 .sram_pdn_ack_bits = GENMASK(12, 12),
2200 .bp_table = {
2201 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2202 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_SSUSB,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_SSUSB,0),
2203 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2204 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_3_SSUSB,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_3_SSUSB,0),
2205 },
2206 },
2207 [MT6890_POWER_DOMAIN_SSUSB_PHY] = {
2208 .name = "ssusb_phy",
2209 .sta_mask = BIT(7),
2210 .ctl_offs = 0x31C,
2211 },
2212 [MT6890_POWER_DOMAIN_SGMII_0_PHY] = {
2213 .name = "sgmii_0_phy",
2214 .sta_mask = BIT(8),
2215 .ctl_offs = 0x358,
2216 },
2217 [MT6890_POWER_DOMAIN_SGMII_0_TOP] = {
2218 .name = "sgmii_0_top",
2219 .sta_mask = BIT(17),
2220 .ctl_offs = 0x360,
2221 },
2222 [MT6890_POWER_DOMAIN_SGMII_1_PHY] = {
2223 .name = "sgmii_1_phy",
2224 .sta_mask = BIT(10),
2225 .ctl_offs = 0x35C,
2226 },
2227 [MT6890_POWER_DOMAIN_SGMII_1_TOP] = {
2228 .name = "sgmii_1_top",
2229 .sta_mask = BIT(18),
2230 .ctl_offs = 0x364,
2231 },
2232 [MT6890_POWER_DOMAIN_PEXTP_D_2LX1_PHY] = {
2233 .name = "pextp_d_2lx1_phy",
2234 .sta_mask = BIT(3),
2235 .ctl_offs = 0x30C,
2236 },
2237};
2238
2239static const struct scp_subdomain scp_subdomain_mt6890[] = {
2240 {MT6890_POWER_DOMAIN_PEXTP_D_2LX1_PHY, MT6890_POWER_DOMAIN_PEXTP_D_2LX1},
2241 {MT6890_POWER_DOMAIN_SSUSB_PHY, MT6890_POWER_DOMAIN_SSUSB},
2242 {MT6890_POWER_DOMAIN_SGMII_0_PHY, MT6890_POWER_DOMAIN_SGMII_0_TOP},
2243 {MT6890_POWER_DOMAIN_SGMII_1_PHY, MT6890_POWER_DOMAIN_SGMII_1_TOP},
2244};
2245
2246/*
2247 * MT7622 power domain support
2248 */
2249
2250static const struct scp_domain_data scp_domain_data_mt7622[] = {
2251 [MT7622_POWER_DOMAIN_ETHSYS] = {
2252 .name = "ethsys",
2253 .sta_mask = PWR_STATUS_ETHSYS,
2254 .ctl_offs = SPM_ETHSYS_PWR_CON,
2255 .sram_pdn_bits = GENMASK(11, 8),
2256 .sram_pdn_ack_bits = GENMASK(15, 12),
2257 .clk_id = {CLK_NONE},
2258 .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_ETHSYS,
2259 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2260 },
2261 [MT7622_POWER_DOMAIN_HIF0] = {
2262 .name = "hif0",
2263 .sta_mask = PWR_STATUS_HIF0,
2264 .ctl_offs = SPM_HIF0_PWR_CON,
2265 .sram_pdn_bits = GENMASK(11, 8),
2266 .sram_pdn_ack_bits = GENMASK(15, 12),
2267 .clk_id = {CLK_HIFSEL},
2268 .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_HIF0,
2269 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2270 },
2271 [MT7622_POWER_DOMAIN_HIF1] = {
2272 .name = "hif1",
2273 .sta_mask = PWR_STATUS_HIF1,
2274 .ctl_offs = SPM_HIF1_PWR_CON,
2275 .sram_pdn_bits = GENMASK(11, 8),
2276 .sram_pdn_ack_bits = GENMASK(15, 12),
2277 .clk_id = {CLK_HIFSEL},
2278 .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_HIF1,
2279 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2280 },
2281 [MT7622_POWER_DOMAIN_WB] = {
2282 .name = "wb",
2283 .sta_mask = PWR_STATUS_WB,
2284 .ctl_offs = SPM_WB_PWR_CON,
2285 .sram_pdn_bits = 0,
2286 .sram_pdn_ack_bits = 0,
2287 .clk_id = {CLK_NONE},
2288 .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_WB,
2289 .caps = MTK_SCPD_ACTIVE_WAKEUP | MTK_SCPD_FWAIT_SRAM,
2290 },
2291};
2292
2293/*
2294 * MT7623A power domain support
2295 */
2296
2297static const struct scp_domain_data scp_domain_data_mt7623a[] = {
2298 [MT7623A_POWER_DOMAIN_CONN] = {
2299 .name = "conn",
2300 .sta_mask = PWR_STATUS_CONN,
2301 .ctl_offs = SPM_CONN_PWR_CON,
2302 .bus_prot_mask = MT2701_TOP_AXI_PROT_EN_CONN_M |
2303 MT2701_TOP_AXI_PROT_EN_CONN_S,
2304 .clk_id = {CLK_NONE},
2305 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2306 },
2307 [MT7623A_POWER_DOMAIN_ETH] = {
2308 .name = "eth",
2309 .sta_mask = PWR_STATUS_ETH,
2310 .ctl_offs = SPM_ETH_PWR_CON,
2311 .sram_pdn_bits = GENMASK(11, 8),
2312 .sram_pdn_ack_bits = GENMASK(15, 12),
2313 .clk_id = {CLK_ETHIF},
2314 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2315 },
2316 [MT7623A_POWER_DOMAIN_HIF] = {
2317 .name = "hif",
2318 .sta_mask = PWR_STATUS_HIF,
2319 .ctl_offs = SPM_HIF_PWR_CON,
2320 .sram_pdn_bits = GENMASK(11, 8),
2321 .sram_pdn_ack_bits = GENMASK(15, 12),
2322 .clk_id = {CLK_ETHIF},
2323 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2324 },
2325 [MT7623A_POWER_DOMAIN_IFR_MSC] = {
2326 .name = "ifr_msc",
2327 .sta_mask = PWR_STATUS_IFR_MSC,
2328 .ctl_offs = SPM_IFR_MSC_PWR_CON,
2329 .clk_id = {CLK_NONE},
2330 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2331 },
2332};
2333
2334/*
2335 * MT8173 power domain support
2336 */
2337
2338static const struct scp_domain_data scp_domain_data_mt8173[] = {
2339 [MT8173_POWER_DOMAIN_VDEC] = {
2340 .name = "vdec",
2341 .sta_mask = PWR_STATUS_VDEC,
2342 .ctl_offs = SPM_VDE_PWR_CON,
2343 .sram_pdn_bits = GENMASK(11, 8),
2344 .sram_pdn_ack_bits = GENMASK(12, 12),
2345 .clk_id = {CLK_MM},
2346 },
2347 [MT8173_POWER_DOMAIN_VENC] = {
2348 .name = "venc",
2349 .sta_mask = PWR_STATUS_VENC,
2350 .ctl_offs = SPM_VEN_PWR_CON,
2351 .sram_pdn_bits = GENMASK(11, 8),
2352 .sram_pdn_ack_bits = GENMASK(15, 12),
2353 .clk_id = {CLK_MM, CLK_VENC},
2354 },
2355 [MT8173_POWER_DOMAIN_ISP] = {
2356 .name = "isp",
2357 .sta_mask = PWR_STATUS_ISP,
2358 .ctl_offs = SPM_ISP_PWR_CON,
2359 .sram_pdn_bits = GENMASK(11, 8),
2360 .sram_pdn_ack_bits = GENMASK(13, 12),
2361 .clk_id = {CLK_MM},
2362 },
2363 [MT8173_POWER_DOMAIN_MM] = {
2364 .name = "mm",
2365 .sta_mask = PWR_STATUS_DISP,
2366 .ctl_offs = SPM_DIS_PWR_CON,
2367 .sram_pdn_bits = GENMASK(11, 8),
2368 .sram_pdn_ack_bits = GENMASK(12, 12),
2369 .clk_id = {CLK_MM},
2370 .bus_prot_mask = MT8173_TOP_AXI_PROT_EN_MM_M0 |
2371 MT8173_TOP_AXI_PROT_EN_MM_M1,
2372 },
2373 [MT8173_POWER_DOMAIN_VENC_LT] = {
2374 .name = "venc_lt",
2375 .sta_mask = PWR_STATUS_VENC_LT,
2376 .ctl_offs = SPM_VEN2_PWR_CON,
2377 .sram_pdn_bits = GENMASK(11, 8),
2378 .sram_pdn_ack_bits = GENMASK(15, 12),
2379 .clk_id = {CLK_MM, CLK_VENC_LT},
2380 },
2381 [MT8173_POWER_DOMAIN_AUDIO] = {
2382 .name = "audio",
2383 .sta_mask = PWR_STATUS_AUDIO,
2384 .ctl_offs = SPM_AUDIO_PWR_CON,
2385 .sram_pdn_bits = GENMASK(11, 8),
2386 .sram_pdn_ack_bits = GENMASK(15, 12),
2387 .clk_id = {CLK_NONE},
2388 },
2389 [MT8173_POWER_DOMAIN_USB] = {
2390 .name = "usb",
2391 .sta_mask = PWR_STATUS_USB,
2392 .ctl_offs = SPM_USB_PWR_CON,
2393 .sram_pdn_bits = GENMASK(11, 8),
2394 .sram_pdn_ack_bits = GENMASK(15, 12),
2395 .clk_id = {CLK_NONE},
2396 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2397 },
2398 [MT8173_POWER_DOMAIN_MFG_ASYNC] = {
2399 .name = "mfg_async",
2400 .sta_mask = PWR_STATUS_MFG_ASYNC,
2401 .ctl_offs = SPM_MFG_ASYNC_PWR_CON,
2402 .sram_pdn_bits = GENMASK(11, 8),
2403 .sram_pdn_ack_bits = 0,
2404 .clk_id = {CLK_MFG},
2405 },
2406 [MT8173_POWER_DOMAIN_MFG_2D] = {
2407 .name = "mfg_2d",
2408 .sta_mask = PWR_STATUS_MFG_2D,
2409 .ctl_offs = SPM_MFG_2D_PWR_CON,
2410 .sram_pdn_bits = GENMASK(11, 8),
2411 .sram_pdn_ack_bits = GENMASK(13, 12),
2412 .clk_id = {CLK_NONE},
2413 },
2414 [MT8173_POWER_DOMAIN_MFG] = {
2415 .name = "mfg",
2416 .sta_mask = PWR_STATUS_MFG,
2417 .ctl_offs = SPM_MFG_PWR_CON,
2418 .sram_pdn_bits = GENMASK(13, 8),
2419 .sram_pdn_ack_bits = GENMASK(21, 16),
2420 .clk_id = {CLK_NONE},
2421 .bus_prot_mask = MT8173_TOP_AXI_PROT_EN_MFG_S |
2422 MT8173_TOP_AXI_PROT_EN_MFG_M0 |
2423 MT8173_TOP_AXI_PROT_EN_MFG_M1 |
2424 MT8173_TOP_AXI_PROT_EN_MFG_SNOOP_OUT,
2425 },
2426};
2427
2428static const struct scp_subdomain scp_subdomain_mt8173[] = {
2429 {MT8173_POWER_DOMAIN_MFG_ASYNC, MT8173_POWER_DOMAIN_MFG_2D},
2430 {MT8173_POWER_DOMAIN_MFG_2D, MT8173_POWER_DOMAIN_MFG},
2431};
2432
2433static const struct scp_soc_data mt2701_data = {
2434 .domains = scp_domain_data_mt2701,
2435 .num_domains = ARRAY_SIZE(scp_domain_data_mt2701),
2436 .regs = {
2437 .pwr_sta_offs = SPM_PWR_STATUS,
2438 .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
2439 },
2440 .bus_prot_reg_update = true,
2441};
2442
2443static const struct scp_soc_data mt2712_data = {
2444 .domains = scp_domain_data_mt2712,
2445 .num_domains = ARRAY_SIZE(scp_domain_data_mt2712),
2446 .subdomains = scp_subdomain_mt2712,
2447 .num_subdomains = ARRAY_SIZE(scp_subdomain_mt2712),
2448 .regs = {
2449 .pwr_sta_offs = SPM_PWR_STATUS,
2450 .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
2451 },
2452 .bus_prot_reg_update = false,
2453};
2454
2455static const struct scp_soc_data mt6797_data = {
2456 .domains = scp_domain_data_mt6797,
2457 .num_domains = ARRAY_SIZE(scp_domain_data_mt6797),
2458 .subdomains = scp_subdomain_mt6797,
2459 .num_subdomains = ARRAY_SIZE(scp_subdomain_mt6797),
2460 .regs = {
2461 .pwr_sta_offs = SPM_PWR_STATUS_MT6797,
2462 .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND_MT6797
2463 },
2464 .bus_prot_reg_update = true,
2465};
2466
2467static const struct scp_soc_data mt6779_data = {
2468 .domains = scp_domain_data_mt6779,
2469 .num_domains = ARRAY_SIZE(scp_domain_data_mt6779),
2470 .subdomains = scp_subdomain_mt6779,
2471 .num_subdomains = ARRAY_SIZE(scp_subdomain_mt6779),
2472 .regs = {
2473 .pwr_sta_offs = SPM_PWR_STATUS_MT6779,
2474 .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND_MT6779
2475 },
2476 .bus_prot_reg_update = true,
2477};
2478
2479static const struct scp_soc_data mt6880_data = {
2480 .domains = scp_domain_data_mt6880,
2481 .num_domains = ARRAY_SIZE(scp_domain_data_mt6880),
2482 .subdomains = scp_subdomain_mt6880,
2483 .num_subdomains = ARRAY_SIZE(scp_subdomain_mt6880),
2484 .regs = {
2485 .pwr_sta_offs = 0x16C,
2486 .pwr_sta2nd_offs = 0x170
2487 }
2488};
2489
2490static const struct scp_soc_data mt6890_data = {
2491 .domains = scp_domain_data_mt6890,
2492 .num_domains = ARRAY_SIZE(scp_domain_data_mt6890),
2493 .subdomains = scp_subdomain_mt6890,
2494 .num_subdomains = ARRAY_SIZE(scp_subdomain_mt6890),
2495 .regs = {
2496 .pwr_sta_offs = 0x16C,
2497 .pwr_sta2nd_offs = 0x170
2498 }
2499};
2500
2501static const struct scp_soc_data mt7622_data = {
2502 .domains = scp_domain_data_mt7622,
2503 .num_domains = ARRAY_SIZE(scp_domain_data_mt7622),
2504 .regs = {
2505 .pwr_sta_offs = SPM_PWR_STATUS,
2506 .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
2507 },
2508 .bus_prot_reg_update = true,
2509};
2510
2511static const struct scp_soc_data mt7623a_data = {
2512 .domains = scp_domain_data_mt7623a,
2513 .num_domains = ARRAY_SIZE(scp_domain_data_mt7623a),
2514 .regs = {
2515 .pwr_sta_offs = SPM_PWR_STATUS,
2516 .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
2517 },
2518 .bus_prot_reg_update = true,
2519};
2520
2521static const struct scp_soc_data mt8173_data = {
2522 .domains = scp_domain_data_mt8173,
2523 .num_domains = ARRAY_SIZE(scp_domain_data_mt8173),
2524 .subdomains = scp_subdomain_mt8173,
2525 .num_subdomains = ARRAY_SIZE(scp_subdomain_mt8173),
2526 .regs = {
2527 .pwr_sta_offs = SPM_PWR_STATUS,
2528 .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
2529 },
2530 .bus_prot_reg_update = true,
2531};
2532
2533/*
2534 * scpsys driver init
2535 */
2536
2537static const struct of_device_id of_scpsys_match_tbl[] = {
2538 {
2539 .compatible = "mediatek,mt2701-scpsys",
2540 .data = &mt2701_data,
2541 }, {
2542 .compatible = "mediatek,mt2712-scpsys",
2543 .data = &mt2712_data,
2544 }, {
2545 .compatible = "mediatek,mt6797-scpsys",
2546 .data = &mt6797_data,
2547 }, {
2548 .compatible = "mediatek,mt6779-scpsys",
2549 .data = &mt6779_data,
2550 }, {
2551 .compatible = "mediatek,mt6880-scpsys",
2552 .data = &mt6880_data,
2553 }, {
2554 .compatible = "mediatek,mt6890-scpsys",
2555 .data = &mt6890_data,
2556 }, {
2557 .compatible = "mediatek,mt7622-scpsys",
2558 .data = &mt7622_data,
2559 }, {
2560 .compatible = "mediatek,mt7623a-scpsys",
2561 .data = &mt7623a_data,
2562 }, {
2563 .compatible = "mediatek,mt8173-scpsys",
2564 .data = &mt8173_data,
2565 }, {
2566 /* sentinel */
2567 }
2568};
2569
2570static int scpsys_probe(struct platform_device *pdev)
2571{
2572 const struct scp_subdomain *sd;
2573 const struct scp_soc_data *soc;
2574 struct scp *scp;
2575 struct genpd_onecell_data *pd_data;
2576 int i, ret;
2577
2578 soc = of_device_get_match_data(&pdev->dev);
2579
2580 scp = init_scp(pdev, soc->domains, soc->num_domains, &soc->regs,
2581 soc->bus_prot_reg_update);
2582 if (IS_ERR(scp))
2583 return PTR_ERR(scp);
2584
2585 mtk_register_power_domains(pdev, scp, soc->num_domains);
2586
2587 pd_data = &scp->pd_data;
2588
2589 for (i = 0, sd = soc->subdomains; i < soc->num_subdomains; i++, sd++) {
2590 ret = pm_genpd_add_subdomain(pd_data->domains[sd->origin],
2591 pd_data->domains[sd->subdomain]);
2592 if (ret && IS_ENABLED(CONFIG_PM))
2593 dev_err(&pdev->dev, "Failed to add subdomain: %d\n",
2594 ret);
2595 }
2596
2597 return 0;
2598}
2599
2600static struct platform_driver scpsys_drv = {
2601 .probe = scpsys_probe,
2602 .driver = {
2603 .name = "mtk-scpsys",
2604 .suppress_bind_attrs = true,
2605 .owner = THIS_MODULE,
2606 .of_match_table = of_match_ptr(of_scpsys_match_tbl),
2607 },
2608};
2609static int __init scpsys_init(void)
2610{
2611 return platform_driver_register(&scpsys_drv);
2612}
2613//move from device init to arch init, to become earlier than normal subsys
2614arch_initcall_sync(scpsys_init);