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

Commit 9ba9df83 authored by Linux Build Service Account's avatar Linux Build Service Account
Browse files

Promotion of kernel.lnx.4.4-161023.

CRs      Change ID                                   Subject
--------------------------------------------------------------------------------------------------------------
1065513   I6543d523e39771615d0e1b684780141e108a2aa4   input: touchscreen: Add debugfs entries for GTP controll
1080354   I12c04ceb7af51cc5d2f0c79b524ef783dc5f749e   soc: qcom: glink_spi_xprt: Add support for WDSP SSR
1077763   I7c7c3f98f9685711268e221fc83f2c831b02a294   icnss: Unregister the driver operations when probe fails
1065513   If71d4020223547e0db425c9fd37819c6166efcab   input: touchscreen: Add firmware upgrade via sysfs entry
1080409   I8250304e918f55d233e9b3f01c57f297f73e74ba   ARM: dts: msm: Update VDD_APC CPR RO scaling factors for
1065513   I147a3e465170dda7af415ade29c04257d9b11a6b   input: touchscreen: Add force fw_update support via sysf
1066388   I42642b475a1032c3a7395336381f3bd6c1396dde   smb1351-charger: Fix possible Null pointer dereference
1080385   I39c257876776a9e9c872add1366569394c49ef01   qpnp-fg-gen3: Backup the learned capacity during capacit
1074208   I330a50f6d171497e5b6d3e44e8ce2b09f2d644e3   msm: kgsl: Remove use of uninitialized variable

Change-Id: I710d7909eb13d2ce6d729a5c7cad2f3bf1b72c5e
CRs-Fixed: 1080354, 1077763, 1080409, 1080385, 1066388, 1065513, 1074208
parents f4b294b6 46aa49c1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ Optional properties:
				It is a four tuple consisting of min x,
				min y, max x and max y values.
 - goodix,i2c-pull-up	: To specify pull up is required.
 - goodix,no-force-update	: To specify force update is allowed.
 - goodix,force-update	: To specify force update is allowed.
 - goodix,enable-power-off	: Power off touchscreen during suspend.
 - goodix,button-map	: Button map of key codes. The number of key codes
				depend on panel.
+24 −24
Original line number Diff line number Diff line
@@ -326,18 +326,18 @@
		1900800000>;

	qcom,cpr-ro-scaling-factor =
		<4001 4019 3747 3758 3564 3480 2336
		 2247 3442 3147 2136 4156 4028 3030
		 3727 3198>,
		<4001 4019 3747 3758 3564 3480 2336
		 2247 3442 3147 2136 4156 4028 3030
		 3727 3198>,
		<3704 3601 3465 3567 3356 3473 2686
		 2773 3049 2932 2235 3816 3800 3097
		 2966 2808>,
		<2974 3092 3288 3329 2905 3096 3119
		 3225 2865 3140 2892 3592 3408 3576
		 1559 1392>;
		<2595 2794 2577 2762 2471 2674 2199
		 2553 3189 3255 3192 2962 3054 2982
		 2042 2945>,
		<2595 2794 2577 2762 2471 2674 2199
		 2553 3189 3255 3192 2962 3054 2982
		 2042 2945>,
		<2391 2550 2483 2638 2382 2564 2259
		 2555 2766 3041 2988 2935 2873 2688
		 2013 2784>,
		<2066 2153 2300 2434 2220 2386 2288
		 2465 2028 2511 2487 2734 2554 2117
		 1892 2377>;

	qcom,cpr-open-loop-voltage-fuse-adjustment =
		/* Speed bin 0 */
@@ -487,18 +487,18 @@
		2112000000 2208000000>;

	qcom,cpr-ro-scaling-factor =
		<4001 4019 3747 3758 3564 3480 2336
		 2247 3442 3147 2136 4156 4028 3030
		 3727 3190>,
		<4001 4019 3747 3758 3564 3480 2336
		 2247 3442 3147 2136 4156 4028 3030
		 3727 3198>,
		<3704 3601 3465 3567 3356 3473 2686
		 2773 3049 2932 2235 3816 3800 3097
		 2966 2808>,
		<2974 3092 3288 3329 2905 3096 3119
		 3225 2865 3140 2892 3592 3408 3576
		 1559 1392>;
		<2857 3057 2828 2952 2699 2798 2446
		 2631 2629 2578 2244 3344 3289 3137
		 3164 2655>,
		<2857 3057 2828 2952 2699 2798 2446
		 2631 2629 2578 2244 3344 3289 3137
		 3164 2655>,
		<2603 2755 2676 2777 2573 2685 2465
		 2610 2312 2423 2243 3104 3022 3036
		 2740 2303>,
		<1901 2016 2096 2228 2034 2161 2077
		 2188 1565 1870 1925 2235 2205 2413
		 1762 1478>;

	qcom,cpr-open-loop-voltage-fuse-adjustment =
		/* Speed bin 0 */
