Merge tag 'v5.6' into next
Sync up with mainline to get device tree and other changes.
This commit is contained in:
@@ -224,13 +224,13 @@ static void __pass_event(struct evdev_client *client,
|
||||
*/
|
||||
client->tail = (client->head - 2) & (client->bufsize - 1);
|
||||
|
||||
client->buffer[client->tail].input_event_sec =
|
||||
event->input_event_sec;
|
||||
client->buffer[client->tail].input_event_usec =
|
||||
event->input_event_usec;
|
||||
client->buffer[client->tail].type = EV_SYN;
|
||||
client->buffer[client->tail].code = SYN_DROPPED;
|
||||
client->buffer[client->tail].value = 0;
|
||||
client->buffer[client->tail] = (struct input_event) {
|
||||
.input_event_sec = event->input_event_sec,
|
||||
.input_event_usec = event->input_event_usec,
|
||||
.type = EV_SYN,
|
||||
.code = SYN_DROPPED,
|
||||
.value = 0,
|
||||
};
|
||||
|
||||
client->packet_head = client->tail;
|
||||
}
|
||||
@@ -485,10 +485,7 @@ static int evdev_open(struct inode *inode, struct file *file)
|
||||
struct evdev_client *client;
|
||||
int error;
|
||||
|
||||
client = kzalloc(struct_size(client, buffer, bufsize),
|
||||
GFP_KERNEL | __GFP_NOWARN);
|
||||
if (!client)
|
||||
client = vzalloc(struct_size(client, buffer, bufsize));
|
||||
client = kvzalloc(struct_size(client, buffer, bufsize), GFP_KERNEL);
|
||||
if (!client)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@@ -190,6 +190,7 @@ static void input_repeat_key(struct timer_list *t)
|
||||
input_value_sync
|
||||
};
|
||||
|
||||
input_set_timestamp(dev, ktime_get());
|
||||
input_pass_values(dev, vals, ARRAY_SIZE(vals));
|
||||
|
||||
if (dev->rep[REP_PERIOD])
|
||||
@@ -878,16 +879,18 @@ static int input_default_setkeycode(struct input_dev *dev,
|
||||
}
|
||||
}
|
||||
|
||||
__clear_bit(*old_keycode, dev->keybit);
|
||||
__set_bit(ke->keycode, dev->keybit);
|
||||
|
||||
for (i = 0; i < dev->keycodemax; i++) {
|
||||
if (input_fetch_keycode(dev, i) == *old_keycode) {
|
||||
__set_bit(*old_keycode, dev->keybit);
|
||||
break; /* Setting the bit twice is useless, so break */
|
||||
if (*old_keycode <= KEY_MAX) {
|
||||
__clear_bit(*old_keycode, dev->keybit);
|
||||
for (i = 0; i < dev->keycodemax; i++) {
|
||||
if (input_fetch_keycode(dev, i) == *old_keycode) {
|
||||
__set_bit(*old_keycode, dev->keybit);
|
||||
/* Setting the bit twice is useless, so break */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
__set_bit(ke->keycode, dev->keybit);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -943,9 +946,13 @@ int input_set_keycode(struct input_dev *dev,
|
||||
* Simulate keyup event if keycode is not present
|
||||
* in the keymap anymore
|
||||
*/
|
||||
if (test_bit(EV_KEY, dev->evbit) &&
|
||||
!is_event_supported(old_keycode, dev->keybit, KEY_MAX) &&
|
||||
__test_and_clear_bit(old_keycode, dev->key)) {
|
||||
if (old_keycode > KEY_MAX) {
|
||||
dev_warn(dev->dev.parent ?: &dev->dev,
|
||||
"%s: got too big old keycode %#x\n",
|
||||
__func__, old_keycode);
|
||||
} else if (test_bit(EV_KEY, dev->evbit) &&
|
||||
!is_event_supported(old_keycode, dev->keybit, KEY_MAX) &&
|
||||
__test_and_clear_bit(old_keycode, dev->key)) {
|
||||
struct input_value vals[] = {
|
||||
{ EV_KEY, old_keycode, 0 },
|
||||
input_value_sync
|
||||
@@ -1210,13 +1217,12 @@ static int input_proc_devices_open(struct inode *inode, struct file *file)
|
||||
return seq_open(file, &input_devices_seq_ops);
|
||||
}
|
||||
|
||||
static const struct file_operations input_devices_fileops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = input_proc_devices_open,
|
||||
.poll = input_proc_devices_poll,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
static const struct proc_ops input_devices_proc_ops = {
|
||||
.proc_open = input_proc_devices_open,
|
||||
.proc_poll = input_proc_devices_poll,
|
||||
.proc_read = seq_read,
|
||||
.proc_lseek = seq_lseek,
|
||||
.proc_release = seq_release,
|
||||
};
|
||||
|
||||
static void *input_handlers_seq_start(struct seq_file *seq, loff_t *pos)
|
||||
@@ -1274,12 +1280,11 @@ static int input_proc_handlers_open(struct inode *inode, struct file *file)
|
||||
return seq_open(file, &input_handlers_seq_ops);
|
||||
}
|
||||
|
||||
static const struct file_operations input_handlers_fileops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = input_proc_handlers_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
static const struct proc_ops input_handlers_proc_ops = {
|
||||
.proc_open = input_proc_handlers_open,
|
||||
.proc_read = seq_read,
|
||||
.proc_lseek = seq_lseek,
|
||||
.proc_release = seq_release,
|
||||
};
|
||||
|
||||
static int __init input_proc_init(void)
|
||||
@@ -1291,12 +1296,12 @@ static int __init input_proc_init(void)
|
||||
return -ENOMEM;
|
||||
|
||||
entry = proc_create("devices", 0, proc_bus_input_dir,
|
||||
&input_devices_fileops);
|
||||
&input_devices_proc_ops);
|
||||
if (!entry)
|
||||
goto fail1;
|
||||
|
||||
entry = proc_create("handlers", 0, proc_bus_input_dir,
|
||||
&input_handlers_fileops);
|
||||
&input_handlers_proc_ops);
|
||||
if (!entry)
|
||||
goto fail2;
|
||||
|
||||
|
@@ -30,7 +30,7 @@ struct event_dev {
|
||||
struct input_dev *input;
|
||||
int irq;
|
||||
void __iomem *addr;
|
||||
char name[0];
|
||||
char name[];
|
||||
};
|
||||
|
||||
static irqreturn_t events_interrupt(int irq, void *dev_id)
|
||||
|
@@ -55,7 +55,7 @@ struct gpio_keys_drvdata {
|
||||
struct input_dev *input;
|
||||
struct mutex disable_lock;
|
||||
unsigned short *keymap;
|
||||
struct gpio_button_data data[0];
|
||||
struct gpio_button_data data[];
|
||||
};
|
||||
|
||||
/*
|
||||
|
@@ -38,7 +38,7 @@ struct gpio_keys_polled_dev {
|
||||
const struct gpio_keys_platform_data *pdata;
|
||||
unsigned long rel_axis_seen[BITS_TO_LONGS(REL_CNT)];
|
||||
unsigned long abs_axis_seen[BITS_TO_LONGS(ABS_CNT)];
|
||||
struct gpio_keys_button_data data[0];
|
||||
struct gpio_keys_button_data data[];
|
||||
};
|
||||
|
||||
static void gpio_keys_button_event(struct input_dev *input,
|
||||
|
@@ -78,7 +78,13 @@ static void imx_sc_check_for_events(struct work_struct *work)
|
||||
return;
|
||||
}
|
||||
|
||||
state = (bool)msg.state;
|
||||
/*
|
||||
* The response data from SCU firmware is 4 bytes,
|
||||
* but ONLY the first byte is the key state, other
|
||||
* 3 bytes could be some dirty data, so we should
|
||||
* ONLY take the first byte as key state.
|
||||
*/
|
||||
state = (bool)(msg.state & 0xff);
|
||||
|
||||
if (state ^ priv->keystate) {
|
||||
priv->keystate = state;
|
||||
|
@@ -107,7 +107,7 @@ static int pxa930_rotary_probe(struct platform_device *pdev)
|
||||
if (!r)
|
||||
return -ENOMEM;
|
||||
|
||||
r->mmio_base = ioremap_nocache(res->start, resource_size(res));
|
||||
r->mmio_base = ioremap(res->start, resource_size(res));
|
||||
if (r->mmio_base == NULL) {
|
||||
dev_err(&pdev->dev, "failed to remap IO memory\n");
|
||||
err = -ENXIO;
|
||||
|
@@ -195,7 +195,7 @@ static int sh_keysc_probe(struct platform_device *pdev)
|
||||
memcpy(&priv->pdata, dev_get_platdata(&pdev->dev), sizeof(priv->pdata));
|
||||
pdata = &priv->pdata;
|
||||
|
||||
priv->iomem_base = ioremap_nocache(res->start, resource_size(res));
|
||||
priv->iomem_base = ioremap(res->start, resource_size(res));
|
||||
if (priv->iomem_base == NULL) {
|
||||
dev_err(&pdev->dev, "failed to remap I/O memory\n");
|
||||
error = -ENXIO;
|
||||
|
@@ -33,7 +33,7 @@ MODULE_DEVICE_TABLE(i2c, tca6416_id);
|
||||
|
||||
struct tca6416_drv_data {
|
||||
struct input_dev *input;
|
||||
struct tca6416_button data[0];
|
||||
struct tca6416_button data[];
|
||||
};
|
||||
|
||||
struct tca6416_keypad_chip {
|
||||
@@ -48,7 +48,7 @@ struct tca6416_keypad_chip {
|
||||
int irqnum;
|
||||
u16 pinmask;
|
||||
bool use_polling;
|
||||
struct tca6416_button buttons[0];
|
||||
struct tca6416_button buttons[];
|
||||
};
|
||||
|
||||
static int tca6416_write_reg(struct tca6416_keypad_chip *chip, int reg, u16 val)
|
||||
|
@@ -75,6 +75,14 @@ static struct touchkey_variant aries_touchkey_variant = {
|
||||
.cmd_led_off = ARIES_TOUCHKEY_CMD_LED_OFF,
|
||||
};
|
||||
|
||||
static const struct touchkey_variant tc360_touchkey_variant = {
|
||||
.keycode_reg = 0x00,
|
||||
.base_reg = 0x00,
|
||||
.fixed_regulator = true,
|
||||
.cmd_led_on = TM2_TOUCHKEY_CMD_LED_ON,
|
||||
.cmd_led_off = TM2_TOUCHKEY_CMD_LED_OFF,
|
||||
};
|
||||
|
||||
static int tm2_touchkey_led_brightness_set(struct led_classdev *led_dev,
|
||||
enum led_brightness brightness)
|
||||
{
|
||||
@@ -327,6 +335,9 @@ static const struct of_device_id tm2_touchkey_of_match[] = {
|
||||
}, {
|
||||
.compatible = "cypress,aries-touchkey",
|
||||
.data = &aries_touchkey_variant,
|
||||
}, {
|
||||
.compatible = "coreriver,tc360-touchkey",
|
||||
.data = &tc360_touchkey_variant,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
@@ -336,7 +336,8 @@ static int keyspan_setup(struct usb_device* dev)
|
||||
int retval = 0;
|
||||
|
||||
retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
|
||||
0x11, 0x40, 0x5601, 0x0, NULL, 0, 0);
|
||||
0x11, 0x40, 0x5601, 0x0, NULL, 0,
|
||||
USB_CTRL_SET_TIMEOUT);
|
||||
if (retval) {
|
||||
dev_dbg(&dev->dev, "%s - failed to set bit rate due to error: %d\n",
|
||||
__func__, retval);
|
||||
@@ -344,7 +345,8 @@ static int keyspan_setup(struct usb_device* dev)
|
||||
}
|
||||
|
||||
retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
|
||||
0x44, 0x40, 0x0, 0x0, NULL, 0, 0);
|
||||
0x44, 0x40, 0x0, 0x0, NULL, 0,
|
||||
USB_CTRL_SET_TIMEOUT);
|
||||
if (retval) {
|
||||
dev_dbg(&dev->dev, "%s - failed to set resume sensitivity due to error: %d\n",
|
||||
__func__, retval);
|
||||
@@ -352,7 +354,8 @@ static int keyspan_setup(struct usb_device* dev)
|
||||
}
|
||||
|
||||
retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
|
||||
0x22, 0x40, 0x0, 0x0, NULL, 0, 0);
|
||||
0x22, 0x40, 0x0, 0x0, NULL, 0,
|
||||
USB_CTRL_SET_TIMEOUT);
|
||||
if (retval) {
|
||||
dev_dbg(&dev->dev, "%s - failed to turn receive on due to error: %d\n",
|
||||
__func__, retval);
|
||||
|
@@ -108,9 +108,16 @@ static int max77650_onkey_probe(struct platform_device *pdev)
|
||||
return input_register_device(onkey->input);
|
||||
}
|
||||
|
||||
static const struct of_device_id max77650_onkey_of_match[] = {
|
||||
{ .compatible = "maxim,max77650-onkey" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, max77650_onkey_of_match);
|
||||
|
||||
static struct platform_driver max77650_onkey_driver = {
|
||||
.driver = {
|
||||
.name = "max77650-onkey",
|
||||
.of_match_table = max77650_onkey_of_match,
|
||||
},
|
||||
.probe = max77650_onkey_probe,
|
||||
};
|
||||
|
@@ -90,7 +90,7 @@ static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on)
|
||||
|
||||
if (regs->enable_mask)
|
||||
rc = regmap_update_bits(vib->regmap, regs->enable_addr,
|
||||
on ? regs->enable_mask : 0, val);
|
||||
regs->enable_mask, on ? ~0 : 0);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@@ -74,12 +74,16 @@ static int uinput_dev_event(struct input_dev *dev,
|
||||
struct uinput_device *udev = input_get_drvdata(dev);
|
||||
struct timespec64 ts;
|
||||
|
||||
udev->buff[udev->head].type = type;
|
||||
udev->buff[udev->head].code = code;
|
||||
udev->buff[udev->head].value = value;
|
||||
ktime_get_ts64(&ts);
|
||||
udev->buff[udev->head].input_event_sec = ts.tv_sec;
|
||||
udev->buff[udev->head].input_event_usec = ts.tv_nsec / NSEC_PER_USEC;
|
||||
|
||||
udev->buff[udev->head] = (struct input_event) {
|
||||
.input_event_sec = ts.tv_sec,
|
||||
.input_event_usec = ts.tv_nsec / NSEC_PER_USEC,
|
||||
.type = type,
|
||||
.code = code,
|
||||
.value = value,
|
||||
};
|
||||
|
||||
udev->head = (udev->head + 1) % UINPUT_BUFFER_SIZE;
|
||||
|
||||
wake_up_interruptible(&udev->waitq);
|
||||
@@ -689,13 +693,14 @@ static ssize_t uinput_read(struct file *file, char __user *buffer,
|
||||
static __poll_t uinput_poll(struct file *file, poll_table *wait)
|
||||
{
|
||||
struct uinput_device *udev = file->private_data;
|
||||
__poll_t mask = EPOLLOUT | EPOLLWRNORM; /* uinput is always writable */
|
||||
|
||||
poll_wait(file, &udev->waitq, wait);
|
||||
|
||||
if (udev->head != udev->tail)
|
||||
return EPOLLIN | EPOLLRDNORM;
|
||||
mask |= EPOLLIN | EPOLLRDNORM;
|
||||
|
||||
return EPOLLOUT | EPOLLWRNORM;
|
||||
return mask;
|
||||
}
|
||||
|
||||
static int uinput_release(struct inode *inode, struct file *file)
|
||||
|
@@ -250,7 +250,7 @@ struct cyapa_tsg_bin_image_data_record {
|
||||
|
||||
struct cyapa_tsg_bin_image {
|
||||
struct cyapa_tsg_bin_image_head image_head;
|
||||
struct cyapa_tsg_bin_image_data_record records[0];
|
||||
struct cyapa_tsg_bin_image_data_record records[];
|
||||
} __packed;
|
||||
|
||||
struct pip_bl_packet_start {
|
||||
@@ -271,7 +271,7 @@ struct pip_bl_cmd_head {
|
||||
u8 report_id; /* Bootloader output report id, must be 40h */
|
||||
u8 rsvd; /* Reserved, must be 0 */
|
||||
struct pip_bl_packet_start packet_start;
|
||||
u8 data[0]; /* Command data variable based on commands */
|
||||
u8 data[]; /* Command data variable based on commands */
|
||||
} __packed;
|
||||
|
||||
/* Initiate bootload command data structure. */
|
||||
@@ -300,7 +300,7 @@ struct tsg_bl_metadata_row_params {
|
||||
struct tsg_bl_flash_row_head {
|
||||
u8 flash_array_id;
|
||||
__le16 flash_row_id;
|
||||
u8 flash_data[0];
|
||||
u8 flash_data[];
|
||||
} __packed;
|
||||
|
||||
struct pip_app_cmd_head {
|
||||
@@ -314,7 +314,7 @@ struct pip_app_cmd_head {
|
||||
* Bit 6-0: command code.
|
||||
*/
|
||||
u8 cmd_code;
|
||||
u8 parameter_data[0]; /* Parameter data variable based on cmd_code */
|
||||
u8 parameter_data[]; /* Parameter data variable based on cmd_code */
|
||||
} __packed;
|
||||
|
||||
/* Application get/set parameter command data structure */
|
||||
|
@@ -190,6 +190,7 @@ static int psmouse_smbus_create_companion(struct device *dev, void *data)
|
||||
struct psmouse_smbus_dev *smbdev = data;
|
||||
unsigned short addr_list[] = { smbdev->board.addr, I2C_CLIENT_END };
|
||||
struct i2c_adapter *adapter;
|
||||
struct i2c_client *client;
|
||||
|
||||
adapter = i2c_verify_adapter(dev);
|
||||
if (!adapter)
|
||||
@@ -198,12 +199,13 @@ static int psmouse_smbus_create_companion(struct device *dev, void *data)
|
||||
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_HOST_NOTIFY))
|
||||
return 0;
|
||||
|
||||
smbdev->client = i2c_new_probed_device(adapter, &smbdev->board,
|
||||
addr_list, NULL);
|
||||
if (!smbdev->client)
|
||||
client = i2c_new_scanned_device(adapter, &smbdev->board,
|
||||
addr_list, NULL);
|
||||
if (IS_ERR(client))
|
||||
return 0;
|
||||
|
||||
/* We have our(?) device, stop iterating i2c bus. */
|
||||
smbdev->client = client;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@@ -167,7 +167,7 @@ static int pxa930_trkball_probe(struct platform_device *pdev)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
trkball->mmio_base = ioremap_nocache(res->start, resource_size(res));
|
||||
trkball->mmio_base = ioremap(res->start, resource_size(res));
|
||||
if (!trkball->mmio_base) {
|
||||
dev_err(&pdev->dev, "failed to ioremap registers\n");
|
||||
error = -ENXIO;
|
||||
|
@@ -146,7 +146,6 @@ static const char * const topbuttonpad_pnp_ids[] = {
|
||||
"LEN0042", /* Yoga */
|
||||
"LEN0045",
|
||||
"LEN0047",
|
||||
"LEN0049",
|
||||
"LEN2000", /* S540 */
|
||||
"LEN2001", /* Edge E431 */
|
||||
"LEN2002", /* Edge E531 */
|
||||
@@ -166,9 +165,11 @@ static const char * const smbus_pnp_ids[] = {
|
||||
/* all of the topbuttonpad_pnp_ids are valid, we just add some extras */
|
||||
"LEN0048", /* X1 Carbon 3 */
|
||||
"LEN0046", /* X250 */
|
||||
"LEN0049", /* Yoga 11e */
|
||||
"LEN004a", /* W541 */
|
||||
"LEN005b", /* P50 */
|
||||
"LEN005e", /* T560 */
|
||||
"LEN006c", /* T470s */
|
||||
"LEN0071", /* T480 */
|
||||
"LEN0072", /* X1 Carbon Gen 5 (2017) - Elan/ALPS trackpoint */
|
||||
"LEN0073", /* X1 Carbon G5 (Elantech) */
|
||||
@@ -179,11 +180,13 @@ static const char * const smbus_pnp_ids[] = {
|
||||
"LEN0097", /* X280 -> ALPS trackpoint */
|
||||
"LEN009b", /* T580 */
|
||||
"LEN200f", /* T450s */
|
||||
"LEN2044", /* L470 */
|
||||
"LEN2054", /* E480 */
|
||||
"LEN2055", /* E580 */
|
||||
"SYN3052", /* HP EliteBook 840 G4 */
|
||||
"SYN3221", /* HP 15-ay000 */
|
||||
"SYN323d", /* HP Spectre X360 13-w013dx */
|
||||
"SYN3257", /* HP Envy 13-ad105ng */
|
||||
NULL
|
||||
};
|
||||
|
||||
|
@@ -1203,8 +1203,8 @@ static int rmi_f11_initialize(struct rmi_function *fn)
|
||||
* If distance threshold values are set, switch to reduced reporting
|
||||
* mode so they actually get used by the controller.
|
||||
*/
|
||||
if (ctrl->ctrl0_11[RMI_F11_DELTA_X_THRESHOLD] ||
|
||||
ctrl->ctrl0_11[RMI_F11_DELTA_Y_THRESHOLD]) {
|
||||
if (sensor->axis_align.delta_x_threshold ||
|
||||
sensor->axis_align.delta_y_threshold) {
|
||||
ctrl->ctrl0_11[0] &= ~RMI_F11_REPORT_MODE_MASK;
|
||||
ctrl->ctrl0_11[0] |= RMI_F11_REPORT_MODE_REDUCED;
|
||||
}
|
||||
|
@@ -24,6 +24,12 @@
|
||||
#define F54_NUM_TX_OFFSET 1
|
||||
#define F54_NUM_RX_OFFSET 0
|
||||
|
||||
/*
|
||||
* The smbus protocol can read only 32 bytes max at a time.
|
||||
* But this should be fine for i2c/spi as well.
|
||||
*/
|
||||
#define F54_REPORT_DATA_SIZE 32
|
||||
|
||||
/* F54 commands */
|
||||
#define F54_GET_REPORT 1
|
||||
#define F54_FORCE_CAL 2
|
||||
@@ -526,6 +532,7 @@ static void rmi_f54_work(struct work_struct *work)
|
||||
int report_size;
|
||||
u8 command;
|
||||
int error;
|
||||
int i;
|
||||
|
||||
report_size = rmi_f54_get_report_size(f54);
|
||||
if (report_size == 0) {
|
||||
@@ -558,23 +565,27 @@ static void rmi_f54_work(struct work_struct *work)
|
||||
|
||||
rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Get report command completed, reading data\n");
|
||||
|
||||
fifo[0] = 0;
|
||||
fifo[1] = 0;
|
||||
error = rmi_write_block(fn->rmi_dev,
|
||||
fn->fd.data_base_addr + F54_FIFO_OFFSET,
|
||||
fifo, sizeof(fifo));
|
||||
if (error) {
|
||||
dev_err(&fn->dev, "Failed to set fifo start offset\n");
|
||||
goto abort;
|
||||
}
|
||||
for (i = 0; i < report_size; i += F54_REPORT_DATA_SIZE) {
|
||||
int size = min(F54_REPORT_DATA_SIZE, report_size - i);
|
||||
|
||||
error = rmi_read_block(fn->rmi_dev, fn->fd.data_base_addr +
|
||||
F54_REPORT_DATA_OFFSET, f54->report_data,
|
||||
report_size);
|
||||
if (error) {
|
||||
dev_err(&fn->dev, "%s: read [%d bytes] returned %d\n",
|
||||
__func__, report_size, error);
|
||||
goto abort;
|
||||
fifo[0] = i & 0xff;
|
||||
fifo[1] = i >> 8;
|
||||
error = rmi_write_block(fn->rmi_dev,
|
||||
fn->fd.data_base_addr + F54_FIFO_OFFSET,
|
||||
fifo, sizeof(fifo));
|
||||
if (error) {
|
||||
dev_err(&fn->dev, "Failed to set fifo start offset\n");
|
||||
goto abort;
|
||||
}
|
||||
|
||||
error = rmi_read_block(fn->rmi_dev, fn->fd.data_base_addr +
|
||||
F54_REPORT_DATA_OFFSET,
|
||||
f54->report_data + i, size);
|
||||
if (error) {
|
||||
dev_err(&fn->dev, "%s: read [%d bytes] returned %d\n",
|
||||
__func__, size, error);
|
||||
goto abort;
|
||||
}
|
||||
}
|
||||
|
||||
abort:
|
||||
|
@@ -163,6 +163,7 @@ static int rmi_smb_write_block(struct rmi_transport_dev *xport, u16 rmiaddr,
|
||||
/* prepare to write next block of bytes */
|
||||
cur_len -= SMB_MAX_COUNT;
|
||||
databuff += SMB_MAX_COUNT;
|
||||
rmiaddr += SMB_MAX_COUNT;
|
||||
}
|
||||
exit:
|
||||
mutex_unlock(&rmi_smb->page_mutex);
|
||||
@@ -214,6 +215,7 @@ static int rmi_smb_read_block(struct rmi_transport_dev *xport, u16 rmiaddr,
|
||||
/* prepare to read next block of bytes */
|
||||
cur_len -= SMB_MAX_COUNT;
|
||||
databuff += SMB_MAX_COUNT;
|
||||
rmiaddr += SMB_MAX_COUNT;
|
||||
}
|
||||
|
||||
retval = 0;
|
||||
|
@@ -349,7 +349,7 @@ static int __init gscps2_probe(struct parisc_device *dev)
|
||||
|
||||
ps2port->port = serio;
|
||||
ps2port->padev = dev;
|
||||
ps2port->addr = ioremap_nocache(hpa, GSC_STATUS + 4);
|
||||
ps2port->addr = ioremap(hpa, GSC_STATUS + 4);
|
||||
spin_lock_init(&ps2port->lock);
|
||||
|
||||
gscps2_reset(ps2port);
|
||||
|
@@ -259,6 +259,8 @@ static int hv_kbd_connect_to_vsp(struct hv_device *hv_dev)
|
||||
u32 proto_status;
|
||||
int error;
|
||||
|
||||
reinit_completion(&kbd_dev->wait_event);
|
||||
|
||||
request = &kbd_dev->protocol_req;
|
||||
memset(request, 0, sizeof(struct synth_kbd_protocol_request));
|
||||
request->header.type = __cpu_to_le32(SYNTH_KBD_PROTOCOL_REQUEST);
|
||||
@@ -380,6 +382,29 @@ static int hv_kbd_remove(struct hv_device *hv_dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hv_kbd_suspend(struct hv_device *hv_dev)
|
||||
{
|
||||
vmbus_close(hv_dev->channel);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hv_kbd_resume(struct hv_device *hv_dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = vmbus_open(hv_dev->channel,
|
||||
KBD_VSC_SEND_RING_BUFFER_SIZE,
|
||||
KBD_VSC_RECV_RING_BUFFER_SIZE,
|
||||
NULL, 0,
|
||||
hv_kbd_on_channel_callback,
|
||||
hv_dev);
|
||||
if (ret == 0)
|
||||
ret = hv_kbd_connect_to_vsp(hv_dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct hv_vmbus_device_id id_table[] = {
|
||||
/* Keyboard guid */
|
||||
{ HV_KBD_GUID, },
|
||||
@@ -393,6 +418,8 @@ static struct hv_driver hv_kbd_drv = {
|
||||
.id_table = id_table,
|
||||
.probe = hv_kbd_probe,
|
||||
.remove = hv_kbd_remove,
|
||||
.suspend = hv_kbd_suspend,
|
||||
.resume = hv_kbd_resume,
|
||||
.driver = {
|
||||
.probe_type = PROBE_PREFER_ASYNCHRONOUS,
|
||||
},
|
||||
|
@@ -1713,7 +1713,7 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
aiptek->inputdev = inputdev;
|
||||
aiptek->intf = intf;
|
||||
aiptek->ifnum = intf->altsetting[0].desc.bInterfaceNumber;
|
||||
aiptek->ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
|
||||
aiptek->inDelay = 0;
|
||||
aiptek->endDelay = 0;
|
||||
aiptek->previousJitterable = 0;
|
||||
@@ -1802,14 +1802,14 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0);
|
||||
|
||||
/* Verify that a device really has an endpoint */
|
||||
if (intf->altsetting[0].desc.bNumEndpoints < 1) {
|
||||
if (intf->cur_altsetting->desc.bNumEndpoints < 1) {
|
||||
dev_err(&intf->dev,
|
||||
"interface has %d endpoints, but must have minimum 1\n",
|
||||
intf->altsetting[0].desc.bNumEndpoints);
|
||||
intf->cur_altsetting->desc.bNumEndpoints);
|
||||
err = -EINVAL;
|
||||
goto fail3;
|
||||
}
|
||||
endpoint = &intf->altsetting[0].endpoint[0].desc;
|
||||
endpoint = &intf->cur_altsetting->endpoint[0].desc;
|
||||
|
||||
/* Go set up our URB, which is called when the tablet receives
|
||||
* input.
|
||||
|
@@ -875,18 +875,14 @@ static int gtco_probe(struct usb_interface *usbinterface,
|
||||
}
|
||||
|
||||
/* Sanity check that a device has an endpoint */
|
||||
if (usbinterface->altsetting[0].desc.bNumEndpoints < 1) {
|
||||
if (usbinterface->cur_altsetting->desc.bNumEndpoints < 1) {
|
||||
dev_err(&usbinterface->dev,
|
||||
"Invalid number of endpoints\n");
|
||||
error = -EINVAL;
|
||||
goto err_free_urb;
|
||||
}
|
||||
|
||||
/*
|
||||
* The endpoint is always altsetting 0, we know this since we know
|
||||
* this device only has one interrupt endpoint
|
||||
*/
|
||||
endpoint = &usbinterface->altsetting[0].endpoint[0].desc;
|
||||
endpoint = &usbinterface->cur_altsetting->endpoint[0].desc;
|
||||
|
||||
/* Some debug */
|
||||
dev_dbg(&usbinterface->dev, "gtco # interfaces: %d\n", usbinterface->num_altsetting);
|
||||
@@ -896,7 +892,8 @@ static int gtco_probe(struct usb_interface *usbinterface,
|
||||
if (usb_endpoint_xfer_int(endpoint))
|
||||
dev_dbg(&usbinterface->dev, "endpoint: we have interrupt endpoint\n");
|
||||
|
||||
dev_dbg(&usbinterface->dev, "endpoint extra len:%d\n", usbinterface->altsetting[0].extralen);
|
||||
dev_dbg(&usbinterface->dev, "interface extra len:%d\n",
|
||||
usbinterface->cur_altsetting->extralen);
|
||||
|
||||
/*
|
||||
* Find the HID descriptor so we can find out the size of the
|
||||
@@ -973,8 +970,6 @@ static int gtco_probe(struct usb_interface *usbinterface,
|
||||
input_dev->dev.parent = &usbinterface->dev;
|
||||
|
||||
/* Setup the URB, it will be posted later on open of input device */
|
||||
endpoint = &usbinterface->altsetting[0].endpoint[0].desc;
|
||||
|
||||
usb_fill_int_urb(gtco->urbinfo,
|
||||
udev,
|
||||
usb_rcvintpipe(udev,
|
||||
|
@@ -275,7 +275,7 @@ static int pegasus_probe(struct usb_interface *intf,
|
||||
return -ENODEV;
|
||||
|
||||
/* Sanity check that the device has an endpoint */
|
||||
if (intf->altsetting[0].desc.bNumEndpoints < 1) {
|
||||
if (intf->cur_altsetting->desc.bNumEndpoints < 1) {
|
||||
dev_err(&intf->dev, "Invalid number of endpoints\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@@ -167,6 +167,36 @@ static const struct ili2xxx_chip ili211x_chip = {
|
||||
.resolution = 2048,
|
||||
};
|
||||
|
||||
static bool ili212x_touchdata_to_coords(const u8 *touchdata,
|
||||
unsigned int finger,
|
||||
unsigned int *x, unsigned int *y)
|
||||
{
|
||||
u16 val;
|
||||
|
||||
val = get_unaligned_be16(touchdata + 3 + (finger * 5) + 0);
|
||||
if (!(val & BIT(15))) /* Touch indication */
|
||||
return false;
|
||||
|
||||
*x = val & 0x3fff;
|
||||
*y = get_unaligned_be16(touchdata + 3 + (finger * 5) + 2);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool ili212x_check_continue_polling(const u8 *data, bool touch)
|
||||
{
|
||||
return touch;
|
||||
}
|
||||
|
||||
static const struct ili2xxx_chip ili212x_chip = {
|
||||
.read_reg = ili210x_read_reg,
|
||||
.get_touch_data = ili210x_read_touch_data,
|
||||
.parse_touch_data = ili212x_touchdata_to_coords,
|
||||
.continue_polling = ili212x_check_continue_polling,
|
||||
.max_touches = 10,
|
||||
.has_calibrate_reg = true,
|
||||
};
|
||||
|
||||
static int ili251x_read_reg(struct i2c_client *client,
|
||||
u8 reg, void *buf, size_t len)
|
||||
{
|
||||
@@ -321,7 +351,7 @@ static umode_t ili210x_calibrate_visible(struct kobject *kobj,
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct ili210x *priv = i2c_get_clientdata(client);
|
||||
|
||||
return priv->chip->has_calibrate_reg;
|
||||
return priv->chip->has_calibrate_reg ? attr->mode : 0;
|
||||
}
|
||||
|
||||
static const struct attribute_group ili210x_attr_group = {
|
||||
@@ -447,6 +477,7 @@ static int ili210x_i2c_probe(struct i2c_client *client,
|
||||
static const struct i2c_device_id ili210x_i2c_id[] = {
|
||||
{ "ili210x", (long)&ili210x_chip },
|
||||
{ "ili2117", (long)&ili211x_chip },
|
||||
{ "ili2120", (long)&ili212x_chip },
|
||||
{ "ili251x", (long)&ili251x_chip },
|
||||
{ }
|
||||
};
|
||||
@@ -455,6 +486,7 @@ MODULE_DEVICE_TABLE(i2c, ili210x_i2c_id);
|
||||
static const struct of_device_id ili210x_dt_ids[] = {
|
||||
{ .compatible = "ilitek,ili210x", .data = &ili210x_chip },
|
||||
{ .compatible = "ilitek,ili2117", .data = &ili211x_chip },
|
||||
{ .compatible = "ilitek,ili2120", .data = &ili212x_chip },
|
||||
{ .compatible = "ilitek,ili251x", .data = &ili251x_chip },
|
||||
{ }
|
||||
};
|
||||
|
@@ -432,7 +432,7 @@ static int raydium_i2c_write_object(struct i2c_client *client,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool raydium_i2c_boot_trigger(struct i2c_client *client)
|
||||
static int raydium_i2c_boot_trigger(struct i2c_client *client)
|
||||
{
|
||||
static const u8 cmd[7][6] = {
|
||||
{ 0x08, 0x0C, 0x09, 0x00, 0x50, 0xD7 },
|
||||
@@ -457,10 +457,10 @@ static bool raydium_i2c_boot_trigger(struct i2c_client *client)
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool raydium_i2c_fw_trigger(struct i2c_client *client)
|
||||
static int raydium_i2c_fw_trigger(struct i2c_client *client)
|
||||
{
|
||||
static const u8 cmd[5][11] = {
|
||||
{ 0, 0x09, 0x71, 0x0C, 0x09, 0x00, 0x50, 0xD7, 0, 0, 0 },
|
||||
@@ -483,7 +483,7 @@ static bool raydium_i2c_fw_trigger(struct i2c_client *client)
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int raydium_i2c_check_path(struct i2c_client *client)
|
||||
|
@@ -237,6 +237,7 @@ static int sun4i_ts_probe(struct platform_device *pdev)
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
struct device *hwmon;
|
||||
struct thermal_zone_device *thermal;
|
||||
int error;
|
||||
u32 reg;
|
||||
bool ts_attached;
|
||||
@@ -355,7 +356,10 @@ static int sun4i_ts_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(hwmon))
|
||||
return PTR_ERR(hwmon);
|
||||
|
||||
devm_thermal_zone_of_sensor_register(ts->dev, 0, ts, &sun4i_ts_tz_ops);
|
||||
thermal = devm_thermal_zone_of_sensor_register(ts->dev, 0, ts,
|
||||
&sun4i_ts_tz_ops);
|
||||
if (IS_ERR(thermal))
|
||||
return PTR_ERR(thermal);
|
||||
|
||||
writel(TEMP_IRQ_EN(1), ts->base + TP_INT_FIFOC);
|
||||
|
||||
|
@@ -661,7 +661,7 @@ static int sur40_probe(struct usb_interface *interface,
|
||||
int error;
|
||||
|
||||
/* Check if we really have the right interface. */
|
||||
iface_desc = &interface->altsetting[0];
|
||||
iface_desc = interface->cur_altsetting;
|
||||
if (iface_desc->desc.bInterfaceClass != 0xFF)
|
||||
return -ENODEV;
|
||||
|
||||
|
Reference in New Issue
Block a user