[NEUS7920-477] [9610][9630] wlbt: log WLBT_STAT in proc
authorIvan Priest <i.priest@samsung.com>
Thu, 16 May 2019 12:43:32 +0000 (13:43 +0100)
committerKim Gunho <gunho.kim@samsung.com>
Fri, 28 Jun 2019 14:46:16 +0000 (23:46 +0900)
Ability to log WLBT deep sleep request state (WLBT_STAT[0])

Change-Id: I4319643c610c71cbb9e20575f0f3205bcdbc3ee0
SCSC-Bug-Id: SSB-51613
Signed-off-by: Ivan Priest <i.priest@samsung.com>
drivers/misc/samsung/scsc/mxproc.c
drivers/misc/samsung/scsc/pcie_mif.c
drivers/misc/samsung/scsc/platform_mif.c
drivers/misc/samsung/scsc/scsc_mif_abs.h

index 547ff9b88a2920685a0a8e876ddb9a0a8ead615f..a5f4b3783a2fd7d546608815229acbea4e11faeb 100644 (file)
@@ -356,6 +356,34 @@ static ssize_t mx_procfs_mx_services_read(struct file *file, char __user *user_b
        return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
 }
 
+static ssize_t mx_procfs_mx_wlbt_stat_read(struct file *file, char __user *user_buf, size_t count, loff_t *ppos)
+{
+       struct mxproc *mxproc = file->private_data;
+       struct scsc_mif_abs *mif_abs;
+       int pos = 0;
+       int r;
+       char buf[32];
+       const size_t bufsz = sizeof(buf);
+       u32 val = 0xff;
+
+       OS_UNUSED_PARAMETER(file);
+
+       if (!mxproc || !mxproc->mxman || !mxproc->mxman->mx)
+               return 0;
+
+       mif_abs = scsc_mx_get_mif_abs(mxproc->mxman->mx);
+
+       /* Read WLBT_STAT register */
+       if (mif_abs->mif_read_register) {
+               r = mif_abs->mif_read_register(mif_abs, SCSC_REG_READ_WLBT_STAT, &val);
+               if (r)
+                       val = 0xff; /* failed */
+       }
+
+       pos += scnprintf(buf + pos, bufsz - pos, "0x%x\n", val);
+
+       return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
+}
 
 MX_PROCFS_RW_FILE_OPS(mx_fail);
 MX_PROCFS_RW_FILE_OPS(mx_freeze);
@@ -367,6 +395,7 @@ MX_PROCFS_RO_FILE_OPS(mx_boot_count);
 MX_PROCFS_RO_FILE_OPS(mx_status);
 MX_PROCFS_RO_FILE_OPS(mx_services);
 MX_PROCFS_RO_FILE_OPS(mx_lastpanic);
+MX_PROCFS_RO_FILE_OPS(mx_wlbt_stat);
 
 static u32 proc_count;
 
@@ -396,6 +425,7 @@ int mxproc_create_ctrl_proc_dir(struct mxproc *mxproc, struct mxman *mxman)
        MX_PROCFS_ADD_FILE(mxproc, mx_status, parent, S_IRUSR | S_IRGRP | S_IROTH);
        MX_PROCFS_ADD_FILE(mxproc, mx_services, parent, S_IRUSR | S_IRGRP | S_IROTH);
        MX_PROCFS_ADD_FILE(mxproc, mx_lastpanic, parent, S_IRUSR | S_IRGRP | S_IROTH);
+       MX_PROCFS_ADD_FILE(mxproc, mx_wlbt_stat, parent, S_IRUSR | S_IRGRP | S_IROTH);
 
        SCSC_TAG_DEBUG(MX_PROC, "created %s proc dir\n", dir);
        proc_count++;
