Merge branch 'next' into for-linus

Prepare input updates for 4.16 merge window.
This commit is contained in:
Dmitry Torokhov
2018-02-01 00:37:30 -08:00
65 changed files with 503 additions and 1758 deletions

View File

@@ -427,4 +427,3 @@ MODULE_AUTHOR("Christopher Heiny <cheiny@synaptics.com");
MODULE_AUTHOR("Andrew Duggan <aduggan@synaptics.com");
MODULE_DESCRIPTION("RMI bus");
MODULE_LICENSE("GPL");
MODULE_VERSION(RMI_DRIVER_VERSION);

View File

@@ -41,6 +41,13 @@ void rmi_free_function_list(struct rmi_device *rmi_dev)
rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev, "Freeing function list\n");
/* Doing it in the reverse order so F01 will be removed last */
list_for_each_entry_safe_reverse(fn, tmp,
&data->function_list, node) {
list_del(&fn->node);
rmi_unregister_function(fn);
}
devm_kfree(&rmi_dev->dev, data->irq_memory);
data->irq_memory = NULL;
data->irq_status = NULL;
@@ -50,13 +57,6 @@ void rmi_free_function_list(struct rmi_device *rmi_dev)
data->f01_container = NULL;
data->f34_container = NULL;
/* Doing it in the reverse order so F01 will be removed last */
list_for_each_entry_safe_reverse(fn, tmp,
&data->function_list, node) {
list_del(&fn->node);
rmi_unregister_function(fn);
}
}
static int reset_one_function(struct rmi_function *fn)

View File

@@ -16,8 +16,6 @@
#include <linux/input.h>
#include "rmi_bus.h"
#define RMI_DRIVER_VERSION "2.0"
#define SYNAPTICS_INPUT_DEVICE_NAME "Synaptics RMI4 Touch Sensor"
#define SYNAPTICS_VENDOR_ID 0x06cb

View File

