Re: [RFC PATCH 6/7] soc: mediatek: add MT8183 dvfsrc support
On Thu, Jan 3, 2019 at 10:16 PM Henry Chen wrote: > > On Thu, 2019-01-03 at 10:16 +0800, Nicolas Boichat wrote: > > On Wed, Jan 2, 2019 at 10:01 PM Henry Chen wrote: > > > > > > Add dvfsrc driver for MT8183 > > > > > > Signed-off-by: Henry Chen > > > --- > > > drivers/soc/mediatek/Kconfig | 15 ++ > > > drivers/soc/mediatek/Makefile | 1 + > > > drivers/soc/mediatek/mtk-dvfsrc.c | 473 > > > ++ > > > 3 files changed, 489 insertions(+) > > > create mode 100644 drivers/soc/mediatek/mtk-dvfsrc.c > > > > > > diff --git a/drivers/soc/mediatek/Kconfig b/drivers/soc/mediatek/Kconfig > > > index a7d0667..f956f03 100644 > > > --- a/drivers/soc/mediatek/Kconfig > > > +++ b/drivers/soc/mediatek/Kconfig > > > @@ -12,6 +12,21 @@ config MTK_INFRACFG > > > INFRACFG controller contains various infrastructure registers > > > not > > > directly associated to any device. > > > > > > +config MTK_DVFSRC > > > + bool "MediaTek DVFSRC Support" > > > + depends on ARCH_MEDIATEK > > > + default ARCH_MEDIATEK > > > + select REGMAP > > > + select MTK_INFRACFG > > > + select PM_GENERIC_DOMAINS if PM > > > + depends on MTK_SCPSYS > > > + help > > > + Say yes here to add support for the MediaTek DVFSRC found > > > + on different MediaTek SoCs. The DVFSRC is a proprietary > > > + hardware which is used to collect all the requests from > > > + system and turn into the decision of minimum Vcore voltage > > > + and minimum DRAM frequency to fulfill those requests. > > > + > > > config MTK_PMIC_WRAP > > > tristate "MediaTek PMIC Wrapper Support" > > > depends on RESET_CONTROLLER > > > diff --git a/drivers/soc/mediatek/Makefile b/drivers/soc/mediatek/Makefile > > > index 9dc6670..5c010b9 100644 > > > --- a/drivers/soc/mediatek/Makefile > > > +++ b/drivers/soc/mediatek/Makefile > > > @@ -1,3 +1,4 @@ > > > +obj-$(CONFIG_MTK_DVFSRC) += mtk-dvfsrc.o > > > obj-$(CONFIG_MTK_INFRACFG) += mtk-infracfg.o mtk-scpsys-ext.o > > > obj-$(CONFIG_MTK_PMIC_WRAP) += mtk-pmic-wrap.o > > > obj-$(CONFIG_MTK_SCPSYS) += mtk-scpsys.o > > > diff --git a/drivers/soc/mediatek/mtk-dvfsrc.c > > > b/drivers/soc/mediatek/mtk-dvfsrc.c > > > new file mode 100644 > > > index 000..af462a3 > > > --- /dev/null > > > +++ b/drivers/soc/mediatek/mtk-dvfsrc.c > > > @@ -0,0 +1,473 @@ > > > +// SPDX-License-Identifier: GPL-2.0 > > > +/* > > > + * Copyright (C) 2018 MediaTek Inc. > > > + */ > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > > Alphabetical order. > I will fix it. > > > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include "mtk-scpsys.h" > > > + > > > +#define DVFSRC_IDLE0x00 > > > +#define DVFSRC_GET_TARGET_LEVEL(x) (((x) >> 0) & 0x) > > > +#define DVFSRC_GET_CURRENT_LEVEL(x)(((x) >> 16) & 0x) > > > + > > > +/* macro for irq */ > > > +#define DVFSRC_IRQ_TIMEOUT_EN BIT(1) > > > + > > > +struct dvfsrc_opp { > > > + int vcore_opp; > > > + int dram_opp; > > > +}; > > > + > > > +struct dvfsrc_domain { > > > + int id; > > > + int state; > > > +}; > > > + > > > +struct mtk_dvfsrc; > > > +struct dvfsrc_soc_data { > > > + const int *regs; > > > + int num_opp; > > > + int num_domains; > > > + int dram_sft; > > > + int vcore_sft; > > > + const struct dvfsrc_opp **opps; > > > + struct dvfsrc_domain *domains; > > > + void (*init_soc)(struct mtk_dvfsrc *dvfsrc); > > > + int (*get_target_level)(struct mtk_dvfsrc *dvfsrc); > > > + int (*get_current_level)(struct mtk_dvfsrc *dvfsrc); > > > +}; > > > + > > > +struct mtk_dvfsrc { > > > + struct device *dev; > > > + struct clk *clk_dvfsrc; > > > + const struct dvfsrc_soc_data *dvd; > > > + int dram_type; > > > + int irq; > > > + void __iomem *regs; > > > + struct mutex lock; /* generic mutex for dvfsrc driver */ > > > + > > > + struct notifier_block qos_notifier; > > > + struct notifier_block scpsys_notifier; > > > +}; > > > + > > > +static u32 dvfsrc_read(struct mtk_dvfsrc *dvfs, u32 offset) > > > +{ > > > + return readl(dvfs->regs + dvfs->dvd->regs[offset]); > > > +} > > > + > > > +static void dvfsrc_write(struct mtk_dvfsrc *dvfs, u32 offset, u32 val) > > > +{ > > > + writel(val, dvfs->regs + dvfs->dvd->regs[offset]); > > > +} > > > + > > > +enum dvfsrc_regs { > > > + DVFSRC_BASIC_CONTROL, > > > + DVFSRC_SW_REQ, > > > + DVFSRC_SW_REQ2, > > > + DVFSRC_EMI_REQUEST, > > > + DVFSRC_EMI_REQUEST2, > > > + DVFSRC_EMI_REQUEST3, > > > + DVFSRC_EMI_QOS0, > > > + DVFSRC_EMI_QOS1, > > > + DVFSRC_EMI_QOS2, > > > +
Re: [RFC PATCH 6/7] soc: mediatek: add MT8183 dvfsrc support
On Thu, 2019-01-03 at 10:16 +0800, Nicolas Boichat wrote: > On Wed, Jan 2, 2019 at 10:01 PM Henry Chen wrote: > > > > Add dvfsrc driver for MT8183 > > > > Signed-off-by: Henry Chen > > --- > > drivers/soc/mediatek/Kconfig | 15 ++ > > drivers/soc/mediatek/Makefile | 1 + > > drivers/soc/mediatek/mtk-dvfsrc.c | 473 > > ++ > > 3 files changed, 489 insertions(+) > > create mode 100644 drivers/soc/mediatek/mtk-dvfsrc.c > > > > diff --git a/drivers/soc/mediatek/Kconfig b/drivers/soc/mediatek/Kconfig > > index a7d0667..f956f03 100644 > > --- a/drivers/soc/mediatek/Kconfig > > +++ b/drivers/soc/mediatek/Kconfig > > @@ -12,6 +12,21 @@ config MTK_INFRACFG > > INFRACFG controller contains various infrastructure registers not > > directly associated to any device. > > > > +config MTK_DVFSRC > > + bool "MediaTek DVFSRC Support" > > + depends on ARCH_MEDIATEK > > + default ARCH_MEDIATEK > > + select REGMAP > > + select MTK_INFRACFG > > + select PM_GENERIC_DOMAINS if PM > > + depends on MTK_SCPSYS > > + help > > + Say yes here to add support for the MediaTek DVFSRC found > > + on different MediaTek SoCs. The DVFSRC is a proprietary > > + hardware which is used to collect all the requests from > > + system and turn into the decision of minimum Vcore voltage > > + and minimum DRAM frequency to fulfill those requests. > > + > > config MTK_PMIC_WRAP > > tristate "MediaTek PMIC Wrapper Support" > > depends on RESET_CONTROLLER > > diff --git a/drivers/soc/mediatek/Makefile b/drivers/soc/mediatek/Makefile > > index 9dc6670..5c010b9 100644 > > --- a/drivers/soc/mediatek/Makefile > > +++ b/drivers/soc/mediatek/Makefile > > @@ -1,3 +1,4 @@ > > +obj-$(CONFIG_MTK_DVFSRC) += mtk-dvfsrc.o > > obj-$(CONFIG_MTK_INFRACFG) += mtk-infracfg.o mtk-scpsys-ext.o > > obj-$(CONFIG_MTK_PMIC_WRAP) += mtk-pmic-wrap.o > > obj-$(CONFIG_MTK_SCPSYS) += mtk-scpsys.o > > diff --git a/drivers/soc/mediatek/mtk-dvfsrc.c > > b/drivers/soc/mediatek/mtk-dvfsrc.c > > new file mode 100644 > > index 000..af462a3 > > --- /dev/null > > +++ b/drivers/soc/mediatek/mtk-dvfsrc.c > > @@ -0,0 +1,473 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * Copyright (C) 2018 MediaTek Inc. > > + */ > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > Alphabetical order. I will fix it. > > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include "mtk-scpsys.h" > > + > > +#define DVFSRC_IDLE0x00 > > +#define DVFSRC_GET_TARGET_LEVEL(x) (((x) >> 0) & 0x) > > +#define DVFSRC_GET_CURRENT_LEVEL(x)(((x) >> 16) & 0x) > > + > > +/* macro for irq */ > > +#define DVFSRC_IRQ_TIMEOUT_EN BIT(1) > > + > > +struct dvfsrc_opp { > > + int vcore_opp; > > + int dram_opp; > > +}; > > + > > +struct dvfsrc_domain { > > + int id; > > + int state; > > +}; > > + > > +struct mtk_dvfsrc; > > +struct dvfsrc_soc_data { > > + const int *regs; > > + int num_opp; > > + int num_domains; > > + int dram_sft; > > + int vcore_sft; > > + const struct dvfsrc_opp **opps; > > + struct dvfsrc_domain *domains; > > + void (*init_soc)(struct mtk_dvfsrc *dvfsrc); > > + int (*get_target_level)(struct mtk_dvfsrc *dvfsrc); > > + int (*get_current_level)(struct mtk_dvfsrc *dvfsrc); > > +}; > > + > > +struct mtk_dvfsrc { > > + struct device *dev; > > + struct clk *clk_dvfsrc; > > + const struct dvfsrc_soc_data *dvd; > > + int dram_type; > > + int irq; > > + void __iomem *regs; > > + struct mutex lock; /* generic mutex for dvfsrc driver */ > > + > > + struct notifier_block qos_notifier; > > + struct notifier_block scpsys_notifier; > > +}; > > + > > +static u32 dvfsrc_read(struct mtk_dvfsrc *dvfs, u32 offset) > > +{ > > + return readl(dvfs->regs + dvfs->dvd->regs[offset]); > > +} > > + > > +static void dvfsrc_write(struct mtk_dvfsrc *dvfs, u32 offset, u32 val) > > +{ > > + writel(val, dvfs->regs + dvfs->dvd->regs[offset]); > > +} > > + > > +enum dvfsrc_regs { > > + DVFSRC_BASIC_CONTROL, > > + DVFSRC_SW_REQ, > > + DVFSRC_SW_REQ2, > > + DVFSRC_EMI_REQUEST, > > + DVFSRC_EMI_REQUEST2, > > + DVFSRC_EMI_REQUEST3, > > + DVFSRC_EMI_QOS0, > > + DVFSRC_EMI_QOS1, > > + DVFSRC_EMI_QOS2, > > + DVFSRC_EMI_MD2SPM0, > > + DVFSRC_EMI_MD2SPM1, > > + DVFSRC_VCORE_REQUEST, > > + DVFSRC_VCORE_REQUEST2, > > + DVFSRC_VCORE_MD2SPM0, > > + DVFSRC_INT, > > + DVFSRC_INT_EN, > > + DVFSRC_INT_CLR, > > + DVFSRC_TIMEOUT_NEXTREQ, > > + DVFSRC_LEVEL, > > + DVFSRC_LEVEL_LABEL_0_1, > > +
Re: [RFC PATCH 6/7] soc: mediatek: add MT8183 dvfsrc support
On Wed, Jan 2, 2019 at 10:01 PM Henry Chen wrote: > > Add dvfsrc driver for MT8183 > > Signed-off-by: Henry Chen > --- > drivers/soc/mediatek/Kconfig | 15 ++ > drivers/soc/mediatek/Makefile | 1 + > drivers/soc/mediatek/mtk-dvfsrc.c | 473 > ++ > 3 files changed, 489 insertions(+) > create mode 100644 drivers/soc/mediatek/mtk-dvfsrc.c > > diff --git a/drivers/soc/mediatek/Kconfig b/drivers/soc/mediatek/Kconfig > index a7d0667..f956f03 100644 > --- a/drivers/soc/mediatek/Kconfig > +++ b/drivers/soc/mediatek/Kconfig > @@ -12,6 +12,21 @@ config MTK_INFRACFG > INFRACFG controller contains various infrastructure registers not > directly associated to any device. > > +config MTK_DVFSRC > + bool "MediaTek DVFSRC Support" > + depends on ARCH_MEDIATEK > + default ARCH_MEDIATEK > + select REGMAP > + select MTK_INFRACFG > + select PM_GENERIC_DOMAINS if PM > + depends on MTK_SCPSYS > + help > + Say yes here to add support for the MediaTek DVFSRC found > + on different MediaTek SoCs. The DVFSRC is a proprietary > + hardware which is used to collect all the requests from > + system and turn into the decision of minimum Vcore voltage > + and minimum DRAM frequency to fulfill those requests. > + > config MTK_PMIC_WRAP > tristate "MediaTek PMIC Wrapper Support" > depends on RESET_CONTROLLER > diff --git a/drivers/soc/mediatek/Makefile b/drivers/soc/mediatek/Makefile > index 9dc6670..5c010b9 100644 > --- a/drivers/soc/mediatek/Makefile > +++ b/drivers/soc/mediatek/Makefile > @@ -1,3 +1,4 @@ > +obj-$(CONFIG_MTK_DVFSRC) += mtk-dvfsrc.o > obj-$(CONFIG_MTK_INFRACFG) += mtk-infracfg.o mtk-scpsys-ext.o > obj-$(CONFIG_MTK_PMIC_WRAP) += mtk-pmic-wrap.o > obj-$(CONFIG_MTK_SCPSYS) += mtk-scpsys.o > diff --git a/drivers/soc/mediatek/mtk-dvfsrc.c > b/drivers/soc/mediatek/mtk-dvfsrc.c > new file mode 100644 > index 000..af462a3 > --- /dev/null > +++ b/drivers/soc/mediatek/mtk-dvfsrc.c > @@ -0,0 +1,473 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (C) 2018 MediaTek Inc. > + */ > +#include > +#include > +#include > +#include > +#include > +#include Alphabetical order. > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include "mtk-scpsys.h" > + > +#define DVFSRC_IDLE0x00 > +#define DVFSRC_GET_TARGET_LEVEL(x) (((x) >> 0) & 0x) > +#define DVFSRC_GET_CURRENT_LEVEL(x)(((x) >> 16) & 0x) > + > +/* macro for irq */ > +#define DVFSRC_IRQ_TIMEOUT_EN BIT(1) > + > +struct dvfsrc_opp { > + int vcore_opp; > + int dram_opp; > +}; > + > +struct dvfsrc_domain { > + int id; > + int state; > +}; > + > +struct mtk_dvfsrc; > +struct dvfsrc_soc_data { > + const int *regs; > + int num_opp; > + int num_domains; > + int dram_sft; > + int vcore_sft; > + const struct dvfsrc_opp **opps; > + struct dvfsrc_domain *domains; > + void (*init_soc)(struct mtk_dvfsrc *dvfsrc); > + int (*get_target_level)(struct mtk_dvfsrc *dvfsrc); > + int (*get_current_level)(struct mtk_dvfsrc *dvfsrc); > +}; > + > +struct mtk_dvfsrc { > + struct device *dev; > + struct clk *clk_dvfsrc; > + const struct dvfsrc_soc_data *dvd; > + int dram_type; > + int irq; > + void __iomem *regs; > + struct mutex lock; /* generic mutex for dvfsrc driver */ > + > + struct notifier_block qos_notifier; > + struct notifier_block scpsys_notifier; > +}; > + > +static u32 dvfsrc_read(struct mtk_dvfsrc *dvfs, u32 offset) > +{ > + return readl(dvfs->regs + dvfs->dvd->regs[offset]); > +} > + > +static void dvfsrc_write(struct mtk_dvfsrc *dvfs, u32 offset, u32 val) > +{ > + writel(val, dvfs->regs + dvfs->dvd->regs[offset]); > +} > + > +enum dvfsrc_regs { > + DVFSRC_BASIC_CONTROL, > + DVFSRC_SW_REQ, > + DVFSRC_SW_REQ2, > + DVFSRC_EMI_REQUEST, > + DVFSRC_EMI_REQUEST2, > + DVFSRC_EMI_REQUEST3, > + DVFSRC_EMI_QOS0, > + DVFSRC_EMI_QOS1, > + DVFSRC_EMI_QOS2, > + DVFSRC_EMI_MD2SPM0, > + DVFSRC_EMI_MD2SPM1, > + DVFSRC_VCORE_REQUEST, > + DVFSRC_VCORE_REQUEST2, > + DVFSRC_VCORE_MD2SPM0, > + DVFSRC_INT, > + DVFSRC_INT_EN, > + DVFSRC_INT_CLR, > + DVFSRC_TIMEOUT_NEXTREQ, > + DVFSRC_LEVEL, > + DVFSRC_LEVEL_LABEL_0_1, > + DVFSRC_LEVEL_LABEL_2_3, > + DVFSRC_LEVEL_LABEL_4_5, > + DVFSRC_LEVEL_LABEL_6_7, > + DVFSRC_LEVEL_LABEL_8_9, > + DVFSRC_LEVEL_LABEL_10_11, > + DVFSRC_LEVEL_LABEL_12_13, > + DVFSRC_LEVEL_LABEL_14_15, > + DVFSRC_SW_BW_0, > + DVFSRC_QOS_EN, > + DVFSRC_FORCE, > + DVFSRC_LAST, > + DVFSRC_RSRV_0, > + DVFSRC_RSRV_1, > +}; > +