[COMMON] drivers: modem_if: Apply LCD notification
authorTaejin Kim <tj7.kim@samsung.com>
Tue, 30 Jul 2019 10:40:01 +0000 (19:40 +0900)
committerlingsen1 <lingsen1@lenovo.com>
Tue, 13 Aug 2019 03:06:15 +0000 (11:06 +0800)
Change-Id: I8a5fd610cfa8bdbe1904437663191b319c109002
Signed-off-by: Taejin Kim <tj7.kim@samsung.com>
arch/arm64/boot/dts/exynos/modem-ss360ap-sit-pdata.dtsi
drivers/misc/modem_if/include/modem_v1.h
drivers/misc/modem_if/modem_main.c
drivers/misc/modem_if/modem_modemctl_device_sh333ap.c
drivers/misc/modem_if/modem_prj.h

index 552fd3a52e77f2a60a6470b6f1da26e98b631294..c051f6b8c3218ba2f9f9f9e790eaceb37157380b 100644 (file)
@@ -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>;
index d1adc66931c59334f7c8006fa7547e7d22eaf82a..1a1142ac7a549eea9a0789d3c2caa175dc719db0 100644 (file)
@@ -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;
index ac9230cce3f625c3e8e027248b8bd994b7a77238..3a7e6da359a0311076e893be58131445019543de 100644 (file)
@@ -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;
 }
index c9bc40408db7f5cf91f822b9011d678d00c2d751..6cd89508a7e7355145c5bf2c8c48e56a6349dde6 100644 (file)
 #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)
@@ -361,11 +364,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) {
@@ -525,11 +531,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();
@@ -740,6 +758,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)
index 0bbf7f1d4fe3485a0dbdf968506dc2dc92fe25ec..0e4b70cd93a4031f59b48163817a4824855f019f 100644 (file)
@@ -781,6 +781,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;
@@ -844,14 +846,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;
@@ -936,6 +938,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)