From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752582AbcBOIcs (ORCPT ); Mon, 15 Feb 2016 03:32:48 -0500 Received: from lucky1.263xmail.com ([211.157.147.130]:57812 "EHLO lucky1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752223AbcBOIcr (ORCPT ); Mon, 15 Feb 2016 03:32:47 -0500 X-263anti-spam: KSV:0; X-MAIL-GRAY: 1 X-MAIL-DELIVERY: 0 X-KSVirus-check: 0 X-ABS-CHECKED: 4 X-ADDR-CHECKED: 0 X-RL-SENDER: shawn.lin@rock-chips.com X-FST-TO: broonie@kernel.org X-SENDER-IP: 58.22.7.114 X-LOGIN-NAME: shawn.lin@rock-chips.com X-UNIQUE-TAG: X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 From: Shawn Lin To: Mark Brown Cc: linux-spi@vger.kernel.org, linux-kernel@vger.kernel.org, Shawn Lin Subject: [PATCH 3/3] spi: rockchip: add debug interface support Date: Mon, 15 Feb 2016 16:28:22 +0800 Message-Id: <1455524902-2780-1-git-send-email-shawn.lin@rock-chips.com> X-Mailer: git-send-email 1.8.0 In-Reply-To: <1455524848-2646-1-git-send-email-shawn.lin@rock-chips.com> References: <1455524848-2646-1-git-send-email-shawn.lin@rock-chips.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add debugfs support for user to debug rockchip spi problems. Signed-off-by: Shawn Lin --- drivers/spi/spi-rockchip.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c index 7cb1b2d..e858393 100644 --- a/drivers/spi/spi-rockchip.c +++ b/drivers/spi/spi-rockchip.c @@ -28,6 +28,10 @@ #include #include +#ifdef CONFIG_DEBUG_FS +#include +#endif + #define DRIVER_NAME "rockchip-spi" /* SPI register offsets */ @@ -199,8 +203,81 @@ struct rockchip_spi { struct sg_table rx_sg; struct rockchip_spi_dma_data dma_rx; struct rockchip_spi_dma_data dma_tx; + + #ifdef CONFIG_DEBUG_FS + struct dentry *debugfs; + #endif +}; + +#ifdef CONFIG_DEBUG_FS +static int rockchip_spi_dbg_show(struct seq_file *s, void *v) +{ + struct rockchip_spi *rs = s->private; + + seq_printf(s, "CTRLR0:\t0x%08x\n", + readl_relaxed(rs->regs + ROCKCHIP_SPI_CTRLR0)); + seq_printf(s, "CTRLR1:\t0x%08x\n", + readl_relaxed(rs->regs + ROCKCHIP_SPI_CTRLR1)); + seq_printf(s, "BAUDR:\t0x%08x\n", + readl_relaxed(rs->regs + ROCKCHIP_SPI_BAUDR)); + seq_printf(s, "TXFTLR:\t0x%08x\n", + readl_relaxed(rs->regs + ROCKCHIP_SPI_TXFTLR)); + seq_printf(s, "RXFTLR:\t0x%08x\n", + readl_relaxed(rs->regs + ROCKCHIP_SPI_RXFTLR)); + seq_printf(s, "SR:\t0x%08x\n", + readl_relaxed(rs->regs + ROCKCHIP_SPI_SR)); + seq_printf(s, "ISR:\t0x%08x\n", + readl_relaxed(rs->regs + ROCKCHIP_SPI_ISR)); + seq_printf(s, "DMACR:\t0x%08x\n", + readl_relaxed(rs->regs + ROCKCHIP_SPI_DMACR)); + seq_printf(s, "rs->state:\t0x%08x\n", rs->state); + seq_printf(s, "rs->speed:\t0x%08x\n", rs->speed); + seq_printf(s, "rs->tmode:\t0x%08x\n", rs->tmode); + seq_printf(s, "rs->mode:\t0x%08x\n", rs->mode); + + return 0; +} + +static int rockchip_spi_dbg_open(struct inode *inode, struct file *file) +{ + return single_open(file, rockchip_spi_dbg_show, inode->i_private); +} + +static const struct file_operations rockchip_spi_dbg_ops = { + .owner = THIS_MODULE, + .open = rockchip_spi_dbg_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, }; +static int rockchip_spi_debugfs_init(struct rockchip_spi *rs) +{ + rs->debugfs = debugfs_create_dir("rockchip_spi", NULL); + if (!rs->debugfs) + return -ENOMEM; + + debugfs_create_file("regs", S_IFREG | S_IRUGO, + rs->debugfs, (void *)rs, &rockchip_spi_dbg_ops); + return 0; +} + +static void rockchip_spi_debugfs_remove(struct rockchip_spi *rs) +{ + debugfs_remove_recursive(rs->debugfs); +} +#else +static inline int rockchip_spi_debugfs_init(struct rockchip_spi *rs) +{ + return 0; +} + +static inline void rockchip_spi_debugfs_remove(struct rockchip_spi *rs) +{ +} +#endif /* CONFIG_DEBUG_FS */ + + static inline void spi_enable_chip(struct rockchip_spi *rs, int enable) { writel_relaxed((enable ? 1 : 0), rs->regs + ROCKCHIP_SPI_SSIENR); @@ -746,6 +823,7 @@ static int rockchip_spi_probe(struct platform_device *pdev) goto err_register_master; } + rockchip_spi_debugfs_init(rs); return 0; err_register_master: @@ -770,6 +848,7 @@ static int rockchip_spi_remove(struct platform_device *pdev) struct rockchip_spi *rs = spi_master_get_devdata(master); pm_runtime_disable(&pdev->dev); + rockchip_spi_debugfs_remove(rs); clk_disable_unprepare(rs->spiclk); clk_disable_unprepare(rs->apb_pclk); -- 2.3.7