vpu: add 888M clk for t6x [1/1]

PD#SWPL-239174

Problem:
add 888M clk for t6x vpu

Solution:
complete it

Verify:
t6x

Change-Id: I0ee2d1248215d860d7929a2f60ac2690cdc53919
Signed-off-by: yuhua.lin <yuhua.lin@amlogic.com>
This commit is contained in:
yuhua.lin
2025-11-10 07:40:48 +00:00
committed by gerrit autosubmit
parent 57c536fb68
commit eeb0b520e4
5 changed files with 96 additions and 15 deletions
+6 -4
View File
@@ -1200,19 +1200,21 @@
<&clkc CLKID_VAPB>,
<&clkc CLKID_VPU_0>,
<&clkc CLKID_VPU_1>,
<&clkc CLKID_VPU>;
<&clkc CLKID_VPU>,
<&clkc CLKID_GP1_PLL>;
clock-names = "vapb_clk0",
"vapb_clk1",
"vapb_clk",
"vpu_clk0",
"vpu_clk1",
"vpu_clk";
"vpu_clk",
"gp_pll";
overclock_sel = <2>;
/* 0: force disable 1:force enable 2: adaptable */
clk_level = <10>;
clk_level = <9>;
/* 0: 24.0M 1: 100.0M 2: 166.7M 3: 200.0M 4: 250.0M */
/* 5: 333.3M 6: 400.0M 7: 500.0M 8: 666.7M 9: 800.0M*/
/* 10: 840M 11: 808M*/
/* 10: 840M 11: 808M 12:744M 13:888M*/
};
/*if you want to use vdin just modify status to "ok"*/
+23 -8
View File
@@ -300,8 +300,8 @@ unsigned int rx_switch_vpu_clk(int over_clock_flag)
int vdin_status;
unsigned long new_freq;
if (vpu_conf.data->chip_type == VPU_CHIP_T6X) {
VPUPR("%s %d over_clock_flag:%d\n", __func__, __LINE__, over_clock_flag);
if (vpu_conf.data->chip_type == VPU_CHIP_T6X && vpu_conf.vpu_overclock == 2) {
VPUPR("over_clock_flag:%d\n", over_clock_flag);
if (vpu_conf.overclock_sel == 0) {
clk_level = 10;
} else if (vpu_conf.overclock_sel == 1) {
@@ -318,20 +318,19 @@ unsigned int rx_switch_vpu_clk(int over_clock_flag)
}
}
} else {
VPUERR("%s unknown overclock_sel:%d\n", __func__, vpu_conf.overclock_sel);
VPUERR("unknown overclock_sel:%d\n", vpu_conf.overclock_sel);
}
if (clk_level != vpu_conf.clk_level) {
new_freq = get_vpu_clk_freq(clk_level);
vpu_clk_info.new_freq = new_freq;
if (new_freq == 892000000) {
if (new_freq == 888000000) {
vd_signal_notifier_call_chain(VIDEO_VPU_CLK_CHANGED,
&vpu_clk_info);
/* vdin_status 0:idle 1:vdin 0 worked 2:vdin1 worked */
vdin_status = get_vdin_status(1);
if (vdin_status || vpu_debug_print_flag)
VPUPR("%s, vdin_status:%d\n",
__func__, vdin_status);
VPUPR("vdin_status:%d\n", vdin_status);
set_vpu_clk(clk_level);
} else if (new_freq == 840000000) {
set_vpu_clk(clk_level);
@@ -852,7 +851,12 @@ static void set_vpu_overclk(void)
if (vpu_conf.data->chip_type == VPU_CHIP_T6X) {
vpu_max_freq = efuse_amlogic_cali_item_read(EFUSE_CALI_SUBITEM_VPU_MAXFREQ);
VPUPR("%s vpu support max freq: %d\n", __func__, vpu_max_freq);
vpu_conf.vpu_overclock = (vpu_max_freq == 180) ? 1 : 0;
if (vpu_max_freq == 170)
vpu_conf.vpu_overclock = 1;
else if (vpu_max_freq == 180)
vpu_conf.vpu_overclock = 2;
else
vpu_conf.vpu_overclock = 0;
}
}
@@ -1643,6 +1647,13 @@ static ssize_t vpu_debug_print_store(const struct class *class,
return count;
}
static ssize_t vpu_overclock_show(const struct class *class,
const struct class_attribute *attr, char *buf)
{
return sprintf(buf, "vpu overclock: %d\n",
vpu_conf.vpu_overclock);
}
static ssize_t vpu_arb_bind_store(const struct class *class,
const struct class_attribute *attr,
const char *buf, size_t count)
@@ -1917,6 +1928,7 @@ static struct class_attribute vpu_debug_class_attrs[] = {
__ATTR(sideband_level, 0644, vpu_sideband_level_show, vpu_sideband_level_store),
__ATTR(sideband_block_device, 0644, vpu_sideband_block_device_show,
vpu_sideband_block_device_store),
__ATTR(overclock, 0444, vpu_overclock_show, NULL),
__ATTR(help, 0444, vpu_debug_help, NULL),
};
@@ -1976,6 +1988,9 @@ static int get_vpu_config(struct platform_device *pdev)
val = vpu_conf.data->clk_level_dft;
}
if (vpu_conf.data->chip_type == VPU_CHIP_T6X &&
vpu_conf.vpu_overclock)
val = 10;
vpu_conf.clk_level = val;
}
VPUPR("load vpu_clk: %uHz(%u)\n",
@@ -3216,7 +3231,7 @@ static struct vpu_data_s vpu_data_t6x = {
.power_init_check = vpu_power_init_check_dft,
.mempd_switch = vpu_vmod_mem_pd_switch_new,
.mempd_get = vpu_vmod_mem_pd_get_new,
.clk_apply = vpu_clk_apply_dft,
.clk_apply = vpu_clk_apply_t6x,
.clktree_init = vpu_clktree_init_dft,
};
+1
View File
@@ -204,6 +204,7 @@ unsigned long get_vpu_clk_freq(unsigned int clk_level);
unsigned int get_vpu_clk_level_max_vmod(void);
unsigned int get_vpu_clk_level_from_venc(unsigned int venc_clk);
int vpu_clk_apply_dft(unsigned int clk_level);
int vpu_clk_apply_t6x(unsigned int clk_level);
int vpu_clk_apply_c3(unsigned int clk_level);
int set_vpu_clk(unsigned int vclk);
void vpu_clktree_init_dft(struct device *dev);
+63
View File
@@ -359,6 +359,69 @@ int vpu_clk_apply_dft(unsigned int clk_level)
return ret;
}
int vpu_clk_apply_t6x(unsigned int clk_level)
{
unsigned int clk;
int ret = 0;
ret = vpu_chip_valid_check();
if (ret) {
ret = 1;
goto error_out;
}
if (vpu_conf.data->clk_table[clk_level].mux == FCLK_DIV_MAX) {
ret = 2;
goto error_out;
}
if (IS_ERR_OR_NULL(vpu_conf.vpu_clk)) {
ret = 3;
goto error_out;
}
if (vpu_conf.data->chip_type == VPU_CHIP_T6X) {
if (IS_ERR_OR_NULL(vpu_conf.gp_pll)) {
ret = 4;
goto error_out;
}
/* step 1: set vpu clk 800M */
if (clk_level == 10 || clk_level == 13) {
clk = vpu_conf.data->clk_table[vpu_conf.data->clk_level_dft].freq;
ret = clk_set_rate(vpu_conf.vpu_clk, clk);
if (ret) {
ret = 5;
goto error_out;
}
}
/* step 2: set gpl pll clk */
if (clk_level == 10)
ret = clk_set_rate(vpu_conf.gp_pll, 1680000000);
else if (clk_level == 13)
ret = clk_set_rate(vpu_conf.gp_pll, 1776000000);
if (ret) {
ret = 6;
goto error_out;
}
}
clk = vpu_conf.data->clk_table[clk_level].freq;
ret = clk_set_rate(vpu_conf.vpu_clk, clk);
if (ret) {
ret = 7;
goto error_out;
}
clk = clk_get_rate(vpu_conf.vpu_clk);
VPUPR("set vpu clk: %uHz(%d), readback: %uHz(0x%x)\n",
vpu_conf.data->clk_table[clk_level].freq, clk_level,
clk, (vpu_clk_read(vpu_conf.data->vpu_clk_reg)));
return 0;
error_out:
VPUERR("change vpu clk fail, ret = %d\n", ret);
return ret;
}
int vpu_clk_apply_c3(unsigned int clk_level)
{
unsigned int clk;
+3 -3
View File
@@ -45,8 +45,8 @@
#define CLK_LEVEL_DFT_T6W 10
#define CLK_LEVEL_MAX_T6W 12
#define CLK_LEVEL_DFT_T6X 10
#define CLK_LEVEL_MAX_T6X 14
#define CLK_LEVEL_DFT_T6X 9
#define CLK_LEVEL_MAX_T6X 15
#ifndef CONFIG_AMLOGIC_C3_REMOVE
/* vpu clk setting */
@@ -124,7 +124,7 @@ static struct vpu_clk_s vpu_t6w_clk_table[] = {
{840000000, GPLL_CLK1, 1}, /* 10 */ /* for t6w gp1 div gp1 1680 to 840M*/
{808000000, GPLL_CLK2, 0}, /* 11 */ /* for t6w gp2 808M*/
{744000000, GPLL_CLK, 0}, /* 12 */
{892000000, GPLL_CLK2, 0}, /* 13 */ /* for t6x gp2 892M*/
{888000000, GPLL_CLK1, 1}, /* 13 */ /* for t6x gp1 888M*/
};
#endif
#endif