summaryrefslogtreecommitdiffstats
path: root/drivers/soc
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 /drivers/soc
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
Diffstat (limited to 'drivers/soc')
-rw-r--r--drivers/soc/mediatek/mtk-scpsys.c104
1 files changed, 99 insertions, 5 deletions
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))