@@ -417,6 +447,7 @@ void mxproc_remove_ctrl_proc_dir(struct mxproc *mxproc)
                MX_PROCFS_REMOVE_FILE(mx_status, mxproc->procfs_ctrl_dir);
                MX_PROCFS_REMOVE_FILE(mx_services, mxproc->procfs_ctrl_dir);
                MX_PROCFS_REMOVE_FILE(mx_lastpanic, mxproc->procfs_ctrl_dir);
+               MX_PROCFS_REMOVE_FILE(mx_wlbt_stat, mxproc->procfs_ctrl_dir);
                (void)snprintf(dir, sizeof(dir), "%s%d", procdir_ctrl, mxproc->procfs_ctrl_dir_num);
                remove_proc_entry(dir, NULL);
                mxproc->procfs_ctrl_dir = NULL;
index 3cf0925b8dcc297e015b32e31b1909a2eb887a72..b57d4b25558d5cfbd0dac5406c3e911455cf90ad 100644 (file)
@@ -481,6 +481,7 @@ struct scsc_mif_abs *pcie_mif_create(struct pci_dev *pdev, const struct pci_devi
        pcie_if->get_mif_device = pcie_mif_get_mif_device;
        pcie_if->irq_clear = pcie_mif_irq_clear;
        pcie_if->mif_dump_registers = pcie_mif_dump_register;
+       pcie_if->mif_read_register = NULL;
 #ifdef CONFIG_SCSC_QOS
        pcie_if->mif_pm_qos_add_request = pcie_mif_pm_qos_add_request;
        pcie_if->mif_pm_qos_update_request = pcie_mif_pm_qos_update_request;
index 61d56b8760a0dd84fd6866e1645532302762f34d..2e4f9305cbb9a9289fce2524f3c0ff57c85a3e45 100755 (executable)
@@ -1955,6 +1955,18 @@ static void platform_mif_irq_clear(void)
        /* Implement if required */
 }
 
+static int platform_mif_read_register(struct scsc_mif_abs *interface, u64 id, u32 *val)
+{
+       struct platform_mif *platform = platform_mif_from_mif_abs(interface);
+
+       if (id == SCSC_REG_READ_WLBT_STAT) {
+               regmap_read(platform->pmureg, WLBT_STAT, val);
+               return 0;
+       }
+
+       return -EIO;
+}
+
 static void platform_mif_dump_register(struct scsc_mif_abs *interface)
 {
        struct platform_mif *platform = platform_mif_from_mif_abs(interface);
@@ -2127,6 +2139,7 @@ struct scsc_mif_abs *platform_mif_create(struct platform_device *pdev)
        platform_if->get_mif_device = platform_mif_get_mif_device;
        platform_if->irq_clear = platform_mif_irq_clear;
        platform_if->mif_dump_registers = platform_mif_dump_register;
+       platform_if->mif_read_register = platform_mif_read_register;
        platform_if->mif_cleanup = platform_mif_cleanup;
        platform_if->mif_restart = platform_mif_restart;
 #ifdef CONFIG_SCSC_SMAPPER
index 333d28a0403e5e1f611363a37b7dbe07e2c77e9e..b97551ce61089879231ce4b1eef43b89f510c0c0 100644 (file)
@@ -45,6 +45,9 @@ struct scsc_mifqos_request {
        struct pm_qos_request pm_qos_req_cl1;
 };
 #endif
+
+#define SCSC_REG_READ_WLBT_STAT                0
+
 /**
  * Abstraction of the Maxwell "Memory Interface" aka  MIF.
  *
@@ -202,6 +205,7 @@ struct scsc_mif_abs {
        int  (*mif_pm_qos_update_request)(struct scsc_mif_abs *interface, struct scsc_mifqos_request *qos_req, enum scsc_qos_config config);
        int  (*mif_pm_qos_remove_request)(struct scsc_mif_abs *interface, struct scsc_mifqos_request *qos_req);
 #endif
+       int (*mif_read_register)(struct scsc_mif_abs *interface, u64 id, u32 *val);
 };
 
 struct device;