lcd: update vrr_dev register flow for tablet mode [1/1]

PD#SWPL-145739

Problem:
lcd tablet mode don't support vrr

Solution:
update vrr_dev register flow for tablet mode

Verify:
ay301

Change-Id: Ic392bf11f31ac2ab4df5fc8d5d2426574246f4e3
Signed-off-by: Evoke Zhang <evoke.zhang@amlogic.com>
This commit is contained in:
Evoke Zhang
2023-05-12 14:04:30 +08:00
committed by gerrit autosubmit
parent c1fbacd6bd
commit 2a87abbdc3
4 changed files with 42 additions and 36 deletions
+29 -2
View File
@@ -3273,7 +3273,7 @@ void lcd_vinfo_update(struct aml_lcd_drv_s *pdrv)
lcd_vout_notify_mode_change(pdrv);
}
unsigned int lcd_vrr_lfc_switch(void *dev_data, int fps)
static unsigned int lcd_vrr_lfc_switch(void *dev_data, int fps)
{
struct aml_lcd_drv_s *pdrv;
unsigned long long temp;
@@ -3296,7 +3296,7 @@ unsigned int lcd_vrr_lfc_switch(void *dev_data, int fps)
return v_period;
}
int lcd_vrr_disable_cb(void *dev_data)
static int lcd_vrr_disable_cb(void *dev_data)
{
struct aml_lcd_drv_s *pdrv;
@@ -3327,3 +3327,30 @@ void lcd_vrr_dev_update(struct aml_lcd_drv_s *pdrv)
pdrv->vrr_dev->vfreq_min = pdrv->config.basic.frame_rate_min;
}
void lcd_vrr_dev_register(struct aml_lcd_drv_s *pdrv)
{
if (pdrv->vrr_dev)
return;
pdrv->vrr_dev = kzalloc(sizeof(*pdrv->vrr_dev), GFP_KERNEL);
if (!pdrv->vrr_dev)
return;
sprintf(pdrv->vrr_dev->name, "lcd%d_dev", pdrv->index);
pdrv->vrr_dev->output_src = VRR_OUTPUT_ENCL;
pdrv->vrr_dev->lfc_switch = lcd_vrr_lfc_switch;
pdrv->vrr_dev->disable_cb = lcd_vrr_disable_cb;
pdrv->vrr_dev->dev_data = (void *)pdrv;
lcd_vrr_dev_update(pdrv);
aml_vrr_register_device(pdrv->vrr_dev, pdrv->index);
}
void lcd_vrr_dev_unregister(struct aml_lcd_drv_s *pdrv)
{
if (!pdrv->vrr_dev)
return;
aml_vrr_unregister_device(pdrv->index);
kfree(pdrv->vrr_dev);
pdrv->vrr_dev = NULL;
}
+4 -3
View File
@@ -52,7 +52,8 @@
/* 20230918: support ultra refresh rate function*/
/* 20231011: t3x dual display support */
/* 20231012: optimize clk management*/
#define LCD_DRV_VERSION "20231012"
/* 20231113: update vrr_dev register flow for tablet mode*/
#define LCD_DRV_VERSION "20231113"
extern struct mutex lcd_vout_mutex;
extern spinlock_t lcd_reg_spinlock;
@@ -115,9 +116,9 @@ void lcd_if_enable_retry(struct aml_lcd_drv_s *pdrv);
void lcd_vout_notify_mode_change_pre(struct aml_lcd_drv_s *pdrv);
void lcd_vout_notify_mode_change(struct aml_lcd_drv_s *pdrv);
void lcd_vinfo_update(struct aml_lcd_drv_s *pdrv);
unsigned int lcd_vrr_lfc_switch(void *dev_data, int fps);
int lcd_vrr_disable_cb(void *dev_data);
void lcd_vrr_dev_update(struct aml_lcd_drv_s *pdrv);
void lcd_vrr_dev_register(struct aml_lcd_drv_s *pdrv);
void lcd_vrr_dev_unregister(struct aml_lcd_drv_s *pdrv);
void lcd_queue_work(struct work_struct *work);
inline void lcd_queue_delayed_work(struct delayed_work *delayed_work, int ms);
+7 -16
View File
@@ -98,21 +98,12 @@ static int lcd_set_current_vmode(enum vmode_e mode, void *data)
mutex_lock(&lcd_power_mutex);
pdrv->vrr_dev = kzalloc(sizeof(*pdrv->vrr_dev), GFP_KERNEL);
if (pdrv->vrr_dev) {
sprintf(pdrv->vrr_dev->name, "lcd%d_dev", pdrv->index);
pdrv->vrr_dev->output_src = VRR_OUTPUT_ENCL;
pdrv->vrr_dev->lfc_switch = lcd_vrr_lfc_switch;
pdrv->vrr_dev->disable_cb = lcd_vrr_disable_cb;
pdrv->vrr_dev->dev_data = (void *)pdrv;
lcd_vrr_dev_update(pdrv);
aml_vrr_register_device(pdrv->vrr_dev, pdrv->index);
}
if (lcd_debug_print_flag & LCD_DBG_PR_NORMAL) {
LCDPR("[%d]: %s: drv_mode=%s\n",
pdrv->index, __func__, pdrv->vinfo.name);
}
lcd_vrr_dev_register(pdrv);
if (mode & VMODE_INIT_BIT_MASK) {
lcd_clk_gate_switch(pdrv, 1);
} else {
@@ -134,11 +125,7 @@ static int lcd_vout_disable(enum vmode_e cur_vmod, void *data)
return -1;
mutex_lock(&lcd_power_mutex);
if (pdrv->vrr_dev) {
aml_vrr_unregister_device(pdrv->index);
kfree(pdrv->vrr_dev);
pdrv->vrr_dev = NULL;
}
lcd_vrr_dev_unregister(pdrv);
pdrv->status &= ~LCD_STATUS_VMODE_ACTIVE;
aml_lcd_notifier_call_chain(LCD_EVENT_POWER_OFF, (void *)pdrv);
@@ -643,11 +630,15 @@ int lcd_mode_tablet_init(struct aml_lcd_drv_s *pdrv)
pdrv->driver_disable = lcd_tablet_driver_disable;
pdrv->fr_adjust = lcd_frame_rate_adjust;
if (pdrv->status & LCD_STATUS_VMODE_ACTIVE)
lcd_vrr_dev_register(pdrv);
return 0;
}
int lcd_mode_tablet_remove(struct aml_lcd_drv_s *pdrv)
{
lcd_vrr_dev_unregister(pdrv);
return 0;
}
+2 -15
View File
@@ -1414,27 +1414,14 @@ int lcd_mode_tv_init(struct aml_lcd_drv_s *pdrv)
break;
}
pdrv->vrr_dev = kzalloc(sizeof(*pdrv->vrr_dev), GFP_KERNEL);
if (pdrv->vrr_dev) {
sprintf(pdrv->vrr_dev->name, "lcd%d_dev", pdrv->index);
pdrv->vrr_dev->output_src = VRR_OUTPUT_ENCL;
pdrv->vrr_dev->lfc_switch = lcd_vrr_lfc_switch;
pdrv->vrr_dev->disable_cb = lcd_vrr_disable_cb;
pdrv->vrr_dev->dev_data = (void *)pdrv;
lcd_vrr_dev_update(pdrv);
aml_vrr_register_device(pdrv->vrr_dev, pdrv->index);
}
lcd_vrr_dev_register(pdrv);
return 0;
}
int lcd_mode_tv_remove(struct aml_lcd_drv_s *pdrv)
{
if (pdrv->vrr_dev) {
aml_vrr_unregister_device(pdrv->index);
kfree(pdrv->vrr_dev);
pdrv->vrr_dev = NULL;
}
lcd_vrr_dev_unregister(pdrv);
switch (pdrv->config.basic.lcd_type) {
case LCD_VBYONE: