Attention is currently required from: Hung-Te Lin. Rex-BC Chen has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/56435 )
Change subject: soc/mediatek/mt8195: modify mt6360 interface ......................................................................
soc/mediatek/mt8195: modify mt6360 interface
With the new definition of mt6360_regulator_id, merge the MT6360 LDO and PMIC interfaces into one.
Signed-off-by: Rex-BC Chen rex-bc.chen@mediatek.com Change-Id: I7ccc32cb0a9481d5f55349c152267a44fe09d20a --- M src/mainboard/google/cherry/mainboard.c M src/mainboard/google/cherry/regulator.c M src/soc/mediatek/mt8195/include/soc/mt6360.h M src/soc/mediatek/mt8195/mt6360.c 4 files changed, 121 insertions(+), 91 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/35/56435/1
diff --git a/src/mainboard/google/cherry/mainboard.c b/src/mainboard/google/cherry/mainboard.c index 21ab24c..76aa59b 100644 --- a/src/mainboard/google/cherry/mainboard.c +++ b/src/mainboard/google/cherry/mainboard.c @@ -127,8 +127,8 @@
mtk_i2c_bus_init(7); mt6360_init(7); - mt6360_ldo_enable(MT6360_LDO3, 1); - mt6360_ldo_enable(MT6360_LDO5, 1); + mt6360_enable(MT6360_LDO3, 1); + mt6360_enable(MT6360_LDO5, 1); }
/* Set up backlight control pins as output pin and power-off by default */ diff --git a/src/mainboard/google/cherry/regulator.c b/src/mainboard/google/cherry/regulator.c index b59a643..0c1f7fe 100644 --- a/src/mainboard/google/cherry/regulator.c +++ b/src/mainboard/google/cherry/regulator.c @@ -57,7 +57,7 @@
id = get_mt6360_regulator_id(regulator); if (id >= 0) { - mt6360_pmic_set_voltage(id, voltage_uv); + mt6360_set_voltage(id, voltage_uv); return; }
@@ -85,7 +85,7 @@
id = get_mt6360_regulator_id(regulator); if (id >= 0) - return mt6360_pmic_get_voltage(id); + return mt6360_get_voltage(id);
id = get_mt6359p_regulator_id(regulator); if (id >= 0) @@ -113,7 +113,7 @@
id = get_mt6360_regulator_id(regulator); if (id >= 0) { - mt6360_pmic_enable(id, enable); + mt6360_enable(id, enable); return 0; }
@@ -131,7 +131,7 @@
id = get_mt6360_regulator_id(regulator); if (id >= 0) - return mt6360_pmic_is_enabled(id); + return mt6360_is_enabled(id);
printk(BIOS_ERR, "Failed to query regulator ID: %d\n; assuming disabled", diff --git a/src/soc/mediatek/mt8195/include/soc/mt6360.h b/src/soc/mediatek/mt8195/include/soc/mt6360.h index e7cc9fe..0c5edff 100644 --- a/src/soc/mediatek/mt8195/include/soc/mt6360.h +++ b/src/soc/mediatek/mt8195/include/soc/mt6360.h @@ -55,15 +55,9 @@ };
void mt6360_init(uint8_t bus); - -void mt6360_ldo_enable(enum mt6360_regulator_id id, uint8_t enable); -uint8_t mt6360_ldo_is_enabled(enum mt6360_regulator_id id); -void mt6360_ldo_set_voltage(enum mt6360_regulator_id id, u32 voltage_uv); -u32 mt6360_ldo_get_voltage(enum mt6360_regulator_id id); - -void mt6360_pmic_enable(enum mt6360_regulator_id id, uint8_t enable); -uint8_t mt6360_pmic_is_enabled(enum mt6360_regulator_id id); -void mt6360_pmic_set_voltage(enum mt6360_regulator_id id, u32 voltage_uv); -u32 mt6360_pmic_get_voltage(enum mt6360_regulator_id id); +void mt6360_enable(enum mt6360_regulator_id id, uint8_t enable); +uint8_t mt6360_is_enabled(enum mt6360_regulator_id id); +void mt6360_set_voltage(enum mt6360_regulator_id id, u32 voltage_uv); +u32 mt6360_get_voltage(enum mt6360_regulator_id id);
#endif diff --git a/src/soc/mediatek/mt8195/mt6360.c b/src/soc/mediatek/mt8195/mt6360.c index 6c6b305..05b7b6c 100644 --- a/src/soc/mediatek/mt8195/mt6360.c +++ b/src/soc/mediatek/mt8195/mt6360.c @@ -194,7 +194,7 @@ return true; }
-void mt6360_ldo_enable(enum mt6360_regulator_id id, uint8_t enable) +static void mt6360_ldo_enable(enum mt6360_regulator_id id, uint8_t enable) { u8 val; const struct mt6360_data *data; @@ -215,7 +215,7 @@ mt6360_config_interface(MT6360_INDEX_LDO, data->enable_reg, val, 0xff, 0); }
-uint8_t mt6360_ldo_is_enabled(enum mt6360_regulator_id id) +static uint8_t mt6360_ldo_is_enabled(enum mt6360_regulator_id id) { u8 val; const struct mt6360_data *data; @@ -231,7 +231,7 @@ return (val & data->enable_mask) ? 1 : 0; }
-void mt6360_ldo_set_voltage(enum mt6360_regulator_id id, u32 voltage_uv) +static void mt6360_ldo_set_voltage(enum mt6360_regulator_id id, u32 voltage_uv) { u8 val = 0; u32 voltage_uv_temp = 0; @@ -269,7 +269,7 @@ mt6360_config_interface(MT6360_INDEX_LDO, data->vsel_reg, val, 0xff, 0); }
-u32 mt6360_ldo_get_voltage(enum mt6360_regulator_id id) +static u32 mt6360_ldo_get_voltage(enum mt6360_regulator_id id) { u8 val; u32 voltage_uv; @@ -296,6 +296,89 @@ return voltage_uv; }
+static void mt6360_pmic_enable(enum mt6360_regulator_id id, uint8_t enable) +{ + u8 val; + const struct mt6360_data *data; + + if (!is_valid_pmic(id)) + return; + + data = ®ulator_data[id]; + + if (mt6360_read_interface(MT6360_INDEX_PMIC, data->enable_reg, &val, 0xff, 0) < 0) + return; + + if (enable) + val |= data->enable_mask; + else + val &= ~(data->enable_mask); + + mt6360_config_interface(MT6360_INDEX_PMIC, data->enable_reg, val, 0xff, 0); +} + +static uint8_t mt6360_pmic_is_enabled(enum mt6360_regulator_id id) +{ + u8 val; + const struct mt6360_data *data; + + if (!is_valid_pmic(id)) + return 0; + + data = ®ulator_data[id]; + + if (mt6360_read_interface(MT6360_INDEX_PMIC, data->enable_reg, &val, 0xff, 0) < 0) + return 0; + + return (val & data->enable_mask) ? 1 : 0; +} + +static void mt6360_pmic_set_voltage(enum mt6360_regulator_id id, u32 voltage_uv) +{ + u8 val = 0; + + const struct mt6360_data *data; + + if (!is_valid_pmic(id)) + return; + + data = ®ulator_data[id]; + + if (id == MT6360_BUCK1 || id == MT6360_BUCK2) { + val = (voltage_uv - 300000) / 5000; + } else if (id == MT6360_LDO6 || id == MT6360_LDO7) { + val = (((voltage_uv - 500000) / 100000) << 4); + val += (((voltage_uv - 500000) % 100000) / 10000); + } + + mt6360_config_interface(MT6360_INDEX_PMIC, data->vsel_reg, val, 0xff, 0); +} + +static u32 mt6360_pmic_get_voltage(enum mt6360_regulator_id id) +{ + u8 val; + u32 voltage_uv= 0; + + const struct mt6360_data *data; + + if (!is_valid_pmic(id)) + return 0; + + data = ®ulator_data[id]; + + if (mt6360_read_interface(MT6360_INDEX_PMIC, data->vsel_reg, &val, 0xff, 0) < 0) + return 0; + + if (id == MT6360_BUCK1 || id == MT6360_BUCK2) { + voltage_uv = 300000 + val * 5000; + } else if (id == MT6360_LDO6 || id == MT6360_LDO7) { + voltage_uv = 500000 + 100000 * (val >> 4); + voltage_uv += MIN(val & 0xf, 0xa) * 10000; + } + + return voltage_uv; +} + void mt6360_init(uint8_t bus) { u8 delay01, delay02, delay03, delay04; @@ -320,85 +403,38 @@ __func__, delay01, delay02, delay03, delay04); }
-void mt6360_pmic_enable(enum mt6360_regulator_id id, uint8_t enable) +void mt6360_enable(enum mt6360_regulator_id id, uint8_t enable) { - u8 val; - const struct mt6360_data *data; + if (is_valid_ldo(id)) + mt6360_ldo_enable(id, enable); + else if (is_valid_pmic(id)) + mt6360_pmic_enable(id, enable); +}
- if (!is_valid_pmic(id)) - return; - - data = ®ulator_data[id]; - - if (mt6360_read_interface(MT6360_INDEX_PMIC, data->enable_reg, &val, 0xff, 0) < 0) - return; - - if (enable) - val |= data->enable_mask; +uint8_t mt6360_is_enabled(enum mt6360_regulator_id id) +{ + if (is_valid_ldo(id)) + return mt6360_ldo_is_enabled(id); + else if (is_valid_pmic(id)) + return mt6360_pmic_is_enabled(id); else - val &= ~(data->enable_mask); - - mt6360_config_interface(MT6360_INDEX_PMIC, data->enable_reg, val, 0xff, 0); + return 0; }
-uint8_t mt6360_pmic_is_enabled(enum mt6360_regulator_id id) +void mt6360_set_voltage(enum mt6360_regulator_id id, u32 voltage_uv) { - u8 val; - const struct mt6360_data *data; - - if (!is_valid_pmic(id)) - return 0; - - data = ®ulator_data[id]; - - if (mt6360_read_interface(MT6360_INDEX_PMIC, data->enable_reg, &val, 0xff, 0) < 0) - return 0; - - return (val & data->enable_mask) ? 1 : 0; + if (is_valid_ldo(id)) + mt6360_ldo_set_voltage(id, voltage_uv); + else if (is_valid_pmic(id)) + mt6360_pmic_set_voltage(id, voltage_uv); }
-void mt6360_pmic_set_voltage(enum mt6360_regulator_id id, u32 voltage_uv) +u32 mt6360_get_voltage(enum mt6360_regulator_id id) { - u8 val = 0; - - const struct mt6360_data *data; - - if (!is_valid_pmic(id)) - return; - - data = ®ulator_data[id]; - - if (id == MT6360_BUCK1 || id == MT6360_BUCK2) { - val = (voltage_uv - 300000) / 5000; - } else if (id == MT6360_LDO6 || id == MT6360_LDO7) { - val = (((voltage_uv - 500000) / 100000) << 4); - val += (((voltage_uv - 500000) % 100000) / 10000); - } - - mt6360_config_interface(MT6360_INDEX_PMIC, data->vsel_reg, val, 0xff, 0); -} - -u32 mt6360_pmic_get_voltage(enum mt6360_regulator_id id) -{ - u8 val; - u32 voltage_uv= 0; - - const struct mt6360_data *data; - - if (!is_valid_pmic(id)) + if (is_valid_ldo(id)) + return mt6360_ldo_get_voltage(id); + else if (is_valid_pmic(id)) + return mt6360_pmic_get_voltage(id); + else return 0; - - data = ®ulator_data[id]; - - if (mt6360_read_interface(MT6360_INDEX_PMIC, data->vsel_reg, &val, 0xff, 0) < 0) - return 0; - - if (id == MT6360_BUCK1 || id == MT6360_BUCK2) { - voltage_uv = 300000 + val * 5000; - } else if (id == MT6360_LDO6 || id == MT6360_LDO7) { - voltage_uv = 500000 + 100000 * (val >> 4); - voltage_uv += MIN(val & 0xf, 0xa) * 10000; - } - - return voltage_uv; }