static void tcc3170_pull_data(void) { s32 size, ret = 0; s8 irq_status; s8 irq_error; static u8 buff_read[TCBD_MAX_THRESHOLD*2]; if (!tcc3170_pwr_on) return; mutex_lock(&tcc3170_mutex); ret = tcbd_read_irq_status(&tcc3170_device, &irq_status, &irq_error); ret |= tcbd_clear_irq(&tcc3170_device, irq_status); ret |= tcbd_read_stream(&tcc3170_device, buff_read, &size); if (ret == 0 && !irq_error) { tcbd_split_stream(0, buff_read, size); } else { DPRINTK("### buffer is full, skip the data " "(ret:%d, status=0x%02X, error=0x%02X) ###\n", ret, irq_status, irq_error); tcbd_init_stream_data_config(&tcc3170_device, ENABLE_CMD_FIFO, tcc3170_device.selected_buff, tcc3170_device.intr_threshold); /*tcbd_reset_ip(device, TCBD_SYS_COMP_ALL, TCBD_SYS_COMP_EP);*/ tcbd_init_parser(0, NULL); } mutex_unlock(&tcc3170_mutex); }
static inline void tcpal_split_stream(struct tcbd_irq_data *irq_data) { s32 size, ret = 0; s8 irq_status; s8 irq_error; static u8 buff_read[TCBD_MAX_THRESHOLD*2]; struct tcbd_device *device = irq_data->device; ret = tcbd_read_irq_status(device, &irq_status, &irq_error); ret |= tcbd_clear_irq(device, irq_status); ret |= tcbd_read_stream(device, buff_read, &size); if (ret == 0 && !irq_error) tcbd_split_stream(0, buff_read, size); else { tcbd_debug(DEBUG_ERROR, "### buffer is full, skip the data " "(ret:%d, status=0x%02X, error=0x%02X, %d) ###\n", ret, irq_status, irq_error, (s32)tcpal_diff_time(irq_data->start_tick)); tcbd_init_stream_data_config(device, ENABLE_CMD_FIFO, device->selected_buff, device->intr_threshold); /*tcbd_reset_ip(device, TCBD_SYS_COMP_ALL, TCBD_SYS_COMP_EP);*/ tcbd_init_parser(0, NULL); } }
s32 tcpal_irq_enable(void) { tcbd_init_parser(NULL); tcbd_debug(DEBUG_INTRRUPT, "\n"); /* enable_irq(tcbd_irq_handler_data.tcbd_irq); */ return 0; }
s32 tcpal_irq_enable(void) { #if defined(__CSPI_ONLY__) tcbd_init_parser(0, NULL); #endif /*__CSPI_ONLY__*/ tcbd_debug(DEBUG_INTRRUPT, "\n"); enable_irq(tcbd_irq_handler_data.tcbd_irq); return 0; }
static bool tcc3170_init(void) { #if defined(__CSPI_ONLY__) tcpal_set_cspi_io_function(); #else #error #endif tcbd_init_parser(0, __stream_callback); return true; }
s32 tcpal_irq_register_handler(void *_device) { s32 ret; #if defined(__WORKQUEUE__) tcbd_irq_handler_data.work_queue = create_singlethread_workqueue("tdmb_work"); tcbd_irq_handler_data.device = (struct tcbd_device *)_device; #if defined(__USE_TC_CPU__) tcbd_irq_handler_data.tcbd_irq = IRQ_TC317X; #endif /*__USE_TC_CPU__*/ INIT_WORK(&tcbd_irq_handler_data.work, tcpal_stream_parsing_work); #endif /*__WORKQUEUE__*/ tcbd_init_parser(tcpal_irq_stream_callback); ret = request_irq( tcbd_irq_handler_data.tcbd_irq, tcpal_irq_handler, IRQF_TRIGGER_FALLING | IRQF_DISABLED, "tdmb_irq", &tcbd_irq_handler_data); tcbd_debug(DEBUG_INTRRUPT, "request_irq : %d\n", (int)ret); return ret; }