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

Commit d00a9e02 authored by Mark Brown's avatar Mark Brown
Browse files

Merge remote-tracking branches 'asoc/fix/cs4265', 'asoc/fix/intel' and...

Merge remote-tracking branches 'asoc/fix/cs4265', 'asoc/fix/intel' and 'asoc/fix/topology' into asoc-linus
Loading
Loading
Loading
Loading
+24 −11
Original line number Diff line number Diff line
@@ -77,7 +77,7 @@
#define SND_SOC_TPLG_NUM_TEXTS		16

/* ABI version */
#define SND_SOC_TPLG_ABI_VERSION	0x2
#define SND_SOC_TPLG_ABI_VERSION	0x3

/* Max size of TLV data */
#define SND_SOC_TPLG_TLV_SIZE		32
@@ -97,7 +97,8 @@
#define SND_SOC_TPLG_TYPE_PCM		7
#define SND_SOC_TPLG_TYPE_MANIFEST	8
#define SND_SOC_TPLG_TYPE_CODEC_LINK	9
#define SND_SOC_TPLG_TYPE_MAX	SND_SOC_TPLG_TYPE_CODEC_LINK
#define SND_SOC_TPLG_TYPE_PDATA		10
#define SND_SOC_TPLG_TYPE_MAX	SND_SOC_TPLG_TYPE_PDATA

/* vendor block IDs - please add new vendor types to end */
#define SND_SOC_TPLG_TYPE_VENDOR_FW	1000
@@ -137,11 +138,19 @@ struct snd_soc_tplg_private {
/*
 * Kcontrol TLV data.
 */
struct snd_soc_tplg_tlv_dbscale {
	__le32 min;
	__le32 step;
	__le32 mute;
} __attribute__((packed));

struct snd_soc_tplg_ctl_tlv {
	__le32 size;	/* in bytes aligned to 4 */
	__le32 numid;	/* control element numeric identification */
	__le32 count;	/* number of elem in data array */
	__le32 size;	/* in bytes of this structure */
	__le32 type;	/* SNDRV_CTL_TLVT_*, type of TLV */
	union {
		__le32 data[SND_SOC_TPLG_TLV_SIZE];
		struct snd_soc_tplg_tlv_dbscale scale;
	};
} __attribute__((packed));

/*
@@ -155,9 +164,11 @@ struct snd_soc_tplg_channel {
} __attribute__((packed));

/*
 * Kcontrol Operations IDs
 * Genericl Operations IDs, for binding Kcontrol or Bytes ext ops
 * Kcontrol ops need get/put/info.
 * Bytes ext ops need get/put.
 */
struct snd_soc_tplg_kcontrol_ops_id {
struct snd_soc_tplg_io_ops {
	__le32 get;
	__le32 put;
	__le32 info;
@@ -171,8 +182,8 @@ struct snd_soc_tplg_ctl_hdr {
	__le32 type;
	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
	__le32 access;
	struct snd_soc_tplg_kcontrol_ops_id ops;
	__le32 tlv_size;	/* non zero means control has TLV data */
	struct snd_soc_tplg_io_ops ops;
	struct snd_soc_tplg_ctl_tlv tlv;
} __attribute__((packed));

/*
@@ -238,6 +249,7 @@ struct snd_soc_tplg_manifest {
	__le32 graph_elems;	/* number of graph elements */
	__le32 dai_elems;	/* number of DAI elements */
	__le32 dai_link_elems;	/* number of DAI link elements */
	struct snd_soc_tplg_private priv;
} __attribute__((packed));

/*
@@ -259,7 +271,6 @@ struct snd_soc_tplg_mixer_control {
	__le32 invert;
	__le32 num_channels;
	struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
	struct snd_soc_tplg_ctl_tlv tlv;
	struct snd_soc_tplg_private priv;
} __attribute__((packed));

@@ -303,6 +314,7 @@ struct snd_soc_tplg_bytes_control {
	__le32 mask;
	__le32 base;
	__le32 num_regs;
	struct snd_soc_tplg_io_ops ext_ops;
	struct snd_soc_tplg_private priv;
} __attribute__((packed));

@@ -347,6 +359,7 @@ struct snd_soc_tplg_dapm_widget {
	__le32 reg;		/* negative reg = no direct dapm */
	__le32 shift;		/* bits to shift */
	__le32 mask;		/* non-shifted mask */
	__le32 subseq;		/* sort within widget type */
	__u32 invert;		/* invert the power bit */
	__u32 ignore_suspend;	/* kept enabled over suspend */
	__u16 event_flags;
+5 −5
Original line number Diff line number Diff line
@@ -457,14 +457,14 @@ static int cs4265_pcm_hw_params(struct snd_pcm_substream *substream,
	case SND_SOC_DAIFMT_RIGHT_J:
		if (params_width(params) == 16) {
			snd_soc_update_bits(codec, CS4265_DAC_CTL,
				CS4265_DAC_CTL_DIF, (1 << 5));
				CS4265_DAC_CTL_DIF, (2 << 4));
			snd_soc_update_bits(codec, CS4265_SPDIF_CTL2,
				CS4265_SPDIF_CTL2_DIF, (1 << 7));
				CS4265_SPDIF_CTL2_DIF, (2 << 6));
		} else {
			snd_soc_update_bits(codec, CS4265_DAC_CTL,
				CS4265_DAC_CTL_DIF, (3 << 5));
				CS4265_DAC_CTL_DIF, (3 << 4));
			snd_soc_update_bits(codec, CS4265_SPDIF_CTL2,
				CS4265_SPDIF_CTL2_DIF, (1 << 7));
				CS4265_SPDIF_CTL2_DIF, (3 << 6));
		}
		break;
	case SND_SOC_DAIFMT_LEFT_J:
