Hi Hans, On Fri, May 11, 2018 at 03:30:40PM +0200, Hans de Goede wrote: > Some Silead bases touchscreens (depending on the firmware and/or the > regulator) report coordinates which never reach 0 along one or both > of their axis. > > This commit adds support for setting a "silead,min-x" and "min-y" property > which indicates the minimum x/y values reported. > > When enabled this fixes e.g. not being able to click things in the GNOME3 > top-bar on same tablets. > > Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> > --- > .../input/touchscreen/silead_gsl1680.txt | 3 +++ > drivers/input/touchscreen/silead.c | 23 ++++++++++++++++--- > 2 files changed, 23 insertions(+), 3 deletions(-) > > diff --git a/Documentation/devicetree/bindings/input/touchscreen/silead_gsl1680.txt b/Documentation/devicetree/bindings/input/touchscreen/silead_gsl1680.txt > index 84752de12412..07e19ef46c56 100644 > --- a/Documentation/devicetree/bindings/input/touchscreen/silead_gsl1680.txt > +++ b/Documentation/devicetree/bindings/input/touchscreen/silead_gsl1680.txt > @@ -25,6 +25,9 @@ Optional properties: > - silead,max-fingers : maximum number of fingers the touchscreen can detect > - silead,home-button : Boolean, set to true on devices which have a > capacitive home-button build into the touchscreen > +- silead,min-x : minimum raw x value reported by the touchscreen, set > + this for firmwares/digitizers where this is not 0 > +- silead,min-y : minimum raw y value reported by the touchscreen I'd rather this go into generic touchscreen bindings as "touchscreen-min-x" and "touchscreen-min-y". Rob? > - vddio-supply : regulator phandle for controller VDDIO > - avdd-supply : regulator phandle for controller AVDD > > diff --git a/drivers/input/touchscreen/silead.c b/drivers/input/touchscreen/silead.c > index ff7043f74a3d..024d15ba6d1b 100644 > --- a/drivers/input/touchscreen/silead.c > +++ b/drivers/input/touchscreen/silead.c > @@ -77,6 +77,8 @@ struct silead_ts_data { > struct regulator_bulk_data regulators[2]; > char fw_name[64]; > struct touchscreen_properties prop; > + int min_x; > + int min_y; > u32 max_fingers; > u32 chip_id; > struct input_mt_pos pos[SILEAD_MAX_FINGERS]; > @@ -144,6 +146,7 @@ static void silead_ts_read_data(struct i2c_client *client) > u8 *bufp, buf[SILEAD_TS_DATA_LEN]; > int touch_nr, softbutton, error, i; > bool softbutton_pressed = false; > + int x, y; > > error = i2c_smbus_read_i2c_block_data(client, SILEAD_REG_DATA, > SILEAD_TS_DATA_LEN, buf); > @@ -182,9 +185,14 @@ static void silead_ts_read_data(struct i2c_client *client) > */ > data->id[touch_nr] = (bufp[SILEAD_POINT_X_MSB_OFF] & > SILEAD_EXTRA_DATA_MASK) >> 4; > - touchscreen_set_mt_pos(&data->pos[touch_nr], &data->prop, > - get_unaligned_le16(&bufp[SILEAD_POINT_X_OFF]) & 0xfff, > - get_unaligned_le16(&bufp[SILEAD_POINT_Y_OFF]) & 0xfff); > + > + x = get_unaligned_le16(&bufp[SILEAD_POINT_X_OFF]) & 0xfff; > + x = max(x - data->min_x, 0); > + > + y = get_unaligned_le16(&bufp[SILEAD_POINT_Y_OFF]) & 0xfff; > + y = max(y - data->min_y, 0); "Normalizing" the coordinates is not what kernel normally does, but is better left for userpsace. Peter, will the userspace DTRT when presented with X/Y axis with non-zero minimum supplied? Thanks. -- Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html