static void tcpal_work_parse_stream(struct work_struct *_param) { u64 diff = tcpal_diff_time(tcbd_irq_handler_data.start_tick); struct tcbd_irq_data *irq_data = container_of(_param, struct tcbd_irq_data, work); /* for checking delay of workqueue */ if (diff > 10) tcbd_debug(DEBUG_INTRRUPT, "diff work start and process :%d\n", (s32)diff); tcpal_split_stream(irq_data); enable_irq(irq_data->tcbd_irq); }
static irqreturn_t tcpal_irq_handler(s32 _irq, void *_param) { struct tcbd_irq_data *irq_data = (struct tcbd_irq_data *)_param; struct tcbd_device *device = irq_data->device; disable_irq_nosync(irq_data->tcbd_irq); if (device->is_pal_irq_en) { #if defined(__WORKQUEUE__) irq_data->start_tick = tcpal_get_time(); queue_work(irq_data->work_queue, &irq_data->work); #else /*__WORKQUEUE__*/ tcpal_split_stream(irq_data); #endif /*!__WORKQUEUE__*/ tcbd_debug(DEBUG_INTRRUPT, "\n"); } return IRQ_HANDLED; }