aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2018-03-27 09:53:04 -0400
committerArnd Bergmann <arnd@arndb.de>2018-03-27 09:53:04 -0400
commit03836dd07f43a17b3681d3fc75ea40833fda49b6 (patch)
tree3f0550b9e2201c02a9863ffb936c9541947b6366
parent498b5651542d391dc5fa2e5c63ad2a2bbd144cc2 (diff)
parent9f9971266110add19b512f7b10a6d922e741368e (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.txt5
-rw-r--r--drivers/soc/mediatek/mtk-scpsys.c104
-rw-r--r--include/dt-bindings/power/mt2712-power.h3
-rw-r--r--include/dt-bindings/power/mt7623a-power.h10
-rw-r--r--include/linux/soc/mediatek/infracfg.h4
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
37Optional properties: 40Optional 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
704static 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
838static 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 = {
905static const struct scp_soc_data mt2712_data = { 984static 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
1018static 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
937static const struct scp_soc_data mt8173_data = { 1028static 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) | \