int q6lsm_register_sound_model(struct lsm_client *client,
                               enum lsm_detection_mode mode, u16 minkeyword,
                               u16 minuser, bool detectfailure)
{
    int rc;
    struct lsm_cmd_reg_snd_model cmd;

    memset(&cmd, 0, sizeof(cmd));
    if (mode == LSM_MODE_KEYWORD_ONLY_DETECTION) {
        client->mode = 0x01;
    } else if (mode == LSM_MODE_USER_KEYWORD_DETECTION) {
        client->mode = 0x03;
    } else {
        pr_err("%s: Incorrect detection mode %d\n", __func__, mode);
        return -EINVAL;
    }
    client->mode |= detectfailure << 2;
    client->kw_sensitivity = minkeyword;
    client->user_sensitivity = minuser;
    client->connect_to_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX;

    rc = q6lsm_set_params(client);
    if (rc < 0) {
        pr_err("%s: Failed to set lsm config params\n", __func__);
        return rc;
    }
    rc = q6lsm_send_cal(client);
    if (rc < 0) {
        pr_err("%s: Failed to send calibration data\n", __func__);
        return rc;
    }

    q6lsm_add_hdr(client, &cmd.hdr, sizeof(cmd), true);
    cmd.hdr.opcode = LSM_SESSION_CMD_REGISTER_SOUND_MODEL;
    cmd.model_addr_lsw = lower_32_bits(client->sound_model.phys);
    cmd.model_addr_msw = upper_32_bits(client->sound_model.phys);
    cmd.model_size = client->sound_model.size;
    /* read updated mem_map_handle by q6lsm_mmapcallback */
    rmb();
    cmd.mem_map_handle = client->sound_model.mem_map_handle;

    pr_debug("%s: addr %pa, size %d, handle %x\n", __func__,
             &client->sound_model.phys, cmd.model_size, cmd.mem_map_handle);
    rc = q6lsm_apr_send_pkt(client, client->apr, &cmd, true, NULL);
    if (rc)
        pr_err("%s: Failed cmd op[0x%x]rc[%d]\n", __func__,
               cmd.hdr.opcode, rc);
    else
        pr_debug("%s: Register sound model succeeded\n", __func__);

    return rc;
}
Пример #2
0
int q6lsm_set_data(struct lsm_client *client,
			   enum lsm_detection_mode mode,
			   bool detectfailure)
{
	int rc = 0;

	if (!client->confidence_levels) {
		/*
		 * It is possible that confidence levels are
		 * not provided. This is not a error condition.
		 * Return gracefully without any error
		 */
		pr_debug("%s: no conf levels to set\n",
			__func__);
		return rc;
	}

	if (mode == LSM_MODE_KEYWORD_ONLY_DETECTION) {
		client->mode = 0x01;
	} else if (mode == LSM_MODE_USER_KEYWORD_DETECTION) {
		client->mode = 0x03;
	} else {
		pr_err("%s: Incorrect detection mode %d\n", __func__, mode);
		rc = -EINVAL;
		goto err_ret;
	}
	client->mode |= detectfailure << 2;
	client->connect_to_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX;

	rc = q6lsm_set_params(client);
	if (rc < 0) {
		pr_err("%s: Failed to set lsm config params %d\n",
			__func__, rc);
		goto err_ret;
	}
	rc = q6lsm_send_cal(client);
	if (rc < 0) {
		pr_err("%s: Failed to send calibration data %d\n",
			__func__, rc);
		goto err_ret;
	}

err_ret:
	return rc;
}