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);
}
Exemple #2
0
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;
}