static int ssp_sensorhub_send_big_data(struct ssp_sensorhub_data *hub_data,
					const char *buf, int count)
{
	int length = count - 3;
	int ret = 0;

	/* only support voice service for the moment */
	if (buf[1] != TYPE_WAKE_UP_VOICE_SERVICE) {
		sensorhub_err("not voice service(%d)", buf[1]);
		return -EINVAL;
	}

	/* am or grammer data? */
	if (buf[2] != TYPE_WAKE_UP_VOICE_SOUND_SOURCE_AM &&
		buf[2] != TYPE_WAKE_UP_VOICE_SOUND_SOURCE_GRAMMER) {
		sensorhub_err("voice data type err(%d)", buf[2]);
		return -EINVAL;
	}

	hub_data->big_send_events.library_data
		= kzalloc(length * sizeof(char), GFP_KERNEL);
	if (unlikely(!hub_data->big_send_events.library_data)) {
		sensorhub_err("allocate memory for big library err");
		return -ENOMEM;
	}

	memcpy(hub_data->big_send_events.library_data, buf+3, length);
	hub_data->big_send_events.library_length = length;

	/* trigger big data transfer */
	ret = set_big_data_start(hub_data->ssp_data, buf[2]+1, length);
	if (ret != SUCCESS) {
		sensorhub_err("set_big_data_start err(%d)", ret);
		goto exit;
	}

	/* wait until write operation is done */
	ret = wait_for_completion_timeout(&hub_data->big_write_done,
		COMPLETION_TIMEOUT + 1*HZ);
	if (unlikely(!ret)) {
		sensorhub_err("wait timed out");
		ret = -EBUSY;
	} else if (unlikely(ret < 0)) {
		sensorhub_err("wait for completion err(%d)", ret);
		ret = -EIO;
	}

exit:
	kfree(hub_data->big_send_events.library_data);
	return !ret ? ret + 1 : ret;
}
ssize_t mcu_dump_show(struct device *dev, struct device_attribute *attr,
		char *buf) {
	struct ssp_data *data = dev_get_drvdata(dev);
	int status = 1, iDelaycnt = 0;

	data->bDumping = true;
	set_big_data_start(data, BIG_TYPE_DUMP, 0);
	msleep(300);
	while (data->bDumping) {
		mdelay(10);
		if (iDelaycnt++ > 1000) {
			status = 0;
			break;
		}
	}
	return sprintf(buf, "%s\n", status ? "OK" : "NG");
}
int ssp_sensorhub_pcm_dump(struct ssp_sensorhub_data *hub_data)
{
	hub_data->pcm_cnt++;
	return set_big_data_start(hub_data->ssp_data, BIG_TYPE_VOICE_PCM, 0);
}