2016-05-23 09:20:20 +00:00
|
|
|
From a1bbd630710d5da89a9c347c84d7badd30e7e68a Mon Sep 17 00:00:00 2001
|
2016-03-21 20:42:51 +00:00
|
|
|
From: John Crispin <blogic@openwrt.org>
|
|
|
|
Date: Wed, 20 Jan 2016 10:12:00 +0100
|
2016-05-23 09:20:20 +00:00
|
|
|
Subject: [PATCH 034/102] soc: mediatek: PMIC wrap: split SoC specific init
|
|
|
|
into callback
|
2016-03-21 20:42:51 +00:00
|
|
|
|
|
|
|
This patch moves the SoC specific wrapper init code into separate callback
|
|
|
|
to avoid pwrap_init() getting too large. This is done by adding a new
|
|
|
|
element called init_special to pmic_wrapper_type. Each currently supported
|
|
|
|
SoC gets its own version of the callback and we copy the code that was
|
|
|
|
previously inside pwrap_init() to these new callbacks. Finally we point the
|
|
|
|
2 instances of pmic_wrapper_type at the 2 new functions.
|
|
|
|
|
|
|
|
Signed-off-by: John Crispin <blogic@openwrt.org>
|
|
|
|
---
|
|
|
|
drivers/soc/mediatek/mtk-pmic-wrap.c | 67 +++++++++++++++++++++-------------
|
|
|
|
1 file changed, 42 insertions(+), 25 deletions(-)
|
|
|
|
|
|
|
|
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
|
|
|
|
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
|
|
|
|
@@ -372,6 +372,7 @@ struct pmic_wrapper_type {
|
|
|
|
enum pwrap_type type;
|
|
|
|
u32 arb_en_all;
|
|
|
|
int (*init_reg_clock)(struct pmic_wrapper *wrp);
|
|
|
|
+ int (*init_soc_specific)(struct pmic_wrapper *wrp);
|
|
|
|
};
|
|
|
|
|
|
|
|
static inline int pwrap_is_mt8135(struct pmic_wrapper *wrp)
|
2016-06-02 13:34:34 +00:00
|
|
|
@@ -665,6 +666,41 @@ static int pwrap_init_cipher(struct pmic
|
2016-03-21 20:42:51 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
+static int pwrap_mt8135_init_soc_specific(struct pmic_wrapper *wrp)
|
|
|
|
+{
|
|
|
|
+ /* enable pwrap events and pwrap bridge in AP side */
|
|
|
|
+ pwrap_writel(wrp, 0x1, PWRAP_EVENT_IN_EN);
|
|
|
|
+ pwrap_writel(wrp, 0xffff, PWRAP_EVENT_DST_EN);
|
|
|
|
+ writel(0x7f, wrp->bridge_base + PWRAP_MT8135_BRIDGE_IORD_ARB_EN);
|
|
|
|
+ writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS3_EN);
|
|
|
|
+ writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS4_EN);
|
|
|
|
+ writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_UNIT);
|
|
|
|
+ writel(0xffff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_SRC_EN);
|
|
|
|
+ writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_TIMER_EN);
|
|
|
|
+ writel(0x7ff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INT_EN);
|
|
|
|
+
|
|
|
|
+ /* enable PMIC event out and sources */
|
|
|
|
+ if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
|
|
|
|
+ pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
|
|
|
|
+ dev_err(wrp->dev, "enable dewrap fail\n");
|
|
|
|
+ return -EFAULT;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int pwrap_mt8173_init_soc_specific(struct pmic_wrapper *wrp)
|
|
|
|
+{
|
|
|
|
+ /* PMIC_DEWRAP enables */
|
|
|
|
+ if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
|
|
|
|
+ pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
|
|
|
|
+ dev_err(wrp->dev, "enable dewrap fail\n");
|
|
|
|
+ return -EFAULT;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static int pwrap_init(struct pmic_wrapper *wrp)
|
|
|
|
{
|
|
|
|
int ret;
|
2016-06-02 13:34:34 +00:00
|
|
|
@@ -743,31 +779,10 @@ static int pwrap_init(struct pmic_wrappe
|
2016-03-21 20:42:51 +00:00
|
|
|
pwrap_writel(wrp, 0x5, PWRAP_STAUPD_PRD);
|
|
|
|
pwrap_writel(wrp, 0xff, PWRAP_STAUPD_GRPEN);
|
|
|
|
|
|
|
|
- if (pwrap_is_mt8135(wrp)) {
|
|
|
|
- /* enable pwrap events and pwrap bridge in AP side */
|
|
|
|
- pwrap_writel(wrp, 0x1, PWRAP_EVENT_IN_EN);
|
|
|
|
- pwrap_writel(wrp, 0xffff, PWRAP_EVENT_DST_EN);
|
|
|
|
- writel(0x7f, wrp->bridge_base + PWRAP_MT8135_BRIDGE_IORD_ARB_EN);
|
|
|
|
- writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS3_EN);
|
|
|
|
- writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS4_EN);
|
|
|
|
- writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_UNIT);
|
|
|
|
- writel(0xffff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_SRC_EN);
|
|
|
|
- writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_TIMER_EN);
|
|
|
|
- writel(0x7ff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INT_EN);
|
|
|
|
-
|
|
|
|
- /* enable PMIC event out and sources */
|
|
|
|
- if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
|
|
|
|
- pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
|
|
|
|
- dev_err(wrp->dev, "enable dewrap fail\n");
|
|
|
|
- return -EFAULT;
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- /* PMIC_DEWRAP enables */
|
|
|
|
- if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) ||
|
|
|
|
- pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) {
|
|
|
|
- dev_err(wrp->dev, "enable dewrap fail\n");
|
|
|
|
- return -EFAULT;
|
|
|
|
- }
|
|
|
|
+ if (wrp->master->init_soc_specific) {
|
|
|
|
+ ret = wrp->master->init_soc_specific(wrp);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Setup the init done registers */
|
2016-06-02 13:34:34 +00:00
|
|
|
@@ -811,6 +826,7 @@ static struct pmic_wrapper_type pwrap_mt
|
2016-03-21 20:42:51 +00:00
|
|
|
.type = PWRAP_MT8135,
|
|
|
|
.arb_en_all = 0x1ff,
|
|
|
|
.init_reg_clock = pwrap_mt8135_init_reg_clock,
|
|
|
|
+ .init_soc_specific = pwrap_mt8135_init_soc_specific,
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct pmic_wrapper_type pwrap_mt8173 = {
|
2016-06-02 13:34:34 +00:00
|
|
|
@@ -818,6 +834,7 @@ static struct pmic_wrapper_type pwrap_mt
|
2016-03-21 20:42:51 +00:00
|
|
|
.type = PWRAP_MT8173,
|
|
|
|
.arb_en_all = 0x3f,
|
|
|
|
.init_reg_clock = pwrap_mt8173_init_reg_clock,
|
|
|
|
+ .init_soc_specific = pwrap_mt8173_init_soc_specific,
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct of_device_id of_pwrap_match_tbl[] = {
|