soc/mediatek/mt8186: Add support for regulator VRF12/VCN33
To provide power to PS8640, the eDP bridge IC on krabby, add control of VRF12 and VCN33 to set voltage from MT6366. TEST=measure 1.2V from VRF12 and 3.3V from VCN33. BUG=b:210806060 Signed-off-by: Rex-BC Chen <rex-bc.chen@mediatek.com> Change-Id: I55a9ca16e1e335e9355d0a1b30c278a9969db197 Reviewed-on: https://review.coreboot.org/c/coreboot/+/60446 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Yu-Ping Wu <yupingso@google.com>
This commit is contained in:
parent
100c2f6d38
commit
0069f6a18c
@ -20,6 +20,8 @@ static const int regulator_id[] = {
|
|||||||
[MTK_REGULATOR_VMC] = MT6366_VMC,
|
[MTK_REGULATOR_VMC] = MT6366_VMC,
|
||||||
[MTK_REGULATOR_VPROC12] = MT6366_VPROC12,
|
[MTK_REGULATOR_VPROC12] = MT6366_VPROC12,
|
||||||
[MTK_REGULATOR_VSRAM_PROC12] = MT6366_VSRAM_PROC12,
|
[MTK_REGULATOR_VSRAM_PROC12] = MT6366_VSRAM_PROC12,
|
||||||
|
[MTK_REGULATOR_VRF12] = MT6366_VRF12,
|
||||||
|
[MTK_REGULATOR_VCN33] = MT6366_VCN33,
|
||||||
};
|
};
|
||||||
|
|
||||||
_Static_assert(ARRAY_SIZE(regulator_id) == MTK_REGULATOR_NUM, "regulator_id size error");
|
_Static_assert(ARRAY_SIZE(regulator_id) == MTK_REGULATOR_NUM, "regulator_id size error");
|
||||||
|
@ -18,6 +18,8 @@ enum mtk_regulator {
|
|||||||
MTK_REGULATOR_VMC,
|
MTK_REGULATOR_VMC,
|
||||||
MTK_REGULATOR_VPROC12,
|
MTK_REGULATOR_VPROC12,
|
||||||
MTK_REGULATOR_VSRAM_PROC12,
|
MTK_REGULATOR_VSRAM_PROC12,
|
||||||
|
MTK_REGULATOR_VRF12,
|
||||||
|
MTK_REGULATOR_VCN33,
|
||||||
MTK_REGULATOR_NUM,
|
MTK_REGULATOR_NUM,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -43,10 +43,14 @@ enum {
|
|||||||
PMIC_VSRAM_PROC12_OP_EN = 0x1b90,
|
PMIC_VSRAM_PROC12_OP_EN = 0x1b90,
|
||||||
PMIC_VSRAM_PROC12_DBG0 = 0x1ba2,
|
PMIC_VSRAM_PROC12_DBG0 = 0x1ba2,
|
||||||
PMIC_VSRAM_PROC12_VOSEL = 0x1bf0,
|
PMIC_VSRAM_PROC12_VOSEL = 0x1bf0,
|
||||||
|
PMIC_LDO_VRF12_CON0 = 0x1c30,
|
||||||
|
PMIC_LDO_VRF12_OP_EN = 0x1c32,
|
||||||
PMIC_LDO_VMC_CON0 = 0x1cc4,
|
PMIC_LDO_VMC_CON0 = 0x1cc4,
|
||||||
PMIC_LDO_VMC_OP_EN = 0x1cc6,
|
PMIC_LDO_VMC_OP_EN = 0x1cc6,
|
||||||
PMIC_LDO_VMCH_CON0 = 0x1cd8,
|
PMIC_LDO_VMCH_CON0 = 0x1cd8,
|
||||||
PMIC_LDO_VMCH_OP_EN = 0x1cda,
|
PMIC_LDO_VMCH_OP_EN = 0x1cda,
|
||||||
|
PMIC_LDO_VCN33_CON0_0 = 0x1d1c,
|
||||||
|
PMIC_VCN33_ANA_CON0 = 0x1e28,
|
||||||
PMIC_VSIM2_ANA_CON0 = 0x1e30,
|
PMIC_VSIM2_ANA_CON0 = 0x1e30,
|
||||||
PMIC_VMCH_ANA_CON0 = 0x1e48,
|
PMIC_VMCH_ANA_CON0 = 0x1e48,
|
||||||
PMIC_VMC_ANA_CON0 = 0x1e4c,
|
PMIC_VMC_ANA_CON0 = 0x1e4c,
|
||||||
@ -61,6 +65,8 @@ enum mt6366_regulator_id {
|
|||||||
MT6366_VMC,
|
MT6366_VMC,
|
||||||
MT6366_VPROC12,
|
MT6366_VPROC12,
|
||||||
MT6366_VSRAM_PROC12,
|
MT6366_VSRAM_PROC12,
|
||||||
|
MT6366_VRF12,
|
||||||
|
MT6366_VCN33,
|
||||||
MT6366_REGULATOR_NUM,
|
MT6366_REGULATOR_NUM,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -705,6 +705,68 @@ static void pmic_set_vmc_vol(u32 vmc_uv)
|
|||||||
pwrap_write_field(PMIC_LDO_VMC_CON0, 1, 0xFF, 0);
|
pwrap_write_field(PMIC_LDO_VMC_CON0, 1, 0xFF, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u32 pmic_get_vrf12_vol(void)
|
||||||
|
{
|
||||||
|
return (pwrap_read_field(PMIC_LDO_VRF12_CON0, 0x3, 0) &
|
||||||
|
pwrap_read_field(PMIC_LDO_VRF12_OP_EN, 0x3, 0)) ? 1200000 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pmic_enable_vrf12(void)
|
||||||
|
{
|
||||||
|
pwrap_write_field(PMIC_LDO_VRF12_CON0, 1, 0x3, 0);
|
||||||
|
pwrap_write_field(PMIC_LDO_VRF12_OP_EN, 1, 0x3, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static u32 pmic_get_vcn33_vol(void)
|
||||||
|
{
|
||||||
|
u32 ret;
|
||||||
|
u16 vol_reg;
|
||||||
|
|
||||||
|
vol_reg = pwrap_read_field(PMIC_VCN33_ANA_CON0, 0x3, 8);
|
||||||
|
|
||||||
|
switch (vol_reg) {
|
||||||
|
case 0x1:
|
||||||
|
ret = 3300000;
|
||||||
|
break;
|
||||||
|
case 0x2:
|
||||||
|
ret = 3400000;
|
||||||
|
break;
|
||||||
|
case 0x3:
|
||||||
|
ret = 3500000;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printk(BIOS_ERR, "ERROR[%s] VCN33 read fail: %d\n", __func__, vol_reg);
|
||||||
|
ret = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pmic_set_vcn33_vol(u32 vcn33_uv)
|
||||||
|
{
|
||||||
|
u16 val = 0;
|
||||||
|
|
||||||
|
switch (vcn33_uv) {
|
||||||
|
case 3300000:
|
||||||
|
val = 0x1;
|
||||||
|
break;
|
||||||
|
case 3400000:
|
||||||
|
val = 0x2;
|
||||||
|
break;
|
||||||
|
case 3500000:
|
||||||
|
val = 0x3;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
die("ERROR[%s]: VCN33 voltage %u is not support.\n", __func__, vcn33_uv);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pwrap_write_field(PMIC_VCN33_ANA_CON0, val, 0x3, 8);
|
||||||
|
|
||||||
|
/* Force SW to turn on */
|
||||||
|
pwrap_write_field(PMIC_LDO_VCN33_CON0_0, 1, 0x1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void pmic_wdt_set(void)
|
static void pmic_wdt_set(void)
|
||||||
{
|
{
|
||||||
/* [5]=1, RG_WDTRSTB_DEB */
|
/* [5]=1, RG_WDTRSTB_DEB */
|
||||||
@ -824,6 +886,13 @@ void mt6366_set_voltage(enum mt6366_regulator_id id, u32 voltage_uv)
|
|||||||
case MT6366_VSRAM_PROC12:
|
case MT6366_VSRAM_PROC12:
|
||||||
pmic_set_vsram_proc12_vol(voltage_uv);
|
pmic_set_vsram_proc12_vol(voltage_uv);
|
||||||
break;
|
break;
|
||||||
|
case MT6366_VRF12:
|
||||||
|
/* VRF12 only provides 1.2V, so we just need to enable it */
|
||||||
|
pmic_enable_vrf12();
|
||||||
|
break;
|
||||||
|
case MT6366_VCN33:
|
||||||
|
pmic_set_vcn33_vol(voltage_uv);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
printk(BIOS_ERR, "%s: PMIC %d is not supported\n", __func__, id);
|
printk(BIOS_ERR, "%s: PMIC %d is not supported\n", __func__, id);
|
||||||
break;
|
break;
|
||||||
@ -847,6 +916,10 @@ u32 mt6366_get_voltage(enum mt6366_regulator_id id)
|
|||||||
return pmic_get_vproc12_vol();
|
return pmic_get_vproc12_vol();
|
||||||
case MT6366_VSRAM_PROC12:
|
case MT6366_VSRAM_PROC12:
|
||||||
return pmic_get_vsram_proc12_vol();
|
return pmic_get_vsram_proc12_vol();
|
||||||
|
case MT6366_VRF12:
|
||||||
|
return pmic_get_vrf12_vol();
|
||||||
|
case MT6366_VCN33:
|
||||||
|
return pmic_get_vcn33_vol();
|
||||||
default:
|
default:
|
||||||
printk(BIOS_ERR, "%s: PMIC %d is not supported\n", __func__, id);
|
printk(BIOS_ERR, "%s: PMIC %d is not supported\n", __func__, id);
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user