diff options
author | Arnd Bergmann <arnd@arndb.de> | 2018-03-27 09:53:04 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2018-03-27 09:53:04 -0400 |
commit | 03836dd07f43a17b3681d3fc75ea40833fda49b6 (patch) | |
tree | 3f0550b9e2201c02a9863ffb936c9541947b6366 | |
parent | 498b5651542d391dc5fa2e5c63ad2a2bbd144cc2 (diff) | |
parent | 9f9971266110add19b512f7b10a6d922e741368e (diff) |
Merge tag 'v4.16-next-soc' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux into next/drivers
Pull "ARM: mediatek: updates for soc drivers for v4.16-next" from Matthias Brugger:
scpsy:
- mt2712: update power domains to reflect design changes in the SoC
- fix initialisation of power subdomains
- add support for mt7623a SoC
- use defines for mt2701 bus protection mask
* tag 'v4.16-next-soc' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux:
soc: mediatek: update power domain data of MT2712
dt-bindings: soc: update MT2712 power dt-bindings
soc: mediatek: fix the mistaken pointer accessed when subdomains are added
soc: mediatek: add SCPSYS power domain driver for MediaTek MT7623A SoC
soc: mediatek: avoid hardcoded value with bus_prot_mask
dt-bindings: soc: add header files required for MT7623A SCPSYS dt-binding
dt-bindings: soc: add SCPSYS binding for MT7623 and MT7623A SoC
-rw-r--r-- | Documentation/devicetree/bindings/soc/mediatek/scpsys.txt | 5 | ||||
-rw-r--r-- | drivers/soc/mediatek/mtk-scpsys.c | 104 | ||||
-rw-r--r-- | include/dt-bindings/power/mt2712-power.h | 3 | ||||
-rw-r--r-- | include/dt-bindings/power/mt7623a-power.h | 10 | ||||
-rw-r--r-- | include/linux/soc/mediatek/infracfg.h | 4 |
5 files changed, 120 insertions, 6 deletions
diff --git a/Documentation/devicetree/bindings/soc/mediatek/scpsys.txt b/Documentation/devicetree/bindings/soc/mediatek/scpsys.txt index 76bf45b893fa..d6fe16f094af 100644 --- a/Documentation/devicetree/bindings/soc/mediatek/scpsys.txt +++ b/Documentation/devicetree/bindings/soc/mediatek/scpsys.txt | |||
@@ -21,6 +21,8 @@ Required properties: | |||
21 | - "mediatek,mt2712-scpsys" | 21 | - "mediatek,mt2712-scpsys" |
22 | - "mediatek,mt6797-scpsys" | 22 | - "mediatek,mt6797-scpsys" |
23 | - "mediatek,mt7622-scpsys" | 23 | - "mediatek,mt7622-scpsys" |
24 | - "mediatek,mt7623-scpsys", "mediatek,mt2701-scpsys": For MT7623 SoC | ||
25 | - "mediatek,mt7623a-scpsys": For MT7623A SoC | ||
24 | - "mediatek,mt8173-scpsys" | 26 | - "mediatek,mt8173-scpsys" |
25 | - #power-domain-cells: Must be 1 | 27 | - #power-domain-cells: Must be 1 |
26 | - reg: Address range of the SCPSYS unit | 28 | - reg: Address range of the SCPSYS unit |
@@ -28,10 +30,11 @@ Required properties: | |||
28 | - clock, clock-names: clocks according to the common clock binding. | 30 | - clock, clock-names: clocks according to the common clock binding. |
29 | These are clocks which hardware needs to be | 31 | These are clocks which hardware needs to be |
30 | enabled before enabling certain power domains. | 32 | enabled before enabling certain power domains. |
31 | Required clocks for MT2701: "mm", "mfg", "ethif" | 33 | Required clocks for MT2701 or MT7623: "mm", "mfg", "ethif" |
32 | Required clocks for MT2712: "mm", "mfg", "venc", "jpgdec", "audio", "vdec" | 34 | Required clocks for MT2712: "mm", "mfg", "venc", "jpgdec", "audio", "vdec" |
33 | Required clocks for MT6797: "mm", "mfg", "vdec" | 35 | Required clocks for MT6797: "mm", "mfg", "vdec" |
34 | Required clocks for MT7622: "hif_sel" | 36 | Required clocks for MT7622: "hif_sel" |
37 | Required clocks for MT7622A: "ethif" | ||
35 | Required clocks for MT8173: "mm", "mfg", "venc", "venc_lt" | 38 | Required clocks for MT8173: "mm", "mfg", "venc", "venc_lt" |
36 | 39 | ||
37 | Optional properties: | 40 | Optional properties: |
diff --git a/drivers/soc/mediatek/mtk-scpsys.c b/drivers/soc/mediatek/mtk-scpsys.c index 435ce5ec648a..d762a46d434f 100644 --- a/drivers/soc/mediatek/mtk-scpsys.c +++ b/drivers/soc/mediatek/mtk-scpsys.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <dt-bindings/power/mt2712-power.h> | 24 | #include <dt-bindings/power/mt2712-power.h> |
25 | #include <dt-bindings/power/mt6797-power.h> | 25 | #include <dt-bindings/power/mt6797-power.h> |
26 | #include <dt-bindings/power/mt7622-power.h> | 26 | #include <dt-bindings/power/mt7622-power.h> |
27 | #include <dt-bindings/power/mt7623a-power.h> | ||
27 | #include <dt-bindings/power/mt8173-power.h> | 28 | #include <dt-bindings/power/mt8173-power.h> |
28 | 29 | ||
29 | #define SPM_VDE_PWR_CON 0x0210 | 30 | #define SPM_VDE_PWR_CON 0x0210 |
@@ -518,7 +519,8 @@ static const struct scp_domain_data scp_domain_data_mt2701[] = { | |||
518 | .name = "conn", | 519 | .name = "conn", |
519 | .sta_mask = PWR_STATUS_CONN, | 520 | .sta_mask = PWR_STATUS_CONN, |
520 | .ctl_offs = SPM_CONN_PWR_CON, | 521 | .ctl_offs = SPM_CONN_PWR_CON, |
521 | .bus_prot_mask = 0x0104, | 522 | .bus_prot_mask = MT2701_TOP_AXI_PROT_EN_CONN_M | |
523 | MT2701_TOP_AXI_PROT_EN_CONN_S, | ||
522 | .clk_id = {CLK_NONE}, | 524 | .clk_id = {CLK_NONE}, |
523 | .active_wakeup = true, | 525 | .active_wakeup = true, |
524 | }, | 526 | }, |
@@ -528,7 +530,7 @@ static const struct scp_domain_data scp_domain_data_mt2701[] = { | |||
528 | .ctl_offs = SPM_DIS_PWR_CON, | 530 | .ctl_offs = SPM_DIS_PWR_CON, |
529 | .sram_pdn_bits = GENMASK(11, 8), | 531 | .sram_pdn_bits = GENMASK(11, 8), |
530 | .clk_id = {CLK_MM}, | 532 | .clk_id = {CLK_MM}, |
531 | .bus_prot_mask = 0x0002, | 533 | .bus_prot_mask = MT2701_TOP_AXI_PROT_EN_MM_M0, |
532 | .active_wakeup = true, | 534 | .active_wakeup = true, |
533 | }, | 535 | }, |
534 | [MT2701_POWER_DOMAIN_MFG] = { | 536 | [MT2701_POWER_DOMAIN_MFG] = { |
@@ -664,12 +666,48 @@ static const struct scp_domain_data scp_domain_data_mt2712[] = { | |||
664 | .name = "mfg", | 666 | .name = "mfg", |
665 | .sta_mask = PWR_STATUS_MFG, | 667 | .sta_mask = PWR_STATUS_MFG, |
666 | .ctl_offs = SPM_MFG_PWR_CON, | 668 | .ctl_offs = SPM_MFG_PWR_CON, |
667 | .sram_pdn_bits = GENMASK(11, 8), | 669 | .sram_pdn_bits = GENMASK(8, 8), |
668 | .sram_pdn_ack_bits = GENMASK(19, 16), | 670 | .sram_pdn_ack_bits = GENMASK(16, 16), |
669 | .clk_id = {CLK_MFG}, | 671 | .clk_id = {CLK_MFG}, |
670 | .bus_prot_mask = BIT(14) | BIT(21) | BIT(23), | 672 | .bus_prot_mask = BIT(14) | BIT(21) | BIT(23), |
671 | .active_wakeup = true, | 673 | .active_wakeup = true, |
672 | }, | 674 | }, |
675 | [MT2712_POWER_DOMAIN_MFG_SC1] = { | ||
676 | .name = "mfg_sc1", | ||
677 | .sta_mask = BIT(22), | ||
678 | .ctl_offs = 0x02c0, | ||
679 | .sram_pdn_bits = GENMASK(8, 8), | ||
680 | .sram_pdn_ack_bits = GENMASK(16, 16), | ||
681 | .clk_id = {CLK_NONE}, | ||
682 | .active_wakeup = true, | ||
683 | }, | ||
684 | [MT2712_POWER_DOMAIN_MFG_SC2] = { | ||
685 | .name = "mfg_sc2", | ||
686 | .sta_mask = BIT(23), | ||
687 | .ctl_offs = 0x02c4, | ||
688 | .sram_pdn_bits = GENMASK(8, 8), | ||
689 | .sram_pdn_ack_bits = GENMASK(16, 16), | ||
690 | .clk_id = {CLK_NONE}, | ||
691 | .active_wakeup = true, | ||
692 | }, | ||
693 | [MT2712_POWER_DOMAIN_MFG_SC3] = { | ||
694 | .name = "mfg_sc3", | ||
695 | .sta_mask = BIT(30), | ||
696 | .ctl_offs = 0x01f8, | ||
697 | .sram_pdn_bits = GENMASK(8, 8), | ||
698 | .sram_pdn_ack_bits = GENMASK(16, 16), | ||
699 | .clk_id = {CLK_NONE}, | ||
700 | .active_wakeup = true, | ||
701 | }, | ||
702 | }; | ||
703 | |||
704 | static const struct scp_subdomain scp_subdomain_mt2712[] = { | ||
705 | {MT2712_POWER_DOMAIN_MM, MT2712_POWER_DOMAIN_VDEC}, | ||
706 | {MT2712_POWER_DOMAIN_MM, MT2712_POWER_DOMAIN_VENC}, | ||
707 | {MT2712_POWER_DOMAIN_MM, MT2712_POWER_DOMAIN_ISP}, | ||
708 | {MT2712_POWER_DOMAIN_MFG, MT2712_POWER_DOMAIN_MFG_SC1}, | ||
709 | {MT2712_POWER_DOMAIN_MFG_SC1, MT2712_POWER_DOMAIN_MFG_SC2}, | ||
710 | {MT2712_POWER_DOMAIN_MFG_SC2, MT2712_POWER_DOMAIN_MFG_SC3}, | ||
673 | }; | 711 | }; |
674 | 712 | ||
675 | /* | 713 | /* |
@@ -794,6 +832,47 @@ static const struct scp_domain_data scp_domain_data_mt7622[] = { | |||
794 | }; | 832 | }; |
795 | 833 | ||
796 | /* | 834 | /* |
835 | * MT7623A power domain support | ||
836 | */ | ||
837 | |||
838 | static const struct scp_domain_data scp_domain_data_mt7623a[] = { | ||
839 | [MT7623A_POWER_DOMAIN_CONN] = { | ||
840 | .name = "conn", | ||
841 | .sta_mask = PWR_STATUS_CONN, | ||
842 | .ctl_offs = SPM_CONN_PWR_CON, | ||
843 | .bus_prot_mask = MT2701_TOP_AXI_PROT_EN_CONN_M | | ||
844 | MT2701_TOP_AXI_PROT_EN_CONN_S, | ||
845 | .clk_id = {CLK_NONE}, | ||
846 | .active_wakeup = true, | ||
847 | }, | ||
848 | [MT7623A_POWER_DOMAIN_ETH] = { | ||
849 | .name = "eth", | ||
850 | .sta_mask = PWR_STATUS_ETH, | ||
851 | .ctl_offs = SPM_ETH_PWR_CON, | ||
852 | .sram_pdn_bits = GENMASK(11, 8), | ||
853 | .sram_pdn_ack_bits = GENMASK(15, 12), | ||
854 | .clk_id = {CLK_ETHIF}, | ||
855 | .active_wakeup = true, | ||
856 | }, | ||
857 | [MT7623A_POWER_DOMAIN_HIF] = { | ||
858 | .name = "hif", | ||
859 | .sta_mask = PWR_STATUS_HIF, | ||
860 | .ctl_offs = SPM_HIF_PWR_CON, | ||
861 | .sram_pdn_bits = GENMASK(11, 8), | ||
862 | .sram_pdn_ack_bits = GENMASK(15, 12), | ||
863 | .clk_id = {CLK_ETHIF}, | ||
864 | .active_wakeup = true, | ||
865 | }, | ||
866 | [MT7623A_POWER_DOMAIN_IFR_MSC] = { | ||
867 | .name = "ifr_msc", | ||
868 | .sta_mask = PWR_STATUS_IFR_MSC, | ||
869 | .ctl_offs = SPM_IFR_MSC_PWR_CON, | ||
870 | .clk_id = {CLK_NONE}, | ||
871 | .active_wakeup = true, | ||
872 | }, | ||
873 | }; | ||
874 | |||
875 | /* | ||
797 | * MT8173 power domain support | 876 | * MT8173 power domain support |
798 | */ | 877 | */ |
799 | 878 | ||
@@ -905,6 +984,8 @@ static const struct scp_soc_data mt2701_data = { | |||
905 | static const struct scp_soc_data mt2712_data = { | 984 | static const struct scp_soc_data mt2712_data = { |
906 | .domains = scp_domain_data_mt2712, | 985 | .domains = scp_domain_data_mt2712, |
907 | .num_domains = ARRAY_SIZE(scp_domain_data_mt2712), | 986 | .num_domains = ARRAY_SIZE(scp_domain_data_mt2712), |
987 | .subdomains = scp_subdomain_mt2712, | ||
988 | .num_subdomains = ARRAY_SIZE(scp_subdomain_mt2712), | ||
908 | .regs = { | 989 | .regs = { |
909 | .pwr_sta_offs = SPM_PWR_STATUS, | 990 | .pwr_sta_offs = SPM_PWR_STATUS, |
910 | .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND | 991 | .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND |
@@ -934,6 +1015,16 @@ static const struct scp_soc_data mt7622_data = { | |||
934 | .bus_prot_reg_update = true, | 1015 | .bus_prot_reg_update = true, |
935 | }; | 1016 | }; |
936 | 1017 | ||
1018 | static const struct scp_soc_data mt7623a_data = { | ||
1019 | .domains = scp_domain_data_mt7623a, | ||
1020 | .num_domains = ARRAY_SIZE(scp_domain_data_mt7623a), | ||
1021 | .regs = { | ||
1022 | .pwr_sta_offs = SPM_PWR_STATUS, | ||
1023 | .pwr_sta2nd_offs = SPM_PWR_STATUS_2ND | ||
1024 | }, | ||
1025 | .bus_prot_reg_update = true, | ||
1026 | }; | ||
1027 | |||
937 | static const struct scp_soc_data mt8173_data = { | 1028 | static const struct scp_soc_data mt8173_data = { |
938 | .domains = scp_domain_data_mt8173, | 1029 | .domains = scp_domain_data_mt8173, |
939 | .num_domains = ARRAY_SIZE(scp_domain_data_mt8173), | 1030 | .num_domains = ARRAY_SIZE(scp_domain_data_mt8173), |
@@ -964,6 +1055,9 @@ static const struct of_device_id of_scpsys_match_tbl[] = { | |||
964 | .compatible = "mediatek,mt7622-scpsys", | 1055 | .compatible = "mediatek,mt7622-scpsys", |
965 | .data = &mt7622_data, | 1056 | .data = &mt7622_data, |
966 | }, { | 1057 | }, { |
1058 | .compatible = "mediatek,mt7623a-scpsys", | ||
1059 | .data = &mt7623a_data, | ||
1060 | }, { | ||
967 | .compatible = "mediatek,mt8173-scpsys", | 1061 | .compatible = "mediatek,mt8173-scpsys", |
968 | .data = &mt8173_data, | 1062 | .data = &mt8173_data, |
969 | }, { | 1063 | }, { |
@@ -992,7 +1086,7 @@ static int scpsys_probe(struct platform_device *pdev) | |||
992 | 1086 | ||
993 | pd_data = &scp->pd_data; | 1087 | pd_data = &scp->pd_data; |
994 | 1088 | ||
995 | for (i = 0, sd = soc->subdomains ; i < soc->num_subdomains ; i++) { | 1089 | for (i = 0, sd = soc->subdomains; i < soc->num_subdomains; i++, sd++) { |
996 | ret = pm_genpd_add_subdomain(pd_data->domains[sd->origin], | 1090 | ret = pm_genpd_add_subdomain(pd_data->domains[sd->origin], |
997 | pd_data->domains[sd->subdomain]); | 1091 | pd_data->domains[sd->subdomain]); |
998 | if (ret && IS_ENABLED(CONFIG_PM)) | 1092 | if (ret && IS_ENABLED(CONFIG_PM)) |
diff --git a/include/dt-bindings/power/mt2712-power.h b/include/dt-bindings/power/mt2712-power.h index 92b46d772fae..2c147817efc2 100644 --- a/include/dt-bindings/power/mt2712-power.h +++ b/include/dt-bindings/power/mt2712-power.h | |||
@@ -22,5 +22,8 @@ | |||
22 | #define MT2712_POWER_DOMAIN_USB 5 | 22 | #define MT2712_POWER_DOMAIN_USB 5 |
23 | #define MT2712_POWER_DOMAIN_USB2 6 | 23 | #define MT2712_POWER_DOMAIN_USB2 6 |
24 | #define MT2712_POWER_DOMAIN_MFG 7 | 24 | #define MT2712_POWER_DOMAIN_MFG 7 |
25 | #define MT2712_POWER_DOMAIN_MFG_SC1 8 | ||
26 | #define MT2712_POWER_DOMAIN_MFG_SC2 9 | ||
27 | #define MT2712_POWER_DOMAIN_MFG_SC3 10 | ||
25 | 28 | ||
26 | #endif /* _DT_BINDINGS_POWER_MT2712_POWER_H */ | 29 | #endif /* _DT_BINDINGS_POWER_MT2712_POWER_H */ |
diff --git a/include/dt-bindings/power/mt7623a-power.h b/include/dt-bindings/power/mt7623a-power.h new file mode 100644 index 000000000000..2544822aa76b --- /dev/null +++ b/include/dt-bindings/power/mt7623a-power.h | |||
@@ -0,0 +1,10 @@ | |||
1 | /* SPDX-License-Identifier: GPL-2.0 */ | ||
2 | #ifndef _DT_BINDINGS_POWER_MT7623A_POWER_H | ||
3 | #define _DT_BINDINGS_POWER_MT7623A_POWER_H | ||
4 | |||
5 | #define MT7623A_POWER_DOMAIN_CONN 0 | ||
6 | #define MT7623A_POWER_DOMAIN_ETH 1 | ||
7 | #define MT7623A_POWER_DOMAIN_HIF 2 | ||
8 | #define MT7623A_POWER_DOMAIN_IFR_MSC 3 | ||
9 | |||
10 | #endif /* _DT_BINDINGS_POWER_MT7623A_POWER_H */ | ||
diff --git a/include/linux/soc/mediatek/infracfg.h b/include/linux/soc/mediatek/infracfg.h index b0a507d356ef..fd25f0148566 100644 --- a/include/linux/soc/mediatek/infracfg.h +++ b/include/linux/soc/mediatek/infracfg.h | |||
@@ -21,6 +21,10 @@ | |||
21 | #define MT8173_TOP_AXI_PROT_EN_MFG_M1 BIT(22) | 21 | #define MT8173_TOP_AXI_PROT_EN_MFG_M1 BIT(22) |
22 | #define MT8173_TOP_AXI_PROT_EN_MFG_SNOOP_OUT BIT(23) | 22 | #define MT8173_TOP_AXI_PROT_EN_MFG_SNOOP_OUT BIT(23) |
23 | 23 | ||
24 | #define MT2701_TOP_AXI_PROT_EN_MM_M0 BIT(1) | ||
25 | #define MT2701_TOP_AXI_PROT_EN_CONN_M BIT(2) | ||
26 | #define MT2701_TOP_AXI_PROT_EN_CONN_S BIT(8) | ||
27 | |||
24 | #define MT7622_TOP_AXI_PROT_EN_ETHSYS (BIT(3) | BIT(17)) | 28 | #define MT7622_TOP_AXI_PROT_EN_ETHSYS (BIT(3) | BIT(17)) |
25 | #define MT7622_TOP_AXI_PROT_EN_HIF0 (BIT(24) | BIT(25)) | 29 | #define MT7622_TOP_AXI_PROT_EN_HIF0 (BIT(24) | BIT(25)) |
26 | #define MT7622_TOP_AXI_PROT_EN_HIF1 (BIT(26) | BIT(27) | \ | 30 | #define MT7622_TOP_AXI_PROT_EN_HIF1 (BIT(26) | BIT(27) | \ |