Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8cb9120c authored by Girish Mahadevan's avatar Girish Mahadevan
Browse files

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: default avatarGirish Mahadevan <girishm@codeaurora.org>
parent 05a0c86d
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
/* Copyright (c) 2008-2015, The Linux Foundation. All rights reserved.
/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -1780,15 +1780,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();

@@ -1799,14 +1799,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();

@@ -1820,18 +1820,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);
		}
	}
+36 −39
Original line number Diff line number Diff line
/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -212,52 +212,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
@@ -346,6 +342,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 */