diff options
author | Arnd Bergmann <arnd@arndb.de> | 2017-12-21 12:11:41 -0500 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2017-12-21 12:11:41 -0500 |
commit | 11c9dff045484f5945af9ca786f9d2539320c0d4 (patch) | |
tree | 12d9e60184c805e5d0cd6e067b2355492c9130a3 | |
parent | a3dc838d7aa045c5b601f88ea1eab7b788b58e64 (diff) | |
parent | fdac5f4d4857d488fcd77308fec95b44196fdfb1 (diff) |
Merge tag 'v4.15-next-soc' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux into next/soc
Pull "arm: Updates for soc driver for v4.15-next" from Matthias Brugger:
- change kconfig entry for armv7 SoCs to be more generic
- add support for mt2701 scpsys driver
binding documentation
extend driver to allow the bus protection to overwrite the register
* tag 'v4.15-next-soc' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux:
soc: mediatek: add MT2712 scpsys support
soc: mediatek: add dependent clock jpgdec/audio for scpsys
soc: mediatek: extend bus protection API
dt-bindings: soc: add MT2712 power dt-bindings
ARM: mediatek: use more generic prompts for SoCs with ARMv7
-rw-r--r-- | Documentation/devicetree/bindings/soc/mediatek/scpsys.txt | 3 | ||||
-rw-r--r-- | arch/arm/mach-mediatek/Kconfig | 2 | ||||
-rw-r--r-- | drivers/soc/mediatek/mtk-infracfg.c | 26 | ||||
-rw-r--r-- | drivers/soc/mediatek/mtk-scpsys.c | 140 | ||||
-rw-r--r-- | include/dt-bindings/power/mt2712-power.h | 26 | ||||
-rw-r--r-- | include/linux/soc/mediatek/infracfg.h | 7 |
6 files changed, 181 insertions, 23 deletions
diff --git a/Documentation/devicetree/bindings/soc/mediatek/scpsys.txt b/Documentation/devicetree/bindings/soc/mediatek/scpsys.txt index 40056f7990f8..76bf45b893fa 100644 --- a/Documentation/devicetree/bindings/soc/mediatek/scpsys.txt +++ b/Documentation/devicetree/bindings/soc/mediatek/scpsys.txt | |||
@@ -12,11 +12,13 @@ power/power_domain.txt. It provides the power domains defined in | |||
12 | - include/dt-bindings/power/mt8173-power.h | 12 | - include/dt-bindings/power/mt8173-power.h |
13 | - include/dt-bindings/power/mt6797-power.h | 13 | - include/dt-bindings/power/mt6797-power.h |
14 | - include/dt-bindings/power/mt2701-power.h | 14 | - include/dt-bindings/power/mt2701-power.h |
15 | - include/dt-bindings/power/mt2712-power.h | ||
15 | - include/dt-bindings/power/mt7622-power.h | 16 | - include/dt-bindings/power/mt7622-power.h |
16 | 17 | ||
17 | Required properties: | 18 | Required properties: |
18 | - compatible: Should be one of: | 19 | - compatible: Should be one of: |
19 | - "mediatek,mt2701-scpsys" | 20 | - "mediatek,mt2701-scpsys" |
21 | - "mediatek,mt2712-scpsys" | ||
20 | - "mediatek,mt6797-scpsys" | 22 | - "mediatek,mt6797-scpsys" |
21 | - "mediatek,mt7622-scpsys" | 23 | - "mediatek,mt7622-scpsys" |
22 | - "mediatek,mt8173-scpsys" | 24 | - "mediatek,mt8173-scpsys" |
@@ -27,6 +29,7 @@ Required properties: | |||
27 | These are clocks which hardware needs to be | 29 | These are clocks which hardware needs to be |
28 | enabled before enabling certain power domains. | 30 | enabled before enabling certain power domains. |
29 | Required clocks for MT2701: "mm", "mfg", "ethif" | 31 | Required clocks for MT2701: "mm", "mfg", "ethif" |
32 | Required clocks for MT2712: "mm", "mfg", "venc", "jpgdec", "audio", "vdec" | ||
30 | Required clocks for MT6797: "mm", "mfg", "vdec" | 33 | Required clocks for MT6797: "mm", "mfg", "vdec" |
31 | Required clocks for MT7622: "hif_sel" | 34 | Required clocks for MT7622: "hif_sel" |
32 | Required clocks for MT8173: "mm", "mfg", "venc", "venc_lt" | 35 | Required clocks for MT8173: "mm", "mfg", "venc", "venc_lt" |
diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig index 70e49d54434e..91cc461f7b04 100644 --- a/arch/arm/mach-mediatek/Kconfig +++ b/arch/arm/mach-mediatek/Kconfig | |||
@@ -1,5 +1,5 @@ | |||
1 | menuconfig ARCH_MEDIATEK | 1 | menuconfig ARCH_MEDIATEK |
2 | bool "Mediatek MT65xx & MT81xx SoC" | 2 | bool "MediaTek SoC Support" |
3 | depends on ARCH_MULTI_V7 | 3 | depends on ARCH_MULTI_V7 |
4 | select ARM_GIC | 4 | select ARM_GIC |
5 | select PINCTRL | 5 | select PINCTRL |
diff --git a/drivers/soc/mediatek/mtk-infracfg.c b/drivers/soc/mediatek/mtk-infracfg.c index dba3055a9493..8c310de01e93 100644 --- a/drivers/soc/mediatek/mtk-infracfg.c +++ b/drivers/soc/mediatek/mtk-infracfg.c | |||
@@ -19,23 +19,33 @@ | |||
19 | 19 | ||
20 | #define INFRA_TOPAXI_PROTECTEN 0x0220 | 20 | #define INFRA_TOPAXI_PROTECTEN 0x0220 |
21 | #define INFRA_TOPAXI_PROTECTSTA1 0x0228 | 21 | #define INFRA_TOPAXI_PROTECTSTA1 0x0228 |
22 | #define INFRA_TOPAXI_PROTECTEN_SET 0x0260 | ||
23 | #define INFRA_TOPAXI_PROTECTEN_CLR 0x0264 | ||
22 | 24 | ||
23 | /** | 25 | /** |
24 | * mtk_infracfg_set_bus_protection - enable bus protection | 26 | * mtk_infracfg_set_bus_protection - enable bus protection |
25 | * @regmap: The infracfg regmap | 27 | * @regmap: The infracfg regmap |
26 | * @mask: The mask containing the protection bits to be enabled. | 28 | * @mask: The mask containing the protection bits to be enabled. |
29 | * @reg_update: The boolean flag determines to set the protection bits | ||
30 | * by regmap_update_bits with enable register(PROTECTEN) or | ||
31 | * by regmap_write with set register(PROTECTEN_SET). | ||
27 | * | 32 | * |
28 | * This function enables the bus protection bits for disabled power | 33 | * This function enables the bus protection bits for disabled power |
29 | * domains so that the system does not hang when some unit accesses the | 34 | * domains so that the system does not hang when some unit accesses the |
30 | * bus while in power down. | 35 | * bus while in power down. |
31 | */ | 36 | */ |
32 | int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask) | 37 | int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask, |
38 | bool reg_update) | ||
33 | { | 39 | { |
34 | unsigned long expired; | 40 | unsigned long expired; |
35 | u32 val; | 41 | u32 val; |
36 | int ret; | 42 | int ret; |
37 | 43 | ||
38 | regmap_update_bits(infracfg, INFRA_TOPAXI_PROTECTEN, mask, mask); | 44 | if (reg_update) |
45 | regmap_update_bits(infracfg, INFRA_TOPAXI_PROTECTEN, mask, | ||
46 | mask); | ||
47 | else | ||
48 | regmap_write(infracfg, INFRA_TOPAXI_PROTECTEN_SET, mask); | ||
39 | 49 | ||
40 | expired = jiffies + HZ; | 50 | expired = jiffies + HZ; |
41 | 51 | ||
@@ -59,16 +69,24 @@ int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask) | |||
59 | * mtk_infracfg_clear_bus_protection - disable bus protection | 69 | * mtk_infracfg_clear_bus_protection - disable bus protection |
60 | * @regmap: The infracfg regmap | 70 | * @regmap: The infracfg regmap |
61 | * @mask: The mask containing the protection bits to be disabled. | 71 | * @mask: The mask containing the protection bits to be disabled. |
72 | * @reg_update: The boolean flag determines to clear the protection bits | ||
73 | * by regmap_update_bits with enable register(PROTECTEN) or | ||
74 | * by regmap_write with clear register(PROTECTEN_CLR). | ||
62 | * | 75 | * |
63 | * This function disables the bus protection bits previously enabled with | 76 | * This function disables the bus protection bits previously enabled with |
64 | * mtk_infracfg_set_bus_protection. | 77 | * mtk_infracfg_set_bus_protection. |
65 | */ | 78 | */ |
66 | int mtk_infracfg_clear_bus_protection(struct regmap *infracfg, u32 mask) | 79 | |
80 | int mtk_infracfg_clear_bus_protection(struct regmap *infracfg, u32 mask, | ||
81 | bool reg_update) | ||
67 | { | 82 | { |
68 | unsigned long expired; | 83 | unsigned long expired; |
69 | int ret; | 84 | int ret; |
70 | 85 | ||
71 | regmap_update_bits(infracfg, INFRA_TOPAXI_PROTECTEN, mask, 0); | 86 | if (reg_update) |
87 | regmap_update_bits(infracfg, INFRA_TOPAXI_PROTECTEN, mask, 0); | ||
88 | else | ||
89 | regmap_write(infracfg, INFRA_TOPAXI_PROTECTEN_CLR, mask); | ||
72 | 90 | ||
73 | expired = jiffies + HZ; | 91 | expired = jiffies + HZ; |
74 | 92 | ||
diff --git a/drivers/soc/mediatek/mtk-scpsys.c b/drivers/soc/mediatek/mtk-scpsys.c index e570b6af2e6f..435ce5ec648a 100644 --- a/drivers/soc/mediatek/mtk-scpsys.c +++ b/drivers/soc/mediatek/mtk-scpsys.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/soc/mediatek/infracfg.h> | 21 | #include <linux/soc/mediatek/infracfg.h> |
22 | 22 | ||
23 | #include <dt-bindings/power/mt2701-power.h> | 23 | #include <dt-bindings/power/mt2701-power.h> |
24 | #include <dt-bindings/power/mt2712-power.h> | ||
24 | #include <dt-bindings/power/mt6797-power.h> | 25 | #include <dt-bindings/power/mt6797-power.h> |
25 | #include <dt-bindings/power/mt7622-power.h> | 26 | #include <dt-bindings/power/mt7622-power.h> |
26 | #include <dt-bindings/power/mt8173-power.h> | 27 | #include <dt-bindings/power/mt8173-power.h> |
@@ -32,7 +33,7 @@ | |||
32 | #define SPM_DIS_PWR_CON 0x023c | 33 | #define SPM_DIS_PWR_CON 0x023c |
33 | #define SPM_CONN_PWR_CON 0x0280 | 34 | #define SPM_CONN_PWR_CON 0x0280 |
34 | #define SPM_VEN2_PWR_CON 0x0298 | 35 | #define SPM_VEN2_PWR_CON 0x0298 |
35 | #define SPM_AUDIO_PWR_CON 0x029c /* MT8173 */ | 36 | #define SPM_AUDIO_PWR_CON 0x029c /* MT8173, MT2712 */ |
36 | #define SPM_BDP_PWR_CON 0x029c /* MT2701 */ | 37 | #define SPM_BDP_PWR_CON 0x029c /* MT2701 */ |
37 | #define SPM_ETH_PWR_CON 0x02a0 | 38 | #define SPM_ETH_PWR_CON 0x02a0 |
38 | #define SPM_HIF_PWR_CON 0x02a4 | 39 | #define SPM_HIF_PWR_CON 0x02a4 |
@@ -40,12 +41,12 @@ | |||
40 | #define SPM_MFG_2D_PWR_CON 0x02c0 | 41 | #define SPM_MFG_2D_PWR_CON 0x02c0 |
41 | #define SPM_MFG_ASYNC_PWR_CON 0x02c4 | 42 | #define SPM_MFG_ASYNC_PWR_CON 0x02c4 |
42 | #define SPM_USB_PWR_CON 0x02cc | 43 | #define SPM_USB_PWR_CON 0x02cc |
44 | #define SPM_USB2_PWR_CON 0x02d4 /* MT2712 */ | ||
43 | #define SPM_ETHSYS_PWR_CON 0x02e0 /* MT7622 */ | 45 | #define SPM_ETHSYS_PWR_CON 0x02e0 /* MT7622 */ |
44 | #define SPM_HIF0_PWR_CON 0x02e4 /* MT7622 */ | 46 | #define SPM_HIF0_PWR_CON 0x02e4 /* MT7622 */ |
45 | #define SPM_HIF1_PWR_CON 0x02e8 /* MT7622 */ | 47 | #define SPM_HIF1_PWR_CON 0x02e8 /* MT7622 */ |
46 | #define SPM_WB_PWR_CON 0x02ec /* MT7622 */ | 48 | #define SPM_WB_PWR_CON 0x02ec /* MT7622 */ |
47 | 49 | ||
48 | |||
49 | #define SPM_PWR_STATUS 0x060c | 50 | #define SPM_PWR_STATUS 0x060c |
50 | #define SPM_PWR_STATUS_2ND 0x0610 | 51 | #define SPM_PWR_STATUS_2ND 0x0610 |
51 | 52 | ||
@@ -64,12 +65,13 @@ | |||
64 | #define PWR_STATUS_ETH BIT(15) | 65 | #define PWR_STATUS_ETH BIT(15) |
65 | #define PWR_STATUS_HIF BIT(16) | 66 | #define PWR_STATUS_HIF BIT(16) |
66 | #define PWR_STATUS_IFR_MSC BIT(17) | 67 | #define PWR_STATUS_IFR_MSC BIT(17) |
68 | #define PWR_STATUS_USB2 BIT(19) /* MT2712 */ | ||
67 | #define PWR_STATUS_VENC_LT BIT(20) | 69 | #define PWR_STATUS_VENC_LT BIT(20) |
68 | #define PWR_STATUS_VENC BIT(21) | 70 | #define PWR_STATUS_VENC BIT(21) |
69 | #define PWR_STATUS_MFG_2D BIT(22) | 71 | #define PWR_STATUS_MFG_2D BIT(22) /* MT8173 */ |
70 | #define PWR_STATUS_MFG_ASYNC BIT(23) | 72 | #define PWR_STATUS_MFG_ASYNC BIT(23) /* MT8173 */ |
71 | #define PWR_STATUS_AUDIO BIT(24) | 73 | #define PWR_STATUS_AUDIO BIT(24) /* MT8173, MT2712 */ |
72 | #define PWR_STATUS_USB BIT(25) | 74 | #define PWR_STATUS_USB BIT(25) /* MT8173, MT2712 */ |
73 | #define PWR_STATUS_ETHSYS BIT(24) /* MT7622 */ | 75 | #define PWR_STATUS_ETHSYS BIT(24) /* MT7622 */ |
74 | #define PWR_STATUS_HIF0 BIT(25) /* MT7622 */ | 76 | #define PWR_STATUS_HIF0 BIT(25) /* MT7622 */ |
75 | #define PWR_STATUS_HIF1 BIT(26) /* MT7622 */ | 77 | #define PWR_STATUS_HIF1 BIT(26) /* MT7622 */ |
@@ -84,6 +86,8 @@ enum clk_id { | |||
84 | CLK_ETHIF, | 86 | CLK_ETHIF, |
85 | CLK_VDEC, | 87 | CLK_VDEC, |
86 | CLK_HIFSEL, | 88 | CLK_HIFSEL, |
89 | CLK_JPGDEC, | ||
90 | CLK_AUDIO, | ||
87 | CLK_MAX, | 91 | CLK_MAX, |
88 | }; | 92 | }; |
89 | 93 | ||
@@ -96,10 +100,12 @@ static const char * const clk_names[] = { | |||
96 | "ethif", | 100 | "ethif", |
97 | "vdec", | 101 | "vdec", |
98 | "hif_sel", | 102 | "hif_sel", |
103 | "jpgdec", | ||
104 | "audio", | ||
99 | NULL, | 105 | NULL, |
100 | }; | 106 | }; |
101 | 107 | ||
102 | #define MAX_CLKS 2 | 108 | #define MAX_CLKS 3 |
103 | 109 | ||
104 | struct scp_domain_data { | 110 | struct scp_domain_data { |
105 | const char *name; | 111 | const char *name; |
@@ -134,6 +140,7 @@ struct scp { | |||
134 | void __iomem *base; | 140 | void __iomem *base; |
135 | struct regmap *infracfg; | 141 | struct regmap *infracfg; |
136 | struct scp_ctrl_reg ctrl_reg; | 142 | struct scp_ctrl_reg ctrl_reg; |
143 | bool bus_prot_reg_update; | ||
137 | }; | 144 | }; |
138 | 145 | ||
139 | struct scp_subdomain { | 146 | struct scp_subdomain { |
@@ -147,6 +154,7 @@ struct scp_soc_data { | |||
147 | const struct scp_subdomain *subdomains; | 154 | const struct scp_subdomain *subdomains; |
148 | int num_subdomains; | 155 | int num_subdomains; |
149 | const struct scp_ctrl_reg regs; | 156 | const struct scp_ctrl_reg regs; |
157 | bool bus_prot_reg_update; | ||
150 | }; | 158 | }; |
151 | 159 | ||
152 | static int scpsys_domain_is_on(struct scp_domain *scpd) | 160 | static int scpsys_domain_is_on(struct scp_domain *scpd) |
@@ -254,7 +262,8 @@ static int scpsys_power_on(struct generic_pm_domain *genpd) | |||
254 | 262 | ||
255 | if (scpd->data->bus_prot_mask) { | 263 | if (scpd->data->bus_prot_mask) { |
256 | ret = mtk_infracfg_clear_bus_protection(scp->infracfg, | 264 | ret = mtk_infracfg_clear_bus_protection(scp->infracfg, |
257 | scpd->data->bus_prot_mask); | 265 | scpd->data->bus_prot_mask, |
266 | scp->bus_prot_reg_update); | ||
258 | if (ret) | 267 | if (ret) |
259 | goto err_pwr_ack; | 268 | goto err_pwr_ack; |
260 | } | 269 | } |
@@ -289,7 +298,8 @@ static int scpsys_power_off(struct generic_pm_domain *genpd) | |||
289 | 298 | ||
290 | if (scpd->data->bus_prot_mask) { | 299 | if (scpd->data->bus_prot_mask) { |
291 | ret = mtk_infracfg_set_bus_protection(scp->infracfg, | 300 | ret = mtk_infracfg_set_bus_protection(scp->infracfg, |
292 | scpd->data->bus_prot_mask); | 301 | scpd->data->bus_prot_mask, |
302 | scp->bus_prot_reg_update); | ||
293 | if (ret) | 303 | if (ret) |
294 | goto out; | 304 | goto out; |
295 | } | 305 | } |
@@ -371,7 +381,8 @@ static void init_clks(struct platform_device *pdev, struct clk **clk) | |||
371 | 381 | ||
372 | static struct scp *init_scp(struct platform_device *pdev, | 382 | static struct scp *init_scp(struct platform_device *pdev, |
373 | const struct scp_domain_data *scp_domain_data, int num, | 383 | const struct scp_domain_data *scp_domain_data, int num, |
374 | const struct scp_ctrl_reg *scp_ctrl_reg) | 384 | const struct scp_ctrl_reg *scp_ctrl_reg, |
385 | bool bus_prot_reg_update) | ||
375 | { | 386 | { |
376 | struct genpd_onecell_data *pd_data; | 387 | struct genpd_onecell_data *pd_data; |
377 | struct resource *res; | 388 | struct resource *res; |
@@ -386,6 +397,8 @@ static struct scp *init_scp(struct platform_device *pdev, | |||
386 | scp->ctrl_reg.pwr_sta_offs = scp_ctrl_reg->pwr_sta_offs; | 397 | scp->ctrl_reg.pwr_sta_offs = scp_ctrl_reg->pwr_sta_offs; |
387 | scp->ctrl_reg.pwr_sta2nd_offs = scp_ctrl_reg->pwr_sta2nd_offs; | 398 | scp->ctrl_reg.pwr_sta2nd_offs = scp_ctrl_reg->pwr_sta2nd_offs; |
388 | 399 | ||
400 | scp->bus_prot_reg_update = bus_prot_reg_update; | ||
401 | |||
389 | scp->dev = &pdev->dev; | 402 | scp->dev = &pdev->dev; |
390 | 403 | ||
391 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 404 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
@@ -581,6 +594,85 @@ static const struct scp_domain_data scp_domain_data_mt2701[] = { | |||
581 | }; | 594 | }; |
582 | 595 | ||
583 | /* | 596 | /* |
597 | * MT2712 power domain support | ||
598 | */ | ||
599 | static const struct scp_domain_data scp_domain_data_mt2712[] = { | ||
600 | [MT2712_POWER_DOMAIN_MM] = { | ||
601 | .name = "mm", | ||
602 | .sta_mask = PWR_STATUS_DISP, | ||
603 | .ctl_offs = SPM_DIS_PWR_CON, | ||
604 | .sram_pdn_bits = GENMASK(8, 8), | ||
605 | .sram_pdn_ack_bits = GENMASK(12, 12), | ||
606 | .clk_id = {CLK_MM}, | ||
607 | .active_wakeup = true, | ||
608 | }, | ||
609 | [MT2712_POWER_DOMAIN_VDEC] = { | ||
610 | .name = "vdec", | ||
611 | .sta_mask = PWR_STATUS_VDEC, | ||
612 | .ctl_offs = SPM_VDE_PWR_CON, | ||
613 | .sram_pdn_bits = GENMASK(8, 8), | ||
614 | .sram_pdn_ack_bits = GENMASK(12, 12), | ||
615 | .clk_id = {CLK_MM, CLK_VDEC}, | ||
616 | .active_wakeup = true, | ||
617 | }, | ||
618 | [MT2712_POWER_DOMAIN_VENC] = { | ||
619 | .name = "venc", | ||
620 | .sta_mask = PWR_STATUS_VENC, | ||
621 | .ctl_offs = SPM_VEN_PWR_CON, | ||
622 | .sram_pdn_bits = GENMASK(11, 8), | ||
623 | .sram_pdn_ack_bits = GENMASK(15, 12), | ||
624 | .clk_id = {CLK_MM, CLK_VENC, CLK_JPGDEC}, | ||
625 | .active_wakeup = true, | ||
626 | }, | ||
627 | [MT2712_POWER_DOMAIN_ISP] = { | ||
628 | .name = "isp", | ||
629 | .sta_mask = PWR_STATUS_ISP, | ||
630 | .ctl_offs = SPM_ISP_PWR_CON, | ||
631 | .sram_pdn_bits = GENMASK(11, 8), | ||
632 | .sram_pdn_ack_bits = GENMASK(13, 12), | ||
633 | .clk_id = {CLK_MM}, | ||
634 | .active_wakeup = true, | ||
635 | }, | ||
636 | [MT2712_POWER_DOMAIN_AUDIO] = { | ||
637 | .name = "audio", | ||
638 | .sta_mask = PWR_STATUS_AUDIO, | ||
639 | .ctl_offs = SPM_AUDIO_PWR_CON, | ||
640 | .sram_pdn_bits = GENMASK(11, 8), | ||
641 | .sram_pdn_ack_bits = GENMASK(15, 12), | ||
642 | .clk_id = {CLK_AUDIO}, | ||
643 | .active_wakeup = true, | ||
644 | }, | ||
645 | [MT2712_POWER_DOMAIN_USB] = { | ||
646 | .name = "usb", | ||
647 | .sta_mask = PWR_STATUS_USB, | ||
648 | .ctl_offs = SPM_USB_PWR_CON, | ||
649 | .sram_pdn_bits = GENMASK(10, 8), | ||
650 | .sram_pdn_ack_bits = GENMASK(14, 12), | ||
651 | .clk_id = {CLK_NONE}, | ||
652 | .active_wakeup = true, | ||
653 | }, | ||
654 | [MT2712_POWER_DOMAIN_USB2] = { | ||
655 | .name = "usb2", | ||
656 | .sta_mask = PWR_STATUS_USB2, | ||
657 | .ctl_offs = SPM_USB2_PWR_CON, | ||
658 | .sram_pdn_bits = GENMASK(10, 8), | ||
659 | .sram_pdn_ack_bits = GENMASK(14, 12), | ||
660 | .clk_id = {CLK_NONE}, | ||
661 | .active_wakeup = true, | ||
662 | }, | ||
663 | [MT2712_POWER_DOMAIN_MFG] = { | ||
664 | .name = "mfg", | ||
665 | .sta_mask = PWR_STATUS_MFG, | ||
666 | .ctl_offs = SPM_MFG_PWR_CON, | ||
667 | .sram_pdn_bits = GENMASK(11, 8), | ||
668 | .sram_pdn_ack_bits = GENMASK(19, 16), | ||
669 | .clk_id = {CLK_MFG}, | ||
670 | .bus_prot_mask = BIT(14) | BIT(21) | BIT(23), | ||
671 | .active_wakeup = true, | ||
672 | }, | ||
673 | }; | ||
674 | |||
675 | /* | ||
584 | * MT6797 power domain support | 676 | * MT6797 power domain support |
585 | */ | 677 | */ |
586 | 678 | ||
@@ -806,7 +898,18 @@ static const struct scp_soc_data mt2701_data = { | |||
806 | .regs = { | 898 | .regs = { |
807 | .pwr_sta_offs = SPM_PWR_STATUS, | 899 | .pwr_sta_offs = SPM_PWR_STATUS, |
808 | .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND | 900 | .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND |
809 | } | 901 | }, |
902 | .bus_prot_reg_update = true, | ||
903 | }; | ||
904 | |||
905 | static const struct scp_soc_data mt2712_data = { | ||
906 | .domains = scp_domain_data_mt2712, | ||
907 | .num_domains = ARRAY_SIZE(scp_domain_data_mt2712), | ||
908 | .regs = { | ||
909 | .pwr_sta_offs = SPM_PWR_STATUS, | ||
910 | .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND | ||
911 | }, | ||
912 | .bus_prot_reg_update = false, | ||
810 | }; | 913 | }; |
811 | 914 | ||
812 | static const struct scp_soc_data mt6797_data = { | 915 | static const struct scp_soc_data mt6797_data = { |
@@ -817,7 +920,8 @@ static const struct scp_soc_data mt6797_data = { | |||
817 | .regs = { | 920 | .regs = { |
818 | .pwr_sta_offs = SPM_PWR_STATUS_MT6797, | 921 | .pwr_sta_offs = SPM_PWR_STATUS_MT6797, |
819 | .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND_MT6797 | 922 | .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND_MT6797 |
820 | } | 923 | }, |
924 | .bus_prot_reg_update = true, | ||
821 | }; | 925 | }; |
822 | 926 | ||
823 | static const struct scp_soc_data mt7622_data = { | 927 | static const struct scp_soc_data mt7622_data = { |
@@ -826,7 +930,8 @@ static const struct scp_soc_data mt7622_data = { | |||
826 | .regs = { | 930 | .regs = { |
827 | .pwr_sta_offs = SPM_PWR_STATUS, | 931 | .pwr_sta_offs = SPM_PWR_STATUS, |
828 | .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND | 932 | .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND |
829 | } | 933 | }, |
934 | .bus_prot_reg_update = true, | ||
830 | }; | 935 | }; |
831 | 936 | ||
832 | static const struct scp_soc_data mt8173_data = { | 937 | static const struct scp_soc_data mt8173_data = { |
@@ -837,7 +942,8 @@ static const struct scp_soc_data mt8173_data = { | |||
837 | .regs = { | 942 | .regs = { |
838 | .pwr_sta_offs = SPM_PWR_STATUS, | 943 | .pwr_sta_offs = SPM_PWR_STATUS, |
839 | .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND | 944 | .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND |
840 | } | 945 | }, |
946 | .bus_prot_reg_update = true, | ||
841 | }; | 947 | }; |
842 | 948 | ||
843 | /* | 949 | /* |
@@ -849,6 +955,9 @@ static const struct of_device_id of_scpsys_match_tbl[] = { | |||
849 | .compatible = "mediatek,mt2701-scpsys", | 955 | .compatible = "mediatek,mt2701-scpsys", |
850 | .data = &mt2701_data, | 956 | .data = &mt2701_data, |
851 | }, { | 957 | }, { |
958 | .compatible = "mediatek,mt2712-scpsys", | ||
959 | .data = &mt2712_data, | ||
960 | }, { | ||
852 | .compatible = "mediatek,mt6797-scpsys", | 961 | .compatible = "mediatek,mt6797-scpsys", |
853 | .data = &mt6797_data, | 962 | .data = &mt6797_data, |
854 | }, { | 963 | }, { |
@@ -874,7 +983,8 @@ static int scpsys_probe(struct platform_device *pdev) | |||
874 | match = of_match_device(of_scpsys_match_tbl, &pdev->dev); | 983 | match = of_match_device(of_scpsys_match_tbl, &pdev->dev); |
875 | soc = (const struct scp_soc_data *)match->data; | 984 | soc = (const struct scp_soc_data *)match->data; |
876 | 985 | ||
877 | scp = init_scp(pdev, soc->domains, soc->num_domains, &soc->regs); | 986 | scp = init_scp(pdev, soc->domains, soc->num_domains, &soc->regs, |
987 | soc->bus_prot_reg_update); | ||
878 | if (IS_ERR(scp)) | 988 | if (IS_ERR(scp)) |
879 | return PTR_ERR(scp); | 989 | return PTR_ERR(scp); |
880 | 990 | ||
diff --git a/include/dt-bindings/power/mt2712-power.h b/include/dt-bindings/power/mt2712-power.h new file mode 100644 index 000000000000..92b46d772fae --- /dev/null +++ b/include/dt-bindings/power/mt2712-power.h | |||
@@ -0,0 +1,26 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2017 MediaTek Inc. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
11 | * See http://www.gnu.org/licenses/gpl-2.0.html for more details. | ||
12 | */ | ||
13 | |||
14 | #ifndef _DT_BINDINGS_POWER_MT2712_POWER_H | ||
15 | #define _DT_BINDINGS_POWER_MT2712_POWER_H | ||
16 | |||
17 | #define MT2712_POWER_DOMAIN_MM 0 | ||
18 | #define MT2712_POWER_DOMAIN_VDEC 1 | ||
19 | #define MT2712_POWER_DOMAIN_VENC 2 | ||
20 | #define MT2712_POWER_DOMAIN_ISP 3 | ||
21 | #define MT2712_POWER_DOMAIN_AUDIO 4 | ||
22 | #define MT2712_POWER_DOMAIN_USB 5 | ||
23 | #define MT2712_POWER_DOMAIN_USB2 6 | ||
24 | #define MT2712_POWER_DOMAIN_MFG 7 | ||
25 | |||
26 | #endif /* _DT_BINDINGS_POWER_MT2712_POWER_H */ | ||
diff --git a/include/linux/soc/mediatek/infracfg.h b/include/linux/soc/mediatek/infracfg.h index e8d9f0d52933..b0a507d356ef 100644 --- a/include/linux/soc/mediatek/infracfg.h +++ b/include/linux/soc/mediatek/infracfg.h | |||
@@ -28,7 +28,8 @@ | |||
28 | #define MT7622_TOP_AXI_PROT_EN_WB (BIT(2) | BIT(6) | \ | 28 | #define MT7622_TOP_AXI_PROT_EN_WB (BIT(2) | BIT(6) | \ |
29 | BIT(7) | BIT(8)) | 29 | BIT(7) | BIT(8)) |
30 | 30 | ||
31 | int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask); | 31 | int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask, |
32 | int mtk_infracfg_clear_bus_protection(struct regmap *infracfg, u32 mask); | 32 | bool reg_update); |
33 | 33 | int mtk_infracfg_clear_bus_protection(struct regmap *infracfg, u32 mask, | |
34 | bool reg_update); | ||
34 | #endif /* __SOC_MEDIATEK_INFRACFG_H */ | 35 | #endif /* __SOC_MEDIATEK_INFRACFG_H */ |