/* SPDX-License-Identifier: GPL-2.0-only */ #include #include #include #include #include static int get_mt6360_regulator_id(enum mtk_regulator regulator) { switch (regulator) { case MTK_REGULATOR_VDD2: return MT6360_BUCK1; case MTK_REGULATOR_VDDQ: return MT6360_LDO7; case MTK_REGULATOR_VMDDR: return MT6360_LDO6; case MTK_REGULATOR_VCC: return MT6360_LDO5; case MTK_REGULATOR_VCCQ: return MT6360_LDO3; default: break; } return -1; } static int get_mt6359p_regulator_id(enum mtk_regulator regulator) { switch (regulator) { case MTK_REGULATOR_VCORE: return MT6359P_GPU11; default: break; } return -1; } void mainboard_set_regulator_voltage(enum mtk_regulator regulator, uint32_t voltage_uv) { /* * Handle the regulator that does not have a regulator ID * in its underlying implementation. */ if (regulator == MTK_REGULATOR_VDD1) { mt6359p_set_vm18_voltage(voltage_uv); return; } int id; id = get_mt6360_regulator_id(regulator); if (id >= 0) { uint32_t voltage_mv = voltage_uv / 1000; google_chromeec_regulator_set_voltage(id, voltage_mv, voltage_mv); return; } id = get_mt6359p_regulator_id(regulator); if (id >= 0) { mt6359p_buck_set_voltage(id, voltage_uv); return; } printk(BIOS_WARNING, "Invalid regulator ID: %d\n", regulator); } uint32_t mainboard_get_regulator_voltage(enum mtk_regulator regulator) { /* * Handle the regulator that does not have a regulator ID * in its underlying implementation. */ if (regulator == MTK_REGULATOR_VDD1) return mt6359p_get_vm18_voltage(); int id; id = get_mt6360_regulator_id(regulator); if (id >= 0) { uint32_t voltage_mv = 0; google_chromeec_regulator_get_voltage(id, &voltage_mv); return voltage_mv * 1000; } id = get_mt6359p_regulator_id(regulator); if (id >= 0) return mt6359p_buck_get_voltage(id); printk(BIOS_WARNING, "Invalid regulator ID: %d\n", regulator); return 0; } int mainboard_enable_regulator(enum mtk_regulator regulator, bool enable) { /* Return 0 if the regulator is already enabled or disabled. */ if (mainboard_regulator_is_enabled(regulator) == enable) return 0; int id; id = get_mt6360_regulator_id(regulator); if (id < 0) { printk(BIOS_WARNING, "Invalid regulator ID: %d\n", regulator); return -1; } return google_chromeec_regulator_enable(id, enable); } bool mainboard_regulator_is_enabled(enum mtk_regulator regulator) { int id; id = get_mt6360_regulator_id(regulator); if (id < 0) { printk(BIOS_WARNING, "Invalid regulator ID: %d\n; assuming disabled", regulator); return false; } uint8_t enabled; if (google_chromeec_regulator_is_enabled(id, &enabled) < 0) { printk(BIOS_WARNING, "Failed to query regulator ID: %d\n; assuming disabled", regulator); return false; } return !!enabled; }