Commit 1df01322 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull input fixes from Dmitry Torokhov:
 "Just a few driver fixes here"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
  Input: elants_i2c - drop zero-checking of ABS_MT_TOUCH_MAJOR resolution
  Input: elants_i2c - fix division by zero if firmware reports zero phys size
  Input: nspire-keypad - enable interrupts only when opened
  Input: i8042 - fix Pegatron C15B ID entry
  Input: n64joy - fix return value check in n64joy_probe()
  Input: s6sy761 - fix coordinate read bit shift
parents 7f75285c 56cfe6f8
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -252,8 +252,8 @@ static int __init n64joy_probe(struct platform_device *pdev)
	mutex_init(&priv->n64joy_mutex);

	priv->reg_base = devm_platform_ioremap_resource(pdev, 0);
	if (!priv->reg_base) {
		err = -EINVAL;
	if (IS_ERR(priv->reg_base)) {
		err = PTR_ERR(priv->reg_base);
		goto fail;
	}

+31 −25
Original line number Diff line number Diff line
@@ -93,9 +93,15 @@ static irqreturn_t nspire_keypad_irq(int irq, void *dev_id)
	return IRQ_HANDLED;
}

static int nspire_keypad_chip_init(struct nspire_keypad *keypad)
static int nspire_keypad_open(struct input_dev *input)
{
	struct nspire_keypad *keypad = input_get_drvdata(input);
	unsigned long val = 0, cycles_per_us, delay_cycles, row_delay_cycles;
	int error;

	error = clk_prepare_enable(keypad->clk);
	if (error)
		return error;

	cycles_per_us = (clk_get_rate(keypad->clk) / 1000000);
	if (cycles_per_us == 0)
@@ -121,30 +127,6 @@ static int nspire_keypad_chip_init(struct nspire_keypad *keypad)
	keypad->int_mask = 1 << 1;
	writel(keypad->int_mask, keypad->reg_base + KEYPAD_INTMSK);

	/* Disable GPIO interrupts to prevent hanging on touchpad */
	/* Possibly used to detect touchpad events */
	writel(0, keypad->reg_base + KEYPAD_UNKNOWN_INT);
	/* Acknowledge existing interrupts */
	writel(~0, keypad->reg_base + KEYPAD_UNKNOWN_INT_STS);

	return 0;
}

static int nspire_keypad_open(struct input_dev *input)
{
	struct nspire_keypad *keypad = input_get_drvdata(input);
	int error;

	error = clk_prepare_enable(keypad->clk);
	if (error)
		return error;

	error = nspire_keypad_chip_init(keypad);
	if (error) {
		clk_disable_unprepare(keypad->clk);
		return error;
	}

	return 0;
}

@@ -152,6 +134,11 @@ static void nspire_keypad_close(struct input_dev *input)
{
	struct nspire_keypad *keypad = input_get_drvdata(input);

	/* Disable interrupts */
	writel(0, keypad->reg_base + KEYPAD_INTMSK);
	/* Acknowledge existing interrupts */
	writel(~0, keypad->reg_base + KEYPAD_INT);

	clk_disable_unprepare(keypad->clk);
}

@@ -210,6 +197,25 @@ static int nspire_keypad_probe(struct platform_device *pdev)
		return -ENOMEM;
	}

	error = clk_prepare_enable(keypad->clk);
	if (error) {
		dev_err(&pdev->dev, "failed to enable clock\n");
		return error;
	}

	/* Disable interrupts */
	writel(0, keypad->reg_base + KEYPAD_INTMSK);
	/* Acknowledge existing interrupts */
	writel(~0, keypad->reg_base + KEYPAD_INT);

	/* Disable GPIO interrupts to prevent hanging on touchpad */
	/* Possibly used to detect touchpad events */
	writel(0, keypad->reg_base + KEYPAD_UNKNOWN_INT);
	/* Acknowledge existing GPIO interrupts */
	writel(~0, keypad->reg_base + KEYPAD_UNKNOWN_INT_STS);

	clk_disable_unprepare(keypad->clk);

	input_set_drvdata(input, keypad);

	input->id.bustype = BUS_HOST;
+1 −0
Original line number Diff line number Diff line
@@ -588,6 +588,7 @@ static const struct dmi_system_id i8042_dmi_noselftest_table[] = {
			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
			DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */
		},
	}, {
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
			DMI_MATCH(DMI_CHASSIS_TYPE, "31"), /* Convertible Notebook */
+2 −3
Original line number Diff line number Diff line
@@ -1441,7 +1441,7 @@ static int elants_i2c_probe(struct i2c_client *client,

	touchscreen_parse_properties(ts->input, true, &ts->prop);

	if (ts->chip_id == EKTF3624) {
	if (ts->chip_id == EKTF3624 && ts->phy_x && ts->phy_y) {
		/* calculate resolution from size */
		ts->x_res = DIV_ROUND_CLOSEST(ts->prop.max_x, ts->phy_x);
		ts->y_res = DIV_ROUND_CLOSEST(ts->prop.max_y, ts->phy_y);
@@ -1449,7 +1449,6 @@ static int elants_i2c_probe(struct i2c_client *client,

	input_abs_set_res(ts->input, ABS_MT_POSITION_X, ts->x_res);
	input_abs_set_res(ts->input, ABS_MT_POSITION_Y, ts->y_res);
	if (ts->major_res > 0)
	input_abs_set_res(ts->input, ABS_MT_TOUCH_MAJOR, ts->major_res);

	error = input_mt_init_slots(ts->input, MAX_CONTACT_NUM,
+2 −2
Original line number Diff line number Diff line
@@ -145,8 +145,8 @@ static void s6sy761_report_coordinates(struct s6sy761_data *sdata,
	u8 major = event[4];
	u8 minor = event[5];
	u8 z = event[6] & S6SY761_MASK_Z;
	u16 x = (event[1] << 3) | ((event[3] & S6SY761_MASK_X) >> 4);
	u16 y = (event[2] << 3) | (event[3] & S6SY761_MASK_Y);
	u16 x = (event[1] << 4) | ((event[3] & S6SY761_MASK_X) >> 4);
	u16 y = (event[2] << 4) | (event[3] & S6SY761_MASK_Y);

	input_mt_slot(sdata->input, tid);