From 050da2107a7eb2a571a8a3d0cee21cc6a44b72b8 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Mon, 7 May 2018 12:07:32 +0200 Subject: mediatek: backport upstream mediatek patches Signed-off-by: John Crispin --- ...k-pwrap-add-pwrap_write32-for-writing-in-.patch | 137 +++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 target/linux/mediatek/patches-4.14/0118-soc-mediatek-pwrap-add-pwrap_write32-for-writing-in-.patch (limited to 'target/linux/mediatek/patches-4.14/0118-soc-mediatek-pwrap-add-pwrap_write32-for-writing-in-.patch') diff --git a/target/linux/mediatek/patches-4.14/0118-soc-mediatek-pwrap-add-pwrap_write32-for-writing-in-.patch b/target/linux/mediatek/patches-4.14/0118-soc-mediatek-pwrap-add-pwrap_write32-for-writing-in-.patch new file mode 100644 index 0000000000..6048d6e40b --- /dev/null +++ b/target/linux/mediatek/patches-4.14/0118-soc-mediatek-pwrap-add-pwrap_write32-for-writing-in-.patch @@ -0,0 +1,137 @@ +From 635f800995e4ea2a18ce7520d816dab018ce091f Mon Sep 17 00:00:00 2001 +From: Sean Wang +Date: Wed, 18 Oct 2017 16:28:44 +0800 +Subject: [PATCH 118/224] soc: mediatek: pwrap: add pwrap_write32 for writing + in 32-bit mode + +Some regulators such as MediaTek MT6380 also has to be written in +32-bit mode. So the patch adds pwrap_write32, rename old pwrap_write +into pwrap_write16 and one additional function pointer is introduced +for increasing flexibility allowing the determination which mode is +used by the pwrap slave detection through device tree. + +Signed-off-by: Chenglin Xu +Signed-off-by: Chen Zhong +Signed-off-by: Sean Wang +Signed-off-by: Matthias Brugger +--- + drivers/soc/mediatek/mtk-pmic-wrap.c | 70 +++++++++++++++++++++++++++--------- + 1 file changed, 54 insertions(+), 16 deletions(-) + +diff --git a/drivers/soc/mediatek/mtk-pmic-wrap.c b/drivers/soc/mediatek/mtk-pmic-wrap.c +index 06930e2ebe4c..2d3a8faae124 100644 +--- a/drivers/soc/mediatek/mtk-pmic-wrap.c ++++ b/drivers/soc/mediatek/mtk-pmic-wrap.c +@@ -507,6 +507,7 @@ struct pwrap_slv_type { + * which type is used by the detection through device tree. + */ + int (*pwrap_read)(struct pmic_wrapper *wrp, u32 adr, u32 *rdata); ++ int (*pwrap_write)(struct pmic_wrapper *wrp, u32 adr, u32 wdata); + }; + + struct pmic_wrapper { +@@ -601,22 +602,6 @@ static int pwrap_wait_for_state(struct pmic_wrapper *wrp, + } while (1); + } + +-static int pwrap_write(struct pmic_wrapper *wrp, u32 adr, u32 wdata) +-{ +- int ret; +- +- ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle); +- if (ret) { +- pwrap_leave_fsm_vldclr(wrp); +- return ret; +- } +- +- pwrap_writel(wrp, (1 << 31) | ((adr >> 1) << 16) | wdata, +- PWRAP_WACS2_CMD); +- +- return 0; +-} +- + static int pwrap_read16(struct pmic_wrapper *wrp, u32 adr, u32 *rdata) + { + int ret; +@@ -673,6 +658,56 @@ static int pwrap_read(struct pmic_wrapper *wrp, u32 adr, u32 *rdata) + return wrp->slave->pwrap_read(wrp, adr, rdata); + } + ++static int pwrap_write16(struct pmic_wrapper *wrp, u32 adr, u32 wdata) ++{ ++ int ret; ++ ++ ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle); ++ if (ret) { ++ pwrap_leave_fsm_vldclr(wrp); ++ return ret; ++ } ++ ++ pwrap_writel(wrp, (1 << 31) | ((adr >> 1) << 16) | wdata, ++ PWRAP_WACS2_CMD); ++ ++ return 0; ++} ++ ++static int pwrap_write32(struct pmic_wrapper *wrp, u32 adr, u32 wdata) ++{ ++ int ret, msb, rdata; ++ ++ for (msb = 0; msb < 2; msb++) { ++ ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle); ++ if (ret) { ++ pwrap_leave_fsm_vldclr(wrp); ++ return ret; ++ } ++ ++ pwrap_writel(wrp, (1 << 31) | (msb << 30) | (adr << 16) | ++ ((wdata >> (msb * 16)) & 0xffff), ++ PWRAP_WACS2_CMD); ++ ++ /* ++ * The pwrap_read operation is the requirement of hardware used ++ * for the synchronization between two successive 16-bit ++ * pwrap_writel operations composing one 32-bit bus writing. ++ * Otherwise, we'll find the result fails on the lower 16-bit ++ * pwrap writing. ++ */ ++ if (!msb) ++ pwrap_read(wrp, adr, &rdata); ++ } ++ ++ return 0; ++} ++ ++static int pwrap_write(struct pmic_wrapper *wrp, u32 adr, u32 wdata) ++{ ++ return wrp->slave->pwrap_write(wrp, adr, wdata); ++} ++ + static int pwrap_regmap_read(void *context, u32 adr, u32 *rdata) + { + return pwrap_read(context, adr, rdata); +@@ -1082,18 +1117,21 @@ static const struct pwrap_slv_type pmic_mt6323 = { + .dew_regs = mt6323_regs, + .type = PMIC_MT6323, + .pwrap_read = pwrap_read16, ++ .pwrap_write = pwrap_write16, + }; + + static const struct pwrap_slv_type pmic_mt6380 = { + .dew_regs = NULL, + .type = PMIC_MT6380, + .pwrap_read = pwrap_read32, ++ .pwrap_write = pwrap_write32, + }; + + static const struct pwrap_slv_type pmic_mt6397 = { + .dew_regs = mt6397_regs, + .type = PMIC_MT6397, + .pwrap_read = pwrap_read16, ++ .pwrap_write = pwrap_write16, + }; + + static const struct of_device_id of_slave_match_tbl[] = { +-- +2.11.0 + -- cgit v1.2.3