osd: viu2_osd0 logo init [1/1]

PD#TV-5427

Problem:
enable support for parsing VIU2 boot parameters

Solution:
add this support in driver

Verify:
verified on TL1-X301

Change-Id: I2b2dc97bc76a8816a2c1e17ce5689e2679867011
Signed-off-by: Jian Cao <jian.cao@amlogic.com>
This commit is contained in:
Jian Cao
2019-05-31 10:56:15 +08:00
committed by Luan Yuan
parent cc316f1b45
commit 30129a4695
4 changed files with 76 additions and 75 deletions

View File

@@ -160,6 +160,12 @@ enum color_index_e {
#define BYPASS_DIN (1 << 7)
#define OSD_BACKUP_COUNT 24
#define LOGO_DEV_OSD0 0x0
#define LOGO_DEV_OSD1 0x1
#define LOGO_DEV_VIU2_OSD0 0x3
#define LOGO_DEBUG 0x1001
#define LOGO_LOADED 0x1002
enum osd_index_e {
OSD1 = 0,
OSD2,

View File

@@ -1468,13 +1468,14 @@ static int osd_open(struct fb_info *info, int arg)
if ((osd_meson_dev.has_viu2)
&& (fb_index == osd_meson_dev.viu2_index)) {
int vpu_clkc_rate;
/* select mux0, if select mux1, mux0 must be set */
clk_prepare_enable(osd_meson_dev.vpu_clkc);
clk_set_rate(osd_meson_dev.vpu_clkc, CUR_VPU_CLKC_CLK);
vpu_clkc_rate = clk_get_rate(osd_meson_dev.vpu_clkc);
osd_log_info("vpu clkc clock is %d MHZ\n",
vpu_clkc_rate/1000000);
if (osd_get_logo_index() != LOGO_DEV_VIU2_OSD0) {
/* select mux0, if select mux1, mux0 must be set */
clk_prepare_enable(osd_meson_dev.vpu_clkc);
clk_set_rate(osd_meson_dev.vpu_clkc, CUR_VPU_CLKC_CLK);
vpu_clkc_rate = clk_get_rate(osd_meson_dev.vpu_clkc);
osd_log_info("vpu clkc clock is %d MHZ\n",
vpu_clkc_rate/1000000);
}
osd_init_viu2();
}
if (osd_meson_dev.osd_count <= fb_index)

View File

@@ -9453,78 +9453,71 @@ void osd_init_hw(u32 logo_loaded, u32 osd_probe,
void osd_init_viu2(void)
{
u32 idx, data32;
struct vinfo_s *vinfo;
set_viu2_rgb2yuv(1);
osd_vpu_power_on_viu2();
/* here we will init default value ,these value only set once . */
/* init vpu fifo control register */
osd_reg_write(VPP2_OFIFO_SIZE, 0x7ff00800);
/* init osd fifo control register
* set DDR request priority to be urgent
*/
data32 = 1;
vinfo = get_current_vinfo2();
data32 |= VIU2_DEFAULT_HOLD_LINE << 5; /* hold_fifo_lines */
/* burst_len_sel: 3=64, g12a = 5 */
if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE) {
data32 |= 1 << 10;
data32 |= 1 << 31;
} else
data32 |= 3 << 10;
/*
* bit 23:22, fifo_ctrl
* 00 : for 1 word in 1 burst
* 01 : for 2 words in 1 burst
* 10 : for 4 words in 1 burst
* 11 : reserved
*/
data32 |= 2 << 22;
/* bit 28:24, fifo_lim */
data32 |= 2 << 24;
/* data32_ = data32; */
/* fifo_depth_val: 32 or 64 *8 = 256 or 512 */
data32 |= (osd_hw.osd_meson_dev.osd_fifo_len
& 0xfffffff) << 12;
idx = osd_hw.osd_meson_dev.viu2_index;
osd_reg_write(
hw_osd_reg_array[idx].osd_fifo_ctrl_stat, data32);
/* osd_reg_write(VIU_OSD2_FIFO_CTRL_STAT, data32_); */
/* just disable osd to avoid booting hang up */
data32 = 0x1 << 0;
data32 |= OSD_GLOBAL_ALPHA_DEF << 12;
osd_reg_write(
hw_osd_reg_array[idx].osd_ctrl_stat, data32);
/* TODO: temp set at here, need move it to uboot */
osd_reg_set_bits(
hw_osd_reg_array[idx].osd_fifo_ctrl_stat,
1, 31, 1);
osd_reg_set_bits(
hw_osd_reg_array[idx].osd_fifo_ctrl_stat,
1, 10, 2);
/* TODO: temp set at here, need check for logo */
if (idx > 0)
if (osd_get_logo_index() != LOGO_DEV_VIU2_OSD0) {
set_viu2_rgb2yuv(1);
osd_vpu_power_on_viu2();
/* here we will init default value, these value only set once */
/* init vpu fifo control register */
osd_reg_write(VPP2_OFIFO_SIZE, 0x7ff00800);
/* init osd fifo control register
* set DDR request priority to be urgent
*/
data32 = 0x1 << 0;
data32 |= OSD_GLOBAL_ALPHA_DEF << 12;
osd_reg_write(
hw_osd_reg_array[idx].osd_ctrl_stat, data32);
osd_reg_set_bits(
hw_osd_reg_array[idx].osd_ctrl_stat,
0, 0, 1);
hw_osd_reg_array[idx].osd_fifo_ctrl_stat,
1, 31, 1);
osd_reg_set_bits(
hw_osd_reg_array[idx].osd_fifo_ctrl_stat,
1, 10, 2);
data32 = 0;
data32 = osd_reg_read(
hw_osd_reg_array[idx].osd_ctrl_stat);
data32 |= 0x80000000;
osd_reg_write(
hw_osd_reg_array[idx].osd_ctrl_stat, data32);
data32 = 1;
data32 |= VIU2_DEFAULT_HOLD_LINE << 5; /* hold_fifo_lines */
/* burst_len_sel: 3=64, g12a = 5 */
if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE) {
data32 |= 1 << 10;
data32 |= 1 << 31;
} else
data32 |= 3 << 10;
/*
* bit 23:22, fifo_ctrl
* 00 : for 1 word in 1 burst
* 01 : for 2 words in 1 burst
* 10 : for 4 words in 1 burst
* 11 : reserved
*/
data32 |= 2 << 22;
/* bit 28:24, fifo_lim */
data32 |= 2 << 24;
/* data32_ = data32; */
/* fifo_depth_val: 32 or 64 *8 = 256 or 512 */
data32 |= (osd_hw.osd_meson_dev.osd_fifo_len
& 0xfffffff) << 12;
osd_reg_write(
hw_osd_reg_array[idx].osd_fifo_ctrl_stat, data32);
}
/* enable for latch */
osd_hw.osd_use_latch[idx] = 1;
data32 = 0;
data32 = osd_reg_read(
hw_osd_reg_array[idx].osd_ctrl_stat);
data32 |= 0x80000000;
osd_reg_write(
hw_osd_reg_array[idx].osd_ctrl_stat, data32);
/* init osd reverse */
osd_get_reverse_hw(idx, &data32);
if (data32)
osd_set_reverse_hw(idx, data32, 1);
osd_hw.powered[idx] = 1;
}
void osd_cursor_hw(u32 index, s16 x, s16 y, s16 xstart, s16 ystart, u32 osd_w,

View File

@@ -30,16 +30,12 @@
/* Local Headers */
#include "osd_hw.h"
#include "osd_log.h"
#include "osd.h"
#undef pr_fmt
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#define LOGO_DEV_OSD0 0x0
#define LOGO_DEV_OSD1 0x1
#define LOGO_DEBUG 0x1001
#define LOGO_LOADED 0x1002
static DEFINE_MUTEX(logo_lock);
struct para_pair_s {
@@ -51,6 +47,7 @@ struct para_pair_s {
static struct para_pair_s logo_args[] = {
{"osd0", LOGO_DEV_OSD0},
{"osd1", LOGO_DEV_OSD1},
{"viu2_osd0", LOGO_DEV_VIU2_OSD0},
{"debug", LOGO_DEBUG},
{"loaded", LOGO_LOADED},
};
@@ -102,6 +99,9 @@ static int logo_info_init(char *para)
case LOGO_DEV_OSD1:
logo_info.index = LOGO_DEV_OSD1;
break;
case LOGO_DEV_VIU2_OSD0:
logo_info.index = LOGO_DEV_VIU2_OSD0;
break;
case LOGO_DEBUG:
logo_info.debug = 1;
break;
@@ -138,7 +138,8 @@ static int __init logo_setup(char *str)
return -EINVAL;
do {
if (!isalpha(*ptr) && !isdigit(*ptr)) {
/* search for a delimiter */
if (!isalpha(*ptr) && !isdigit(*ptr) && (*ptr != '_')) {
find = 1;
break;
}