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

Commit 71e8bfde authored by Mohan Pallaka's avatar Mohan Pallaka Committed by Sudhakar Manapati
Browse files

input: ft5x06_ts: Add debugfs entry for dump info



Add a debugfs entry to display information about controller to the user.
Also have cleared the checkpatch errors on 3.18

  This patch is propagated from 3.4 kernel
    commit: 768d5e3a47dbfddbc356f387d5825858592788f6
    input: ft5x06_ts: Add debugfs entry for dump info

Change-Id: I075501fefe1984533139ecca65af92f3c0ab8b97
Signed-off-by: default avatarMohan Pallaka <mpallaka@codeaurora.org>
Signed-off-by: default avatarSudhakar Manapati <smanap@codeaurora.org>
parent 836a4745
Loading
Loading
Loading
Loading
+78 −32
Original line number Original line Diff line number Diff line
@@ -169,7 +169,15 @@
#define FT_REG_CAL		0x00
#define FT_REG_CAL		0x00
#define FT_CAL_MASK		0x70
#define FT_CAL_MASK		0x70


#define FT_DEBUG_DIR_NAME	"ft_debug"
#define FT_INFO_MAX_LEN		200

#define FT_STORE_TS_INFO(buf, id, fw_ver) \
			snprintf(buf, FT_INFO_MAX_LEN, \
				"controller\t= focaltech\n" \
				"model\t\t= 0x%x\n" \
				"fw_ver\t\t= 0x%x\n", id, fw_ver)

#define FT_DEBUG_DIR_NAME	"ts_debug"


struct ts_event {
struct ts_event {
	u16 x[CFG_MAX_TOUCH_POINTS];	/* x coordinate */
	u16 x[CFG_MAX_TOUCH_POINTS];	/* x coordinate */
@@ -203,6 +211,7 @@ struct ft5x06_ts_data {
	struct dentry *dir;
	struct dentry *dir;
	u16 addr;
	u16 addr;
	bool suspended;
	bool suspended;
	char *ts_info;
#if defined(CONFIG_FB)
#if defined(CONFIG_FB)
	struct notifier_block fb_notif;
	struct notifier_block fb_notif;
#elif defined(CONFIG_HAS_EARLYSUSPEND)
#elif defined(CONFIG_HAS_EARLYSUSPEND)
@@ -816,6 +825,7 @@ static int ft5x06_fw_upgrade(struct device *dev, bool force)
		rc = -EIO;
		rc = -EIO;
	}
	}


	FT_STORE_TS_INFO(data->ts_info, data->family_id, FT_FW_FILE_VER(fw));
rel_fw:
rel_fw:
	release_firmware(fw);
	release_firmware(fw);
	return rc;
	return rc;
@@ -1024,6 +1034,27 @@ static int ft5x06_debug_suspend_get(void *_data, u64 *val)
DEFINE_SIMPLE_ATTRIBUTE(debug_suspend_fops, ft5x06_debug_suspend_get,
DEFINE_SIMPLE_ATTRIBUTE(debug_suspend_fops, ft5x06_debug_suspend_get,
			ft5x06_debug_suspend_set, "%lld\n");
			ft5x06_debug_suspend_set, "%lld\n");


static int ft5x06_debug_dump_info(struct seq_file *m, void *v)
{
	struct ft5x06_ts_data *data = m->private;

	seq_printf(m, "%s\n", data->ts_info);

	return 0;
}

static int debugfs_dump_info_open(struct inode *inode, struct file *file)
{
	return single_open(file, ft5x06_debug_dump_info, inode->i_private);
}

static const struct file_operations debug_dump_info_fops = {
	.owner		= THIS_MODULE,
	.open		= debugfs_dump_info_open,
	.read		= seq_read,
	.release	= single_release,
};

#ifdef CONFIG_OF
#ifdef CONFIG_OF
static int ft5x06_get_dt_coords(struct device *dev, char *name,
static int ft5x06_get_dt_coords(struct device *dev, char *name,
				struct ft5x06_ts_platform_data *pdata)
				struct ft5x06_ts_platform_data *pdata)
@@ -1139,7 +1170,7 @@ static int ft5x06_ts_probe(struct i2c_client *client,
	struct ft5x06_ts_platform_data *pdata;
	struct ft5x06_ts_platform_data *pdata;
	struct ft5x06_ts_data *data;
	struct ft5x06_ts_data *data;
	struct input_dev *input_dev;
	struct input_dev *input_dev;
	struct dentry *dir, *temp;
	struct dentry *temp;
	u8 reg_value;
	u8 reg_value;
	u8 reg_addr;
	u8 reg_addr;
	int err;
	int err;
@@ -1286,28 +1317,6 @@ static int ft5x06_ts_probe(struct i2c_client *client,


	data->family_id = reg_value;
	data->family_id = reg_value;


	/* get some register information */
	reg_addr = FT_REG_FW_VER;
	err = ft5x06_i2c_read(client, &reg_addr, 1, &reg_value, 1);
	if (err < 0)
		dev_err(&client->dev, "version read failed");

	dev_info(&client->dev, "Firmware version = 0x%x\n", reg_value);

	reg_addr = FT_REG_POINT_RATE;
	ft5x06_i2c_read(client, &reg_addr, 1, &reg_value, 1);
	if (err < 0)
		dev_err(&client->dev, "report rate read failed");

	dev_dbg(&client->dev, "report rate = %dHz\n", reg_value * 10);

	reg_addr = FT_REG_THGROUP;
	err = ft5x06_i2c_read(client, &reg_addr, 1, &reg_value, 1);
	if (err < 0)
		dev_err(&client->dev, "threshold read failed");

	dev_dbg(&client->dev, "touch threshold = %d\n", reg_value * 4);

	err = request_threaded_irq(client->irq, NULL,
	err = request_threaded_irq(client->irq, NULL,
				   ft5x06_ts_interrupt, pdata->irqflags,
				   ft5x06_ts_interrupt, pdata->irqflags,
				   client->dev.driver->name, data);
				   client->dev.driver->name, data);
@@ -1334,14 +1343,14 @@ static int ft5x06_ts_probe(struct i2c_client *client,
		goto free_update_fw_sys;
		goto free_update_fw_sys;
	}
	}


	dir = debugfs_create_dir(FT_DEBUG_DIR_NAME, NULL);
	data->dir = debugfs_create_dir(FT_DEBUG_DIR_NAME, NULL);
	if (dir == NULL || IS_ERR(dir)) {
	if (data->dir == NULL || IS_ERR(data->dir)) {
		pr_err("debugfs_create_dir failed: rc=%ld\n", PTR_ERR(dir));
		pr_err("debugfs_create_dir failed(%ld)\n", PTR_ERR(data->dir));
		err = PTR_ERR(dir);
		err = PTR_ERR(data->dir);
		goto free_force_update_fw_sys;
		goto free_force_update_fw_sys;
	}
	}


	temp = debugfs_create_file("addr", S_IRUSR | S_IWUSR, dir, data,
	temp = debugfs_create_file("addr", S_IRUSR | S_IWUSR, data->dir, data,
				   &debug_addr_fops);
				   &debug_addr_fops);
	if (temp == NULL || IS_ERR(temp)) {
	if (temp == NULL || IS_ERR(temp)) {
		pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp));
		pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp));
