mirror of
https://github.com/hardkernel/kernel_common_drivers.git
synced 2026-06-25 12:03:48 +09:00
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:
committed by
gerrit autosubmit
parent
c1fbacd6bd
commit
2a87abbdc3
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user