- change kconfig entry for armv7 SoCs to be more generic
- add support for mt2701 scpsys driver binding documentation extend driver to allow the bus protection to overwrite the register -----BEGIN PGP SIGNATURE----- iQJLBAABCAA1FiEEiUuSfQSYnG8EMsBltDliWyzx00MFAlo7nMIXHG1hdHRoaWFz LmJnZ0BnbWFpbC5jb20ACgkQtDliWyzx00MF/Q/9GOX4n+FAPR8OXQcSn8X5L6Ep RvUr3np4IFfLBXBReM6nR479+LOE5VLIk/eAad0Avsnbv3TZw38+nXN4vU3skLkr byuri9SRaTXAs7/pxDDRredkm1Woo8H4Zo+LiNjTOv1ydlBV7NqJfqIMDyVgOpZN 1msE3Ug3w5FjnZiRZcCdDreXnk4FYlV4rbJFRQTG1zCENH7GARreyI5xWR59QUzB PnGMHLqUE1FU2KyGoNwxNfnBHdYUHohV7DIC9NI6ucXjbmmbON3PCFPeuUn6jvdu 8qNGGfY6Wv+Vwyg1VKahI/dpI0Vy+n/8AA5lbSb+8Qe6ha+6xSDedN2Y6YNF4J1v iuVFzG8GvUChMFuVYw8F0vsoR1r02uoErxzi9Qgav6uUGAMYOitPnjd2FJ21l2n+ +P46e6yd9Eq5z6ikmAvbF0qhK2XOWCjVzah2Cjv7frlqLsonVYOD52RMgIKndR/x WTZCbPQhMR5LutiQMryIrtLsLe1i4AZP4zaeLnupfdijiXwo6dD7/k98CnqUJtQT 1HWrLQb2gdc8aWhqNsn5sg5Lss3hQWvPq6tgLxk/+HshR1/DoqIE4K8bqvaceI5r meFT8R9y1XBwFu167I1uJIQyvQulrLs0B/VKg6unJM8AHpw326PckYEqHo0TOJUF XWHFH4MdN1TwpGi9mww= =5u17 -----END PGP SIGNATURE----- Merge tag 'v4.15-next-soc' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux into next/soc Pull "arm: Updates for soc driver for v4.15-next" from Matthias Brugger: - change kconfig entry for armv7 SoCs to be more generic - add support for mt2701 scpsys driver binding documentation extend driver to allow the bus protection to overwrite the register * tag 'v4.15-next-soc' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux: soc: mediatek: add MT2712 scpsys support soc: mediatek: add dependent clock jpgdec/audio for scpsys soc: mediatek: extend bus protection API dt-bindings: soc: add MT2712 power dt-bindings ARM: mediatek: use more generic prompts for SoCs with ARMv7
This commit is contained in:
commit
11c9dff045
@ -12,11 +12,13 @@ power/power_domain.txt. It provides the power domains defined in
|
|||||||
- include/dt-bindings/power/mt8173-power.h
|
- include/dt-bindings/power/mt8173-power.h
|
||||||
- include/dt-bindings/power/mt6797-power.h
|
- include/dt-bindings/power/mt6797-power.h
|
||||||
- include/dt-bindings/power/mt2701-power.h
|
- include/dt-bindings/power/mt2701-power.h
|
||||||
|
- include/dt-bindings/power/mt2712-power.h
|
||||||
- include/dt-bindings/power/mt7622-power.h
|
- include/dt-bindings/power/mt7622-power.h
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: Should be one of:
|
- compatible: Should be one of:
|
||||||
- "mediatek,mt2701-scpsys"
|
- "mediatek,mt2701-scpsys"
|
||||||
|
- "mediatek,mt2712-scpsys"
|
||||||
- "mediatek,mt6797-scpsys"
|
- "mediatek,mt6797-scpsys"
|
||||||
- "mediatek,mt7622-scpsys"
|
- "mediatek,mt7622-scpsys"
|
||||||
- "mediatek,mt8173-scpsys"
|
- "mediatek,mt8173-scpsys"
|
||||||
@ -27,6 +29,7 @@ Required properties:
|
|||||||
These are clocks which hardware needs to be
|
These are clocks which hardware needs to be
|
||||||
enabled before enabling certain power domains.
|
enabled before enabling certain power domains.
|
||||||
Required clocks for MT2701: "mm", "mfg", "ethif"
|
Required clocks for MT2701: "mm", "mfg", "ethif"
|
||||||
|
Required clocks for MT2712: "mm", "mfg", "venc", "jpgdec", "audio", "vdec"
|
||||||
Required clocks for MT6797: "mm", "mfg", "vdec"
|
Required clocks for MT6797: "mm", "mfg", "vdec"
|
||||||
Required clocks for MT7622: "hif_sel"
|
Required clocks for MT7622: "hif_sel"
|
||||||
Required clocks for MT8173: "mm", "mfg", "venc", "venc_lt"
|
Required clocks for MT8173: "mm", "mfg", "venc", "venc_lt"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
menuconfig ARCH_MEDIATEK
|
menuconfig ARCH_MEDIATEK
|
||||||
bool "Mediatek MT65xx & MT81xx SoC"
|
bool "MediaTek SoC Support"
|
||||||
depends on ARCH_MULTI_V7
|
depends on ARCH_MULTI_V7
|
||||||
select ARM_GIC
|
select ARM_GIC
|
||||||
select PINCTRL
|
select PINCTRL
|
||||||
|
@ -19,23 +19,33 @@
|
|||||||
|
|
||||||
#define INFRA_TOPAXI_PROTECTEN 0x0220
|
#define INFRA_TOPAXI_PROTECTEN 0x0220
|
||||||
#define INFRA_TOPAXI_PROTECTSTA1 0x0228
|
#define INFRA_TOPAXI_PROTECTSTA1 0x0228
|
||||||
|
#define INFRA_TOPAXI_PROTECTEN_SET 0x0260
|
||||||
|
#define INFRA_TOPAXI_PROTECTEN_CLR 0x0264
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mtk_infracfg_set_bus_protection - enable bus protection
|
* mtk_infracfg_set_bus_protection - enable bus protection
|
||||||
* @regmap: The infracfg regmap
|
* @regmap: The infracfg regmap
|
||||||
* @mask: The mask containing the protection bits to be enabled.
|
* @mask: The mask containing the protection bits to be enabled.
|
||||||
|
* @reg_update: The boolean flag determines to set the protection bits
|
||||||
|
* by regmap_update_bits with enable register(PROTECTEN) or
|
||||||
|
* by regmap_write with set register(PROTECTEN_SET).
|
||||||
*
|
*
|
||||||
* This function enables the bus protection bits for disabled power
|
* This function enables the bus protection bits for disabled power
|
||||||
* domains so that the system does not hang when some unit accesses the
|
* domains so that the system does not hang when some unit accesses the
|
||||||
* bus while in power down.
|
* bus while in power down.
|
||||||
*/
|
*/
|
||||||
int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask)
|
int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask,
|
||||||
|
bool reg_update)
|
||||||
{
|
{
|
||||||
unsigned long expired;
|
unsigned long expired;
|
||||||
u32 val;
|
u32 val;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
regmap_update_bits(infracfg, INFRA_TOPAXI_PROTECTEN, mask, mask);
|
if (reg_update)
|
||||||
|
regmap_update_bits(infracfg, INFRA_TOPAXI_PROTECTEN, mask,
|
||||||
|
mask);
|
||||||
|
else
|
||||||
|
regmap_write(infracfg, INFRA_TOPAXI_PROTECTEN_SET, mask);
|
||||||
|
|
||||||
expired = jiffies + HZ;
|
expired = jiffies + HZ;
|
||||||
|
|
||||||
@ -59,16 +69,24 @@ int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask)
|
|||||||
* mtk_infracfg_clear_bus_protection - disable bus protection
|
* mtk_infracfg_clear_bus_protection - disable bus protection
|
||||||
* @regmap: The infracfg regmap
|
* @regmap: The infracfg regmap
|
||||||
* @mask: The mask containing the protection bits to be disabled.
|
* @mask: The mask containing the protection bits to be disabled.
|
||||||
|
* @reg_update: The boolean flag determines to clear the protection bits
|
||||||
|
* by regmap_update_bits with enable register(PROTECTEN) or
|
||||||
|
* by regmap_write with clear register(PROTECTEN_CLR).
|
||||||
*
|
*
|
||||||
* This function disables the bus protection bits previously enabled with
|
* This function disables the bus protection bits previously enabled with
|
||||||
* mtk_infracfg_set_bus_protection.
|
* mtk_infracfg_set_bus_protection.
|
||||||
*/
|
*/
|
||||||
int mtk_infracfg_clear_bus_protection(struct regmap *infracfg, u32 mask)
|
|
||||||
|
int mtk_infracfg_clear_bus_protection(struct regmap *infracfg, u32 mask,
|
||||||
|
bool reg_update)
|
||||||
{
|
{
|
||||||
unsigned long expired;
|
unsigned long expired;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
regmap_update_bits(infracfg, INFRA_TOPAXI_PROTECTEN, mask, 0);
|
if (reg_update)
|
||||||
|
regmap_update_bits(infracfg, INFRA_TOPAXI_PROTECTEN, mask, 0);
|
||||||
|
else
|
||||||
|
regmap_write(infracfg, INFRA_TOPAXI_PROTECTEN_CLR, mask);
|
||||||
|
|
||||||
expired = jiffies + HZ;
|
expired = jiffies + HZ;
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <linux/soc/mediatek/infracfg.h>
|
#include <linux/soc/mediatek/infracfg.h>
|
||||||
|
|
||||||
#include <dt-bindings/power/mt2701-power.h>
|
#include <dt-bindings/power/mt2701-power.h>
|
||||||
|
#include <dt-bindings/power/mt2712-power.h>
|
||||||
#include <dt-bindings/power/mt6797-power.h>
|
#include <dt-bindings/power/mt6797-power.h>
|
||||||
#include <dt-bindings/power/mt7622-power.h>
|
#include <dt-bindings/power/mt7622-power.h>
|
||||||
#include <dt-bindings/power/mt8173-power.h>
|
#include <dt-bindings/power/mt8173-power.h>
|
||||||
@ -32,7 +33,7 @@
|
|||||||
#define SPM_DIS_PWR_CON 0x023c
|
#define SPM_DIS_PWR_CON 0x023c
|
||||||
#define SPM_CONN_PWR_CON 0x0280
|
#define SPM_CONN_PWR_CON 0x0280
|
||||||
#define SPM_VEN2_PWR_CON 0x0298
|
#define SPM_VEN2_PWR_CON 0x0298
|
||||||
#define SPM_AUDIO_PWR_CON 0x029c /* MT8173 */
|
#define SPM_AUDIO_PWR_CON 0x029c /* MT8173, MT2712 */
|
||||||
#define SPM_BDP_PWR_CON 0x029c /* MT2701 */
|
#define SPM_BDP_PWR_CON 0x029c /* MT2701 */
|
||||||
#define SPM_ETH_PWR_CON 0x02a0
|
#define SPM_ETH_PWR_CON 0x02a0
|
||||||
#define SPM_HIF_PWR_CON 0x02a4
|
#define SPM_HIF_PWR_CON 0x02a4
|
||||||
@ -40,12 +41,12 @@
|
|||||||
#define SPM_MFG_2D_PWR_CON 0x02c0
|
#define SPM_MFG_2D_PWR_CON 0x02c0
|
||||||
#define SPM_MFG_ASYNC_PWR_CON 0x02c4
|
#define SPM_MFG_ASYNC_PWR_CON 0x02c4
|
||||||
#define SPM_USB_PWR_CON 0x02cc
|
#define SPM_USB_PWR_CON 0x02cc
|
||||||
|
#define SPM_USB2_PWR_CON 0x02d4 /* MT2712 */
|
||||||
#define SPM_ETHSYS_PWR_CON 0x02e0 /* MT7622 */
|
#define SPM_ETHSYS_PWR_CON 0x02e0 /* MT7622 */
|
||||||
#define SPM_HIF0_PWR_CON 0x02e4 /* MT7622 */
|
#define SPM_HIF0_PWR_CON 0x02e4 /* MT7622 */
|
||||||
#define SPM_HIF1_PWR_CON 0x02e8 /* MT7622 */
|
#define SPM_HIF1_PWR_CON 0x02e8 /* MT7622 */
|
||||||
#define SPM_WB_PWR_CON 0x02ec /* MT7622 */
|
#define SPM_WB_PWR_CON 0x02ec /* MT7622 */
|
||||||
|
|
||||||
|
|
||||||
#define SPM_PWR_STATUS 0x060c
|
#define SPM_PWR_STATUS 0x060c
|
||||||
#define SPM_PWR_STATUS_2ND 0x0610
|
#define SPM_PWR_STATUS_2ND 0x0610
|
||||||
|
|
||||||
@ -64,12 +65,13 @@
|
|||||||
#define PWR_STATUS_ETH BIT(15)
|
#define PWR_STATUS_ETH BIT(15)
|
||||||
#define PWR_STATUS_HIF BIT(16)
|
#define PWR_STATUS_HIF BIT(16)
|
||||||
#define PWR_STATUS_IFR_MSC BIT(17)
|
#define PWR_STATUS_IFR_MSC BIT(17)
|
||||||
|
#define PWR_STATUS_USB2 BIT(19) /* MT2712 */
|
||||||
#define PWR_STATUS_VENC_LT BIT(20)
|
#define PWR_STATUS_VENC_LT BIT(20)
|
||||||
#define PWR_STATUS_VENC BIT(21)
|
#define PWR_STATUS_VENC BIT(21)
|
||||||
#define PWR_STATUS_MFG_2D BIT(22)
|
#define PWR_STATUS_MFG_2D BIT(22) /* MT8173 */
|
||||||
#define PWR_STATUS_MFG_ASYNC BIT(23)
|
#define PWR_STATUS_MFG_ASYNC BIT(23) /* MT8173 */
|
||||||
#define PWR_STATUS_AUDIO BIT(24)
|
#define PWR_STATUS_AUDIO BIT(24) /* MT8173, MT2712 */
|
||||||
#define PWR_STATUS_USB BIT(25)
|
#define PWR_STATUS_USB BIT(25) /* MT8173, MT2712 */
|
||||||
#define PWR_STATUS_ETHSYS BIT(24) /* MT7622 */
|
#define PWR_STATUS_ETHSYS BIT(24) /* MT7622 */
|
||||||
#define PWR_STATUS_HIF0 BIT(25) /* MT7622 */
|
#define PWR_STATUS_HIF0 BIT(25) /* MT7622 */
|
||||||
#define PWR_STATUS_HIF1 BIT(26) /* MT7622 */
|
#define PWR_STATUS_HIF1 BIT(26) /* MT7622 */
|
||||||
@ -84,6 +86,8 @@ enum clk_id {
|
|||||||
CLK_ETHIF,
|
CLK_ETHIF,
|
||||||
CLK_VDEC,
|
CLK_VDEC,
|
||||||
CLK_HIFSEL,
|
CLK_HIFSEL,
|
||||||
|
CLK_JPGDEC,
|
||||||
|
CLK_AUDIO,
|
||||||
CLK_MAX,
|
CLK_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -96,10 +100,12 @@ static const char * const clk_names[] = {
|
|||||||
"ethif",
|
"ethif",
|
||||||
"vdec",
|
"vdec",
|
||||||
"hif_sel",
|
"hif_sel",
|
||||||
|
"jpgdec",
|
||||||
|
"audio",
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_CLKS 2
|
#define MAX_CLKS 3
|
||||||
|
|
||||||
struct scp_domain_data {
|
struct scp_domain_data {
|
||||||
const char *name;
|
const char *name;
|
||||||
@ -134,6 +140,7 @@ struct scp {
|
|||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
struct regmap *infracfg;
|
struct regmap *infracfg;
|
||||||
struct scp_ctrl_reg ctrl_reg;
|
struct scp_ctrl_reg ctrl_reg;
|
||||||
|
bool bus_prot_reg_update;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct scp_subdomain {
|
struct scp_subdomain {
|
||||||
@ -147,6 +154,7 @@ struct scp_soc_data {
|
|||||||
const struct scp_subdomain *subdomains;
|
const struct scp_subdomain *subdomains;
|
||||||
int num_subdomains;
|
int num_subdomains;
|
||||||
const struct scp_ctrl_reg regs;
|
const struct scp_ctrl_reg regs;
|
||||||
|
bool bus_prot_reg_update;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int scpsys_domain_is_on(struct scp_domain *scpd)
|
static int scpsys_domain_is_on(struct scp_domain *scpd)
|
||||||
@ -254,7 +262,8 @@ static int scpsys_power_on(struct generic_pm_domain *genpd)
|
|||||||
|
|
||||||
if (scpd->data->bus_prot_mask) {
|
if (scpd->data->bus_prot_mask) {
|
||||||
ret = mtk_infracfg_clear_bus_protection(scp->infracfg,
|
ret = mtk_infracfg_clear_bus_protection(scp->infracfg,
|
||||||
scpd->data->bus_prot_mask);
|
scpd->data->bus_prot_mask,
|
||||||
|
scp->bus_prot_reg_update);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_pwr_ack;
|
goto err_pwr_ack;
|
||||||
}
|
}
|
||||||
@ -289,7 +298,8 @@ static int scpsys_power_off(struct generic_pm_domain *genpd)
|
|||||||
|
|
||||||
if (scpd->data->bus_prot_mask) {
|
if (scpd->data->bus_prot_mask) {
|
||||||
ret = mtk_infracfg_set_bus_protection(scp->infracfg,
|
ret = mtk_infracfg_set_bus_protection(scp->infracfg,
|
||||||
scpd->data->bus_prot_mask);
|
scpd->data->bus_prot_mask,
|
||||||
|
scp->bus_prot_reg_update);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -371,7 +381,8 @@ static void init_clks(struct platform_device *pdev, struct clk **clk)
|
|||||||
|
|
||||||
static struct scp *init_scp(struct platform_device *pdev,
|
static struct scp *init_scp(struct platform_device *pdev,
|
||||||
const struct scp_domain_data *scp_domain_data, int num,
|
const struct scp_domain_data *scp_domain_data, int num,
|
||||||
const struct scp_ctrl_reg *scp_ctrl_reg)
|
const struct scp_ctrl_reg *scp_ctrl_reg,
|
||||||
|
bool bus_prot_reg_update)
|
||||||
{
|
{
|
||||||
struct genpd_onecell_data *pd_data;
|
struct genpd_onecell_data *pd_data;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
@ -386,6 +397,8 @@ static struct scp *init_scp(struct platform_device *pdev,
|
|||||||
scp->ctrl_reg.pwr_sta_offs = scp_ctrl_reg->pwr_sta_offs;
|
scp->ctrl_reg.pwr_sta_offs = scp_ctrl_reg->pwr_sta_offs;
|
||||||
scp->ctrl_reg.pwr_sta2nd_offs = scp_ctrl_reg->pwr_sta2nd_offs;
|
scp->ctrl_reg.pwr_sta2nd_offs = scp_ctrl_reg->pwr_sta2nd_offs;
|
||||||
|
|
||||||
|
scp->bus_prot_reg_update = bus_prot_reg_update;
|
||||||
|
|
||||||
scp->dev = &pdev->dev;
|
scp->dev = &pdev->dev;
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
@ -580,6 +593,85 @@ static const struct scp_domain_data scp_domain_data_mt2701[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MT2712 power domain support
|
||||||
|
*/
|
||||||
|
static const struct scp_domain_data scp_domain_data_mt2712[] = {
|
||||||
|
[MT2712_POWER_DOMAIN_MM] = {
|
||||||
|
.name = "mm",
|
||||||
|
.sta_mask = PWR_STATUS_DISP,
|
||||||
|
.ctl_offs = SPM_DIS_PWR_CON,
|
||||||
|
.sram_pdn_bits = GENMASK(8, 8),
|
||||||
|
.sram_pdn_ack_bits = GENMASK(12, 12),
|
||||||
|
.clk_id = {CLK_MM},
|
||||||
|
.active_wakeup = true,
|
||||||
|
},
|
||||||
|
[MT2712_POWER_DOMAIN_VDEC] = {
|
||||||
|
.name = "vdec",
|
||||||
|
.sta_mask = PWR_STATUS_VDEC,
|
||||||
|
.ctl_offs = SPM_VDE_PWR_CON,
|
||||||
|
.sram_pdn_bits = GENMASK(8, 8),
|
||||||
|
.sram_pdn_ack_bits = GENMASK(12, 12),
|
||||||
|
.clk_id = {CLK_MM, CLK_VDEC},
|
||||||
|
.active_wakeup = true,
|
||||||
|
},
|
||||||
|
[MT2712_POWER_DOMAIN_VENC] = {
|
||||||
|
.name = "venc",
|
||||||
|
.sta_mask = PWR_STATUS_VENC,
|
||||||
|
.ctl_offs = SPM_VEN_PWR_CON,
|
||||||
|
.sram_pdn_bits = GENMASK(11, 8),
|
||||||
|
.sram_pdn_ack_bits = GENMASK(15, 12),
|
||||||
|
.clk_id = {CLK_MM, CLK_VENC, CLK_JPGDEC},
|
||||||
|
.active_wakeup = true,
|
||||||
|
},
|
||||||
|
[MT2712_POWER_DOMAIN_ISP] = {
|
||||||
|
.name = "isp",
|
||||||
|
.sta_mask = PWR_STATUS_ISP,
|
||||||
|
.ctl_offs = SPM_ISP_PWR_CON,
|
||||||
|
.sram_pdn_bits = GENMASK(11, 8),
|
||||||
|
.sram_pdn_ack_bits = GENMASK(13, 12),
|
||||||
|
.clk_id = {CLK_MM},
|
||||||
|
.active_wakeup = true,
|
||||||
|
},
|
||||||
|
[MT2712_POWER_DOMAIN_AUDIO] = {
|
||||||
|
.name = "audio",
|
||||||
|
.sta_mask = PWR_STATUS_AUDIO,
|
||||||
|
.ctl_offs = SPM_AUDIO_PWR_CON,
|
||||||
|
.sram_pdn_bits = GENMASK(11, 8),
|
||||||
|
.sram_pdn_ack_bits = GENMASK(15, 12),
|
||||||
|
.clk_id = {CLK_AUDIO},
|
||||||
|
.active_wakeup = true,
|
||||||
|
},
|
||||||
|
[MT2712_POWER_DOMAIN_USB] = {
|
||||||
|
.name = "usb",
|
||||||
|
.sta_mask = PWR_STATUS_USB,
|
||||||
|
.ctl_offs = SPM_USB_PWR_CON,
|
||||||
|
.sram_pdn_bits = GENMASK(10, 8),
|
||||||
|
.sram_pdn_ack_bits = GENMASK(14, 12),
|
||||||
|
.clk_id = {CLK_NONE},
|
||||||
|
.active_wakeup = true,
|
||||||
|
},
|
||||||
|
[MT2712_POWER_DOMAIN_USB2] = {
|
||||||
|
.name = "usb2",
|
||||||
|
.sta_mask = PWR_STATUS_USB2,
|
||||||
|
.ctl_offs = SPM_USB2_PWR_CON,
|
||||||
|
.sram_pdn_bits = GENMASK(10, 8),
|
||||||
|
.sram_pdn_ack_bits = GENMASK(14, 12),
|
||||||
|
.clk_id = {CLK_NONE},
|
||||||
|
.active_wakeup = true,
|
||||||
|
},
|
||||||
|
[MT2712_POWER_DOMAIN_MFG] = {
|
||||||
|
.name = "mfg",
|
||||||
|
.sta_mask = PWR_STATUS_MFG,
|
||||||
|
.ctl_offs = SPM_MFG_PWR_CON,
|
||||||
|
.sram_pdn_bits = GENMASK(11, 8),
|
||||||
|
.sram_pdn_ack_bits = GENMASK(19, 16),
|
||||||
|
.clk_id = {CLK_MFG},
|
||||||
|
.bus_prot_mask = BIT(14) | BIT(21) | BIT(23),
|
||||||
|
.active_wakeup = true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MT6797 power domain support
|
* MT6797 power domain support
|
||||||
*/
|
*/
|
||||||
@ -806,7 +898,18 @@ static const struct scp_soc_data mt2701_data = {
|
|||||||
.regs = {
|
.regs = {
|
||||||
.pwr_sta_offs = SPM_PWR_STATUS,
|
.pwr_sta_offs = SPM_PWR_STATUS,
|
||||||
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
|
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
|
||||||
}
|
},
|
||||||
|
.bus_prot_reg_update = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct scp_soc_data mt2712_data = {
|
||||||
|
.domains = scp_domain_data_mt2712,
|
||||||
|
.num_domains = ARRAY_SIZE(scp_domain_data_mt2712),
|
||||||
|
.regs = {
|
||||||
|
.pwr_sta_offs = SPM_PWR_STATUS,
|
||||||
|
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
|
||||||
|
},
|
||||||
|
.bus_prot_reg_update = false,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct scp_soc_data mt6797_data = {
|
static const struct scp_soc_data mt6797_data = {
|
||||||
@ -817,7 +920,8 @@ static const struct scp_soc_data mt6797_data = {
|
|||||||
.regs = {
|
.regs = {
|
||||||
.pwr_sta_offs = SPM_PWR_STATUS_MT6797,
|
.pwr_sta_offs = SPM_PWR_STATUS_MT6797,
|
||||||
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND_MT6797
|
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND_MT6797
|
||||||
}
|
},
|
||||||
|
.bus_prot_reg_update = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct scp_soc_data mt7622_data = {
|
static const struct scp_soc_data mt7622_data = {
|
||||||
@ -826,7 +930,8 @@ static const struct scp_soc_data mt7622_data = {
|
|||||||
.regs = {
|
.regs = {
|
||||||
.pwr_sta_offs = SPM_PWR_STATUS,
|
.pwr_sta_offs = SPM_PWR_STATUS,
|
||||||
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
|
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
|
||||||
}
|
},
|
||||||
|
.bus_prot_reg_update = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct scp_soc_data mt8173_data = {
|
static const struct scp_soc_data mt8173_data = {
|
||||||
@ -837,7 +942,8 @@ static const struct scp_soc_data mt8173_data = {
|
|||||||
.regs = {
|
.regs = {
|
||||||
.pwr_sta_offs = SPM_PWR_STATUS,
|
.pwr_sta_offs = SPM_PWR_STATUS,
|
||||||
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
|
.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND
|
||||||
}
|
},
|
||||||
|
.bus_prot_reg_update = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -848,6 +954,9 @@ static const struct of_device_id of_scpsys_match_tbl[] = {
|
|||||||
{
|
{
|
||||||
.compatible = "mediatek,mt2701-scpsys",
|
.compatible = "mediatek,mt2701-scpsys",
|
||||||
.data = &mt2701_data,
|
.data = &mt2701_data,
|
||||||
|
}, {
|
||||||
|
.compatible = "mediatek,mt2712-scpsys",
|
||||||
|
.data = &mt2712_data,
|
||||||
}, {
|
}, {
|
||||||
.compatible = "mediatek,mt6797-scpsys",
|
.compatible = "mediatek,mt6797-scpsys",
|
||||||
.data = &mt6797_data,
|
.data = &mt6797_data,
|
||||||
@ -874,7 +983,8 @@ static int scpsys_probe(struct platform_device *pdev)
|
|||||||
match = of_match_device(of_scpsys_match_tbl, &pdev->dev);
|
match = of_match_device(of_scpsys_match_tbl, &pdev->dev);
|
||||||
soc = (const struct scp_soc_data *)match->data;
|
soc = (const struct scp_soc_data *)match->data;
|
||||||
|
|
||||||
scp = init_scp(pdev, soc->domains, soc->num_domains, &soc->regs);
|
scp = init_scp(pdev, soc->domains, soc->num_domains, &soc->regs,
|
||||||
|
soc->bus_prot_reg_update);
|
||||||
if (IS_ERR(scp))
|
if (IS_ERR(scp))
|
||||||
return PTR_ERR(scp);
|
return PTR_ERR(scp);
|
||||||
|
|
||||||
|
26
include/dt-bindings/power/mt2712-power.h
Normal file
26
include/dt-bindings/power/mt2712-power.h
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 MediaTek Inc.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
* See http://www.gnu.org/licenses/gpl-2.0.html for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DT_BINDINGS_POWER_MT2712_POWER_H
|
||||||
|
#define _DT_BINDINGS_POWER_MT2712_POWER_H
|
||||||
|
|
||||||
|
#define MT2712_POWER_DOMAIN_MM 0
|
||||||
|
#define MT2712_POWER_DOMAIN_VDEC 1
|
||||||
|
#define MT2712_POWER_DOMAIN_VENC 2
|
||||||
|
#define MT2712_POWER_DOMAIN_ISP 3
|
||||||
|
#define MT2712_POWER_DOMAIN_AUDIO 4
|
||||||
|
#define MT2712_POWER_DOMAIN_USB 5
|
||||||
|
#define MT2712_POWER_DOMAIN_USB2 6
|
||||||
|
#define MT2712_POWER_DOMAIN_MFG 7
|
||||||
|
|
||||||
|
#endif /* _DT_BINDINGS_POWER_MT2712_POWER_H */
|
@ -28,7 +28,8 @@
|
|||||||
#define MT7622_TOP_AXI_PROT_EN_WB (BIT(2) | BIT(6) | \
|
#define MT7622_TOP_AXI_PROT_EN_WB (BIT(2) | BIT(6) | \
|
||||||
BIT(7) | BIT(8))
|
BIT(7) | BIT(8))
|
||||||
|
|
||||||
int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask);
|
int mtk_infracfg_set_bus_protection(struct regmap *infracfg, u32 mask,
|
||||||
int mtk_infracfg_clear_bus_protection(struct regmap *infracfg, u32 mask);
|
bool reg_update);
|
||||||
|
int mtk_infracfg_clear_bus_protection(struct regmap *infracfg, u32 mask,
|
||||||
|
bool reg_update);
|
||||||
#endif /* __SOC_MEDIATEK_INFRACFG_H */
|
#endif /* __SOC_MEDIATEK_INFRACFG_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user