| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * cs4265.c -- CS4265 ALSA SoC audio driver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright 2014 Cirrus Logic, Inc. |
|---|
| 5 | 6 | * |
|---|
| 6 | 7 | * Author: Paul Handrigan <paul.handrigan@cirrus.com> |
|---|
| 7 | | - * |
|---|
| 8 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 9 | | - * it under the terms of the GNU General Public License version 2 as |
|---|
| 10 | | - * published by the Free Software Foundation. |
|---|
| 11 | | - * |
|---|
| 12 | 8 | */ |
|---|
| 13 | 9 | |
|---|
| 14 | 10 | #include <linux/module.h> |
|---|
| .. | .. |
|---|
| 157 | 153 | SOC_SINGLE("Validity Bit Control Switch", CS4265_SPDIF_CTL2, |
|---|
| 158 | 154 | 3, 1, 0), |
|---|
| 159 | 155 | SOC_ENUM("SPDIF Mono/Stereo", spdif_mono_stereo_enum), |
|---|
| 160 | | - SOC_SINGLE("MMTLR Data Switch", CS4265_SPDIF_CTL2, |
|---|
| 161 | | - 0, 1, 0), |
|---|
| 156 | + SOC_SINGLE("MMTLR Data Switch", CS4265_SPDIF_CTL2, 0, 1, 0), |
|---|
| 162 | 157 | SOC_ENUM("Mono Channel Select", spdif_mono_select_enum), |
|---|
| 163 | 158 | SND_SOC_BYTES("C Data Buffer", CS4265_C_DATA_BUFF, 24), |
|---|
| 164 | 159 | }; |
|---|
| .. | .. |
|---|
| 190 | 185 | |
|---|
| 191 | 186 | SND_SOC_DAPM_SWITCH("Loopback", SND_SOC_NOPM, 0, 0, |
|---|
| 192 | 187 | &loopback_ctl), |
|---|
| 193 | | - SND_SOC_DAPM_SWITCH("SPDIF", SND_SOC_NOPM, 0, 0, |
|---|
| 188 | + SND_SOC_DAPM_SWITCH("SPDIF", CS4265_SPDIF_CTL2, 5, 1, |
|---|
| 194 | 189 | &spdif_switch), |
|---|
| 195 | 190 | SND_SOC_DAPM_SWITCH("DAC", CS4265_PWRCTL, 1, 1, |
|---|
| 196 | 191 | &dac_switch), |
|---|
| .. | .. |
|---|
| 221 | 216 | {"LINEOUTR", NULL, "DAC"}, |
|---|
| 222 | 217 | {"SPDIFOUT", NULL, "SPDIF"}, |
|---|
| 223 | 218 | |
|---|
| 219 | + {"Pre-amp MIC", NULL, "MICL"}, |
|---|
| 220 | + {"Pre-amp MIC", NULL, "MICR"}, |
|---|
| 221 | + {"ADC Mux", "MIC", "Pre-amp MIC"}, |
|---|
| 224 | 222 | {"ADC Mux", "LINEIN", "LINEINL"}, |
|---|
| 225 | 223 | {"ADC Mux", "LINEIN", "LINEINR"}, |
|---|
| 226 | | - {"ADC Mux", "MIC", "MICL"}, |
|---|
| 227 | | - {"ADC Mux", "MIC", "MICR"}, |
|---|
| 228 | 224 | {"ADC", NULL, "ADC Mux"}, |
|---|
| 229 | 225 | {"DOUT", NULL, "ADC"}, |
|---|
| 230 | 226 | {"DAI1 Capture", NULL, "DOUT"}, |
|---|
| .. | .. |
|---|
| 381 | 377 | return 0; |
|---|
| 382 | 378 | } |
|---|
| 383 | 379 | |
|---|
| 384 | | -static int cs4265_digital_mute(struct snd_soc_dai *dai, int mute) |
|---|
| 380 | +static int cs4265_mute(struct snd_soc_dai *dai, int mute, int direction) |
|---|
| 385 | 381 | { |
|---|
| 386 | 382 | struct snd_soc_component *component = dai->component; |
|---|
| 387 | 383 | |
|---|
| .. | .. |
|---|
| 496 | 492 | SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000) |
|---|
| 497 | 493 | |
|---|
| 498 | 494 | #define CS4265_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_U16_LE | \ |
|---|
| 499 | | - SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_U24_LE) |
|---|
| 495 | + SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_U24_LE | \ |
|---|
| 496 | + SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_U32_LE) |
|---|
| 500 | 497 | |
|---|
| 501 | 498 | static const struct snd_soc_dai_ops cs4265_ops = { |
|---|
| 502 | 499 | .hw_params = cs4265_pcm_hw_params, |
|---|
| 503 | | - .digital_mute = cs4265_digital_mute, |
|---|
| 500 | + .mute_stream = cs4265_mute, |
|---|
| 504 | 501 | .set_fmt = cs4265_set_fmt, |
|---|
| 505 | 502 | .set_sysclk = cs4265_set_sysclk, |
|---|
| 503 | + .no_capture_mute = 1, |
|---|
| 506 | 504 | }; |
|---|
| 507 | 505 | |
|---|
| 508 | 506 | static struct snd_soc_dai_driver cs4265_dai[] = { |
|---|