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

Commit 600b4ecb authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "input: synaptics_dsx: Propagating security fixes from msm-4.9"

parents 3b70ca42 fcded3cb
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -59,6 +59,16 @@ config TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE
	  To compile this driver as a module, choose M here: the
	  module will be called synaptics_dsx_fw_update.

config TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS
	bool "Synaptics DSX firmware update sysfs attributes"
	depends on TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE
	help
	  Say Y here to enable support for sysfs attributes for
	  performing firmware update in a development environment.
	  This does not affect the core or other subsystem attributes.

	  If unsure, say N.

config TOUCHSCREEN_SYNAPTICS_DSX_TEST_REPORTING
	tristate "Synaptics DSX test reporting module"
	depends on TOUCHSCREEN_SYNAPTICS_DSX_CORE
+15 −6
Original line number Diff line number Diff line
@@ -4721,6 +4721,8 @@ static int synaptics_rmi4_suspend(struct device *dev)
	struct synaptics_rmi4_exp_fhandler *exp_fhandler;
	struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
	unsigned char device_ctrl;
	const struct synaptics_dsx_board_data *bdata =
			rmi4_data->hw_if->board_data;

	if (rmi4_data->stay_awake)
		return 0;
@@ -4763,9 +4765,10 @@ static int synaptics_rmi4_suspend(struct device *dev)
		synaptics_rmi4_free_fingers(rmi4_data);
	}

	if (rmi4_data->ts_pinctrl)
		pinctrl_select_state(rmi4_data->ts_pinctrl,
					rmi4_data->pinctrl_state_suspend);
	if (bdata->reset_gpio >= 0) {
		gpio_set_value(bdata->reset_gpio, bdata->reset_on_state);
		msleep(bdata->reset_active_ms);
	}

	synaptics_rmi4_enable_reg(rmi4_data, false);

@@ -4791,6 +4794,8 @@ static int synaptics_rmi4_resume(struct device *dev)
	struct synaptics_rmi4_exp_fhandler *exp_fhandler;
	struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);

	const struct synaptics_dsx_board_data *bdata =
			rmi4_data->hw_if->board_data;
	if (rmi4_data->stay_awake)
		return 0;

@@ -4802,9 +4807,13 @@ static int synaptics_rmi4_resume(struct device *dev)

	synaptics_rmi4_enable_reg(rmi4_data, true);

	if (rmi4_data->ts_pinctrl)
		pinctrl_select_state(rmi4_data->ts_pinctrl,
			rmi4_data->pinctrl_state_active);
	if (bdata->reset_gpio >= 0) {
		gpio_set_value(bdata->reset_gpio, bdata->reset_on_state);
		msleep(bdata->reset_active_ms);
		gpio_set_value(bdata->reset_gpio, !bdata->reset_on_state);
		msleep(bdata->reset_delay_ms);
	}


	rmi4_data->current_page = MASK_8BIT;

+25 −0
Original line number Diff line number Diff line
@@ -138,6 +138,7 @@ static int fwu_do_reflash(void);

static int fwu_recovery_check_status(void);

#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS
static ssize_t fwu_sysfs_show_image(struct file *data_file,
		struct kobject *kobj, struct bin_attribute *attributes,
		char *buf, loff_t pos, size_t count);
@@ -202,6 +203,8 @@ static ssize_t fwu_sysfs_read_lockdown_code_show(struct device *dev,
		struct device_attribute *attr, char *buf);
#endif

#endif

