Merge branch 'for-5.1/i2c-hid' into for-linus
Fix dmesg flood for Elan touchpanels which are too slow to assert IRQ from Kai-Heng Feng
Цей коміт міститься в:
@@ -259,33 +259,22 @@ static int write_ipc_from_queue(struct ishtp_device *dev)
|
||||
int i;
|
||||
void (*ipc_send_compl)(void *);
|
||||
void *ipc_send_compl_prm;
|
||||
static int out_ipc_locked;
|
||||
unsigned long out_ipc_flags;
|
||||
|
||||
if (dev->dev_state == ISHTP_DEV_DISABLED)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&dev->out_ipc_spinlock, out_ipc_flags);
|
||||
if (out_ipc_locked) {
|
||||
spin_unlock_irqrestore(&dev->out_ipc_spinlock, out_ipc_flags);
|
||||
return -EBUSY;
|
||||
}
|
||||
out_ipc_locked = 1;
|
||||
if (!ish_is_input_ready(dev)) {
|
||||
out_ipc_locked = 0;
|
||||
spin_unlock_irqrestore(&dev->out_ipc_spinlock, out_ipc_flags);
|
||||
return -EBUSY;
|
||||
}
|
||||
spin_unlock_irqrestore(&dev->out_ipc_spinlock, out_ipc_flags);
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&dev->wr_processing_spinlock, flags);
|
||||
if (!ish_is_input_ready(dev)) {
|
||||
spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/*
|
||||
* if tx send list is empty - return 0;
|
||||
* may happen, as RX_COMPLETE handler doesn't check list emptiness.
|
||||
*/
|
||||
if (list_empty(&dev->wr_processing_list)) {
|
||||
spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags);
|
||||
out_ipc_locked = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -328,6 +317,8 @@ static int write_ipc_from_queue(struct ishtp_device *dev)
|
||||
memcpy(®, &r_buf[length >> 2], rem);
|
||||
ish_reg_write(dev, reg_addr, reg);
|
||||
}
|
||||
ish_reg_write(dev, IPC_REG_HOST2ISH_DRBL, doorbell_val);
|
||||
|
||||
/* Flush writes to msg registers and doorbell */
|
||||
ish_reg_read(dev, IPC_REG_ISH_HOST_FWSTS);
|
||||
|
||||
@@ -335,9 +326,6 @@ static int write_ipc_from_queue(struct ishtp_device *dev)
|
||||
++dev->ipc_tx_cnt;
|
||||
dev->ipc_tx_bytes_cnt += IPC_HEADER_GET_LENGTH(doorbell_val);
|
||||
|
||||
ish_reg_write(dev, IPC_REG_HOST2ISH_DRBL, doorbell_val);
|
||||
out_ipc_locked = 0;
|
||||
|
||||
ipc_send_compl = ipc_link->ipc_send_compl;
|
||||
ipc_send_compl_prm = ipc_link->ipc_send_compl_prm;
|
||||
list_del_init(&ipc_link->link);
|
||||
@@ -917,7 +905,6 @@ struct ishtp_device *ish_dev_init(struct pci_dev *pdev)
|
||||
init_waitqueue_head(&dev->wait_hw_ready);
|
||||
|
||||
spin_lock_init(&dev->wr_processing_spinlock);
|
||||
spin_lock_init(&dev->out_ipc_spinlock);
|
||||
|
||||
/* Init IPC processing and free lists */
|
||||
INIT_LIST_HEAD(&dev->wr_processing_list);
|
||||
|
Посилання в новій задачі
Заблокувати користувача