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); }