@@ -1349,7 +1358,7 @@ static int ft5x06_ts_probe(struct i2c_client *client,
		goto free_debug_dir;
		goto free_debug_dir;
	}
	}


	temp = debugfs_create_file("data", S_IRUSR | S_IWUSR, dir, data,
	temp = debugfs_create_file("data", S_IRUSR | S_IWUSR, data->dir, data,
				   &debug_data_fops);
				   &debug_data_fops);
	if (temp == NULL || IS_ERR(temp)) {
	if (temp == NULL || IS_ERR(temp)) {
		pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp));
		pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp));
@@ -1357,14 +1366,50 @@ static int ft5x06_ts_probe(struct i2c_client *client,
		goto free_debug_dir;
		goto free_debug_dir;
	}
	}


	temp = debugfs_create_file("suspend", S_IRUSR | S_IWUSR, dir, data,
	temp = debugfs_create_file("suspend", S_IRUSR | S_IWUSR, data->dir,
				   &debug_suspend_fops);
					data, &debug_suspend_fops);
	if (temp == NULL || IS_ERR(temp)) {
		pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp));
		err = PTR_ERR(temp);
		goto free_debug_dir;
	}

	temp = debugfs_create_file("dump_info", S_IRUSR | S_IWUSR, data->dir,
					data, &debug_dump_info_fops);
	if (temp == NULL || IS_ERR(temp)) {
	if (temp == NULL || IS_ERR(temp)) {
		pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp));
		pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp));
		err = PTR_ERR(temp);
		err = PTR_ERR(temp);
		goto free_debug_dir;
		goto free_debug_dir;
	}
	}


	data->ts_info = kzalloc(FT_INFO_MAX_LEN, GFP_KERNEL);
	if (!data->ts_info)
		goto free_debug_dir;

	/*get some register information */
	reg_addr = FT_REG_POINT_RATE;
	ft5x06_i2c_read(client, &reg_addr, 1, &reg_value, 1);
	if (err < 0)
		dev_err(&client->dev, "report rate read failed");

	dev_info(&client->dev, "report rate = %dHz\n", reg_value * 10);

	reg_addr = FT_REG_THGROUP;
	err = ft5x06_i2c_read(client, &reg_addr, 1, &reg_value, 1);
	if (err < 0)
		dev_err(&client->dev, "threshold read failed");

	dev_dbg(&client->dev, "touch threshold = %d\n", reg_value * 4);

	reg_addr = FT_REG_FW_VER;
	err = ft5x06_i2c_read(client, &reg_addr, 1, &reg_value, 1);
	if (err < 0)
		dev_err(&client->dev, "version read failed");

	dev_info(&client->dev, "Firmware version = 0x%x\n", reg_value);

	FT_STORE_TS_INFO(data->ts_info, data->family_id, reg_value);

#if defined(CONFIG_FB)
#if defined(CONFIG_FB)
	data->fb_notif.notifier_call = fb_notifier_callback;
	data->fb_notif.notifier_call = fb_notifier_callback;


@@ -1453,6 +1498,7 @@ static int ft5x06_ts_remove(struct i2c_client *client)
		ft5x06_power_init(data, false);
		ft5x06_power_init(data, false);


	input_unregister_device(data->input_dev);
	input_unregister_device(data->input_dev);
	kfree(data->ts_info);
	kfree(data);
	kfree(data);


	return 0;
	return 0;