@@ -32,6 +32,7 @@ struct f03_data {
struct rmi_function *fn;
struct serio *serio;
bool serio_registered;
unsigned int overwrite_buttons;
@@ -138,6 +139,37 @@ static int rmi_f03_initialize(struct f03_data *f03)
return 0;
}
static int rmi_f03_pt_open(struct serio *serio)
{
struct f03_data *f03 = serio->port_data;
struct rmi_function *fn = f03->fn;
const u8 ob_len = f03->rx_queue_length * RMI_F03_OB_SIZE;
const u16 data_addr = fn->fd.data_base_addr + RMI_F03_OB_OFFSET;
u8 obs[RMI_F03_QUEUE_LENGTH * RMI_F03_OB_SIZE];
int error;
/*
* Consume any pending data. Some devices like to spam with
* 0xaa 0x00 announcements which may confuse us as we try to
* probe the device.
*/
error = rmi_read_block(fn->rmi_dev, data_addr, &obs, ob_len);
if (!error)
rmi_dbg(RMI_DEBUG_FN, &fn->dev,
"%s: Consumed %*ph (%d) from PS2 guest\n",
__func__, ob_len, obs, ob_len);
return fn->rmi_dev->driver->set_irq_bits(fn->rmi_dev, fn->irq_mask);
}
static void rmi_f03_pt_close(struct serio *serio)
{
struct f03_data *f03 = serio->port_data;
struct rmi_function *fn = f03->fn;
fn->rmi_dev->driver->clear_irq_bits(fn->rmi_dev, fn->irq_mask);
}
static int rmi_f03_register_pt(struct f03_data *f03)
{
struct serio *serio;
@@ -148,16 +180,19 @@ static int rmi_f03_register_pt(struct f03_data *f03)
serio->id.type = SERIO_PS_PSTHRU;
serio->write = rmi_f03_pt_write;
serio->open = rmi_f03_pt_open;
serio->close = rmi_f03_pt_close;
serio->port_data = f03;
strlcpy(serio->name, "Synaptics RMI4 PS/2 pass-through",
sizeof(serio->name));
strlcpy(serio->phys, "synaptics-rmi4-pt/serio1",
sizeof(serio->phys));
strlcpy(serio->name, "RMI4 PS/2 pass-through", sizeof(serio->name));
snprintf(serio->phys, sizeof(serio->phys), "%s/serio0",
dev_name(&f03->fn->dev));
serio->dev.parent = &f03->fn->dev;
f03->serio = serio;
printk(KERN_INFO "serio: %s port at %s\n",
serio->name, dev_name(&f03->fn->dev));
serio_register_port(serio);
return 0;
@@ -184,17 +219,27 @@ static int rmi_f03_probe(struct rmi_function *fn)
f03->device_count);
dev_set_drvdata(dev, f03);
error = rmi_f03_register_pt(f03);
if (error)
return error;
return 0;
}
static int rmi_f03_config(struct rmi_function *fn)
{
fn->rmi_dev->driver->set_irq_bits(fn->rmi_dev, fn->irq_mask);
struct f03_data *f03 = dev_get_drvdata(&fn->dev);
int error;
if (!f03->serio_registered) {
error = rmi_f03_register_pt(f03);
if (error)
return error;
f03->serio_registered = true;
} else {
/*
* We must be re-configuring the sensor, just enable
* interrupts for this function.
*/
fn->rmi_dev->driver->set_irq_bits(fn->rmi_dev, fn->irq_mask);
}
return 0;
}
@@ -204,7 +249,7 @@ static int rmi_f03_attention(struct rmi_function *fn, unsigned long *irq_bits)
struct rmi_device *rmi_dev = fn->rmi_dev;
struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
struct f03_data *f03 = dev_get_drvdata(&fn->dev);
u16 data_addr = fn->fd.data_base_addr;
const u16 data_addr = fn->fd.data_base_addr + RMI_F03_OB_OFFSET;
const u8 ob_len = f03->rx_queue_length * RMI_F03_OB_SIZE;
u8 obs[RMI_F03_QUEUE_LENGTH * RMI_F03_OB_SIZE];
u8 ob_status;
@@ -226,8 +271,7 @@ static int rmi_f03_attention(struct rmi_function *fn, unsigned long *irq_bits)
drvdata->attn_data.size -= ob_len;
} else {
/* Grab all of the data registers, and check them for data */
error = rmi_read_block(fn->rmi_dev, data_addr + RMI_F03_OB_OFFSET,
&obs, ob_len);
error = rmi_read_block(fn->rmi_dev, data_addr, &obs, ob_len);
if (error) {
dev_err(&fn->dev,
"%s: Failed to read F03 output buffers: %d\n",
@@ -266,7 +310,8 @@ static void rmi_f03_remove(struct rmi_function *fn)
{
struct f03_data *f03 = dev_get_drvdata(&fn->dev);
serio_unregister_port(f03->serio);
if (f03->serio_registered)
serio_unregister_port(f03->serio);
}
struct rmi_function_handler rmi_f03_handler = {

View File

@@ -11,7 +11,6 @@
#include <linux/rmi.h>
#include <linux/firmware.h>
#include <asm/unaligned.h>
#include <asm/unaligned.h>
#include <linux/bitops.h>
#include "rmi_driver.h"

View File

@@ -391,4 +391,3 @@ MODULE_AUTHOR("Christopher Heiny <cheiny@synaptics.com>");
MODULE_AUTHOR("Andrew Duggan <aduggan@synaptics.com>");
MODULE_DESCRIPTION("RMI I2C driver");
MODULE_LICENSE("GPL");
MODULE_VERSION(RMI_DRIVER_VERSION);

View File

@@ -528,4 +528,3 @@ MODULE_AUTHOR("Christopher Heiny <cheiny@synaptics.com>");
MODULE_AUTHOR("Andrew Duggan <aduggan@synaptics.com>");
MODULE_DESCRIPTION("RMI SPI driver");
MODULE_LICENSE("GPL");
MODULE_VERSION(RMI_DRIVER_VERSION);