- add MT8183 support to mutex driver

MMSYS:
 - use per SoC array to describe the possible routing
 - add support for MT8183
 
 Power management domains:
 - fix the case of a domain fails to get added
 - add names for each power domain to make debugging easier
 
 PMIC wrapper:
 - add support for PMIC wrapper with integrated arbiter
 - add support for MT8192/MT6873
 -----BEGIN PGP SIGNATURE-----
 
 iQJLBAABCAA1FiEEUdvKHhzqrUYPB/u8L21+TfbCqH4FAmBl0JgXHG1hdHRoaWFz
 LmJnZ0BnbWFpbC5jb20ACgkQL21+TfbCqH7R2BAArIiOQfH2+Ua71gQtPSoss4SX
 1+j7pqfTAzHsLILC7SldGR7uBjUz9KjvuHab6lrZ5SMn2A6vF8IPEpAH0vJUPrq/
 PACXese3VVlpDb3JjxcMSbFcuRW/f7Jptt1Kjss7IpwVYXgPWy/prWQdNIvX8uTn
 15wa7JwljXsMjqBJdUYvBOYHDqyTuvqXPjGkwKTxKKRK843qUZ1ZT0lr0yux0p4R
 83xh0MdqPNMzV02vNISd9fVJ4uL3Vv/k4vQXv5LOE1wnTgWKq4QPGvRxz8XOqcu9
 y6EodyxMi2igTnnMXrGJTowB3j9j0FMWWKCTj8b8UmESbrk8VxtZjV4YTUJFlwks
 EVke23hsiqQA4i4NWw+zduB9KCHRBqemt5Z20uGIEXj2I9dvUw94+ScTOkYsNE8h
 B+wsFLQgPbD4wrzfs+GkX30c2D0uV8PLDtiQFmszbGHCslvXhwmdhp9wyOkA748L
 JyZzQhkJUyq9rCDwQtsKfmdLKTfj0GDOEuzjInI22WgcZiU8n23/SKaS+dYQH6+E
 Piz1MAzQGZuqQ2Xnp+2GyBrIZutyjuID0i3KbjuamJ6DHCiwq0u8t/fqWwFNB4oe
 YlCE4Gh7IP0/8q0t1uPNyO4EC1Nr9tiq6ahUUG5w4RgzhdVwqBf9IcumohLHEKfH
 tz3S2E92w09h+z/TpKY=
 =o2Cq
 -----END PGP SIGNATURE-----

Merge tag 'v5.12-next-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux into arm/drivers

- add MT8183 support to mutex driver

MMSYS:
- use per SoC array to describe the possible routing
- add support for MT8183

Power management domains:
- fix the case of a domain fails to get added
- add names for each power domain to make debugging easier

PMIC wrapper:
- add support for PMIC wrapper with integrated arbiter
- add support for MT8192/MT6873

* tag 'v5.12-next-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux:
  soc: mediatek: pm-domains: Add a power domain names for mt8167
  soc: mediatek: pm-domains: Add a power domain names for mt8192
  soc: mediatek: pm-domains: Add a power domain names for mt8183
  soc: mediatek: pm-domains: Add a meaningful power domain name
  soc: mediatek: Make symbol 'mtk_mutex_driver' static
  soc: mediatek: mmsys: Add mt8183 mmsys routing table
  soc: mediatek: pwrap: add pwrap driver for MT6873/8192 SoCs
  dt-bindings: mediatek: add compatible for MT6873/8192 pwrap
  soc: mediatek: pwrap: add arbiter capability
  soc: mediatek: pwrap: use BIT() macro
  soc: mediatek: pm-domains: Fix missing error code in scpsys_add_subdomain()
  soc: mediatek: mmsys: Use an array for setting the routing registers
  soc: mediatek: mmsys: Create struct mtk_mmsys to store context data
  soc: mediatek: add mtk mutex support for MT8183

Link: https://lore.kernel.org/r/c47d4bdd-9e05-c0de-bacb-3a262fed936d@gmail.com
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
Arnd Bergmann 2021-04-01 22:17:12 +02:00
commit 3e7f2f2980
12 changed files with 509 additions and 275 deletions

View File

@ -22,6 +22,7 @@ Required properties in pwrap device node.
"mediatek,mt6765-pwrap" for MT6765 SoCs "mediatek,mt6765-pwrap" for MT6765 SoCs
"mediatek,mt6779-pwrap" for MT6779 SoCs "mediatek,mt6779-pwrap" for MT6779 SoCs
"mediatek,mt6797-pwrap" for MT6797 SoCs "mediatek,mt6797-pwrap" for MT6797 SoCs
"mediatek,mt6873-pwrap" for MT6873/8192 SoCs
"mediatek,mt7622-pwrap" for MT7622 SoCs "mediatek,mt7622-pwrap" for MT7622 SoCs
"mediatek,mt8135-pwrap" for MT8135 SoCs "mediatek,mt8135-pwrap" for MT8135 SoCs
"mediatek,mt8173-pwrap" for MT8173 SoCs "mediatek,mt8173-pwrap" for MT8173 SoCs

View File

