/* * sec_pm_debug.c * * Copyright (c) 2017 Samsung Electronics Co., Ltd. * http://www.samsung.com * Minsung Kim * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include #include #include #include #include #include u8 pmic_onsrc; u8 pmic_offsrc; unsigned long long sleep_time_sec; unsigned int sleep_count; static int sec_pm_debug_ocp_info_show(struct seq_file *m, void *v) { seq_printf(m, "No OCP(ON:0x%02X OFF:0x%02X)\n", pmic_onsrc, pmic_offsrc); return 0; } static int ocp_info_open(struct inode *inode, struct file *file) { return single_open(file, sec_pm_debug_ocp_info_show, inode->i_private); } const static struct file_operations ocp_info_fops = { .open = ocp_info_open, .read = seq_read, .llseek = seq_lseek, .release = single_release, }; static int sec_pm_debug_on_offsrc_show(struct seq_file *m, void *v) { seq_printf(m, "PWRONSRC:0x%02X OFFSRC:0x%02X\n", pmic_onsrc, pmic_offsrc); return 0; } static int on_offsrc_open(struct inode *inode, struct file *file) { return single_open(file, sec_pm_debug_on_offsrc_show, inode->i_private); } const static struct file_operations on_offsrc_fops = { .open = on_offsrc_open, .read = seq_read, .llseek = seq_lseek, .release = single_release, }; static ssize_t sleep_time_sec_show(struct device *dev, struct device_attribute *attr, char *buf) { return sprintf(buf, "%llu\n", sleep_time_sec); } static ssize_t sleep_count_show(struct device *dev, struct device_attribute *attr, char *buf) { return sprintf(buf, "%u\n", sleep_count); } static DEVICE_ATTR_RO(sleep_time_sec); static DEVICE_ATTR_RO(sleep_count); static struct attribute *sec_pm_debug_attrs[] = { &dev_attr_sleep_time_sec.attr, &dev_attr_sleep_count.attr, NULL }; ATTRIBUTE_GROUPS(sec_pm_debug); static int __init sec_pm_debug_init(void) { struct device *sec_pm_dev; int ret; debugfs_create_file("ocp_info", 0444, NULL, NULL, &ocp_info_fops); debugfs_create_file("pwr_on_offsrc", 0444, NULL, NULL, &on_offsrc_fops); sec_pm_dev = sec_device_create(NULL, "pm"); if (IS_ERR(sec_pm_dev)) { pr_err("%s: fail to create sec_pm_dev\n", __func__); return PTR_ERR(sec_pm_dev); } ret = sysfs_create_groups(&sec_pm_dev->kobj, sec_pm_debug_groups); if (ret) { pr_err("%s: failed to create sysfs groups(%d)\n", __func__, ret); goto err_create_sysfs; } return 0; err_create_sysfs: sec_device_destroy(sec_pm_dev->devt); return ret; } late_initcall(sec_pm_debug_init);