From ecb6d435746de6b471658418acaf555aa84b0502 Mon Sep 17 00:00:00 2001 From: hwangjae lee Date: Tue, 30 Jul 2019 14:10:50 +0900 Subject: [PATCH] [ERD][RAMEN9610-20750][RAMEN9610-18757] fbdev: dpu: lcd status notifier is added Change-Id: I283f452e6ae88ddff4a7229d1e2b71c90c2d53ff Signed-off-by: hwangjae lee Signed-off-by: ChiHun Won --- drivers/video/fbdev/exynos/dpu20/decon.h | 11 +++++++++ drivers/video/fbdev/exynos/dpu20/decon_core.c | 4 ++++ drivers/video/fbdev/exynos/dpu20/helper.c | 24 +++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/drivers/video/fbdev/exynos/dpu20/decon.h b/drivers/video/fbdev/exynos/dpu20/decon.h index b961d3d8b691..6e40c07c5732 100644 --- a/drivers/video/fbdev/exynos/dpu20/decon.h +++ b/drivers/video/fbdev/exynos/dpu20/decon.h @@ -519,6 +519,11 @@ struct decon_win_config_data { struct decon_win_config config[MAX_DECON_WIN + 1]; }; +enum lcd_status { + LCD_OFF = 0, + LCD_ON = 1, +}; + enum hwc_ver { HWC_INIT = 0, HWC_1_0 = 1, @@ -1029,6 +1034,8 @@ struct decon_device { atomic_t bypass; struct decon_reg_data last_regs; #endif + /* display LCD on/off notifier */ + struct atomic_notifier_head lcd_status_notifier_list; }; static inline struct decon_device *get_decon_drvdata(u32 id) @@ -1415,6 +1422,10 @@ int decon_set_out_sd_state(struct decon_device *decon, enum decon_state state); int decon_update_last_regs(struct decon_device *decon, struct decon_reg_data *regs); +int register_lcd_status_notifier(struct notifier_block *nb); +int unregister_lcd_status_notifier(struct notifier_block *nb); +void lcd_status_notifier(u32 lcd_status); + /* IOCTL commands */ #define S3CFB_SET_VSYNC_INT _IOW('F', 206, __u32) #define S3CFB_DECON_SELF_REFRESH _IOW('F', 207, __u32) diff --git a/drivers/video/fbdev/exynos/dpu20/decon_core.c b/drivers/video/fbdev/exynos/dpu20/decon_core.c index b0f5b05ce720..997775f06e66 100644 --- a/drivers/video/fbdev/exynos/dpu20/decon_core.c +++ b/drivers/video/fbdev/exynos/dpu20/decon_core.c @@ -35,6 +35,7 @@ #endif #include #include +#include #include #include #include @@ -954,9 +955,11 @@ static int decon_blank(int blank_mode, struct fb_info *info) decon_err("failed to disable decon\n"); goto blank_exit; } + lcd_status_notifier(LCD_OFF); break; case FB_BLANK_UNBLANK: DPU_EVENT_LOG(DPU_EVT_UNBLANK, &decon->sd, ktime_set(0, 0)); + lcd_status_notifier(LCD_ON); ret = decon_update_pwr_state(decon, DISP_PWR_NORMAL); if (ret) { decon_err("failed to enable decon\n"); @@ -4086,6 +4089,7 @@ static int decon_probe(struct platform_device *pdev) decon->bts.ops->bts_init(decon); #endif + ATOMIC_INIT_NOTIFIER_HEAD(&decon->lcd_status_notifier_list); platform_set_drvdata(pdev, decon); pm_runtime_enable(dev); diff --git a/drivers/video/fbdev/exynos/dpu20/helper.c b/drivers/video/fbdev/exynos/dpu20/helper.c index c9cb874ce5de..39067dfbf7a6 100644 --- a/drivers/video/fbdev/exynos/dpu20/helper.c +++ b/drivers/video/fbdev/exynos/dpu20/helper.c @@ -675,6 +675,30 @@ static int dpu_dump_buffer_data(struct dpp_device *dpp) } #endif +int register_lcd_status_notifier(struct notifier_block *nb) +{ + struct decon_device *decon = get_decon_drvdata(0); + return atomic_notifier_chain_register(&decon->lcd_status_notifier_list, nb); +} +EXPORT_SYMBOL(register_lcd_status_notifier); + +int unregister_lcd_status_notifier(struct notifier_block *nb) +{ + struct decon_device *decon = get_decon_drvdata(0); + return atomic_notifier_chain_unregister(&decon->lcd_status_notifier_list, nb); +} +EXPORT_SYMBOL(unregister_lcd_status_notifier); + +/* If lcd status is + * 0 : LCD ON + * 1 : LCD OFF + */ +void lcd_status_notifier(u32 lcd_status) +{ + struct decon_device *decon = get_decon_drvdata(0); + atomic_notifier_call_chain(&decon->lcd_status_notifier_list, lcd_status , NULL); +} + int dpu_sysmmu_fault_handler(struct iommu_domain *domain, struct device *dev, unsigned long iova, int flags, void *token) { -- 2.20.1