mirror of
https://github.com/armbian/build.git
synced 2025-09-19 20:51:12 +02:00
I have changed the way the patches are generated a bit. Instead of using orange-pi branch from megous tree for 6.6 kernel, I have used the following kernel branches a83t-suspend, af8133j, anx, audio, axp, cam, drm, err, fixes, mbus, modem, opi3, pb, pinetab, pp, ppkb, samuel, speed, tbs-a711, ths These branches were carefully chosen to include only allwinner related patches and remove importing of the rockchip related patches into the allwinner kernel. Following patches are modified to fix patch application failure - patches.armbian/arm64-dts-sun50i-h616-orangepi-zero2-reg_usb1_vbus-status-ok.patch - patches.armbian/arm64-dts-sun50i-h616-orangepi-zero2-Enable-GPU-mali.patch - patches.armbian/arm64-dts-allwinner-h616-Add-efuse_xlate-cpu-frequency-scaling-v1_6_2.patch - patches.armbian/arm64-dts-allwinner-h616-LED-green_power_on-red_status_heartbeat.patch - patches.armbian/arm64-dts-allwinner-overlay-Add-Overlays-for-sunxi64.patch - patches.armbian/arm64-dts-sun50i-h616-bigtreetech-cb1.patch Following patches are modified because of kernel api change to fix compilation failure - patches.armbian/drv-gpu-drm-sun4i-Add-HDMI-audio-sun4i-hdmi-encoder.patch - patches.armbian/drv-of-Device-Tree-Overlay-ConfigFS-interface.patch
1074 lines
48 KiB
Diff
1074 lines
48 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Ond=C5=99ej=20Jirman?= <megi@xff.cz>
|
|
Date: Sun, 12 Nov 2017 23:09:14 +0100
|
|
Subject: sound: soc: ac100-codec: Support analog part of X-Powers AC100 codec
|
|
|
|
Most of the controls are implemented.
|
|
|
|
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
|
---
|
|
drivers/mfd/ac100.c | 3 +
|
|
include/linux/mfd/ac100.h | 1 +
|
|
sound/soc/sunxi/Kconfig | 11 +
|
|
sound/soc/sunxi/Makefile | 1 +
|
|
sound/soc/sunxi/ac100-codec.c | 991 ++++++++++
|
|
5 files changed, 1007 insertions(+)
|
|
|
|
diff --git a/drivers/mfd/ac100.c b/drivers/mfd/ac100.c
|
|
index 6d49d7fb5f14..b02f2c015d58 100644
|
|
--- a/drivers/mfd/ac100.c
|
|
+++ b/drivers/mfd/ac100.c
|
|
@@ -79,6 +79,9 @@ static struct mfd_cell ac100_cells[] = {
|
|
{
|
|
.name = "ac100-codec",
|
|
.of_compatible = "x-powers,ac100-codec",
|
|
+ }, {
|
|
+ .name = "ac100-codec-analog",
|
|
+ .of_compatible = "x-powers,ac100-codec-analog",
|
|
}, {
|
|
.name = "ac100-rtc",
|
|
.of_compatible = "x-powers,ac100-rtc",
|
|
diff --git a/include/linux/mfd/ac100.h b/include/linux/mfd/ac100.h
|
|
index 88005c3a1b2d..621bd10b79b2 100644
|
|
--- a/include/linux/mfd/ac100.h
|
|
+++ b/include/linux/mfd/ac100.h
|
|
@@ -80,6 +80,7 @@ struct ac100_dev {
|
|
#define AC100_ERPOUT_CTRL 0x57
|
|
#define AC100_SPKOUT_CTRL 0x58
|
|
#define AC100_LINEOUT_CTRL 0x59
|
|
+#define AC100_ADDA_TUNE1 0x5a
|
|
|
|
/* ADC digital audio processing (high pass filter & auto gain control */
|
|
#define AC100_ADC_DAP_L_STA 0x80
|
|
diff --git a/sound/soc/sunxi/Kconfig b/sound/soc/sunxi/Kconfig
|
|
index c61a44bf5198..753c38c5d554 100644
|
|
--- a/sound/soc/sunxi/Kconfig
|
|
+++ b/sound/soc/sunxi/Kconfig
|
|
@@ -24,6 +24,17 @@ config SND_SUN8I_CODEC
|
|
|
|
Say Y or M if you want to add sun8i digital audio codec support.
|
|
|
|
+config SND_AC100_CODEC
|
|
+ tristate "Allwinner (X-Powers) AC100 audio codec (analog part)"
|
|
+ depends on OF
|
|
+ depends on MACH_SUN8I || COMPILE_TEST
|
|
+ select MFD_AC100
|
|
+ help
|
|
+ This option enables the audio codec support for Allwinner (X-Powers)
|
|
+ AC100 chip.
|
|
+
|
|
+ Say Y or M if you want to add AC100 audio codec support.
|
|
+
|
|
config SND_SUN8I_CODEC_ANALOG
|
|
tristate "Allwinner sun8i Codec Analog Controls Support"
|
|
depends on MACH_SUN8I || (ARM64 && ARCH_SUNXI) || COMPILE_TEST
|
|
diff --git a/sound/soc/sunxi/Makefile b/sound/soc/sunxi/Makefile
|
|
index f9b7daf063fe..0dccdaa35bec 100644
|
|
--- a/sound/soc/sunxi/Makefile
|
|
+++ b/sound/soc/sunxi/Makefile
|
|
@@ -8,3 +8,4 @@ obj-$(CONFIG_SND_SUN8I_CODEC) += sun8i-codec.o
|
|
obj-$(CONFIG_SND_SUN8I_ADDA_PR_REGMAP) += sun8i-adda-pr-regmap.o
|
|
obj-$(CONFIG_SND_SUN50I_DMIC) += sun50i-dmic.o
|
|
obj-$(CONFIG_SND_SUN9I_HDMI_AUDIO) += sun9i-hdmi-audio.o
|
|
+obj-$(CONFIG_SND_AC100_CODEC) += ac100-codec.o
|
|
diff --git a/sound/soc/sunxi/ac100-codec.c b/sound/soc/sunxi/ac100-codec.c
|
|
new file mode 100644
|
|
index 000000000000..c3fec8d8da52
|
|
--- /dev/null
|
|
+++ b/sound/soc/sunxi/ac100-codec.c
|
|
@@ -0,0 +1,991 @@
|
|
+/*
|
|
+ * This driver supports the controls for X-Powers (Allwinner)
|
|
+ * AC100 audio codec. This codec is co-packaged with AXP81x PMICs.
|
|
+ *
|
|
+ * (C) Copyright 2020 Ondrej Jirman <megi@xff.cz>
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or modify
|
|
+ * it under the terms of the GNU General Public License as published by
|
|
+ * the Free Software Foundation; either version 2 of the License, or
|
|
+ * (at your option) any later version.
|
|
+ *
|
|
+ * This program is distributed in the hope that it will be useful,
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ * GNU General Public License for more details.
|
|
+ */
|
|
+
|
|
+#include <linux/module.h>
|
|
+#include <linux/delay.h>
|
|
+#include <linux/clk.h>
|
|
+#include <linux/io.h>
|
|
+#include <linux/pm_runtime.h>
|
|
+#include <linux/regmap.h>
|
|
+#include <linux/mfd/ac100.h>
|
|
+
|
|
+#include <sound/pcm_params.h>
|
|
+#include <sound/soc.h>
|
|
+#include <sound/tlv.h>
|
|
+#include <sound/soc-dapm.h>
|
|
+
|
|
+#define AC100_ADC_APC_CTRL_ADCR_EN_OFF 15
|
|
+#define AC100_ADC_APC_CTRL_ADCR_EN_MASK BIT(15)
|
|
+#define AC100_ADC_APC_CTRL_ADCR_EN_DISABLED 0
|
|
+#define AC100_ADC_APC_CTRL_ADCR_EN_ENABLED BIT(15)
|
|
+#define AC100_ADC_APC_CTRL_ADCR_GAIN_OFF 12
|
|
+#define AC100_ADC_APC_CTRL_ADCR_GAIN(v) (((v) & 0x7) << 12)
|
|
+#define AC100_ADC_APC_CTRL_ADCL_EN_OFF 11
|
|
+#define AC100_ADC_APC_CTRL_ADCL_EN_MASK BIT(11)
|
|
+#define AC100_ADC_APC_CTRL_ADCL_EN_DISABLED 0
|
|
+#define AC100_ADC_APC_CTRL_ADCL_EN_ENABLED BIT(11)
|
|
+#define AC100_ADC_APC_CTRL_ADCL_GAIN_OFF 8
|
|
+#define AC100_ADC_APC_CTRL_ADCL_GAIN(v) (((v) & 0x7) << 8)
|
|
+#define AC100_ADC_APC_CTRL_MBIAS_EN_OFF 7
|
|
+#define AC100_ADC_APC_CTRL_MBIAS_EN_MASK BIT(7)
|
|
+#define AC100_ADC_APC_CTRL_MBIAS_EN_DISABLED 0
|
|
+#define AC100_ADC_APC_CTRL_MBIAS_EN_ENABLED BIT(7)
|
|
+#define AC100_ADC_APC_CTRL_MMIC_BIAS_CHOPPER_EN_OFF 6
|
|
+#define AC100_ADC_APC_CTRL_MMIC_BIAS_CHOPPER_EN_MASK BIT(6)
|
|
+#define AC100_ADC_APC_CTRL_MMIC_BIAS_CHOPPER_EN_DISABLED 0
|
|
+#define AC100_ADC_APC_CTRL_MMIC_BIAS_CHOPPER_EN_ENABLED BIT(6)
|
|
+#define AC100_ADC_APC_CTRL_MMIC_BIAS_CHOPPER_CKS_OFF 4
|
|
+#define AC100_ADC_APC_CTRL_MMIC_BIAS_CHOPPER_CKS_MASK GENMASK(5, 4)
|
|
+#define AC100_ADC_APC_CTRL_MMIC_BIAS_CHOPPER_CKS_250K (0x0 << 4)
|
|
+#define AC100_ADC_APC_CTRL_MMIC_BIAS_CHOPPER_CKS_500K (0x1 << 4)
|
|
+#define AC100_ADC_APC_CTRL_MMIC_BIAS_CHOPPER_CKS_1M (0x2 << 4)
|
|
+#define AC100_ADC_APC_CTRL_MMIC_BIAS_CHOPPER_CKS_2M (0x3 << 4)
|
|
+#define AC100_ADC_APC_CTRL_HBIAS_MODE_OFF 2
|
|
+#define AC100_ADC_APC_CTRL_HBIAS_MODE_MASK BIT(2)
|
|
+#define AC100_ADC_APC_CTRL_HBIAS_MODE_LOAD 0
|
|
+#define AC100_ADC_APC_CTRL_HBIAS_MODE_HBIAS_EN BIT(2)
|
|
+#define AC100_ADC_APC_CTRL_HBIAS_EN_OFF 1
|
|
+#define AC100_ADC_APC_CTRL_HBIAS_EN_MASK BIT(1)
|
|
+#define AC100_ADC_APC_CTRL_HBIAS_EN_DISABLED 0
|
|
+#define AC100_ADC_APC_CTRL_HBIAS_EN_ENABLED BIT(1)
|
|
+#define AC100_ADC_APC_CTRL_HBIAS_ADC_EN_OFF 0
|
|
+#define AC100_ADC_APC_CTRL_HBIAS_ADC_EN_MASK BIT(0)
|
|
+#define AC100_ADC_APC_CTRL_HBIAS_ADC_EN_DISABLED 0
|
|
+#define AC100_ADC_APC_CTRL_HBIAS_ADC_EN_ENABLED BIT(0)
|
|
+
|
|
+#define AC100_ADC_SRC_ADCR_MIC1_BOOST_OFF 13
|
|
+#define AC100_ADC_SRC_ADCR_MIC1_BOOST_MASK BIT(13)
|
|
+#define AC100_ADC_SRC_ADCR_MIC1_BOOST_DISABLED 0
|
|
+#define AC100_ADC_SRC_ADCR_MIC1_BOOST_ENABLED BIT(13)
|
|
+#define AC100_ADC_SRC_ADCR_MIC2_BOOST_OFF 12
|
|
+#define AC100_ADC_SRC_ADCR_MIC2_BOOST_MASK BIT(12)
|
|
+#define AC100_ADC_SRC_ADCR_MIC2_BOOST_DISABLED 0
|
|
+#define AC100_ADC_SRC_ADCR_MIC2_BOOST_ENABLED BIT(12)
|
|
+#define AC100_ADC_SRC_ADCR_LINEINL_LINEINR_OFF 11
|
|
+#define AC100_ADC_SRC_ADCR_LINEINL_LINEINR_MASK BIT(11)
|
|
+#define AC100_ADC_SRC_ADCR_LINEINL_LINEINR_DISABLED 0
|
|
+#define AC100_ADC_SRC_ADCR_LINEINL_LINEINR_ENABLED BIT(11)
|
|
+#define AC100_ADC_SRC_ADCR_LINEINR_OFF 10
|
|
+#define AC100_ADC_SRC_ADCR_LINEINR_MASK BIT(10)
|
|
+#define AC100_ADC_SRC_ADCR_LINEINR_DISABLED 0
|
|
+#define AC100_ADC_SRC_ADCR_LINEINR_ENABLED BIT(10)
|
|
+#define AC100_ADC_SRC_ADCR_AUXINR_OFF 9
|
|
+#define AC100_ADC_SRC_ADCR_AUXINR_MASK BIT(9)
|
|
+#define AC100_ADC_SRC_ADCR_AUXINR_DISABLED 0
|
|
+#define AC100_ADC_SRC_ADCR_AUXINR_ENABLED BIT(9)
|
|
+#define AC100_ADC_SRC_ADCR_ROUTMIX_OFF 8
|
|
+#define AC100_ADC_SRC_ADCR_ROUTMIX_MASK BIT(8)
|
|
+#define AC100_ADC_SRC_ADCR_ROUTMIX_DISABLED 0
|
|
+#define AC100_ADC_SRC_ADCR_ROUTMIX_ENABLED BIT(8)
|
|
+#define AC100_ADC_SRC_ADCR_LOUTMIX_OFF 7
|
|
+#define AC100_ADC_SRC_ADCR_LOUTMIX_MASK BIT(7)
|
|
+#define AC100_ADC_SRC_ADCR_LOUTMIX_DISABLED 0
|
|
+#define AC100_ADC_SRC_ADCR_LOUTMIX_ENABLED BIT(7)
|
|
+#define AC100_ADC_SRC_ADCL_MIC1_BOOST_OFF 6
|
|
+#define AC100_ADC_SRC_ADCL_MIC1_BOOST_MASK BIT(6)
|
|
+#define AC100_ADC_SRC_ADCL_MIC1_BOOST_DISABLED 0
|
|
+#define AC100_ADC_SRC_ADCL_MIC1_BOOST_ENABLED BIT(6)
|
|
+#define AC100_ADC_SRC_ADCL_MIC2_BOOST_OFF 5
|
|
+#define AC100_ADC_SRC_ADCL_MIC2_BOOST_MASK BIT(5)
|
|
+#define AC100_ADC_SRC_ADCL_MIC2_BOOST_DISABLED 0
|
|
+#define AC100_ADC_SRC_ADCL_MIC2_BOOST_ENABLED BIT(5)
|
|
+#define AC100_ADC_SRC_ADCL_LINEINL_LINEINR_OFF 4
|
|
+#define AC100_ADC_SRC_ADCL_LINEINL_LINEINR_MASK BIT(4)
|
|
+#define AC100_ADC_SRC_ADCL_LINEINL_LINEINR_DISABLED 0
|
|
+#define AC100_ADC_SRC_ADCL_LINEINL_LINEINR_ENABLED BIT(4)
|
|
+#define AC100_ADC_SRC_ADCL_LINEINL_OFF 3
|
|
+#define AC100_ADC_SRC_ADCL_LINEINL_MASK BIT(3)
|
|
+#define AC100_ADC_SRC_ADCL_LINEINL_DISABLED 0
|
|
+#define AC100_ADC_SRC_ADCL_LINEINL_ENABLED BIT(3)
|
|
+#define AC100_ADC_SRC_ADCL_AUXINL_OFF 2
|
|
+#define AC100_ADC_SRC_ADCL_AUXINL_MASK BIT(2)
|
|
+#define AC100_ADC_SRC_ADCL_AUXINL_DISABLED 0
|
|
+#define AC100_ADC_SRC_ADCL_AUXINL_ENABLED BIT(2)
|
|
+#define AC100_ADC_SRC_ADCL_LOUTMIX_OFF 1
|
|
+#define AC100_ADC_SRC_ADCL_LOUTMIX_MASK BIT(1)
|
|
+#define AC100_ADC_SRC_ADCL_LOUTMIX_DISABLED 0
|
|
+#define AC100_ADC_SRC_ADCL_LOUTMIX_ENABLED BIT(1)
|
|
+#define AC100_ADC_SRC_ADCL_ROUTMIX_OFF 0
|
|
+#define AC100_ADC_SRC_ADCL_ROUTMIX_MASK BIT(0)
|
|
+#define AC100_ADC_SRC_ADCL_ROUTMIX_DISABLED 0
|
|
+#define AC100_ADC_SRC_ADCL_ROUTMIX_ENABLED BIT(0)
|
|
+
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC1AMPEN_OFF 15
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC1AMPEN_MASK BIT(15)
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC1AMPEN_DISABLED 0
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC1AMPEN_ENABLED BIT(15)
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC1BOOST_OFF 12
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC1BOOST(v) (((v) & 0x7) << 12)
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC2AMPEN_OFF 11
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC2AMPEN_MASK BIT(11)
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC2AMPEN_DISABLED 0
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC2AMPEN_ENABLED BIT(11)
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC2BOOST_OFF 8
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC2BOOST(v) (((v) & 0x7) << 8)
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC2SLT_OFF 7
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC2SLT_MASK BIT(7)
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC2SLT_MIC2 0
|
|
+#define AC100_ADC_SRC_BST_CTRL_MIC2SLT_MIC3 BIT(7)
|
|
+#define AC100_ADC_SRC_BST_CTRL_LINEIN_DIFF_PREG_OFF 4
|
|
+#define AC100_ADC_SRC_BST_CTRL_LINEIN_DIFF_PREG(v) (((v) & 0x7) << 4)
|
|
+#define AC100_ADC_SRC_BST_CTRL_AXI_PREG_OFF 0
|
|
+#define AC100_ADC_SRC_BST_CTRL_AXI_PREG(v) ((v) & 0x7)
|
|
+
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_DAC_AR_EN_OFF 15
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_DAC_AR_EN_MASK BIT(15)
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_DAC_AR_EN_DISABLED 0
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_DAC_AR_EN_ENABLED BIT(15)
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_DAC_AL_EN_OFF 14
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_DAC_AL_EN_MASK BIT(14)
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_DAC_AL_EN_DISABLED 0
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_DAC_AL_EN_ENABLED BIT(14)
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_AR_MIX_EN_OFF 13
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_AR_MIX_EN_MASK BIT(13)
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_AR_MIX_EN_DISABLED 0
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_AR_MIX_EN_ENABLED BIT(13)
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_AL_MIX_EN_OFF 12
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_AL_MIX_EN_MASK BIT(12)
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_AL_MIX_EN_DISABLED 0
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_AL_MIX_EN_ENABLED BIT(12)
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_HP_DCRM_EN_OFF 8
|
|
+#define AC100_OUT_MXR_DAC_A_CTRL_HP_DCRM_EN(v) (((v) & 0xf) << 8)
|
|
+
|
|
+#define AC100_OUT_MXR_SRC_RMIX_MIC1_BOOST_OFF 13
|
|
+#define AC100_OUT_MXR_SRC_RMIX_MIC1_BOOST_MASK BIT(13)
|
|
+#define AC100_OUT_MXR_SRC_RMIX_MIC1_BOOST_DISABLED 0
|
|
+#define AC100_OUT_MXR_SRC_RMIX_MIC1_BOOST_ENABLED BIT(13)
|
|
+#define AC100_OUT_MXR_SRC_RMIX_MIC2_BOOST_OFF 12
|
|
+#define AC100_OUT_MXR_SRC_RMIX_MIC2_BOOST_MASK BIT(12)
|
|
+#define AC100_OUT_MXR_SRC_RMIX_MIC2_BOOST_DISABLED 0
|
|
+#define AC100_OUT_MXR_SRC_RMIX_MIC2_BOOST_ENABLED BIT(12)
|
|
+#define AC100_OUT_MXR_SRC_RMIX_LINEINL_LINEINR_OFF 11
|
|
+#define AC100_OUT_MXR_SRC_RMIX_LINEINL_LINEINR_MASK BIT(11)
|
|
+#define AC100_OUT_MXR_SRC_RMIX_LINEINL_LINEINR_DISABLED 0
|
|
+#define AC100_OUT_MXR_SRC_RMIX_LINEINL_LINEINR_ENABLED BIT(11)
|
|
+#define AC100_OUT_MXR_SRC_RMIX_LINEINR_OFF 10
|
|
+#define AC100_OUT_MXR_SRC_RMIX_LINEINR_MASK BIT(10)
|
|
+#define AC100_OUT_MXR_SRC_RMIX_LINEINR_DISABLED 0
|
|
+#define AC100_OUT_MXR_SRC_RMIX_LINEINR_ENABLED BIT(10)
|
|
+#define AC100_OUT_MXR_SRC_RMIX_AUXINR_OFF 9
|
|
+#define AC100_OUT_MXR_SRC_RMIX_AUXINR_MASK BIT(9)
|
|
+#define AC100_OUT_MXR_SRC_RMIX_AUXINR_DISABLED 0
|
|
+#define AC100_OUT_MXR_SRC_RMIX_AUXINR_ENABLED BIT(9)
|
|
+#define AC100_OUT_MXR_SRC_RMIX_DACR_OFF 8
|
|
+#define AC100_OUT_MXR_SRC_RMIX_DACR_MASK BIT(8)
|
|
+#define AC100_OUT_MXR_SRC_RMIX_DACR_DISABLED 0
|
|
+#define AC100_OUT_MXR_SRC_RMIX_DACR_ENABLED BIT(8)
|
|
+#define AC100_OUT_MXR_SRC_RMIX_DACL_OFF 7
|
|
+#define AC100_OUT_MXR_SRC_RMIX_DACL_MASK BIT(7)
|
|
+#define AC100_OUT_MXR_SRC_RMIX_DACL_DISABLED 0
|
|
+#define AC100_OUT_MXR_SRC_RMIX_DACL_ENABLED BIT(7)
|
|
+#define AC100_OUT_MXR_SRC_LMIX_MIC1_BOOST_OFF 6
|
|
+#define AC100_OUT_MXR_SRC_LMIX_MIC1_BOOST_MASK BIT(6)
|
|
+#define AC100_OUT_MXR_SRC_LMIX_MIC1_BOOST_DISABLED 0
|
|
+#define AC100_OUT_MXR_SRC_LMIX_MIC1_BOOST_ENABLED BIT(6)
|
|
+#define AC100_OUT_MXR_SRC_LMIX_MIC2_BOOST_OFF 5
|
|
+#define AC100_OUT_MXR_SRC_LMIX_MIC2_BOOST_MASK BIT(5)
|
|
+#define AC100_OUT_MXR_SRC_LMIX_MIC2_BOOST_DISABLED 0
|
|
+#define AC100_OUT_MXR_SRC_LMIX_MIC2_BOOST_ENABLED BIT(5)
|
|
+#define AC100_OUT_MXR_SRC_LMIX_LINEINL_LINEINR_OFF 4
|
|
+#define AC100_OUT_MXR_SRC_LMIX_LINEINL_LINEINR_MASK BIT(4)
|
|
+#define AC100_OUT_MXR_SRC_LMIX_LINEINL_LINEINR_DISABLED 0
|
|
+#define AC100_OUT_MXR_SRC_LMIX_LINEINL_LINEINR_ENABLED BIT(4)
|
|
+#define AC100_OUT_MXR_SRC_LMIX_LINEINL_OFF 3
|
|
+#define AC100_OUT_MXR_SRC_LMIX_LINEINL_MASK BIT(3)
|
|
+#define AC100_OUT_MXR_SRC_LMIX_LINEINL_DISABLED 0
|
|
+#define AC100_OUT_MXR_SRC_LMIX_LINEINL_ENABLED BIT(3)
|
|
+#define AC100_OUT_MXR_SRC_LMIX_AUXINL_OFF 2
|
|
+#define AC100_OUT_MXR_SRC_LMIX_AUXINL_MASK BIT(2)
|
|
+#define AC100_OUT_MXR_SRC_LMIX_AUXINL_DISABLED 0
|
|
+#define AC100_OUT_MXR_SRC_LMIX_AUXINL_ENABLED BIT(2)
|
|
+#define AC100_OUT_MXR_SRC_LMIX_DACL_OFF 1
|
|
+#define AC100_OUT_MXR_SRC_LMIX_DACL_MASK BIT(1)
|
|
+#define AC100_OUT_MXR_SRC_LMIX_DACL_DISABLED 0
|
|
+#define AC100_OUT_MXR_SRC_LMIX_DACL_ENABLED BIT(1)
|
|
+#define AC100_OUT_MXR_SRC_LMIX_DACR_OFF 0
|
|
+#define AC100_OUT_MXR_SRC_LMIX_DACR_MASK BIT(0)
|
|
+#define AC100_OUT_MXR_SRC_LMIX_DACR_DISABLED 0
|
|
+#define AC100_OUT_MXR_SRC_LMIX_DACR_ENABLED BIT(0)
|
|
+
|
|
+#define AC100_OUT_MXR_SRC_BST_HMICBIAS_VOLTAGE_OFF 14
|
|
+#define AC100_OUT_MXR_SRC_BST_HMICBIAS_VOLTAGE_MASK GENMASK(15, 14)
|
|
+#define AC100_OUT_MXR_SRC_BST_HMICBIAS_VOLTAGE_1_88V (0x0 << 14)
|
|
+#define AC100_OUT_MXR_SRC_BST_HMICBIAS_VOLTAGE_2_09V (0x1 << 14)
|
|
+#define AC100_OUT_MXR_SRC_BST_HMICBIAS_VOLTAGE_2_33V (0x2 << 14)
|
|
+#define AC100_OUT_MXR_SRC_BST_HMICBIAS_VOLTAGE_2_50V (0x3 << 14)
|
|
+#define AC100_OUT_MXR_SRC_BST_MMICBIAS_VOLTAGE_OFF 12
|
|
+#define AC100_OUT_MXR_SRC_BST_MMICBIAS_VOLTAGE_MASK GENMASK(13, 12)
|
|
+#define AC100_OUT_MXR_SRC_BST_MMICBIAS_VOLTAGE_1_88V (0x0 << 12)
|
|
+#define AC100_OUT_MXR_SRC_BST_MMICBIAS_VOLTAGE_2_09V (0x1 << 12)
|
|
+#define AC100_OUT_MXR_SRC_BST_MMICBIAS_VOLTAGE_2_33V (0x2 << 12)
|
|
+#define AC100_OUT_MXR_SRC_BST_MMICBIAS_VOLTAGE_2_50V (0x3 << 12)
|
|
+#define AC100_OUT_MXR_SRC_BST_AX_GAIN_OFF 9
|
|
+#define AC100_OUT_MXR_SRC_BST_AX_GAIN(v) (((v) & 0x7) << 9)
|
|
+#define AC100_OUT_MXR_SRC_BST_MIC1_GAIN_OFF 6
|
|
+#define AC100_OUT_MXR_SRC_BST_MIC1_GAIN(v) (((v) & 0x7) << 6)
|
|
+#define AC100_OUT_MXR_SRC_BST_MIC2_GAIN_OFF 3
|
|
+#define AC100_OUT_MXR_SRC_BST_MIC2_GAIN(v) (((v) & 0x7) << 3)
|
|
+#define AC100_OUT_MXR_SRC_BST_LINEIN_GAIN_OFF 0
|
|
+#define AC100_OUT_MXR_SRC_BST_LINEIN_GAIN(v) ((v) & 0x7)
|
|
+
|
|
+#define AC100_HPOUT_CTRL_RIGHT_SRC_OFF 15
|
|
+#define AC100_HPOUT_CTRL_RIGHT_SRC_MASK BIT(15)
|
|
+#define AC100_HPOUT_CTRL_RIGHT_SRC_DACR 0
|
|
+#define AC100_HPOUT_CTRL_RIGHT_SRC_RAMIX BIT(15)
|
|
+#define AC100_HPOUT_CTRL_LEFT_SRC_OFF 14
|
|
+#define AC100_HPOUT_CTRL_LEFT_SRC_MASK BIT(14)
|
|
+#define AC100_HPOUT_CTRL_LEFT_SRC_DACL 0
|
|
+#define AC100_HPOUT_CTRL_LEFT_SRC_LAMIX BIT(14)
|
|
+#define AC100_HPOUT_CTRL_RIGHT_PA_MUTE_OFF 13
|
|
+#define AC100_HPOUT_CTRL_RIGHT_PA_MUTE_MASK BIT(13)
|
|
+#define AC100_HPOUT_CTRL_RIGHT_PA_MUTE_MUTE 0
|
|
+#define AC100_HPOUT_CTRL_RIGHT_PA_MUTE_NOT_MUTE BIT(13)
|
|
+#define AC100_HPOUT_CTRL_LEFT_PA_MUTE_OFF 12
|
|
+#define AC100_HPOUT_CTRL_LEFT_PA_MUTE_MASK BIT(12)
|
|
+#define AC100_HPOUT_CTRL_LEFT_PA_MUTE_MUTE 0
|
|
+#define AC100_HPOUT_CTRL_LEFT_PA_MUTE_NOT_MUTE BIT(12)
|
|
+#define AC100_HPOUT_CTRL_PA_EN_OFF 11
|
|
+#define AC100_HPOUT_CTRL_PA_EN_MASK BIT(11)
|
|
+#define AC100_HPOUT_CTRL_PA_EN_DISABLED 0
|
|
+#define AC100_HPOUT_CTRL_PA_EN_ENABLED BIT(11)
|
|
+#define AC100_HPOUT_CTRL_VOLUME_OFF 4
|
|
+#define AC100_HPOUT_CTRL_VOLUME(v) (((v) & 0x3f) << 4)
|
|
+#define AC100_HPOUT_CTRL_STARTUP_DELAY_OFF 2
|
|
+#define AC100_HPOUT_CTRL_STARTUP_DELAY_MASK GENMASK(3, 2)
|
|
+#define AC100_HPOUT_CTRL_STARTUP_DELAY_4ms (0x0 << 2)
|
|
+#define AC100_HPOUT_CTRL_STARTUP_DELAY_8ms (0x1 << 2)
|
|
+#define AC100_HPOUT_CTRL_STARTUP_DELAY_16ms (0x2 << 2)
|
|
+#define AC100_HPOUT_CTRL_STARTUP_DELAY_32ms (0x3 << 2)
|
|
+#define AC100_HPOUT_CTRL_OUTPUT_CURRENT_OFF 0
|
|
+#define AC100_HPOUT_CTRL_OUTPUT_CURRENT(v) ((v) & 0x3)
|
|
+
|
|
+#define AC100_ERPOUT_CTRL_RAMP_TIME_OFF 11
|
|
+#define AC100_ERPOUT_CTRL_RAMP_TIME_MASK GENMASK(12, 11)
|
|
+#define AC100_ERPOUT_CTRL_RAMP_TIME_256ms (0x0 << 11)
|
|
+#define AC100_ERPOUT_CTRL_RAMP_TIME_512ms (0x1 << 11)
|
|
+#define AC100_ERPOUT_CTRL_RAMP_TIME_640ms (0x2 << 11)
|
|
+#define AC100_ERPOUT_CTRL_RAMP_TIME_768ms (0x3 << 11)
|
|
+#define AC100_ERPOUT_CTRL_OUT_CURRENT_OFF 9
|
|
+#define AC100_ERPOUT_CTRL_OUT_CURRENT(v) (((v) & 0x3) << 9)
|
|
+#define AC100_ERPOUT_CTRL_INPUT_SOURCE_OFF 7
|
|
+#define AC100_ERPOUT_CTRL_INPUT_SOURCE_MASK GENMASK(8, 7)
|
|
+#define AC100_ERPOUT_CTRL_INPUT_SOURCE_DACR (0x0 << 7)
|
|
+#define AC100_ERPOUT_CTRL_INPUT_SOURCE_DACL (0x1 << 7)
|
|
+#define AC100_ERPOUT_CTRL_INPUT_SOURCE_RAMIX (0x2 << 7)
|
|
+#define AC100_ERPOUT_CTRL_INPUT_SOURCE_LAMIX (0x3 << 7)
|
|
+#define AC100_ERPOUT_CTRL_MUTE_OFF 6
|
|
+#define AC100_ERPOUT_CTRL_MUTE_MASK BIT(6)
|
|
+#define AC100_ERPOUT_CTRL_MUTE_MUTE 0
|
|
+#define AC100_ERPOUT_CTRL_MUTE_NOT_MUTE BIT(6)
|
|
+#define AC100_ERPOUT_CTRL_PA_EN_OFF 5
|
|
+#define AC100_ERPOUT_CTRL_PA_EN_MASK BIT(5)
|
|
+#define AC100_ERPOUT_CTRL_PA_EN_DISABLED 0
|
|
+#define AC100_ERPOUT_CTRL_PA_EN_ENABLED BIT(5)
|
|
+#define AC100_ERPOUT_CTRL_VOLUME_OFF 0
|
|
+#define AC100_ERPOUT_CTRL_VOLUME(v) ((v) & 0x1f)
|
|
+
|
|
+#define AC100_SPKOUT_CTRL_RIGHT_SRC_OFF 12
|
|
+#define AC100_SPKOUT_CTRL_RIGHT_SRC_MASK BIT(12)
|
|
+#define AC100_SPKOUT_CTRL_RIGHT_SRC_MIXR 0
|
|
+#define AC100_SPKOUT_CTRL_RIGHT_SRC_MIXL_MIXR BIT(12)
|
|
+#define AC100_SPKOUT_CTRL_RIGHT_INV_EN_OFF 11
|
|
+#define AC100_SPKOUT_CTRL_RIGHT_INV_EN_MASK BIT(11)
|
|
+#define AC100_SPKOUT_CTRL_RIGHT_INV_EN_DISABLED 0
|
|
+#define AC100_SPKOUT_CTRL_RIGHT_INV_EN_ENABLED BIT(11)
|
|
+#define AC100_SPKOUT_CTRL_RIGHT_EN_OFF 9
|
|
+#define AC100_SPKOUT_CTRL_RIGHT_EN_MASK BIT(9)
|
|
+#define AC100_SPKOUT_CTRL_RIGHT_EN_DISABLED 0
|
|
+#define AC100_SPKOUT_CTRL_RIGHT_EN_ENABLED BIT(9)
|
|
+#define AC100_SPKOUT_CTRL_LEFT_SRC_OFF 8
|
|
+#define AC100_SPKOUT_CTRL_LEFT_SRC_MASK BIT(8)
|
|
+#define AC100_SPKOUT_CTRL_LEFT_SRC_MIXL 0
|
|
+#define AC100_SPKOUT_CTRL_LEFT_SRC_MIXL_MIXR BIT(8)
|
|
+#define AC100_SPKOUT_CTRL_LEFT_INV_EN_OFF 7
|
|
+#define AC100_SPKOUT_CTRL_LEFT_INV_EN_MASK BIT(7)
|
|
+#define AC100_SPKOUT_CTRL_LEFT_INV_EN_DISABLED 0
|
|
+#define AC100_SPKOUT_CTRL_LEFT_INV_EN_ENABLED BIT(7)
|
|
+#define AC100_SPKOUT_CTRL_LEFT_EN_OFF 5
|
|
+#define AC100_SPKOUT_CTRL_LEFT_EN_MASK BIT(5)
|
|
+#define AC100_SPKOUT_CTRL_LEFT_EN_DISABLED 0
|
|
+#define AC100_SPKOUT_CTRL_LEFT_EN_ENABLED BIT(5)
|
|
+#define AC100_SPKOUT_CTRL_VOLUME_OFF 0
|
|
+#define AC100_SPKOUT_CTRL_VOLUME(v) ((v) & 0x1f)
|
|
+
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_GAIN_OFF 5
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_GAIN(v) (((v) & 0x7) << 5)
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_EN_OFF 4
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_EN_MASK BIT(4)
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_EN_DISABLED 0
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_EN_ENABLED BIT(4)
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S0_OFF 3
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S0_MASK BIT(3)
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S0_MUTE 0
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S0_ON BIT(3)
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S1_OFF 2
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S1_MASK BIT(2)
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S1_MUTE 0
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S1_ON BIT(2)
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S2_OFF 1
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S2_MASK BIT(1)
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S2_MUTE 0
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S2_ON BIT(1)
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S3_OFF 0
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S3_MASK BIT(0)
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S3_MUTE 0
|
|
+#define AC100_LINEOUT_CTRL_LINEOUT_S3_ON BIT(0)
|
|
+
|
|
+#define AC100_ADDA_TUNE1_ZERO_CROSSOVER_EN_OFF 8
|
|
+#define AC100_ADDA_TUNE1_ZERO_CROSSOVER_EN_MASK BIT(8)
|
|
+#define AC100_ADDA_TUNE1_ZERO_CROSSOVER_EN_DIS 0
|
|
+#define AC100_ADDA_TUNE1_ZERO_CROSSOVER_EN_EN BIT(8)
|
|
+#define AC100_ADDA_TUNE1_ZERO_CROSSOVER_TIME_OFF 7
|
|
+#define AC100_ADDA_TUNE1_ZERO_CROSSOVER_TIME BIT(7)
|
|
+
|
|
+struct ac100_codec {
|
|
+ struct device *dev;
|
|
+ struct snd_soc_component component;
|
|
+};
|
|
+
|
|
+/* ADC mixer controls */
|
|
+static const struct snd_kcontrol_new ac100_codec_adc_mixer_controls[] = {
|
|
+ SOC_DAPM_DOUBLE("Mic1 Capture Switch",
|
|
+ AC100_ADC_SRC,
|
|
+ AC100_ADC_SRC_ADCL_MIC1_BOOST_OFF,
|
|
+ AC100_ADC_SRC_ADCR_MIC1_BOOST_OFF, 1, 0),
|
|
+ SOC_DAPM_DOUBLE("Mic2 Capture Switch",
|
|
+ AC100_ADC_SRC,
|
|
+ AC100_ADC_SRC_ADCL_MIC2_BOOST_OFF,
|
|
+ AC100_ADC_SRC_ADCR_MIC2_BOOST_OFF, 1, 0),
|
|
+ SOC_DAPM_DOUBLE("Line In Differential Capture Switch",
|
|
+ AC100_ADC_SRC,
|
|
+ AC100_ADC_SRC_ADCL_LINEINL_LINEINR_OFF,
|
|
+ AC100_ADC_SRC_ADCR_LINEINL_LINEINR_OFF, 1, 0),
|
|
+ SOC_DAPM_DOUBLE("Line In Capture Switch",
|
|
+ AC100_ADC_SRC,
|
|
+ AC100_ADC_SRC_ADCL_LINEINL_OFF,
|
|
+ AC100_ADC_SRC_ADCR_LINEINR_OFF, 1, 0),
|
|
+ SOC_DAPM_DOUBLE("Aux In Capture Switch",
|
|
+ AC100_ADC_SRC,
|
|
+ AC100_ADC_SRC_ADCL_AUXINL_OFF,
|
|
+ AC100_ADC_SRC_ADCR_AUXINR_OFF, 1, 0),
|
|
+ SOC_DAPM_DOUBLE("Mixer Capture Switch",
|
|
+ AC100_ADC_SRC,
|
|
+ AC100_ADC_SRC_ADCL_LOUTMIX_OFF,
|
|
+ AC100_ADC_SRC_ADCR_ROUTMIX_OFF, 1, 0),
|
|
+ SOC_DAPM_DOUBLE("Mixer Reversed Capture Switch",
|
|
+ AC100_ADC_SRC,
|
|
+ AC100_ADC_SRC_ADCL_ROUTMIX_OFF,
|
|
+ AC100_ADC_SRC_ADCR_LOUTMIX_OFF, 1, 0),
|
|
+};
|
|
+
|
|
+/* Output mixer controls */
|
|
+static const struct snd_kcontrol_new ac100_codec_mixer_controls[] = {
|
|
+ SOC_DAPM_DOUBLE("Mic1 Playback Switch",
|
|
+ AC100_OUT_MXR_SRC,
|
|
+ AC100_OUT_MXR_SRC_LMIX_MIC1_BOOST_OFF,
|
|
+ AC100_OUT_MXR_SRC_RMIX_MIC1_BOOST_OFF, 1, 0),
|
|
+ SOC_DAPM_DOUBLE("Mic2 Playback Switch",
|
|
+ AC100_OUT_MXR_SRC,
|
|
+ AC100_OUT_MXR_SRC_LMIX_MIC2_BOOST_OFF,
|
|
+ AC100_OUT_MXR_SRC_RMIX_MIC2_BOOST_OFF, 1, 0),
|
|
+ SOC_DAPM_DOUBLE("Line In Differential Playback Switch",
|
|
+ AC100_OUT_MXR_SRC,
|
|
+ AC100_OUT_MXR_SRC_LMIX_LINEINL_LINEINR_OFF,
|
|
+ AC100_OUT_MXR_SRC_RMIX_LINEINL_LINEINR_OFF, 1, 0),
|
|
+ SOC_DAPM_DOUBLE("Line In Playback Switch",
|
|
+ AC100_OUT_MXR_SRC,
|
|
+ AC100_OUT_MXR_SRC_LMIX_LINEINL_OFF,
|
|
+ AC100_OUT_MXR_SRC_RMIX_LINEINR_OFF, 1, 0),
|
|
+ SOC_DAPM_DOUBLE("Aux In Playback Switch",
|
|
+ AC100_OUT_MXR_SRC,
|
|
+ AC100_OUT_MXR_SRC_LMIX_AUXINL_OFF,
|
|
+ AC100_OUT_MXR_SRC_RMIX_AUXINR_OFF, 1, 0),
|
|
+ SOC_DAPM_DOUBLE("DAC Playback Switch",
|
|
+ AC100_OUT_MXR_SRC,
|
|
+ AC100_OUT_MXR_SRC_LMIX_DACL_OFF,
|
|
+ AC100_OUT_MXR_SRC_RMIX_DACR_OFF, 1, 0),
|
|
+ SOC_DAPM_DOUBLE("DAC Reversed Playback Switch",
|
|
+ AC100_OUT_MXR_SRC,
|
|
+ AC100_OUT_MXR_SRC_LMIX_DACR_OFF,
|
|
+ AC100_OUT_MXR_SRC_RMIX_DACL_OFF, 1, 0),
|
|
+};
|
|
+
|
|
+static const DECLARE_TLV_DB_SCALE(ac100_codec_out_mixer_pregain_scale,
|
|
+ -450, 150, 0);
|
|
+
|
|
+static const DECLARE_TLV_DB_RANGE(ac100_codec_mic_gain_scale,
|
|
+ 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
|
|
+ 1, 7, TLV_DB_SCALE_ITEM(3000, 300, 0),
|
|
+);
|
|
+
|
|
+static const DECLARE_TLV_DB_SCALE(ac100_codec_pre_gain_scale,
|
|
+ -1200, 300, 0);
|
|
+
|
|
+static const DECLARE_TLV_DB_RANGE(ac100_codec_earpiece_vol_scale,
|
|
+ 0, 1, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1),
|
|
+ 2, 31, TLV_DB_SCALE_ITEM(-4350, 150, 0),
|
|
+);
|
|
+
|
|
+static const DECLARE_TLV_DB_SCALE(ac100_codec_lineout_vol_scale, -450, 150, 0);
|
|
+
|
|
+static const DECLARE_TLV_DB_SCALE(ac100_codec_hp_vol_scale, -6300, 100, 1);
|
|
+
|
|
+static const char *ac100_codec_hp_pa_delay_texts[] = {
|
|
+ "4ms", "8ms", "16ms", "32ms"
|
|
+};
|
|
+
|
|
+static SOC_ENUM_SINGLE_DECL(ac100_codec_hp_pa_delay_enum,
|
|
+ AC100_HPOUT_CTRL,
|
|
+ AC100_HPOUT_CTRL_STARTUP_DELAY_OFF,
|
|
+ ac100_codec_hp_pa_delay_texts);
|
|
+
|
|
+static const char *ac100_codec_hp_pa_cur_texts[] = {
|
|
+ "low", "mid", "higher", "highest"
|
|
+};
|
|
+
|
|
+static SOC_ENUM_SINGLE_DECL(ac100_codec_hp_pa_cur_enum,
|
|
+ AC100_HPOUT_CTRL,
|
|
+ AC100_HPOUT_CTRL_OUTPUT_CURRENT_OFF,
|
|
+ ac100_codec_hp_pa_cur_texts);
|
|
+
|
|
+static SOC_ENUM_SINGLE_DECL(ac100_codec_ep_pa_cur_enum,
|
|
+ AC100_ERPOUT_CTRL,
|
|
+ AC100_ERPOUT_CTRL_OUT_CURRENT_OFF,
|
|
+ ac100_codec_hp_pa_cur_texts);
|
|
+
|
|
+static const char *ac100_codec_ep_pa_ramp_time_texts[] = {
|
|
+ "256ms", "512ms", "640ms", "768ms"
|
|
+};
|
|
+
|
|
+static SOC_ENUM_SINGLE_DECL(ac100_codec_ep_pa_ramp_time_enum,
|
|
+ AC100_ERPOUT_CTRL,
|
|
+ AC100_ERPOUT_CTRL_RAMP_TIME_OFF,
|
|
+ ac100_codec_ep_pa_ramp_time_texts);
|
|
+
|
|
+static const char *ac100_codec_mic_bv_texts[] = {
|
|
+ "1.88V", "2.09V", "2.33V", "2.5V"
|
|
+};
|
|
+
|
|
+static SOC_ENUM_SINGLE_DECL(ac100_codec_mic1_bv_enum,
|
|
+ AC100_OUT_MXR_SRC_BST,
|
|
+ AC100_OUT_MXR_SRC_BST_MMICBIAS_VOLTAGE_OFF,
|
|
+ ac100_codec_mic_bv_texts);
|
|
+
|
|
+static SOC_ENUM_SINGLE_DECL(ac100_codec_mic2_bv_enum,
|
|
+ AC100_OUT_MXR_SRC_BST,
|
|
+ AC100_OUT_MXR_SRC_BST_HMICBIAS_VOLTAGE_OFF,
|
|
+ ac100_codec_mic_bv_texts);
|
|
+
|
|
+/* volume / mute controls */
|
|
+static const struct snd_kcontrol_new ac100_codec_controls[] = {
|
|
+ /* Microphone Amp boost gain */
|
|
+ SOC_SINGLE_TLV("Mic1 Boost Volume", AC100_ADC_SRC_BST_CTRL,
|
|
+ AC100_ADC_SRC_BST_CTRL_MIC1BOOST_OFF, 0x7, 0,
|
|
+ ac100_codec_mic_gain_scale),
|
|
+
|
|
+ SOC_SINGLE_TLV("Mic2 Boost Volume", AC100_ADC_SRC_BST_CTRL,
|
|
+ AC100_ADC_SRC_BST_CTRL_MIC2BOOST_OFF, 0x7, 0,
|
|
+ ac100_codec_mic_gain_scale),
|
|
+
|
|
+ SOC_SINGLE_TLV("Line In Pre-Gain Volume", AC100_ADC_SRC_BST_CTRL,
|
|
+ AC100_ADC_SRC_BST_CTRL_LINEIN_DIFF_PREG_OFF, 0x7, 0,
|
|
+ ac100_codec_pre_gain_scale),
|
|
+
|
|
+ SOC_SINGLE_TLV("Aux In Pre-Gain Volume", AC100_ADC_SRC_BST_CTRL,
|
|
+ AC100_ADC_SRC_BST_CTRL_AXI_PREG_OFF, 0x7, 0,
|
|
+ ac100_codec_pre_gain_scale),
|
|
+
|
|
+ /* ADC */
|
|
+ SOC_DOUBLE_TLV("ADC Gain Capture Volume", AC100_ADC_APC_CTRL,
|
|
+ AC100_ADC_APC_CTRL_ADCL_GAIN_OFF,
|
|
+ AC100_ADC_APC_CTRL_ADCR_GAIN_OFF, 0x7, 0,
|
|
+ ac100_codec_out_mixer_pregain_scale),
|
|
+
|
|
+ /* Mixer pre-gain */
|
|
+ SOC_SINGLE_TLV("Mic1 Playback Volume", AC100_OUT_MXR_SRC_BST,
|
|
+ AC100_OUT_MXR_SRC_BST_MIC1_GAIN_OFF,
|
|
+ 0x7, 0, ac100_codec_out_mixer_pregain_scale),
|
|
+
|
|
+ SOC_SINGLE_TLV("Mic2 Playback Volume", AC100_OUT_MXR_SRC_BST,
|
|
+ AC100_OUT_MXR_SRC_BST_MIC2_GAIN_OFF,
|
|
+ 0x7, 0, ac100_codec_out_mixer_pregain_scale),
|
|
+
|
|
+ SOC_SINGLE_TLV("Line In Playback Volume", AC100_OUT_MXR_SRC_BST,
|
|
+ AC100_OUT_MXR_SRC_BST_LINEIN_GAIN_OFF,
|
|
+ 0x7, 0, ac100_codec_out_mixer_pregain_scale),
|
|
+
|
|
+ SOC_SINGLE_TLV("Aux In Playback Volume", AC100_OUT_MXR_SRC_BST,
|
|
+ AC100_OUT_MXR_SRC_BST_AX_GAIN_OFF,
|
|
+ 0x7, 0, ac100_codec_out_mixer_pregain_scale),
|
|
+
|
|
+ SOC_SINGLE_TLV("Headphone Playback Volume",
|
|
+ AC100_HPOUT_CTRL,
|
|
+ AC100_HPOUT_CTRL_VOLUME_OFF, 0x3f, 0,
|
|
+ ac100_codec_hp_vol_scale),
|
|
+
|
|
+ SOC_SINGLE_TLV("Earpiece Playback Volume",
|
|
+ AC100_ERPOUT_CTRL,
|
|
+ AC100_ERPOUT_CTRL_VOLUME_OFF, 0x1f, 0,
|
|
+ ac100_codec_earpiece_vol_scale),
|
|
+
|
|
+ SOC_SINGLE_TLV("Speaker Playback Volume",
|
|
+ AC100_SPKOUT_CTRL,
|
|
+ AC100_SPKOUT_CTRL_VOLUME_OFF, 0x1f, 0,
|
|
+ ac100_codec_earpiece_vol_scale),
|
|
+
|
|
+ SOC_SINGLE_TLV("Line Out Playback Volume",
|
|
+ AC100_LINEOUT_CTRL,
|
|
+ AC100_LINEOUT_CTRL_LINEOUT_GAIN_OFF, 0x7, 0,
|
|
+ ac100_codec_lineout_vol_scale),
|
|
+
|
|
+ SOC_ENUM("Headphone Amplifier Startup Delay",
|
|
+ ac100_codec_hp_pa_delay_enum),
|
|
+ SOC_ENUM("Headphone Amplifier Current", ac100_codec_hp_pa_cur_enum),
|
|
+
|
|
+ SOC_ENUM("Earpiece Amplifier Ramp Time",
|
|
+ ac100_codec_ep_pa_ramp_time_enum),
|
|
+ SOC_ENUM("Earpiece Amplifier Current", ac100_codec_ep_pa_cur_enum),
|
|
+
|
|
+ SOC_ENUM("Mic1 Bias Voltage", ac100_codec_mic1_bv_enum),
|
|
+ SOC_ENUM("Mic2 Bias Voltage", ac100_codec_mic2_bv_enum),
|
|
+};
|
|
+
|
|
+/* Headphone */
|
|
+
|
|
+static const char * const ac100_codec_hp_src_enum_text[] = {
|
|
+ "DAC", "Mixer",
|
|
+};
|
|
+
|
|
+static SOC_ENUM_DOUBLE_DECL(ac100_codec_hp_src_enum,
|
|
+ AC100_HPOUT_CTRL,
|
|
+ AC100_HPOUT_CTRL_LEFT_SRC_OFF,
|
|
+ AC100_HPOUT_CTRL_RIGHT_SRC_OFF,
|
|
+ ac100_codec_hp_src_enum_text);
|
|
+
|
|
+static const struct snd_kcontrol_new ac100_codec_hp_src[] = {
|
|
+ SOC_DAPM_ENUM("Headphone Source Playback Route",
|
|
+ ac100_codec_hp_src_enum),
|
|
+};
|
|
+
|
|
+static const struct snd_kcontrol_new ac100_codec_hp_switch =
|
|
+ SOC_DAPM_DOUBLE("Headphone Playback Switch",
|
|
+ AC100_HPOUT_CTRL,
|
|
+ AC100_HPOUT_CTRL_LEFT_PA_MUTE_OFF,
|
|
+ AC100_HPOUT_CTRL_RIGHT_PA_MUTE_OFF, 1, 0);
|
|
+
|
|
+/* Earpiece */
|
|
+
|
|
+static const struct snd_kcontrol_new ac100_codec_earpiece_switch =
|
|
+ SOC_DAPM_SINGLE("Playback Switch",
|
|
+ AC100_ERPOUT_CTRL,
|
|
+ AC100_ERPOUT_CTRL_MUTE_OFF, 1, 0);
|
|
+
|
|
+static const char * const ac100_codec_earpiece_src_enum_text[] = {
|
|
+ "DACR", "DACL", "Right Mixer", "Left Mixer",
|
|
+};
|
|
+
|
|
+static SOC_ENUM_SINGLE_DECL(ac100_codec_earpiece_src_enum,
|
|
+ AC100_ERPOUT_CTRL,
|
|
+ AC100_ERPOUT_CTRL_INPUT_SOURCE_OFF,
|
|
+ ac100_codec_earpiece_src_enum_text);
|
|
+
|
|
+static const struct snd_kcontrol_new ac100_codec_earpiece_src[] = {
|
|
+ SOC_DAPM_ENUM("Earpiece Source Playback Route",
|
|
+ ac100_codec_earpiece_src_enum),
|
|
+};
|
|
+
|
|
+/* Speaker */
|
|
+
|
|
+static const char * const ac100_codec_spk_src_enum_text[] = {
|
|
+ "Stereo", "Mono",
|
|
+};
|
|
+
|
|
+static SOC_ENUM_DOUBLE_DECL(ac100_codec_spk_src_enum,
|
|
+ AC100_SPKOUT_CTRL,
|
|
+ AC100_SPKOUT_CTRL_LEFT_SRC_OFF,
|
|
+ AC100_SPKOUT_CTRL_RIGHT_SRC_OFF,
|
|
+ ac100_codec_spk_src_enum_text);
|
|
+
|
|
+static const struct snd_kcontrol_new ac100_codec_spk_src[] = {
|
|
+ SOC_DAPM_ENUM("Speaker Source Playback Route",
|
|
+ ac100_codec_spk_src_enum),
|
|
+};
|
|
+
|
|
+static const struct snd_kcontrol_new ac100_codec_spk_switch =
|
|
+ SOC_DAPM_DOUBLE("Speaker Playback Switch",
|
|
+ AC100_SPKOUT_CTRL,
|
|
+ AC100_SPKOUT_CTRL_LEFT_EN_OFF,
|
|
+ AC100_SPKOUT_CTRL_RIGHT_EN_OFF, 1, 0);
|
|
+
|
|
+static const struct snd_kcontrol_new ac100_codec_spk_inv_switch =
|
|
+ SOC_DAPM_DOUBLE("Speaker Invert Switch",
|
|
+ AC100_SPKOUT_CTRL,
|
|
+ AC100_SPKOUT_CTRL_LEFT_INV_EN_OFF,
|
|
+ AC100_SPKOUT_CTRL_RIGHT_INV_EN_OFF, 1, 0);
|
|
+
|
|
+/* Line Out */
|
|
+
|
|
+static const struct snd_kcontrol_new ac100_codec_lineout_mixer_controls[] = {
|
|
+ SOC_DAPM_SINGLE("Mic1 Playback Switch",
|
|
+ AC100_LINEOUT_CTRL,
|
|
+ AC100_LINEOUT_CTRL_LINEOUT_S0_OFF, 1, 0),
|
|
+ SOC_DAPM_SINGLE("Mic2 Playback Switch",
|
|
+ AC100_LINEOUT_CTRL,
|
|
+ AC100_LINEOUT_CTRL_LINEOUT_S1_OFF, 1, 0),
|
|
+ SOC_DAPM_SINGLE("Right Mixer Playback Switch",
|
|
+ AC100_LINEOUT_CTRL,
|
|
+ AC100_LINEOUT_CTRL_LINEOUT_S2_OFF, 1, 0),
|
|
+ SOC_DAPM_SINGLE("Left Mixer Playback Switch",
|
|
+ AC100_LINEOUT_CTRL,
|
|
+ AC100_LINEOUT_CTRL_LINEOUT_S3_OFF, 1, 0),
|
|
+};
|
|
+
|
|
+static const struct snd_kcontrol_new ac100_codec_lineout_switch =
|
|
+ SOC_DAPM_SINGLE("Playback Switch",
|
|
+ AC100_LINEOUT_CTRL,
|
|
+ AC100_LINEOUT_CTRL_LINEOUT_EN_OFF, 1, 0);
|
|
+
|
|
+/* Mic2 Boost Source */
|
|
+
|
|
+static const char * const ac100_codec_mic2boost_src_enum_text[] = {
|
|
+ "Mic2", "Mic3",
|
|
+};
|
|
+
|
|
+static SOC_ENUM_SINGLE_DECL(ac100_codec_mic2boost_src_enum,
|
|
+ AC100_ADC_SRC_BST_CTRL,
|
|
+ AC100_ADC_SRC_BST_CTRL_MIC2SLT_OFF,
|
|
+ ac100_codec_mic2boost_src_enum_text);
|
|
+
|
|
+static const struct snd_kcontrol_new ac100_codec_mic2boost_src[] = {
|
|
+ SOC_DAPM_ENUM("Mic2 Source Capture Route",
|
|
+ ac100_codec_mic2boost_src_enum),
|
|
+};
|
|
+
|
|
+/* This is done to remove the headphone buffer DC offset. */
|
|
+static int ac100_codec_hp_power(struct snd_soc_dapm_widget *w,
|
|
+ struct snd_kcontrol *k, int event)
|
|
+{
|
|
+ struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
|
+ unsigned int val = SND_SOC_DAPM_EVENT_ON(event) ? 0xf : 0;
|
|
+
|
|
+ // zero cross detection
|
|
+ if (SND_SOC_DAPM_EVENT_OFF(event)) {
|
|
+ snd_soc_component_update_bits(component,
|
|
+ AC100_ADDA_TUNE1,
|
|
+ AC100_ADDA_TUNE1_ZERO_CROSSOVER_EN_MASK,
|
|
+ AC100_ADDA_TUNE1_ZERO_CROSSOVER_EN_EN);
|
|
+ } else {
|
|
+ snd_soc_component_update_bits(component,
|
|
+ AC100_ADDA_TUNE1,
|
|
+ AC100_ADDA_TUNE1_ZERO_CROSSOVER_EN_MASK,
|
|
+ AC100_ADDA_TUNE1_ZERO_CROSSOVER_EN_DIS);
|
|
+ }
|
|
+
|
|
+ snd_soc_component_update_bits(component, AC100_OUT_MXR_DAC_A_CTRL,
|
|
+ AC100_OUT_MXR_DAC_A_CTRL_HP_DCRM_EN(0xf),
|
|
+ AC100_OUT_MXR_DAC_A_CTRL_HP_DCRM_EN(val));
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static const struct snd_soc_dapm_widget ac100_codec_widgets[] = {
|
|
+ /* DAC */
|
|
+ SND_SOC_DAPM_DAC("Left DAC", NULL, AC100_OUT_MXR_DAC_A_CTRL,
|
|
+ AC100_OUT_MXR_DAC_A_CTRL_DAC_AL_EN_OFF, 0),
|
|
+ SND_SOC_DAPM_DAC("Right DAC", NULL, AC100_OUT_MXR_DAC_A_CTRL,
|
|
+ AC100_OUT_MXR_DAC_A_CTRL_DAC_AR_EN_OFF, 0),
|
|
+
|
|
+ /* ADC */
|
|
+ SND_SOC_DAPM_ADC("Left ADC", NULL, AC100_ADC_APC_CTRL,
|
|
+ AC100_ADC_APC_CTRL_ADCL_EN_OFF, 0),
|
|
+ SND_SOC_DAPM_ADC("Right ADC", NULL, AC100_ADC_APC_CTRL,
|
|
+ AC100_ADC_APC_CTRL_ADCR_EN_OFF, 0),
|
|
+
|
|
+ /*
|
|
+ * Due to this component and the codec belonging to separate DAPM
|
|
+ * contexts, we need to manually link the above widgets to their
|
|
+ * stream widgets at the card level.
|
|
+ */
|
|
+
|
|
+ /* Headphones */
|
|
+
|
|
+ SND_SOC_DAPM_REGULATOR_SUPPLY("cpvdd", 0, 0),
|
|
+ SND_SOC_DAPM_MUX("Left Headphone Source",
|
|
+ SND_SOC_NOPM, 0, 0, ac100_codec_hp_src),
|
|
+ SND_SOC_DAPM_MUX("Right Headphone Source",
|
|
+ SND_SOC_NOPM, 0, 0, ac100_codec_hp_src),
|
|
+ SND_SOC_DAPM_SWITCH("Left Headphone Switch",
|
|
+ SND_SOC_NOPM, 0, 0, &ac100_codec_hp_switch),
|
|
+ SND_SOC_DAPM_SWITCH("Right Headphone Switch",
|
|
+ SND_SOC_NOPM, 0, 0, &ac100_codec_hp_switch),
|
|
+ SND_SOC_DAPM_OUT_DRV("Left Headphone Amp",
|
|
+ SND_SOC_NOPM, 0, 0, NULL, 0),
|
|
+ SND_SOC_DAPM_OUT_DRV("Right Headphone Amp",
|
|
+ SND_SOC_NOPM, 0, 0, NULL, 0),
|
|
+ SND_SOC_DAPM_SUPPLY("Headphone Amp", AC100_HPOUT_CTRL,
|
|
+ AC100_HPOUT_CTRL_PA_EN_OFF, 0,
|
|
+ ac100_codec_hp_power,
|
|
+ SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
|
|
+ SND_SOC_DAPM_OUTPUT("HP"),
|
|
+
|
|
+ /* Earpiece */
|
|
+
|
|
+ SND_SOC_DAPM_MUX("Earpiece Source Playback Route",
|
|
+ SND_SOC_NOPM, 0, 0, ac100_codec_earpiece_src),
|
|
+ SND_SOC_DAPM_SWITCH("Earpiece",
|
|
+ SND_SOC_NOPM, 0, 0, &ac100_codec_earpiece_switch),
|
|
+ SND_SOC_DAPM_OUT_DRV("Earpiece Amp", AC100_ERPOUT_CTRL,
|
|
+ AC100_ERPOUT_CTRL_PA_EN_OFF, 0, NULL, 0),
|
|
+ SND_SOC_DAPM_OUTPUT("EARPIECE"),
|
|
+
|
|
+ /* Speaker */
|
|
+
|
|
+ SND_SOC_DAPM_MUX("Left Speaker Source",
|
|
+ SND_SOC_NOPM, 0, 0, ac100_codec_spk_src),
|
|
+ SND_SOC_DAPM_MUX("Right Speaker Source",
|
|
+ SND_SOC_NOPM, 0, 0, ac100_codec_spk_src),
|
|
+ SND_SOC_DAPM_SWITCH("Left Speaker Switch",
|
|
+ SND_SOC_NOPM, 0, 0, &ac100_codec_spk_switch),
|
|
+ SND_SOC_DAPM_SWITCH("Right Speaker Switch",
|
|
+ SND_SOC_NOPM, 0, 0, &ac100_codec_spk_switch),
|
|
+ SND_SOC_DAPM_SWITCH("Left Speaker Invert Switch",
|
|
+ SND_SOC_NOPM, 0, 0, &ac100_codec_spk_inv_switch),
|
|
+ SND_SOC_DAPM_SWITCH("Right Speaker Invert Switch",
|
|
+ SND_SOC_NOPM, 0, 0, &ac100_codec_spk_inv_switch),
|
|
+ SND_SOC_DAPM_OUTPUT("SPKOUTL"),
|
|
+ SND_SOC_DAPM_OUTPUT("SPKOUTR"),
|
|
+
|
|
+ /* Line Out */
|
|
+
|
|
+ SND_SOC_DAPM_MIXER("Line Out Mixer", SND_SOC_NOPM, 0, 0,
|
|
+ ac100_codec_lineout_mixer_controls,
|
|
+ ARRAY_SIZE(ac100_codec_lineout_mixer_controls)),
|
|
+ SND_SOC_DAPM_SWITCH("Line Out",
|
|
+ SND_SOC_NOPM, 0, 0, &ac100_codec_lineout_switch),
|
|
+ SND_SOC_DAPM_OUTPUT("LINEOUT"),
|
|
+
|
|
+ /* Microphone 1 */
|
|
+
|
|
+ SND_SOC_DAPM_INPUT("MIC1"),
|
|
+ SND_SOC_DAPM_SUPPLY("MBIAS", AC100_ADC_APC_CTRL,
|
|
+ AC100_ADC_APC_CTRL_MBIAS_EN_OFF,
|
|
+ 0, NULL, 0),
|
|
+ SND_SOC_DAPM_PGA("Mic1 Amplifier", AC100_ADC_SRC_BST_CTRL,
|
|
+ AC100_ADC_SRC_BST_CTRL_MIC1AMPEN_OFF, 0, NULL, 0),
|
|
+
|
|
+ /* Microphone 2 and 3 */
|
|
+
|
|
+ SND_SOC_DAPM_INPUT("MIC2"),
|
|
+ SND_SOC_DAPM_INPUT("MIC3"),
|
|
+ SND_SOC_DAPM_MUX("Mic2 Amplifier Source",
|
|
+ SND_SOC_NOPM, 0, 0, ac100_codec_mic2boost_src),
|
|
+ SND_SOC_DAPM_SUPPLY("HBIAS", AC100_ADC_APC_CTRL,
|
|
+ AC100_ADC_APC_CTRL_HBIAS_EN_OFF,
|
|
+ 0, NULL, 0),
|
|
+ SND_SOC_DAPM_PGA("Mic2 Amplifier", AC100_ADC_SRC_BST_CTRL,
|
|
+ AC100_ADC_SRC_BST_CTRL_MIC2AMPEN_OFF, 0, NULL, 0),
|
|
+
|
|
+ /* Line input */
|
|
+
|
|
+ SND_SOC_DAPM_INPUT("LINEIN"),
|
|
+
|
|
+ /* Aux input */
|
|
+
|
|
+ SND_SOC_DAPM_INPUT("AUXIN"),
|
|
+
|
|
+ /* Output mixers */
|
|
+ SND_SOC_DAPM_MIXER("Left Mixer", AC100_OUT_MXR_DAC_A_CTRL,
|
|
+ AC100_OUT_MXR_DAC_A_CTRL_AL_MIX_EN_OFF, 0,
|
|
+ ac100_codec_mixer_controls,
|
|
+ ARRAY_SIZE(ac100_codec_mixer_controls)),
|
|
+ SND_SOC_DAPM_MIXER("Right Mixer", AC100_OUT_MXR_DAC_A_CTRL,
|
|
+ AC100_OUT_MXR_DAC_A_CTRL_AR_MIX_EN_OFF, 0,
|
|
+ ac100_codec_mixer_controls,
|
|
+ ARRAY_SIZE(ac100_codec_mixer_controls)),
|
|
+
|
|
+ /* Input mixers */
|
|
+ SND_SOC_DAPM_MIXER("Left ADC Mixer", SND_SOC_NOPM, 0, 0,
|
|
+ ac100_codec_adc_mixer_controls,
|
|
+ ARRAY_SIZE(ac100_codec_adc_mixer_controls)),
|
|
+ SND_SOC_DAPM_MIXER("Right ADC Mixer", SND_SOC_NOPM, 0, 0,
|
|
+ ac100_codec_adc_mixer_controls,
|
|
+ ARRAY_SIZE(ac100_codec_adc_mixer_controls)),
|
|
+};
|
|
+
|
|
+static const struct snd_soc_dapm_route ac100_codec_routes[] = {
|
|
+ /* Microphone Routes */
|
|
+ { "Mic1 Amplifier", NULL, "MIC1"},
|
|
+ { "Mic2 Amplifier", NULL, "Mic2 Amplifier Source"},
|
|
+ { "Mic2 Amplifier Source", "Mic2", "MIC2" },
|
|
+ { "Mic2 Amplifier Source", "Mic3", "MIC3" },
|
|
+
|
|
+ /* Mixer Routes */
|
|
+ { "Left Mixer", "Mic1 Playback Switch", "Mic1 Amplifier" },
|
|
+ { "Left Mixer", "Mic2 Playback Switch", "Mic2 Amplifier" },
|
|
+ { "Left Mixer", "Line In Differential Playback Switch", "LINEIN" },
|
|
+ { "Left Mixer", "Line In Playback Switch", "LINEIN" },
|
|
+ { "Left Mixer", "Aux In Playback Switch", "AUXIN" },
|
|
+ { "Left Mixer", "DAC Playback Switch", "Left DAC" },
|
|
+ { "Left Mixer", "DAC Reversed Playback Switch", "Right DAC" },
|
|
+
|
|
+ { "Right Mixer", "Mic1 Playback Switch", "Mic1 Amplifier" },
|
|
+ { "Right Mixer", "Mic2 Playback Switch", "Mic2 Amplifier" },
|
|
+ { "Right Mixer", "Line In Differential Playback Switch", "LINEIN" },
|
|
+ { "Right Mixer", "Line In Playback Switch", "LINEIN" },
|
|
+ { "Right Mixer", "Aux In Playback Switch", "AUXIN" },
|
|
+ { "Right Mixer", "DAC Playback Switch", "Right DAC" },
|
|
+ { "Right Mixer", "DAC Reversed Playback Switch", "Left DAC" },
|
|
+
|
|
+ /* ADC Mixer Routes */
|
|
+ { "Left ADC Mixer", "Mic1 Capture Switch", "Mic1 Amplifier" },
|
|
+ { "Left ADC Mixer", "Mic2 Capture Switch", "Mic2 Amplifier" },
|
|
+ { "Left ADC Mixer", "Line In Differential Capture Switch", "LINEIN" },
|
|
+ { "Left ADC Mixer", "Line In Capture Switch", "LINEIN" },
|
|
+ { "Left ADC Mixer", "Aux In Capture Switch", "AUXIN" },
|
|
+ { "Left ADC Mixer", "Mixer Capture Switch", "Left Mixer" },
|
|
+ { "Left ADC Mixer", "Mixer Reversed Capture Switch", "Right Mixer" },
|
|
+
|
|
+ { "Right ADC Mixer", "Mic1 Capture Switch", "Mic1 Amplifier" },
|
|
+ { "Right ADC Mixer", "Mic2 Capture Switch", "Mic2 Amplifier" },
|
|
+ { "Right ADC Mixer", "Line In Differential Capture Switch", "LINEIN" },
|
|
+ { "Right ADC Mixer", "Line In Capture Switch", "LINEIN" },
|
|
+ { "Right ADC Mixer", "Aux In Capture Switch", "AUXIN" },
|
|
+ { "Right ADC Mixer", "Mixer Capture Switch", "Right Mixer" },
|
|
+ { "Right ADC Mixer", "Mixer Reversed Capture Switch", "Left Mixer" },
|
|
+
|
|
+ /* ADC Routes */
|
|
+ { "Left ADC", NULL, "Left ADC Mixer" },
|
|
+ { "Right ADC", NULL, "Right ADC Mixer" },
|
|
+
|
|
+ /* Headphone Routes */
|
|
+ { "Left Headphone Source", "DAC", "Left DAC" },
|
|
+ { "Left Headphone Source", "Mixer", "Left Mixer" },
|
|
+ { "Left Headphone Switch", "Headphone Playback Switch", "Left Headphone Source" },
|
|
+ { "Left Headphone Amp", NULL, "Left Headphone Switch" },
|
|
+ { "Left Headphone Amp", NULL, "Headphone Amp" },
|
|
+ { "HP", NULL, "Left Headphone Amp" },
|
|
+
|
|
+ { "Right Headphone Source", "DAC", "Right DAC" },
|
|
+ { "Right Headphone Source", "Mixer", "Right Mixer" },
|
|
+ { "Right Headphone Switch", "Headphone Playback Switch", "Right Headphone Source" },
|
|
+ { "Right Headphone Amp", NULL, "Right Headphone Switch" },
|
|
+ { "Right Headphone Amp", NULL, "Headphone Amp" },
|
|
+ { "HP", NULL, "Right Headphone Amp" },
|
|
+
|
|
+ { "Headphone Amp", NULL, "cpvdd" },
|
|
+
|
|
+ /* Speaker Routes */
|
|
+ { "Left Speaker Source", "Stereo", "Left Mixer" },
|
|
+ { "Left Speaker Source", "Mono", "Right Mixer" },
|
|
+ { "Left Speaker Source", "Mono", "Left Mixer" },
|
|
+ { "Left Speaker Switch", "Speaker Playback Switch", "Left Speaker Source" },
|
|
+ { "SPKOUTL", NULL, "Left Speaker Switch" },
|
|
+
|
|
+ { "Right Speaker Source", "Stereo", "Right Mixer" },
|
|
+ { "Right Speaker Source", "Mono", "Right Mixer" },
|
|
+ { "Right Speaker Source", "Mono", "Left Mixer" },
|
|
+ { "Right Speaker Switch", "Speaker Playback Switch", "Right Speaker Source" },
|
|
+ { "SPKOUTR", NULL, "Right Speaker Switch" },
|
|
+
|
|
+ /* Earpiece Routes */
|
|
+ { "Earpiece Source Playback Route", "DACR", "Right DAC" },
|
|
+ { "Earpiece Source Playback Route", "DACL", "Left DAC" },
|
|
+ { "Earpiece Source Playback Route", "Right Mixer", "Right Mixer" },
|
|
+ { "Earpiece Source Playback Route", "Left Mixer", "Left Mixer" },
|
|
+ { "Earpiece", "Playback Switch", "Earpiece Source Playback Route" },
|
|
+ { "Earpiece Amp", NULL, "Earpiece" },
|
|
+ { "EARPIECE", NULL, "Earpiece Amp" },
|
|
+
|
|
+ /* Line-out Routes */
|
|
+ { "Line Out", "Playback Switch", "Line Out Mixer" },
|
|
+ { "Line Out Mixer", "Mic1 Playback Switch", "Mic1 Amplifier" },
|
|
+ { "Line Out Mixer", "Mic2 Playback Switch", "Mic2 Amplifier" },
|
|
+ { "Line Out Mixer", "Right Mixer Playback Switch", "Right Mixer" },
|
|
+ { "Line Out Mixer", "Left Mixer Playback Switch", "Left Mixer" },
|
|
+ { "LINEOUT", NULL, "Line Out" },
|
|
+};
|
|
+
|
|
+static const struct snd_soc_component_driver ac100_codec_analog_cmpnt_drv = {
|
|
+ .controls = ac100_codec_controls,
|
|
+ .num_controls = ARRAY_SIZE(ac100_codec_controls),
|
|
+ .dapm_widgets = ac100_codec_widgets,
|
|
+ .num_dapm_widgets = ARRAY_SIZE(ac100_codec_widgets),
|
|
+ .dapm_routes = ac100_codec_routes,
|
|
+ .num_dapm_routes = ARRAY_SIZE(ac100_codec_routes),
|
|
+};
|
|
+
|
|
+static int ac100_codec_probe(struct platform_device *pdev)
|
|
+{
|
|
+ struct ac100_dev *ac100 = dev_get_drvdata(pdev->dev.parent);
|
|
+ struct ac100_codec *codec;
|
|
+ int ret = 0;
|
|
+
|
|
+ codec = devm_kzalloc(&pdev->dev, sizeof(*codec), GFP_KERNEL);
|
|
+ if (!codec)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ codec->dev = &pdev->dev;
|
|
+ platform_set_drvdata(pdev, codec);
|
|
+
|
|
+ snd_soc_component_init_regmap(&codec->component, ac100->regmap);
|
|
+
|
|
+ ret = snd_soc_component_initialize(&codec->component,
|
|
+ &ac100_codec_analog_cmpnt_drv,
|
|
+ &pdev->dev);
|
|
+ if (ret < 0)
|
|
+ return ret;
|
|
+
|
|
+ ret = snd_soc_add_component(&codec->component, NULL, 0);
|
|
+ if (ret) {
|
|
+ dev_err(&pdev->dev,
|
|
+ "Failed to register codec component (%d)\n", ret);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static int ac100_codec_remove(struct platform_device *pdev)
|
|
+{
|
|
+ snd_soc_unregister_component(&pdev->dev);
|
|
+
|
|
+ /*
|
|
+ * We do not call snd_soc_component_exit_regmap, because regmap
|
|
+ * is still owned by the mfd device.
|
|
+ */
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static const struct of_device_id ac100_codec_of_match[] = {
|
|
+ { .compatible = "x-powers,ac100-codec-analog" },
|
|
+ {}
|
|
+};
|
|
+MODULE_DEVICE_TABLE(of, ac100_codec_of_match);
|
|
+
|
|
+static struct platform_driver ac100_codec_driver = {
|
|
+ .driver = {
|
|
+ .name = "ac100-codec-analog",
|
|
+ .of_match_table = ac100_codec_of_match,
|
|
+ },
|
|
+ .probe = ac100_codec_probe,
|
|
+ .remove = ac100_codec_remove,
|
|
+};
|
|
+module_platform_driver(ac100_codec_driver);
|
|
+
|
|
+MODULE_DESCRIPTION("X-Powers AC100 codec driver");
|
|
+MODULE_AUTHOR("Ondrej Jirman <megi@xff.cz>");
|
|
+MODULE_LICENSE("GPL");
|
|
+MODULE_ALIAS("platform:ac100-codec");
|
|
--
|
|
Armbian
|
|
|