From 648be29368e707b6463e67f3c527e350a9daec7b Mon Sep 17 00:00:00 2001 From: Taejin Kim Date: Tue, 30 Jul 2019 19:40:01 +0900 Subject: [PATCH] [RAMEN9610-20774][COMMON] drivers: modem_if: Apply LCD notification Change-Id: I8a5fd610cfa8bdbe1904437663191b319c109002 Signed-off-by: Taejin Kim --- .../dts/exynos/modem-ss360ap-sit-pdata.dtsi | 3 + drivers/misc/modem_if/include/modem_v1.h | 4 ++ drivers/misc/modem_if/modem_main.c | 3 + .../modem_if/modem_modemctl_device_sh333ap.c | 56 +++++++++++++++++++ drivers/misc/modem_if/modem_prj.h | 8 ++- 5 files changed, 72 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/exynos/modem-ss360ap-sit-pdata.dtsi b/arch/arm64/boot/dts/exynos/modem-ss360ap-sit-pdata.dtsi index 552fd3a52e77..c051f6b8c321 100644 --- a/arch/arm64/boot/dts/exynos/modem-ss360ap-sit-pdata.dtsi +++ b/arch/arm64/boot/dts/exynos/modem-ss360ap-sit-pdata.dtsi @@ -48,6 +48,7 @@ mif,int_ap2cp_wakeup = <1>; mif,int_ap2cp_status = <2>; mif,int_ap2cp_active = <3>; + mif,int_ap2cp_lcd_status = <4>; mif,int_ap2cp_uart_noti = <15>; /* Mailbox interrupt number from CP to AP */ @@ -73,6 +74,8 @@ mbx_cp2ap_pcie_l1ss_disable = <17>; /* Status bit info for mbx_ap2cp_united_status */ + sbi_lcd_status_mask = <0x1>; + sbi_lcd_status_pos = <27>; sbi_uart_noti_mask = <0x1>; sbi_uart_noti_pos = <16>; sbi_ds_det_mask = <0x3>; diff --git a/drivers/misc/modem_if/include/modem_v1.h b/drivers/misc/modem_if/include/modem_v1.h index d1adc66931c5..1a1142ac7a54 100644 --- a/drivers/misc/modem_if/include/modem_v1.h +++ b/drivers/misc/modem_if/include/modem_v1.h @@ -190,6 +190,7 @@ struct modem_mbox { int int_ap2cp_wakeup; int int_ap2cp_active; int int_ap2cp_status; + int int_ap2cp_lcd_status; int irq_cp2ap_msg; int irq_cp2ap_active; @@ -233,6 +234,9 @@ struct modem_mbox { unsigned int sbi_uart_noti_mask; unsigned int sbi_uart_noti_pos; + unsigned int sbi_lcd_status_mask; + unsigned int sbi_lcd_status_pos; + /* System (H/W) revision */ unsigned int mbx_ap2cp_sys_rev; unsigned int mbx_ap2cp_pmic_rev; diff --git a/drivers/misc/modem_if/modem_main.c b/drivers/misc/modem_if/modem_main.c index ac9230cce3f6..3a7e6da359a0 100644 --- a/drivers/misc/modem_if/modem_main.c +++ b/drivers/misc/modem_if/modem_main.c @@ -313,6 +313,7 @@ static int parse_dt_mbox_pdata(struct device *dev, struct device_node *np, mif_dt_read_u32 (np, "mif,int_ap2cp_wakeup", mbox->int_ap2cp_wakeup); mif_dt_read_u32 (np, "mif,int_ap2cp_status", mbox->int_ap2cp_status); mif_dt_read_u32 (np, "mif,int_ap2cp_active", mbox->int_ap2cp_active); + mif_dt_read_u32 (np, "mif,int_ap2cp_lcd_status", mbox->int_ap2cp_lcd_status); mif_dt_read_u32 (np, "mif,irq_cp2ap_msg", mbox->irq_cp2ap_msg); mif_dt_read_u32 (np, "mif,irq_cp2ap_status", mbox->irq_cp2ap_status); @@ -351,6 +352,8 @@ static int parse_dt_mbox_pdata(struct device *dev, struct device_node *np, mif_dt_read_u32 (np, "sbi_sys_rev_pos", mbox->sbi_sys_rev_pos); mif_dt_read_u32 (np, "sbi_ds_det_mask", mbox->sbi_ds_det_mask); mif_dt_read_u32 (np, "sbi_ds_det_pos", mbox->sbi_ds_det_pos); + mif_dt_read_u32 (np, "sbi_lcd_status_mask", mbox->sbi_lcd_status_mask); + mif_dt_read_u32 (np, "sbi_lcd_status_pos", mbox->sbi_lcd_status_pos); return 0; } diff --git a/drivers/misc/modem_if/modem_modemctl_device_sh333ap.c b/drivers/misc/modem_if/modem_modemctl_device_sh333ap.c index d3f45538360e..3107176ee292 100644 --- a/drivers/misc/modem_if/modem_modemctl_device_sh333ap.c +++ b/drivers/misc/modem_if/modem_modemctl_device_sh333ap.c @@ -33,11 +33,14 @@ #include "modem_utils.h" #include "modem_link_device_shmem.h" #include "uart_switch.h" +#include "../../video/fbdev/exynos/dpu20/decon.h" #define MIF_INIT_TIMEOUT (15 * HZ) #define MBREG_MAX_NUM 64 static struct modem_ctl *g_mc; +static int s333ap_lcd_notifier(struct notifier_block *notifier, + unsigned long event, void *v); static ssize_t modem_ctrl_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -347,11 +350,14 @@ static int sh333ap_on(struct modem_ctl *mc) spin_unlock_irqrestore(&mc->ap_status_lock, flags); + mif_info("LCD_ON Notificaion\n"); spin_lock_irqsave(&mc->ap_status_lock, flags); mbox_update_value(MCU_CP, mc->mbx_ap_status, 1, mc->sbi_pda_active_mask, mc->sbi_pda_active_pos); mbox_update_value(MCU_CP, mc->mbx_ap_status, 1, mc->sbi_ap_status_mask, mc->sbi_ap_status_pos); + mbox_update_value(MCU_CP, mc->mbx_ap_status, 1, + mc->sbi_lcd_status_mask, mc->sbi_lcd_status_pos); spin_unlock_irqrestore(&mc->ap_status_lock, flags); if (mc->ap2cp_cfg_ioaddr) { @@ -511,11 +517,23 @@ exit: static int sh333ap_boot_done(struct modem_ctl *mc) { + int ret; + mif_info("+++\n"); if (wake_lock_active(&mc->mc_wake_lock)) wake_unlock(&mc->mc_wake_lock); + if (mc->lcd_notifier.notifier_call == NULL) { + mif_info("Register lcd notifier\n"); + mc->lcd_notifier.notifier_call = s333ap_lcd_notifier; + ret = register_lcd_status_notifier(&mc->lcd_notifier); + if (ret) { + mif_err("failed to register LCD notifier"); + return ret; + } + } + #ifdef CONFIG_UART_SWITCH mif_err("Recheck UART direction.\n"); cp_recheck_uart_dir(); @@ -726,6 +744,44 @@ static void sh333ap_get_pdata(struct modem_ctl *mc, struct modem_data *modem) mc->sbi_uart_noti_mask = mbx->sbi_uart_noti_mask; mc->sbi_uart_noti_pos = mbx->sbi_uart_noti_pos; + mc->sbi_lcd_status_mask = mbx->sbi_lcd_status_mask; + mc->sbi_lcd_status_pos = mbx->sbi_lcd_status_pos; + mc->int_ap2cp_lcd_status = mbx->int_ap2cp_lcd_status; + +} + +static int s333ap_lcd_notifier(struct notifier_block *notifier, + unsigned long event, void *v) +{ + struct modem_ctl *mc = + container_of(notifier, struct modem_ctl, lcd_notifier); + unsigned long int flags; + + switch (event) { + case LCD_OFF: + mif_info("LCD_OFF Notification\n"); + spin_lock_irqsave(&mc->ap_status_lock, flags); + mbox_update_value(MCU_CP, mc->mbx_ap_status, 0, + mc->sbi_lcd_status_mask, + mc->sbi_lcd_status_pos); + spin_unlock_irqrestore(&mc->ap_status_lock, flags); + mbox_set_interrupt(MCU_CP, mc->int_ap2cp_lcd_status); + break; + + case LCD_ON: + mif_info("LCD_ON Notificaion\n"); + mbox_update_value(MCU_CP, mc->mbx_ap_status, 1, + mc->sbi_lcd_status_mask, + mc->sbi_lcd_status_pos); + mbox_set_interrupt(MCU_CP, mc->int_ap2cp_lcd_status); + break; + + default: + mif_info("lcd_event %ld\n", event); + break; + } + + return NOTIFY_OK; } int init_modemctl_device(struct modem_ctl *mc, struct modem_data *pdata) diff --git a/drivers/misc/modem_if/modem_prj.h b/drivers/misc/modem_if/modem_prj.h index 4356cc426ba9..759c56b25e4b 100644 --- a/drivers/misc/modem_if/modem_prj.h +++ b/drivers/misc/modem_if/modem_prj.h @@ -784,6 +784,8 @@ struct modem_ctl { int int_ap_status; spinlock_t ap_status_lock; + int int_ap2cp_lcd_status; + unsigned int gpio_cp_wakeup; unsigned int mbx_cp_wakeup; int int_cp_wakeup; @@ -847,14 +849,14 @@ struct modem_ctl { unsigned int sbi_lte_active_pos; unsigned int sbi_cp_status_mask; unsigned int sbi_cp_status_pos; - unsigned int sbi_pda_active_mask; unsigned int sbi_pda_active_pos; unsigned int sbi_ap_status_mask; unsigned int sbi_ap_status_pos; - unsigned int sbi_uart_noti_mask; unsigned int sbi_uart_noti_pos; + unsigned int sbi_lcd_status_mask; + unsigned int sbi_lcd_status_pos; unsigned int ap2cp_cfg_addr; void __iomem *ap2cp_cfg_ioaddr; @@ -939,6 +941,8 @@ struct modem_ctl { struct freq_table cpu_table; struct clk *qch_cp; + + struct notifier_block lcd_notifier; }; static inline bool cp_offline(struct modem_ctl *mc) -- 2.20.1