enum f34_version {
	F34_V0 = 0,
	F34_V1,
@@ -758,6 +761,7 @@ struct synaptics_rmi4_fwu_handle {
	struct work_struct fwu_work;
};

#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS
static struct bin_attribute dev_attr_data = {
	.attr = {
		.name = "data",
@@ -767,8 +771,10 @@ static struct bin_attribute dev_attr_data = {
	.read = fwu_sysfs_show_image,
	.write = fwu_sysfs_store_image,
};
#endif

static struct device_attribute attrs[] = {
#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS
	__ATTR(dorecovery, 0220,
			synaptics_rmi4_show_error,
			fwu_sysfs_do_recovery_store),
@@ -822,13 +828,16 @@ static struct device_attribute attrs[] = {
			fwu_sysfs_read_lockdown_code_show,
			fwu_sysfs_write_lockdown_code_store),
#endif
#endif
};

static struct synaptics_rmi4_fwu_handle *fwu;

DECLARE_COMPLETION(fwu_remove_complete);

#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS
DEFINE_MUTEX(fwu_sysfs_mutex);
#endif

static void calculate_checksum(unsigned short *data, unsigned long len,
		unsigned long *result)
@@ -3062,6 +3071,7 @@ static int fwu_check_dp_configuration_size(void)
	return 0;
}

#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS
static int fwu_check_pm_configuration_size(void)
{
	unsigned short block_count;
@@ -3078,6 +3088,7 @@ static int fwu_check_pm_configuration_size(void)

	return 0;
}
#endif

static int fwu_check_bl_configuration_size(void)
{
@@ -3445,6 +3456,7 @@ static int fwu_write_dp_configuration(void)
	return fwu_write_configuration();
}

#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS
static int fwu_write_pm_configuration(void)
{
	fwu->config_area = PM_CONFIG_AREA;
@@ -3470,6 +3482,7 @@ static int fwu_write_tddi_lockdown_data(void)
	return 0;
}
#endif
#endif

static int fwu_write_flash_configuration(void)
{
@@ -3758,6 +3771,7 @@ static int fwu_do_reflash(void)
	return retval;
}

#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS
static int fwu_do_read_config(void)
{
	int retval;
@@ -3985,6 +3999,7 @@ int set_tddi_lockdown_data(unsigned char *lockdown_data, unsigned short leng)
	return retval;
}
#endif
#endif

static int fwu_do_lockdown_v7(void)
{
@@ -4135,6 +4150,7 @@ static int fwu_do_restore_f51_cal_data(void)
}
#endif

#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS
static int fwu_start_write_guest_code(void)
{
	int retval;
@@ -4340,6 +4356,7 @@ static int fwu_start_write_config(void)

	return retval;
}
#endif

static int fwu_start_reflash(void)
{
@@ -4971,6 +4988,7 @@ static void fwu_startup_fw_update_work(struct work_struct *work)
}
#endif

#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS
static ssize_t fwu_sysfs_show_image(struct file *data_file,
		struct kobject *kobj, struct bin_attribute *attributes,
		char *buf, loff_t pos, size_t count)
@@ -5567,6 +5585,7 @@ static ssize_t fwu_sysfs_write_lockdown_code_store(struct device *dev,
	return count;
}
#endif
#endif
static void synaptics_rmi4_fwu_attn(struct synaptics_rmi4_data *rmi4_data,
		unsigned char intr_mask)
{
@@ -5669,6 +5688,7 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data)
	if (ENABLE_SYS_REFLASH == false)
		return 0;

#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS
	retval = sysfs_create_bin_file(&rmi4_data->input_dev->dev.kobj,
			&dev_attr_data);
	if (retval < 0) {
@@ -5677,6 +5697,7 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data)
				__func__);
		goto exit_free_mem;
	}
#endif

	for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) {
		retval = sysfs_create_file(&rmi4_data->input_dev->dev.kobj,
@@ -5698,7 +5719,9 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data)
				&attrs[attr_count].attr);
	}

#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS
	sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data);
#endif

exit_free_mem:
	kfree(fwu->image_name);
@@ -5740,7 +5763,9 @@ static void synaptics_rmi4_fwu_remove(struct synaptics_rmi4_data *rmi4_data)
				&attrs[attr_count].attr);
	}

#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS
	sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data);
#endif

exit:
	complete(&fwu_remove_complete);
+3 −3
Original line number Diff line number Diff line
@@ -403,11 +403,11 @@ static int synaptics_rmi4_i2c_write(struct synaptics_rmi4_data *rmi4_data,
	struct i2c_client *i2c = to_i2c_client(rmi4_data->pdev->dev.parent);
	struct i2c_msg msg[2];

	mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex);

	retval = synaptics_rmi4_i2c_alloc_buf(rmi4_data, length + 1);
	if (retval < 0)
		return retval;

	mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex);
		goto exit;

	retval = synaptics_rmi4_i2c_set_page(rmi4_data, addr);
	if (retval != PAGE_SELECT_LEN) {
+25 −10
Original line number Diff line number Diff line
@@ -568,16 +568,22 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf,
		return -EBADF;
	}

	if (count == 0)
		return 0;
	mutex_lock(&(dev_data->file_mutex));

	if (*f_pos > REG_ADDR_LIMIT) {
		retval = -EFAULT;
		goto clean_up;
	}

	if (count > (REG_ADDR_LIMIT - *f_pos))
		count = REG_ADDR_LIMIT - *f_pos;

	if (count == 0) {
		retval = 0;
		goto clean_up;
	}
	address = (unsigned short)(*f_pos);

	mutex_lock(&(dev_data->file_mutex));

	rmidev_allocate_buffer(count);

	retval = synaptics_rmi4_reg_read(rmidev->rmi4_data,
@@ -639,18 +645,26 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf,
		return -EBADF;
	}

	if (count == 0)
		return 0;
	mutex_lock(&(dev_data->file_mutex));

	if (*f_pos > REG_ADDR_LIMIT) {
		retval = -EFAULT;
		goto unlock;
	}

	if (count > (REG_ADDR_LIMIT - *f_pos))
		count = REG_ADDR_LIMIT - *f_pos;

	mutex_lock(&(dev_data->file_mutex));

	if (count == 0) {
		retval = 0;
		goto unlock;
	}
	rmidev_allocate_buffer(count);

	if (copy_from_user(rmidev->tmpbuf, buf, count))
		return -EFAULT;
	if (copy_from_user(rmidev->tmpbuf, buf, count)) {
		retval = -EFAULT;
		goto unlock;
	}

	retval = synaptics_rmi4_reg_write(rmidev->rmi4_data,
			*f_pos,
@@ -659,6 +673,7 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf,
	if (retval >= 0)
		*f_pos += retval;

unlock:
	mutex_unlock(&(dev_data->file_mutex));

	return retval;