@@ -473,7 +473,7 @@ static int cs4265_pcm_hw_params(struct snd_pcm_substream *substream,
		snd_soc_update_bits(codec, CS4265_ADC_CTL,
			CS4265_ADC_DIF, 0);
		snd_soc_update_bits(codec, CS4265_SPDIF_CTL2,
			CS4265_SPDIF_CTL2_DIF, (1 << 6));
			CS4265_SPDIF_CTL2_DIF, 0);

		break;
	default:
+2 −0
Original line number Diff line number Diff line
@@ -701,6 +701,8 @@ int sst_byt_dsp_init(struct device *dev, struct sst_pdata *pdata)
	if (byt == NULL)
		return -ENOMEM;

	byt->dev = dev;

	ipc = &byt->ipc;
	ipc->dev = dev;
	ipc->ops.tx_msg = byt_tx_msg;
+2 −0
Original line number Diff line number Diff line
@@ -2119,6 +2119,8 @@ int sst_hsw_dsp_init(struct device *dev, struct sst_pdata *pdata)
	if (hsw == NULL)
		return -ENOMEM;

	hsw->dev = dev;

	ipc = &hsw->ipc;
	ipc->dev = dev;
	ipc->ops.tx_msg = hsw_tx_msg;
+43 −18
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
#include <sound/soc.h>
#include <sound/soc-dapm.h>
#include <sound/soc-topology.h>
#include <sound/tlv.h>

/*
 * We make several passes over the data (since it wont necessarily be ordered)
@@ -534,7 +535,7 @@ static int soc_tplg_kcontrol_bind_io(struct snd_soc_tplg_ctl_hdr *hdr,
			k->put = bops[i].put;
		if (k->get == NULL && bops[i].id == hdr->ops.get)
			k->get = bops[i].get;
		if (k->info == NULL && ops[i].id == hdr->ops.info)
		if (k->info == NULL && bops[i].id == hdr->ops.info)
			k->info = bops[i].info;
	}

@@ -579,28 +580,51 @@ static int soc_tplg_init_kcontrol(struct soc_tplg *tplg,
	return 0;
}

static int soc_tplg_create_tlv(struct soc_tplg *tplg,
	struct snd_kcontrol_new *kc, struct snd_soc_tplg_ctl_tlv *tplg_tlv)

static int soc_tplg_create_tlv_db_scale(struct soc_tplg *tplg,
	struct snd_kcontrol_new *kc, struct snd_soc_tplg_tlv_dbscale *scale)
{
	struct snd_ctl_tlv *tlv;
	int size;
	unsigned int item_len = 2 * sizeof(unsigned int);
	unsigned int *p;

	p = kzalloc(item_len + 2 * sizeof(unsigned int), GFP_KERNEL);
	if (!p)
		return -ENOMEM;

	if (tplg_tlv->count == 0)
	p[0] = SNDRV_CTL_TLVT_DB_SCALE;
	p[1] = item_len;
	p[2] = scale->min;
	p[3] = (scale->step & TLV_DB_SCALE_MASK)
			| (scale->mute ? TLV_DB_SCALE_MUTE : 0);

	kc->tlv.p = (void *)p;
	return 0;
}

	size = ((tplg_tlv->count + (sizeof(unsigned int) - 1)) &
		~(sizeof(unsigned int) - 1));
	tlv = kzalloc(sizeof(*tlv) + size, GFP_KERNEL);
	if (tlv == NULL)
		return -ENOMEM;
static int soc_tplg_create_tlv(struct soc_tplg *tplg,
	struct snd_kcontrol_new *kc, struct snd_soc_tplg_ctl_hdr *tc)
{
	struct snd_soc_tplg_ctl_tlv *tplg_tlv;

	if (!(tc->access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE))
		return 0;

	dev_dbg(tplg->dev, " created TLV type %d size %d bytes\n",
		tplg_tlv->numid, size);
	if (tc->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) {
		kc->tlv.c = snd_soc_bytes_tlv_callback;
	} else {
		tplg_tlv = &tc->tlv;
		switch (tplg_tlv->type) {
		case SNDRV_CTL_TLVT_DB_SCALE:
			return soc_tplg_create_tlv_db_scale(tplg, kc,
					&tplg_tlv->scale);

	tlv->numid = tplg_tlv->numid;
	tlv->length = size;
	memcpy(&tlv->tlv[0], tplg_tlv->data, size);
	kc->tlv.p = (void *)tlv;
		/* TODO: add support for other TLV types */
		default:
			dev_dbg(tplg->dev, "Unsupported TLV type %d\n",
					tplg_tlv->type);
			return -EINVAL;
		}
	}

	return 0;
}
@@ -772,7 +796,7 @@ static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count,
		}

		/* create any TLV data */
		soc_tplg_create_tlv(tplg, &kc, &mc->tlv);
		soc_tplg_create_tlv(tplg, &kc, &mc->hdr);

		/* register control here */
		err = soc_tplg_add_kcontrol(tplg, &kc,
@@ -1350,6 +1374,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg,
	template.reg = w->reg;
	template.shift = w->shift;
	template.mask = w->mask;
	template.subseq = w->subseq;
	template.on_val = w->invert ? 0 : 1;
	template.off_val = w->invert ? 1 : 0;
	template.ignore_suspend = w->ignore_suspend;