blob: 2c822d1970238438697aae3d7b09ea97dfa8e3e9 [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;
1398
1399 for (i = 0; i < num; i++) {
1400 struct scp_domain *scpd = &scp->domains[i];
1401 struct generic_pm_domain *genpd = &scpd->genpd;
1402
1403 /*
1404 * Initially turn on all domains to make the domains usable
1405 * with !CONFIG_PM and to get the hardware in sync with the
1406 * software. The unused domains will be switched off during
1407 * late_init time.
1408 */
1409 if(strcmp(genpd->name,"conn")){
1410 if(strcmp(genpd->name,"ssusb_phy")==0)
lh0d3f4db2022-09-17 00:16:39 -07001411 dev_err(&pdev->dev, "Skip ssusb_phy & netsys pwr_on \n");
1412 else if (strcmp(genpd->name,"netsys")==0){
1413 ret = scpsys_clk_enable(scpd->clk, MAX_CLKS);
1414 if (ret)
1415 pr_notice("netsys clock on fail");
1416 dev_err(&pdev->dev, "Skip netsys pwr_on \n");
1417 }
xjb04a4022021-11-25 15:01:52 +08001418 else
1419 genpd->power_on(genpd);
1420 }
1421
1422 pm_genpd_init(genpd, NULL, false);
1423 }
1424
1425 /*
1426 * We are not allowed to fail here since there is no way to unregister
1427 * a power domain. Once registered above we have to keep the domains
1428 * valid.
1429 */
1430
1431 pd_data = &scp->pd_data;
1432
1433 ret = of_genpd_add_provider_onecell(pdev->dev.of_node, pd_data);
1434 if (ret)
1435 dev_err(&pdev->dev, "Failed to add OF provider: %d\n", ret);
1436}
1437
1438/*
1439 * MT2701 power domain support
1440 */
1441
1442static const struct scp_domain_data scp_domain_data_mt2701[] = {
1443 [MT2701_POWER_DOMAIN_CONN] = {
1444 .name = "conn",
1445 .sta_mask = PWR_STATUS_CONN,
1446 .ctl_offs = SPM_CONN_PWR_CON,
1447 .bus_prot_mask = MT2701_TOP_AXI_PROT_EN_CONN_M |
1448 MT2701_TOP_AXI_PROT_EN_CONN_S,
1449 .clk_id = {CLK_NONE},
1450 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1451 },
1452 [MT2701_POWER_DOMAIN_DISP] = {
1453 .name = "disp",
1454 .sta_mask = PWR_STATUS_DISP,
1455 .ctl_offs = SPM_DIS_PWR_CON,
1456 .sram_pdn_bits = GENMASK(11, 8),
1457 .clk_id = {CLK_MM},
1458 .bus_prot_mask = MT2701_TOP_AXI_PROT_EN_MM_M0,
1459 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1460 },
1461 [MT2701_POWER_DOMAIN_MFG] = {
1462 .name = "mfg",
1463 .sta_mask = PWR_STATUS_MFG,
1464 .ctl_offs = SPM_MFG_PWR_CON,
1465 .sram_pdn_bits = GENMASK(11, 8),
1466 .sram_pdn_ack_bits = GENMASK(12, 12),
1467 .clk_id = {CLK_MFG},
1468 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1469 },
1470 [MT2701_POWER_DOMAIN_VDEC] = {
1471 .name = "vdec",
1472 .sta_mask = PWR_STATUS_VDEC,
1473 .ctl_offs = SPM_VDE_PWR_CON,
1474 .sram_pdn_bits = GENMASK(11, 8),
1475 .sram_pdn_ack_bits = GENMASK(12, 12),
1476 .clk_id = {CLK_MM},
1477 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1478 },
1479 [MT2701_POWER_DOMAIN_ISP] = {
1480 .name = "isp",
1481 .sta_mask = PWR_STATUS_ISP,
1482 .ctl_offs = SPM_ISP_PWR_CON,
1483 .sram_pdn_bits = GENMASK(11, 8),
1484 .sram_pdn_ack_bits = GENMASK(13, 12),
1485 .clk_id = {CLK_MM},
1486 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1487 },
1488 [MT2701_POWER_DOMAIN_BDP] = {
1489 .name = "bdp",
1490 .sta_mask = PWR_STATUS_BDP,
1491 .ctl_offs = SPM_BDP_PWR_CON,
1492 .sram_pdn_bits = GENMASK(11, 8),
1493 .clk_id = {CLK_NONE},
1494 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1495 },
1496 [MT2701_POWER_DOMAIN_ETH] = {
1497 .name = "eth",
1498 .sta_mask = PWR_STATUS_ETH,
1499 .ctl_offs = SPM_ETH_PWR_CON,
1500 .sram_pdn_bits = GENMASK(11, 8),
1501 .sram_pdn_ack_bits = GENMASK(15, 12),
1502 .clk_id = {CLK_ETHIF},
1503 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1504 },
1505 [MT2701_POWER_DOMAIN_HIF] = {
1506 .name = "hif",
1507 .sta_mask = PWR_STATUS_HIF,
1508 .ctl_offs = SPM_HIF_PWR_CON,
1509 .sram_pdn_bits = GENMASK(11, 8),
1510 .sram_pdn_ack_bits = GENMASK(15, 12),
1511 .clk_id = {CLK_ETHIF},
1512 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1513 },
1514 [MT2701_POWER_DOMAIN_IFR_MSC] = {
1515 .name = "ifr_msc",
1516 .sta_mask = PWR_STATUS_IFR_MSC,
1517 .ctl_offs = SPM_IFR_MSC_PWR_CON,
1518 .clk_id = {CLK_NONE},
1519 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1520 },
1521};
1522
1523/*
1524 * MT2712 power domain support
1525 */
1526static const struct scp_domain_data scp_domain_data_mt2712[] = {
1527 [MT2712_POWER_DOMAIN_MM] = {
1528 .name = "mm",
1529 .sta_mask = PWR_STATUS_DISP,
1530 .ctl_offs = SPM_DIS_PWR_CON,
1531 .sram_pdn_bits = GENMASK(8, 8),
1532 .sram_pdn_ack_bits = GENMASK(12, 12),
1533 .clk_id = {CLK_MM},
1534 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1535 },
1536 [MT2712_POWER_DOMAIN_VDEC] = {
1537 .name = "vdec",
1538 .sta_mask = PWR_STATUS_VDEC,
1539 .ctl_offs = SPM_VDE_PWR_CON,
1540 .sram_pdn_bits = GENMASK(8, 8),
1541 .sram_pdn_ack_bits = GENMASK(12, 12),
1542 .clk_id = {CLK_MM, CLK_VDEC},
1543 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1544 },
1545 [MT2712_POWER_DOMAIN_VENC] = {
1546 .name = "venc",
1547 .sta_mask = PWR_STATUS_VENC,
1548 .ctl_offs = SPM_VEN_PWR_CON,
1549 .sram_pdn_bits = GENMASK(11, 8),
1550 .sram_pdn_ack_bits = GENMASK(15, 12),
1551 .clk_id = {CLK_MM, CLK_VENC, CLK_JPGDEC},
1552 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1553 },
1554 [MT2712_POWER_DOMAIN_ISP] = {
1555 .name = "isp",
1556 .sta_mask = PWR_STATUS_ISP,
1557 .ctl_offs = SPM_ISP_PWR_CON,
1558 .sram_pdn_bits = GENMASK(11, 8),
1559 .sram_pdn_ack_bits = GENMASK(13, 12),
1560 .clk_id = {CLK_MM},
1561 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1562 },
1563 [MT2712_POWER_DOMAIN_AUDIO] = {
1564 .name = "audio",
1565 .sta_mask = PWR_STATUS_AUDIO,
1566 .ctl_offs = SPM_AUDIO_PWR_CON,
1567 .sram_pdn_bits = GENMASK(11, 8),
1568 .sram_pdn_ack_bits = GENMASK(15, 12),
1569 .clk_id = {CLK_AUDIO},
1570 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1571 },
1572 [MT2712_POWER_DOMAIN_USB] = {
1573 .name = "usb",
1574 .sta_mask = PWR_STATUS_USB,
1575 .ctl_offs = SPM_USB_PWR_CON,
1576 .sram_pdn_bits = GENMASK(10, 8),
1577 .sram_pdn_ack_bits = GENMASK(14, 12),
1578 .clk_id = {CLK_NONE},
1579 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1580 },
1581 [MT2712_POWER_DOMAIN_USB2] = {
1582 .name = "usb2",
1583 .sta_mask = PWR_STATUS_USB2,
1584 .ctl_offs = SPM_USB2_PWR_CON,
1585 .sram_pdn_bits = GENMASK(10, 8),
1586 .sram_pdn_ack_bits = GENMASK(14, 12),
1587 .clk_id = {CLK_NONE},
1588 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1589 },
1590 [MT2712_POWER_DOMAIN_MFG] = {
1591 .name = "mfg",
1592 .sta_mask = PWR_STATUS_MFG,
1593 .ctl_offs = SPM_MFG_PWR_CON,
1594 .sram_pdn_bits = GENMASK(8, 8),
1595 .sram_pdn_ack_bits = GENMASK(16, 16),
1596 .clk_id = {CLK_MFG},
1597 .bus_prot_mask = BIT(14) | BIT(21) | BIT(23),
1598 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1599 },
1600 [MT2712_POWER_DOMAIN_MFG_SC1] = {
1601 .name = "mfg_sc1",
1602 .sta_mask = BIT(22),
1603 .ctl_offs = 0x02c0,
1604 .sram_pdn_bits = GENMASK(8, 8),
1605 .sram_pdn_ack_bits = GENMASK(16, 16),
1606 .clk_id = {CLK_NONE},
1607 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1608 },
1609 [MT2712_POWER_DOMAIN_MFG_SC2] = {
1610 .name = "mfg_sc2",
1611 .sta_mask = BIT(23),
1612 .ctl_offs = 0x02c4,
1613 .sram_pdn_bits = GENMASK(8, 8),
1614 .sram_pdn_ack_bits = GENMASK(16, 16),
1615 .clk_id = {CLK_NONE},
1616 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1617 },
1618 [MT2712_POWER_DOMAIN_MFG_SC3] = {
1619 .name = "mfg_sc3",
1620 .sta_mask = BIT(30),
1621 .ctl_offs = 0x01f8,
1622 .sram_pdn_bits = GENMASK(8, 8),
1623 .sram_pdn_ack_bits = GENMASK(16, 16),
1624 .clk_id = {CLK_NONE},
1625 .caps = MTK_SCPD_ACTIVE_WAKEUP,
1626 },
1627};
1628
1629static const struct scp_subdomain scp_subdomain_mt2712[] = {
1630 {MT2712_POWER_DOMAIN_MM, MT2712_POWER_DOMAIN_VDEC},
1631 {MT2712_POWER_DOMAIN_MM, MT2712_POWER_DOMAIN_VENC},
1632 {MT2712_POWER_DOMAIN_MM, MT2712_POWER_DOMAIN_ISP},
1633 {MT2712_POWER_DOMAIN_MFG, MT2712_POWER_DOMAIN_MFG_SC1},
1634 {MT2712_POWER_DOMAIN_MFG_SC1, MT2712_POWER_DOMAIN_MFG_SC2},
1635 {MT2712_POWER_DOMAIN_MFG_SC2, MT2712_POWER_DOMAIN_MFG_SC3},
1636};
1637
1638/*
1639 * MT6797 power domain support
1640 */
1641
1642static const struct scp_domain_data scp_domain_data_mt6797[] = {
1643 [MT6797_POWER_DOMAIN_VDEC] = {
1644 .name = "vdec",
1645 .sta_mask = BIT(7),
1646 .ctl_offs = 0x300,
1647 .sram_pdn_bits = GENMASK(8, 8),
1648 .sram_pdn_ack_bits = GENMASK(12, 12),
1649 .clk_id = {CLK_VDEC},
1650 },
1651 [MT6797_POWER_DOMAIN_VENC] = {
1652 .name = "venc",
1653 .sta_mask = BIT(21),
1654 .ctl_offs = 0x304,
1655 .sram_pdn_bits = GENMASK(11, 8),
1656 .sram_pdn_ack_bits = GENMASK(15, 12),
1657 .clk_id = {CLK_NONE},
1658 },
1659 [MT6797_POWER_DOMAIN_ISP] = {
1660 .name = "isp",
1661 .sta_mask = BIT(5),
1662 .ctl_offs = 0x308,
1663 .sram_pdn_bits = GENMASK(9, 8),
1664 .sram_pdn_ack_bits = GENMASK(13, 12),
1665 .clk_id = {CLK_NONE},
1666 },
1667 [MT6797_POWER_DOMAIN_MM] = {
1668 .name = "mm",
1669 .sta_mask = BIT(3),
1670 .ctl_offs = 0x30C,
1671 .sram_pdn_bits = GENMASK(8, 8),
1672 .sram_pdn_ack_bits = GENMASK(12, 12),
1673 .clk_id = {CLK_MM},
1674 .bus_prot_mask = (BIT(1) | BIT(2)),
1675 },
1676 [MT6797_POWER_DOMAIN_AUDIO] = {
1677 .name = "audio",
1678 .sta_mask = BIT(24),
1679 .ctl_offs = 0x314,
1680 .sram_pdn_bits = GENMASK(11, 8),
1681 .sram_pdn_ack_bits = GENMASK(15, 12),
1682 .clk_id = {CLK_NONE},
1683 },
1684 [MT6797_POWER_DOMAIN_MFG_ASYNC] = {
1685 .name = "mfg_async",
1686 .sta_mask = BIT(13),
1687 .ctl_offs = 0x334,
1688 .sram_pdn_bits = 0,
1689 .sram_pdn_ack_bits = 0,
1690 .clk_id = {CLK_MFG},
1691 },
1692 [MT6797_POWER_DOMAIN_MJC] = {
1693 .name = "mjc",
1694 .sta_mask = BIT(20),
1695 .ctl_offs = 0x310,
1696 .sram_pdn_bits = GENMASK(8, 8),
1697 .sram_pdn_ack_bits = GENMASK(12, 12),
1698 .clk_id = {CLK_NONE},
1699 },
1700};
1701
1702#define SPM_PWR_STATUS_MT6797 0x0180
1703#define SPM_PWR_STATUS_2ND_MT6797 0x0184
1704
1705static const struct scp_subdomain scp_subdomain_mt6797[] = {
1706 {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_VDEC},
1707 {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_ISP},
1708 {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_VENC},
1709 {MT6797_POWER_DOMAIN_MM, MT6797_POWER_DOMAIN_MJC},
1710};
1711
1712
1713/*
1714 * MT6779 power domain support
1715 */
1716static const struct scp_domain_data scp_domain_data_mt6779[] = {
1717 [MT6779_POWER_DOMAIN_AUDIO] = {
1718 .name = "audio",
1719 .sta_mask = BIT(24),
1720 .ctl_offs = 0x31C,
1721 .sram_pdn_bits = GENMASK(8, 8),
1722 .sram_pdn_ack_bits = GENMASK(12, 12),
1723 .basic_clk_name = {"audio"},
1724 .caps = MTK_SCPD_STRICT_BUSP,
1725 .bp_table = {
1726 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR,
1727 0, MT6779_IFR_STA1, BIT(31), BIT(31), 0),
1728 },
1729 },
1730
1731 [MT6779_POWER_DOMAIN_MM] = {
1732 .name = "mm",
1733 .sta_mask = BIT(3),
1734 .ctl_offs = 0x30C,
1735 .sram_pdn_bits = GENMASK(8, 8),
1736 .sram_pdn_ack_bits = GENMASK(12, 12),
1737 .basic_clk_name = {"mm"},
1738 .subsys_clk_prefix = "mm",
1739 .caps = MTK_SCPD_STRICT_BUSP,
1740 .bp_table = {
1741
1742 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1743 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1744 BIT(0) | BIT(1) | BIT(3) | BIT(4) |
1745 BIT(5) | BIT(6),
1746 BIT(0) | BIT(1) | BIT(3) | BIT(4) |
1747 BIT(5) | BIT(6), 0),
1748 BUS_PROT(SMI_TYPE, MT6779_SMI_SET, MT6779_SMI_CLR,
1749 0, MT6779_SMI_STA,
1750 GENMASK(7, 0), GENMASK(7, 0), 0),
1751 BUS_PROT(IFR_TYPE, MT6779_IFR1_SET,
1752 MT6779_IFR1_CLR, 0, MT6779_IFR1_STA1,
1753 BIT(16) | BIT(17), BIT(16) | BIT(17), 0),
1754
1755 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR,
1756 0, MT6779_IFR_STA1,
1757 BIT(10) | BIT(11), BIT(10) | BIT(11), 0),
1758 /* WAY EN1 */
1759 BUS_PROT(IFR_WAYEN_TYPE, MT6779_IFR_SI0_SET,
1760 MT6779_IFR_SI0_CLR, 0, MT6779_IFR_SI0_STA,
1761 BIT(6), BIT(24), BIT(24)),
1762 /* WAY EN2 */
1763 BUS_PROT(IFR_WAYEN_TYPE, 0x0, 0x0,
1764 MT6779_IFR_PDN_SI2_CTL, MT6779_IFR_SI2_STA,
1765 BIT(5), BIT(14), BIT(14)),
1766
1767 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR,
1768 0, MT6779_IFR_STA1, BIT(6), BIT(6), 0),
1769 },
1770 },
1771
1772 [MT6779_POWER_DOMAIN_VDE] = {
1773 .name = "vde",
1774 .sta_mask = BIT(31),
1775 .ctl_offs = 0x300,
1776 .sram_pdn_bits = GENMASK(8, 8),
1777 .sram_pdn_ack_bits = GENMASK(12, 12),
1778 .basic_clk_name = {"vdec"},
1779 .subsys_clk_prefix = "vdec",
1780 .caps = MTK_SCPD_STRICT_BUSP,
1781 .bp_table = {
1782 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1783 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1784 BIT(1), BIT(1), 0),
1785 BUS_PROT(SMI_TYPE, MT6779_SMI_SET,
1786 MT6779_SMI_CLR, 0, MT6779_SMI_STA,
1787 BIT(2), BIT(2), 0),
1788 },
1789 },
1790
1791 [MT6779_POWER_DOMAIN_CAM] = {
1792 .name = "cam",
1793 .sta_mask = BIT(25),
1794 .ctl_offs = 0x324,
1795 .sram_pdn_bits = GENMASK(9, 8),
1796 .sram_pdn_ack_bits = GENMASK(13, 12),
1797 .basic_clk_name = {"cam", "ccu"}, /* cam needs 2 clkmuxes */
1798 .subsys_clk_prefix = "cam",
1799 .caps = MTK_SCPD_STRICT_BUSP,
1800 .bp_table = {
1801 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1802 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1803 BIT(4) | BIT(5) | BIT(9) | BIT(13),
1804 BIT(4) | BIT(5) | BIT(9) | BIT(13), 0),
1805 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR,
1806 0, MT6779_IFR_STA1, BIT(28), BIT(28), 0),
1807 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1808 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1809 BIT(11), BIT(11), 0),
1810 BUS_PROT(SMI_TYPE, MT6779_SMI_SET, MT6779_SMI_CLR,
1811 0, MT6779_SMI_STA,
1812 BIT(6) | BIT(7), BIT(6) | BIT(7), 0),
1813 },
1814 },
1815
1816 [MT6779_POWER_DOMAIN_ISP] = {
1817 .name = "isp",
1818 .sta_mask = BIT(5),
1819 .ctl_offs = 0x308,
1820 .sram_pdn_bits = GENMASK(8, 8),
1821 .sram_pdn_ack_bits = GENMASK(12, 12),
1822 .basic_clk_name = {"isp"},
1823 .subsys_clk_prefix = "isp",
1824 .caps = MTK_SCPD_STRICT_BUSP,
1825 .bp_table = {
1826 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1827 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1828 BIT(3) | BIT(8), BIT(3) | BIT(8), 0),
1829 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1830 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1831 BIT(10), BIT(10), 0),
1832 BUS_PROT(SMI_TYPE, MT6779_SMI_SET, MT6779_SMI_CLR,
1833 0, MT6779_SMI_STA, BIT(4), BIT(4), 0),
1834 },
1835 },
1836
1837 [MT6779_POWER_DOMAIN_IPE] = {
1838 .name = "ipe",
1839 .sta_mask = BIT(13),
1840 .ctl_offs = 0x350,
1841 .sram_pdn_bits = GENMASK(8, 8),
1842 .sram_pdn_ack_bits = GENMASK(12, 12),
1843 .basic_clk_name = {"ipe"},
1844 .subsys_clk_prefix = "ipe",
1845 .caps = MTK_SCPD_STRICT_BUSP,
1846 .bp_table = {
1847 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1848 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1849 BIT(6), BIT(6), 0),
1850 BUS_PROT(SMI_TYPE, MT6779_SMI_SET, MT6779_SMI_CLR,
1851 0, MT6779_SMI_STA, BIT(5), BIT(5), 0),
1852 },
1853 },
1854
1855 [MT6779_POWER_DOMAIN_VEN] = {
1856 .name = "ven",
1857 .sta_mask = BIT(21),
1858 .ctl_offs = 0x304,
1859 .sram_pdn_bits = GENMASK(11, 8),
1860 .sram_pdn_ack_bits = GENMASK(15, 12),
1861 .basic_clk_name = {"venc"},
1862 .subsys_clk_prefix = "venc",
1863 .caps = MTK_SCPD_STRICT_BUSP,
1864 .bp_table = {
1865 BUS_PROT(IFR_TYPE, MT6779_IFRMM_SET,
1866 MT6779_IFRMM_CLR, 0, MT6779_IFRMM_STA1,
1867 BIT(0), BIT(0), 0),
1868 BUS_PROT(SMI_TYPE, MT6779_SMI_SET,
1869 MT6779_SMI_CLR, 0, MT6779_SMI_STA,
1870 BIT(3), BIT(3), 0),
1871 },
1872 },
1873
1874 [MT6779_POWER_DOMAIN_MFG0] = {
1875 .name = "mfg0",
1876 .sta_mask = BIT(4),
1877 .ctl_offs = 0x328,
1878 .caps = MTK_SCPD_STRICT_BUSP,
1879 },
1880
1881 [MT6779_POWER_DOMAIN_MFG1] = {
1882 .name = "mfg1",
1883 .sta_mask = BIT(7),
1884 .ctl_offs = 0x32C,
1885 .sram_pdn_bits = GENMASK(9, 8),
1886 .sram_pdn_ack_bits = GENMASK(13, 12),
1887 .caps = MTK_SCPD_STRICT_BUSP,
1888 .bp_table = {
1889 BUS_PROT(IFR_TYPE, MT6779_IFR1_SET,
1890 MT6779_IFR1_CLR, 0, MT6779_IFR1_STA1,
1891 BIT(19) | BIT(20) | BIT(21),
1892 BIT(19) | BIT(20) | BIT(21), 0),
1893 BUS_PROT(IFR_TYPE, MT6779_IFR_SET,
1894 MT6779_IFR_CLR, 0, MT6779_IFR_STA1,
1895 BIT(21) | BIT(22), BIT(21) | BIT(22), 0),
1896 },
1897 },
1898
1899 [MT6779_POWER_DOMAIN_MFG2] = {
1900 .name = "mfg2",
1901 .sta_mask = BIT(20),
1902 .ctl_offs = 0x330,
1903 .sram_pdn_bits = GENMASK(8, 8),
1904 .sram_pdn_ack_bits = GENMASK(12, 12),
1905 .caps = MTK_SCPD_STRICT_BUSP,
1906 },
1907
1908 [MT6779_POWER_DOMAIN_MFG3] = {
1909 .name = "mfg3",
1910 .sta_mask = BIT(22),
1911 .ctl_offs = 0x334,
1912 .sram_pdn_bits = GENMASK(8, 8),
1913 .sram_pdn_ack_bits = GENMASK(12, 12),
1914 .caps = MTK_SCPD_STRICT_BUSP,
1915 },
1916
1917 [MT6779_POWER_DOMAIN_CONN] = {
1918 .name = "conn",
1919 .sta_mask = BIT(1),
1920 .ctl_offs = 0x320,
1921 .caps = MTK_SCPD_STRICT_BUSP,
1922 .bp_table = {
1923 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR,
1924 0, MT6779_IFR_STA1, BIT(13) | BIT(18),
1925 BIT(13) | BIT(18), 0),
1926 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR,
1927 0, MT6779_IFR_STA1, BIT(14), BIT(14), 0),
1928 BUS_PROT(IFR_TYPE, MT6779_IFR1_SET,
1929 MT6779_IFR1_CLR, 0, MT6779_IFR1_STA1,
1930 BIT(10), BIT(10), 0),
1931 },
1932 },
1933
1934 [MT6779_POWER_DOMAIN_MD] = {
1935 .name = "md",
1936 .sta_mask = BIT(0),
1937 .ctl_offs = 0x318,
1938 .caps = MTK_SCPD_STRICT_BUSP | MTK_SCPD_MD_OPS,
1939 .extb_iso_offs = 0x3B0,
1940 .extb_iso_bits = BIT(0) | BIT(1),
1941 .bp_table = {
1942 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR, 0,
1943 MT6779_IFR_STA1, BIT(7), BIT(7), 0),
1944 BUS_PROT(IFR_TYPE, MT6779_IFR_SET, MT6779_IFR_CLR, 0,
1945 MT6779_IFR_STA1, BIT(3) | BIT(4),
1946 BIT(3) | BIT(4), 0),
1947 BUS_PROT(IFR_TYPE, MT6779_IFR1_SET, MT6779_IFR1_CLR, 0,
1948 MT6779_IFR1_STA1, BIT(6), BIT(6), 0),
1949 },
1950 },
1951
1952 [MT6779_POWER_DOMAIN_INFRA] = { /* pseudo infra power domain */
1953 .name = "infra",
1954 .sta_mask = BIT(6),
1955 .ctl_offs = 0x3C4,
1956 .caps = MTK_SCPD_STRICT_BUSP | MTK_SCPD_ALWAYS_ON,
1957 },
1958};
1959
1960#define SPM_PWR_STATUS_MT6779 0x0160
1961#define SPM_PWR_STATUS_2ND_MT6779 0x0164
1962
1963static const struct scp_subdomain scp_subdomain_mt6779[] = {
1964 {MT6779_POWER_DOMAIN_MM, MT6779_POWER_DOMAIN_VDE},
1965 {MT6779_POWER_DOMAIN_MM, MT6779_POWER_DOMAIN_CAM},
1966 {MT6779_POWER_DOMAIN_MM, MT6779_POWER_DOMAIN_ISP},
1967 {MT6779_POWER_DOMAIN_MM, MT6779_POWER_DOMAIN_IPE},
1968 {MT6779_POWER_DOMAIN_MM, MT6779_POWER_DOMAIN_VEN},
1969
1970 {MT6779_POWER_DOMAIN_MFG0, MT6779_POWER_DOMAIN_MFG1},
1971 {MT6779_POWER_DOMAIN_MFG1, MT6779_POWER_DOMAIN_MFG2},
1972 {MT6779_POWER_DOMAIN_MFG2, MT6779_POWER_DOMAIN_MFG3},
1973};
1974
1975
1976/*
1977 * MT6880 power domain support
1978 */
1979
1980static const struct scp_domain_data scp_domain_data_mt6880[] = {
1981 [MT6880_POWER_DOMAIN_PEXTP_D_2LX1] = {
1982 .name = "pextp_d_2lx1",
1983 .sta_mask = BIT(12),
1984 .ctl_offs = 0x330,
1985 .sram_pdn_bits = GENMASK(8, 8),
1986 .sram_pdn_ack_bits = GENMASK(12, 12),
1987 },
1988 [MT6880_POWER_DOMAIN_MD1] = {
1989 .name = "md1",
1990 .sta_mask = BIT(0),
1991 .ctl_offs = 0x300,
1992 .caps = MTK_SCPD_MD_OPS,
1993 .extb_iso_offs = 0x398,
1994 .extb_iso_bits = 0x3,
1995 .bp_table = {
1996 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
1997 MT6880_TOP_AXI_PROT_EN_MD1,MT6880_TOP_AXI_PROT_EN_MD1,0),
1998 BUS_PROT(IFR_TYPE, 0x0B84, 0x0B88, 0x0B80, 0x0B90,
1999 MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_MD1,MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_MD1,0),
2000 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2001 MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_MD1,MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_MD1,0),
2002 },
2003 },
2004 [MT6880_POWER_DOMAIN_CONN] = {
2005 .name = "conn",
2006 .sta_mask = BIT(1),
2007 .ctl_offs = 0x304,
2008 .bp_table = {
2009 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2010 MT6880_TOP_AXI_PROT_EN_CONN,MT6880_TOP_AXI_PROT_EN_CONN,0),
2011 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2012 MT6880_TOP_AXI_PROT_EN_CONN_2ND,MT6880_TOP_AXI_PROT_EN_CONN_2ND,0),
2013 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2014 MT6880_TOP_AXI_PROT_EN_CONN_3RD,MT6880_TOP_AXI_PROT_EN_CONN_3RD,0),
2015 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2016 MT6880_TOP_AXI_PROT_EN_CONN_4RD,MT6880_TOP_AXI_PROT_EN_CONN_4RD,0),
2017 },
2018 },
2019 [MT6880_POWER_DOMAIN_MSDC] = {
2020 .name = "msdc",
2021 .sta_mask = BIT(30),
2022 .ctl_offs = 0x3A4,
2023 .sram_pdn_bits = GENMASK(8, 8),
2024 .bp_table = {
2025 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2026 MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_MSDC,MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_MSDC,0),
2027 },
2028 },
2029 [MT6880_POWER_DOMAIN_SSUSB] = {
2030 .name = "ssusb",
2031 .sta_mask = BIT(16),
2032 .ctl_offs = 0x340,
2033 .sram_pdn_bits = GENMASK(8, 8),
2034 .sram_pdn_ack_bits = GENMASK(12, 12),
2035 .bp_table = {
2036 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2037 MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_SSUSB,MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_1_SSUSB,0),
2038 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2039 MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_3_SSUSB,MT6880_TOP_AXI_PROT_EN_INFRA_VDNR_3_SSUSB,0),
2040 },
2041 },
2042 [MT6880_POWER_DOMAIN_SSUSB_PHY] = {
2043 .name = "ssusb_phy",
2044 .sta_mask = BIT(7),
2045 .ctl_offs = 0x31C,
2046 },
2047 [MT6880_POWER_DOMAIN_PEXTP_D_2LX1_PHY] = {
2048 .name = "pextp_d_2lx1_phy",
2049 .sta_mask = BIT(3),
2050 .ctl_offs = 0x30C,
2051 },
2052};
2053
2054static const struct scp_subdomain scp_subdomain_mt6880[] = {
2055 {MT6880_POWER_DOMAIN_PEXTP_D_2LX1_PHY, MT6880_POWER_DOMAIN_PEXTP_D_2LX1},
2056 {MT6880_POWER_DOMAIN_SSUSB_PHY, MT6880_POWER_DOMAIN_SSUSB},
2057};
2058
2059
2060/*
2061 * MT6890 power domain support
2062 */
2063
2064static const struct scp_domain_data scp_domain_data_mt6890[] = {
2065 [MT6890_POWER_DOMAIN_PEXTP_D_2LX1] = {
2066 .name = "pextp_d_2lx1",
2067 .sta_mask = BIT(12),
2068 .ctl_offs = 0x330,
2069 .sram_pdn_bits = GENMASK(8, 8),
2070 .sram_pdn_ack_bits = GENMASK(12, 12),
2071 },
2072 [MT6890_POWER_DOMAIN_ETH] = {
2073 .name = "eth",
2074 .sta_mask = BIT(15),
2075 .ctl_offs = 0x33C,
2076 .sram_pdn_bits = GENMASK(8, 8),
2077 .sram_pdn_ack_bits = GENMASK(12, 12),
2078 .clk_id = {CLK_ETH1, CLK_ETH2, CLK_ETH3, CLK_ETH4},
2079 .bp_table = {
2080 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2081 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_ETH,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_ETH,0),
2082 },
2083 },
lh0d3f4db2022-09-17 00:16:39 -07002084 [MT6890_POWER_DOMAIN_NETSYS] = {
2085 .name = "netsys",
2086 .sta_mask = BIT(19),
2087 .ctl_offs = 0x34C,
2088 .caps = MTK_SCPD_NETSYS_OPS,
2089 .sram_pdn_bits = GENMASK(4, 4),
2090 .sram_pdn_ack_bits = GENMASK(12, 12),
2091 .sram_pdn_bits1 = GENMASK(1, 1),
2092 .sram_pdn_bits2 = GENMASK(17, 17),
2093 .sram_pdn_ack_bits2 = GENMASK(25, 25),
2094 .clk_id = {CLK_NETSYS1, CLK_NETSYS2, CLK_NETSYS3, CLK_NETSYS4,
2095 CLK_NETSYS5, CLK_NETSYS6, CLK_NETSYS7, CLK_NETSYS8},
2096 /*.bp_table = {
2097 BUS_PROT(IFR_TYPE, 0x0714, 0x0718, 0x0710, 0x0724,
2098 MT6890_TOP_AXI_PROT_EN_2_NETSYS,MT6890_TOP_AXI_PROT_EN_2_NETSYS,0),
2099 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2100 MT6890_TOP_AXI_PROT_EN_NETSYS,MT6890_TOP_AXI_PROT_EN_NETSYS,0),
2101 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2102 MT6890_TOP_AXI_PROT_EN_NETSYS_2ND,MT6890_TOP_AXI_PROT_EN_NETSYS_2ND,0),
2103 BUS_PROT(IFR_TYPE, 0x0714, 0x0718, 0x0710, 0x0724,
2104 MT6890_TOP_AXI_PROT_EN_2_NETSYS_2ND,MT6890_TOP_AXI_PROT_EN_2_NETSYS_2ND,0),
2105 },*/
2106 },
xjb04a4022021-11-25 15:01:52 +08002107 [MT6890_POWER_DOMAIN_AUDIO] = {
2108 .name = "audio",
2109 .sta_mask = BIT(21),
2110 .ctl_offs = 0x354,
2111 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2112 .sram_pdn_bits = GENMASK(8, 8),
2113 .sram_pdn_ack_bits = GENMASK(12, 12),
2114 .clk_id = {CLK_AUDIO},
2115 },
2116 [MT6890_POWER_DOMAIN_MD1] = {
2117 .name = "md1",
2118 .sta_mask = BIT(0),
2119 .ctl_offs = 0x300,
2120 .caps = MTK_SCPD_MD_OPS | MTK_SCPD_ACTIVE_WAKEUP,
2121 .extb_iso_offs = 0x398,
2122 .extb_iso_bits = 0x3,
2123 .bp_table = {
2124 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2125 MT6890_TOP_AXI_PROT_EN_MD1,MT6890_TOP_AXI_PROT_EN_MD1,0),
2126 BUS_PROT(IFR_TYPE, 0x0B84, 0x0B88, 0x0B80, 0x0B90,
2127 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_MD1,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_MD1,0),
2128 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2129 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_MD1,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_MD1,0),
2130 },
2131 },
2132 [MT6890_POWER_DOMAIN_EIP97] = {
2133 .name = "eip97",
2134 .sta_mask = BIT(22),
2135 .ctl_offs = 0x328,
2136 .sram_pdn_bits = GENMASK(8, 8),
2137 .clk_id = {CLK_EIP97},
2138 .bp_table = {
2139 BUS_PROT(IFR_TYPE, 0x0B84, 0x0B88, 0x0B80, 0x0B90,
2140 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_EIP97,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_EIP97,0),
2141 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2142 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_EIP97,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_EIP97,0),
2143 },
2144 },
2145 [MT6890_POWER_DOMAIN_CONN] = {
2146 .name = "conn",
2147 .sta_mask = BIT(1),
2148 .ctl_offs = 0x304,
2149 .bp_table = {
2150 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2151 MT6890_TOP_AXI_PROT_EN_CONN,MT6890_TOP_AXI_PROT_EN_CONN,0),
2152 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2153 MT6890_TOP_AXI_PROT_EN_CONN_2ND,MT6890_TOP_AXI_PROT_EN_CONN_2ND,0),
2154 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2155 MT6890_TOP_AXI_PROT_EN_CONN_3RD,MT6890_TOP_AXI_PROT_EN_CONN_3RD,0),
2156 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2157 MT6890_TOP_AXI_PROT_EN_CONN_4RD,MT6890_TOP_AXI_PROT_EN_CONN_4RD,0),
2158 },
2159 },
2160 [MT6890_POWER_DOMAIN_MSDC] = {
2161 .name = "msdc",
2162 .sta_mask = BIT(30),
2163 .ctl_offs = 0x3A4,
2164 .sram_pdn_bits = GENMASK(8, 8),
2165 .bp_table = {
2166 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2167 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_MSDC,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_MSDC,0),
2168 },
2169 },
2170 [MT6890_POWER_DOMAIN_HSMTOP] = {
2171 .name = "hsmtop",
2172 .sta_mask = BIT(23),
2173 .ctl_offs = 0x344,
2174 .sram_pdn_bits = GENMASK(8, 8),
2175 .sram_pdn_ack_bits = GENMASK(12, 12),
rjw2e8229f2022-02-15 21:08:12 +08002176 .caps = MTK_SCPD_HSM_OPS,
2177 .clk_id = {CLK_HSM},
2178 .bp_table = {
2179 BUS_PROT(IFR_TYPE, 0x0714, 0x0718, 0x0710, 0x0724,
2180 MT6890_TOP_AXI_PROT_EN_2_HSM,
2181 MT6890_TOP_AXI_PROT_EN_2_HSM, 0),
2182 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2183 MT6890_TOP_AXI_PROT_EN_HSM,
2184 MT6890_TOP_AXI_PROT_EN_HSM, 0),
2185 BUS_PROT(IFR_TYPE, 0x02A0, 0x02A4, 0x0220, 0x0228,
2186 MT6890_TOP_AXI_PROT_EN_HSM_2ND,
2187 MT6890_TOP_AXI_PROT_EN_HSM_2ND, 0),
2188 BUS_PROT(IFR_TYPE, 0x0714, 0x0718, 0x0710, 0x0724,
2189 MT6890_TOP_AXI_PROT_EN_2_HSM_2ND,
2190 MT6890_TOP_AXI_PROT_EN_2_HSM_2ND, 0),
2191 },
xjb04a4022021-11-25 15:01:52 +08002192 },
2193 [MT6890_POWER_DOMAIN_SSUSB] = {
2194 .name = "ssusb",
2195 .sta_mask = BIT(16),
2196 .ctl_offs = 0x340,
2197 .sram_pdn_bits = GENMASK(8, 8),
2198 .sram_pdn_ack_bits = GENMASK(12, 12),
2199 .bp_table = {
2200 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2201 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_SSUSB,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_1_SSUSB,0),
2202 BUS_PROT(IFR_TYPE, 0x0BA4, 0x0BA8, 0x0BA0, 0x0BB0,
2203 MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_3_SSUSB,MT6890_TOP_AXI_PROT_EN_INFRA_VDNR_3_SSUSB,0),
2204 },
2205 },
2206 [MT6890_POWER_DOMAIN_SSUSB_PHY] = {
2207 .name = "ssusb_phy",
2208 .sta_mask = BIT(7),
2209 .ctl_offs = 0x31C,
2210 },
2211 [MT6890_POWER_DOMAIN_SGMII_0_PHY] = {
2212 .name = "sgmii_0_phy",
2213 .sta_mask = BIT(8),
2214 .ctl_offs = 0x358,
2215 },
2216 [MT6890_POWER_DOMAIN_SGMII_0_TOP] = {
2217 .name = "sgmii_0_top",
2218 .sta_mask = BIT(17),
2219 .ctl_offs = 0x360,
2220 },
2221 [MT6890_POWER_DOMAIN_SGMII_1_PHY] = {
2222 .name = "sgmii_1_phy",
2223 .sta_mask = BIT(10),
2224 .ctl_offs = 0x35C,
2225 },
2226 [MT6890_POWER_DOMAIN_SGMII_1_TOP] = {
2227 .name = "sgmii_1_top",
2228 .sta_mask = BIT(18),
2229 .ctl_offs = 0x364,
2230 },
2231 [MT6890_POWER_DOMAIN_PEXTP_D_2LX1_PHY] = {
2232 .name = "pextp_d_2lx1_phy",
2233 .sta_mask = BIT(3),
2234 .ctl_offs = 0x30C,
2235 },
2236};
2237
2238static const struct scp_subdomain scp_subdomain_mt6890[] = {
2239 {MT6890_POWER_DOMAIN_PEXTP_D_2LX1_PHY, MT6890_POWER_DOMAIN_PEXTP_D_2LX1},
2240 {MT6890_POWER_DOMAIN_SSUSB_PHY, MT6890_POWER_DOMAIN_SSUSB},
2241 {MT6890_POWER_DOMAIN_SGMII_0_PHY, MT6890_POWER_DOMAIN_SGMII_0_TOP},
2242 {MT6890_POWER_DOMAIN_SGMII_1_PHY, MT6890_POWER_DOMAIN_SGMII_1_TOP},
2243};
2244
2245/*
2246 * MT7622 power domain support
2247 */
2248
2249static const struct scp_domain_data scp_domain_data_mt7622[] = {
2250 [MT7622_POWER_DOMAIN_ETHSYS] = {
2251 .name = "ethsys",
2252 .sta_mask = PWR_STATUS_ETHSYS,
2253 .ctl_offs = SPM_ETHSYS_PWR_CON,
2254 .sram_pdn_bits = GENMASK(11, 8),
2255 .sram_pdn_ack_bits = GENMASK(15, 12),
2256 .clk_id = {CLK_NONE},
2257 .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_ETHSYS,
2258 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2259 },
2260 [MT7622_POWER_DOMAIN_HIF0] = {
2261 .name = "hif0",
2262 .sta_mask = PWR_STATUS_HIF0,
2263 .ctl_offs = SPM_HIF0_PWR_CON,
2264 .sram_pdn_bits = GENMASK(11, 8),
2265 .sram_pdn_ack_bits = GENMASK(15, 12),
2266 .clk_id = {CLK_HIFSEL},
2267 .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_HIF0,
2268 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2269 },
2270 [MT7622_POWER_DOMAIN_HIF1] = {
2271 .name = "hif1",
2272 .sta_mask = PWR_STATUS_HIF1,
2273 .ctl_offs = SPM_HIF1_PWR_CON,
2274 .sram_pdn_bits = GENMASK(11, 8),
2275 .sram_pdn_ack_bits = GENMASK(15, 12),
2276 .clk_id = {CLK_HIFSEL},
2277 .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_HIF1,
2278 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2279 },
2280 [MT7622_POWER_DOMAIN_WB] = {
2281 .name = "wb",
2282 .sta_mask = PWR_STATUS_WB,
2283 .ctl_offs = SPM_WB_PWR_CON,
2284 .sram_pdn_bits = 0,
2285 .sram_pdn_ack_bits = 0,
2286 .clk_id = {CLK_NONE},
2287 .bus_prot_mask = MT7622_TOP_AXI_PROT_EN_WB,
2288 .caps = MTK_SCPD_ACTIVE_WAKEUP | MTK_SCPD_FWAIT_SRAM,
2289 },
2290};
2291
2292/*
2293 * MT7623A power domain support
2294 */
2295
2296static const struct scp_domain_data scp_domain_data_mt7623a[] = {
2297 [MT7623A_POWER_DOMAIN_CONN] = {
2298 .name = "conn",
2299 .sta_mask = PWR_STATUS_CONN,
2300 .ctl_offs = SPM_CONN_PWR_CON,
2301 .bus_prot_mask = MT2701_TOP_AXI_PROT_EN_CONN_M |
2302 MT2701_TOP_AXI_PROT_EN_CONN_S,
2303 .clk_id = {CLK_NONE},
2304 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2305 },
2306 [MT7623A_POWER_DOMAIN_ETH] = {
2307 .name = "eth",
2308 .sta_mask = PWR_STATUS_ETH,
2309 .ctl_offs = SPM_ETH_PWR_CON,
2310 .sram_pdn_bits = GENMASK(11, 8),
2311 .sram_pdn_ack_bits = GENMASK(15, 12),
2312 .clk_id = {CLK_ETHIF},
2313 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2314 },
2315 [MT7623A_POWER_DOMAIN_HIF] = {
2316 .name = "hif",
2317 .sta_mask = PWR_STATUS_HIF,
2318 .ctl_offs = SPM_HIF_PWR_CON,
2319 .sram_pdn_bits = GENMASK(11, 8),
2320 .sram_pdn_ack_bits = GENMASK(15, 12),
2321 .clk_id = {CLK_ETHIF},
2322 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2323 },
2324 [MT7623A_POWER_DOMAIN_IFR_MSC] = {
2325 .name = "ifr_msc",
2326 .sta_mask = PWR_STATUS_IFR_MSC,
2327 .ctl_offs = SPM_IFR_MSC_PWR_CON,
2328 .clk_id = {CLK_NONE},
2329 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2330 },
2331};
2332
2333/*
2334 * MT8173 power domain support
2335 */
2336
2337static const struct scp_domain_data scp_domain_data_mt8173[] = {
2338 [MT8173_POWER_DOMAIN_VDEC] = {
2339 .name = "vdec",
2340 .sta_mask = PWR_STATUS_VDEC,
2341 .ctl_offs = SPM_VDE_PWR_CON,
2342 .sram_pdn_bits = GENMASK(11, 8),
2343 .sram_pdn_ack_bits = GENMASK(12, 12),
2344 .clk_id = {CLK_MM},
2345 },
2346 [MT8173_POWER_DOMAIN_VENC] = {
2347 .name = "venc",
2348 .sta_mask = PWR_STATUS_VENC,
2349 .ctl_offs = SPM_VEN_PWR_CON,
2350 .sram_pdn_bits = GENMASK(11, 8),
2351 .sram_pdn_ack_bits = GENMASK(15, 12),
2352 .clk_id = {CLK_MM, CLK_VENC},
2353 },
2354 [MT8173_POWER_DOMAIN_ISP] = {
2355 .name = "isp",
2356 .sta_mask = PWR_STATUS_ISP,
2357 .ctl_offs = SPM_ISP_PWR_CON,
2358 .sram_pdn_bits = GENMASK(11, 8),
2359 .sram_pdn_ack_bits = GENMASK(13, 12),
2360 .clk_id = {CLK_MM},
2361 },
2362 [MT8173_POWER_DOMAIN_MM] = {
2363 .name = "mm",
2364 .sta_mask = PWR_STATUS_DISP,
2365 .ctl_offs = SPM_DIS_PWR_CON,
2366 .sram_pdn_bits = GENMASK(11, 8),
2367 .sram_pdn_ack_bits = GENMASK(12, 12),
2368 .clk_id = {CLK_MM},
2369 .bus_prot_mask = MT8173_TOP_AXI_PROT_EN_MM_M0 |
2370 MT8173_TOP_AXI_PROT_EN_MM_M1,
2371 },
2372 [MT8173_POWER_DOMAIN_VENC_LT] = {
2373 .name = "venc_lt",
2374 .sta_mask = PWR_STATUS_VENC_LT,
2375 .ctl_offs = SPM_VEN2_PWR_CON,
2376 .sram_pdn_bits = GENMASK(11, 8),
2377 .sram_pdn_ack_bits = GENMASK(15, 12),
2378 .clk_id = {CLK_MM, CLK_VENC_LT},
2379 },
2380 [MT8173_POWER_DOMAIN_AUDIO] = {
2381 .name = "audio",
2382 .sta_mask = PWR_STATUS_AUDIO,
2383 .ctl_offs = SPM_AUDIO_PWR_CON,
2384 .sram_pdn_bits = GENMASK(11, 8),
2385 .sram_pdn_ack_bits = GENMASK(15, 12),
2386 .clk_id = {CLK_NONE},
2387 },
2388 [MT8173_POWER_DOMAIN_USB] = {
2389 .name = "usb",
2390 .sta_mask = PWR_STATUS_USB,
2391 .ctl_offs = SPM_USB_PWR_CON,
2392 .sram_pdn_bits = GENMASK(11, 8),
2393 .sram_pdn_ack_bits = GENMASK(15, 12),
2394 .clk_id = {CLK_NONE},
2395 .caps = MTK_SCPD_ACTIVE_WAKEUP,
2396 },
2397 [MT8173_POWER_DOMAIN_MFG_ASYNC] = {
2398 .name = "mfg_async",
2399 .sta_mask = PWR_STATUS_MFG_ASYNC,
2400 .ctl_offs = SPM_MFG_ASYNC_PWR_CON,
2401 .sram_pdn_bits = GENMASK(11, 8),
2402 .sram_pdn_ack_bits = 0,
2403 .clk_id = {CLK_MFG},
2404 },
2405 [MT8173_POWER_DOMAIN_MFG_2D] = {
2406 .name = "mfg_2d",
2407 .sta_mask = PWR_STATUS_MFG_2D,
2408 .ctl_offs = SPM_MFG_2D_PWR_CON,
2409 .sram_pdn_bits = GENMASK(11, 8),
2410 .sram_pdn_ack_bits = GENMASK(13, 12),
2411 .clk_id = {CLK_NONE},
2412 },
2413 [MT8173_POWER_DOMAIN_MFG] = {
2414 .name = "mfg",
2415 .sta_mask = PWR_STATUS_MFG,
2416 .ctl_offs = SPM_MFG_PWR_CON,
2417 .sram_pdn_bits = GENMASK(13, 8),
2418 .sram_pdn_ack_bits = GENMASK(21, 16),
2419 .clk_id = {CLK_NONE},
2420 .bus_prot_mask = MT8173_TOP_AXI_PROT_EN_MFG_S |
2421 MT8173_TOP_AXI_PROT_EN_MFG_M0 |
2422 MT8173_TOP_AXI_PROT_EN_MFG_M1 |
2423 MT8173_TOP_AXI_PROT_EN_MFG_SNOOP_OUT,
2424 },
2425};
2426
2427static const struct scp_subdomain scp_subdomain_mt8173[] = {
2428 {MT8173_POWER_DOMAIN_MFG_ASYNC, MT8173_POWER_DOMAIN_MFG_2D},
2429 {MT8173_POWER_DOMAIN_MFG_2D, MT8173_POWER_DOMAIN_MFG},
2430};
2431
2432static const struct scp_soc_data mt2701_data = {
2433 .domains = scp_domain_data_mt2701,
2434 .num_domains = ARRAY_SIZE(scp_domain_data_mt2701),
2435 .regs = {
2436 .pwr_sta_offs = SPM_PWR_STATUS,
2437 .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
2438 },
2439 .bus_prot_reg_update = true,
2440};
2441
2442static const struct scp_soc_data mt2712_data = {
2443 .domains = scp_domain_data_mt2712,
2444 .num_domains = ARRAY_SIZE(scp_domain_data_mt2712),
2445 .subdomains = scp_subdomain_mt2712,
2446 .num_subdomains = ARRAY_SIZE(scp_subdomain_mt2712),
2447 .regs = {
2448 .pwr_sta_offs = SPM_PWR_STATUS,
2449 .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
2450 },
2451 .bus_prot_reg_update = false,
2452};
2453
2454static const struct scp_soc_data mt6797_data = {
2455 .domains = scp_domain_data_mt6797,
2456 .num_domains = ARRAY_SIZE(scp_domain_data_mt6797),
2457 .subdomains = scp_subdomain_mt6797,
2458 .num_subdomains = ARRAY_SIZE(scp_subdomain_mt6797),
2459 .regs = {
2460 .pwr_sta_offs = SPM_PWR_STATUS_MT6797,
2461 .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND_MT6797
2462 },
2463 .bus_prot_reg_update = true,
2464};
2465
2466static const struct scp_soc_data mt6779_data = {
2467 .domains = scp_domain_data_mt6779,
2468 .num_domains = ARRAY_SIZE(scp_domain_data_mt6779),
2469 .subdomains = scp_subdomain_mt6779,
2470 .num_subdomains = ARRAY_SIZE(scp_subdomain_mt6779),
2471 .regs = {
2472 .pwr_sta_offs = SPM_PWR_STATUS_MT6779,
2473 .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND_MT6779
2474 },
2475 .bus_prot_reg_update = true,
2476};
2477
2478static const struct scp_soc_data mt6880_data = {
2479 .domains = scp_domain_data_mt6880,
2480 .num_domains = ARRAY_SIZE(scp_domain_data_mt6880),
2481 .subdomains = scp_subdomain_mt6880,
2482 .num_subdomains = ARRAY_SIZE(scp_subdomain_mt6880),
2483 .regs = {
2484 .pwr_sta_offs = 0x16C,
2485 .pwr_sta2nd_offs = 0x170
2486 }
2487};
2488
2489static const struct scp_soc_data mt6890_data = {
2490 .domains = scp_domain_data_mt6890,
2491 .num_domains = ARRAY_SIZE(scp_domain_data_mt6890),
2492 .subdomains = scp_subdomain_mt6890,
2493 .num_subdomains = ARRAY_SIZE(scp_subdomain_mt6890),
2494 .regs = {
2495 .pwr_sta_offs = 0x16C,
2496 .pwr_sta2nd_offs = 0x170
2497 }
2498};
2499
2500static const struct scp_soc_data mt7622_data = {
2501 .domains = scp_domain_data_mt7622,
2502 .num_domains = ARRAY_SIZE(scp_domain_data_mt7622),
2503 .regs = {
2504 .pwr_sta_offs = SPM_PWR_STATUS,
2505 .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
2506 },
2507 .bus_prot_reg_update = true,
2508};
2509
2510static const struct scp_soc_data mt7623a_data = {
2511 .domains = scp_domain_data_mt7623a,
2512 .num_domains = ARRAY_SIZE(scp_domain_data_mt7623a),
2513 .regs = {
2514 .pwr_sta_offs = SPM_PWR_STATUS,
2515 .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
2516 },
2517 .bus_prot_reg_update = true,
2518};
2519
2520static const struct scp_soc_data mt8173_data = {
2521 .domains = scp_domain_data_mt8173,
2522 .num_domains = ARRAY_SIZE(scp_domain_data_mt8173),
2523 .subdomains = scp_subdomain_mt8173,
2524 .num_subdomains = ARRAY_SIZE(scp_subdomain_mt8173),
2525 .regs = {
2526 .pwr_sta_offs = SPM_PWR_STATUS,
2527 .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
2528 },
2529 .bus_prot_reg_update = true,
2530};
2531
2532/*
2533 * scpsys driver init
2534 */
2535
2536static const struct of_device_id of_scpsys_match_tbl[] = {
2537 {
2538 .compatible = "mediatek,mt2701-scpsys",
2539 .data = &mt2701_data,
2540 }, {
2541 .compatible = "mediatek,mt2712-scpsys",
2542 .data = &mt2712_data,
2543 }, {
2544 .compatible = "mediatek,mt6797-scpsys",
2545 .data = &mt6797_data,
2546 }, {
2547 .compatible = "mediatek,mt6779-scpsys",
2548 .data = &mt6779_data,
2549 }, {
2550 .compatible = "mediatek,mt6880-scpsys",
2551 .data = &mt6880_data,
2552 }, {
2553 .compatible = "mediatek,mt6890-scpsys",
2554 .data = &mt6890_data,
2555 }, {
2556 .compatible = "mediatek,mt7622-scpsys",
2557 .data = &mt7622_data,
2558 }, {
2559 .compatible = "mediatek,mt7623a-scpsys",
2560 .data = &mt7623a_data,
2561 }, {
2562 .compatible = "mediatek,mt8173-scpsys",
2563 .data = &mt8173_data,
2564 }, {
2565 /* sentinel */
2566 }
2567};
2568
2569static int scpsys_probe(struct platform_device *pdev)
2570{
2571 const struct scp_subdomain *sd;
2572 const struct scp_soc_data *soc;
2573 struct scp *scp;
2574 struct genpd_onecell_data *pd_data;
2575 int i, ret;
2576
2577 soc = of_device_get_match_data(&pdev->dev);
2578
2579 scp = init_scp(pdev, soc->domains, soc->num_domains, &soc->regs,
2580 soc->bus_prot_reg_update);
2581 if (IS_ERR(scp))
2582 return PTR_ERR(scp);
2583
2584 mtk_register_power_domains(pdev, scp, soc->num_domains);
2585
2586 pd_data = &scp->pd_data;
2587
2588 for (i = 0, sd = soc->subdomains; i < soc->num_subdomains; i++, sd++) {
2589 ret = pm_genpd_add_subdomain(pd_data->domains[sd->origin],
2590 pd_data->domains[sd->subdomain]);
2591 if (ret && IS_ENABLED(CONFIG_PM))
2592 dev_err(&pdev->dev, "Failed to add subdomain: %d\n",
2593 ret);
2594 }
2595
2596 return 0;
2597}
2598
2599static struct platform_driver scpsys_drv = {
2600 .probe = scpsys_probe,
2601 .driver = {
2602 .name = "mtk-scpsys",
2603 .suppress_bind_attrs = true,
2604 .owner = THIS_MODULE,
2605 .of_match_table = of_match_ptr(of_scpsys_match_tbl),
2606 },
2607};
2608static int __init scpsys_init(void)
2609{
2610 return platform_driver_register(&scpsys_drv);
2611}
2612//move from device init to arch init, to become earlier than normal subsys
2613arch_initcall_sync(scpsys_init);