Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f85e7d37 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ASoC: msm: qdsp6v2: Add endianness control for USB devices"

parents ddb5ca1f 60a73c06
Loading
Loading
Loading
Loading
+22 −1
Original line number Diff line number Diff line
@@ -2471,6 +2471,13 @@ struct afe_param_id_slimbus_cfg {
 */
#define AFE_PARAM_ID_USB_AUDIO_DEV_PARAMS    0x000102A5


/* ID of the parameter used to set the endianness value for the
 * USB audio device. It should be used with
 * AFE_MODULE_AUDIO_DEV_INTERFACE
 */
#define AFE_PARAM_ID_USB_AUDIO_DEV_LPCM_FMT 0x000102AA

/* Minor version used for tracking USB audio  configuration */
#define AFE_API_MINIOR_VERSION_USB_AUDIO_CONFIG 0x1

@@ -2486,6 +2493,15 @@ struct afe_param_id_usb_audio_dev_params {
	u32                  dev_token;
} __packed;

struct afe_param_id_usb_audio_dev_lpcm_fmt {
/* Minor version used for tracking USB audio device parameter.
 * Supported values: AFE_API_MINIOR_VERSION_USB_AUDIO_CONFIG
 */
	u32                  cfg_minor_version;
/* Endianness of actual end USB audio device */
	u32                  endian;
} __packed;

/* ID of the parameter used by AFE_PARAM_ID_USB_AUDIO_CONFIG to configure
 * USB audio interface. It should be used with AFE_MODULE_AUDIO_DEV_INTERFACE
*/
@@ -2530,13 +2546,18 @@ struct afe_param_id_usb_audio_cfg {
	u16                  reserved;
/* device token of actual end USB aduio device */
	u32                  dev_token;
/* endianness of this interface */
	u32                   endian;
} __packed;

struct afe_usb_audio_dev_param_command {
	struct apr_hdr hdr;
	struct afe_port_cmd_set_param_v2 param;
	struct afe_port_param_data_v2    pdata;
	union {
		struct afe_param_id_usb_audio_dev_params usb_dev;
		struct afe_param_id_usb_audio_dev_lpcm_fmt lpcm_fmt;
	};
} __packed;

/*
+49 −1
Original line number Diff line number Diff line
@@ -2077,6 +2077,42 @@ static int msm_dai_q6_usb_audio_cfg_get(struct snd_kcontrol *kcontrol,
	return 0;
}

static int msm_dai_q6_usb_audio_endian_cfg_put(struct snd_kcontrol *kcontrol,
					 struct snd_ctl_elem_value *ucontrol)
{
	struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data;
	u32 val = ucontrol->value.integer.value[0];

	if (dai_data) {
		dai_data->port_config.usb_audio.endian = val;
		pr_debug("%s: endian = 0x%x\n",  __func__,
				 dai_data->port_config.usb_audio.endian);
	} else {
		pr_err("%s: dai_data is NULL\n", __func__);
		return -EINVAL;
	}

	return 0;
}

static int msm_dai_q6_usb_audio_endian_cfg_get(struct snd_kcontrol *kcontrol,
					struct snd_ctl_elem_value *ucontrol)
{
	struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data;

	if (dai_data) {
		ucontrol->value.integer.value[0] =
			 dai_data->port_config.usb_audio.endian;
		pr_debug("%s: endian = 0x%x\n",  __func__,
				 dai_data->port_config.usb_audio.endian);
	} else {
		pr_err("%s: dai_data is NULL\n", __func__);
		return -EINVAL;
	}

	return 0;
}

static int  msm_dai_q6_afe_enc_cfg_info(struct snd_kcontrol *kcontrol,
					struct snd_ctl_elem_info *uinfo)
{
@@ -2327,9 +2363,15 @@ static const struct snd_kcontrol_new usb_audio_cfg_controls[] = {
	SOC_SINGLE_EXT("USB_AUDIO_RX dev_token", 0, 0, UINT_MAX, 0,
			msm_dai_q6_usb_audio_cfg_get,
			msm_dai_q6_usb_audio_cfg_put),
	SOC_SINGLE_EXT("USB_AUDIO_RX endian", 0, 0, 1, 0,
			msm_dai_q6_usb_audio_endian_cfg_get,
			msm_dai_q6_usb_audio_endian_cfg_put),
	SOC_SINGLE_EXT("USB_AUDIO_TX dev_token", 0, 0, UINT_MAX, 0,
			msm_dai_q6_usb_audio_cfg_get,
			msm_dai_q6_usb_audio_cfg_put),
	SOC_SINGLE_EXT("USB_AUDIO_TX endian", 0, 0, 1, 0,
			msm_dai_q6_usb_audio_endian_cfg_get,
			msm_dai_q6_usb_audio_endian_cfg_put),
};

static int msm_dai_q6_dai_probe(struct snd_soc_dai *dai)
@@ -2401,10 +2443,16 @@ static int msm_dai_q6_dai_probe(struct snd_soc_dai *dai)
		rc = snd_ctl_add(dai->component->card->snd_card,
				 snd_ctl_new1(&usb_audio_cfg_controls[0],
				 dai_data));
		rc = snd_ctl_add(dai->component->card->snd_card,
				 snd_ctl_new1(&usb_audio_cfg_controls[1],
				 dai_data));
		break;
	case AFE_PORT_ID_USB_TX:
		rc = snd_ctl_add(dai->component->card->snd_card,
				 snd_ctl_new1(&usb_audio_cfg_controls[1],
				 snd_ctl_new1(&usb_audio_cfg_controls[2],
				 dai_data));
		rc = snd_ctl_add(dai->component->card->snd_card,
				 snd_ctl_new1(&usb_audio_cfg_controls[3],
				 dai_data));
		break;
	}
+15 −0
Original line number Diff line number Diff line
@@ -2723,6 +2723,21 @@ int afe_port_send_usb_dev_param(u16 port_id, union afe_port_config *afe_config)
		ret = -EINVAL;
		goto exit;
	}

	config.pdata.param_id = AFE_PARAM_ID_USB_AUDIO_DEV_LPCM_FMT;
	config.pdata.param_size = sizeof(config.lpcm_fmt);
	config.lpcm_fmt.cfg_minor_version =
		AFE_API_MINIOR_VERSION_USB_AUDIO_CONFIG;
	config.lpcm_fmt.endian = afe_config->usb_audio.endian;

	ret = afe_apr_send_pkt(&config, &this_afe.wait[index]);
	if (ret) {
		pr_err("%s: AFE device param cmd LPCM_FMT failed %d\n",
			__func__, ret);
		ret = -EINVAL;
		goto exit;
	}

exit:
	return ret;
}