MT8195 also uses mt6359p so we can reuse most drivers. The only differences are IO configuaration, clock setting, and PMIC internal setting related to soc. Reference datasheet: MT6315 datasheet v1.4.2.pdf, RH-D-2019-0616. Reference datasheet: MT6359_PMIC_Data_Sheet_V1.5.docx, RH-D-2018-0205. Change-Id: I73f9c9bf92837f262c15758f16dacf52261dd3a3 Signed-off-by: Henry Chen <henryc.chen@mediatek.com> Signed-off-by: Yidi Lin <yidi.lin@mediatek.com> Signed-off-by: Rex-BC Chen <rex-bc.chen@mediatek.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/52668 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Yu-Ping Wu <yupingso@google.com>
43 lines
1.2 KiB
C
43 lines
1.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
|
|
#include <commonlib/helpers.h>
|
|
#include <console/console.h>
|
|
#include <soc/pmif_clk_common.h>
|
|
#include <soc/pmif_sw.h>
|
|
|
|
int pmif_ulposc_cali(u32 target_val)
|
|
{
|
|
u32 current_val, min = 0, max = CAL_MAX_VAL, middle;
|
|
int diff_by_min, diff_by_max, cal_result;
|
|
|
|
do {
|
|
middle = (min + max) / 2;
|
|
if (middle == min)
|
|
break;
|
|
|
|
current_val = pmif_get_ulposc_freq_mhz(middle);
|
|
if (current_val > target_val)
|
|
max = middle;
|
|
else
|
|
min = middle;
|
|
} while (min <= max);
|
|
|
|
diff_by_min = pmif_get_ulposc_freq_mhz(min) - target_val;
|
|
diff_by_min = ABS(diff_by_min);
|
|
|
|
diff_by_max = pmif_get_ulposc_freq_mhz(max) - target_val;
|
|
diff_by_max = ABS(diff_by_max);
|
|
|
|
cal_result = (diff_by_min < diff_by_max) ? min : max;
|
|
current_val = pmif_get_ulposc_freq_mhz(cal_result);
|
|
|
|
/* check if calibrated value is in the range of target value +- 15% */
|
|
if (current_val < (target_val * (1000 - CAL_TOL_RATE) / 1000) ||
|
|
current_val > (target_val * (1000 + CAL_TOL_RATE) / 1000)) {
|
|
printk(BIOS_ERR, "[%s] calibration fail: cur=%d, CAL_RATE=%d, target=%dM\n",
|
|
__func__, current_val, CAL_TOL_RATE, target_val);
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|