mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-10 14:19:09 -04:00
use request_threaded_irq to handle TP events.
TP: 1. When using the request_irq, the level trigger type caused an abnormal interruption on the sm8350 platform, and even an interruption storm. 2. In the request_irq, the "fts_event_handler" function will be passed to handler, and the handler is still called in hard interrupt context. I think it is better to use request_threaded_irq function to handle events. Change-Id: Ie1b7275306d0d498d5e550756f5be20f557107fb Reviewed-on: https://gerrit.mot.com/1942457 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Konstantin Makariev <kmakariev@motorola.com> Submit-Approved: Jira Key
This commit is contained in:
parent
3e0c089633
commit
6ddecedc20
1 changed files with 7 additions and 51 deletions
|
|
@ -127,7 +127,6 @@ extern spinlock_t fts_int;
|
|||
|
||||
|
||||
|
||||
static void fts_interrupt_enable(struct fts_ts_info *info);
|
||||
static int fts_mode_handler(struct fts_ts_info *info, int force);
|
||||
|
||||
|
||||
|
|
@ -2760,9 +2759,9 @@ static void fts_user_report_event_handler(struct fts_ts_info *info, unsigned
|
|||
* the FIFO and dispatch them to the proper event handler according the event
|
||||
* ID
|
||||
*/
|
||||
static void fts_event_handler(struct work_struct *work)
|
||||
static irqreturn_t fts_event_handler(int irq, void *ptr)
|
||||
{
|
||||
struct fts_ts_info *info;
|
||||
struct fts_ts_info *info = (struct fts_ts_info *)ptr;
|
||||
int error = 0, count = 0;
|
||||
unsigned char regAdd;
|
||||
unsigned char data[FIFO_EVENT_SIZE] = { 0 };
|
||||
|
|
@ -2770,13 +2769,9 @@ static void fts_event_handler(struct work_struct *work)
|
|||
|
||||
event_dispatch_handler_t event_handler;
|
||||
|
||||
info = container_of(work, struct fts_ts_info, work);
|
||||
|
||||
PM_WAKEUP_EVENT(info->wakesrc, jiffies_to_msecs(HZ));
|
||||
|
||||
/* read the FIFO and parsing events */
|
||||
|
||||
|
||||
regAdd = FIFO_CMD_READONE;
|
||||
|
||||
for (count = 0; count < FIFO_DEPTH; count++) {
|
||||
|
|
@ -2807,10 +2802,7 @@ static void fts_event_handler(struct work_struct *work)
|
|||
}
|
||||
input_sync(info->input_dev);
|
||||
|
||||
|
||||
/* re-enable interrupts */
|
||||
|
||||
fts_interrupt_enable(info);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
/** @}*/
|
||||
|
||||
|
|
@ -3046,29 +3038,6 @@ int fts_chip_initialization(struct fts_ts_info *info, int init_type)
|
|||
return ret2;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup isr
|
||||
* @{
|
||||
*/
|
||||
/**
|
||||
* Top half Interrupt handler function
|
||||
* Respond to the interrupt and schedule the bottom half interrupt handler
|
||||
* in its work queue
|
||||
* @see fts_event_handler()
|
||||
*/
|
||||
static irqreturn_t fts_interrupt_handler(int irq, void *handle)
|
||||
{
|
||||
struct fts_ts_info *info = handle;
|
||||
|
||||
disable_irq_nosync(info->client->irq);
|
||||
|
||||
queue_work(info->event_wq, &info->work);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initialize the dispatch table with the event handlers for any possible event
|
||||
* ID
|
||||
|
|
@ -3099,12 +3068,10 @@ static int fts_interrupt_install(struct fts_ts_info *info)
|
|||
install_handler(info, STATUS_UPDATE, status);
|
||||
install_handler(info, USER_REPORT, user_report);
|
||||
|
||||
/* disable interrupts in any case */
|
||||
error = fts_disableInterrupt();
|
||||
|
||||
if (request_irq(info->client->irq, fts_interrupt_handler,
|
||||
IRQF_TRIGGER_LOW, FTS_TS_DRV_NAME, info)) {
|
||||
logError(1, "%s Request irq failed\n", tag);
|
||||
error = request_threaded_irq(info->client->irq, NULL, fts_event_handler,
|
||||
IRQF_TRIGGER_LOW|IRQF_ONESHOT, FTS_TS_DRV_NAME, info);
|
||||
if (error < 0) {
|
||||
logError(1, "%s Request threaded irq failed\n", tag);
|
||||
kfree(info->event_dispatch_table);
|
||||
error = -EBUSY;
|
||||
}
|
||||
|
|
@ -3126,15 +3093,6 @@ void fts_interrupt_uninstall(struct fts_ts_info *info)
|
|||
free_irq(info->client->irq, info);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable the host side interrupt
|
||||
*/
|
||||
static void fts_interrupt_enable(struct fts_ts_info *info)
|
||||
{
|
||||
/* logError(0, "%s %s : enable interrupts!\n",tag,__func__); */
|
||||
enable_irq(info->client->irq);
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
/**
|
||||
|
|
@ -4198,8 +4156,6 @@ static int fts_probe(struct spi_device *client)
|
|||
goto ProbeErrorExit_4;
|
||||
}
|
||||
|
||||
INIT_WORK(&info->work, fts_event_handler);
|
||||
|
||||
INIT_WORK(&info->resume_work, fts_resume_work);
|
||||
INIT_WORK(&info->suspend_work, fts_suspend_work);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue