Input: bu21013_ts - switch to using standard touchscreen properties
This switches the driver over to the standard touchscreen properties for coordinate transformation, while keeping old bindings working as well. Tested-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
307ec663f6
commit
4b6253fa73
@ -10,6 +10,16 @@ Required properties:
|
|||||||
Optional properties:
|
Optional properties:
|
||||||
- touch-gpios : GPIO pin registering a touch event
|
- touch-gpios : GPIO pin registering a touch event
|
||||||
- <supply_name>-supply : Phandle to a regulator supply
|
- <supply_name>-supply : Phandle to a regulator supply
|
||||||
|
- touchscreen-size-x : General touchscreen binding, see [1].
|
||||||
|
- touchscreen-size-y : General touchscreen binding, see [1].
|
||||||
|
- touchscreen-inverted-x : General touchscreen binding, see [1].
|
||||||
|
- touchscreen-inverted-y : General touchscreen binding, see [1].
|
||||||
|
- touchscreen-swapped-x-y : General touchscreen binding, see [1].
|
||||||
|
|
||||||
|
[1] All general touchscreen properties are described in
|
||||||
|
Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt.
|
||||||
|
|
||||||
|
Deprecated properties:
|
||||||
- rohm,touch-max-x : Maximum outward permitted limit in the X axis
|
- rohm,touch-max-x : Maximum outward permitted limit in the X axis
|
||||||
- rohm,touch-max-y : Maximum outward permitted limit in the Y axis
|
- rohm,touch-max-y : Maximum outward permitted limit in the Y axis
|
||||||
- rohm,flip-x : Flip touch coordinates on the X axis
|
- rohm,flip-x : Flip touch coordinates on the X axis
|
||||||
@ -26,8 +36,8 @@ Example:
|
|||||||
touch-gpio = <&gpio2 20 GPIO_ACTIVE_LOW>;
|
touch-gpio = <&gpio2 20 GPIO_ACTIVE_LOW>;
|
||||||
avdd-supply = <&ab8500_ldo_aux1_reg>;
|
avdd-supply = <&ab8500_ldo_aux1_reg>;
|
||||||
|
|
||||||
rohm,touch-max-x = <384>;
|
touchscreen-size-x = <384>;
|
||||||
rohm,touch-max-y = <704>;
|
touchscreen-size-y = <704>;
|
||||||
rohm,flip-y;
|
touchscreen-inverted-y;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/input/mt.h>
|
#include <linux/input/mt.h>
|
||||||
|
#include <linux/input/touchscreen.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
@ -139,6 +140,7 @@
|
|||||||
* struct bu21013_ts - touch panel data structure
|
* struct bu21013_ts - touch panel data structure
|
||||||
* @client: pointer to the i2c client
|
* @client: pointer to the i2c client
|
||||||
* @in_dev: pointer to the input device structure
|
* @in_dev: pointer to the input device structure
|
||||||
|
* @props: the device coordinate transformation properties
|
||||||
* @regulator: pointer to the Regulator used for touch screen
|
* @regulator: pointer to the Regulator used for touch screen
|
||||||
* @cs_gpiod: chip select GPIO line
|
* @cs_gpiod: chip select GPIO line
|
||||||
* @int_gpiod: touch interrupt GPIO line
|
* @int_gpiod: touch interrupt GPIO line
|
||||||
@ -155,6 +157,7 @@
|
|||||||
struct bu21013_ts {
|
struct bu21013_ts {
|
||||||
struct i2c_client *client;
|
struct i2c_client *client;
|
||||||
struct input_dev *in_dev;
|
struct input_dev *in_dev;
|
||||||
|
struct touchscreen_properties props;
|
||||||
struct regulator *regulator;
|
struct regulator *regulator;
|
||||||
struct gpio_desc *cs_gpiod;
|
struct gpio_desc *cs_gpiod;
|
||||||
struct gpio_desc *int_gpiod;
|
struct gpio_desc *int_gpiod;
|
||||||
@ -201,19 +204,13 @@ static int bu21013_do_touch_report(struct bu21013_ts *ts)
|
|||||||
|
|
||||||
for (i = 0; i < MAX_FINGERS; i++) {
|
for (i = 0; i < MAX_FINGERS; i++) {
|
||||||
const u8 *data = &buf[4 * i + 3];
|
const u8 *data = &buf[4 * i + 3];
|
||||||
struct input_mt_pos *p = &pos[finger_down_count];
|
unsigned int x, y;
|
||||||
|
|
||||||
p->x = data[0] << SHIFT_2 | (data[1] & MASK_BITS);
|
x = data[0] << SHIFT_2 | (data[1] & MASK_BITS);
|
||||||
p->y = data[2] << SHIFT_2 | (data[3] & MASK_BITS);
|
y = data[2] << SHIFT_2 | (data[3] & MASK_BITS);
|
||||||
if (p->x == 0 || p->y == 0)
|
if (x != 0 && y != 0)
|
||||||
continue;
|
touchscreen_set_mt_pos(&pos[finger_down_count++],
|
||||||
|
&ts->props, x, y);
|
||||||
finger_down_count++;
|
|
||||||
|
|
||||||
if (ts->x_flip)
|
|
||||||
p->x = ts->touch_x_max - p->x;
|
|
||||||
if (ts->y_flip)
|
|
||||||
p->y = ts->touch_y_max - p->y;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (finger_down_count == 2 &&
|
if (finger_down_count == 2 &&
|
||||||
@ -412,6 +409,8 @@ static int bu21013_probe(struct i2c_client *client,
|
|||||||
{
|
{
|
||||||
struct bu21013_ts *ts;
|
struct bu21013_ts *ts;
|
||||||
struct input_dev *in_dev;
|
struct input_dev *in_dev;
|
||||||
|
struct input_absinfo *info;
|
||||||
|
u32 max_x = 0, max_y = 0;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if (!i2c_check_functionality(client->adapter,
|
if (!i2c_check_functionality(client->adapter,
|
||||||
@ -434,11 +433,6 @@ static int bu21013_probe(struct i2c_client *client,
|
|||||||
ts->x_flip = device_property_read_bool(&client->dev, "rohm,flip-x");
|
ts->x_flip = device_property_read_bool(&client->dev, "rohm,flip-x");
|
||||||
ts->y_flip = device_property_read_bool(&client->dev, "rohm,flip-y");
|
ts->y_flip = device_property_read_bool(&client->dev, "rohm,flip-y");
|
||||||
|
|
||||||
device_property_read_u32(&client->dev, "rohm,touch-max-x",
|
|
||||||
&ts->touch_x_max);
|
|
||||||
device_property_read_u32(&client->dev, "rohm,touch-max-y",
|
|
||||||
&ts->touch_y_max);
|
|
||||||
|
|
||||||
in_dev = devm_input_allocate_device(&client->dev);
|
in_dev = devm_input_allocate_device(&client->dev);
|
||||||
if (!in_dev) {
|
if (!in_dev) {
|
||||||
dev_err(&client->dev, "device memory alloc failed\n");
|
dev_err(&client->dev, "device memory alloc failed\n");
|
||||||
@ -451,10 +445,28 @@ static int bu21013_probe(struct i2c_client *client,
|
|||||||
in_dev->name = DRIVER_TP;
|
in_dev->name = DRIVER_TP;
|
||||||
in_dev->id.bustype = BUS_I2C;
|
in_dev->id.bustype = BUS_I2C;
|
||||||
|
|
||||||
input_set_abs_params(in_dev, ABS_MT_POSITION_X,
|
device_property_read_u32(&client->dev, "rohm,touch-max-x", &max_x);
|
||||||
0, ts->touch_x_max, 0, 0);
|
device_property_read_u32(&client->dev, "rohm,touch-max-y", &max_y);
|
||||||
input_set_abs_params(in_dev, ABS_MT_POSITION_Y,
|
|
||||||
0, ts->touch_y_max, 0, 0);
|
input_set_abs_params(in_dev, ABS_MT_POSITION_X, 0, max_x, 0, 0);
|
||||||
|
input_set_abs_params(in_dev, ABS_MT_POSITION_Y, 0, max_y, 0, 0);
|
||||||
|
|
||||||
|
touchscreen_parse_properties(in_dev, true, &ts->props);
|
||||||
|
|
||||||
|
/* Adjust for the legacy "flip" properties, if present */
|
||||||
|
if (!ts->props.invert_x &&
|
||||||
|
device_property_read_bool(&client->dev, "rohm,flip-x")) {
|
||||||
|
info = &in_dev->absinfo[ABS_MT_POSITION_X];
|
||||||
|
info->maximum -= info->minimum;
|
||||||
|
info->minimum = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ts->props.invert_y &&
|
||||||
|
device_property_read_bool(&client->dev, "rohm,flip-y")) {
|
||||||
|
info = &in_dev->absinfo[ABS_MT_POSITION_Y];
|
||||||
|
info->maximum -= info->minimum;
|
||||||
|
info->minimum = 0;
|
||||||
|
}
|
||||||
|
|
||||||
error = input_mt_init_slots(in_dev, MAX_FINGERS,
|
error = input_mt_init_slots(in_dev, MAX_FINGERS,
|
||||||
INPUT_MT_DIRECT | INPUT_MT_TRACK |
|
INPUT_MT_DIRECT | INPUT_MT_TRACK |
|
||||||
|
Loading…
Reference in New Issue
Block a user