mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-16 17:23:55 +08:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input fixes from Dmitry Torokhov: "Nothing terribly interesting, just a few fixups" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Input: xpad - sync supported devices with fork on GitHub Input: ariel-pwrbutton - remove unused variable ariel_pwrbutton_id_table Input: goodix - add support for Goodix GT9286 chip dt-bindings: input: touchscreen: goodix: Add binding for GT9286 IC dt-bindings: input: adc-keys: clarify description Input: ili210x - implement pressure reporting for ILI251x Input: i8042 - unbreak Pegatron C15B Input: st1232 - wait until device is ready before reading resolution Input: st1232 - do not read more bytes than needed Input: st1232 - fix off-by-one error in resolution handling
This commit is contained in:
commit
7c2d18357f
@ -5,7 +5,8 @@ Required properties:
|
||||
- compatible: "adc-keys"
|
||||
- io-channels: Phandle to an ADC channel
|
||||
- io-channel-names = "buttons";
|
||||
- keyup-threshold-microvolt: Voltage at which all the keys are considered up.
|
||||
- keyup-threshold-microvolt: Voltage above or equal to which all the keys are
|
||||
considered up.
|
||||
|
||||
Optional properties:
|
||||
- poll-interval: Poll interval time in milliseconds
|
||||
@ -17,7 +18,12 @@ Each button (key) is represented as a sub-node of "adc-keys":
|
||||
Required subnode-properties:
|
||||
- label: Descriptive name of the key.
|
||||
- linux,code: Keycode to emit.
|
||||
- press-threshold-microvolt: Voltage ADC input when this key is pressed.
|
||||
- press-threshold-microvolt: voltage above or equal to which this key is
|
||||
considered pressed.
|
||||
|
||||
No two values of press-threshold-microvolt may be the same.
|
||||
All values of press-threshold-microvolt must be less than
|
||||
keyup-threshold-microvolt.
|
||||
|
||||
Example:
|
||||
|
||||
@ -47,3 +53,15 @@ Example:
|
||||
press-threshold-microvolt = <500000>;
|
||||
};
|
||||
};
|
||||
|
||||
+--------------------------------+------------------------+
|
||||
| 2.000.000 <= value | no key pressed |
|
||||
+--------------------------------+------------------------+
|
||||
| 1.500.000 <= value < 2.000.000 | KEY_VOLUMEUP pressed |
|
||||
+--------------------------------+------------------------+
|
||||
| 1.000.000 <= value < 1.500.000 | KEY_VOLUMEDOWN pressed |
|
||||
+--------------------------------+------------------------+
|
||||
| 500.000 <= value < 1.000.000 | KEY_ENTER pressed |
|
||||
+--------------------------------+------------------------+
|
||||
| value < 500.000 | no key pressed |
|
||||
+--------------------------------+------------------------+
|
||||
|
@ -26,6 +26,7 @@ properties:
|
||||
- goodix,gt927
|
||||
- goodix,gt9271
|
||||
- goodix,gt928
|
||||
- goodix,gt9286
|
||||
- goodix,gt967
|
||||
|
||||
reg:
|
||||
|
@ -215,9 +215,17 @@ static const struct xpad_device {
|
||||
{ 0x0e6f, 0x0213, "Afterglow Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
|
||||
{ 0x0e6f, 0x021f, "Rock Candy Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
|
||||
{ 0x0e6f, 0x0246, "Rock Candy Gamepad for Xbox One 2015", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x02ab, "PDP Controller for Xbox One", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x02a0, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x02a1, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x02a2, "PDP Wired Controller for Xbox One - Crimson Red", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x02a4, "PDP Wired Controller for Xbox One - Stealth Series", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x02a6, "PDP Wired Controller for Xbox One - Camo Series", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x02a7, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x02a8, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x02ab, "PDP Controller for Xbox One", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x02ad, "PDP Wired Controller for Xbox One - Stealth Series", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x02b3, "Afterglow Prismatic Wired Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x02b8, "Afterglow Prismatic Wired Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x0301, "Logic3 Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x0e6f, 0x0346, "Rock Candy Gamepad for Xbox One 2016", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x0401, "Logic3 Controller", 0, XTYPE_XBOX360 },
|
||||
@ -296,6 +304,9 @@ static const struct xpad_device {
|
||||
{ 0x1bad, 0xfa01, "MadCatz GamePad", 0, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0xfd00, "Razer Onza TE", 0, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0xfd01, "Razer Onza", 0, XTYPE_XBOX360 },
|
||||
{ 0x20d6, 0x2001, "BDA Xbox Series X Wired Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x20d6, 0x281f, "PowerA Wired Controller For Xbox 360", 0, XTYPE_XBOX360 },
|
||||
{ 0x2e24, 0x0652, "Hyperkin Duke X-Box One pad", 0, XTYPE_XBOXONE },
|
||||
{ 0x24c6, 0x5000, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x24c6, 0x5300, "PowerA MINI PROEX Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x24c6, 0x5303, "Xbox Airflo wired controller", 0, XTYPE_XBOX360 },
|
||||
@ -429,8 +440,12 @@ static const struct usb_device_id xpad_table[] = {
|
||||
XPAD_XBOX360_VENDOR(0x162e), /* Joytech X-Box 360 controllers */
|
||||
XPAD_XBOX360_VENDOR(0x1689), /* Razer Onza */
|
||||
XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */
|
||||
XPAD_XBOX360_VENDOR(0x20d6), /* PowerA Controllers */
|
||||
XPAD_XBOXONE_VENDOR(0x20d6), /* PowerA Controllers */
|
||||
XPAD_XBOX360_VENDOR(0x24c6), /* PowerA Controllers */
|
||||
XPAD_XBOXONE_VENDOR(0x24c6), /* PowerA Controllers */
|
||||
XPAD_XBOXONE_VENDOR(0x2e24), /* Hyperkin Duke X-Box One pad */
|
||||
XPAD_XBOX360_VENDOR(0x2f24), /* GameSir Controllers */
|
||||
{ }
|
||||
};
|
||||
|
||||
|
@ -149,12 +149,6 @@ static const struct of_device_id ariel_pwrbutton_of_match[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ariel_pwrbutton_of_match);
|
||||
|
||||
static const struct spi_device_id ariel_pwrbutton_id_table[] = {
|
||||
{ "wyse-ariel-ec-input", 0 },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(spi, ariel_pwrbutton_id_table);
|
||||
|
||||
static struct spi_driver ariel_pwrbutton_driver = {
|
||||
.driver = {
|
||||
.name = "dell-wyse-ariel-ec-input",
|
||||
|
@ -219,6 +219,8 @@ static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "PEGATRON CORPORATION"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "C15B"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ByteSpeed LLC"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ByteSpeed Laptop C15B"),
|
||||
|
@ -157,6 +157,7 @@ static const struct goodix_chip_id goodix_chip_ids[] = {
|
||||
{ .id = "5663", .data = >1x_chip_data },
|
||||
{ .id = "5688", .data = >1x_chip_data },
|
||||
{ .id = "917S", .data = >1x_chip_data },
|
||||
{ .id = "9286", .data = >1x_chip_data },
|
||||
|
||||
{ .id = "911", .data = >911_chip_data },
|
||||
{ .id = "9271", .data = >911_chip_data },
|
||||
@ -1448,6 +1449,7 @@ static const struct of_device_id goodix_of_match[] = {
|
||||
{ .compatible = "goodix,gt927" },
|
||||
{ .compatible = "goodix,gt9271" },
|
||||
{ .compatible = "goodix,gt928" },
|
||||
{ .compatible = "goodix,gt9286" },
|
||||
{ .compatible = "goodix,gt967" },
|
||||
{ }
|
||||
};
|
||||
|
@ -29,11 +29,13 @@ struct ili2xxx_chip {
|
||||
void *buf, size_t len);
|
||||
int (*get_touch_data)(struct i2c_client *client, u8 *data);
|
||||
bool (*parse_touch_data)(const u8 *data, unsigned int finger,
|
||||
unsigned int *x, unsigned int *y);
|
||||
unsigned int *x, unsigned int *y,
|
||||
unsigned int *z);
|
||||
bool (*continue_polling)(const u8 *data, bool touch);
|
||||
unsigned int max_touches;
|
||||
unsigned int resolution;
|
||||
bool has_calibrate_reg;
|
||||
bool has_pressure_reg;
|
||||
};
|
||||
|
||||
struct ili210x {
|
||||
@ -82,7 +84,8 @@ static int ili210x_read_touch_data(struct i2c_client *client, u8 *data)
|
||||
|
||||
static bool ili210x_touchdata_to_coords(const u8 *touchdata,
|
||||
unsigned int finger,
|
||||
unsigned int *x, unsigned int *y)
|
||||
unsigned int *x, unsigned int *y,
|
||||
unsigned int *z)
|
||||
{
|
||||
if (touchdata[0] & BIT(finger))
|
||||
return false;
|
||||
@ -137,7 +140,8 @@ static int ili211x_read_touch_data(struct i2c_client *client, u8 *data)
|
||||
|
||||
static bool ili211x_touchdata_to_coords(const u8 *touchdata,
|
||||
unsigned int finger,
|
||||
unsigned int *x, unsigned int *y)
|
||||
unsigned int *x, unsigned int *y,
|
||||
unsigned int *z)
|
||||
{
|
||||
u32 data;
|
||||
|
||||
@ -169,7 +173,8 @@ static const struct ili2xxx_chip ili211x_chip = {
|
||||
|
||||
static bool ili212x_touchdata_to_coords(const u8 *touchdata,
|
||||
unsigned int finger,
|
||||
unsigned int *x, unsigned int *y)
|
||||
unsigned int *x, unsigned int *y,
|
||||
unsigned int *z)
|
||||
{
|
||||
u16 val;
|
||||
|
||||
@ -235,7 +240,8 @@ static int ili251x_read_touch_data(struct i2c_client *client, u8 *data)
|
||||
|
||||
static bool ili251x_touchdata_to_coords(const u8 *touchdata,
|
||||
unsigned int finger,
|
||||
unsigned int *x, unsigned int *y)
|
||||
unsigned int *x, unsigned int *y,
|
||||
unsigned int *z)
|
||||
{
|
||||
u16 val;
|
||||
|
||||
@ -245,6 +251,7 @@ static bool ili251x_touchdata_to_coords(const u8 *touchdata,
|
||||
|
||||
*x = val & 0x3fff;
|
||||
*y = get_unaligned_be16(touchdata + 1 + (finger * 5) + 2);
|
||||
*z = touchdata[1 + (finger * 5) + 4];
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -261,6 +268,7 @@ static const struct ili2xxx_chip ili251x_chip = {
|
||||
.continue_polling = ili251x_check_continue_polling,
|
||||
.max_touches = 10,
|
||||
.has_calibrate_reg = true,
|
||||
.has_pressure_reg = true,
|
||||
};
|
||||
|
||||
static bool ili210x_report_events(struct ili210x *priv, u8 *touchdata)
|
||||
@ -268,14 +276,16 @@ static bool ili210x_report_events(struct ili210x *priv, u8 *touchdata)
|
||||
struct input_dev *input = priv->input;
|
||||
int i;
|
||||
bool contact = false, touch;
|
||||
unsigned int x = 0, y = 0;
|
||||
unsigned int x = 0, y = 0, z = 0;
|
||||
|
||||
for (i = 0; i < priv->chip->max_touches; i++) {
|
||||
touch = priv->chip->parse_touch_data(touchdata, i, &x, &y);
|
||||
touch = priv->chip->parse_touch_data(touchdata, i, &x, &y, &z);
|
||||
|
||||
input_mt_slot(input, i);
|
||||
if (input_mt_report_slot_state(input, MT_TOOL_FINGER, touch)) {
|
||||
touchscreen_report_pos(input, &priv->prop, x, y, true);
|
||||
if (priv->chip->has_pressure_reg)
|
||||
input_report_abs(input, ABS_MT_PRESSURE, z);
|
||||
contact = true;
|
||||
}
|
||||
}
|
||||
@ -437,6 +447,8 @@ static int ili210x_i2c_probe(struct i2c_client *client,
|
||||
max_xy = (chip->resolution ?: SZ_64K) - 1;
|
||||
input_set_abs_params(input, ABS_MT_POSITION_X, 0, max_xy, 0, 0);
|
||||
input_set_abs_params(input, ABS_MT_POSITION_Y, 0, max_xy, 0, 0);
|
||||
if (priv->chip->has_pressure_reg)
|
||||
input_set_abs_params(input, ABS_MT_PRESSURE, 0, 0xa, 0, 0);
|
||||
touchscreen_parse_properties(input, true, &priv->prop);
|
||||
|
||||
error = input_mt_init_slots(input, priv->chip->max_touches,
|
||||
|
@ -26,6 +26,20 @@
|
||||
#define ST1232_TS_NAME "st1232-ts"
|
||||
#define ST1633_TS_NAME "st1633-ts"
|
||||
|
||||
#define REG_STATUS 0x01 /* Device Status | Error Code */
|
||||
|
||||
#define STATUS_NORMAL 0x00
|
||||
#define STATUS_INIT 0x01
|
||||
#define STATUS_ERROR 0x02
|
||||
#define STATUS_AUTO_TUNING 0x03
|
||||
#define STATUS_IDLE 0x04
|
||||
#define STATUS_POWER_DOWN 0x05
|
||||
|
||||
#define ERROR_NONE 0x00
|
||||
#define ERROR_INVALID_ADDRESS 0x10
|
||||
#define ERROR_INVALID_VALUE 0x20
|
||||
#define ERROR_INVALID_PLATFORM 0x30
|
||||
|
||||
#define REG_XY_RESOLUTION 0x04
|
||||
#define REG_XY_COORDINATES 0x12
|
||||
#define ST_TS_MAX_FINGERS 10
|
||||
@ -47,7 +61,8 @@ struct st1232_ts_data {
|
||||
u8 *read_buf;
|
||||
};
|
||||
|
||||
static int st1232_ts_read_data(struct st1232_ts_data *ts, u8 reg)
|
||||
static int st1232_ts_read_data(struct st1232_ts_data *ts, u8 reg,
|
||||
unsigned int n)
|
||||
{
|
||||
struct i2c_client *client = ts->client;
|
||||
struct i2c_msg msg[] = {
|
||||
@ -59,7 +74,7 @@ static int st1232_ts_read_data(struct st1232_ts_data *ts, u8 reg)
|
||||
{
|
||||
.addr = client->addr,
|
||||
.flags = I2C_M_RD | I2C_M_DMA_SAFE,
|
||||
.len = ts->read_buf_len,
|
||||
.len = n,
|
||||
.buf = ts->read_buf,
|
||||
}
|
||||
};
|
||||
@ -72,6 +87,22 @@ static int st1232_ts_read_data(struct st1232_ts_data *ts, u8 reg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int st1232_ts_wait_ready(struct st1232_ts_data *ts)
|
||||
{
|
||||
unsigned int retries;
|
||||
int error;
|
||||
|
||||
for (retries = 10; retries; retries--) {
|
||||
error = st1232_ts_read_data(ts, REG_STATUS, 1);
|
||||
if (!error && ts->read_buf[0] == (STATUS_NORMAL | ERROR_NONE))
|
||||
return 0;
|
||||
|
||||
usleep_range(1000, 2000);
|
||||
}
|
||||
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
static int st1232_ts_read_resolution(struct st1232_ts_data *ts, u16 *max_x,
|
||||
u16 *max_y)
|
||||
{
|
||||
@ -79,14 +110,14 @@ static int st1232_ts_read_resolution(struct st1232_ts_data *ts, u16 *max_x,
|
||||
int error;
|
||||
|
||||
/* select resolution register */
|
||||
error = st1232_ts_read_data(ts, REG_XY_RESOLUTION);
|
||||
error = st1232_ts_read_data(ts, REG_XY_RESOLUTION, 3);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
buf = ts->read_buf;
|
||||
|
||||
*max_x = ((buf[0] & 0x0070) << 4) | buf[1];
|
||||
*max_y = ((buf[0] & 0x0007) << 8) | buf[2];
|
||||
*max_x = (((buf[0] & 0x0070) << 4) | buf[1]) - 1;
|
||||
*max_y = (((buf[0] & 0x0007) << 8) | buf[2]) - 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -140,7 +171,7 @@ static irqreturn_t st1232_ts_irq_handler(int irq, void *dev_id)
|
||||
int count;
|
||||
int error;
|
||||
|
||||
error = st1232_ts_read_data(ts, REG_XY_COORDINATES);
|
||||
error = st1232_ts_read_data(ts, REG_XY_COORDINATES, ts->read_buf_len);
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
@ -251,6 +282,11 @@ static int st1232_ts_probe(struct i2c_client *client,
|
||||
input_dev->name = "st1232-touchscreen";
|
||||
input_dev->id.bustype = BUS_I2C;
|
||||
|
||||
/* Wait until device is ready */
|
||||
error = st1232_ts_wait_ready(ts);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
/* Read resolution from the chip */
|
||||
error = st1232_ts_read_resolution(ts, &max_x, &max_y);
|
||||
if (error) {
|
||||
|
Loading…
Reference in New Issue
Block a user