+5 −7
Original line number Diff line number Diff line
@@ -78,15 +78,13 @@ static int devfreq_vbif_ev_handler(struct devfreq *devfreq,
	case DEVFREQ_GOV_START:
		mutex_lock(&df_lock);
		df = devfreq;
		if (df->profile->get_dev_status)
			ret = df->profile->get_dev_status(df->dev.parent,
					&stat);
		if (df->profile->get_dev_status &&
			!df->profile->get_dev_status(df->dev.parent, &stat) &&
			stat.private_data)
			dev_ab = stat.private_data;
		else
			ret = 0;
		if (ret || !stat.private_data)
			pr_warn("Device doesn't take AB votes!\n");
		else
			dev_ab = stat.private_data;

		mutex_unlock(&df_lock);

		ret = devfreq_vbif_update_bw(0, 0);
+220 −16
Original line number Diff line number Diff line
@@ -115,6 +115,8 @@ struct i2c_client *i2c_connect_client;

#define GTP_DEBUGFS_DIR			"ts_debug"
#define GTP_DEBUGFS_FILE_SUSPEND	"suspend"
#define GTP_DEBUGFS_FILE_DATA		"data"
#define GTP_DEBUGFS_FILE_ADDR		"addr"

/*******************************************************
Function:
@@ -1521,12 +1523,108 @@ static ssize_t gtp_fw_name_store(struct device *dev,
	return size;
}

static ssize_t gtp_fw_upgrade_show(struct device *dev,
				struct device_attribute *attr, char *buf)
{
	struct goodix_ts_data *ts = dev_get_drvdata(dev);

	return snprintf(buf, 2, "%d\n", ts->fw_loading);
}

static ssize_t gtp_fw_upgrade_store(struct device *dev,
				struct device_attribute *attr,
				const char *buf, size_t size)
{
	struct goodix_ts_data *ts = dev_get_drvdata(dev);
	unsigned int val;
	int ret;

	if (size > 2)
		return -EINVAL;

	ret = kstrtouint(buf, 10, &val);
	if (ret)
		return ret;

	if (ts->gtp_is_suspend) {
		dev_err(&ts->client->dev,
			"Can't start fw upgrade. Device is in suspend state");
		return -EBUSY;
	}

	mutex_lock(&ts->input_dev->mutex);
	if (!ts->fw_loading && val) {
		disable_irq(ts->client->irq);
		ts->fw_loading = true;
		if (config_enabled(CONFIG_GT9XX_TOUCHPANEL_UPDATE)) {
			ret = gup_update_proc(NULL);
			if (ret == FAIL)
				dev_err(&ts->client->dev,
						"Fail to update GTP firmware\n");
		}
		ts->fw_loading = false;
		enable_irq(ts->client->irq);
	}
	mutex_unlock(&ts->input_dev->mutex);

	return size;
}

static ssize_t gtp_force_fw_upgrade_store(struct device *dev,
				struct device_attribute *attr,
				const char *buf, size_t size)
{
	struct goodix_ts_data *ts = dev_get_drvdata(dev);
	unsigned int val;
	int ret;

	if (size > 2)
		return -EINVAL;

	ret = kstrtouint(buf, 10, &val);
	if (ret)
		return ret;

	if (ts->gtp_is_suspend) {
		dev_err(&ts->client->dev,
			"Can't start fw upgrade. Device is in suspend state.");
		return -EBUSY;
	}

	mutex_lock(&ts->input_dev->mutex);
	if (!ts->fw_loading && val) {
		disable_irq(ts->client->irq);
		ts->fw_loading = true;
		ts->force_update = true;
		if (config_enabled(CONFIG_GT9XX_TOUCHPANEL_UPDATE)) {
			ret = gup_update_proc(NULL);
			if (ret == FAIL)
				dev_err(&ts->client->dev,
				"Fail to force update GTP firmware.\n");
		}
		ts->force_update = false;
		ts->fw_loading = false;
		enable_irq(ts->client->irq);
	}
	mutex_unlock(&ts->input_dev->mutex);

	return size;
}

static DEVICE_ATTR(fw_name, (S_IRUGO | S_IWUSR | S_IWGRP),
			gtp_fw_name_show,
			gtp_fw_name_store);
static DEVICE_ATTR(fw_upgrade, (S_IRUGO | S_IWUSR | S_IWGRP),
			gtp_fw_upgrade_show,
			gtp_fw_upgrade_store);
static DEVICE_ATTR(force_fw_upgrade, (S_IRUGO | S_IWUSR | S_IWGRP),
			gtp_fw_upgrade_show,
			gtp_force_fw_upgrade_store);

static struct attribute *gtp_attrs[] = {
	&dev_attr_fw_name.attr,
	&dev_attr_fw_upgrade.attr,
	&dev_attr_force_fw_upgrade.attr,
	NULL
};

@@ -1534,6 +1632,84 @@ static const struct attribute_group gtp_attr_grp = {
	.attrs = gtp_attrs,
};

static int gtp_debug_addr_is_valid(u16 addr)
{
	if (addr < GTP_VALID_ADDR_START || addr > GTP_VALID_ADDR_END) {
		pr_err("GTP reg address is invalid: 0x%x\n", addr);
		return false;
	}

	return true;
}

static int gtp_debug_data_set(void *_data, u64 val)
{
	struct goodix_ts_data *ts = _data;

	mutex_lock(&ts->input_dev->mutex);
	if (gtp_debug_addr_is_valid(ts->addr))
		dev_err(&ts->client->dev,
			"Writing to GTP registers not supported\n");
	mutex_unlock(&ts->input_dev->mutex);

	return 0;
}

static int gtp_debug_data_get(void *_data, u64 *val)
{
	struct goodix_ts_data *ts = _data;
	int ret;
	u8 buf[3] = {0};

	mutex_lock(&ts->input_dev->mutex);
	buf[0] = ts->addr >> 8;
	buf[1] = ts->addr & 0x00ff;

	if (gtp_debug_addr_is_valid(ts->addr)) {
		ret = gtp_i2c_read(ts->client, buf, 3);
		if (ret < 0)
			dev_err(&ts->client->dev,
				"GTP read register 0x%x failed (%d)\n",
				ts->addr, ret);
		else
			*val = buf[2];
	}
	mutex_unlock(&ts->input_dev->mutex);

	return 0;
}

DEFINE_SIMPLE_ATTRIBUTE(debug_data_fops, gtp_debug_data_get,
				gtp_debug_data_set, "%llx\n");

static int gtp_debug_addr_set(void *_data, u64 val)
{
	struct goodix_ts_data *ts = _data;

	if (gtp_debug_addr_is_valid(val)) {
		mutex_lock(&ts->input_dev->mutex);
			ts->addr = val;
		mutex_unlock(&ts->input_dev->mutex);
	}

	return 0;
}

static int gtp_debug_addr_get(void *_data, u64 *val)
{
	struct goodix_ts_data *ts = _data;

	mutex_lock(&ts->input_dev->mutex);
	if (gtp_debug_addr_is_valid(ts->addr))
		*val = ts->addr;
	mutex_unlock(&ts->input_dev->mutex);

	return 0;
}

DEFINE_SIMPLE_ATTRIBUTE(debug_addr_fops, gtp_debug_addr_get,
				gtp_debug_addr_set, "%llx\n");

static int gtp_debug_suspend_set(void *_data, u64 val)
{
	struct goodix_ts_data *ts = _data;
@@ -1567,7 +1743,7 @@ static int gtp_debugfs_init(struct goodix_ts_data *data)
	data->debug_base = debugfs_create_dir(GTP_DEBUGFS_DIR, NULL);

	if (IS_ERR_OR_NULL(data->debug_base)) {
		pr_err("Failed to create debugfs dir\n");
		dev_err(&data->client->dev, "Failed to create debugfs dir\n");
			return -EINVAL;
	}

@@ -1576,7 +1752,27 @@ static int gtp_debugfs_init(struct goodix_ts_data *data)
					data->debug_base,
					data,
					&debug_suspend_fops)))) {
		pr_err("Failed to create suspend file\n");
		dev_err(&data->client->dev, "Failed to create suspend file\n");
		debugfs_remove_recursive(data->debug_base);
		return -EINVAL;
	}

	if ((IS_ERR_OR_NULL(debugfs_create_file(GTP_DEBUGFS_FILE_DATA,
					S_IWUSR | S_IWGRP | S_IRUSR | S_IRGRP,
					data->debug_base,
					data,
					&debug_data_fops)))) {
		dev_err(&data->client->dev, "Failed to create data file\n");
		debugfs_remove_recursive(data->debug_base);
		return -EINVAL;
	}

	if ((IS_ERR_OR_NULL(debugfs_create_file(GTP_DEBUGFS_FILE_ADDR,
					S_IWUSR | S_IWGRP | S_IRUSR | S_IRGRP,
					data->debug_base,
					data,
					&debug_addr_fops)))) {
		dev_err(&data->client->dev, "Failed to create addr file\n");
		debugfs_remove_recursive(data->debug_base);
		return -EINVAL;
	}
@@ -1645,8 +1841,8 @@ static int goodix_parse_dt(struct device *dev,
	pdata->i2c_pull_up = of_property_read_bool(np,
						"goodix,i2c-pull-up");

	pdata->no_force_update = of_property_read_bool(np,
						"goodix,no-force-update");
	pdata->force_update = of_property_read_bool(np,
						"goodix,force-update");

	pdata->enable_power_off = of_property_read_bool(np,
						"goodix,enable-power-off");
@@ -1761,9 +1957,7 @@ static int goodix_ts_probe(struct i2c_client *client,
		return -EINVAL;
	}

#if GTP_ESD_PROTECT
	i2c_connect_client = client;
#endif

	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
		dev_err(&client->dev, "GTP I2C not supported\n");
@@ -1811,22 +2005,24 @@ static int goodix_ts_probe(struct i2c_client *client,
		goto exit_power_off;
	}

	if (pdata->force_update)
		ts->force_update = true;

	if (pdata->fw_name)
		strlcpy(ts->fw_name, pdata->fw_name,
						strlen(pdata->fw_name) + 1);

#ifdef CONFIG_GT9XX_TOUCHPANEL_UPDATE
	if (config_enabled(CONFIG_GT9XX_TOUCHPANEL_UPDATE)) {
		ret = gup_init_update_proc(ts);
		if (ret < 0) {
			dev_err(&client->dev,
			"GTP Create firmware update thread error.\n");
					"GTP Create firmware update thread error\n");
			goto exit_power_off;
		}
#endif

	}
	ret = gtp_init_panel(ts);
	if (ret < 0) {
		dev_err(&client->dev, "GTP init panel failed.\n");
		dev_err(&client->dev, "GTP init panel failed\n");
		ts->abs_x_max = GTP_MAX_WIDTH;
		ts->abs_y_max = GTP_MAX_HEIGHT;
		ts->int_trigger_type = GTP_INT_TRIGGER;
@@ -1834,7 +2030,7 @@ static int goodix_ts_probe(struct i2c_client *client,

	ret = gtp_request_input_dev(ts);
	if (ret) {
		dev_err(&client->dev, "GTP request input dev failed.\n");
		dev_err(&client->dev, "GTP request input dev failed\n");
		goto exit_free_inputdev;
	}
	input_set_drvdata(ts->input_dev, ts);
@@ -2017,6 +2213,14 @@ static int goodix_ts_suspend(struct device *dev)
	}

	mutex_lock(&ts->lock);

	if (ts->fw_loading) {
		dev_info(&ts->client->dev,
			"Fw upgrade in progress, can't go to suspend.");
		mutex_unlock(&ts->lock);
		return 0;
	}

#if GTP_ESD_PROTECT
	gtp_esd_switch(ts->client, SWITCH_OFF);
#endif
+7 −4
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ struct goodix_ts_platform_data {
	u32 panel_miny;
	u32 panel_maxx;
	u32 panel_maxy;
	bool no_force_update;
	bool force_update;
	bool i2c_pull_up;
	bool enable_power_off;
	size_t config_data_len[GOODIX_MAX_CFG_GROUP];
@@ -74,6 +74,7 @@ struct goodix_ts_data {
	s32 use_irq;
	u16 abs_x_max;
	u16 abs_y_max;
	u16 addr;
	u8  max_touch_num;
	u8  int_trigger_type;
	u8  green_wake_mode;
@@ -88,6 +89,8 @@ struct goodix_ts_data {
	u8  fw_error;
	bool power_on;
	struct mutex lock;
	bool fw_loading;
	bool force_update;
	struct regulator *avdd;
	struct regulator *vdd;
	struct regulator *vcc_i2c;
@@ -172,6 +175,8 @@ extern u16 total_len;
/* HIGH: 0x28/0x29, LOW: 0xBA/0xBB */
#define GTP_I2C_ADDRESS_HIGH	0x14
#define GTP_I2C_ADDRESS_LOW	0x5D
#define GTP_VALID_ADDR_START	0x8040
#define GTP_VALID_ADDR_END	0x8177

/* GTP CM_HEAD RW flags */
#define GTP_RW_READ			0
@@ -210,11 +215,9 @@ s32 init_wr_node(struct i2c_client *client);
void uninit_wr_node(void);
#endif

#ifdef CONFIG_GT9XX_TOUCHPANEL_UPDATE
extern u8 gup_init_update_proc(struct goodix_ts_data *ts);
u8 gup_init_update_proc(struct goodix_ts_data *ts);
s32 gup_enter_update_mode(struct i2c_client *client);
void gup_leave_update_mode(struct i2c_client *client);
s32 gup_update_proc(void *dir);
extern struct i2c_client  *i2c_connect_client;
#endif
#endif /* _GOODIX_GT9XX_H_ */
Loading