--- /dev/null
+/*
+ * Copyright (C) 2012-2017 ARM Limited or its affiliates.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/kernel.h>
+#include <linux/debugfs.h>
+#include <linux/stringify.h>
+#include "ssi_config.h"
+#include "ssi_driver.h"
+#include "cc_crypto_ctx.h"
+
+struct cc_debugfs_ctx {
+       struct dentry *dir;
+};
+
+#define CC_DEBUG_REG(_X) {     \
+       .name = __stringify(_X),\
+       .offset = CC_REG(_X)    \
+       }
+
+/*
+ * This is a global var for the dentry of the
+ * debugfs ccree/ dir. It is not tied down to
+ * a specific instance of ccree, hence it is
+ * global.
+ */
+static struct dentry *cc_debugfs_dir;
+
+struct debugfs_reg32 debug_regs[] = {
+       CC_DEBUG_REG(HOST_SIGNATURE),
+       CC_DEBUG_REG(HOST_IRR),
+       CC_DEBUG_REG(HOST_POWER_DOWN_EN),
+       CC_DEBUG_REG(AXIM_MON_ERR),
+       CC_DEBUG_REG(DSCRPTR_QUEUE_CONTENT),
+       CC_DEBUG_REG(HOST_IMR),
+       CC_DEBUG_REG(AXIM_CFG),
+       CC_DEBUG_REG(AXIM_CACHE_PARAMS),
+       CC_DEBUG_REG(HOST_VERSION),
+       CC_DEBUG_REG(GPR_HOST),
+       CC_DEBUG_REG(AXIM_MON_COMP),
+};
+
+int cc_debugfs_global_init(void)
+{
+       cc_debugfs_dir = debugfs_create_dir("ccree", NULL);
+
+       return !cc_debugfs_dir;
+}
+
+void cc_debugfs_global_fini(void)
+{
+       debugfs_remove(cc_debugfs_dir);
+}
+
+int cc_debugfs_init(struct cc_drvdata *drvdata)
+{
+       struct device *dev = drvdata_to_dev(drvdata);
+       struct cc_debugfs_ctx *ctx;
+       struct debugfs_regset32 *regset;
+       struct dentry *file;
+
+       ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
+       if (!ctx)
+               return -ENOMEM;
+
+       regset = devm_kzalloc(dev, sizeof(*regset), GFP_KERNEL);
+       if (!regset)
+               return -ENOMEM;
+
+       regset->regs = debug_regs;
+       regset->nregs = ARRAY_SIZE(debug_regs);
+       regset->base = drvdata->cc_base;
+
+       ctx->dir = debugfs_create_dir(drvdata->plat_dev->name, cc_debugfs_dir);
+       if (!ctx->dir)
+               return -ENFILE;
+
+       file = debugfs_create_regset32("regs", 0400, ctx->dir, regset);
+       if (!file) {
+               debugfs_remove(ctx->dir);
+               return -ENFILE;
+       }
+
+       file = debugfs_create_bool("coherent", 0400, ctx->dir,
+                                  &drvdata->coherent);
+
+       if (!file) {
+               debugfs_remove_recursive(ctx->dir);
+               return -ENFILE;
+       }
+
+       drvdata->debugfs = ctx;
+
+       return 0;
+}
+
+void cc_debugfs_fini(struct cc_drvdata *drvdata)
+{
+       struct cc_debugfs_ctx *ctx = (struct cc_debugfs_ctx *)drvdata->debugfs;
+
+       debugfs_remove_recursive(ctx->dir);
+}
 
+++ /dev/null
-/*
- * Copyright (C) 2012-2017 ARM Limited or its affiliates.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <linux/kernel.h>
-#include "ssi_config.h"
-#include "ssi_driver.h"
-#include "cc_crypto_ctx.h"
-#include "ssi_sysfs.h"
-
-#ifdef ENABLE_CC_SYSFS
-
-static struct cc_drvdata *sys_get_drvdata(void);
-
-static ssize_t ssi_sys_regdump_show(struct kobject *kobj,
-                                   struct kobj_attribute *attr, char *buf)
-{
-       struct cc_drvdata *drvdata = sys_get_drvdata();
-       u32 register_value;
-       int offset = 0;
-
-       register_value = cc_ioread(drvdata, CC_REG(HOST_SIGNATURE));
-       offset += scnprintf(buf + offset, PAGE_SIZE - offset,
-                           "%s \t(0x%lX)\t 0x%08X\n", "HOST_SIGNATURE       ",
-                           CC_HOST_SIGNATURE_REG_OFFSET, register_value);
-       register_value = cc_ioread(drvdata, CC_REG(HOST_IRR));
-       offset += scnprintf(buf + offset, PAGE_SIZE - offset,
-                           "%s \t(0x%lX)\t 0x%08X\n", "HOST_IRR             ",
-                           CC_HOST_IRR_REG_OFFSET, register_value);
-       register_value = cc_ioread(drvdata, CC_REG(HOST_POWER_DOWN_EN));
-       offset += scnprintf(buf + offset, PAGE_SIZE - offset,
-                           "%s \t(0x%lX)\t 0x%08X\n", "HOST_POWER_DOWN_EN   ",
-                           CC_HOST_POWER_DOWN_EN_REG_OFFSET, register_value);
-       register_value =  cc_ioread(drvdata, CC_REG(AXIM_MON_ERR));
-       offset += scnprintf(buf + offset, PAGE_SIZE - offset,
-                           "%s \t(0x%lX)\t 0x%08X\n", "AXIM_MON_ERR         ",
-                           CC_AXIM_MON_ERR_REG_OFFSET, register_value);
-       register_value = cc_ioread(drvdata, CC_REG(DSCRPTR_QUEUE_CONTENT));
-       offset += scnprintf(buf + offset, PAGE_SIZE - offset,
-                           "%s \t(0x%lX)\t 0x%08X\n", "DSCRPTR_QUEUE_CONTENT",
-                           CC_DSCRPTR_QUEUE_CONTENT_REG_OFFSET,
-                           register_value);
-       return offset;
-}
-
-static ssize_t ssi_sys_help_show(struct kobject *kobj,
-                                struct kobj_attribute *attr, char *buf)
-{
-       static const char * const help_str[] = {
-                               "cat reg_dump              ",
-                               "Print several of CC register values",
-                               };
-       int i = 0, offset = 0;
-
-       offset += scnprintf(buf + offset, PAGE_SIZE - offset, "Usage:\n");
-       for (i = 0; i < ARRAY_SIZE(help_str); i += 2) {
-               offset += scnprintf(buf + offset, PAGE_SIZE - offset,
-                                   "%s\t\t%s\n", help_str[i],
-                                   help_str[i + 1]);
-       }
-
-       return offset;
-}
-
-/********************************************************
- *             SYSFS objects                           *
- ********************************************************/
-/*
- * Structure used to create a directory
- * and its attributes in sysfs.
- */
-struct sys_dir {
-       struct kobject *sys_dir_kobj;
-       struct attribute_group sys_dir_attr_group;
-       struct attribute **sys_dir_attr_list;
-       u32 num_of_attrs;
-       struct cc_drvdata *drvdata; /* Associated driver context */
-};
-
-/* top level directory structures */
-static struct sys_dir sys_top_dir;
-
-/* TOP LEVEL ATTRIBUTES */
-static struct kobj_attribute ssi_sys_top_level_attrs[] = {
-       __ATTR(dump_regs, 0444, ssi_sys_regdump_show, NULL),
-       __ATTR(help, 0444, ssi_sys_help_show, NULL),
-#if defined CC_CYCLE_COUNT
-       __ATTR(stats_host, 0664, ssi_sys_stat_host_db_show,
-              ssi_sys_stats_host_db_clear),
-       __ATTR(stats_cc, 0664, ssi_sys_stat_cc_db_show,
-              ssi_sys_stats_cc_db_clear),
-#endif
-
-};
-
-static struct cc_drvdata *sys_get_drvdata(void)
-{
-       /* TODO: supporting multiple SeP devices would require avoiding
-        * global "top_dir" and finding associated "top_dir" by traversing
-        * up the tree to the kobject which matches one of the top_dir's
-        */
-       return sys_top_dir.drvdata;
-}
-
-static int sys_init_dir(struct sys_dir *sys_dir, struct cc_drvdata *drvdata,
-                       struct kobject *parent_dir_kobj, const char *dir_name,
-                       struct kobj_attribute *attrs, u32 num_of_attrs)
-{
-       int i;
-
-       memset(sys_dir, 0, sizeof(struct sys_dir));
-
-       sys_dir->drvdata = drvdata;
-
-       /* initialize directory kobject */
-       sys_dir->sys_dir_kobj =
-               kobject_create_and_add(dir_name, parent_dir_kobj);
-
-       if (!(sys_dir->sys_dir_kobj))
-               return -ENOMEM;
-       /* allocate memory for directory's attributes list */
-       sys_dir->sys_dir_attr_list =
-               kcalloc(num_of_attrs + 1, sizeof(struct attribute *),
-                       GFP_KERNEL);
-
-       if (!(sys_dir->sys_dir_attr_list)) {
-               kobject_put(sys_dir->sys_dir_kobj);
-               return -ENOMEM;
-       }
-
-       sys_dir->num_of_attrs = num_of_attrs;
-
-       /* initialize attributes list */
-       for (i = 0; i < num_of_attrs; ++i)
-               sys_dir->sys_dir_attr_list[i] = &attrs[i].attr;
-
-       /* last list entry should be NULL */
-       sys_dir->sys_dir_attr_list[num_of_attrs] = NULL;
-
-       sys_dir->sys_dir_attr_group.attrs = sys_dir->sys_dir_attr_list;
-
-       return sysfs_create_group(sys_dir->sys_dir_kobj,
-                       &sys_dir->sys_dir_attr_group);
-}
-
-static void sys_free_dir(struct sys_dir *sys_dir)
-{
-       if (!sys_dir)
-               return;
-
-       kfree(sys_dir->sys_dir_attr_list);
-
-       if (sys_dir->sys_dir_kobj) {
-               sysfs_remove_group(sys_dir->sys_dir_kobj,
-                                  &sys_dir->sys_dir_attr_group);
-               kobject_put(sys_dir->sys_dir_kobj);
-       }
-}
-
-int ssi_sysfs_init(struct kobject *sys_dev_obj, struct cc_drvdata *drvdata)
-{
-       int retval;
-       struct device *dev = drvdata_to_dev(drvdata);
-
-       dev_info(dev, "setup sysfs under %s\n", sys_dev_obj->name);
-
-       /* Initialize top directory */
-       retval = sys_init_dir(&sys_top_dir, drvdata, sys_dev_obj, "cc_info",
-                             ssi_sys_top_level_attrs,
-                             ARRAY_SIZE(ssi_sys_top_level_attrs));
-       return retval;
-}
-
-void ssi_sysfs_fini(void)
-{
-       sys_free_dir(&sys_top_dir);
-}
-
-#endif /*ENABLE_CC_SYSFS*/
-