| /* | |
| * c8sectpfe-debugfs.c - C8SECTPFE STi DVB driver | |
| * | |
| * Copyright (c) STMicroelectronics 2015 | |
| * | |
| * Author: Peter Griffin <peter.griffin@linaro.org> | |
| * | |
| * This program is free software: you can redistribute it and/or modify | |
| * it under the terms of the GNU General Public License version 2 of | |
| * the License 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. | |
| */ | |
| #include <linux/debugfs.h> | |
| #include <linux/device.h> | |
| #include <linux/interrupt.h> | |
| #include <linux/io.h> | |
| #include <linux/kernel.h> | |
| #include <linux/seq_file.h> | |
| #include <linux/slab.h> | |
| #include <linux/types.h> | |
| #include "c8sectpfe-debugfs.h" | |
| #define dump_register(nm ...) \ | |
| { \ | |
| .name = #nm, \ | |
| .offset = nm, \ | |
| } | |
| static const struct debugfs_reg32 fei_sys_regs[] = { | |
| dump_register(SYS_INPUT_ERR_STATUS), | |
| dump_register(SYS_OTHER_ERR_STATUS), | |
| dump_register(SYS_INPUT_ERR_MASK), | |
| dump_register(SYS_DMA_ROUTE), | |
| dump_register(SYS_INPUT_CLKEN), | |
| dump_register(IBENABLE_MASK), | |
| dump_register(SYS_OTHER_CLKEN), | |
| dump_register(SYS_CFG_NUM_IB), | |
| dump_register(SYS_CFG_NUM_MIB), | |
| dump_register(SYS_CFG_NUM_SWTS), | |
| dump_register(SYS_CFG_NUM_TSOUT), | |
| dump_register(SYS_CFG_NUM_CCSC), | |
| dump_register(SYS_CFG_NUM_RAM), | |
| dump_register(SYS_CFG_NUM_TP), | |
| dump_register(C8SECTPFE_IB_IP_FMT_CFG(0)), | |
| dump_register(C8SECTPFE_IB_TAGBYTES_CFG(0)), | |
| dump_register(C8SECTPFE_IB_PID_SET(0)), | |
| dump_register(C8SECTPFE_IB_PKT_LEN(0)), | |
| dump_register(C8SECTPFE_IB_BUFF_STRT(0)), | |
| dump_register(C8SECTPFE_IB_BUFF_END(0)), | |
| dump_register(C8SECTPFE_IB_READ_PNT(0)), | |
| dump_register(C8SECTPFE_IB_WRT_PNT(0)), | |
| dump_register(C8SECTPFE_IB_PRI_THRLD(0)), | |
| dump_register(C8SECTPFE_IB_STAT(0)), | |
| dump_register(C8SECTPFE_IB_MASK(0)), | |
| dump_register(C8SECTPFE_IB_SYS(0)), | |
| dump_register(C8SECTPFE_IB_IP_FMT_CFG(1)), | |
| dump_register(C8SECTPFE_IB_TAGBYTES_CFG(1)), | |
| dump_register(C8SECTPFE_IB_PID_SET(1)), | |
| dump_register(C8SECTPFE_IB_PKT_LEN(1)), | |
| dump_register(C8SECTPFE_IB_BUFF_STRT(1)), | |
| dump_register(C8SECTPFE_IB_BUFF_END(1)), | |
| dump_register(C8SECTPFE_IB_READ_PNT(1)), | |
| dump_register(C8SECTPFE_IB_WRT_PNT(1)), | |
| dump_register(C8SECTPFE_IB_PRI_THRLD(1)), | |
| dump_register(C8SECTPFE_IB_STAT(1)), | |
| dump_register(C8SECTPFE_IB_MASK(1)), | |
| dump_register(C8SECTPFE_IB_SYS(1)), | |
| dump_register(C8SECTPFE_IB_IP_FMT_CFG(2)), | |
| dump_register(C8SECTPFE_IB_TAGBYTES_CFG(2)), | |
| dump_register(C8SECTPFE_IB_PID_SET(2)), | |
| dump_register(C8SECTPFE_IB_PKT_LEN(2)), | |
| dump_register(C8SECTPFE_IB_BUFF_STRT(2)), | |
| dump_register(C8SECTPFE_IB_BUFF_END(2)), | |
| dump_register(C8SECTPFE_IB_READ_PNT(2)), | |
| dump_register(C8SECTPFE_IB_WRT_PNT(2)), | |
| dump_register(C8SECTPFE_IB_PRI_THRLD(2)), | |
| dump_register(C8SECTPFE_IB_STAT(2)), | |
| dump_register(C8SECTPFE_IB_MASK(2)), | |
| dump_register(C8SECTPFE_IB_SYS(2)), | |
| dump_register(C8SECTPFE_IB_IP_FMT_CFG(3)), | |
| dump_register(C8SECTPFE_IB_TAGBYTES_CFG(3)), | |
| dump_register(C8SECTPFE_IB_PID_SET(3)), | |
| dump_register(C8SECTPFE_IB_PKT_LEN(3)), | |
| dump_register(C8SECTPFE_IB_BUFF_STRT(3)), | |
| dump_register(C8SECTPFE_IB_BUFF_END(3)), | |
| dump_register(C8SECTPFE_IB_READ_PNT(3)), | |
| dump_register(C8SECTPFE_IB_WRT_PNT(3)), | |
| dump_register(C8SECTPFE_IB_PRI_THRLD(3)), | |
| dump_register(C8SECTPFE_IB_STAT(3)), | |
| dump_register(C8SECTPFE_IB_MASK(3)), | |
| dump_register(C8SECTPFE_IB_SYS(3)), | |
| dump_register(C8SECTPFE_IB_IP_FMT_CFG(4)), | |
| dump_register(C8SECTPFE_IB_TAGBYTES_CFG(4)), | |
| dump_register(C8SECTPFE_IB_PID_SET(4)), | |
| dump_register(C8SECTPFE_IB_PKT_LEN(4)), | |
| dump_register(C8SECTPFE_IB_BUFF_STRT(4)), | |
| dump_register(C8SECTPFE_IB_BUFF_END(4)), | |
| dump_register(C8SECTPFE_IB_READ_PNT(4)), | |
| dump_register(C8SECTPFE_IB_WRT_PNT(4)), | |
| dump_register(C8SECTPFE_IB_PRI_THRLD(4)), | |
| dump_register(C8SECTPFE_IB_STAT(4)), | |
| dump_register(C8SECTPFE_IB_MASK(4)), | |
| dump_register(C8SECTPFE_IB_SYS(4)), | |
| dump_register(C8SECTPFE_IB_IP_FMT_CFG(5)), | |
| dump_register(C8SECTPFE_IB_TAGBYTES_CFG(5)), | |
| dump_register(C8SECTPFE_IB_PID_SET(5)), | |
| dump_register(C8SECTPFE_IB_PKT_LEN(5)), | |
| dump_register(C8SECTPFE_IB_BUFF_STRT(5)), | |
| dump_register(C8SECTPFE_IB_BUFF_END(5)), | |
| dump_register(C8SECTPFE_IB_READ_PNT(5)), | |
| dump_register(C8SECTPFE_IB_WRT_PNT(5)), | |
| dump_register(C8SECTPFE_IB_PRI_THRLD(5)), | |
| dump_register(C8SECTPFE_IB_STAT(5)), | |
| dump_register(C8SECTPFE_IB_MASK(5)), | |
| dump_register(C8SECTPFE_IB_SYS(5)), | |
| dump_register(C8SECTPFE_IB_IP_FMT_CFG(6)), | |
| dump_register(C8SECTPFE_IB_TAGBYTES_CFG(6)), | |
| dump_register(C8SECTPFE_IB_PID_SET(6)), | |
| dump_register(C8SECTPFE_IB_PKT_LEN(6)), | |
| dump_register(C8SECTPFE_IB_BUFF_STRT(6)), | |
| dump_register(C8SECTPFE_IB_BUFF_END(6)), | |
| dump_register(C8SECTPFE_IB_READ_PNT(6)), | |
| dump_register(C8SECTPFE_IB_WRT_PNT(6)), | |
| dump_register(C8SECTPFE_IB_PRI_THRLD(6)), | |
| dump_register(C8SECTPFE_IB_STAT(6)), | |
| dump_register(C8SECTPFE_IB_MASK(6)), | |
| dump_register(C8SECTPFE_IB_SYS(6)), | |
| dump_register(DMA_CPU_ID), | |
| dump_register(DMA_CPU_VCR), | |
| dump_register(DMA_CPU_RUN), | |
| dump_register(DMA_CPU_PC), | |
| dump_register(DMA_PER_TPn_DREQ_MASK), | |
| dump_register(DMA_PER_TPn_DACK_SET), | |
| dump_register(DMA_PER_TPn_DREQ), | |
| dump_register(DMA_PER_TPn_DACK), | |
| dump_register(DMA_PER_DREQ_MODE), | |
| dump_register(DMA_PER_STBUS_SYNC), | |
| dump_register(DMA_PER_STBUS_ACCESS), | |
| dump_register(DMA_PER_STBUS_ADDRESS), | |
| dump_register(DMA_PER_IDLE_INT), | |
| dump_register(DMA_PER_PRIORITY), | |
| dump_register(DMA_PER_MAX_OPCODE), | |
| dump_register(DMA_PER_MAX_CHUNK), | |
| dump_register(DMA_PER_PAGE_SIZE), | |
| dump_register(DMA_PER_MBOX_STATUS), | |
| dump_register(DMA_PER_MBOX_SET), | |
| dump_register(DMA_PER_MBOX_CLEAR), | |
| dump_register(DMA_PER_MBOX_MASK), | |
| dump_register(DMA_PER_INJECT_PKT_SRC), | |
| dump_register(DMA_PER_INJECT_PKT_DEST), | |
| dump_register(DMA_PER_INJECT_PKT_ADDR), | |
| dump_register(DMA_PER_INJECT_PKT), | |
| dump_register(DMA_PER_PAT_PTR_INIT), | |
| dump_register(DMA_PER_PAT_PTR), | |
| dump_register(DMA_PER_SLEEP_MASK), | |
| dump_register(DMA_PER_SLEEP_COUNTER), | |
| dump_register(DMA_FIRMWARE_VERSION), | |
| dump_register(DMA_PTRREC_BASE), | |
| dump_register(DMA_PTRREC_INPUT_OFFSET), | |
| dump_register(DMA_ERRREC_BASE), | |
| dump_register(DMA_ERROR_RECORD(0)), | |
| dump_register(DMA_ERROR_RECORD(1)), | |
| dump_register(DMA_ERROR_RECORD(2)), | |
| dump_register(DMA_ERROR_RECORD(3)), | |
| dump_register(DMA_ERROR_RECORD(4)), | |
| dump_register(DMA_ERROR_RECORD(5)), | |
| dump_register(DMA_ERROR_RECORD(6)), | |
| dump_register(DMA_ERROR_RECORD(7)), | |
| dump_register(DMA_ERROR_RECORD(8)), | |
| dump_register(DMA_ERROR_RECORD(9)), | |
| dump_register(DMA_ERROR_RECORD(10)), | |
| dump_register(DMA_ERROR_RECORD(11)), | |
| dump_register(DMA_ERROR_RECORD(12)), | |
| dump_register(DMA_ERROR_RECORD(13)), | |
| dump_register(DMA_ERROR_RECORD(14)), | |
| dump_register(DMA_ERROR_RECORD(15)), | |
| dump_register(DMA_ERROR_RECORD(16)), | |
| dump_register(DMA_ERROR_RECORD(17)), | |
| dump_register(DMA_ERROR_RECORD(18)), | |
| dump_register(DMA_ERROR_RECORD(19)), | |
| dump_register(DMA_ERROR_RECORD(20)), | |
| dump_register(DMA_ERROR_RECORD(21)), | |
| dump_register(DMA_ERROR_RECORD(22)), | |
| dump_register(DMA_IDLE_REQ), | |
| dump_register(DMA_FIRMWARE_CONFIG), | |
| dump_register(PIDF_BASE(0)), | |
| dump_register(PIDF_BASE(1)), | |
| dump_register(PIDF_BASE(2)), | |
| dump_register(PIDF_BASE(3)), | |
| dump_register(PIDF_BASE(4)), | |
| dump_register(PIDF_BASE(5)), | |
| dump_register(PIDF_BASE(6)), | |
| dump_register(PIDF_BASE(7)), | |
| dump_register(PIDF_BASE(8)), | |
| dump_register(PIDF_BASE(9)), | |
| dump_register(PIDF_BASE(10)), | |
| dump_register(PIDF_BASE(11)), | |
| dump_register(PIDF_BASE(12)), | |
| dump_register(PIDF_BASE(13)), | |
| dump_register(PIDF_BASE(14)), | |
| dump_register(PIDF_BASE(15)), | |
| dump_register(PIDF_BASE(16)), | |
| dump_register(PIDF_BASE(17)), | |
| dump_register(PIDF_BASE(18)), | |
| dump_register(PIDF_BASE(19)), | |
| dump_register(PIDF_BASE(20)), | |
| dump_register(PIDF_BASE(21)), | |
| dump_register(PIDF_BASE(22)), | |
| dump_register(PIDF_LEAK_ENABLE), | |
| dump_register(PIDF_LEAK_STATUS), | |
| dump_register(PIDF_LEAK_COUNT_RESET), | |
| dump_register(PIDF_LEAK_COUNTER), | |
| }; | |
| void c8sectpfe_debugfs_init(struct c8sectpfei *fei) | |
| { | |
| struct dentry *root; | |
| struct dentry *file; | |
| root = debugfs_create_dir("c8sectpfe", NULL); | |
| if (!root) | |
| goto err; | |
| fei->root = root; | |
| fei->regset = devm_kzalloc(fei->dev, sizeof(*fei->regset), GFP_KERNEL); | |
| if (!fei->regset) | |
| goto err; | |
| fei->regset->regs = fei_sys_regs; | |
| fei->regset->nregs = ARRAY_SIZE(fei_sys_regs); | |
| fei->regset->base = fei->io; | |
| file = debugfs_create_regset32("registers", S_IRUGO, root, | |
| fei->regset); | |
| if (!file) { | |
| dev_err(fei->dev, | |
| "%s not able to create 'registers' debugfs\n" | |
| , __func__); | |
| goto err; | |
| } | |
| return; | |
| err: | |
| debugfs_remove_recursive(root); | |
| } | |
| void c8sectpfe_debugfs_exit(struct c8sectpfei *fei) | |
| { | |
| debugfs_remove_recursive(fei->root); | |
| fei->root = NULL; | |
| } |