From 118a4b58d1407934f1e1b9ea9ee7aace0a96553b Mon Sep 17 00:00:00 2001 From: Girish Mahadevan Date: Tue, 28 Jun 2016 10:50:38 -0600 Subject: spi: spi_qsd: Fix the register peek/poke debug feature The spi_qsd driver allows peeking/poking registers via debugfs. Currently a static variable is used as the user data to get to the spi controller data structure. Unfortunately this means that the last device to probe is always obtained. Fix this to use a member of the spi controller data structure instead. Change-Id: I711354941b4168f3f6ffe2d29185597bdad4da89 Signed-off-by: Girish Mahadevan --- drivers/spi/spi_qsd.c | 23 +++++++++------- drivers/spi/spi_qsd.h | 73 ++++++++++++++++++++++++--------------------------- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/drivers/spi/spi_qsd.c b/drivers/spi/spi_qsd.c index a5d59e7f2d90..7aa04a4fa156 100644 --- a/drivers/spi/spi_qsd.c +++ b/drivers/spi/spi_qsd.c @@ -1830,15 +1830,15 @@ err_setup_exit: static int debugfs_iomem_x32_set(void *data, u64 val) { - struct msm_spi_regs *debugfs_spi_regs = (struct msm_spi_regs *)data; - struct msm_spi *dd = debugfs_spi_regs->dd; + struct msm_spi_debugfs_data *reg = (struct msm_spi_debugfs_data *)data; + struct msm_spi *dd = reg->dd; int ret; ret = pm_runtime_get_sync(dd->dev); if (ret < 0) return ret; - writel_relaxed(val, (dd->base + debugfs_spi_regs->offset)); + writel_relaxed(val, (dd->base + reg->offset)); /* Ensure the previous write completed. */ mb(); @@ -1849,14 +1849,14 @@ static int debugfs_iomem_x32_set(void *data, u64 val) static int debugfs_iomem_x32_get(void *data, u64 *val) { - struct msm_spi_regs *debugfs_spi_regs = (struct msm_spi_regs *)data; - struct msm_spi *dd = debugfs_spi_regs->dd; + struct msm_spi_debugfs_data *reg = (struct msm_spi_debugfs_data *)data; + struct msm_spi *dd = reg->dd; int ret; ret = pm_runtime_get_sync(dd->dev); if (ret < 0) return ret; - *val = readl_relaxed(dd->base + debugfs_spi_regs->offset); + *val = readl_relaxed(dd->base + reg->offset); /* Ensure the previous read completed. */ mb(); @@ -1870,18 +1870,21 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_iomem_x32, debugfs_iomem_x32_get, static void spi_debugfs_init(struct msm_spi *dd) { - dd->dent_spi = debugfs_create_dir(dev_name(dd->dev), NULL); + char dir_name[20]; + + scnprintf(dir_name, sizeof(dir_name), "%s_dbg", dev_name(dd->dev)); + dd->dent_spi = debugfs_create_dir(dir_name, NULL); if (dd->dent_spi) { int i; for (i = 0; i < ARRAY_SIZE(debugfs_spi_regs); i++) { - debugfs_spi_regs[i].dd = dd; + dd->reg_data[i].offset = debugfs_spi_regs[i].offset; + dd->reg_data[i].dd = dd; dd->debugfs_spi_regs[i] = debugfs_create_file( debugfs_spi_regs[i].name, debugfs_spi_regs[i].mode, - dd->dent_spi, - debugfs_spi_regs+i, + dd->dent_spi, &dd->reg_data[i], &fops_iomem_x32); } } diff --git a/drivers/spi/spi_qsd.h b/drivers/spi/spi_qsd.h index fb906939c03a..444c7773f807 100644 --- a/drivers/spi/spi_qsd.h +++ b/drivers/spi/spi_qsd.h @@ -214,52 +214,48 @@ struct spi_cs_gpio { }; #ifdef CONFIG_DEBUG_FS +struct msm_spi_debugfs_data { + int offset; + struct msm_spi *dd; +}; /* Used to create debugfs entries */ static struct msm_spi_regs{ const char *name; mode_t mode; int offset; - struct msm_spi *dd; } debugfs_spi_regs[] = { - {"config", S_IRUGO | S_IWUSR, SPI_CONFIG, NULL}, - {"io_control", S_IRUGO | S_IWUSR, SPI_IO_CONTROL, NULL}, - {"io_modes", S_IRUGO | S_IWUSR, SPI_IO_MODES, NULL}, - {"sw_reset", S_IWUSR, SPI_SW_RESET, NULL}, - {"time_out_current", S_IRUGO, SPI_TIME_OUT_CURRENT, - NULL}, - {"mx_output_count", S_IRUGO | S_IWUSR, SPI_MX_OUTPUT_COUNT, - NULL}, - {"mx_output_cnt_current", S_IRUGO, SPI_MX_OUTPUT_CNT_CURRENT, - NULL}, - {"mx_input_count", S_IRUGO | S_IWUSR, SPI_MX_INPUT_COUNT, NULL}, - {"mx_input_cnt_current", S_IRUGO, SPI_MX_INPUT_CNT_CURRENT, - NULL}, - {"mx_read_count", S_IRUGO | S_IWUSR, SPI_MX_READ_COUNT, NULL}, - {"mx_read_cnt_current", S_IRUGO, SPI_MX_READ_CNT_CURRENT, - NULL}, - {"operational", S_IRUGO | S_IWUSR, SPI_OPERATIONAL, NULL}, - {"error_flags", S_IRUGO | S_IWUSR, SPI_ERROR_FLAGS, NULL}, - {"error_flags_en", S_IRUGO | S_IWUSR, SPI_ERROR_FLAGS_EN, NULL}, - {"deassert_wait", S_IRUGO | S_IWUSR, SPI_DEASSERT_WAIT, NULL}, - {"output_debug", S_IRUGO, SPI_OUTPUT_DEBUG, NULL}, - {"input_debug", S_IRUGO, SPI_INPUT_DEBUG, NULL}, - {"test_ctrl", S_IRUGO | S_IWUSR, SPI_TEST_CTRL, NULL}, - {"output_fifo", S_IWUSR, SPI_OUTPUT_FIFO, NULL}, - {"input_fifo" , S_IRUSR, SPI_INPUT_FIFO, NULL}, - {"spi_state", S_IRUGO | S_IWUSR, SPI_STATE, NULL}, + {"config", S_IRUGO | S_IWUSR, SPI_CONFIG }, + {"io_control", S_IRUGO | S_IWUSR, SPI_IO_CONTROL }, + {"io_modes", S_IRUGO | S_IWUSR, SPI_IO_MODES }, + {"sw_reset", S_IWUSR, SPI_SW_RESET }, + {"time_out_current", S_IRUGO, SPI_TIME_OUT_CURRENT }, + {"mx_output_count", S_IRUGO | S_IWUSR, SPI_MX_OUTPUT_COUNT }, + {"mx_output_cnt_current", S_IRUGO, + SPI_MX_OUTPUT_CNT_CURRENT }, + {"mx_input_count", S_IRUGO | S_IWUSR, SPI_MX_INPUT_COUNT }, + {"mx_input_cnt_current", S_IRUGO, SPI_MX_INPUT_CNT_CURRENT }, + {"mx_read_count", S_IRUGO | S_IWUSR, SPI_MX_READ_COUNT, }, + {"mx_read_cnt_current", S_IRUGO, SPI_MX_READ_CNT_CURRENT }, + {"operational", S_IRUGO | S_IWUSR, SPI_OPERATIONAL }, + {"error_flags", S_IRUGO | S_IWUSR, SPI_ERROR_FLAGS }, + {"error_flags_en", S_IRUGO | S_IWUSR, SPI_ERROR_FLAGS_EN }, + {"deassert_wait", S_IRUGO | S_IWUSR, SPI_DEASSERT_WAIT }, + {"output_debug", S_IRUGO, SPI_OUTPUT_DEBUG }, + {"input_debug", S_IRUGO, SPI_INPUT_DEBUG }, + {"test_ctrl", S_IRUGO | S_IWUSR, SPI_TEST_CTRL }, + {"output_fifo", S_IWUSR, SPI_OUTPUT_FIFO }, + {"input_fifo", S_IRUSR, SPI_INPUT_FIFO }, + {"spi_state", S_IRUGO | S_IWUSR, SPI_STATE }, #if defined(CONFIG_SPI_QSD) || defined(CONFIG_SPI_QSD_MODULE) - {"fifo_word_cnt", S_IRUGO, SPI_FIFO_WORD_CNT, NULL}, + {"fifo_word_cnt", S_IRUGO, SPI_FIFO_WORD_CNT }, #else - {"qup_config", S_IRUGO | S_IWUSR, QUP_CONFIG, NULL}, - {"qup_error_flags", S_IRUGO | S_IWUSR, QUP_ERROR_FLAGS, NULL}, - {"qup_error_flags_en", S_IRUGO | S_IWUSR, QUP_ERROR_FLAGS_EN, NULL}, - {"mx_write_cnt", S_IRUGO | S_IWUSR, QUP_MX_WRITE_COUNT, NULL}, - {"mx_write_cnt_current", S_IRUGO, QUP_MX_WRITE_CNT_CURRENT, - NULL}, - {"output_fifo_word_cnt", S_IRUGO, SPI_OUTPUT_FIFO_WORD_CNT, - NULL}, - {"input_fifo_word_cnt", S_IRUGO, SPI_INPUT_FIFO_WORD_CNT, - NULL}, + {"qup_config", S_IRUGO | S_IWUSR, QUP_CONFIG }, + {"qup_error_flags", S_IRUGO | S_IWUSR, QUP_ERROR_FLAGS }, + {"qup_error_flags_en", S_IRUGO | S_IWUSR, QUP_ERROR_FLAGS_EN }, + {"mx_write_cnt", S_IRUGO | S_IWUSR, QUP_MX_WRITE_COUNT }, + {"mx_write_cnt_current", S_IRUGO, QUP_MX_WRITE_CNT_CURRENT }, + {"output_fifo_word_cnt", S_IRUGO, SPI_OUTPUT_FIFO_WORD_CNT }, + {"input_fifo_word_cnt", S_IRUGO, SPI_INPUT_FIFO_WORD_CNT }, #endif }; #endif @@ -349,6 +345,7 @@ struct msm_spi { #ifdef CONFIG_DEBUG_FS struct dentry *dent_spi; struct dentry *debugfs_spi_regs[ARRAY_SIZE(debugfs_spi_regs)]; + struct msm_spi_debugfs_data reg_data[ARRAY_SIZE(debugfs_spi_regs)]; #endif struct msm_spi_platform_data *pdata; /* Platform data */ /* When set indicates multiple transfers in a single message */ -- cgit v1.2.3