From 2a87abbdc3660189ee802f97891af21ed34958d1 Mon Sep 17 00:00:00 2001 From: Evoke Zhang Date: Fri, 12 May 2023 14:04:30 +0800 Subject: [PATCH] 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 --- drivers/media/vout/lcd/lcd_common.c | 31 +++++++++++++++++-- drivers/media/vout/lcd/lcd_common.h | 7 +++-- .../media/vout/lcd/lcd_tablet/lcd_tablet.c | 23 +++++--------- drivers/media/vout/lcd/lcd_tv/lcd_tv.c | 17 ++-------- 4 files changed, 42 insertions(+), 36 deletions(-) diff --git a/drivers/media/vout/lcd/lcd_common.c b/drivers/media/vout/lcd/lcd_common.c index 6369da75f..6f3460653 100644 --- a/drivers/media/vout/lcd/lcd_common.c +++ b/drivers/media/vout/lcd/lcd_common.c @@ -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; +} diff --git a/drivers/media/vout/lcd/lcd_common.h b/drivers/media/vout/lcd/lcd_common.h index 8f0667ead..839f4bfdd 100644 --- a/drivers/media/vout/lcd/lcd_common.h +++ b/drivers/media/vout/lcd/lcd_common.h @@ -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); diff --git a/drivers/media/vout/lcd/lcd_tablet/lcd_tablet.c b/drivers/media/vout/lcd/lcd_tablet/lcd_tablet.c index aa805fb9a..9d0456f56 100644 --- a/drivers/media/vout/lcd/lcd_tablet/lcd_tablet.c +++ b/drivers/media/vout/lcd/lcd_tablet/lcd_tablet.c @@ -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; } diff --git a/drivers/media/vout/lcd/lcd_tv/lcd_tv.c b/drivers/media/vout/lcd/lcd_tv/lcd_tv.c index ad96899b7..66b9fc9de 100644 --- a/drivers/media/vout/lcd/lcd_tv/lcd_tv.c +++ b/drivers/media/vout/lcd/lcd_tv/lcd_tv.c @@ -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: