diff options
Diffstat (limited to 'target/linux/mediatek/patches-4.4/0034-soc-mediatek-PMIC-wrap-split-SoC-specific-init-into-.patch')
-rw-r--r-- | target/linux/mediatek/patches-4.4/0034-soc-mediatek-PMIC-wrap-split-SoC-specific-init-into-.patch | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/target/linux/mediatek/patches-4.4/0034-soc-mediatek-PMIC-wrap-split-SoC-specific-init-into-.patch b/target/linux/mediatek/patches-4.4/0034-soc-mediatek-PMIC-wrap-split-SoC-specific-init-into-.patch new file mode 100644 index 0000000000..aa34aaf368 --- /dev/null +++ b/target/linux/mediatek/patches-4.4/0034-soc-mediatek-PMIC-wrap-split-SoC-specific-init-into-.patch @@ -0,0 +1,127 @@ +From b3cc9f4c4b1164ac6a0700920eca84dff81d13d7 Mon Sep 17 00:00:00 2001 +From: John Crispin <blogic@openwrt.org> +Date: Wed, 20 Jan 2016 10:12:00 +0100 +Subject: [PATCH 34/53] soc: mediatek: PMIC wrap: split SoC specific init into + callback + +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(-) + +diff --git a/drivers/soc/mediatek/mtk-pmic-wrap.c b/drivers/soc/mediatek/mtk-pmic-wrap.c +index b22b664..22c89e9 100644 +--- 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) +@@ -665,6 +666,41 @@ static int pwrap_init_cipher(struct pmic_wrapper *wrp) + 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; +@@ -743,31 +779,10 @@ static int pwrap_init(struct pmic_wrapper *wrp) + 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 */ +@@ -811,6 +826,7 @@ static struct pmic_wrapper_type pwrap_mt8135 = { + .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 = { +@@ -818,6 +834,7 @@ static struct pmic_wrapper_type pwrap_mt8173 = { + .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[] = { +-- +1.7.10.4 + |