diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-08-07 21:33:35 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-08-07 21:33:35 -0400 |
commit | f0943013068599fcbe29bf534f439ef2b6f09003 (patch) | |
tree | 5647cb30acf8e571e6d0980165a479bee1742bf7 | |
parent | ea8dc1abeb09b401bdaea39cfb9850c80f8ef3ef (diff) | |
parent | 6ac7ada210a8d23a56fbf18b6e1e00528844565c (diff) |
Merge tag 'sound-4.2-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound fixes from Takashi Iwai:
"The only bulk changes in this request is ABI updates for ASoC topology
API. It's a new API that was introduced in 4.2, and we'd like to
avoid ABI change after the release, so it's taken now. As there is no
real in-tree user for this API, it should be fairly safe.
Other than that, the usual small fixes are found in various drivers:
ASoC cs4265, rt5645, intel-sst, firewire, oxygen and HD-audio"
* tag 'sound-4.2-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
ASoC: topology: Add private data type and bump ABI version to 3
ASoC: topology: Add ops support to byte controls UAPI
ASoC: topology: Update TLV support so we can support more TLV types
ASoC: topology: add private data to manifest
ASoC: topology: Add subsequence in topology
ALSA: hda - one Dell machine needs the headphone white noise fixup
ALSA: fireworks/firewire-lib: add support for recent firmware quirk
Revert "ALSA: fireworks: add support for AudioFire2 quirk"
ASoC: topology: fix typo in soc_tplg_kcontrol_bind_io()
ALSA: HDA: Dont check return for snd_hdac_chip_readl
ALSA: HDA: Fix stream assignment for host in decoupled mode
ASoC: rt5645: Fix lost pin setting for DMIC1
ALSA: oxygen: Fix logical-not-parentheses warning
ASoC: Intel: sst_byt: fix initialize 'NULL device *' issue
ASoC: Intel: haswell: fix initialize 'NULL device *' issue
ASoC: cs4265: Fix setting dai format for Left/Right Justified
-rw-r--r-- | include/uapi/sound/asoc.h | 35 | ||||
-rw-r--r-- | sound/firewire/amdtp.c | 5 | ||||
-rw-r--r-- | sound/firewire/amdtp.h | 2 | ||||
-rw-r--r-- | sound/firewire/fireworks/fireworks.c | 10 | ||||
-rw-r--r-- | sound/firewire/fireworks/fireworks.h | 2 | ||||
-rw-r--r-- | sound/firewire/fireworks/fireworks_stream.c | 12 | ||||
-rw-r--r-- | sound/hda/ext/hdac_ext_controller.c | 6 | ||||
-rw-r--r-- | sound/hda/ext/hdac_ext_stream.c | 2 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 1 | ||||
-rw-r--r-- | sound/pci/oxygen/oxygen_mixer.c | 2 | ||||
-rw-r--r-- | sound/soc/codecs/cs4265.c | 10 | ||||
-rw-r--r-- | sound/soc/codecs/rt5645.c | 2 | ||||
-rw-r--r-- | sound/soc/codecs/rt5645.h | 4 | ||||
-rw-r--r-- | sound/soc/intel/baytrail/sst-baytrail-ipc.c | 2 | ||||
-rw-r--r-- | sound/soc/intel/haswell/sst-haswell-ipc.c | 2 | ||||
-rw-r--r-- | sound/soc/soc-topology.c | 61 |
16 files changed, 108 insertions, 50 deletions
diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h index 785c5ca0994b..51b8066a223b 100644 --- a/include/uapi/sound/asoc.h +++ b/include/uapi/sound/asoc.h | |||
@@ -77,7 +77,7 @@ | |||
77 | #define SND_SOC_TPLG_NUM_TEXTS 16 | 77 | #define SND_SOC_TPLG_NUM_TEXTS 16 |
78 | 78 | ||
79 | /* ABI version */ | 79 | /* ABI version */ |
80 | #define SND_SOC_TPLG_ABI_VERSION 0x2 | 80 | #define SND_SOC_TPLG_ABI_VERSION 0x3 |
81 | 81 | ||
82 | /* Max size of TLV data */ | 82 | /* Max size of TLV data */ |
83 | #define SND_SOC_TPLG_TLV_SIZE 32 | 83 | #define SND_SOC_TPLG_TLV_SIZE 32 |
@@ -97,7 +97,8 @@ | |||
97 | #define SND_SOC_TPLG_TYPE_PCM 7 | 97 | #define SND_SOC_TPLG_TYPE_PCM 7 |
98 | #define SND_SOC_TPLG_TYPE_MANIFEST 8 | 98 | #define SND_SOC_TPLG_TYPE_MANIFEST 8 |
99 | #define SND_SOC_TPLG_TYPE_CODEC_LINK 9 | 99 | #define SND_SOC_TPLG_TYPE_CODEC_LINK 9 |
100 | #define SND_SOC_TPLG_TYPE_MAX SND_SOC_TPLG_TYPE_CODEC_LINK | 100 | #define SND_SOC_TPLG_TYPE_PDATA 10 |
101 | #define SND_SOC_TPLG_TYPE_MAX SND_SOC_TPLG_TYPE_PDATA | ||
101 | 102 | ||
102 | /* vendor block IDs - please add new vendor types to end */ | 103 | /* vendor block IDs - please add new vendor types to end */ |
103 | #define SND_SOC_TPLG_TYPE_VENDOR_FW 1000 | 104 | #define SND_SOC_TPLG_TYPE_VENDOR_FW 1000 |
@@ -137,11 +138,19 @@ struct snd_soc_tplg_private { | |||
137 | /* | 138 | /* |
138 | * Kcontrol TLV data. | 139 | * Kcontrol TLV data. |
139 | */ | 140 | */ |
141 | struct snd_soc_tplg_tlv_dbscale { | ||
142 | __le32 min; | ||
143 | __le32 step; | ||
144 | __le32 mute; | ||
145 | } __attribute__((packed)); | ||
146 | |||
140 | struct snd_soc_tplg_ctl_tlv { | 147 | struct snd_soc_tplg_ctl_tlv { |
141 | __le32 size; /* in bytes aligned to 4 */ | 148 | __le32 size; /* in bytes of this structure */ |
142 | __le32 numid; /* control element numeric identification */ | 149 | __le32 type; /* SNDRV_CTL_TLVT_*, type of TLV */ |
143 | __le32 count; /* number of elem in data array */ | 150 | union { |
144 | __le32 data[SND_SOC_TPLG_TLV_SIZE]; | 151 | __le32 data[SND_SOC_TPLG_TLV_SIZE]; |
152 | struct snd_soc_tplg_tlv_dbscale scale; | ||
153 | }; | ||
145 | } __attribute__((packed)); | 154 | } __attribute__((packed)); |
146 | 155 | ||
147 | /* | 156 | /* |
@@ -155,9 +164,11 @@ struct snd_soc_tplg_channel { | |||
155 | } __attribute__((packed)); | 164 | } __attribute__((packed)); |
156 | 165 | ||
157 | /* | 166 | /* |
158 | * Kcontrol Operations IDs | 167 | * Genericl Operations IDs, for binding Kcontrol or Bytes ext ops |
168 | * Kcontrol ops need get/put/info. | ||
169 | * Bytes ext ops need get/put. | ||
159 | */ | 170 | */ |
160 | struct snd_soc_tplg_kcontrol_ops_id { | 171 | struct snd_soc_tplg_io_ops { |
161 | __le32 get; | 172 | __le32 get; |
162 | __le32 put; | 173 | __le32 put; |
163 | __le32 info; | 174 | __le32 info; |
@@ -171,8 +182,8 @@ struct snd_soc_tplg_ctl_hdr { | |||
171 | __le32 type; | 182 | __le32 type; |
172 | char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; | 183 | char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; |
173 | __le32 access; | 184 | __le32 access; |
174 | struct snd_soc_tplg_kcontrol_ops_id ops; | 185 | struct snd_soc_tplg_io_ops ops; |
175 | __le32 tlv_size; /* non zero means control has TLV data */ | 186 | struct snd_soc_tplg_ctl_tlv tlv; |
176 | } __attribute__((packed)); | 187 | } __attribute__((packed)); |
177 | 188 | ||
178 | /* | 189 | /* |
@@ -238,6 +249,7 @@ struct snd_soc_tplg_manifest { | |||
238 | __le32 graph_elems; /* number of graph elements */ | 249 | __le32 graph_elems; /* number of graph elements */ |
239 | __le32 dai_elems; /* number of DAI elements */ | 250 | __le32 dai_elems; /* number of DAI elements */ |
240 | __le32 dai_link_elems; /* number of DAI link elements */ | 251 | __le32 dai_link_elems; /* number of DAI link elements */ |
252 | struct snd_soc_tplg_private priv; | ||
241 | } __attribute__((packed)); | 253 | } __attribute__((packed)); |
242 | 254 | ||
243 | /* | 255 | /* |
@@ -259,7 +271,6 @@ struct snd_soc_tplg_mixer_control { | |||
259 | __le32 invert; | 271 | __le32 invert; |
260 | __le32 num_channels; | 272 | __le32 num_channels; |
261 | struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN]; | 273 | struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN]; |
262 | struct snd_soc_tplg_ctl_tlv tlv; | ||
263 | struct snd_soc_tplg_private priv; | 274 | struct snd_soc_tplg_private priv; |
264 | } __attribute__((packed)); | 275 | } __attribute__((packed)); |
265 | 276 | ||
@@ -303,6 +314,7 @@ struct snd_soc_tplg_bytes_control { | |||
303 | __le32 mask; | 314 | __le32 mask; |
304 | __le32 base; | 315 | __le32 base; |
305 | __le32 num_regs; | 316 | __le32 num_regs; |
317 | struct snd_soc_tplg_io_ops ext_ops; | ||
306 | struct snd_soc_tplg_private priv; | 318 | struct snd_soc_tplg_private priv; |
307 | } __attribute__((packed)); | 319 | } __attribute__((packed)); |
308 | 320 | ||
@@ -347,6 +359,7 @@ struct snd_soc_tplg_dapm_widget { | |||
347 | __le32 reg; /* negative reg = no direct dapm */ | 359 | __le32 reg; /* negative reg = no direct dapm */ |
348 | __le32 shift; /* bits to shift */ | 360 | __le32 shift; /* bits to shift */ |
349 | __le32 mask; /* non-shifted mask */ | 361 | __le32 mask; /* non-shifted mask */ |
362 | __le32 subseq; /* sort within widget type */ | ||
350 | __u32 invert; /* invert the power bit */ | 363 | __u32 invert; /* invert the power bit */ |
351 | __u32 ignore_suspend; /* kept enabled over suspend */ | 364 | __u32 ignore_suspend; /* kept enabled over suspend */ |
352 | __u16 event_flags; | 365 | __u16 event_flags; |
diff --git a/sound/firewire/amdtp.c b/sound/firewire/amdtp.c index 7bb988fa6b6d..2a153d260836 100644 --- a/sound/firewire/amdtp.c +++ b/sound/firewire/amdtp.c | |||
@@ -740,8 +740,9 @@ static int handle_in_packet(struct amdtp_stream *s, | |||
740 | s->data_block_counter != UINT_MAX) | 740 | s->data_block_counter != UINT_MAX) |
741 | data_block_counter = s->data_block_counter; | 741 | data_block_counter = s->data_block_counter; |
742 | 742 | ||
743 | if (((s->flags & CIP_SKIP_DBC_ZERO_CHECK) && data_block_counter == 0) || | 743 | if (((s->flags & CIP_SKIP_DBC_ZERO_CHECK) && |
744 | (s->data_block_counter == UINT_MAX)) { | 744 | data_block_counter == s->tx_first_dbc) || |
745 | s->data_block_counter == UINT_MAX) { | ||
745 | lost = false; | 746 | lost = false; |
746 | } else if (!(s->flags & CIP_DBC_IS_END_EVENT)) { | 747 | } else if (!(s->flags & CIP_DBC_IS_END_EVENT)) { |
747 | lost = data_block_counter != s->data_block_counter; | 748 | lost = data_block_counter != s->data_block_counter; |
diff --git a/sound/firewire/amdtp.h b/sound/firewire/amdtp.h index 26b909329e54..b2cf9e75693b 100644 --- a/sound/firewire/amdtp.h +++ b/sound/firewire/amdtp.h | |||
@@ -157,6 +157,8 @@ struct amdtp_stream { | |||
157 | 157 | ||
158 | /* quirk: fixed interval of dbc between previos/current packets. */ | 158 | /* quirk: fixed interval of dbc between previos/current packets. */ |
159 | unsigned int tx_dbc_interval; | 159 | unsigned int tx_dbc_interval; |
160 | /* quirk: indicate the value of dbc field in a first packet. */ | ||
161 | unsigned int tx_first_dbc; | ||
160 | 162 | ||
161 | bool callbacked; | 163 | bool callbacked; |
162 | wait_queue_head_t callback_wait; | 164 | wait_queue_head_t callback_wait; |
diff --git a/sound/firewire/fireworks/fireworks.c b/sound/firewire/fireworks/fireworks.c index c670db4eee70..c94a432f7cc6 100644 --- a/sound/firewire/fireworks/fireworks.c +++ b/sound/firewire/fireworks/fireworks.c | |||
@@ -248,10 +248,16 @@ efw_probe(struct fw_unit *unit, | |||
248 | err = get_hardware_info(efw); | 248 | err = get_hardware_info(efw); |
249 | if (err < 0) | 249 | if (err < 0) |
250 | goto error; | 250 | goto error; |
251 | if (entry->model_id == MODEL_ECHO_AUDIOFIRE_2) | 251 | /* AudioFire8 (since 2009) and AudioFirePre8 */ |
252 | efw->is_af2 = true; | ||
253 | if (entry->model_id == MODEL_ECHO_AUDIOFIRE_9) | 252 | if (entry->model_id == MODEL_ECHO_AUDIOFIRE_9) |
254 | efw->is_af9 = true; | 253 | efw->is_af9 = true; |
254 | /* These models uses the same firmware. */ | ||
255 | if (entry->model_id == MODEL_ECHO_AUDIOFIRE_2 || | ||
256 | entry->model_id == MODEL_ECHO_AUDIOFIRE_4 || | ||
257 | entry->model_id == MODEL_ECHO_AUDIOFIRE_9 || | ||
258 | entry->model_id == MODEL_GIBSON_RIP || | ||
259 | entry->model_id == MODEL_GIBSON_GOLDTOP) | ||
260 | efw->is_fireworks3 = true; | ||
255 | 261 | ||
256 | snd_efw_proc_init(efw); | 262 | snd_efw_proc_init(efw); |
257 | 263 | ||
diff --git a/sound/firewire/fireworks/fireworks.h b/sound/firewire/fireworks/fireworks.h index c33252b7bc84..084d414b228c 100644 --- a/sound/firewire/fireworks/fireworks.h +++ b/sound/firewire/fireworks/fireworks.h | |||
@@ -70,8 +70,8 @@ struct snd_efw { | |||
70 | bool resp_addr_changable; | 70 | bool resp_addr_changable; |
71 | 71 | ||
72 | /* for quirks */ | 72 | /* for quirks */ |
73 | bool is_af2; | ||
74 | bool is_af9; | 73 | bool is_af9; |
74 | bool is_fireworks3; | ||
75 | u32 firmware_version; | 75 | u32 firmware_version; |
76 | 76 | ||
77 | unsigned int midi_in_ports; | 77 | unsigned int midi_in_ports; |
diff --git a/sound/firewire/fireworks/fireworks_stream.c b/sound/firewire/fireworks/fireworks_stream.c index a0762dd6231e..7e353f1f7bff 100644 --- a/sound/firewire/fireworks/fireworks_stream.c +++ b/sound/firewire/fireworks/fireworks_stream.c | |||
@@ -172,9 +172,15 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw) | |||
172 | efw->tx_stream.flags |= CIP_DBC_IS_END_EVENT; | 172 | efw->tx_stream.flags |= CIP_DBC_IS_END_EVENT; |
173 | /* Fireworks reset dbc at bus reset. */ | 173 | /* Fireworks reset dbc at bus reset. */ |
174 | efw->tx_stream.flags |= CIP_SKIP_DBC_ZERO_CHECK; | 174 | efw->tx_stream.flags |= CIP_SKIP_DBC_ZERO_CHECK; |
175 | /* AudioFire2 starts packets with non-zero dbc. */ | 175 | /* |
176 | if (efw->is_af2) | 176 | * But Recent firmwares starts packets with non-zero dbc. |
177 | efw->tx_stream.flags |= CIP_SKIP_INIT_DBC_CHECK; | 177 | * Driver version 5.7.6 installs firmware version 5.7.3. |
178 | */ | ||
179 | if (efw->is_fireworks3 && | ||
180 | (efw->firmware_version == 0x5070000 || | ||
181 | efw->firmware_version == 0x5070300 || | ||
182 | efw->firmware_version == 0x5080000)) | ||
183 | efw->tx_stream.tx_first_dbc = 0x02; | ||
178 | /* AudioFire9 always reports wrong dbs. */ | 184 | /* AudioFire9 always reports wrong dbs. */ |
179 | if (efw->is_af9) | 185 | if (efw->is_af9) |
180 | efw->tx_stream.flags |= CIP_WRONG_DBS; | 186 | efw->tx_stream.flags |= CIP_WRONG_DBS; |
diff --git a/sound/hda/ext/hdac_ext_controller.c b/sound/hda/ext/hdac_ext_controller.c index b2da19b60f4e..358f16195483 100644 --- a/sound/hda/ext/hdac_ext_controller.c +++ b/sound/hda/ext/hdac_ext_controller.c | |||
@@ -44,16 +44,10 @@ int snd_hdac_ext_bus_parse_capabilities(struct hdac_ext_bus *ebus) | |||
44 | 44 | ||
45 | offset = snd_hdac_chip_readl(bus, LLCH); | 45 | offset = snd_hdac_chip_readl(bus, LLCH); |
46 | 46 | ||
47 | if (offset < 0) | ||
48 | return -EIO; | ||
49 | |||
50 | /* Lets walk the linked capabilities list */ | 47 | /* Lets walk the linked capabilities list */ |
51 | do { | 48 | do { |
52 | cur_cap = _snd_hdac_chip_read(l, bus, offset); | 49 | cur_cap = _snd_hdac_chip_read(l, bus, offset); |
53 | 50 | ||
54 | if (cur_cap < 0) | ||
55 | return -EIO; | ||
56 | |||
57 | dev_dbg(bus->dev, "Capability version: 0x%x\n", | 51 | dev_dbg(bus->dev, "Capability version: 0x%x\n", |
58 | ((cur_cap & AZX_CAP_HDR_VER_MASK) >> AZX_CAP_HDR_VER_OFF)); | 52 | ((cur_cap & AZX_CAP_HDR_VER_MASK) >> AZX_CAP_HDR_VER_OFF)); |
59 | 53 | ||
diff --git a/sound/hda/ext/hdac_ext_stream.c b/sound/hda/ext/hdac_ext_stream.c index f8ffbdbb450d..3de47dd1a76d 100644 --- a/sound/hda/ext/hdac_ext_stream.c +++ b/sound/hda/ext/hdac_ext_stream.c | |||
@@ -299,7 +299,7 @@ hdac_ext_host_stream_assign(struct hdac_ext_bus *ebus, | |||
299 | if (stream->direction != substream->stream) | 299 | if (stream->direction != substream->stream) |
300 | continue; | 300 | continue; |
301 | 301 | ||
302 | if (stream->opened) { | 302 | if (!stream->opened) { |
303 | if (!hstream->decoupled) | 303 | if (!hstream->decoupled) |
304 | snd_hdac_ext_stream_decouple(ebus, hstream, true); | 304 | snd_hdac_ext_stream_decouple(ebus, hstream, true); |
305 | res = hstream; | 305 | res = hstream; |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index c456c04e0928..0b9847affbec 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -5189,6 +5189,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
5189 | SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), | 5189 | SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), |
5190 | SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 5190 | SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
5191 | SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 5191 | SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
5192 | SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC292_FIXUP_DISABLE_AAMIX), | ||
5192 | SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 5193 | SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
5193 | SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 5194 | SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
5194 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), | 5195 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), |
diff --git a/sound/pci/oxygen/oxygen_mixer.c b/sound/pci/oxygen/oxygen_mixer.c index 6492bca8c70f..4ca12665ff73 100644 --- a/sound/pci/oxygen/oxygen_mixer.c +++ b/sound/pci/oxygen/oxygen_mixer.c | |||
@@ -88,7 +88,7 @@ static int dac_mute_put(struct snd_kcontrol *ctl, | |||
88 | int changed; | 88 | int changed; |
89 | 89 | ||
90 | mutex_lock(&chip->mutex); | 90 | mutex_lock(&chip->mutex); |
91 | changed = !value->value.integer.value[0] != chip->dac_mute; | 91 | changed = (!value->value.integer.value[0]) != chip->dac_mute; |
92 | if (changed) { | 92 | if (changed) { |
93 | chip->dac_mute = !value->value.integer.value[0]; | 93 | chip->dac_mute = !value->value.integer.value[0]; |
94 | chip->model.update_dac_mute(chip); | 94 | chip->model.update_dac_mute(chip); |
diff --git a/sound/soc/codecs/cs4265.c b/sound/soc/codecs/cs4265.c index d7ec4756e45b..8e36198474d9 100644 --- a/sound/soc/codecs/cs4265.c +++ b/sound/soc/codecs/cs4265.c | |||
@@ -457,14 +457,14 @@ static int cs4265_pcm_hw_params(struct snd_pcm_substream *substream, | |||
457 | case SND_SOC_DAIFMT_RIGHT_J: | 457 | case SND_SOC_DAIFMT_RIGHT_J: |
458 | if (params_width(params) == 16) { | 458 | if (params_width(params) == 16) { |
459 | snd_soc_update_bits(codec, CS4265_DAC_CTL, | 459 | snd_soc_update_bits(codec, CS4265_DAC_CTL, |
460 | CS4265_DAC_CTL_DIF, (1 << 5)); | 460 | CS4265_DAC_CTL_DIF, (2 << 4)); |
461 | snd_soc_update_bits(codec, CS4265_SPDIF_CTL2, | 461 | snd_soc_update_bits(codec, CS4265_SPDIF_CTL2, |
462 | CS4265_SPDIF_CTL2_DIF, (1 << 7)); | 462 | CS4265_SPDIF_CTL2_DIF, (2 << 6)); |
463 | } else { | 463 | } else { |
464 | snd_soc_update_bits(codec, CS4265_DAC_CTL, | 464 | snd_soc_update_bits(codec, CS4265_DAC_CTL, |
465 | CS4265_DAC_CTL_DIF, (3 << 5)); | 465 | CS4265_DAC_CTL_DIF, (3 << 4)); |
466 | snd_soc_update_bits(codec, CS4265_SPDIF_CTL2, | 466 | snd_soc_update_bits(codec, CS4265_SPDIF_CTL2, |
467 | CS4265_SPDIF_CTL2_DIF, (1 << 7)); | 467 | CS4265_SPDIF_CTL2_DIF, (3 << 6)); |
468 | } | 468 | } |
469 | break; | 469 | break; |
470 | case SND_SOC_DAIFMT_LEFT_J: | 470 | case SND_SOC_DAIFMT_LEFT_J: |
@@ -473,7 +473,7 @@ static int cs4265_pcm_hw_params(struct snd_pcm_substream *substream, | |||
473 | snd_soc_update_bits(codec, CS4265_ADC_CTL, | 473 | snd_soc_update_bits(codec, CS4265_ADC_CTL, |
474 | CS4265_ADC_DIF, 0); | 474 | CS4265_ADC_DIF, 0); |
475 | snd_soc_update_bits(codec, CS4265_SPDIF_CTL2, | 475 | snd_soc_update_bits(codec, CS4265_SPDIF_CTL2, |
476 | CS4265_SPDIF_CTL2_DIF, (1 << 6)); | 476 | CS4265_SPDIF_CTL2_DIF, 0); |
477 | 477 | ||
478 | break; | 478 | break; |
479 | default: | 479 | default: |
diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c index e9cc3aae5366..961bd7e5877e 100644 --- a/sound/soc/codecs/rt5645.c +++ b/sound/soc/codecs/rt5645.c | |||
@@ -3341,6 +3341,8 @@ static int rt5645_i2c_probe(struct i2c_client *i2c, | |||
3341 | break; | 3341 | break; |
3342 | 3342 | ||
3343 | case RT5645_DMIC_DATA_GPIO5: | 3343 | case RT5645_DMIC_DATA_GPIO5: |
3344 | regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, | ||
3345 | RT5645_I2S2_DAC_PIN_MASK, RT5645_I2S2_DAC_PIN_GPIO); | ||
3344 | regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, | 3346 | regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, |
3345 | RT5645_DMIC_1_DP_MASK, RT5645_DMIC_1_DP_GPIO5); | 3347 | RT5645_DMIC_1_DP_MASK, RT5645_DMIC_1_DP_GPIO5); |
3346 | regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, | 3348 | regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, |
diff --git a/sound/soc/codecs/rt5645.h b/sound/soc/codecs/rt5645.h index 0353a6a273ab..278bb9f464c4 100644 --- a/sound/soc/codecs/rt5645.h +++ b/sound/soc/codecs/rt5645.h | |||
@@ -1693,6 +1693,10 @@ | |||
1693 | #define RT5645_GP6_PIN_SFT 6 | 1693 | #define RT5645_GP6_PIN_SFT 6 |
1694 | #define RT5645_GP6_PIN_GPIO6 (0x0 << 6) | 1694 | #define RT5645_GP6_PIN_GPIO6 (0x0 << 6) |
1695 | #define RT5645_GP6_PIN_DMIC2_SDA (0x1 << 6) | 1695 | #define RT5645_GP6_PIN_DMIC2_SDA (0x1 << 6) |
1696 | #define RT5645_I2S2_DAC_PIN_MASK (0x1 << 4) | ||
1697 | #define RT5645_I2S2_DAC_PIN_SFT 4 | ||
1698 | #define RT5645_I2S2_DAC_PIN_I2S (0x0 << 4) | ||
1699 | #define RT5645_I2S2_DAC_PIN_GPIO (0x1 << 4) | ||
1696 | #define RT5645_GP8_PIN_MASK (0x1 << 3) | 1700 | #define RT5645_GP8_PIN_MASK (0x1 << 3) |
1697 | #define RT5645_GP8_PIN_SFT 3 | 1701 | #define RT5645_GP8_PIN_SFT 3 |
1698 | #define RT5645_GP8_PIN_GPIO8 (0x0 << 3) | 1702 | #define RT5645_GP8_PIN_GPIO8 (0x0 << 3) |
diff --git a/sound/soc/intel/baytrail/sst-baytrail-ipc.c b/sound/soc/intel/baytrail/sst-baytrail-ipc.c index 4c01bb43928d..5bbaa667bec1 100644 --- a/sound/soc/intel/baytrail/sst-baytrail-ipc.c +++ b/sound/soc/intel/baytrail/sst-baytrail-ipc.c | |||
@@ -701,6 +701,8 @@ int sst_byt_dsp_init(struct device *dev, struct sst_pdata *pdata) | |||
701 | if (byt == NULL) | 701 | if (byt == NULL) |
702 | return -ENOMEM; | 702 | return -ENOMEM; |
703 | 703 | ||
704 | byt->dev = dev; | ||
705 | |||
704 | ipc = &byt->ipc; | 706 | ipc = &byt->ipc; |
705 | ipc->dev = dev; | 707 | ipc->dev = dev; |
706 | ipc->ops.tx_msg = byt_tx_msg; | 708 | ipc->ops.tx_msg = byt_tx_msg; |
diff --git a/sound/soc/intel/haswell/sst-haswell-ipc.c b/sound/soc/intel/haswell/sst-haswell-ipc.c index f95f271aab0c..f6efa9d4acad 100644 --- a/sound/soc/intel/haswell/sst-haswell-ipc.c +++ b/sound/soc/intel/haswell/sst-haswell-ipc.c | |||
@@ -2119,6 +2119,8 @@ int sst_hsw_dsp_init(struct device *dev, struct sst_pdata *pdata) | |||
2119 | if (hsw == NULL) | 2119 | if (hsw == NULL) |
2120 | return -ENOMEM; | 2120 | return -ENOMEM; |
2121 | 2121 | ||
2122 | hsw->dev = dev; | ||
2123 | |||
2122 | ipc = &hsw->ipc; | 2124 | ipc = &hsw->ipc; |
2123 | ipc->dev = dev; | 2125 | ipc->dev = dev; |
2124 | ipc->ops.tx_msg = hsw_tx_msg; | 2126 | ipc->ops.tx_msg = hsw_tx_msg; |
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c index 59ac211f8fe7..31068b8f3db0 100644 --- a/sound/soc/soc-topology.c +++ b/sound/soc/soc-topology.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <sound/soc.h> | 33 | #include <sound/soc.h> |
34 | #include <sound/soc-dapm.h> | 34 | #include <sound/soc-dapm.h> |
35 | #include <sound/soc-topology.h> | 35 | #include <sound/soc-topology.h> |
36 | #include <sound/tlv.h> | ||
36 | 37 | ||
37 | /* | 38 | /* |
38 | * We make several passes over the data (since it wont necessarily be ordered) | 39 | * 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, | |||
534 | k->put = bops[i].put; | 535 | k->put = bops[i].put; |
535 | if (k->get == NULL && bops[i].id == hdr->ops.get) | 536 | if (k->get == NULL && bops[i].id == hdr->ops.get) |
536 | k->get = bops[i].get; | 537 | k->get = bops[i].get; |
537 | if (k->info == NULL && ops[i].id == hdr->ops.info) | 538 | if (k->info == NULL && bops[i].id == hdr->ops.info) |
538 | k->info = bops[i].info; | 539 | k->info = bops[i].info; |
539 | } | 540 | } |
540 | 541 | ||
@@ -579,28 +580,51 @@ static int soc_tplg_init_kcontrol(struct soc_tplg *tplg, | |||
579 | return 0; | 580 | return 0; |
580 | } | 581 | } |
581 | 582 | ||
583 | |||
584 | static int soc_tplg_create_tlv_db_scale(struct soc_tplg *tplg, | ||
585 | struct snd_kcontrol_new *kc, struct snd_soc_tplg_tlv_dbscale *scale) | ||
586 | { | ||
587 | unsigned int item_len = 2 * sizeof(unsigned int); | ||
588 | unsigned int *p; | ||
589 | |||
590 | p = kzalloc(item_len + 2 * sizeof(unsigned int), GFP_KERNEL); | ||
591 | if (!p) | ||
592 | return -ENOMEM; | ||
593 | |||
594 | p[0] = SNDRV_CTL_TLVT_DB_SCALE; | ||
595 | p[1] = item_len; | ||
596 | p[2] = scale->min; | ||
597 | p[3] = (scale->step & TLV_DB_SCALE_MASK) | ||
598 | | (scale->mute ? TLV_DB_SCALE_MUTE : 0); | ||
599 | |||
600 | kc->tlv.p = (void *)p; | ||
601 | return 0; | ||
602 | } | ||
603 | |||
582 | static int soc_tplg_create_tlv(struct soc_tplg *tplg, | 604 | static int soc_tplg_create_tlv(struct soc_tplg *tplg, |
583 | struct snd_kcontrol_new *kc, struct snd_soc_tplg_ctl_tlv *tplg_tlv) | 605 | struct snd_kcontrol_new *kc, struct snd_soc_tplg_ctl_hdr *tc) |
584 | { | 606 | { |
585 | struct snd_ctl_tlv *tlv; | 607 | struct snd_soc_tplg_ctl_tlv *tplg_tlv; |
586 | int size; | ||
587 | 608 | ||
588 | if (tplg_tlv->count == 0) | 609 | if (!(tc->access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE)) |
589 | return 0; | 610 | return 0; |
590 | 611 | ||
591 | size = ((tplg_tlv->count + (sizeof(unsigned int) - 1)) & | 612 | if (tc->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) { |
592 | ~(sizeof(unsigned int) - 1)); | 613 | kc->tlv.c = snd_soc_bytes_tlv_callback; |
593 | tlv = kzalloc(sizeof(*tlv) + size, GFP_KERNEL); | 614 | } else { |
594 | if (tlv == NULL) | 615 | tplg_tlv = &tc->tlv; |
595 | return -ENOMEM; | 616 | switch (tplg_tlv->type) { |
596 | 617 | case SNDRV_CTL_TLVT_DB_SCALE: | |
597 | dev_dbg(tplg->dev, " created TLV type %d size %d bytes\n", | 618 | return soc_tplg_create_tlv_db_scale(tplg, kc, |
598 | tplg_tlv->numid, size); | 619 | &tplg_tlv->scale); |
599 | 620 | ||
600 | tlv->numid = tplg_tlv->numid; | 621 | /* TODO: add support for other TLV types */ |
601 | tlv->length = size; | 622 | default: |
602 | memcpy(&tlv->tlv[0], tplg_tlv->data, size); | 623 | dev_dbg(tplg->dev, "Unsupported TLV type %d\n", |
603 | kc->tlv.p = (void *)tlv; | 624 | tplg_tlv->type); |
625 | return -EINVAL; | ||
626 | } | ||
627 | } | ||
604 | 628 | ||
605 | return 0; | 629 | return 0; |
606 | } | 630 | } |
@@ -772,7 +796,7 @@ static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count, | |||
772 | } | 796 | } |
773 | 797 | ||
774 | /* create any TLV data */ | 798 | /* create any TLV data */ |
775 | soc_tplg_create_tlv(tplg, &kc, &mc->tlv); | 799 | soc_tplg_create_tlv(tplg, &kc, &mc->hdr); |
776 | 800 | ||
777 | /* register control here */ | 801 | /* register control here */ |
778 | err = soc_tplg_add_kcontrol(tplg, &kc, | 802 | err = soc_tplg_add_kcontrol(tplg, &kc, |
@@ -1350,6 +1374,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, | |||
1350 | template.reg = w->reg; | 1374 | template.reg = w->reg; |
1351 | template.shift = w->shift; | 1375 | template.shift = w->shift; |
1352 | template.mask = w->mask; | 1376 | template.mask = w->mask; |
1377 | template.subseq = w->subseq; | ||
1353 | template.on_val = w->invert ? 0 : 1; | 1378 | template.on_val = w->invert ? 0 : 1; |
1354 | template.off_val = w->invert ? 1 : 0; | 1379 | template.off_val = w->invert ? 1 : 0; |
1355 | template.ignore_suspend = w->ignore_suspend; | 1380 | template.ignore_suspend = w->ignore_suspend; |