aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2017-12-21 12:11:41 -0500
committerArnd Bergmann <arnd@arndb.de>2017-12-21 12:11:41 -0500
commit11c9dff045484f5945af9ca786f9d2539320c0d4 (patch)
tree12d9e60184c805e5d0cd6e067b2355492c9130a3
parenta3dc838d7aa045c5b601f88ea1eab7b788b58e64 (diff)
parentfdac5f4d4857d488fcd77308fec95b44196fdfb1 (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.txt3
-rw-r--r--arch/arm/mach-mediatek/Kconfig2
-rw-r--r--drivers/soc/mediatek/mtk-infracfg.c26
-rw-r--r--drivers/soc/mediatek/mtk-scpsys.c140
-rw-r--r--include/dt-bindings/power/mt2712-power.h26
-rw-r--r--include/linux/soc/mediatek/infracfg.h7
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
17Required properties: 18Required 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 @@
1menuconfig ARCH_MEDIATEK 1menuconfig 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 */
32int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask) 37int 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 */
66int mtk_infracfg_clear_bus_protection(struct regmap *infracfg, u32 mask) 79
80int 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
104struct scp_domain_data { 110struct 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
139struct scp_subdomain { 146struct 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
152static int scpsys_domain_is_on(struct scp_domain *scpd) 160static 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
372static struct scp *init_scp(struct platform_device *pdev, 382static 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 */
599static 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
905static 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
812static const struct scp_soc_data mt6797_data = { 915static 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
823static const struct scp_soc_data mt7622_data = { 927static 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
832static const struct scp_soc_data mt8173_data = { 937static 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
31int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask); 31int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask,
32int mtk_infracfg_clear_bus_protection(struct regmap *infracfg, u32 mask); 32 bool reg_update);
33 33int 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 */