@ -15,6 +15,7 @@
static const struct scpsys_domain_data scpsys_domain_data_mt8167[] = { static const struct scpsys_domain_data scpsys_domain_data_mt8167[] = {
[MT8167_POWER_DOMAIN_MM] = { [MT8167_POWER_DOMAIN_MM] = {
.name = "mm",
.sta_mask = PWR_STATUS_DISP, .sta_mask = PWR_STATUS_DISP,
.ctl_offs = SPM_DIS_PWR_CON, .ctl_offs = SPM_DIS_PWR_CON,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
@ -26,6 +27,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8167[] = {
.caps = MTK_SCPD_ACTIVE_WAKEUP, .caps = MTK_SCPD_ACTIVE_WAKEUP,
}, },
[MT8167_POWER_DOMAIN_VDEC] = { [MT8167_POWER_DOMAIN_VDEC] = {
.name = "vdec",
.sta_mask = PWR_STATUS_VDEC, .sta_mask = PWR_STATUS_VDEC,
.ctl_offs = SPM_VDE_PWR_CON, .ctl_offs = SPM_VDE_PWR_CON,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -33,6 +35,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8167[] = {
.caps = MTK_SCPD_ACTIVE_WAKEUP, .caps = MTK_SCPD_ACTIVE_WAKEUP,
}, },
[MT8167_POWER_DOMAIN_ISP] = { [MT8167_POWER_DOMAIN_ISP] = {
.name = "isp",
.sta_mask = PWR_STATUS_ISP, .sta_mask = PWR_STATUS_ISP,
.ctl_offs = SPM_ISP_PWR_CON, .ctl_offs = SPM_ISP_PWR_CON,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
@ -40,6 +43,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8167[] = {
.caps = MTK_SCPD_ACTIVE_WAKEUP, .caps = MTK_SCPD_ACTIVE_WAKEUP,
}, },
[MT8167_POWER_DOMAIN_MFG_ASYNC] = { [MT8167_POWER_DOMAIN_MFG_ASYNC] = {
.name = "mfg_async",
.sta_mask = MT8167_PWR_STATUS_MFG_ASYNC, .sta_mask = MT8167_PWR_STATUS_MFG_ASYNC,
.ctl_offs = SPM_MFG_ASYNC_PWR_CON, .ctl_offs = SPM_MFG_ASYNC_PWR_CON,
.sram_pdn_bits = 0, .sram_pdn_bits = 0,
@ -50,18 +54,21 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8167[] = {
}, },
}, },
[MT8167_POWER_DOMAIN_MFG_2D] = { [MT8167_POWER_DOMAIN_MFG_2D] = {
.name = "mfg_2d",
.sta_mask = MT8167_PWR_STATUS_MFG_2D, .sta_mask = MT8167_PWR_STATUS_MFG_2D,
.ctl_offs = SPM_MFG_2D_PWR_CON, .ctl_offs = SPM_MFG_2D_PWR_CON,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
.sram_pdn_ack_bits = GENMASK(15, 12), .sram_pdn_ack_bits = GENMASK(15, 12),
}, },
[MT8167_POWER_DOMAIN_MFG] = { [MT8167_POWER_DOMAIN_MFG] = {
.name = "mfg",
.sta_mask = PWR_STATUS_MFG, .sta_mask = PWR_STATUS_MFG,
.ctl_offs = SPM_MFG_PWR_CON, .ctl_offs = SPM_MFG_PWR_CON,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
.sram_pdn_ack_bits = GENMASK(15, 12), .sram_pdn_ack_bits = GENMASK(15, 12),
}, },
[MT8167_POWER_DOMAIN_CONN] = { [MT8167_POWER_DOMAIN_CONN] = {
.name = "conn",
.sta_mask = PWR_STATUS_CONN, .sta_mask = PWR_STATUS_CONN,
.ctl_offs = SPM_CONN_PWR_CON, .ctl_offs = SPM_CONN_PWR_CON,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),

View File

@ -12,24 +12,28 @@
static const struct scpsys_domain_data scpsys_domain_data_mt8173[] = { static const struct scpsys_domain_data scpsys_domain_data_mt8173[] = {
[MT8173_POWER_DOMAIN_VDEC] = { [MT8173_POWER_DOMAIN_VDEC] = {
.name = "vdec",
.sta_mask = PWR_STATUS_VDEC, .sta_mask = PWR_STATUS_VDEC,
.ctl_offs = SPM_VDE_PWR_CON, .ctl_offs = SPM_VDE_PWR_CON,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
.sram_pdn_ack_bits = GENMASK(12, 12), .sram_pdn_ack_bits = GENMASK(12, 12),
}, },
[MT8173_POWER_DOMAIN_VENC] = { [MT8173_POWER_DOMAIN_VENC] = {
.name = "venc",
.sta_mask = PWR_STATUS_VENC, .sta_mask = PWR_STATUS_VENC,
.ctl_offs = SPM_VEN_PWR_CON, .ctl_offs = SPM_VEN_PWR_CON,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
.sram_pdn_ack_bits = GENMASK(15, 12), .sram_pdn_ack_bits = GENMASK(15, 12),
}, },
[MT8173_POWER_DOMAIN_ISP] = { [MT8173_POWER_DOMAIN_ISP] = {
.name = "isp",
.sta_mask = PWR_STATUS_ISP, .sta_mask = PWR_STATUS_ISP,
.ctl_offs = SPM_ISP_PWR_CON, .ctl_offs = SPM_ISP_PWR_CON,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
.sram_pdn_ack_bits = GENMASK(13, 12), .sram_pdn_ack_bits = GENMASK(13, 12),
}, },
[MT8173_POWER_DOMAIN_MM] = { [MT8173_POWER_DOMAIN_MM] = {
.name = "mm",
.sta_mask = PWR_STATUS_DISP, .sta_mask = PWR_STATUS_DISP,
.ctl_offs = SPM_DIS_PWR_CON, .ctl_offs = SPM_DIS_PWR_CON,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
@ -40,18 +44,21 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8173[] = {
}, },
}, },
[MT8173_POWER_DOMAIN_VENC_LT] = { [MT8173_POWER_DOMAIN_VENC_LT] = {
.name = "venc_lt",
.sta_mask = PWR_STATUS_VENC_LT, .sta_mask = PWR_STATUS_VENC_LT,
.ctl_offs = SPM_VEN2_PWR_CON, .ctl_offs = SPM_VEN2_PWR_CON,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
.sram_pdn_ack_bits = GENMASK(15, 12), .sram_pdn_ack_bits = GENMASK(15, 12),
}, },
[MT8173_POWER_DOMAIN_AUDIO] = { [MT8173_POWER_DOMAIN_AUDIO] = {
.name = "audio",
.sta_mask = PWR_STATUS_AUDIO, .sta_mask = PWR_STATUS_AUDIO,
.ctl_offs = SPM_AUDIO_PWR_CON, .ctl_offs = SPM_AUDIO_PWR_CON,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
.sram_pdn_ack_bits = GENMASK(15, 12), .sram_pdn_ack_bits = GENMASK(15, 12),
}, },
[MT8173_POWER_DOMAIN_USB] = { [MT8173_POWER_DOMAIN_USB] = {
.name = "usb",
.sta_mask = PWR_STATUS_USB, .sta_mask = PWR_STATUS_USB,
.ctl_offs = SPM_USB_PWR_CON, .ctl_offs = SPM_USB_PWR_CON,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
@ -59,18 +66,21 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8173[] = {
.caps = MTK_SCPD_ACTIVE_WAKEUP, .caps = MTK_SCPD_ACTIVE_WAKEUP,
}, },
[MT8173_POWER_DOMAIN_MFG_ASYNC] = { [MT8173_POWER_DOMAIN_MFG_ASYNC] = {
.name = "mfg_async",
.sta_mask = PWR_STATUS_MFG_ASYNC, .sta_mask = PWR_STATUS_MFG_ASYNC,
.ctl_offs = SPM_MFG_ASYNC_PWR_CON, .ctl_offs = SPM_MFG_ASYNC_PWR_CON,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
.sram_pdn_ack_bits = 0, .sram_pdn_ack_bits = 0,
}, },
[MT8173_POWER_DOMAIN_MFG_2D] = { [MT8173_POWER_DOMAIN_MFG_2D] = {
.name = "mfg_2d",
.sta_mask = PWR_STATUS_MFG_2D, .sta_mask = PWR_STATUS_MFG_2D,
.ctl_offs = SPM_MFG_2D_PWR_CON, .ctl_offs = SPM_MFG_2D_PWR_CON,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
.sram_pdn_ack_bits = GENMASK(13, 12), .sram_pdn_ack_bits = GENMASK(13, 12),
}, },
[MT8173_POWER_DOMAIN_MFG] = { [MT8173_POWER_DOMAIN_MFG] = {
.name = "mfg",
.sta_mask = PWR_STATUS_MFG, .sta_mask = PWR_STATUS_MFG,
.ctl_offs = SPM_MFG_PWR_CON, .ctl_offs = SPM_MFG_PWR_CON,
.sram_pdn_bits = GENMASK(13, 8), .sram_pdn_bits = GENMASK(13, 8),

View File

@ -0,0 +1,54 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef __SOC_MEDIATEK_MT8183_MMSYS_H
#define __SOC_MEDIATEK_MT8183_MMSYS_H
#define MT8183_DISP_OVL0_MOUT_EN 0xf00
#define MT8183_DISP_OVL0_2L_MOUT_EN 0xf04
#define MT8183_DISP_OVL1_2L_MOUT_EN 0xf08
#define MT8183_DISP_DITHER0_MOUT_EN 0xf0c
#define MT8183_DISP_PATH0_SEL_IN 0xf24
#define MT8183_DISP_DSI0_SEL_IN 0xf2c
#define MT8183_DISP_DPI0_SEL_IN 0xf30
#define MT8183_DISP_RDMA0_SOUT_SEL_IN 0xf50
#define MT8183_DISP_RDMA1_SOUT_SEL_IN 0xf54
#define MT8183_OVL0_MOUT_EN_OVL0_2L BIT(4)
#define MT8183_OVL0_2L_MOUT_EN_DISP_PATH0 BIT(0)
#define MT8183_OVL1_2L_MOUT_EN_RDMA1 BIT(4)
#define MT8183_DITHER0_MOUT_IN_DSI0 BIT(0)
#define MT8183_DISP_PATH0_SEL_IN_OVL0_2L 0x1
#define MT8183_DSI0_SEL_IN_RDMA0 0x1
#define MT8183_DSI0_SEL_IN_RDMA1 0x3
#define MT8183_DPI0_SEL_IN_RDMA0 0x1
#define MT8183_DPI0_SEL_IN_RDMA1 0x2
#define MT8183_RDMA0_SOUT_COLOR0 0x1
#define MT8183_RDMA1_SOUT_DSI0 0x1
static const struct mtk_mmsys_routes mmsys_mt8183_routing_table[] = {
{
DDP_COMPONENT_OVL0, DDP_COMPONENT_OVL_2L0,
MT8183_DISP_OVL0_MOUT_EN, MT8183_OVL0_MOUT_EN_OVL0_2L
}, {
DDP_COMPONENT_OVL_2L0, DDP_COMPONENT_RDMA0,
MT8183_DISP_OVL0_2L_MOUT_EN, MT8183_OVL0_2L_MOUT_EN_DISP_PATH0
}, {
DDP_COMPONENT_OVL_2L1, DDP_COMPONENT_RDMA1,
MT8183_DISP_OVL1_2L_MOUT_EN, MT8183_OVL1_2L_MOUT_EN_RDMA1
}, {
DDP_COMPONENT_DITHER, DDP_COMPONENT_DSI0,
MT8183_DISP_DITHER0_MOUT_EN, MT8183_DITHER0_MOUT_IN_DSI0
}, {
DDP_COMPONENT_OVL_2L0, DDP_COMPONENT_RDMA0,
MT8183_DISP_PATH0_SEL_IN, MT8183_DISP_PATH0_SEL_IN_OVL0_2L
}, {
DDP_COMPONENT_RDMA1, DDP_COMPONENT_DPI0,
MT8183_DISP_DPI0_SEL_IN, MT8183_DPI0_SEL_IN_RDMA1
}, {
DDP_COMPONENT_RDMA0, DDP_COMPONENT_COLOR0,
MT8183_DISP_RDMA0_SOUT_SEL_IN, MT8183_RDMA0_SOUT_COLOR0
}
};
#endif /* __SOC_MEDIATEK_MT8183_MMSYS_H */

View File

@ -12,12 +12,14 @@
static const struct scpsys_domain_data scpsys_domain_data_mt8183[] = { static const struct scpsys_domain_data scpsys_domain_data_mt8183[] = {
[MT8183_POWER_DOMAIN_AUDIO] = { [MT8183_POWER_DOMAIN_AUDIO] = {
.name = "audio",
.sta_mask = PWR_STATUS_AUDIO, .sta_mask = PWR_STATUS_AUDIO,
.ctl_offs = 0x0314, .ctl_offs = 0x0314,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
.sram_pdn_ack_bits = GENMASK(15, 12), .sram_pdn_ack_bits = GENMASK(15, 12),
}, },
[MT8183_POWER_DOMAIN_CONN] = { [MT8183_POWER_DOMAIN_CONN] = {
.name = "conn",
.sta_mask = PWR_STATUS_CONN, .sta_mask = PWR_STATUS_CONN,
.ctl_offs = 0x032c, .ctl_offs = 0x032c,
.sram_pdn_bits = 0, .sram_pdn_bits = 0,
@ -28,12 +30,14 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8183[] = {
}, },
}, },
[MT8183_POWER_DOMAIN_MFG_ASYNC] = { [MT8183_POWER_DOMAIN_MFG_ASYNC] = {
.name = "mfg_async",
.sta_mask = PWR_STATUS_MFG_ASYNC, .sta_mask = PWR_STATUS_MFG_ASYNC,
.ctl_offs = 0x0334, .ctl_offs = 0x0334,
.sram_pdn_bits = 0, .sram_pdn_bits = 0,
.sram_pdn_ack_bits = 0, .sram_pdn_ack_bits = 0,
}, },
[MT8183_POWER_DOMAIN_MFG] = { [MT8183_POWER_DOMAIN_MFG] = {
.name = "mfg",
.sta_mask = PWR_STATUS_MFG, .sta_mask = PWR_STATUS_MFG,
.ctl_offs = 0x0338, .ctl_offs = 0x0338,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -41,18 +45,21 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8183[] = {
.caps = MTK_SCPD_DOMAIN_SUPPLY, .caps = MTK_SCPD_DOMAIN_SUPPLY,
}, },
[MT8183_POWER_DOMAIN_MFG_CORE0] = { [MT8183_POWER_DOMAIN_MFG_CORE0] = {
.name = "mfg_core0",
.sta_mask = BIT(7), .sta_mask = BIT(7),
.ctl_offs = 0x034c, .ctl_offs = 0x034c,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
.sram_pdn_ack_bits = GENMASK(12, 12), .sram_pdn_ack_bits = GENMASK(12, 12),
}, },
[MT8183_POWER_DOMAIN_MFG_CORE1] = { [MT8183_POWER_DOMAIN_MFG_CORE1] = {
.name = "mfg_core1",
.sta_mask = BIT(20), .sta_mask = BIT(20),
.ctl_offs = 0x0310, .ctl_offs = 0x0310,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
.sram_pdn_ack_bits = GENMASK(12, 12), .sram_pdn_ack_bits = GENMASK(12, 12),
}, },
[MT8183_POWER_DOMAIN_MFG_2D] = { [MT8183_POWER_DOMAIN_MFG_2D] = {
.name = "mfg_2d",
.sta_mask = PWR_STATUS_MFG_2D, .sta_mask = PWR_STATUS_MFG_2D,
.ctl_offs = 0x0348, .ctl_offs = 0x0348,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -65,6 +72,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8183[] = {
}, },
}, },
[MT8183_POWER_DOMAIN_DISP] = { [MT8183_POWER_DOMAIN_DISP] = {
.name = "disp",
.sta_mask = PWR_STATUS_DISP, .sta_mask = PWR_STATUS_DISP,
.ctl_offs = 0x030c, .ctl_offs = 0x030c,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -83,6 +91,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8183[] = {
}, },
}, },
[MT8183_POWER_DOMAIN_CAM] = { [MT8183_POWER_DOMAIN_CAM] = {
.name = "cam",
.sta_mask = BIT(25), .sta_mask = BIT(25),
.ctl_offs = 0x0344, .ctl_offs = 0x0344,
.sram_pdn_bits = GENMASK(9, 8), .sram_pdn_bits = GENMASK(9, 8),
@ -105,6 +114,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8183[] = {
}, },
}, },
[MT8183_POWER_DOMAIN_ISP] = { [MT8183_POWER_DOMAIN_ISP] = {
.name = "isp",
.sta_mask = PWR_STATUS_ISP, .sta_mask = PWR_STATUS_ISP,
.ctl_offs = 0x0308, .ctl_offs = 0x0308,
.sram_pdn_bits = GENMASK(9, 8), .sram_pdn_bits = GENMASK(9, 8),
@ -127,6 +137,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8183[] = {
}, },
}, },
[MT8183_POWER_DOMAIN_VDEC] = { [MT8183_POWER_DOMAIN_VDEC] = {
.name = "vdec",
.sta_mask = BIT(31), .sta_mask = BIT(31),
.ctl_offs = 0x0300, .ctl_offs = 0x0300,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -139,6 +150,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8183[] = {
}, },
}, },
[MT8183_POWER_DOMAIN_VENC] = { [MT8183_POWER_DOMAIN_VENC] = {
.name = "venc",
.sta_mask = PWR_STATUS_VENC, .sta_mask = PWR_STATUS_VENC,
.ctl_offs = 0x0304, .ctl_offs = 0x0304,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
@ -151,6 +163,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8183[] = {
}, },
}, },
[MT8183_POWER_DOMAIN_VPU_TOP] = { [MT8183_POWER_DOMAIN_VPU_TOP] = {
.name = "vpu_top",
.sta_mask = BIT(26), .sta_mask = BIT(26),
.ctl_offs = 0x0324, .ctl_offs = 0x0324,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -177,6 +190,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8183[] = {
}, },
}, },
[MT8183_POWER_DOMAIN_VPU_CORE0] = { [MT8183_POWER_DOMAIN_VPU_CORE0] = {
.name = "vpu_core0",
.sta_mask = BIT(27), .sta_mask = BIT(27),
.ctl_offs = 0x33c, .ctl_offs = 0x33c,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),
@ -194,6 +208,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8183[] = {
.caps = MTK_SCPD_SRAM_ISO, .caps = MTK_SCPD_SRAM_ISO,
}, },
[MT8183_POWER_DOMAIN_VPU_CORE1] = { [MT8183_POWER_DOMAIN_VPU_CORE1] = {
.name = "vpu_core1",
.sta_mask = BIT(28), .sta_mask = BIT(28),
.ctl_offs = 0x0340, .ctl_offs = 0x0340,
.sram_pdn_bits = GENMASK(11, 8), .sram_pdn_bits = GENMASK(11, 8),

View File

@ -12,6 +12,7 @@
static const struct scpsys_domain_data scpsys_domain_data_mt8192[] = { static const struct scpsys_domain_data scpsys_domain_data_mt8192[] = {
[MT8192_POWER_DOMAIN_AUDIO] = { [MT8192_POWER_DOMAIN_AUDIO] = {
.name = "audio",
.sta_mask = BIT(21), .sta_mask = BIT(21),
.ctl_offs = 0x0354, .ctl_offs = 0x0354,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -24,6 +25,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8192[] = {
}, },
}, },
[MT8192_POWER_DOMAIN_CONN] = { [MT8192_POWER_DOMAIN_CONN] = {
.name = "conn",
.sta_mask = PWR_STATUS_CONN, .sta_mask = PWR_STATUS_CONN,
.ctl_offs = 0x0304, .ctl_offs = 0x0304,
.sram_pdn_bits = 0, .sram_pdn_bits = 0,
@ -45,12 +47,14 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8192[] = {
.caps = MTK_SCPD_KEEP_DEFAULT_OFF, .caps = MTK_SCPD_KEEP_DEFAULT_OFF,
}, },
[MT8192_POWER_DOMAIN_MFG0] = { [MT8192_POWER_DOMAIN_MFG0] = {
.name = "mfg0",
.sta_mask = BIT(2), .sta_mask = BIT(2),
.ctl_offs = 0x0308, .ctl_offs = 0x0308,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
.sram_pdn_ack_bits = GENMASK(12, 12), .sram_pdn_ack_bits = GENMASK(12, 12),
}, },
[MT8192_POWER_DOMAIN_MFG1] = { [MT8192_POWER_DOMAIN_MFG1] = {
.name = "mfg1",
.sta_mask = BIT(3), .sta_mask = BIT(3),
.ctl_offs = 0x030c, .ctl_offs = 0x030c,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -75,36 +79,42 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8192[] = {
}, },
}, },
[MT8192_POWER_DOMAIN_MFG2] = { [MT8192_POWER_DOMAIN_MFG2] = {
.name = "mfg2",
.sta_mask = BIT(4), .sta_mask = BIT(4),
.ctl_offs = 0x0310, .ctl_offs = 0x0310,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
.sram_pdn_ack_bits = GENMASK(12, 12), .sram_pdn_ack_bits = GENMASK(12, 12),
}, },
[MT8192_POWER_DOMAIN_MFG3] = { [MT8192_POWER_DOMAIN_MFG3] = {
.name = "mfg3",
.sta_mask = BIT(5), .sta_mask = BIT(5),
.ctl_offs = 0x0314, .ctl_offs = 0x0314,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
.sram_pdn_ack_bits = GENMASK(12, 12), .sram_pdn_ack_bits = GENMASK(12, 12),
}, },
[MT8192_POWER_DOMAIN_MFG4] = { [MT8192_POWER_DOMAIN_MFG4] = {
.name = "mfg4",
.sta_mask = BIT(6), .sta_mask = BIT(6),
.ctl_offs = 0x0318, .ctl_offs = 0x0318,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
.sram_pdn_ack_bits = GENMASK(12, 12), .sram_pdn_ack_bits = GENMASK(12, 12),
}, },
[MT8192_POWER_DOMAIN_MFG5] = { [MT8192_POWER_DOMAIN_MFG5] = {
.name = "mfg5",
.sta_mask = BIT(7), .sta_mask = BIT(7),
.ctl_offs = 0x031c, .ctl_offs = 0x031c,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
.sram_pdn_ack_bits = GENMASK(12, 12), .sram_pdn_ack_bits = GENMASK(12, 12),
}, },
[MT8192_POWER_DOMAIN_MFG6] = { [MT8192_POWER_DOMAIN_MFG6] = {
.name = "mfg6",
.sta_mask = BIT(8), .sta_mask = BIT(8),
.ctl_offs = 0x0320, .ctl_offs = 0x0320,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
.sram_pdn_ack_bits = GENMASK(12, 12), .sram_pdn_ack_bits = GENMASK(12, 12),
}, },
[MT8192_POWER_DOMAIN_DISP] = { [MT8192_POWER_DOMAIN_DISP] = {
.name = "disp",
.sta_mask = BIT(20), .sta_mask = BIT(20),
.ctl_offs = 0x0350, .ctl_offs = 0x0350,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -133,6 +143,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8192[] = {
}, },
}, },
[MT8192_POWER_DOMAIN_IPE] = { [MT8192_POWER_DOMAIN_IPE] = {
.name = "ipe",
.sta_mask = BIT(14), .sta_mask = BIT(14),
.ctl_offs = 0x0338, .ctl_offs = 0x0338,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -149,6 +160,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8192[] = {
}, },
}, },
[MT8192_POWER_DOMAIN_ISP] = { [MT8192_POWER_DOMAIN_ISP] = {
.name = "isp",
.sta_mask = BIT(12), .sta_mask = BIT(12),
.ctl_offs = 0x0330, .ctl_offs = 0x0330,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -165,6 +177,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8192[] = {
}, },
}, },
[MT8192_POWER_DOMAIN_ISP2] = { [MT8192_POWER_DOMAIN_ISP2] = {
.name = "isp2",
.sta_mask = BIT(13), .sta_mask = BIT(13),
.ctl_offs = 0x0334, .ctl_offs = 0x0334,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -181,6 +194,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8192[] = {
}, },
}, },
[MT8192_POWER_DOMAIN_MDP] = { [MT8192_POWER_DOMAIN_MDP] = {
.name = "mdp",
.sta_mask = BIT(19), .sta_mask = BIT(19),
.ctl_offs = 0x034c, .ctl_offs = 0x034c,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -197,6 +211,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8192[] = {
}, },
}, },
[MT8192_POWER_DOMAIN_VENC] = { [MT8192_POWER_DOMAIN_VENC] = {
.name = "venc",
.sta_mask = BIT(17), .sta_mask = BIT(17),
.ctl_offs = 0x0344, .ctl_offs = 0x0344,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -213,6 +228,7 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8192[] = {
}, },
}, },
[MT8192_POWER_DOMAIN_VDEC] = { [MT8192_POWER_DOMAIN_VDEC] = {
.name = "vdec",
.sta_mask = BIT(15), .sta_mask = BIT(15),
.ctl_offs = 0x033c, .ctl_offs = 0x033c,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -229,12 +245,14 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8192[] = {
}, },
}, },
[MT8192_POWER_DOMAIN_VDEC2] = { [MT8192_POWER_DOMAIN_VDEC2] = {
.name = "vdec2",
.sta_mask = BIT(16), .sta_mask = BIT(16),
.ctl_offs = 0x0340, .ctl_offs = 0x0340,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
.sram_pdn_ack_bits = GENMASK(12, 12), .sram_pdn_ack_bits = GENMASK(12, 12),
}, },
[MT8192_POWER_DOMAIN_CAM] = { [MT8192_POWER_DOMAIN_CAM] = {
.name = "cam",
.sta_mask = BIT(23), .sta_mask = BIT(23),
.ctl_offs = 0x035c, .ctl_offs = 0x035c,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
@ -263,18 +281,21 @@ static const struct scpsys_domain_data scpsys_domain_data_mt8192[] = {
}, },
}, },
[MT8192_POWER_DOMAIN_CAM_RAWA] = { [MT8192_POWER_DOMAIN_CAM_RAWA] = {
.name = "cam_rawa",
.sta_mask = BIT(24), .sta_mask = BIT(24),
.ctl_offs = 0x0360, .ctl_offs = 0x0360,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
.sram_pdn_ack_bits = GENMASK(12, 12), .sram_pdn_ack_bits = GENMASK(12, 12),
}, },
[MT8192_POWER_DOMAIN_CAM_RAWB] = { [MT8192_POWER_DOMAIN_CAM_RAWB] = {
.name = "cam_rawb",
.sta_mask = BIT(25), .sta_mask = BIT(25),
.ctl_offs = 0x0364, .ctl_offs = 0x0364,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),
.sram_pdn_ack_bits = GENMASK(12, 12), .sram_pdn_ack_bits = GENMASK(12, 12),
}, },
[MT8192_POWER_DOMAIN_CAM_RAWC] = { [MT8192_POWER_DOMAIN_CAM_RAWC] = {
.name = "cam_rawc",
.sta_mask = BIT(26), .sta_mask = BIT(26),
.ctl_offs = 0x0368, .ctl_offs = 0x0368,
.sram_pdn_bits = GENMASK(8, 8), .sram_pdn_bits = GENMASK(8, 8),

View File

@ -10,79 +10,19 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/soc/mediatek/mtk-mmsys.h> #include <linux/soc/mediatek/mtk-mmsys.h>
#define DISP_REG_CONFIG_DISP_OVL0_MOUT_EN 0x040 #include "mtk-mmsys.h"
#define DISP_REG_CONFIG_DISP_OVL1_MOUT_EN 0x044 #include "mt8183-mmsys.h"
#define DISP_REG_CONFIG_DISP_OD_MOUT_EN 0x048
#define DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN 0x04c
#define DISP_REG_CONFIG_DISP_UFOE_MOUT_EN 0x050
#define DISP_REG_CONFIG_DISP_COLOR0_SEL_IN 0x084
#define DISP_REG_CONFIG_DISP_COLOR1_SEL_IN 0x088
#define DISP_REG_CONFIG_DSIE_SEL_IN 0x0a4
#define DISP_REG_CONFIG_DSIO_SEL_IN 0x0a8
#define DISP_REG_CONFIG_DPI_SEL_IN 0x0ac
#define DISP_REG_CONFIG_DISP_RDMA2_SOUT 0x0b8
#define DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN 0x0c4
#define DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN 0x0c8
#define DISP_REG_CONFIG_MMSYS_CG_CON0 0x100
#define DISP_REG_CONFIG_DISP_OVL_MOUT_EN 0x030
#define DISP_REG_CONFIG_OUT_SEL 0x04c
#define DISP_REG_CONFIG_DSI_SEL 0x050
#define DISP_REG_CONFIG_DPI_SEL 0x064
#define OVL0_MOUT_EN_COLOR0 0x1
#define OD_MOUT_EN_RDMA0 0x1
#define OD1_MOUT_EN_RDMA1 BIT(16)
#define UFOE_MOUT_EN_DSI0 0x1
#define COLOR0_SEL_IN_OVL0 0x1
#define OVL1_MOUT_EN_COLOR1 0x1
#define GAMMA_MOUT_EN_RDMA1 0x1
#define RDMA0_SOUT_DPI0 0x2
#define RDMA0_SOUT_DPI1 0x3
#define RDMA0_SOUT_DSI1 0x1
#define RDMA0_SOUT_DSI2 0x4
#define RDMA0_SOUT_DSI3 0x5
#define RDMA1_SOUT_DPI0 0x2
#define RDMA1_SOUT_DPI1 0x3
#define RDMA1_SOUT_DSI1 0x1
#define RDMA1_SOUT_DSI2 0x4
#define RDMA1_SOUT_DSI3 0x5
#define RDMA2_SOUT_DPI0 0x2
#define RDMA2_SOUT_DPI1 0x3
#define RDMA2_SOUT_DSI1 0x1
#define RDMA2_SOUT_DSI2 0x4
#define RDMA2_SOUT_DSI3 0x5
#define DPI0_SEL_IN_RDMA1 0x1
#define DPI0_SEL_IN_RDMA2 0x3
#define DPI1_SEL_IN_RDMA1 (0x1 << 8)
#define DPI1_SEL_IN_RDMA2 (0x3 << 8)
#define DSI0_SEL_IN_RDMA1 0x1
#define DSI0_SEL_IN_RDMA2 0x4
#define DSI1_SEL_IN_RDMA1 0x1
#define DSI1_SEL_IN_RDMA2 0x4
#define DSI2_SEL_IN_RDMA1 (0x1 << 16)
#define DSI2_SEL_IN_RDMA2 (0x4 << 16)
#define DSI3_SEL_IN_RDMA1 (0x1 << 16)
#define DSI3_SEL_IN_RDMA2 (0x4 << 16)
#define COLOR1_SEL_IN_OVL1 0x1
#define OVL_MOUT_EN_RDMA 0x1
#define BLS_TO_DSI_RDMA1_TO_DPI1 0x8
#define BLS_TO_DPI_RDMA1_TO_DSI 0x2
#define DSI_SEL_IN_BLS 0x0
#define DPI_SEL_IN_BLS 0x0
#define DSI_SEL_IN_RDMA 0x1
struct mtk_mmsys_driver_data {
const char *clk_driver;
};
static const struct mtk_mmsys_driver_data mt2701_mmsys_driver_data = { static const struct mtk_mmsys_driver_data mt2701_mmsys_driver_data = {
.clk_driver = "clk-mt2701-mm", .clk_driver = "clk-mt2701-mm",
.routes = mmsys_default_routing_table,
.num_routes = ARRAY_SIZE(mmsys_default_routing_table),
}; };
static const struct mtk_mmsys_driver_data mt2712_mmsys_driver_data = { static const struct mtk_mmsys_driver_data mt2712_mmsys_driver_data = {
.clk_driver = "clk-mt2712-mm", .clk_driver = "clk-mt2712-mm",
.routes = mmsys_default_routing_table,
.num_routes = ARRAY_SIZE(mmsys_default_routing_table),
}; };
static const struct mtk_mmsys_driver_data mt6779_mmsys_driver_data = { static const struct mtk_mmsys_driver_data mt6779_mmsys_driver_data = {
@ -95,186 +35,35 @@ static const struct mtk_mmsys_driver_data mt6797_mmsys_driver_data = {
static const struct mtk_mmsys_driver_data mt8173_mmsys_driver_data = { static const struct mtk_mmsys_driver_data mt8173_mmsys_driver_data = {
.clk_driver = "clk-mt8173-mm", .clk_driver = "clk-mt8173-mm",
.routes = mmsys_default_routing_table,
.num_routes = ARRAY_SIZE(mmsys_default_routing_table),
}; };
static const struct mtk_mmsys_driver_data mt8183_mmsys_driver_data = { static const struct mtk_mmsys_driver_data mt8183_mmsys_driver_data = {
.clk_driver = "clk-mt8183-mm", .clk_driver = "clk-mt8183-mm",
.routes = mmsys_mt8183_routing_table,
.num_routes = ARRAY_SIZE(mmsys_mt8183_routing_table),
}; };
static unsigned int mtk_mmsys_ddp_mout_en(enum mtk_ddp_comp_id cur, struct mtk_mmsys {
enum mtk_ddp_comp_id next, void __iomem *regs;
unsigned int *addr) const struct mtk_mmsys_driver_data *data;
{ };
unsigned int value;
if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) {
*addr = DISP_REG_CONFIG_DISP_OVL0_MOUT_EN;
value = OVL0_MOUT_EN_COLOR0;
} else if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_RDMA0) {
*addr = DISP_REG_CONFIG_DISP_OVL_MOUT_EN;
value = OVL_MOUT_EN_RDMA;
} else if (cur == DDP_COMPONENT_OD0 && next == DDP_COMPONENT_RDMA0) {
*addr = DISP_REG_CONFIG_DISP_OD_MOUT_EN;
value = OD_MOUT_EN_RDMA0;
} else if (cur == DDP_COMPONENT_UFOE && next == DDP_COMPONENT_DSI0) {
*addr = DISP_REG_CONFIG_DISP_UFOE_MOUT_EN;
value = UFOE_MOUT_EN_DSI0;
} else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) {
*addr = DISP_REG_CONFIG_DISP_OVL1_MOUT_EN;
value = OVL1_MOUT_EN_COLOR1;
} else if (cur == DDP_COMPONENT_GAMMA && next == DDP_COMPONENT_RDMA1) {
*addr = DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN;
value = GAMMA_MOUT_EN_RDMA1;
} else if (cur == DDP_COMPONENT_OD1 && next == DDP_COMPONENT_RDMA1) {
*addr = DISP_REG_CONFIG_DISP_OD_MOUT_EN;
value = OD1_MOUT_EN_RDMA1;
} else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DPI0) {
*addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN;
value = RDMA0_SOUT_DPI0;
} else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DPI1) {
*addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN;
value = RDMA0_SOUT_DPI1;
} else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI1) {
*addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN;
value = RDMA0_SOUT_DSI1;
} else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI2) {
*addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN;
value = RDMA0_SOUT_DSI2;
} else if (cur == DDP_COMPONENT_RDMA0 && next == DDP_COMPONENT_DSI3) {
*addr = DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN;
value = RDMA0_SOUT_DSI3;
} else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI1) {
*addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN;
value = RDMA1_SOUT_DSI1;
} else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI2) {
*addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN;
value = RDMA1_SOUT_DSI2;
} else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI3) {
*addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN;
value = RDMA1_SOUT_DSI3;
} else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) {
*addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN;
value = RDMA1_SOUT_DPI0;
} else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI1) {
*addr = DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN;
value = RDMA1_SOUT_DPI1;
} else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI0) {
*addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT;
value = RDMA2_SOUT_DPI0;
} else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI1) {
*addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT;
value = RDMA2_SOUT_DPI1;
} else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI1) {
*addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT;
value = RDMA2_SOUT_DSI1;
} else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI2) {
*addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT;
value = RDMA2_SOUT_DSI2;
} else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI3) {
*addr = DISP_REG_CONFIG_DISP_RDMA2_SOUT;
value = RDMA2_SOUT_DSI3;
} else {
value = 0;
}
return value;
}
static unsigned int mtk_mmsys_ddp_sel_in(enum mtk_ddp_comp_id cur,
enum mtk_ddp_comp_id next,
unsigned int *addr)
{
unsigned int value;
if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) {
*addr = DISP_REG_CONFIG_DISP_COLOR0_SEL_IN;
value = COLOR0_SEL_IN_OVL0;
} else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) {
*addr = DISP_REG_CONFIG_DPI_SEL_IN;
value = DPI0_SEL_IN_RDMA1;
} else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI1) {
*addr = DISP_REG_CONFIG_DPI_SEL_IN;
value = DPI1_SEL_IN_RDMA1;
} else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI0) {
*addr = DISP_REG_CONFIG_DSIE_SEL_IN;
value = DSI0_SEL_IN_RDMA1;
} else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI1) {
*addr = DISP_REG_CONFIG_DSIO_SEL_IN;
value = DSI1_SEL_IN_RDMA1;
} else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI2) {
*addr = DISP_REG_CONFIG_DSIE_SEL_IN;
value = DSI2_SEL_IN_RDMA1;
} else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DSI3) {
*addr = DISP_REG_CONFIG_DSIO_SEL_IN;
value = DSI3_SEL_IN_RDMA1;
} else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI0) {
*addr = DISP_REG_CONFIG_DPI_SEL_IN;
value = DPI0_SEL_IN_RDMA2;
} else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DPI1) {
*addr = DISP_REG_CONFIG_DPI_SEL_IN;
value = DPI1_SEL_IN_RDMA2;
} else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI0) {
*addr = DISP_REG_CONFIG_DSIE_SEL_IN;
value = DSI0_SEL_IN_RDMA2;
} else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI1) {
*addr = DISP_REG_CONFIG_DSIO_SEL_IN;
value = DSI1_SEL_IN_RDMA2;
} else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI2) {
*addr = DISP_REG_CONFIG_DSIE_SEL_IN;
value = DSI2_SEL_IN_RDMA2;
} else if (cur == DDP_COMPONENT_RDMA2 && next == DDP_COMPONENT_DSI3) {
*addr = DISP_REG_CONFIG_DSIE_SEL_IN;
value = DSI3_SEL_IN_RDMA2;
} else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) {
*addr = DISP_REG_CONFIG_DISP_COLOR1_SEL_IN;
value = COLOR1_SEL_IN_OVL1;
} else if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DSI0) {
*addr = DISP_REG_CONFIG_DSI_SEL;
value = DSI_SEL_IN_BLS;
} else {
value = 0;
}
return value;
}
static void mtk_mmsys_ddp_sout_sel(void __iomem *config_regs,
enum mtk_ddp_comp_id cur,
enum mtk_ddp_comp_id next)
{
if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DSI0) {
writel_relaxed(BLS_TO_DSI_RDMA1_TO_DPI1,
config_regs + DISP_REG_CONFIG_OUT_SEL);
} else if (cur == DDP_COMPONENT_BLS && next == DDP_COMPONENT_DPI0) {
writel_relaxed(BLS_TO_DPI_RDMA1_TO_DSI,
config_regs + DISP_REG_CONFIG_OUT_SEL);
writel_relaxed(DSI_SEL_IN_RDMA,
config_regs + DISP_REG_CONFIG_DSI_SEL);
writel_relaxed(DPI_SEL_IN_BLS,
config_regs + DISP_REG_CONFIG_DPI_SEL);
}
}
void mtk_mmsys_ddp_connect(struct device *dev, void mtk_mmsys_ddp_connect(struct device *dev,
enum mtk_ddp_comp_id cur, enum mtk_ddp_comp_id cur,
enum mtk_ddp_comp_id next) enum mtk_ddp_comp_id next)
{ {
void __iomem *config_regs = dev_get_drvdata(dev); struct mtk_mmsys *mmsys = dev_get_drvdata(dev);
unsigned int addr, value, reg; const struct mtk_mmsys_routes *routes = mmsys->data->routes;
u32 reg;
int i;
value = mtk_mmsys_ddp_mout_en(cur, next, &addr); for (i = 0; i < mmsys->data->num_routes; i++)
if (value) { if (cur == routes[i].from_comp && next == routes[i].to_comp) {
reg = readl_relaxed(config_regs + addr) | value; reg = readl_relaxed(mmsys->regs + routes[i].addr) | routes[i].val;
writel_relaxed(reg, config_regs + addr); writel_relaxed(reg, mmsys->regs + routes[i].addr);
} }
mtk_mmsys_ddp_sout_sel(config_regs, cur, next);
value = mtk_mmsys_ddp_sel_in(cur, next, &addr);
if (value) {
reg = readl_relaxed(config_regs + addr) | value;
writel_relaxed(reg, config_regs + addr);
}
} }
EXPORT_SYMBOL_GPL(mtk_mmsys_ddp_connect); EXPORT_SYMBOL_GPL(mtk_mmsys_ddp_connect);
@ -282,44 +71,42 @@ void mtk_mmsys_ddp_disconnect(struct device *dev,
enum mtk_ddp_comp_id cur, enum mtk_ddp_comp_id cur,
enum mtk_ddp_comp_id next) enum mtk_ddp_comp_id next)
{ {
void __iomem *config_regs = dev_get_drvdata(dev); struct mtk_mmsys *mmsys = dev_get_drvdata(dev);
unsigned int addr, value, reg; const struct mtk_mmsys_routes *routes = mmsys->data->routes;
u32 reg;
int i;
value = mtk_mmsys_ddp_mout_en(cur, next, &addr); for (i = 0; i < mmsys->data->num_routes; i++)
if (value) { if (cur == routes[i].from_comp && next == routes[i].to_comp) {
reg = readl_relaxed(config_regs + addr) & ~value; reg = readl_relaxed(mmsys->regs + routes[i].addr) & ~routes[i].val;
writel_relaxed(reg, config_regs + addr); writel_relaxed(reg, mmsys->regs + routes[i].addr);
} }
value = mtk_mmsys_ddp_sel_in(cur, next, &addr);
if (value) {
reg = readl_relaxed(config_regs + addr) & ~value;
writel_relaxed(reg, config_regs + addr);
}
} }
EXPORT_SYMBOL_GPL(mtk_mmsys_ddp_disconnect); EXPORT_SYMBOL_GPL(mtk_mmsys_ddp_disconnect);
static int mtk_mmsys_probe(struct platform_device *pdev) static int mtk_mmsys_probe(struct platform_device *pdev)
{ {
const struct mtk_mmsys_driver_data *data;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct platform_device *clks; struct platform_device *clks;
struct platform_device *drm; struct platform_device *drm;
void __iomem *config_regs; struct mtk_mmsys *mmsys;
int ret; int ret;
config_regs = devm_platform_ioremap_resource(pdev, 0); mmsys = devm_kzalloc(dev, sizeof(*mmsys), GFP_KERNEL);
if (IS_ERR(config_regs)) { if (!mmsys)
ret = PTR_ERR(config_regs); return -ENOMEM;
mmsys->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(mmsys->regs)) {
ret = PTR_ERR(mmsys->regs);
dev_err(dev, "Failed to ioremap mmsys registers: %d\n", ret); dev_err(dev, "Failed to ioremap mmsys registers: %d\n", ret);
return ret; return ret;
} }
platform_set_drvdata(pdev, config_regs); mmsys->data = of_device_get_match_data(&pdev->dev);
platform_set_drvdata(pdev, mmsys);
data = of_device_get_match_data(&pdev->dev); clks = platform_device_register_data(&pdev->dev, mmsys->data->clk_driver,
clks = platform_device_register_data(&pdev->dev, data->clk_driver,
PLATFORM_DEVID_AUTO, NULL, 0); PLATFORM_DEVID_AUTO, NULL, 0);
if (IS_ERR(clks)) if (IS_ERR(clks))
return PTR_ERR(clks); return PTR_ERR(clks);

View File

@ -0,0 +1,215 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef __SOC_MEDIATEK_MTK_MMSYS_H
#define __SOC_MEDIATEK_MTK_MMSYS_H
#define DISP_REG_CONFIG_DISP_OVL0_MOUT_EN 0x040
#define DISP_REG_CONFIG_DISP_OVL1_MOUT_EN 0x044
#define DISP_REG_CONFIG_DISP_OD_MOUT_EN 0x048
#define DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN 0x04c
#define DISP_REG_CONFIG_DISP_UFOE_MOUT_EN 0x050
#define DISP_REG_CONFIG_DISP_COLOR0_SEL_IN 0x084
#define DISP_REG_CONFIG_DISP_COLOR1_SEL_IN 0x088
#define DISP_REG_CONFIG_DSIE_SEL_IN 0x0a4
#define DISP_REG_CONFIG_DSIO_SEL_IN 0x0a8
#define DISP_REG_CONFIG_DPI_SEL_IN 0x0ac
#define DISP_REG_CONFIG_DISP_RDMA2_SOUT 0x0b8
#define DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN 0x0c4
#define DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN 0x0c8
#define DISP_REG_CONFIG_MMSYS_CG_CON0 0x100
#define DISP_REG_CONFIG_DISP_OVL_MOUT_EN 0x030
#define DISP_REG_CONFIG_OUT_SEL 0x04c
#define DISP_REG_CONFIG_DSI_SEL 0x050
#define DISP_REG_CONFIG_DPI_SEL 0x064
#define OVL0_MOUT_EN_COLOR0 0x1
#define OD_MOUT_EN_RDMA0 0x1
#define OD1_MOUT_EN_RDMA1 BIT(16)
#define UFOE_MOUT_EN_DSI0 0x1
#define COLOR0_SEL_IN_OVL0 0x1
#define OVL1_MOUT_EN_COLOR1 0x1
#define GAMMA_MOUT_EN_RDMA1 0x1
#define RDMA0_SOUT_DPI0 0x2
#define RDMA0_SOUT_DPI1 0x3
#define RDMA0_SOUT_DSI1 0x1
#define RDMA0_SOUT_DSI2 0x4
#define RDMA0_SOUT_DSI3 0x5
#define RDMA1_SOUT_DPI0 0x2
#define RDMA1_SOUT_DPI1 0x3
#define RDMA1_SOUT_DSI1 0x1
#define RDMA1_SOUT_DSI2 0x4
#define RDMA1_SOUT_DSI3 0x5
#define RDMA2_SOUT_DPI0 0x2
#define RDMA2_SOUT_DPI1 0x3
#define RDMA2_SOUT_DSI1 0x1
#define RDMA2_SOUT_DSI2 0x4
#define RDMA2_SOUT_DSI3 0x5
#define DPI0_SEL_IN_RDMA1 0x1
#define DPI0_SEL_IN_RDMA2 0x3
#define DPI1_SEL_IN_RDMA1 (0x1 << 8)
#define DPI1_SEL_IN_RDMA2 (0x3 << 8)
#define DSI0_SEL_IN_RDMA1 0x1
#define DSI0_SEL_IN_RDMA2 0x4
#define DSI1_SEL_IN_RDMA1 0x1
#define DSI1_SEL_IN_RDMA2 0x4
#define DSI2_SEL_IN_RDMA1 (0x1 << 16)
#define DSI2_SEL_IN_RDMA2 (0x4 << 16)
#define DSI3_SEL_IN_RDMA1 (0x1 << 16)
#define DSI3_SEL_IN_RDMA2 (0x4 << 16)
#define COLOR1_SEL_IN_OVL1 0x1
#define OVL_MOUT_EN_RDMA 0x1
#define BLS_TO_DSI_RDMA1_TO_DPI1 0x8
#define BLS_TO_DPI_RDMA1_TO_DSI 0x2
#define DSI_SEL_IN_BLS 0x0
#define DPI_SEL_IN_BLS 0x0
#define DSI_SEL_IN_RDMA 0x1
struct mtk_mmsys_routes {
u32 from_comp;
u32 to_comp;
u32 addr;
u32 val;
};
struct mtk_mmsys_driver_data {
const char *clk_driver;
const struct mtk_mmsys_routes *routes;
const unsigned int num_routes;
};
/*
* Routes in mt8173, mt2701, mt2712 are different. That means
* in the same register address, it controls different input/output
* selection for each SoC. But, right now, they use the same table as
* default routes meet their requirements. But we don't have the complete
* route information for these three SoC, so just keep them in the same
* table. After we've more information, we could separate mt2701, mt2712
* to an independent table.
*/
static const struct mtk_mmsys_routes mmsys_default_routing_table[] = {
{
DDP_COMPONENT_BLS, DDP_COMPONENT_DSI0,
DISP_REG_CONFIG_OUT_SEL, BLS_TO_DSI_RDMA1_TO_DPI1
}, {
DDP_COMPONENT_BLS, DDP_COMPONENT_DSI0,
DISP_REG_CONFIG_DSI_SEL, DSI_SEL_IN_BLS
}, {
DDP_COMPONENT_BLS, DDP_COMPONENT_DPI0,
DISP_REG_CONFIG_OUT_SEL, BLS_TO_DPI_RDMA1_TO_DSI
}, {
DDP_COMPONENT_BLS, DDP_COMPONENT_DPI0,
DISP_REG_CONFIG_DSI_SEL, DSI_SEL_IN_RDMA
}, {
DDP_COMPONENT_BLS, DDP_COMPONENT_DPI0,
DISP_REG_CONFIG_DPI_SEL, DPI_SEL_IN_BLS
}, {
DDP_COMPONENT_GAMMA, DDP_COMPONENT_RDMA1,
DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN, GAMMA_MOUT_EN_RDMA1
}, {
DDP_COMPONENT_OD0, DDP_COMPONENT_RDMA0,
DISP_REG_CONFIG_DISP_OD_MOUT_EN, OD_MOUT_EN_RDMA0
}, {
DDP_COMPONENT_OD1, DDP_COMPONENT_RDMA1,
DISP_REG_CONFIG_DISP_OD_MOUT_EN, OD1_MOUT_EN_RDMA1
}, {
DDP_COMPONENT_OVL0, DDP_COMPONENT_COLOR0,
DISP_REG_CONFIG_DISP_OVL0_MOUT_EN, OVL0_MOUT_EN_COLOR0
}, {
DDP_COMPONENT_OVL0, DDP_COMPONENT_COLOR0,
DISP_REG_CONFIG_DISP_COLOR0_SEL_IN, COLOR0_SEL_IN_OVL0
}, {
DDP_COMPONENT_OVL0, DDP_COMPONENT_RDMA0,
DISP_REG_CONFIG_DISP_OVL_MOUT_EN, OVL_MOUT_EN_RDMA
}, {
DDP_COMPONENT_OVL1, DDP_COMPONENT_COLOR1,
DISP_REG_CONFIG_DISP_OVL1_MOUT_EN, OVL1_MOUT_EN_COLOR1
}, {
DDP_COMPONENT_OVL1, DDP_COMPONENT_COLOR1,
DISP_REG_CONFIG_DISP_COLOR1_SEL_IN, COLOR1_SEL_IN_OVL1
}, {
DDP_COMPONENT_RDMA0, DDP_COMPONENT_DPI0,
DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN, RDMA0_SOUT_DPI0
}, {
DDP_COMPONENT_RDMA0, DDP_COMPONENT_DPI1,
DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN, RDMA0_SOUT_DPI1
}, {
DDP_COMPONENT_RDMA0, DDP_COMPONENT_DSI1,
DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN, RDMA0_SOUT_DSI1
}, {
DDP_COMPONENT_RDMA0, DDP_COMPONENT_DSI2,
DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN, RDMA0_SOUT_DSI2
}, {
DDP_COMPONENT_RDMA0, DDP_COMPONENT_DSI3,
DISP_REG_CONFIG_DISP_RDMA0_SOUT_EN, RDMA0_SOUT_DSI3
}, {
DDP_COMPONENT_RDMA1, DDP_COMPONENT_DPI0,
DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN, RDMA1_SOUT_DPI0
}, {
DDP_COMPONENT_RDMA1, DDP_COMPONENT_DPI0,
DISP_REG_CONFIG_DPI_SEL_IN, DPI0_SEL_IN_RDMA1
}, {
DDP_COMPONENT_RDMA1, DDP_COMPONENT_DPI1,
DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN, RDMA1_SOUT_DPI1
}, {
DDP_COMPONENT_RDMA1, DDP_COMPONENT_DPI1,
DISP_REG_CONFIG_DPI_SEL_IN, DPI1_SEL_IN_RDMA1
}, {
DDP_COMPONENT_RDMA1, DDP_COMPONENT_DSI0,
DISP_REG_CONFIG_DSIE_SEL_IN, DSI0_SEL_IN_RDMA1
}, {
DDP_COMPONENT_RDMA1, DDP_COMPONENT_DSI1,
DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN, RDMA1_SOUT_DSI1
}, {
DDP_COMPONENT_RDMA1, DDP_COMPONENT_DSI1,
DISP_REG_CONFIG_DSIO_SEL_IN, DSI1_SEL_IN_RDMA1
}, {
DDP_COMPONENT_RDMA1, DDP_COMPONENT_DSI2,
DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN, RDMA1_SOUT_DSI2
}, {
DDP_COMPONENT_RDMA1, DDP_COMPONENT_DSI2,
DISP_REG_CONFIG_DSIE_SEL_IN, DSI2_SEL_IN_RDMA1
}, {
DDP_COMPONENT_RDMA1, DDP_COMPONENT_DSI3,
DISP_REG_CONFIG_DISP_RDMA1_SOUT_EN, RDMA1_SOUT_DSI3
}, {
DDP_COMPONENT_RDMA1, DDP_COMPONENT_DSI3,
DISP_REG_CONFIG_DSIO_SEL_IN, DSI3_SEL_IN_RDMA1
}, {
DDP_COMPONENT_RDMA2, DDP_COMPONENT_DPI0,
DISP_REG_CONFIG_DISP_RDMA2_SOUT, RDMA2_SOUT_DPI0
}, {
DDP_COMPONENT_RDMA2, DDP_COMPONENT_DPI0,
DISP_REG_CONFIG_DPI_SEL_IN, DPI0_SEL_IN_RDMA2
}, {
DDP_COMPONENT_RDMA2, DDP_COMPONENT_DPI1,
DISP_REG_CONFIG_DISP_RDMA2_SOUT, RDMA2_SOUT_DPI1
}, {
DDP_COMPONENT_RDMA2, DDP_COMPONENT_DPI1,
DISP_REG_CONFIG_DPI_SEL_IN, DPI1_SEL_IN_RDMA2
}, {
DDP_COMPONENT_RDMA2, DDP_COMPONENT_DSI0,
DISP_REG_CONFIG_DSIE_SEL_IN, DSI0_SEL_IN_RDMA2
}, {
DDP_COMPONENT_RDMA2, DDP_COMPONENT_DSI1,
DISP_REG_CONFIG_DISP_RDMA2_SOUT, RDMA2_SOUT_DSI1
}, {
DDP_COMPONENT_RDMA2, DDP_COMPONENT_DSI1,
DISP_REG_CONFIG_DSIO_SEL_IN, DSI1_SEL_IN_RDMA2
}, {
DDP_COMPONENT_RDMA2, DDP_COMPONENT_DSI2,
DISP_REG_CONFIG_DISP_RDMA2_SOUT, RDMA2_SOUT_DSI2
}, {
DDP_COMPONENT_RDMA2, DDP_COMPONENT_DSI2,
DISP_REG_CONFIG_DSIE_SEL_IN, DSI2_SEL_IN_RDMA2
}, {
DDP_COMPONENT_RDMA2, DDP_COMPONENT_DSI3,
DISP_REG_CONFIG_DISP_RDMA2_SOUT, RDMA2_SOUT_DSI3
}, {
DDP_COMPONENT_RDMA2, DDP_COMPONENT_DSI3,
DISP_REG_CONFIG_DSIO_SEL_IN, DSI3_SEL_IN_RDMA2
}
};
#endif /* __SOC_MEDIATEK_MTK_MMSYS_H */

View File

@ -14,6 +14,8 @@
#define MT2701_MUTEX0_MOD0 0x2c #define MT2701_MUTEX0_MOD0 0x2c
#define MT2701_MUTEX0_SOF0 0x30 #define MT2701_MUTEX0_SOF0 0x30
#define MT8183_MUTEX0_MOD0 0x30
#define MT8183_MUTEX0_SOF0 0x2c
#define DISP_REG_MUTEX_EN(n) (0x20 + 0x20 * (n)) #define DISP_REG_MUTEX_EN(n) (0x20 + 0x20 * (n))
#define DISP_REG_MUTEX(n) (0x24 + 0x20 * (n)) #define DISP_REG_MUTEX(n) (0x24 + 0x20 * (n))
@ -37,6 +39,18 @@
#define MT8167_MUTEX_MOD_DISP_DITHER 15 #define MT8167_MUTEX_MOD_DISP_DITHER 15
#define MT8167_MUTEX_MOD_DISP_UFOE 16 #define MT8167_MUTEX_MOD_DISP_UFOE 16
#define MT8183_MUTEX_MOD_DISP_RDMA0 0
#define MT8183_MUTEX_MOD_DISP_RDMA1 1
#define MT8183_MUTEX_MOD_DISP_OVL0 9
#define MT8183_MUTEX_MOD_DISP_OVL0_2L 10
#define MT8183_MUTEX_MOD_DISP_OVL1_2L 11
#define MT8183_MUTEX_MOD_DISP_WDMA0 12
#define MT8183_MUTEX_MOD_DISP_COLOR0 13
#define MT8183_MUTEX_MOD_DISP_CCORR0 14
#define MT8183_MUTEX_MOD_DISP_AAL0 15
#define MT8183_MUTEX_MOD_DISP_GAMMA0 16
#define MT8183_MUTEX_MOD_DISP_DITHER0 17
#define MT8173_MUTEX_MOD_DISP_OVL0 11 #define MT8173_MUTEX_MOD_DISP_OVL0 11
#define MT8173_MUTEX_MOD_DISP_OVL1 12 #define MT8173_MUTEX_MOD_DISP_OVL1 12
#define MT8173_MUTEX_MOD_DISP_RDMA0 13 #define MT8173_MUTEX_MOD_DISP_RDMA0 13
@ -87,6 +101,11 @@
#define MT2712_MUTEX_SOF_DSI3 6 #define MT2712_MUTEX_SOF_DSI3 6
#define MT8167_MUTEX_SOF_DPI0 2 #define MT8167_MUTEX_SOF_DPI0 2
#define MT8167_MUTEX_SOF_DPI1 3 #define MT8167_MUTEX_SOF_DPI1 3
#define MT8183_MUTEX_SOF_DSI0 1
#define MT8183_MUTEX_SOF_DPI0 2
#define MT8183_MUTEX_EOF_DSI0 (MT8183_MUTEX_SOF_DSI0 << 6)
#define MT8183_MUTEX_EOF_DPI0 (MT8183_MUTEX_SOF_DPI0 << 6)
struct mtk_mutex { struct mtk_mutex {
int id; int id;
@ -181,6 +200,20 @@ static const unsigned int mt8173_mutex_mod[DDP_COMPONENT_ID_MAX] = {
[DDP_COMPONENT_WDMA1] = MT8173_MUTEX_MOD_DISP_WDMA1, [DDP_COMPONENT_WDMA1] = MT8173_MUTEX_MOD_DISP_WDMA1,
}; };
static const unsigned int mt8183_mutex_mod[DDP_COMPONENT_ID_MAX] = {
[DDP_COMPONENT_AAL0] = MT8183_MUTEX_MOD_DISP_AAL0,
[DDP_COMPONENT_CCORR] = MT8183_MUTEX_MOD_DISP_CCORR0,
[DDP_COMPONENT_COLOR0] = MT8183_MUTEX_MOD_DISP_COLOR0,
[DDP_COMPONENT_DITHER] = MT8183_MUTEX_MOD_DISP_DITHER0,
[DDP_COMPONENT_GAMMA] = MT8183_MUTEX_MOD_DISP_GAMMA0,
[DDP_COMPONENT_OVL0] = MT8183_MUTEX_MOD_DISP_OVL0,
[DDP_COMPONENT_OVL_2L0] = MT8183_MUTEX_MOD_DISP_OVL0_2L,
[DDP_COMPONENT_OVL_2L1] = MT8183_MUTEX_MOD_DISP_OVL1_2L,
[DDP_COMPONENT_RDMA0] = MT8183_MUTEX_MOD_DISP_RDMA0,
[DDP_COMPONENT_RDMA1] = MT8183_MUTEX_MOD_DISP_RDMA1,
[DDP_COMPONENT_WDMA0] = MT8183_MUTEX_MOD_DISP_WDMA0,
};
static const unsigned int mt2712_mutex_sof[MUTEX_SOF_DSI3 + 1] = { static const unsigned int mt2712_mutex_sof[MUTEX_SOF_DSI3 + 1] = {
[MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE, [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
[MUTEX_SOF_DSI0] = MUTEX_SOF_DSI0, [MUTEX_SOF_DSI0] = MUTEX_SOF_DSI0,
@ -198,6 +231,13 @@ static const unsigned int mt8167_mutex_sof[MUTEX_SOF_DSI3 + 1] = {
[MUTEX_SOF_DPI1] = MT8167_MUTEX_SOF_DPI1, [MUTEX_SOF_DPI1] = MT8167_MUTEX_SOF_DPI1,
}; };
/* Add EOF setting so overlay hardware can receive frame done irq */
static const unsigned int mt8183_mutex_sof[MUTEX_SOF_DSI3 + 1] = {
[MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE,
[MUTEX_SOF_DSI0] = MUTEX_SOF_DSI0 | MT8183_MUTEX_EOF_DSI0,
[MUTEX_SOF_DPI0] = MT8183_MUTEX_SOF_DPI0 | MT8183_MUTEX_EOF_DPI0,
};
static const struct mtk_mutex_data mt2701_mutex_driver_data = { static const struct mtk_mutex_data mt2701_mutex_driver_data = {
.mutex_mod = mt2701_mutex_mod, .mutex_mod = mt2701_mutex_mod,
.mutex_sof = mt2712_mutex_sof, .mutex_sof = mt2712_mutex_sof,
@ -227,6 +267,14 @@ static const struct mtk_mutex_data mt8173_mutex_driver_data = {
.mutex_sof_reg = MT2701_MUTEX0_SOF0, .mutex_sof_reg = MT2701_MUTEX0_SOF0,
}; };
static const struct mtk_mutex_data mt8183_mutex_driver_data = {
.mutex_mod = mt8183_mutex_mod,
.mutex_sof = mt8183_mutex_sof,
.mutex_mod_reg = MT8183_MUTEX0_MOD0,
.mutex_sof_reg = MT8183_MUTEX0_SOF0,
.no_clk = true,
};
struct mtk_mutex *mtk_mutex_get(struct device *dev) struct mtk_mutex *mtk_mutex_get(struct device *dev)
{ {
struct mtk_mutex_ctx *mtx = dev_get_drvdata(dev); struct mtk_mutex_ctx *mtx = dev_get_drvdata(dev);
@ -457,11 +505,13 @@ static const struct of_device_id mutex_driver_dt_match[] = {
.data = &mt8167_mutex_driver_data}, .data = &mt8167_mutex_driver_data},
{ .compatible = "mediatek,mt8173-disp-mutex", { .compatible = "mediatek,mt8173-disp-mutex",
.data = &mt8173_mutex_driver_data}, .data = &mt8173_mutex_driver_data},
{ .compatible = "mediatek,mt8183-disp-mutex",
.data = &mt8183_mutex_driver_data},
{}, {},
}; };
MODULE_DEVICE_TABLE(of, mutex_driver_dt_match); MODULE_DEVICE_TABLE(of, mutex_driver_dt_match);
struct platform_driver mtk_mutex_driver = { static struct platform_driver mtk_mutex_driver = {
.probe = mtk_mutex_probe, .probe = mtk_mutex_probe,
.remove = mtk_mutex_remove, .remove = mtk_mutex_remove,
.driver = { .driver = {

View File

@ -438,7 +438,11 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no
goto err_unprepare_subsys_clocks; goto err_unprepare_subsys_clocks;
} }
pd->genpd.name = node->name; if (!pd->data->name)
pd->genpd.name = node->name;
else
pd->genpd.name = pd->data->name;
pd->genpd.power_off = scpsys_power_off; pd->genpd.power_off = scpsys_power_off;
pd->genpd.power_on = scpsys_power_on; pd->genpd.power_on = scpsys_power_on;
@ -487,8 +491,9 @@ static int scpsys_add_subdomain(struct scpsys *scpsys, struct device_node *paren
child_pd = scpsys_add_one_domain(scpsys, child); child_pd = scpsys_add_one_domain(scpsys, child);
if (IS_ERR(child_pd)) { if (IS_ERR(child_pd)) {
dev_err_probe(scpsys->dev, PTR_ERR(child_pd), ret = PTR_ERR(child_pd);
"%pOF: failed to get child domain id\n", child); dev_err_probe(scpsys->dev, ret, "%pOF: failed to get child domain id\n",
child);
goto err_put_node; goto err_put_node;
} }

View File

@ -76,6 +76,7 @@ struct scpsys_bus_prot_data {
/** /**
* struct scpsys_domain_data - scp domain data for power on/off flow * struct scpsys_domain_data - scp domain data for power on/off flow
* @name: The name of the power domain.
* @sta_mask: The mask for power on/off status bit. * @sta_mask: The mask for power on/off status bit.
* @ctl_offs: The offset for main power control register. * @ctl_offs: The offset for main power control register.
* @sram_pdn_bits: The mask for sram power control bits. * @sram_pdn_bits: The mask for sram power control bits.
@ -85,6 +86,7 @@ struct scpsys_bus_prot_data {
* @bp_smi: bus protection for smi subsystem * @bp_smi: bus protection for smi subsystem
*/ */
struct scpsys_domain_data { struct scpsys_domain_data {
const char *name;
u32 sta_mask; u32 sta_mask;
int ctl_offs; int ctl_offs;
u32 sram_pdn_bits; u32 sram_pdn_bits;

View File

@ -25,10 +25,12 @@
/* macro for wrapper status */ /* macro for wrapper status */
#define PWRAP_GET_WACS_RDATA(x) (((x) >> 0) & 0x0000ffff) #define PWRAP_GET_WACS_RDATA(x) (((x) >> 0) & 0x0000ffff)
#define PWRAP_GET_WACS_ARB_FSM(x) (((x) >> 1) & 0x00000007)
#define PWRAP_GET_WACS_FSM(x) (((x) >> 16) & 0x00000007) #define PWRAP_GET_WACS_FSM(x) (((x) >> 16) & 0x00000007)
#define PWRAP_GET_WACS_REQ(x) (((x) >> 19) & 0x00000001) #define PWRAP_GET_WACS_REQ(x) (((x) >> 19) & 0x00000001)
#define PWRAP_STATE_SYNC_IDLE0 (1 << 20) #define PWRAP_STATE_SYNC_IDLE0 BIT(20)
#define PWRAP_STATE_INIT_DONE0 (1 << 21) #define PWRAP_STATE_INIT_DONE0 BIT(21)
#define PWRAP_STATE_INIT_DONE1 BIT(15)
/* macro for WACS FSM */ /* macro for WACS FSM */
#define PWRAP_WACS_FSM_IDLE 0x00 #define PWRAP_WACS_FSM_IDLE 0x00
@ -74,6 +76,7 @@
#define PWRAP_CAP_DCM BIT(2) #define PWRAP_CAP_DCM BIT(2)
#define PWRAP_CAP_INT1_EN BIT(3) #define PWRAP_CAP_INT1_EN BIT(3)
#define PWRAP_CAP_WDT_SRC1 BIT(4) #define PWRAP_CAP_WDT_SRC1 BIT(4)
#define PWRAP_CAP_ARB BIT(5)
/* defines for slave device wrapper registers */ /* defines for slave device wrapper registers */
enum dew_regs { enum dew_regs {
@ -340,6 +343,8 @@ enum pwrap_regs {
PWRAP_DCM_DBC_PRD, PWRAP_DCM_DBC_PRD,
PWRAP_EINT_STA0_ADR, PWRAP_EINT_STA0_ADR,
PWRAP_EINT_STA1_ADR, PWRAP_EINT_STA1_ADR,
PWRAP_SWINF_2_WDATA_31_0,
PWRAP_SWINF_2_RDATA_31_0,
/* MT2701 only regs */ /* MT2701 only regs */
PWRAP_ADC_CMD_ADDR, PWRAP_ADC_CMD_ADDR,
@ -627,6 +632,17 @@ static int mt6797_regs[] = {
[PWRAP_DCM_DBC_PRD] = 0x1D4, [PWRAP_DCM_DBC_PRD] = 0x1D4,
}; };
static int mt6873_regs[] = {
[PWRAP_INIT_DONE2] = 0x0,
[PWRAP_TIMER_EN] = 0x3E0,
[PWRAP_INT_EN] = 0x448,
[PWRAP_WACS2_CMD] = 0xC80,
[PWRAP_SWINF_2_WDATA_31_0] = 0xC84,
[PWRAP_SWINF_2_RDATA_31_0] = 0xC94,
[PWRAP_WACS2_VLDCLR] = 0xCA4,
[PWRAP_WACS2_RDATA] = 0xCA8,
};
static int mt7622_regs[] = { static int mt7622_regs[] = {
[PWRAP_MUX_SEL] = 0x0, [PWRAP_MUX_SEL] = 0x0,
[PWRAP_WRAP_EN] = 0x4, [PWRAP_WRAP_EN] = 0x4,
@ -1045,6 +1061,7 @@ enum pwrap_type {
PWRAP_MT6765, PWRAP_MT6765,
PWRAP_MT6779, PWRAP_MT6779,
PWRAP_MT6797, PWRAP_MT6797,
PWRAP_MT6873,
PWRAP_MT7622, PWRAP_MT7622,
PWRAP_MT8135, PWRAP_MT8135,
PWRAP_MT8173, PWRAP_MT8173,
@ -1106,18 +1123,25 @@ static void pwrap_writel(struct pmic_wrapper *wrp, u32 val, enum pwrap_regs reg)
writel(val, wrp->base + wrp->master->regs[reg]); writel(val, wrp->base + wrp->master->regs[reg]);
} }
static u32 pwrap_get_fsm_state(struct pmic_wrapper *wrp)
{
u32 val;
val = pwrap_readl(wrp, PWRAP_WACS2_RDATA);
if (HAS_CAP(wrp->master->caps, PWRAP_CAP_ARB))
return PWRAP_GET_WACS_ARB_FSM(val);
else
return PWRAP_GET_WACS_FSM(val);
}
static bool pwrap_is_fsm_idle(struct pmic_wrapper *wrp) static bool pwrap_is_fsm_idle(struct pmic_wrapper *wrp)
{ {
u32 val = pwrap_readl(wrp, PWRAP_WACS2_RDATA); return pwrap_get_fsm_state(wrp) == PWRAP_WACS_FSM_IDLE;
return PWRAP_GET_WACS_FSM(val) == PWRAP_WACS_FSM_IDLE;
} }
static bool pwrap_is_fsm_vldclr(struct pmic_wrapper *wrp) static bool pwrap_is_fsm_vldclr(struct pmic_wrapper *wrp)
{ {
u32 val = pwrap_readl(wrp, PWRAP_WACS2_RDATA); return pwrap_get_fsm_state(wrp) == PWRAP_WACS_FSM_WFVLDCLR;
return PWRAP_GET_WACS_FSM(val) == PWRAP_WACS_FSM_WFVLDCLR;
} }
/* /*
@ -1165,6 +1189,7 @@ static int pwrap_wait_for_state(struct pmic_wrapper *wrp,
static int pwrap_read16(struct pmic_wrapper *wrp, u32 adr, u32 *rdata) static int pwrap_read16(struct pmic_wrapper *wrp, u32 adr, u32 *rdata)
{ {
int ret; int ret;
u32 val;
ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle); ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle);
if (ret) { if (ret) {
@ -1172,13 +1197,21 @@ static int pwrap_read16(struct pmic_wrapper *wrp, u32 adr, u32 *rdata)
return ret; return ret;
} }
pwrap_writel(wrp, (adr >> 1) << 16, PWRAP_WACS2_CMD); if (HAS_CAP(wrp->master->caps, PWRAP_CAP_ARB))
val = adr;
else
val = (adr >> 1) << 16;
pwrap_writel(wrp, val, PWRAP_WACS2_CMD);
ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_vldclr); ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_vldclr);
if (ret) if (ret)
return ret; return ret;
*rdata = PWRAP_GET_WACS_RDATA(pwrap_readl(wrp, PWRAP_WACS2_RDATA)); if (HAS_CAP(wrp->master->caps, PWRAP_CAP_ARB))
val = pwrap_readl(wrp, PWRAP_SWINF_2_RDATA_31_0);
else
val = pwrap_readl(wrp, PWRAP_WACS2_RDATA);
*rdata = PWRAP_GET_WACS_RDATA(val);
pwrap_writel(wrp, 1, PWRAP_WACS2_VLDCLR); pwrap_writel(wrp, 1, PWRAP_WACS2_VLDCLR);
@ -1228,8 +1261,13 @@ static int pwrap_write16(struct pmic_wrapper *wrp, u32 adr, u32 wdata)
return ret; return ret;
} }
pwrap_writel(wrp, (1 << 31) | ((adr >> 1) << 16) | wdata, if (HAS_CAP(wrp->master->caps, PWRAP_CAP_ARB)) {
PWRAP_WACS2_CMD); pwrap_writel(wrp, wdata, PWRAP_SWINF_2_WDATA_31_0);
pwrap_writel(wrp, BIT(29) | adr, PWRAP_WACS2_CMD);
} else {
pwrap_writel(wrp, BIT(31) | ((adr >> 1) << 16) | wdata,
PWRAP_WACS2_CMD);
}
return 0; return 0;
} }
@ -1485,6 +1523,7 @@ static int pwrap_init_cipher(struct pmic_wrapper *wrp)
case PWRAP_MT7622: case PWRAP_MT7622:
pwrap_writel(wrp, 0, PWRAP_CIPHER_EN); pwrap_writel(wrp, 0, PWRAP_CIPHER_EN);
break; break;
case PWRAP_MT6873:
case PWRAP_MT8183: case PWRAP_MT8183:
break; break;
} }
@ -1921,6 +1960,19 @@ static const struct pmic_wrapper_type pwrap_mt6797 = {
.init_soc_specific = NULL, .init_soc_specific = NULL,
}; };
static const struct pmic_wrapper_type pwrap_mt6873 = {
.regs = mt6873_regs,
.type = PWRAP_MT6873,
.arb_en_all = 0x777f,
.int_en_all = BIT(4) | BIT(5),
.int1_en_all = 0,
.spi_w = PWRAP_MAN_CMD_SPI_WRITE,
.wdt_src = PWRAP_WDT_SRC_MASK_ALL,
.caps = PWRAP_CAP_ARB,
.init_reg_clock = pwrap_common_init_reg_clock,
.init_soc_specific = NULL,
};
static const struct pmic_wrapper_type pwrap_mt7622 = { static const struct pmic_wrapper_type pwrap_mt7622 = {
.regs = mt7622_regs, .regs = mt7622_regs,
.type = PWRAP_MT7622, .type = PWRAP_MT7622,
@ -1998,6 +2050,9 @@ static const struct of_device_id of_pwrap_match_tbl[] = {
}, { }, {
.compatible = "mediatek,mt6797-pwrap", .compatible = "mediatek,mt6797-pwrap",
.data = &pwrap_mt6797, .data = &pwrap_mt6797,
}, {
.compatible = "mediatek,mt6873-pwrap",
.data = &pwrap_mt6873,
}, { }, {
.compatible = "mediatek,mt7622-pwrap", .compatible = "mediatek,mt7622-pwrap",
.data = &pwrap_mt7622, .data = &pwrap_mt7622,
@ -2022,6 +2077,7 @@ MODULE_DEVICE_TABLE(of, of_pwrap_match_tbl);
static int pwrap_probe(struct platform_device *pdev) static int pwrap_probe(struct platform_device *pdev)
{ {
int ret, irq; int ret, irq;
u32 mask_done;
struct pmic_wrapper *wrp; struct pmic_wrapper *wrp;
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
const struct of_device_id *of_slave_id = NULL; const struct of_device_id *of_slave_id = NULL;
@ -2116,14 +2172,21 @@ static int pwrap_probe(struct platform_device *pdev)
} }
} }
if (!(pwrap_readl(wrp, PWRAP_WACS2_RDATA) & PWRAP_STATE_INIT_DONE0)) { if (HAS_CAP(wrp->master->caps, PWRAP_CAP_ARB))
mask_done = PWRAP_STATE_INIT_DONE1;
else
mask_done = PWRAP_STATE_INIT_DONE0;
if (!(pwrap_readl(wrp, PWRAP_WACS2_RDATA) & mask_done)) {
dev_dbg(wrp->dev, "initialization isn't finished\n"); dev_dbg(wrp->dev, "initialization isn't finished\n");
ret = -ENODEV; ret = -ENODEV;
goto err_out2; goto err_out2;
} }
/* Initialize watchdog, may not be done by the bootloader */ /* Initialize watchdog, may not be done by the bootloader */
pwrap_writel(wrp, 0xf, PWRAP_WDT_UNIT); if (!HAS_CAP(wrp->master->caps, PWRAP_CAP_ARB))
pwrap_writel(wrp, 0xf, PWRAP_WDT_UNIT);
/* /*
* Since STAUPD was not used on mt8173 platform, * Since STAUPD was not used on mt8173 platform,
* so STAUPD of WDT_SRC which should be turned off * so STAUPD of WDT_SRC which should be turned off
@ -2132,7 +2195,11 @@ static int pwrap_probe(struct platform_device *pdev)
if (HAS_CAP(wrp->master->caps, PWRAP_CAP_WDT_SRC1)) if (HAS_CAP(wrp->master->caps, PWRAP_CAP_WDT_SRC1))
pwrap_writel(wrp, wrp->master->wdt_src, PWRAP_WDT_SRC_EN_1); pwrap_writel(wrp, wrp->master->wdt_src, PWRAP_WDT_SRC_EN_1);
pwrap_writel(wrp, 0x1, PWRAP_TIMER_EN); if (HAS_CAP(wrp->master->caps, PWRAP_CAP_ARB))
pwrap_writel(wrp, 0x3, PWRAP_TIMER_EN);
else
pwrap_writel(wrp, 0x1, PWRAP_TIMER_EN);
pwrap_writel(wrp, wrp->master->int_en_all, PWRAP_INT_EN); pwrap_writel(wrp, wrp->master->int_en_all, PWRAP_INT_EN);
/* /*
* We add INT1 interrupt to handle starvation and request exception * We add INT1 interrupt to handle starvation and request exception