From de072140f6912d41bc27927496846ccba3240b44 Mon Sep 17 00:00:00 2001 From: Ivan Priest Date: Thu, 16 May 2019 13:43:32 +0100 Subject: [PATCH] [NEUS7920-477] [9610][9630] wlbt: log WLBT_STAT in proc Ability to log WLBT deep sleep request state (WLBT_STAT[0]) Change-Id: I4319643c610c71cbb9e20575f0f3205bcdbc3ee0 SCSC-Bug-Id: SSB-51613 Signed-off-by: Ivan Priest --- drivers/misc/samsung/scsc/mxproc.c | 31 ++++++++++++++++++++++++ drivers/misc/samsung/scsc/pcie_mif.c | 1 + drivers/misc/samsung/scsc/platform_mif.c | 13 ++++++++++ drivers/misc/samsung/scsc/scsc_mif_abs.h | 4 +++ 4 files changed, 49 insertions(+) diff --git a/drivers/misc/samsung/scsc/mxproc.c b/drivers/misc/samsung/scsc/mxproc.c index 547ff9b88a29..a5f4b3783a2f 100644 --- a/drivers/misc/samsung/scsc/mxproc.c +++ b/drivers/misc/samsung/scsc/mxproc.c @@ -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; diff --git a/drivers/misc/samsung/scsc/pcie_mif.c b/drivers/misc/samsung/scsc/pcie_mif.c index 3cf0925b8dcc..b57d4b25558d 100644 --- a/drivers/misc/samsung/scsc/pcie_mif.c +++ b/drivers/misc/samsung/scsc/pcie_mif.c @@ -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; diff --git a/drivers/misc/samsung/scsc/platform_mif.c b/drivers/misc/samsung/scsc/platform_mif.c index 61d56b8760a0..2e4f9305cbb9 100755 --- a/drivers/misc/samsung/scsc/platform_mif.c +++ b/drivers/misc/samsung/scsc/platform_mif.c @@ -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 diff --git a/drivers/misc/samsung/scsc/scsc_mif_abs.h b/drivers/misc/samsung/scsc/scsc_mif_abs.h index 333d28a0403e..b97551ce6108 100644 --- a/drivers/misc/samsung/scsc/scsc_mif_abs.h +++ b/drivers/misc/samsung/scsc/scsc_mif_abs.h @@ -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; -- 2.20.1