Add PMIC support to MediaTek MT7622 SoC
v3 cover Add PMIC support to MediaTek MT7622 SoC
From: Sean Wang <sean.wang-NuS5LvNUpcJWk0Htik3J/[email protected]>
Changes since v2:
- for patch 1/2, enhance the document as the suggestions from v2.
- for patch 3, constify the table with struct regulator_ops, also fix that regulator doesn't have modesetting facilities it just shouldn't have the ops and finally fix copy+paste mistake in warranty disclaimer.
- for patch 7/8, sort the things added for MT7622/MT6380 alphabetically.
Chenglin Xu (2):
regulator: mt6380: Add support for MT6380
soc: mediatek: pwrap: add support for MT7622 SoC
Sean Wang (7):
dt-bindings: arm: mediatek: add MT7622 string to the PMIC wrapper doc
dt-bindings: regulator: Add document for MediaTek MT6380 regulator
soc: mediatek: pwrap: add pwrap_read32 for reading in 32-bit mode
soc: mediatek: pwrap: add pwrap_write32 for writing in 32-bit mode
soc: mediatek: pwrap: update pwrap_init without slave programming
soc: mediatek: pwrap: add MediaTek MT6380 as one slave of pwrap
soc: mediatek: pwrap: fixup warnings from coding style
.../bindings/regulator/mt6380-regulator.txt | 89 +++++ .../devicetree/bindings/soc/mediatek/pwrap.txt | 1 + drivers/regulator/Kconfig | 9 + drivers/regulator/Makefile | 1 + drivers/regulator/mt6380-regulator.c | 352 +++++++++++++++++ drivers/soc/mediatek/mtk-pmic-wrap.c | 417 ++++++++++++++++++--- include/linux/regulator/mt6380-regulator.h | 32 ++ 7 files changed, 845 insertions(+), 56 deletions(-) create mode 100644 Documentation/devicetree/bindings/regulator/mt6380-regulator.txt create mode 100644 drivers/regulator/mt6380-regulator.c create mode 100644 include/linux/regulator/mt6380-regulator.h
Signature · 1 line
2.7.4
PATCH v3 1/9 dt-bindings: arm: mediatek: add MT7622 string to the PMIC wrapper doc
From: Sean Wang <[email protected]>
--- Documentation/devicetree/bindings/soc/mediatek/pwrap.txt | 1 + 1 file changed, 1 insertion(+)
Documentation/devicetree/bindings/soc/mediatek/pwrap.txt +1 -0
@@ -19,6 +19,7 @@ IP Pairing Required properties in pwrap device node. - compatible: "mediatek,mt2701-pwrap" for MT2701/7623 SoCs + "mediatek,mt7622-pwrap" for MT7622 SoCs "mediatek,mt8135-pwrap" for MT8135 SoCs "mediatek,mt8173-pwrap" for MT8173 SoCs - interrupts: IRQ for pwrap in SOC
Signature · 1 line
2.7.4
PATCH v3 2/9 dt-bindings: regulator: Add document for MediaTek MT6380 regulator
In reply to [email protected]From: Sean Wang <sean.wang-NuS5LvNUpcJWk0Htik3J/[email protected]>
add dt-binding document for MediaTek MT6380 PMIC
--- .../bindings/regulator/mt6380-regulator.txt | 89 ++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 Documentation/devicetree/bindings/regulator/mt6380-regulator.txt
Documentation/devicetree/bindings/regulator/mt6380-regulator.txt new file +89 -0
@@ -0,0 +1,89 @@ +MediaTek MT6380 Regulator + +All voltage regulators provided by the MT6380 PMIC are described as the +subnodes of the MT6380 regulators node. Each regulator is named according +to its regulator type, buck-<name> and ldo-<name>. The definition for each +of these nodes is defined using the standard binding for regulators at +Documentation/devicetree/bindings/regulator/regulator.txt. + +The valid names for regulators are: +BUCK: + buck-core1, buck-vcore, buck-vrf +LDO: + ldo-vm ,ldo-va , ldo-vphy, ldo-vddr, ldo-vt + +Example: + + regulators { + compatible = "mediatek,mt6380-regulator"; + + mt6380_vcpu_reg: buck-vcore1 { + regulator-name = "vcore1"; + regulator-min-microvolt = < 600000>; + regulator-max-microvolt = <1393750>; + regulator-ramp-delay = <6250>; + regulator-always-on; + regulator-boot-on; + }; + + mt6380_vcore_reg: buck-vcore { + regulator-name = "vcore"; + regulator-min-microvolt = <600000>; + regulator-max-microvolt = <1393750>; + regulator-ramp-delay = <6250>; + }; + + mt6380_vrf_reg: buck-vrf { + regulator-name = "vrf"; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1575000>; + regulator-ramp-delay = <0>; + regulator-always-on; + regulator-boot-on; + }; + + mt6380_vm_reg: ldo-vm { + regulator-name = "vm"; + regulator-min-microvolt = <1050000>; + regulator-max-microvolt = <1400000>; + regulator-ramp-delay = <0>; + regulator-always-on; + regulator-boot-on; + }; + + mt6380_va_reg: ldo-va { + regulator-name = "va"; + regulator-min-microvolt = <2200000>; + regulator-max-microvolt = <3300000>; + regulator-ramp-delay = <0>; + regulator-always-on; + regulator-boot-on; + }; + + mt6380_vphy_reg: ldo-vphy { + regulator-name = "vphy"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-ramp-delay = <0>; + regulator-always-on; + regulator-boot-on; + }; + + mt6380_vddr_reg: ldo-vddr { + regulator-name = "vddr"; + regulator-min-microvolt = <1240000>; + regulator-max-microvolt = <1840000>; + regulator-ramp-delay = <0>; + regulator-always-on; + regulator-boot-on; + }; + + mt6380_vt_reg: ldo-vt { + regulator-name = "vt"; + regulator-min-microvolt = <2200000>; + regulator-max-microvolt = <3300000>; + regulator-ramp-delay = <0>; + regulator-always-on; + regulator-boot-on; + }; + };
Signature · 1 line
2.7.4
PATCH v3 3/9 regulator: mt6380: Add support for MT6380
In reply to [email protected]From: Chenglin Xu <chenglin.xu-NuS5LvNUpcJWk0Htik3J/[email protected]>
The MT6380 is a regulator found those boards with MediaTek MT7622 SoC It is connected as a slave to the SoC using MediaTek PMIC wrapper which is the common interface connecting with Mediatek made various PMICs.
--- drivers/regulator/Kconfig | 9 + drivers/regulator/Makefile | 1 + drivers/regulator/mt6380-regulator.c | 352 +++++++++++++++++++++++++++++ include/linux/regulator/mt6380-regulator.h | 32 +++ 4 files changed, 394 insertions(+) create mode 100644 drivers/regulator/mt6380-regulator.c create mode 100644 include/linux/regulator/mt6380-regulator.h
drivers/regulator/Kconfig +9 -0
@@ -559,6 +559,15 @@ config REGULATOR_MT6323 This driver supports the control of different power rails of device through regulator interface. +config REGULATOR_MT6380 + tristate "MediaTek MT6380 PMIC" + depends on MTK_PMIC_WRAP + help + Say y here to select this option to enable the power regulator of + MediaTek MT6380 PMIC. + This driver supports the control of different power rails of device + through regulator interface. + config REGULATOR_MT6397 tristate "MediaTek MT6397 PMIC" depends on MFD_MT6397
drivers/regulator/Makefile +1 -0
@@ -72,6 +72,7 @@ obj-$(CONFIG_REGULATOR_MC13892) += mc13892-regulator.o obj-$(CONFIG_REGULATOR_MC13XXX_CORE) += mc13xxx-regulator-core.o obj-$(CONFIG_REGULATOR_MT6311) += mt6311-regulator.o obj-$(CONFIG_REGULATOR_MT6323) += mt6323-regulator.o +obj-$(CONFIG_REGULATOR_MT6380) += mt6380-regulator.o obj-$(CONFIG_REGULATOR_MT6397) += mt6397-regulator.o obj-$(CONFIG_REGULATOR_QCOM_RPM) += qcom_rpm-regulator.o obj-$(CONFIG_REGULATOR_QCOM_SMD_RPM) += qcom_smd-regulator.o
drivers/regulator/mt6380-regulator.c new file +352 -0
352 lines not on this page · raw message
include/linux/regulator/mt6380-regulator.h new file +32 -0
@@ -0,0 +1,32 @@ +/* +* Copyright (c) 2017 MediaTek Inc. +* Author: Chenglin Xu <chenglin.xu-NuS5LvNUpcJWk0Htik3J/[email protected]> +* +* 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 the +* GNU General Public License for more details. +*/ + +#ifndef __LINUX_REGULATOR_mt6380_H +#define __LINUX_REGULATOR_mt6380_H + +enum { +MT6380_ID_VCPU =0 , +MT6380_ID_VCORE , +MT6380_ID_VRF , +MT6380_ID_VMLDO , +MT6380_ID_VALDO , +MT6380_ID_VPHYLDO , +MT6380_ID_VDDRLDO , +MT6380_ID_VTLDO , +MT6380_ID_RG_MAX , +}; + +#define MT6380_MAX_REGULATOR MT6380_ID_RG_MAX + +#endif /* __LINUX_REGULATOR_mt6380_H */
Signature · 1 line
2.7.4
PATCH v3 4/9 soc: mediatek: pwrap: add pwrap_read32 for reading in 32-bit mode
In reply to [email protected]From: Sean Wang <[email protected]>
Some regulators such as MediaTek MT6380 has to be read in 32-bit mode. So the patch adds pwrap_read32, rename old pwrap_read into pwrap_read16 and one function pointer is introduced for increasing flexibility allowing the determination which mode is used by the pwrap slave detection through device tree.
--- drivers/soc/mediatek/mtk-pmic-wrap.c | 54 +++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-)
drivers/soc/mediatek/mtk-pmic-wrap.c +53 -1
@@ -487,6 +487,7 @@ static int mt8135_regs[] = {enum pmic_type {PMIC_MT6323 , +PMIC_MT6380 ,PMIC_MT6397 , };
@@ -496,9 +497,15 @@ enum pwrap_type { PWRAP_MT8173, }; +struct pmic_wrapper ;struct pwrap_slv_type {const u32 *dew_regs;enum pmic_type type; +/* pwrap operations are highly associated with the PMIC types, +* so the pointers added increases flexibility allowing determination +* which type is used by the detection through device tree. +*/ +int (*pwrap_read)(struct pmic_wrapper *wrp,u32 adr,u32 *rdata); };struct pmic_wrapper {
@@ -609,7 +616,7 @@ static int pwrap_write(struct pmic_wrapper *wrp, u32 adr, u32 wdata)return 0 ; } -static int pwrap_read (struct pmic_wrapper *wrp,u32 adr,u32 *rdata) +static int pwrap_read16 (struct pmic_wrapper *wrp,u32 adr,u32 *rdata) {int ret;
@@ -632,6 +639,39 @@ static int pwrap_read(struct pmic_wrapper *wrp, u32 adr, u32 *rdata)return 0 ; } +static int pwrap_read32 (struct pmic_wrapper *wrp,u32 adr,u32 *rdata) +{ +int ret, msb; + + *rdata =0 ; +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, ((msb <<30 ) | (adr <<16 )), +PWRAP_WACS2_CMD ); + + ret =pwrap_wait_for_state (wrp, pwrap_is_fsm_vldclr); +if (ret) +return ret; + + *rdata += (PWRAP_GET_WACS_RDATA (pwrap_readl (wrp, +PWRAP_WACS2_RDATA )) << (16 * msb)); + +pwrap_writel (wrp,1 ,PWRAP_WACS2_VLDCLR ); + } + +return 0 ; +} + +static int pwrap_read (struct pmic_wrapper *wrp,u32 adr,u32 *rdata) +{ +return wrp->slave->pwrap_read (wrp, adr, rdata); +} +static int pwrap_regmap_read (void *context,u32 adr,u32 *rdata) {return pwrap_read (context, adr, rdata);
@@ -752,6 +792,8 @@ static int pwrap_mt2701_init_reg_clock(struct pmic_wrapper *wrp)pwrap_writel (wrp,0x2 ,PWRAP_CSLEXT_START );pwrap_writel (wrp,0x2 ,PWRAP_CSLEXT_END );break ; +default : +break ; }return 0 ;
@@ -815,6 +857,8 @@ static int pwrap_init_cipher(struct pmic_wrapper *wrp)pwrap_write (wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_EN ],0x1 );break ; +default : +break ; }/* wait for cipher data ready@AP */
@@ -1035,11 +1079,19 @@ static const struct regmap_config pwrap_regmap_config = {static const struct pwrap_slv_type pmic_mt6323 = { .dew_regs = mt6323_regs, .type =PMIC_MT6323 , + .pwrap_read = pwrap_read16, +}; + +static const struct pwrap_slv_type pmic_mt6380 = { + .dew_regs =NULL , + .type =PMIC_MT6380 , + .pwrap_read = pwrap_read32, };static const struct pwrap_slv_type pmic_mt6397 = { .dew_regs = mt6397_regs, .type =PMIC_MT6397 , + .pwrap_read = pwrap_read16, };static const struct of_device_id of_slave_match_tbl[] = {
Signature · 1 line
2.7.4
PATCH v3 5/9 soc: mediatek: pwrap: add pwrap_write32 for writing in 32-bit mode
In reply to [email protected]From: Sean Wang <[email protected]>
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.
--- drivers/soc/mediatek/mtk-pmic-wrap.c | 63 +++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 16 deletions(-)
drivers/soc/mediatek/mtk-pmic-wrap.c +47 -16
@@ -506,6 +506,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 {
@@ -600,22 +601,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;
@@ -672,6 +657,49 @@ 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 ); + +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);
@@ -1080,18 +1108,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[] = {
Signature · 1 line
2.7.4
PATCH v3 6/9 soc: mediatek: pwrap: update pwrap_init without slave programming
In reply to [email protected]From: Sean Wang <sean.wang-NuS5LvNUpcJWk0Htik3J/[email protected]>
pwrap initialization is highly associated with the base SoC, so update here for allowing pwrap_init without slave program which would be used to those PMICs without extra encryption on bus such as MT6380.
--- drivers/soc/mediatek/mtk-pmic-wrap.c | 91 +++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 37 deletions(-)
drivers/soc/mediatek/mtk-pmic-wrap.c +54 -37
@@ -531,6 +531,7 @@ struct pmic_wrapper_type {u32 spi_w;u32 wdt_src; int has_bridge:1; + int slv_program:1;int (*init_reg_clock)(struct pmic_wrapper *wrp);int (*init_soc_specific)(struct pmic_wrapper *wrp); };
@@ -999,9 +1000,12 @@ static int pwrap_init(struct pmic_wrapper *wrp) }/* Reset SPI slave */ - ret =pwrap_reset_spislave (wrp); -if (ret) -return ret; + +if (wrp->master->slv_program) { + ret =pwrap_reset_spislave (wrp); +if (ret) +return ret; + }pwrap_writel (wrp,1 ,PWRAP_WRAP_EN );
@@ -1013,45 +1017,52 @@ static int pwrap_init(struct pmic_wrapper *wrp)if (ret)return ret; -/* Setup serial input delay */ - ret =pwrap_init_sidly (wrp); -if (ret) -return ret; +if (wrp->master->slv_program) { +/* Setup serial input delay */ + ret =pwrap_init_sidly (wrp); +if (ret) +return ret; -/* Enable dual IO mode */ -pwrap_write (wrp, wrp->slave->dew_regs[PWRAP_DEW_DIO_EN ],1 ); +/* Enable dual IO mode */ +pwrap_write (wrp, wrp->slave->dew_regs[PWRAP_DEW_DIO_EN ],1 ); -/* Check IDLE & INIT_DONE in advance */ - ret =pwrap_wait_for_state (wrp, pwrap_is_fsm_idle_and_sync_idle); -if (ret) { -dev_err (wrp->dev,"%s fail, ret=%d\n" , __func__, ret); -return ret; - } +/* Check IDLE & INIT_DONE in advance */ + ret =pwrap_wait_for_state (wrp, + pwrap_is_fsm_idle_and_sync_idle); +if (ret) { +dev_err (wrp->dev,"%s fail, ret=%d\n" , __func__, ret); +return ret; + } -pwrap_writel (wrp,1 ,PWRAP_DIO_EN ); +pwrap_writel (wrp,1 ,PWRAP_DIO_EN ); -/* Read Test */ -pwrap_read (wrp, wrp->slave->dew_regs[PWRAP_DEW_READ_TEST ], &rdata); -if (rdata !=PWRAP_DEW_READ_TEST_VAL ) { -dev_err (wrp->dev,"Read test failed after switch to DIO mode: 0x%04x != 0x%04x\n" , +/* Read Test */ +pwrap_read (wrp, + wrp->slave->dew_regs[PWRAP_DEW_READ_TEST ], &rdata); +if (rdata !=PWRAP_DEW_READ_TEST_VAL ) { +dev_err (wrp->dev, +"Read failed on DIO mode: 0x%04x!=0x%04x\n" ,PWRAP_DEW_READ_TEST_VAL , rdata); -return -EFAULT ; - } - -/* Enable encryption */ - ret =pwrap_init_cipher (wrp); -if (ret) -return ret; +return -EFAULT ; + } -/* Signature checking - using CRC */ -if (pwrap_write (wrp, wrp->slave->dew_regs[PWRAP_DEW_CRC_EN ],0x1 )) -return -EFAULT ; +/* Enable encryption */ + ret =pwrap_init_cipher (wrp); +if (ret) +return ret; -pwrap_writel (wrp,0x1 ,PWRAP_CRC_EN ); -pwrap_writel (wrp,0x0 ,PWRAP_SIG_MODE ); -pwrap_writel (wrp, wrp->slave->dew_regs[PWRAP_DEW_CRC_VAL ], -PWRAP_SIG_ADR ); -pwrap_writel (wrp, wrp->master->arb_en_all,PWRAP_HIPRIO_ARB_EN ); +/* Signature checking - using CRC */ +if (pwrap_write (wrp, + wrp->slave->dew_regs[PWRAP_DEW_CRC_EN ],0x1 )) +return -EFAULT ; + +pwrap_writel (wrp,0x1 ,PWRAP_CRC_EN ); +pwrap_writel (wrp,0x0 ,PWRAP_SIG_MODE ); +pwrap_writel (wrp, wrp->slave->dew_regs[PWRAP_DEW_CRC_VAL ], +PWRAP_SIG_ADR ); +pwrap_writel (wrp, + wrp->master->arb_en_all,PWRAP_HIPRIO_ARB_EN ); + }if (wrp->master->type ==PWRAP_MT8135 )pwrap_writel (wrp,0x7 ,PWRAP_RRARB_EN );
@@ -1059,8 +1070,11 @@ static int pwrap_init(struct pmic_wrapper *wrp)pwrap_writel (wrp,0x1 ,PWRAP_WACS0_EN );pwrap_writel (wrp,0x1 ,PWRAP_WACS1_EN );pwrap_writel (wrp,0x1 ,PWRAP_WACS2_EN ); -pwrap_writel (wrp,0x5 ,PWRAP_STAUPD_PRD ); -pwrap_writel (wrp,0xff ,PWRAP_STAUPD_GRPEN ); + +if (wrp->master->slv_program) { +pwrap_writel (wrp,0x5 ,PWRAP_STAUPD_PRD ); +pwrap_writel (wrp,0xff ,PWRAP_STAUPD_GRPEN ); + }if (wrp->master->init_soc_specific) { ret = wrp->master->init_soc_specific (wrp);
@@ -1146,6 +1160,7 @@ static const struct pmic_wrapper_type pwrap_mt2701 = { .spi_w = PWRAP_MAN_CMD_SPI_WRITE_NEW, .wdt_src = PWRAP_WDT_SRC_MASK_ALL, .has_bridge = 0, + .slv_program = 1, .init_reg_clock = pwrap_mt2701_init_reg_clock, .init_soc_specific = pwrap_mt2701_init_soc_specific, };
@@ -1158,6 +1173,7 @@ static const struct pmic_wrapper_type pwrap_mt8135 = { .spi_w = PWRAP_MAN_CMD_SPI_WRITE, .wdt_src = PWRAP_WDT_SRC_MASK_ALL, .has_bridge = 1, + .slv_program = 1, .init_reg_clock = pwrap_mt8135_init_reg_clock, .init_soc_specific = pwrap_mt8135_init_soc_specific, };
@@ -1170,6 +1186,7 @@ static const struct pmic_wrapper_type pwrap_mt8173 = { .spi_w = PWRAP_MAN_CMD_SPI_WRITE, .wdt_src = PWRAP_WDT_SRC_MASK_NO_STAUPD, .has_bridge = 0, + .slv_program = 1, .init_reg_clock = pwrap_mt8173_init_reg_clock, .init_soc_specific = pwrap_mt8173_init_soc_specific, };
Signature · 1 line
2.7.4
PATCH v3 7/9 soc: mediatek: pwrap: add MediaTek MT6380 as one slave of pwrap
In reply to [email protected]From: Sean Wang <sean.wang-NuS5LvNUpcJWk0Htik3J/[email protected]>
Add MediaTek MT6380 regulator becoming one of PMIC wrapper slave and also add extra new regmap_config of 32-bit mode for MT6380 since old regmap_config of 16-bit mode can't be fit into the need.
--- drivers/soc/mediatek/mtk-pmic-wrap.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-)
drivers/soc/mediatek/mtk-pmic-wrap.c +22 -3
@@ -501,6 +501,7 @@ struct pmic_wrapper;struct pwrap_slv_type {const u32 *dew_regs;enum pmic_type type; +const struct regmap_config *regmap;/* pwrap operations are highly associated with the PMIC types, * so the pointers added increases flexibility allowing determination * which type is used by the detection through device tree.
@@ -1109,7 +1110,7 @@ static irqreturn_t pwrap_interrupt(int irqno, void *dev_id)return IRQ_HANDLED ; } -static const struct regmap_config pwrap_regmap_config = { +static const struct regmap_config pwrap_regmap_config16 = { .reg_bits =16 , .val_bits =16 , .reg_stride =2 ,
@@ -1118,9 +1119,19 @@ static const struct regmap_config pwrap_regmap_config = { .max_register = 0xffff, }; +static const struct regmap_config pwrap_regmap_config32 = { + .reg_bits =32 , + .val_bits =32 , + .reg_stride =4 , + .reg_read = pwrap_regmap_read, + .reg_write = pwrap_regmap_write, + .max_register =0xffff , +}; +static const struct pwrap_slv_type pmic_mt6323 = { .dew_regs = mt6323_regs, .type =PMIC_MT6323 , + .regmap = &pwrap_regmap_config16, .pwrap_read = pwrap_read16, .pwrap_write = pwrap_write16, };
@@ -1128,6 +1139,7 @@ static const struct pwrap_slv_type pmic_mt6323 = {static const struct pwrap_slv_type pmic_mt6380 = { .dew_regs =NULL , .type =PMIC_MT6380 , + .regmap = &pwrap_regmap_config32, .pwrap_read = pwrap_read32, .pwrap_write = pwrap_write32, };
@@ -1135,6 +1147,7 @@ static const struct pwrap_slv_type pmic_mt6380 = {static const struct pwrap_slv_type pmic_mt6397 = { .dew_regs = mt6397_regs, .type =PMIC_MT6397 , + .regmap = &pwrap_regmap_config16, .pwrap_read = pwrap_read16, .pwrap_write = pwrap_write16, };
@@ -1144,9 +1157,15 @@ static const struct of_device_id of_slave_match_tbl[] = { .compatible = "mediatek,mt6323", .data = &pmic_mt6323, }, { +/* The MT6380 slave device is directly pointed to the regulator +* device which is different from the cases MT6323 and MT6397 +* where they're one kind of MFDs. +*/ + .compatible = "mediatek,mt6380-regulator", + .data = &pmic_mt6380, + }, { .compatible = "mediatek,mt6397", .data = &pmic_mt6397, - }, {/* sentinel */ } };
@@ -1325,7 +1344,7 @@ static int pwrap_probe(struct platform_device *pdev)if (ret) goto err_out2; - wrp->regmap =devm_regmap_init (wrp->dev,NULL , wrp, &pwrap_regmap_config); + wrp->regmap =devm_regmap_init (wrp->dev,NULL , wrp, wrp->slave->regmap);if (IS_ERR (wrp->regmap)) { ret =PTR_ERR (wrp->regmap); goto err_out2;
Signature · 6 lines
2.7.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v3 8/9 soc: mediatek: pwrap: add support for MT7622 SoC
In reply to [email protected]From: Chenglin Xu <chenglin.xu-NuS5LvNUpcJWk0Htik3J/[email protected]>
Add the registers, callbacks and data structures required to make the PMIC wrapper work on MT7622.
--- drivers/soc/mediatek/mtk-pmic-wrap.c | 180 +++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+)
drivers/soc/mediatek/mtk-pmic-wrap.c +180 -0
@@ -208,6 +208,36 @@ enum pwrap_regs {PWRAP_ADC_RDATA_ADDR1 ,PWRAP_ADC_RDATA_ADDR2 , +/* MT7622 only regs */ +PWRAP_EINT_STA0_ADR , +PWRAP_EINT_STA1_ADR , +PWRAP_STA , +PWRAP_CLR , +PWRAP_DVFS_ADR8 , +PWRAP_DVFS_WDATA8 , +PWRAP_DVFS_ADR9 , +PWRAP_DVFS_WDATA9 , +PWRAP_DVFS_ADR10 , +PWRAP_DVFS_WDATA10 , +PWRAP_DVFS_ADR11 , +PWRAP_DVFS_WDATA11 , +PWRAP_DVFS_ADR12 , +PWRAP_DVFS_WDATA12 , +PWRAP_DVFS_ADR13 , +PWRAP_DVFS_WDATA13 , +PWRAP_DVFS_ADR14 , +PWRAP_DVFS_WDATA14 , +PWRAP_DVFS_ADR15 , +PWRAP_DVFS_WDATA15 , +PWRAP_EXT_CK , +PWRAP_ADC_RDATA_ADDR , +PWRAP_GPS_STA , +PWRAP_SW_RST , +PWRAP_DVFS_STEP_CTRL0 , +PWRAP_DVFS_STEP_CTRL1 , +PWRAP_DVFS_STEP_CTRL2 , +PWRAP_SPI2_CTRL , +/* MT8135 only regs */ PWRAP_CSHEXT , PWRAP_EVENT_IN_EN,
@@ -330,6 +360,118 @@ static int mt2701_regs[] = { [PWRAP_ADC_RDATA_ADDR2] = 0x154, }; +static int mt7622_regs[] = { + [PWRAP_MUX_SEL ] =0x0 , + [PWRAP_WRAP_EN ] =0x4 , + [PWRAP_DIO_EN ] =0x8 , + [PWRAP_SIDLY ] =0xC , + [PWRAP_RDDMY ] =0x10 , + [PWRAP_SI_CK_CON ] =0x14 , + [PWRAP_CSHEXT_WRITE ] =0x18 , + [PWRAP_CSHEXT_READ ] =0x1C , + [PWRAP_CSLEXT_START ] =0x20 , + [PWRAP_CSLEXT_END ] =0x24 , + [PWRAP_STAUPD_PRD ] =0x28 , + [PWRAP_STAUPD_GRPEN ] =0x2C , + [PWRAP_EINT_STA0_ADR ] =0x30 , + [PWRAP_EINT_STA1_ADR ] =0x34 , + [PWRAP_STA ] =0x38 , + [PWRAP_CLR ] =0x3C , + [PWRAP_STAUPD_MAN_TRIG ] =0x40 , + [PWRAP_STAUPD_STA ] =0x44 , + [PWRAP_WRAP_STA ] =0x48 , + [PWRAP_HARB_INIT ] =0x4C , + [PWRAP_HARB_HPRIO ] =0x50 , + [PWRAP_HIPRIO_ARB_EN ] =0x54 , + [PWRAP_HARB_STA0 ] =0x58 , + [PWRAP_HARB_STA1 ] =0x5C , + [PWRAP_MAN_EN ] =0x60 , + [PWRAP_MAN_CMD ] =0x64 , + [PWRAP_MAN_RDATA ] =0x68 , + [PWRAP_MAN_VLDCLR ] =0x6C , + [PWRAP_WACS0_EN ] =0x70 , + [PWRAP_INIT_DONE0 ] =0x74 , + [PWRAP_WACS0_CMD ] =0x78 , + [PWRAP_WACS0_RDATA ] =0x7C , + [PWRAP_WACS0_VLDCLR ] =0x80 , + [PWRAP_WACS1_EN ] =0x84 , + [PWRAP_INIT_DONE1 ] =0x88 , + [PWRAP_WACS1_CMD ] =0x8C , + [PWRAP_WACS1_RDATA ] =0x90 , + [PWRAP_WACS1_VLDCLR ] =0x94 , + [PWRAP_WACS2_EN ] =0x98 , + [PWRAP_INIT_DONE2 ] =0x9C , + [PWRAP_WACS2_CMD ] =0xA0 , + [PWRAP_WACS2_RDATA ] =0xA4 , + [PWRAP_WACS2_VLDCLR ] =0xA8 , + [PWRAP_INT_EN ] =0xAC , + [PWRAP_INT_FLG_RAW ] =0xB0 , + [PWRAP_INT_FLG ] =0xB4 , + [PWRAP_INT_CLR ] =0xB8 , + [PWRAP_SIG_ADR ] =0xBC , + [PWRAP_SIG_MODE ] =0xC0 , + [PWRAP_SIG_VALUE ] =0xC4 , + [PWRAP_SIG_ERRVAL ] =0xC8 , + [PWRAP_CRC_EN ] =0xCC , + [PWRAP_TIMER_EN ] =0xD0 , + [PWRAP_TIMER_STA ] =0xD4 , + [PWRAP_WDT_UNIT ] =0xD8 , + [PWRAP_WDT_SRC_EN ] =0xDC , + [PWRAP_WDT_FLG ] =0xE0 , + [PWRAP_DEBUG_INT_SEL ] =0xE4 , + [PWRAP_DVFS_ADR0 ] =0xE8 , + [PWRAP_DVFS_WDATA0 ] =0xEC , + [PWRAP_DVFS_ADR1 ] =0xF0 , + [PWRAP_DVFS_WDATA1 ] =0xF4 , + [PWRAP_DVFS_ADR2 ] =0xF8 , + [PWRAP_DVFS_WDATA2 ] =0xFC , + [PWRAP_DVFS_ADR3 ] =0x100 , + [PWRAP_DVFS_WDATA3 ] =0x104 , + [PWRAP_DVFS_ADR4 ] =0x108 , + [PWRAP_DVFS_WDATA4 ] =0x10C , + [PWRAP_DVFS_ADR5 ] =0x110 , + [PWRAP_DVFS_WDATA5 ] =0x114 , + [PWRAP_DVFS_ADR6 ] =0x118 , + [PWRAP_DVFS_WDATA6 ] =0x11C , + [PWRAP_DVFS_ADR7 ] =0x120 , + [PWRAP_DVFS_WDATA7 ] =0x124 , + [PWRAP_DVFS_ADR8 ] =0x128 , + [PWRAP_DVFS_WDATA8 ] =0x12C , + [PWRAP_DVFS_ADR9 ] =0x130 , + [PWRAP_DVFS_WDATA9 ] =0x134 , + [PWRAP_DVFS_ADR10 ] =0x138 , + [PWRAP_DVFS_WDATA10 ] =0x13C , + [PWRAP_DVFS_ADR11 ] =0x140 , + [PWRAP_DVFS_WDATA11 ] =0x144 , + [PWRAP_DVFS_ADR12 ] =0x148 , + [PWRAP_DVFS_WDATA12 ] =0x14C , + [PWRAP_DVFS_ADR13 ] =0x150 , + [PWRAP_DVFS_WDATA13 ] =0x154 , + [PWRAP_DVFS_ADR14 ] =0x158 , + [PWRAP_DVFS_WDATA14 ] =0x15C , + [PWRAP_DVFS_ADR15 ] =0x160 , + [PWRAP_DVFS_WDATA15 ] =0x164 , + [PWRAP_SPMINF_STA ] =0x168 , + [PWRAP_CIPHER_KEY_SEL ] =0x16C , + [PWRAP_CIPHER_IV_SEL ] =0x170 , + [PWRAP_CIPHER_EN ] =0x174 , + [PWRAP_CIPHER_RDY ] =0x178 , + [PWRAP_CIPHER_MODE ] =0x17C , + [PWRAP_CIPHER_SWRST ] =0x180 , + [PWRAP_DCM_EN ] =0x184 , + [PWRAP_DCM_DBC_PRD ] =0x188 , + [PWRAP_EXT_CK ] =0x18C , + [PWRAP_ADC_CMD_ADDR ] =0x190 , + [PWRAP_PWRAP_ADC_CMD ] =0x194 , + [PWRAP_ADC_RDATA_ADDR ] =0x198 , + [PWRAP_GPS_STA ] =0x19C , + [PWRAP_SW_RST ] =0x1A0 , + [PWRAP_DVFS_STEP_CTRL0 ] =0x238 , + [PWRAP_DVFS_STEP_CTRL1 ] =0x23C , + [PWRAP_DVFS_STEP_CTRL2 ] =0x240 , + [PWRAP_SPI2_CTRL ] =0x244 , +}; +static int mt8173_regs[] = { [PWRAP_MUX_SEL ] =0x0 , [PWRAP_WRAP_EN ] =0x4 ,
@@ -493,6 +635,7 @@ enum pmic_type {enum pwrap_type {PWRAP_MT2701 , +PWRAP_MT7622 ,PWRAP_MT8135 ,PWRAP_MT8173 , };
@@ -829,6 +972,16 @@ static int pwrap_mt2701_init_reg_clock(struct pmic_wrapper *wrp)return 0 ; } +static int pwrap_mt7622_init_reg_clock (struct pmic_wrapper *wrp) +{ +pwrap_writel (wrp,0x0 ,PWRAP_CSHEXT_WRITE ); +pwrap_writel (wrp,0x4 ,PWRAP_CSHEXT_READ ); +pwrap_writel (wrp,0x2 ,PWRAP_CSLEXT_START ); +pwrap_writel (wrp,0x2 ,PWRAP_CSLEXT_END ); + +return 0 ; +} +static bool pwrap_is_cipher_ready (struct pmic_wrapper *wrp) {return pwrap_readl (wrp,PWRAP_CIPHER_RDY ) &1 ;
@@ -866,6 +1019,9 @@ static int pwrap_init_cipher(struct pmic_wrapper *wrp)case PWRAP_MT8173 :pwrap_writel (wrp,1 ,PWRAP_CIPHER_EN );break ; +case PWRAP_MT7622 : +pwrap_writel (wrp,0 ,PWRAP_CIPHER_EN ); +break ; }/* Config cipher mode @PMIC */
@@ -985,6 +1141,15 @@ static int pwrap_mt2701_init_soc_specific(struct pmic_wrapper *wrp)return 0 ; } +static int pwrap_mt7622_init_soc_specific (struct pmic_wrapper *wrp) +{ +pwrap_writel (wrp,0 ,PWRAP_STAUPD_PRD ); +/*enable 2wire SPI master*/ +pwrap_writel (wrp,0x8000000 ,PWRAP_SPI2_CTRL ); + +return 0 ; +} +static int pwrap_init (struct pmic_wrapper *wrp) {int ret;
@@ -1184,6 +1349,18 @@ static const struct pmic_wrapper_type pwrap_mt2701 = { .init_soc_specific = pwrap_mt2701_init_soc_specific, }; +static struct pmic_wrapper_type pwrap_mt7622 = { + .regs = mt7622_regs, + .type =PWRAP_MT7622 , + .arb_en_all =0xff , + .int_en_all = ~(u32 )BIT (31 ), + .spi_w =PWRAP_MAN_CMD_SPI_WRITE , + .wdt_src =PWRAP_WDT_SRC_MASK_ALL , + .has_bridge =0 , + .init_reg_clock = pwrap_mt7622_init_reg_clock, + .init_soc_specific = pwrap_mt7622_init_soc_specific, +}; +static const struct pmic_wrapper_type pwrap_mt8135 = { .regs = mt8135_regs, .type =PWRAP_MT8135 ,
@@ -1215,6 +1392,9 @@ static const struct of_device_id of_pwrap_match_tbl[] = { .compatible = "mediatek,mt2701-pwrap", .data = &pwrap_mt2701, }, { + .compatible = "mediatek,mt7622-pwrap", + .data = &pwrap_mt7622, + }, { .compatible = "mediatek,mt8135-pwrap", .data = &pwrap_mt8135, }, {
Signature · 1 line
2.7.4
PATCH v3 9/9 soc: mediatek: pwrap: fixup warnings from coding style
In reply to [email protected]From: Sean Wang <[email protected]>
fixup those warnings such as lines over 80 words and parenthesis alignment which would be complained by checkpatch.pl.
--- drivers/soc/mediatek/mtk-pmic-wrap.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-)
drivers/soc/mediatek/mtk-pmic-wrap.c +13 -7
@@ -1057,7 +1057,8 @@ static int pwrap_init_cipher(struct pmic_wrapper *wrp)/* wait for cipher data ready@PMIC */ ret =pwrap_wait_for_state (wrp, pwrap_is_pmic_cipher_ready);if (ret) { -dev_err (wrp->dev,"timeout waiting for cipher data ready@PMIC\n" ); +dev_err (wrp->dev, +"timeout waiting for cipher data ready@PMIC\n" );return ret; }
@@ -1458,23 +1459,27 @@ static int pwrap_probe(struct platform_device *pdev)if (IS_ERR (wrp->bridge_base))return PTR_ERR (wrp->bridge_base); - wrp->rstc_bridge =devm_reset_control_get (wrp->dev,"pwrap-bridge" ); + wrp->rstc_bridge =devm_reset_control_get (wrp->dev, +"pwrap-bridge" );if (IS_ERR (wrp->rstc_bridge)) { ret =PTR_ERR (wrp->rstc_bridge); -dev_dbg (wrp->dev,"cannot get pwrap-bridge reset: %d\n" , ret); +dev_dbg (wrp->dev, +"cannot get pwrap-bridge reset: %d\n" , ret);return ret; } } wrp->clk_spi =devm_clk_get (wrp->dev,"spi" );if (IS_ERR (wrp->clk_spi)) { -dev_dbg (wrp->dev,"failed to get clock: %ld\n" ,PTR_ERR (wrp->clk_spi)); +dev_dbg (wrp->dev,"failed to get clock: %ld\n" , +PTR_ERR (wrp->clk_spi));return PTR_ERR (wrp->clk_spi); } wrp->clk_wrap =devm_clk_get (wrp->dev,"wrap" );if (IS_ERR (wrp->clk_wrap)) { -dev_dbg (wrp->dev,"failed to get clock: %ld\n" ,PTR_ERR (wrp->clk_wrap)); +dev_dbg (wrp->dev,"failed to get clock: %ld\n" , +PTR_ERR (wrp->clk_wrap));return PTR_ERR (wrp->clk_wrap); }
@@ -1519,8 +1524,9 @@ static int pwrap_probe(struct platform_device *pdev)pwrap_writel (wrp, wrp->master->int_en_all,PWRAP_INT_EN ); irq =platform_get_irq (pdev,0 ); - ret =devm_request_irq (wrp->dev, irq, pwrap_interrupt,IRQF_TRIGGER_HIGH , -"mt-pmic-pwrap" , wrp); + ret =devm_request_irq (wrp->dev, irq, pwrap_interrupt, +IRQF_TRIGGER_HIGH , +"mt-pmic-pwrap" , wrp);if (ret) goto err_out2;
Signature · 1 line
2.7.4
Mark Brown
maintainerRe: [PATCH v3 2/9] dt-bindings: regulator: Add document for MediaTek MT6380 regulator
In reply to [email protected]Quoted 3 lines · On Tue, Aug 15, 2017 at 05:09:14PM +0800, [email protected] wrote:
From: Sean Wang <[email protected]>
add dt-binding document for MediaTek MT6380 PMIC
Please use subject lines reflecting the style for the subsystem.
Re: [PATCH v3 2/9] dt-bindings: regulator: Add document for MediaTek MT6380 regulator
Quoted 6 lines · Mark Brown
Quoted 3 lines · On Tue, Aug 15, 2017 at 05:09:14PM +0800…
From: Sean Wang <sean.wang-NuS5LvNUpcJWk0Htik3J/[email protected]>
add dt-binding document for MediaTek MT6380 PMIC
Please use subject lines reflecting the style for the subsystem.
Hi , Mark
do you mean should i use "dt-bindings: regulator: mediatek" similarly as the prefix instead of the one i currently use ? If so , i will improve this in the next version.
Sean
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Mark Brown
maintainerRe: [PATCH v3 2/9] dt-bindings: regulator: Add document for MediaTek MT6380 regulator
Quoted 7 lines · Sean Wang
Quoted 1 line · Mark Brown
Please use subject lines reflecting the style for the subsystem.
do you mean should i use "dt-bindings: regulator: mediatek" similarly as the prefix instead of the one i currently use ? If so , i will improve this in the next version.
No, drop the dt-bindings bit.
Mark Brown
maintainerApplied "regulator: Add document for MediaTek MT6380 regulator" to the regulator tree
In reply to [email protected]The patch
regulator: Add document for MediaTek MT6380 regulator
has been applied to the regulator tree at
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git
All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying to this mail.
Thanks,
Mark
Quoted 1 line
From
d57287b4fbf6bdb0386c839f2faa2ae4f6bad550Mon Sep 17 00:00:00 2001
From: Sean Wang <[email protected]>
Date: Tue, 15 Aug 2017 17:09:14 +0800
Subject: [PATCH] regulator: Add document for MediaTek MT6380 regulator
add dt-binding document for MediaTek MT6380 PMIC
--- .../bindings/regulator/mt6380-regulator.txt | 89 ++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 Documentation/devicetree/bindings/regulator/mt6380-regulator.txt
Documentation/devicetree/bindings/regulator/mt6380-regulator.txt new file +89 -0
@@ -0,0 +1,89 @@ +MediaTek MT6380 Regulator + +All voltage regulators provided by the MT6380 PMIC are described as the +subnodes of the MT6380 regulators node. Each regulator is named according +to its regulator type, buck-<name> and ldo-<name>. The definition for each +of these nodes is defined using the standard binding for regulators at +Documentation/devicetree/bindings/regulator/regulator.txt. + +The valid names for regulators are: +BUCK: + buck-core1, buck-vcore, buck-vrf +LDO: + ldo-vm ,ldo-va , ldo-vphy, ldo-vddr, ldo-vt + +Example: + + regulators { + compatible = "mediatek,mt6380-regulator"; + + mt6380_vcpu_reg: buck-vcore1 { + regulator-name = "vcore1"; + regulator-min-microvolt = < 600000>; + regulator-max-microvolt = <1393750>; + regulator-ramp-delay = <6250>; + regulator-always-on; + regulator-boot-on; + }; + + mt6380_vcore_reg: buck-vcore { + regulator-name = "vcore"; + regulator-min-microvolt = <600000>; + regulator-max-microvolt = <1393750>; + regulator-ramp-delay = <6250>; + }; + + mt6380_vrf_reg: buck-vrf { + regulator-name = "vrf"; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1575000>; + regulator-ramp-delay = <0>; + regulator-always-on; + regulator-boot-on; + }; + + mt6380_vm_reg: ldo-vm { + regulator-name = "vm"; + regulator-min-microvolt = <1050000>; + regulator-max-microvolt = <1400000>; + regulator-ramp-delay = <0>; + regulator-always-on; + regulator-boot-on; + }; + + mt6380_va_reg: ldo-va { + regulator-name = "va"; + regulator-min-microvolt = <2200000>; + regulator-max-microvolt = <3300000>; + regulator-ramp-delay = <0>; + regulator-always-on; + regulator-boot-on; + }; + + mt6380_vphy_reg: ldo-vphy { + regulator-name = "vphy"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-ramp-delay = <0>; + regulator-always-on; + regulator-boot-on; + }; + + mt6380_vddr_reg: ldo-vddr { + regulator-name = "vddr"; + regulator-min-microvolt = <1240000>; + regulator-max-microvolt = <1840000>; + regulator-ramp-delay = <0>; + regulator-always-on; + regulator-boot-on; + }; + + mt6380_vt_reg: ldo-vt { + regulator-name = "vt"; + regulator-min-microvolt = <2200000>; + regulator-max-microvolt = <3300000>; + regulator-ramp-delay = <0>; + regulator-always-on; + regulator-boot-on; + }; + };
Signature · 1 line
2.13.3
Mark Brown
maintainerApplied "regulator: mt6380: Add support for MT6380" to the regulator tree
In reply to [email protected]The patch
regulator: mt6380: Add support for MT6380
has been applied to the regulator tree at
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git
All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying to this mail.
Thanks,
Mark
Quoted 1 line
From
a551e27368dea202cbef3e8861c21d965427cfe6Mon Sep 17 00:00:00 2001
From: Chenglin Xu <[email protected]>
Date: Tue, 15 Aug 2017 17:09:15 +0800
Subject: [PATCH] regulator: mt6380: Add support for MT6380
The MT6380 is a regulator found those boards with MediaTek MT7622 SoC It is connected as a slave to the SoC using MediaTek PMIC wrapper which is the common interface connecting with Mediatek made various PMICs.
--- drivers/regulator/Kconfig | 9 + drivers/regulator/Makefile | 1 + drivers/regulator/mt6380-regulator.c | 352 +++++++++++++++++++++++++++++ include/linux/regulator/mt6380-regulator.h | 32 +++ 4 files changed, 394 insertions(+) create mode 100644 drivers/regulator/mt6380-regulator.c create mode 100644 include/linux/regulator/mt6380-regulator.h
drivers/regulator/Kconfig +9 -0
@@ -559,6 +559,15 @@ config REGULATOR_MT6323 This driver supports the control of different power rails of device through regulator interface. +config REGULATOR_MT6380 + tristate "MediaTek MT6380 PMIC" + depends on MTK_PMIC_WRAP + help + Say y here to select this option to enable the power regulator of + MediaTek MT6380 PMIC. + This driver supports the control of different power rails of device + through regulator interface. + config REGULATOR_MT6397 tristate "MediaTek MT6397 PMIC" depends on MFD_MT6397
drivers/regulator/Makefile +1 -0
@@ -72,6 +72,7 @@ obj-$(CONFIG_REGULATOR_MC13892) += mc13892-regulator.o obj-$(CONFIG_REGULATOR_MC13XXX_CORE) += mc13xxx-regulator-core.o obj-$(CONFIG_REGULATOR_MT6311) += mt6311-regulator.o obj-$(CONFIG_REGULATOR_MT6323) += mt6323-regulator.o +obj-$(CONFIG_REGULATOR_MT6380) += mt6380-regulator.o obj-$(CONFIG_REGULATOR_MT6397) += mt6397-regulator.o obj-$(CONFIG_REGULATOR_QCOM_RPM) += qcom_rpm-regulator.o obj-$(CONFIG_REGULATOR_QCOM_SMD_RPM) += qcom_smd-regulator.o
drivers/regulator/mt6380-regulator.c new file +352 -0
352 lines not on this page · raw message
include/linux/regulator/mt6380-regulator.h new file +32 -0
@@ -0,0 +1,32 @@ +/* +* Copyright (c) 2017 MediaTek Inc. +* Author: Chenglin Xu <[email protected]> +* +* 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 the +* GNU General Public License for more details. +*/ + +#ifndef __LINUX_REGULATOR_mt6380_H +#define __LINUX_REGULATOR_mt6380_H + +enum { +MT6380_ID_VCPU =0 , +MT6380_ID_VCORE , +MT6380_ID_VRF , +MT6380_ID_VMLDO , +MT6380_ID_VALDO , +MT6380_ID_VPHYLDO , +MT6380_ID_VDDRLDO , +MT6380_ID_VTLDO , +MT6380_ID_RG_MAX , +}; + +#define MT6380_MAX_REGULATOR MT6380_ID_RG_MAX + +#endif /* __LINUX_REGULATOR_mt6380_H */
Signature · 1 line
2.13.3
Matthias Brugger
maintainerRe: [PATCH v3 5/9] soc: mediatek: pwrap: add pwrap_write32 for writing in 32-bit mode
In reply to [email protected]Quoted 77 lines · On 08/15/2017 11:09 AM, sean.wang-NuS5LvNUpcJWk0Htik3J/[email protected] wrote:
From: Sean Wang <sean.wang-NuS5LvNUpcJWk0Htik3J/[email protected]>
Some regulators such as MediaTek MT6380 also has to be written in 32-bit mode. So the patch adds
pwrap_write32, rename oldpwrap_writeintopwrap_write16and one additional function pointer is introduced for increasing flexibility allowing the determination which mode is used by the pwrap slave detection through device tree.--- drivers/soc/mediatek/mtk-pmic-wrap.c | 63 +++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 16 deletions(-)drivers/soc/mediatek/mtk-pmic-wrap.c +24
-16@@ -506,6 +506,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 {@@ -600,22 +601,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;@@ -672,6 +657,49 @@ 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) {
drivers/soc/mediatek/mtk-pmic-wrap.c static int pwrap_read(struct pmic_wrapper *wrp, u32 adr, u32 *rdata) · line 692
Quoted 10 lines
drivers/soc/mediatek/mtk-pmic-wrap.c +10
-0+pwrap_leave_fsm_vldclr (wrp); +return ret; + } + +pwrap_writel (wrp, (1 <<31 ) | (msb <<30 ) | (adr <<16 ) | + ((wdata >> (msb *16 )) &0xffff ), +PWRAP_WACS2_CMD ); + +if (!msb) +pwrap_read (wrp, adr, &rdata);
Just so that I understand, you have to read back the half-written register before you can write the second part?
Other then that it looks fine to me.
Regards,
Matthias
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Matthias Brugger
maintainerRe: [PATCH v3 6/9] soc: mediatek: pwrap: update pwrap_init without slave programming
In reply to [email protected]Quoted 18 lines · On 08/15/2017 11:09 AM, sean.wang-NuS5LvNUpcJWk0Htik3J/[email protected] wrote:
From: Sean Wang <sean.wang-NuS5LvNUpcJWk0Htik3J/[email protected]>
pwrap initialization is highly associated with the base SoC, so update here for allowing
pwrap_initwithout slave program which would be used to those PMICs without extra encryption on bus such as MT6380.--- drivers/soc/mediatek/mtk-pmic-wrap.c | 91 +++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 37 deletions(-)drivers/soc/mediatek/mtk-pmic-wrap.c +0
-0
drivers/soc/mediatek/mtk-pmic-wrap.c struct pmic_wrapper_type { · line 534
Quoted 4 lines
drivers/soc/mediatek/mtk-pmic-wrap.c +1
-0@@ -531,6 +531,7 @@ struct pmic_wrapper_type {u32 spi_w;u32 wdt_src; int has_bridge:1; + int slv_program:1;
From the commit log, it looks like that this depends on the PMIC used and not on the pmic_wrapper of the SoC. So we should put this into prawp_slv_type.
Regards,
Matthias
Quoted 136 lines
drivers/soc/mediatek/mtk-pmic-wrap.c +52
-37int (*init_reg_clock)(struct pmic_wrapper *wrp);int (*init_soc_specific)(struct pmic_wrapper *wrp); };@@ -999,9 +1000,12 @@ static int pwrap_init(struct pmic_wrapper *wrp) }/* Reset SPI slave */ - ret =pwrap_reset_spislave (wrp); -if (ret) -return ret; + +if (wrp->master->slv_program) { + ret =pwrap_reset_spislave (wrp); +if (ret) +return ret; + }pwrap_writel (wrp,1 ,PWRAP_WRAP_EN );@@ -1013,45 +1017,52 @@ static int pwrap_init(struct pmic_wrapper *wrp)if (ret)return ret; -/* Setup serial input delay */ - ret =pwrap_init_sidly (wrp); -if (ret) -return ret; +if (wrp->master->slv_program) { +/* Setup serial input delay */ + ret =pwrap_init_sidly (wrp); +if (ret) +return ret; -/* Enable dual IO mode */ -pwrap_write (wrp, wrp->slave->dew_regs[PWRAP_DEW_DIO_EN ],1 ); +/* Enable dual IO mode */ +pwrap_write (wrp, wrp->slave->dew_regs[PWRAP_DEW_DIO_EN ],1 ); -/* Check IDLE & INIT_DONE in advance */ - ret =pwrap_wait_for_state (wrp, pwrap_is_fsm_idle_and_sync_idle); -if (ret) { -dev_err (wrp->dev,"%s fail, ret=%d\n" , __func__, ret); -return ret; - } +/* Check IDLE & INIT_DONE in advance */ + ret =pwrap_wait_for_state (wrp, + pwrap_is_fsm_idle_and_sync_idle); +if (ret) { +dev_err (wrp->dev,"%s fail, ret=%d\n" , __func__, ret); +return ret; + } -pwrap_writel (wrp,1 ,PWRAP_DIO_EN ); +pwrap_writel (wrp,1 ,PWRAP_DIO_EN ); -/* Read Test */ -pwrap_read (wrp, wrp->slave->dew_regs[PWRAP_DEW_READ_TEST ], &rdata); -if (rdata !=PWRAP_DEW_READ_TEST_VAL ) { -dev_err (wrp->dev,"Read test failed after switch to DIO mode: 0x%04x != 0x%04x\n" , +/* Read Test */ +pwrap_read (wrp, + wrp->slave->dew_regs[PWRAP_DEW_READ_TEST ], &rdata); +if (rdata !=PWRAP_DEW_READ_TEST_VAL ) { +dev_err (wrp->dev, +"Read failed on DIO mode: 0x%04x!=0x%04x\n" ,PWRAP_DEW_READ_TEST_VAL , rdata); -return -EFAULT ; - } - -/* Enable encryption */ - ret =pwrap_init_cipher (wrp); -if (ret) -return ret; +return -EFAULT ; + } -/* Signature checking - using CRC */ -if (pwrap_write (wrp, wrp->slave->dew_regs[PWRAP_DEW_CRC_EN ],0x1 )) -return -EFAULT ; +/* Enable encryption */ + ret =pwrap_init_cipher (wrp); +if (ret) +return ret; -pwrap_writel (wrp,0x1 ,PWRAP_CRC_EN ); -pwrap_writel (wrp,0x0 ,PWRAP_SIG_MODE ); -pwrap_writel (wrp, wrp->slave->dew_regs[PWRAP_DEW_CRC_VAL ], -PWRAP_SIG_ADR ); -pwrap_writel (wrp, wrp->master->arb_en_all,PWRAP_HIPRIO_ARB_EN ); +/* Signature checking - using CRC */ +if (pwrap_write (wrp, + wrp->slave->dew_regs[PWRAP_DEW_CRC_EN ],0x1 )) +return -EFAULT ; + +pwrap_writel (wrp,0x1 ,PWRAP_CRC_EN ); +pwrap_writel (wrp,0x0 ,PWRAP_SIG_MODE ); +pwrap_writel (wrp, wrp->slave->dew_regs[PWRAP_DEW_CRC_VAL ], +PWRAP_SIG_ADR ); +pwrap_writel (wrp, + wrp->master->arb_en_all,PWRAP_HIPRIO_ARB_EN ); + }if (wrp->master->type ==PWRAP_MT8135 )pwrap_writel (wrp,0x7 ,PWRAP_RRARB_EN );@@ -1059,8 +1070,11 @@ static int pwrap_init(struct pmic_wrapper *wrp)pwrap_writel (wrp,0x1 ,PWRAP_WACS0_EN );pwrap_writel (wrp,0x1 ,PWRAP_WACS1_EN );pwrap_writel (wrp,0x1 ,PWRAP_WACS2_EN ); -pwrap_writel (wrp,0x5 ,PWRAP_STAUPD_PRD ); -pwrap_writel (wrp,0xff ,PWRAP_STAUPD_GRPEN ); + +if (wrp->master->slv_program) { +pwrap_writel (wrp,0x5 ,PWRAP_STAUPD_PRD ); +pwrap_writel (wrp,0xff ,PWRAP_STAUPD_GRPEN ); + }if (wrp->master->init_soc_specific) { ret = wrp->master->init_soc_specific (wrp);@@ -1146,6 +1160,7 @@ static const struct pmic_wrapper_type pwrap_mt2701 = { .spi_w = PWRAP_MAN_CMD_SPI_WRITE_NEW, .wdt_src = PWRAP_WDT_SRC_MASK_ALL, .has_bridge = 0, + .slv_program = 1, .init_reg_clock = pwrap_mt2701_init_reg_clock, .init_soc_specific = pwrap_mt2701_init_soc_specific, };@@ -1158,6 +1173,7 @@ static const struct pmic_wrapper_type pwrap_mt8135 = { .spi_w = PWRAP_MAN_CMD_SPI_WRITE, .wdt_src = PWRAP_WDT_SRC_MASK_ALL, .has_bridge = 1, + .slv_program = 1, .init_reg_clock = pwrap_mt8135_init_reg_clock, .init_soc_specific = pwrap_mt8135_init_soc_specific, };
drivers/soc/mediatek/mtk-pmic-wrap.c static const struct pmic_wrapper_type pwrap_mt8173 = { · line 1192
Quoted 7 lines
drivers/soc/mediatek/mtk-pmic-wrap.c +1
-0@@ -1170,6 +1186,7 @@ static const struct pmic_wrapper_type pwrap_mt8173 = { .spi_w = PWRAP_MAN_CMD_SPI_WRITE, .wdt_src = PWRAP_WDT_SRC_MASK_NO_STAUPD, .has_bridge = 0, + .slv_program = 1, .init_reg_clock = pwrap_mt8173_init_reg_clock, .init_soc_specific = pwrap_mt8173_init_soc_specific, };
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Matthias Brugger
maintainerRe: [PATCH v3 8/9] soc: mediatek: pwrap: add support for MT7622 SoC
In reply to [email protected]Quoted 229 lines · On 08/15/2017 11:09 AM, [email protected] wrote:
From: Chenglin Xu <[email protected]>
Add the registers, callbacks and data structures required to make the PMIC wrapper work on MT7622.
Signed-off-by Chenglin Xu <[email protected]>Signed-off-by Chen Zhong <[email protected]>Signed-off-by Sean Wang <[email protected]>--- drivers/soc/mediatek/mtk-pmic-wrap.c | 180 +++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+)drivers/soc/mediatek/mtk-pmic-wrap.c +167
-0@@ -208,6 +208,36 @@ enum pwrap_regs {PWRAP_ADC_RDATA_ADDR1 ,PWRAP_ADC_RDATA_ADDR2 , +/* MT7622 only regs */ +PWRAP_EINT_STA0_ADR , +PWRAP_EINT_STA1_ADR , +PWRAP_STA , +PWRAP_CLR , +PWRAP_DVFS_ADR8 , +PWRAP_DVFS_WDATA8 , +PWRAP_DVFS_ADR9 , +PWRAP_DVFS_WDATA9 , +PWRAP_DVFS_ADR10 , +PWRAP_DVFS_WDATA10 , +PWRAP_DVFS_ADR11 , +PWRAP_DVFS_WDATA11 , +PWRAP_DVFS_ADR12 , +PWRAP_DVFS_WDATA12 , +PWRAP_DVFS_ADR13 , +PWRAP_DVFS_WDATA13 , +PWRAP_DVFS_ADR14 , +PWRAP_DVFS_WDATA14 , +PWRAP_DVFS_ADR15 , +PWRAP_DVFS_WDATA15 , +PWRAP_EXT_CK , +PWRAP_ADC_RDATA_ADDR , +PWRAP_GPS_STA , +PWRAP_SW_RST , +PWRAP_DVFS_STEP_CTRL0 , +PWRAP_DVFS_STEP_CTRL1 , +PWRAP_DVFS_STEP_CTRL2 , +PWRAP_SPI2_CTRL , +/* MT8135 only regs */ PWRAP_CSHEXT , PWRAP_EVENT_IN_EN,@@ -330,6 +360,118 @@ static int mt2701_regs[] = { [PWRAP_ADC_RDATA_ADDR2] = 0x154, }; +static int mt7622_regs[] = { + [PWRAP_MUX_SEL ] =0x0 , + [PWRAP_WRAP_EN ] =0x4 , + [PWRAP_DIO_EN ] =0x8 , + [PWRAP_SIDLY ] =0xC , + [PWRAP_RDDMY ] =0x10 , + [PWRAP_SI_CK_CON ] =0x14 , + [PWRAP_CSHEXT_WRITE ] =0x18 , + [PWRAP_CSHEXT_READ ] =0x1C , + [PWRAP_CSLEXT_START ] =0x20 , + [PWRAP_CSLEXT_END ] =0x24 , + [PWRAP_STAUPD_PRD ] =0x28 , + [PWRAP_STAUPD_GRPEN ] =0x2C , + [PWRAP_EINT_STA0_ADR ] =0x30 , + [PWRAP_EINT_STA1_ADR ] =0x34 , + [PWRAP_STA ] =0x38 , + [PWRAP_CLR ] =0x3C , + [PWRAP_STAUPD_MAN_TRIG ] =0x40 , + [PWRAP_STAUPD_STA ] =0x44 , + [PWRAP_WRAP_STA ] =0x48 , + [PWRAP_HARB_INIT ] =0x4C , + [PWRAP_HARB_HPRIO ] =0x50 , + [PWRAP_HIPRIO_ARB_EN ] =0x54 , + [PWRAP_HARB_STA0 ] =0x58 , + [PWRAP_HARB_STA1 ] =0x5C , + [PWRAP_MAN_EN ] =0x60 , + [PWRAP_MAN_CMD ] =0x64 , + [PWRAP_MAN_RDATA ] =0x68 , + [PWRAP_MAN_VLDCLR ] =0x6C , + [PWRAP_WACS0_EN ] =0x70 , + [PWRAP_INIT_DONE0 ] =0x74 , + [PWRAP_WACS0_CMD ] =0x78 , + [PWRAP_WACS0_RDATA ] =0x7C , + [PWRAP_WACS0_VLDCLR ] =0x80 , + [PWRAP_WACS1_EN ] =0x84 , + [PWRAP_INIT_DONE1 ] =0x88 , + [PWRAP_WACS1_CMD ] =0x8C , + [PWRAP_WACS1_RDATA ] =0x90 , + [PWRAP_WACS1_VLDCLR ] =0x94 , + [PWRAP_WACS2_EN ] =0x98 , + [PWRAP_INIT_DONE2 ] =0x9C , + [PWRAP_WACS2_CMD ] =0xA0 , + [PWRAP_WACS2_RDATA ] =0xA4 , + [PWRAP_WACS2_VLDCLR ] =0xA8 , + [PWRAP_INT_EN ] =0xAC , + [PWRAP_INT_FLG_RAW ] =0xB0 , + [PWRAP_INT_FLG ] =0xB4 , + [PWRAP_INT_CLR ] =0xB8 , + [PWRAP_SIG_ADR ] =0xBC , + [PWRAP_SIG_MODE ] =0xC0 , + [PWRAP_SIG_VALUE ] =0xC4 , + [PWRAP_SIG_ERRVAL ] =0xC8 , + [PWRAP_CRC_EN ] =0xCC , + [PWRAP_TIMER_EN ] =0xD0 , + [PWRAP_TIMER_STA ] =0xD4 , + [PWRAP_WDT_UNIT ] =0xD8 , + [PWRAP_WDT_SRC_EN ] =0xDC , + [PWRAP_WDT_FLG ] =0xE0 , + [PWRAP_DEBUG_INT_SEL ] =0xE4 , + [PWRAP_DVFS_ADR0 ] =0xE8 , + [PWRAP_DVFS_WDATA0 ] =0xEC , + [PWRAP_DVFS_ADR1 ] =0xF0 , + [PWRAP_DVFS_WDATA1 ] =0xF4 , + [PWRAP_DVFS_ADR2 ] =0xF8 , + [PWRAP_DVFS_WDATA2 ] =0xFC , + [PWRAP_DVFS_ADR3 ] =0x100 , + [PWRAP_DVFS_WDATA3 ] =0x104 , + [PWRAP_DVFS_ADR4 ] =0x108 , + [PWRAP_DVFS_WDATA4 ] =0x10C , + [PWRAP_DVFS_ADR5 ] =0x110 , + [PWRAP_DVFS_WDATA5 ] =0x114 , + [PWRAP_DVFS_ADR6 ] =0x118 , + [PWRAP_DVFS_WDATA6 ] =0x11C , + [PWRAP_DVFS_ADR7 ] =0x120 , + [PWRAP_DVFS_WDATA7 ] =0x124 , + [PWRAP_DVFS_ADR8 ] =0x128 , + [PWRAP_DVFS_WDATA8 ] =0x12C , + [PWRAP_DVFS_ADR9 ] =0x130 , + [PWRAP_DVFS_WDATA9 ] =0x134 , + [PWRAP_DVFS_ADR10 ] =0x138 , + [PWRAP_DVFS_WDATA10 ] =0x13C , + [PWRAP_DVFS_ADR11 ] =0x140 , + [PWRAP_DVFS_WDATA11 ] =0x144 , + [PWRAP_DVFS_ADR12 ] =0x148 , + [PWRAP_DVFS_WDATA12 ] =0x14C , + [PWRAP_DVFS_ADR13 ] =0x150 , + [PWRAP_DVFS_WDATA13 ] =0x154 , + [PWRAP_DVFS_ADR14 ] =0x158 , + [PWRAP_DVFS_WDATA14 ] =0x15C , + [PWRAP_DVFS_ADR15 ] =0x160 , + [PWRAP_DVFS_WDATA15 ] =0x164 , + [PWRAP_SPMINF_STA ] =0x168 , + [PWRAP_CIPHER_KEY_SEL ] =0x16C , + [PWRAP_CIPHER_IV_SEL ] =0x170 , + [PWRAP_CIPHER_EN ] =0x174 , + [PWRAP_CIPHER_RDY ] =0x178 , + [PWRAP_CIPHER_MODE ] =0x17C , + [PWRAP_CIPHER_SWRST ] =0x180 , + [PWRAP_DCM_EN ] =0x184 , + [PWRAP_DCM_DBC_PRD ] =0x188 , + [PWRAP_EXT_CK ] =0x18C , + [PWRAP_ADC_CMD_ADDR ] =0x190 , + [PWRAP_PWRAP_ADC_CMD ] =0x194 , + [PWRAP_ADC_RDATA_ADDR ] =0x198 , + [PWRAP_GPS_STA ] =0x19C , + [PWRAP_SW_RST ] =0x1A0 , + [PWRAP_DVFS_STEP_CTRL0 ] =0x238 , + [PWRAP_DVFS_STEP_CTRL1 ] =0x23C , + [PWRAP_DVFS_STEP_CTRL2 ] =0x240 , + [PWRAP_SPI2_CTRL ] =0x244 , +}; +static int mt8173_regs[] = { [PWRAP_MUX_SEL ] =0x0 , [PWRAP_WRAP_EN ] =0x4 ,@@ -493,6 +635,7 @@ enum pmic_type {enum pwrap_type {PWRAP_MT2701 , +PWRAP_MT7622 ,PWRAP_MT8135 ,PWRAP_MT8173 , };@@ -829,6 +972,16 @@ static int pwrap_mt2701_init_reg_clock(struct pmic_wrapper *wrp)return 0 ; } +static int pwrap_mt7622_init_reg_clock (struct pmic_wrapper *wrp) +{ +pwrap_writel (wrp,0x0 ,PWRAP_CSHEXT_WRITE ); +pwrap_writel (wrp,0x4 ,PWRAP_CSHEXT_READ ); +pwrap_writel (wrp,0x2 ,PWRAP_CSLEXT_START ); +pwrap_writel (wrp,0x2 ,PWRAP_CSLEXT_END ); + +return 0 ; +} +static bool pwrap_is_cipher_ready (struct pmic_wrapper *wrp) {return pwrap_readl (wrp,PWRAP_CIPHER_RDY ) &1 ;@@ -866,6 +1019,9 @@ static int pwrap_init_cipher(struct pmic_wrapper *wrp)case PWRAP_MT8173 :pwrap_writel (wrp,1 ,PWRAP_CIPHER_EN );break ; +case PWRAP_MT7622 : +pwrap_writel (wrp,0 ,PWRAP_CIPHER_EN ); +break ; }/* Config cipher mode @PMIC */ @@ -985,6 +1141,15 @@ static int pwrap_mt2701_init_soc_specific(struct pmic_wrapper *wrp)return 0 ; } +static int pwrap_mt7622_init_soc_specific (struct pmic_wrapper *wrp) +{ +pwrap_writel (wrp,0 ,PWRAP_STAUPD_PRD ); +/*enable 2wire SPI master*/ +pwrap_writel (wrp,0x8000000 ,PWRAP_SPI2_CTRL ); + +return 0 ; +} +static int pwrap_init (struct pmic_wrapper *wrp) {int ret;@@ -1184,6 +1349,18 @@ static const struct pmic_wrapper_type pwrap_mt2701 = { .init_soc_specific = pwrap_mt2701_init_soc_specific, }; +static struct pmic_wrapper_type pwrap_mt7622 = { + .regs = mt7622_regs,
drivers/soc/mediatek/mtk-pmic-wrap.c static const struct pmic_wrapper_type pwrap_mt2701 = { · line 1363
Quoted 10 lines
drivers/soc/mediatek/mtk-pmic-wrap.c +10
-0+ .type = PWRAP_MT7622, + .arb_en_all = 0xff, + .int_en_all = ~(u32)BIT(31), + .spi_w = PWRAP_MAN_CMD_SPI_WRITE, + .wdt_src = PWRAP_WDT_SRC_MASK_ALL, + .has_bridge = 0, + .init_reg_clock = pwrap_mt7622_init_reg_clock, + .init_soc_specific = pwrap_mt7622_init_soc_specific, +}; +
slv_program is not defined here. Please take into account comment on patch 6/9.
Regards,
Matthias
Matthias Brugger
maintainerRe: [PATCH v3 7/9] soc: mediatek: pwrap: add MediaTek MT6380 as one slave of pwrap
In reply to [email protected]Quoted 71 lines · On 08/15/2017 11:09 AM, sean.wang-NuS5LvNUpcJWk0Htik3J/[email protected] wrote:
From: Sean Wang <sean.wang-NuS5LvNUpcJWk0Htik3J/[email protected]>
Add MediaTek MT6380 regulator becoming one of PMIC wrapper slave and also add extra new
regmap_configof 32-bit mode for MT6380 since oldregmap_configof 16-bit mode can't be fit into the need.--- drivers/soc/mediatek/mtk-pmic-wrap.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-)drivers/soc/mediatek/mtk-pmic-wrap.c +14
-1@@ -501,6 +501,7 @@ struct pmic_wrapper;struct pwrap_slv_type {const u32 *dew_regs;enum pmic_type type; +const struct regmap_config *regmap;/* pwrap operations are highly associated with the PMIC types, * so the pointers added increases flexibility allowing determination * which type is used by the detection through device tree. @@ -1109,7 +1110,7 @@ static irqreturn_t pwrap_interrupt(int irqno, void *dev_id)return IRQ_HANDLED ; } -static const struct regmap_config pwrap_regmap_config = { +static const struct regmap_config pwrap_regmap_config16 = { .reg_bits =16 , .val_bits =16 , .reg_stride =2 ,@@ -1118,9 +1119,19 @@ static const struct regmap_config pwrap_regmap_config = { .max_register = 0xffff, }; +static const struct regmap_config pwrap_regmap_config32 = { + .reg_bits =32 , + .val_bits =32 , + .reg_stride =4 , + .reg_read = pwrap_regmap_read, + .reg_write = pwrap_regmap_write, + .max_register =0xffff , +}; +static const struct pwrap_slv_type pmic_mt6323 = { .dew_regs = mt6323_regs, .type =PMIC_MT6323 , + .regmap = &pwrap_regmap_config16, .pwrap_read = pwrap_read16, .pwrap_write = pwrap_write16, };@@ -1128,6 +1139,7 @@ static const struct pwrap_slv_type pmic_mt6323 = {static const struct pwrap_slv_type pmic_mt6380 = { .dew_regs =NULL , .type =PMIC_MT6380 , + .regmap = &pwrap_regmap_config32, .pwrap_read = pwrap_read32, .pwrap_write = pwrap_write32, };@@ -1135,6 +1147,7 @@ static const struct pwrap_slv_type pmic_mt6380 = {static const struct pwrap_slv_type pmic_mt6397 = { .dew_regs = mt6397_regs, .type =PMIC_MT6397 , + .regmap = &pwrap_regmap_config16, .pwrap_read = pwrap_read16, .pwrap_write = pwrap_write16, };
drivers/soc/mediatek/mtk-pmic-wrap.c static const struct of_device_id of_slave_match_tbl[] = { · line 1165
Quoted 9 lines
drivers/soc/mediatek/mtk-pmic-wrap.c +6
-0@@ -1144,9 +1157,15 @@ static const struct of_device_id of_slave_match_tbl[] = { .compatible = "mediatek,mt6323", .data = &pmic_mt6323, }, { +/* The MT6380 slave device is directly pointed to the regulator +* device which is different from the cases MT6323 and MT6397 +* where they're one kind of MFDs. +*/ + .compatible = "mediatek,mt6380-regulator", + .data = &pmic_mt6380,
I understand that mt6380 only provides a regulator and no other function other PMICs provide, right?
Then maybe write a comment like:
The MT6380 PMIC only implements a regulator, so we bind it directly instead of using a MFD. If so, we should state that in the pwrap bindings document, I think.
Regards,
Matthias
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v3 9/9] soc: mediatek: pwrap: fixup warnings from coding style
In reply to [email protected]Quoted 10 lines · On 08/15/2017 11:09 AM, [email protected] wrote:
From: Sean Wang <[email protected]>
fixup those warnings such as lines over 80 words and parenthesis alignment which would be complained by checkpatch.pl.
Signed-off-by Sean Wang <[email protected]>--- drivers/soc/mediatek/mtk-pmic-wrap.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-)
Applied to v4.14-next/soc
Thanks!
Re: [PATCH v3 5/9] soc: mediatek: pwrap: add pwrap_write32 for writing in 32-bit mode
In reply to Matthias BruggerQuoted 84 lines · Matthias Brugger
Quoted 82 lines · On 08/15/2017 11:09 AM, sean.wang-NuS5LvNUpcJWk0Htik3J/[email protected] wrote:
From: Sean Wang <sean.wang-NuS5LvNUpcJWk0Htik3J/[email protected]>
Some regulators such as MediaTek MT6380 also has to be written in 32-bit mode. So the patch adds
pwrap_write32, rename oldpwrap_writeintopwrap_write16and one additional function pointer is introduced for increasing flexibility allowing the determination which mode is used by the pwrap slave detection through device tree.--- drivers/soc/mediatek/mtk-pmic-wrap.c | 63 +++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 16 deletions(-)drivers/soc/mediatek/mtk-pmic-wrap.c +29
-16@@ -506,6 +506,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 {@@ -600,22 +601,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;@@ -672,6 +657,49 @@ 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) |
Quoted 9 lines
drivers/soc/mediatek/mtk-pmic-wrap.c static int pwrap_read(struct pmic_wrapper *wrp, u32 adr, u32 *rdata) · line 692
Quoted 5 lines
drivers/soc/mediatek/mtk-pmic-wrap.c +5
-0+ ((wdata >> (msb *16 )) &0xffff ), + PWRAP_WACS2_CMD); + +if (!msb) +pwrap_read (wrp, adr, &rdata);Just so that I understand, you have to read back the half-written register before you can write the second part?
Yup, 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 for the lower 16-bit pwrap writing.
Quoted 4 lines
Other then that it looks fine to me.
Regards,
Matthias
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v3 7/9] soc: mediatek: pwrap: add MediaTek MT6380 as one slave of pwrap
In reply to Matthias BruggerQuoted 86 lines · Matthias Brugger
Quoted 71 lines · On 08/15/2017 11:09 AM, sean.wang-NuS5LvNUpcJWk0Htik3J/[email protected] wrote:
From: Sean Wang <sean.wang-NuS5LvNUpcJWk0Htik3J/[email protected]>
Add MediaTek MT6380 regulator becoming one of PMIC wrapper slave and also add extra new
regmap_configof 32-bit mode for MT6380 since oldregmap_configof 16-bit mode can't be fit into the need.--- drivers/soc/mediatek/mtk-pmic-wrap.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-)drivers/soc/mediatek/mtk-pmic-wrap.c +14
-1@@ -501,6 +501,7 @@ struct pmic_wrapper;struct pwrap_slv_type {const u32 *dew_regs;enum pmic_type type; +const struct regmap_config *regmap;/* pwrap operations are highly associated with the PMIC types, * so the pointers added increases flexibility allowing determination * which type is used by the detection through device tree. @@ -1109,7 +1110,7 @@ static irqreturn_t pwrap_interrupt(int irqno, void *dev_id)return IRQ_HANDLED ; } -static const struct regmap_config pwrap_regmap_config = { +static const struct regmap_config pwrap_regmap_config16 = { .reg_bits =16 , .val_bits =16 , .reg_stride =2 ,@@ -1118,9 +1119,19 @@ static const struct regmap_config pwrap_regmap_config = { .max_register = 0xffff, }; +static const struct regmap_config pwrap_regmap_config32 = { + .reg_bits =32 , + .val_bits =32 , + .reg_stride =4 , + .reg_read = pwrap_regmap_read, + .reg_write = pwrap_regmap_write, + .max_register =0xffff , +}; +static const struct pwrap_slv_type pmic_mt6323 = { .dew_regs = mt6323_regs, .type =PMIC_MT6323 , + .regmap = &pwrap_regmap_config16, .pwrap_read = pwrap_read16, .pwrap_write = pwrap_write16, };@@ -1128,6 +1139,7 @@ static const struct pwrap_slv_type pmic_mt6323 = {static const struct pwrap_slv_type pmic_mt6380 = { .dew_regs =NULL , .type =PMIC_MT6380 , + .regmap = &pwrap_regmap_config32, .pwrap_read = pwrap_read32, .pwrap_write = pwrap_write32, };@@ -1135,6 +1147,7 @@ static const struct pwrap_slv_type pmic_mt6380 = {static const struct pwrap_slv_type pmic_mt6397 = { .dew_regs = mt6397_regs, .type =PMIC_MT6397 , + .regmap = &pwrap_regmap_config16, .pwrap_read = pwrap_read16, .pwrap_write = pwrap_write16, };drivers/soc/mediatek/mtk-pmic-wrap.c static const struct of_device_id of_slave_match_tbl[] = { · line 1165
Quoted 9 lines
drivers/soc/mediatek/mtk-pmic-wrap.c +6
-0@@ -1144,9 +1157,15 @@ static const struct of_device_id of_slave_match_tbl[] = { .compatible = "mediatek,mt6323", .data = &pmic_mt6323, }, { +/* The MT6380 slave device is directly pointed to the regulator +* device which is different from the cases MT6323 and MT6397 +* where they're one kind of MFDs. +*/ + .compatible = "mediatek,mt6380-regulator", + .data = &pmic_mt6380,I understand that mt6380 only provides a regulator and no other function other PMICs provide, right?
Quoted 4 lines
Then maybe write a comment like:
The MT6380 PMIC only implements a regulator, so we bind it directly instead of using a MFD. If so, we should state that in the pwrap bindings document, I think.
You're right. It is worth making them better in both comments and the bindings document. I'll do it in the next version.
Quoted 2 lines
Regards,
Matthias
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html