amvecm: add viu2 vsync support for gamma [1/1]

PD#SWPL-14450

Problem:
gamma can't support viu2 vsync

Solution:
add viu2 vsync support for gamma

Verify:
u202

Conflicts:
	drivers/amlogic/media/enhancement/amvecm/amve.c

Change-Id: I5f490b254f58a130451ff69a456c218e6e4dcc94
Signed-off-by: Evoke Zhang <evoke.zhang@amlogic.com>
This commit is contained in:
Evoke Zhang
2019-09-26 16:31:21 +08:00
committed by Chris KIM
parent d19d0e2f8e
commit b21a77fba1
10 changed files with 477 additions and 30 deletions

View File

@@ -526,6 +526,9 @@
cm_en = <0>;/*1:enabel ;0:disable*/
/*0: 709/601 1: bt2020*/
tx_op_color_primary = <0>;
interrupts = <0 56 1>;
interrupt-names = "vsync2";
};
amdolby_vision {

View File

@@ -483,6 +483,9 @@
gamma_en = <0>;/*1:enabel ;0:disable*/
wb_en = <0>;/*1:enabel ;0:disable*/
cm_en = <0>;/*1:enabel ;0:disable*/
interrupts = <0 56 1>;
interrupt-names = "vsync2";
};
amdolby_vision {
compatible = "amlogic, dolby_vision_g12a";

View File

@@ -751,12 +751,200 @@
key-device = "normal";
key-permit = "read","write","del";
};
keysn_13:key_13{
key-name = "hdcp14_rx";
key-device = "normal";
key-type = "sha1";
keysn_16:key_16{
key-name = "netflix_mgkid";
key-device = "secure";
key-permit = "read","write","del";
};
};//End unifykey
efusekey:efusekey{
keynum = <4>;
key0 = <&key_0>;
key1 = <&key_1>;
key2 = <&key_2>;
key3 = <&key_3>;
key_0:key_0{
keyname = "mac";
offset = <0>;
size = <6>;
};
key_1:key_1{
keyname = "mac_bt";
offset = <6>;
size = <6>;
};
key_2:key_2{
keyname = "mac_wifi";
offset = <12>;
size = <6>;
};
key_3:key_3{
keyname = "usid";
offset = <18>;
size = <16>;
};
};//End efusekey
amlvecm {
compatible = "amlogic, vecm";
dev_name = "aml_vecm";
status = "okay";
gamma_en = <1>;/*1:enabel ;0:disable*/
wb_en = <0>;/*1:enabel ;0:disable*/
cm_en = <0>;/*1:enabel ;0:disable*/
/*0: 709/601 1: bt2020*/
tx_op_color_primary = <0>;
interrupts = <0 56 1>;
interrupt-names = "vsync2";
};
amdolby_vision {
compatible = "amlogic, dolby_vision_sm1";
dev_name = "aml_amdolby_vision_driver";
status = "okay";
tv_mode = <0>;/*1:enabel ;0:disable*/
};
/* Audio Related start */
pdm_codec:dummy{
#sound-dai-cells = <0>;
compatible = "amlogic, pdm_dummy_codec";
status = "okay";
};
dummy_codec:dummy{
#sound-dai-cells = <0>;
compatible = "amlogic, aml_dummy_codec";
status = "okay";
};
amlogic_codec:t9015{
#sound-dai-cells = <0>;
compatible = "amlogic, aml_codec_T9015";
reg = <0xFF632000 0x2000>;
is_auge_used = <1>; /* meson or auge chipset used */
tocodec_inout = <1>;
tdmout_index = <1>;
ch0_sel = <0>;
ch1_sel = <1>;
status = "okay";
};
auge_sound {
compatible = "amlogic, g12a-sound-card";
aml-audio-card,name = "AML-AUGESOUND";
/*avout mute gpio*/
avout_mute-gpios = <&gpio_ao GPIOAO_8 GPIO_ACTIVE_HIGH>;
aml-audio-card,dai-link@0 {
format = "dsp_a";
mclk-fs = <512>;
//continuous-clock;
//bitclock-inversion;
//frame-inversion;
/* master mode */
bitclock-master = <&tdma>;
frame-master = <&tdma>;
/* slave mode */
/*
* bitclock-master = <&tdmacodec>;
* frame-master = <&tdmacodec>;
*/
suffix-name = "alsaPORT-pcm";
tdmacpu: cpu {
sound-dai = <&tdma>;
dai-tdm-slot-tx-mask =
<1>;
dai-tdm-slot-rx-mask =
<1>;
dai-tdm-slot-num = <2>;
dai-tdm-slot-width = <16>;
system-clock-frequency = <256000>;
};
tdmacodec: codec {
sound-dai = <&dummy_codec>;
};
};
aml-audio-card,dai-link@1 {
format = "i2s";// "dsp_a";
mclk-fs = <256>;
//continuous-clock;
//bitclock-inversion;
//frame-inversion;
/* master mode */
bitclock-master = <&tdmb>;
frame-master = <&tdmb>;
/* slave mode */
//bitclock-master = <&tdmbcodec>;
//frame-master = <&tdmbcodec>;
/* suffix-name, sync with android audio hal
* what's the dai link used for
*/
suffix-name = "alsaPORT-i2s";
cpu {
sound-dai = <&tdmb>;
dai-tdm-slot-tx-mask = <1 1>;
dai-tdm-slot-rx-mask = <1 1>;
dai-tdm-slot-num = <2>;
/*
* dai-tdm-slot-tx-mask =
* <1 1 1 1 1 1 1 1>;
* dai-tdm-slot-rx-mask =
* <1 1 1 1 1 1 1 1>;
* dai-tdm-slot-num = <8>;
*/
dai-tdm-slot-width = <32>;
system-clock-frequency = <12288000>;
};
tdmbcodec: codec {
sound-dai = <&dummy_codec &dummy_codec
&amlogic_codec &ad82584f_62>;
};
};
aml-audio-card,dai-link@2 {
format = "i2s";
mclk-fs = <256>;
//continuous-clock;
//bitclock-inversion;
//frame-inversion;
/* master mode */
bitclock-master = <&tdmc>;
frame-master = <&tdmc>;
/* slave mode */
//bitclock-master = <&tdmccodec>;
//frame-master = <&tdmccodec>;
/* suffix-name, sync with android audio hal used for */
//suffix-name = "alsaPORT-tdm";
cpu {
sound-dai = <&tdmc>;
dai-tdm-slot-tx-mask = <1 1>;
dai-tdm-slot-rx-mask = <1 1>;
dai-tdm-slot-num = <2>;
dai-tdm-slot-width = <32>;
system-clock-frequency = <12288000>;
};
tdmccodec: codec {
sound-dai = <&dummy_codec &dummy_codec>;
};
};
aml-audio-card,dai-link@3 {
mclk-fs = <64>;
/* suffix-name, sync with android audio hal
* what's the dai link used for
*/
suffix-name = "alsaPORT-pdm";
cpu {
sound-dai = <&pdm>;
};
codec {
sound-dai = <&pdm_codec>;
};
};
keysn_14:key_14{
key-name = "prpubkeybox";// PlayReady
key-device = "secure";

View File

@@ -524,6 +524,9 @@
cm_en = <0>;/*1:enabel ;0:disable*/
/*0: 709/601 1: bt2020*/
tx_op_color_primary = <0>;
interrupts = <0 56 1>;
interrupt-names = "vsync2";
};
amdolby_vision {

View File

@@ -484,6 +484,9 @@
gamma_en = <0>;/*1:enabel ;0:disable*/
wb_en = <0>;/*1:enabel ;0:disable*/
cm_en = <0>;/*1:enabel ;0:disable*/
interrupts = <0 56 1>;
interrupt-names = "vsync2";
};
amdolby_vision {
compatible = "amlogic, dolby_vision_g12a";

View File

@@ -527,6 +527,9 @@
cm_en = <0>;/*1:enabel ;0:disable*/
/*0: 709/601 1: bt2020*/
tx_op_color_primary = <0>;
interrupts = <0 56 1>;
interrupt-names = "vsync2";
};
amdolby_vision {

View File

@@ -731,6 +731,184 @@
key-device = "secure";
key-permit = "read","write","del";
};
keysn_11:key_11{
key-name = "PlayReadykeybox25";
key-device = "secure";
key-permit = "read","write","del";
};
keysn_12:key_12{
key-name = "prpubkeybox";// PlayReady
key-device = "secure";
key-permit = "read","write","del";
};
keysn_13:key_13{
key-name = "prprivkeybox";// PlayReady
key-device = "secure";
key-permit = "read","write","del";
};
keysn_14:key_14{
key-name = "attestationkeybox";// attestation key
key-device = "secure";
key-permit = "read","write","del";
};
keysn_15:key_15{
key-name = "region_code";
key-device = "normal";
key-permit = "read","write","del";
};
keysn_16:key_16{
key-name = "netflix_mgkid";
key-device = "secure";
key-permit = "read","write","del";
};
};//End unifykey
efusekey:efusekey{
keynum = <4>;
key0 = <&key_0>;
key1 = <&key_1>;
key2 = <&key_2>;
key3 = <&key_3>;
key_0:key_0{
keyname = "mac";
offset = <0>;
size = <6>;
};
key_1:key_1{
keyname = "mac_bt";
offset = <6>;
size = <6>;
};
key_2:key_2{
keyname = "mac_wifi";
offset = <12>;
size = <6>;
};
key_3:key_3{
keyname = "usid";
offset = <18>;
size = <16>;
};
};//End efusekey
amlvecm {
compatible = "amlogic, vecm";
dev_name = "aml_vecm";
status = "okay";
gamma_en = <1>;/*1:enabel ;0:disable*/
wb_en = <0>;/*1:enabel ;0:disable*/
cm_en = <0>;/*1:enabel ;0:disable*/
/*0: 709/601 1: bt2020*/
tx_op_color_primary = <0>;
interrupts = <0 56 1>;
interrupt-names = "vsync2";
};
amdolby_vision {
compatible = "amlogic, dolby_vision_sm1";
dev_name = "aml_amdolby_vision_driver";
status = "okay";
tv_mode = <0>;/*1:enabel ;0:disable*/
};
/* Audio Related start */
pdm_codec:dummy{
#sound-dai-cells = <0>;
compatible = "amlogic, pdm_dummy_codec";
status = "okay";
};
dummy_codec:dummy{
#sound-dai-cells = <0>;
compatible = "amlogic, aml_dummy_codec";
status = "okay";
};
amlogic_codec:t9015{
#sound-dai-cells = <0>;
compatible = "amlogic, aml_codec_T9015";
reg = <0x0 0xFF632000 0x0 0x2000>;
is_auge_used = <1>; /* meson or auge chipset used */
tocodec_inout = <1>;
tdmout_index = <1>;
ch0_sel = <0>;
ch1_sel = <1>;
status = "okay";
};
auge_sound {
compatible = "amlogic, g12a-sound-card";
aml-audio-card,name = "AML-AUGESOUND";
/*avout mute gpio*/
avout_mute-gpios = <&gpio_ao GPIOAO_8 GPIO_ACTIVE_HIGH>;
aml-audio-card,dai-link@0 {
format = "dsp_a";
mclk-fs = <512>;
//continuous-clock;
//bitclock-inversion;
//frame-inversion;
/* master mode */
bitclock-master = <&tdma>;
frame-master = <&tdma>;
/* slave mode */
/*
* bitclock-master = <&tdmacodec>;
* frame-master = <&tdmacodec>;
*/
suffix-name = "alsaPORT-pcm";
tdmacpu: cpu {
sound-dai = <&tdma>;
dai-tdm-slot-tx-mask =
<1>;
dai-tdm-slot-rx-mask =
<1>;
dai-tdm-slot-num = <2>;
dai-tdm-slot-width = <16>;
system-clock-frequency = <256000>;
};
tdmacodec: codec {
sound-dai = <&dummy_codec>;
};
};
aml-audio-card,dai-link@1 {
format = "i2s";// "dsp_a";
mclk-fs = <256>;
//continuous-clock;
//bitclock-inversion;
//frame-inversion;
/* master mode */
bitclock-master = <&tdmb>;
frame-master = <&tdmb>;
/* slave mode */
//bitclock-master = <&tdmbcodec>;
//frame-master = <&tdmbcodec>;
/* suffix-name, sync with android audio hal
* what's the dai link used for
*/
suffix-name = "alsaPORT-i2s";
cpu {
sound-dai = <&tdmb>;
dai-tdm-slot-tx-mask = <1 1>;
dai-tdm-slot-rx-mask = <1 1>;
dai-tdm-slot-num = <2>;
/*
* dai-tdm-slot-tx-mask =
* <1 1 1 1 1 1 1 1>;
* dai-tdm-slot-rx-mask =
* <1 1 1 1 1 1 1 1>;
* dai-tdm-slot-num = <8>;
*/
dai-tdm-slot-width = <32>;
system-clock-frequency = <12288000>;
};
tdmbcodec: codec {
sound-dai = <&dummy_codec &dummy_codec
&amlogic_codec &ad82584f_62>;
};
};
keysn_11:key_11{
key-name = "hdcp22_rx_private";
key-device = "secure";

View File

@@ -269,18 +269,36 @@ void ve_on_vs(struct vframe_s *vf)
/* *********************************************************************** */
/* *** IOCTL-oriented functions ****************************************** */
/* *********************************************************************** */
void vpp_enable_lcd_gamma_table(void)
int vpp_get_encl_viu_mux(void)
{
VSYNC_WR_MPEG_REG_BITS(L_GAMMA_CNTL_PORT, 1, GAMMA_EN, 1);
unsigned int temp;
temp = READ_VPP_REG(VPU_VIU_VENC_MUX_CTRL);
if ((temp & 0x3) == 0)
return 1;
if (((temp >> 2) & 0x3) == 0)
return 2;
return 0;
}
void vpp_disable_lcd_gamma_table(void)
void vpp_enable_lcd_gamma_table(int viu_sel)
{
VSYNC_WR_MPEG_REG_BITS(L_GAMMA_CNTL_PORT, 0, GAMMA_EN, 1);
if (viu_sel == 1) /* viu1 vsync rdma */
VSYNC_WR_MPEG_REG_BITS(L_GAMMA_CNTL_PORT, 1, GAMMA_EN, 1);
else
WRITE_VPP_REG_BITS(L_GAMMA_CNTL_PORT, 1, GAMMA_EN, 1);
}
void vpp_set_lcd_gamma_table(u16 *data, u32 rgb_mask)
void vpp_disable_lcd_gamma_table(int viu_sel)
{
if (viu_sel == 1) /* viu1 vsync rdma */
VSYNC_WR_MPEG_REG_BITS(L_GAMMA_CNTL_PORT, 0, GAMMA_EN, 1);
else
WRITE_VPP_REG_BITS(L_GAMMA_CNTL_PORT, 0, GAMMA_EN, 1);
}
void vpp_set_lcd_gamma_table(u16 *data, u32 rgb_mask, int viu_sel)
{
int i;
int cnt = 0;
@@ -321,8 +339,13 @@ void vpp_set_lcd_gamma_table(u16 *data, u32 rgb_mask)
(0x1 << rgb_mask) |
(0x23 << HADR));
VSYNC_WR_MPEG_REG_BITS(L_GAMMA_CNTL_PORT,
gamma_en, GAMMA_EN, 1);
if (viu_sel == 1) { /* viu1 vsync rdma */
VSYNC_WR_MPEG_REG_BITS(L_GAMMA_CNTL_PORT,
gamma_en, GAMMA_EN, 1);
} else { /* viu2 directly write, rdma todo */
WRITE_VPP_REG_BITS(L_GAMMA_CNTL_PORT,
gamma_en, GAMMA_EN, 1);
}
spin_unlock_irqrestore(&vpp_lcd_gamma_lock, flags);
}
@@ -768,29 +791,36 @@ void ve_dnlp_latch_process(void)
void ve_lcd_gamma_process(void)
{
int viu_sel;
viu_sel = vpp_get_encl_viu_mux();
if (vecm_latch_flag & FLAG_GAMMA_TABLE_EN) {
vecm_latch_flag &= ~FLAG_GAMMA_TABLE_EN;
vpp_enable_lcd_gamma_table();
vpp_enable_lcd_gamma_table(viu_sel);
pr_amve_dbg("\n[amve..] set vpp_enable_lcd_gamma_table OK!!!\n");
}
if (vecm_latch_flag & FLAG_GAMMA_TABLE_DIS) {
vecm_latch_flag &= ~FLAG_GAMMA_TABLE_DIS;
vpp_disable_lcd_gamma_table();
vpp_disable_lcd_gamma_table(viu_sel);
pr_amve_dbg("\n[amve..] set vpp_disable_lcd_gamma_table OK!!!\n");
}
if (vecm_latch_flag & FLAG_GAMMA_TABLE_R) {
vecm_latch_flag &= ~FLAG_GAMMA_TABLE_R;
vpp_set_lcd_gamma_table(video_gamma_table_r.data, H_SEL_R);
vpp_set_lcd_gamma_table(video_gamma_table_r.data, H_SEL_R,
viu_sel);
pr_amve_dbg("\n[amve..] set vpp_set_lcd_gamma_table OK!!!\n");
}
if (vecm_latch_flag & FLAG_GAMMA_TABLE_G) {
vecm_latch_flag &= ~FLAG_GAMMA_TABLE_G;
vpp_set_lcd_gamma_table(video_gamma_table_g.data, H_SEL_G);
vpp_set_lcd_gamma_table(video_gamma_table_g.data, H_SEL_G,
viu_sel);
pr_amve_dbg("\n[amve..] set vpp_set_lcd_gamma_table OK!!!\n");
}
if (vecm_latch_flag & FLAG_GAMMA_TABLE_B) {
vecm_latch_flag &= ~FLAG_GAMMA_TABLE_B;
vpp_set_lcd_gamma_table(video_gamma_table_b.data, H_SEL_B);
vpp_set_lcd_gamma_table(video_gamma_table_b.data, H_SEL_B,
viu_sel);
pr_amve_dbg("\n[amve..] set vpp_set_lcd_gamma_table OK!!!\n");
}
if (vecm_latch_flag & FLAG_RGB_OGO) {
@@ -799,23 +829,23 @@ void ve_lcd_gamma_process(void)
if (video_rgb_ogo.en) {
vpp_set_lcd_gamma_table(
video_gamma_table_r_adj.data,
H_SEL_R);
H_SEL_R, viu_sel);
vpp_set_lcd_gamma_table(
video_gamma_table_g_adj.data,
H_SEL_G);
H_SEL_G, viu_sel);
vpp_set_lcd_gamma_table(
video_gamma_table_b_adj.data,
H_SEL_B);
H_SEL_B, viu_sel);
} else {
vpp_set_lcd_gamma_table(
video_gamma_table_r.data,
H_SEL_R);
H_SEL_R, viu_sel);
vpp_set_lcd_gamma_table(
video_gamma_table_g.data,
H_SEL_G);
H_SEL_G, viu_sel);
vpp_set_lcd_gamma_table(
video_gamma_table_b.data,
H_SEL_B);
H_SEL_B, viu_sel);
}
pr_amve_dbg("\n[amve..] set vpp_set_lcd_gamma_table OK!!!\n");
} else {
@@ -824,6 +854,7 @@ void ve_lcd_gamma_process(void)
}
}
}
void lvds_freq_process(void)
{
/* #if ((MESON_CPU_TYPE==MESON_CPU_TYPE_MESON6TV)|| */

View File

@@ -92,9 +92,10 @@ void ve_set_regmap(struct ve_regmap_s *p);
extern void ve_enable_dnlp(void);
extern void ve_disable_dnlp(void);
extern void vpp_enable_lcd_gamma_table(void);
extern void vpp_disable_lcd_gamma_table(void);
extern void vpp_set_lcd_gamma_table(u16 *data, u32 rgb_mask);
int vpp_get_encl_viu_mux(void);
void vpp_enable_lcd_gamma_table(int viu_sel);
void vpp_disable_lcd_gamma_table(int viu_sel);
void vpp_set_lcd_gamma_table(u16 *data, u32 rgb_mask, int viu_sel);
extern void amve_write_gamma_table(u16 *data, u32 rgb_mask);
extern void vpp_set_rgb_ogo(struct tcon_rgb_ogo_s *p);
extern void vpp_phase_lock_on_vs(unsigned int cycle,

View File

@@ -98,6 +98,7 @@ struct work_struct aml_lcd_vlock_param_work;
#endif
static struct amvecm_dev_s amvecm_dev;
static struct resource *res_viu2_vsync_irq;
spinlock_t vpp_lcd_gamma_lock;
@@ -1051,7 +1052,8 @@ void amvecm_video_latch(void)
cm_latch_process();
amvecm_size_patch();
ve_dnlp_latch_process();
ve_lcd_gamma_process();
if (vpp_get_encl_viu_mux() == 1)
ve_lcd_gamma_process();
lvds_freq_process();
/* #if (MESON_CPU_TYPE >= MESON_CPU_TYPE_MESONG9TV) */
if (0) {
@@ -1150,6 +1152,13 @@ void refresh_on_vs(struct vframe_s *vf)
}
EXPORT_SYMBOL(refresh_on_vs);
static irqreturn_t amvecm_viu2_vsync_isr(int irq, void *dev_id)
{
if (vpp_get_encl_viu_mux() == 2)
ve_lcd_gamma_process();
return IRQ_HANDLED;
}
static int amvecm_open(struct inode *inode, struct file *file)
{
struct amvecm_dev_s *devp;
@@ -5875,6 +5884,9 @@ static void aml_vecm_dt_parse(struct platform_device *pdev)
else
amcm_disable();
/* WRITE_VPP_REG_BITS(VPP_MISC, cm_en, 28, 1); */
res_viu2_vsync_irq =
platform_get_resource_byname(pdev, IORESOURCE_IRQ, "vsync2");
}
#ifdef CONFIG_AMLOGIC_LCD
@@ -5885,9 +5897,9 @@ static int aml_lcd_gamma_notifier(struct notifier_block *nb,
return NOTIFY_DONE;
#if 0
vpp_set_lcd_gamma_table(video_gamma_table_r.data, H_SEL_R);
vpp_set_lcd_gamma_table(video_gamma_table_g.data, H_SEL_G);
vpp_set_lcd_gamma_table(video_gamma_table_b.data, H_SEL_B);
amve_write_gamma_table(video_gamma_table_r.data, H_SEL_R);
amve_write_gamma_table(video_gamma_table_g.data, H_SEL_G);
amve_write_gamma_table(video_gamma_table_b.data, H_SEL_B);
#else
vecm_latch_flag |= FLAG_GAMMA_TABLE_R;
vecm_latch_flag |= FLAG_GAMMA_TABLE_G;
@@ -5906,6 +5918,21 @@ static struct notifier_block vlock_notifier_nb = {
.notifier_call = vlock_notify_callback,
};
static int aml_vecm_viu2_vsync_irq_init(void)
{
if (res_viu2_vsync_irq) {
if (request_irq(res_viu2_vsync_irq->start,
amvecm_viu2_vsync_isr, IRQF_SHARED,
"amvecm_vsync2", (void *)"amvecm_vsync2")) {
pr_err("can't request amvecm_vsync2_irq\n");
} else {
pr_info("request amvecm_vsync2_irq successful\n");
}
}
return 0;
}
static int aml_vecm_probe(struct platform_device *pdev)
{
int ret = 0;
@@ -5980,6 +6007,8 @@ static int aml_vecm_probe(struct platform_device *pdev)
hdr_init(&amvecm_dev.hdr_d);
aml_vecm_dt_parse(pdev);
aml_vecm_viu2_vsync_irq_init();
probe_ok = 1;
pr_info("%s: ok\n", __func__);
return 0;
@@ -6009,6 +6038,11 @@ static int __exit aml_vecm_remove(struct platform_device *pdev)
{
struct amvecm_dev_s *devp = &amvecm_dev;
if (res_viu2_vsync_irq) {
free_irq(res_viu2_vsync_irq->start,
(void *)"amvecm_vsync2");
}
hdr_exit();
device_destroy(devp->clsp, devp->devno);
cdev_del(&devp->cdev);