All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v5] sun4i-codec: add inputs
@ 2015-12-08  3:20 ` Danny Milosavljevic
  0 siblings, 0 replies; 8+ messages in thread
From: Danny Milosavljevic @ 2015-12-08  3:20 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai,
	Maxime Ripard, Chen-Yu Tsai, alsa-devel, linux-arm-kernel,
	linux-kernel

Hi,

this is the fifth version of the patch that adds inputs to sun4i-codec.
(Previous versions have been on the linux-sunxi mailing list only)

The inputs added are:
- FM-In Left and Right
- Line-In Left and Right
- Mic1-In
- Mic2-In

Changes compared to v4 are:
- Mic preamplifier controls have more common names now.
- Mic preamplifier scale has a 0 dB entry as well now, as documented in the 
  A20 user manual.
- Mic preamplifier has special cases for A20 and A10 now.
- Gain controls have "Gain" in the name now.

I successfully tested it on an A20 board using alsamixer, headphones, a radio and 
my ears.
Note that because of missing capturing support I tested only the mixing, 
for Mic, Line, and FM.

The patches are on top of <git://git.kernel.org/pub/scm/linux/kernel/git/mripard/linux.git>, 
branch "sunxi/for-next".

Regards,
   Danny

Danny (1):
 b/sound/soc/sunxi/sun4i-codec.c |  153 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 150 insertions(+), 3 deletions(-)

Signed-off-by: Danny Milosavljevic <dannym+a@scratchpost.org>
---
diff --git a/sound/soc/sunxi/sun4i-codec.c b/sound/soc/sunxi/sun4i-codec.c
index bcbf4da..106b568 100644
--- a/sound/soc/sunxi/sun4i-codec.c
+++ b/sound/soc/sunxi/sun4i-codec.c
@@ -57,9 +57,20 @@
 #define SUN4I_CODEC_DAC_ACTL_DACAENR			(31)
 #define SUN4I_CODEC_DAC_ACTL_DACAENL			(30)
 #define SUN4I_CODEC_DAC_ACTL_MIXEN			(29)
+#define SUN4I_CODEC_DAC_ACTL_LNG			(26)
+#define SUN4I_CODEC_DAC_ACTL_FMG			(23)
+#define SUN4I_CODEC_DAC_ACTL_MICG			(20)
+#define SUN4I_CODEC_DAC_ACTL_LLNS			(19)
+#define SUN4I_CODEC_DAC_ACTL_RLNS			(18)
+#define SUN4I_CODEC_DAC_ACTL_LFMS			(17)
+#define SUN4I_CODEC_DAC_ACTL_RFMS			(16)
 #define SUN4I_CODEC_DAC_ACTL_LDACLMIXS			(15)
 #define SUN4I_CODEC_DAC_ACTL_RDACRMIXS			(14)
 #define SUN4I_CODEC_DAC_ACTL_LDACRMIXS			(13)
+#define SUN4I_CODEC_DAC_ACTL_MIC1LS			(12)
+#define SUN4I_CODEC_DAC_ACTL_MIC1RS			(11)
+#define SUN4I_CODEC_DAC_ACTL_MIC2LS			(10)
+#define SUN4I_CODEC_DAC_ACTL_MIC2RS			(9)
 #define SUN4I_CODEC_DAC_ACTL_DACPAS			(8)
 #define SUN4I_CODEC_DAC_ACTL_MIXPAS			(7)
 #define SUN4I_CODEC_DAC_ACTL_PA_MUTE			(6)
@@ -84,8 +95,11 @@
 #define SUN4I_CODEC_ADC_ACTL_PREG1EN			(29)
 #define SUN4I_CODEC_ADC_ACTL_PREG2EN			(28)
 #define SUN4I_CODEC_ADC_ACTL_VMICEN			(27)
+#define SUN4I_CODEC_ADC_ACTL_PREG1_A10			(25)
+#define SUN4I_CODEC_ADC_ACTL_PREG2_A10			(23)
 #define SUN4I_CODEC_ADC_ACTL_VADCG			(20)
 #define SUN4I_CODEC_ADC_ACTL_ADCIS			(17)
+#define SUN4I_CODEC_ADC_ACTL_LNRDF			(16)
 #define SUN4I_CODEC_ADC_ACTL_PA_EN			(4)
 #define SUN4I_CODEC_ADC_ACTL_DDE			(3)
 #define SUN4I_CODEC_ADC_DEBUG			(0x2c)
@@ -94,7 +108,18 @@
 #define SUN4I_CODEC_DAC_TXCNT			(0x30)
 #define SUN4I_CODEC_ADC_RXCNT			(0x34)
 #define SUN4I_CODEC_AC_SYS_VERI			(0x38)
-#define SUN4I_CODEC_AC_MIC_PHONE_CAL		(0x3c)
+
+/* MIC_PHONE_CAL register offsets and bit fields (A20 only) */
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL		(0x3c)
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG1      (29)
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG2      (26)
+/* note: no idea where the output pins for the following are. */
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTG  (5)
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTEN (4)
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS3 (3)
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS2 (2)
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS1 (1)
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS0 (0)
 
 struct sun4i_codec {
 	struct device	*dev;
@@ -402,16 +427,94 @@ static const struct snd_kcontrol_new sun4i_codec_pa_mute =
 			SUN4I_CODEC_DAC_ACTL_PA_MUTE, 1, 0);
 
 static DECLARE_TLV_DB_SCALE(sun4i_codec_pa_volume_scale, -6300, 100, 1);
+static DECLARE_TLV_DB_SCALE(sun4i_codec_linein_loopback_gain_scale, -150, 150, 0);
+static DECLARE_TLV_DB_SCALE(sun4i_codec_fmin_loopback_gain_scale, -450, 150, 0);
+static DECLARE_TLV_DB_SCALE(sun4i_codec_micin_loopback_gain_scale, -450, 150, 0);
+static DECLARE_TLV_DB_RANGE(sun7i_codec_micin_preamp_gain_scale,
+	0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
+	1, 7, TLV_DB_SCALE_ITEM(2400, 300, 0)
+);
+static DECLARE_TLV_DB_RANGE(sun4i_codec_micin_preamp_gain_scale_a10,
+	0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
+	1, 7, TLV_DB_SCALE_ITEM(3500, 300, 0)
+);
+
+struct snd_kcontrol_new sun7ionly_codec_widgets[] = {
+	SOC_SINGLE_TLV("Mic1-In Boost Gain",
+		       SUN7I_CODEC_AC_MIC_PHONE_CAL,
+		       SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG1,
+		       7,
+		       0,
+		       sun7i_codec_micin_preamp_gain_scale),
+	SOC_SINGLE_TLV("Mic2-In Boost Gain",
+		       SUN7I_CODEC_AC_MIC_PHONE_CAL,
+		       SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG2,
+		       7,
+		       0,
+		       sun7i_codec_micin_preamp_gain_scale),
+};
 
-static const struct snd_kcontrol_new sun4i_codec_widgets[] = {
+/* Note: this is modified by the sun4i_codec_probe() function. */
+static struct snd_kcontrol_new sun4i_codec_widgets[] = {
 	SOC_SINGLE_TLV("PA Volume", SUN4I_CODEC_DAC_ACTL,
 		       SUN4I_CODEC_DAC_ACTL_PA_VOL, 0x3F, 0,
 		       sun4i_codec_pa_volume_scale),
+	/* Line-In, FM-In, Mic1-In, Mic2-In */
+	SOC_SINGLE_TLV("Line-In Playback Gain",
+		       SUN4I_CODEC_DAC_ACTL,
+		       SUN4I_CODEC_DAC_ACTL_LNG,
+		       1,
+		       0,
+		       sun4i_codec_linein_loopback_gain_scale),
+	SOC_SINGLE_TLV("FM-In Playback Gain",
+		       SUN4I_CODEC_DAC_ACTL,
+		       SUN4I_CODEC_DAC_ACTL_FMG,
+		       3,
+		       0,
+		       sun4i_codec_fmin_loopback_gain_scale),
+	SOC_SINGLE_TLV("Mic-In Playback Gain",
+		       SUN4I_CODEC_DAC_ACTL,
+		       SUN4I_CODEC_DAC_ACTL_MICG,
+		       7,
+		       0,
+		       sun4i_codec_micin_loopback_gain_scale),
+	SOC_SINGLE_TLV("Mic1-In Boost Gain",
+		       SUN4I_CODEC_ADC_ACTL,
+		       SUN4I_CODEC_ADC_ACTL_PREG1_A10,
+		       3,
+		       0,
+		       sun4i_codec_micin_preamp_gain_scale_a10),
+	SOC_SINGLE_TLV("Mic2-In Boost Gain",
+		       SUN4I_CODEC_ADC_ACTL,
+		       SUN4I_CODEC_ADC_ACTL_PREG2_A10,
+		       3,
+		       0,
+		       sun4i_codec_micin_preamp_gain_scale_a10),
+	SOC_SINGLE_TLV("Mic1-In Boost Switch",
+		       SUN4I_CODEC_ADC_ACTL,
+		       SUN4I_CODEC_ADC_ACTL_PREG1EN,
+		       1,
+		       0,
+		       NULL),
+	SOC_SINGLE_TLV("Mic2-In Boost Switch",
+		       SUN4I_CODEC_ADC_ACTL,
+		       SUN4I_CODEC_ADC_ACTL_PREG2EN,
+		       1,
+		       0,
+		       NULL),
 };
 
 static const struct snd_kcontrol_new sun4i_codec_left_mixer_controls[] = {
 	SOC_DAPM_SINGLE("Left DAC Playback Switch", SUN4I_CODEC_DAC_ACTL,
 			SUN4I_CODEC_DAC_ACTL_LDACLMIXS, 1, 0),
+	SOC_DAPM_SINGLE("Left Line-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_LLNS, 1, 0),
+	SOC_DAPM_SINGLE("Left FM-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_LFMS, 1, 0),
+	SOC_DAPM_SINGLE("Mic1-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_MIC1LS, 1, 0),
+	SOC_DAPM_SINGLE("Mic2-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_MIC2LS, 1, 0),
 };
 
 static const struct snd_kcontrol_new sun4i_codec_right_mixer_controls[] = {
@@ -419,6 +522,14 @@ static const struct snd_kcontrol_new sun4i_codec_right_mixer_controls[] = {
 			SUN4I_CODEC_DAC_ACTL_RDACRMIXS, 1, 0),
 	SOC_DAPM_SINGLE("Left DAC Playback Switch", SUN4I_CODEC_DAC_ACTL,
 			SUN4I_CODEC_DAC_ACTL_LDACRMIXS, 1, 0),
+	SOC_DAPM_SINGLE("Right Line-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_RLNS, 1, 0),
+	SOC_DAPM_SINGLE("Right FM-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_RFMS, 1, 0),
+	SOC_DAPM_SINGLE("Mic1-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_MIC1RS, 1, 0),
+	SOC_DAPM_SINGLE("Mic2-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_MIC2RS, 1, 0),
 };
 
 static const struct snd_kcontrol_new sun4i_codec_pa_mixer_controls[] = {
@@ -462,8 +573,16 @@ static const struct snd_soc_dapm_widget sun4i_codec_dapm_widgets[] = {
 
 	SND_SOC_DAPM_OUTPUT("HP Right"),
 	SND_SOC_DAPM_OUTPUT("HP Left"),
+
+	SND_SOC_DAPM_INPUT("Line-In Right"),
+	SND_SOC_DAPM_INPUT("Line-In Left"),
+	SND_SOC_DAPM_INPUT("FM-In Right"),
+	SND_SOC_DAPM_INPUT("FM-In Left"),
+	SND_SOC_DAPM_INPUT("Mic1-In"),
+	SND_SOC_DAPM_INPUT("Mic2-In"),
 };
 
+/* {sink, control, source} */
 static const struct snd_soc_dapm_route sun4i_codec_dapm_routes[] = {
 	/* Left DAC Routes */
 	{ "Left DAC", NULL, "DAC" },
@@ -490,6 +609,20 @@ static const struct snd_soc_dapm_route sun4i_codec_dapm_routes[] = {
 	{ "Pre-Amplifier Mute", "Switch", "Pre-Amplifier" },
 	{ "HP Right", NULL, "Pre-Amplifier Mute" },
 	{ "HP Left", NULL, "Pre-Amplifier Mute" },
+
+	/* Line-In, FM-In */
+	{ "Right Mixer", "Right Line-In Playback Switch", "Line-In Right" },
+	{ "Left Mixer", "Left Line-In Playback Switch", "Line-In Left" },
+	{ "Right Mixer", "Right FM-In Playback Switch", "FM-In Right" },
+	{ "Left Mixer", "Left FM-In Playback Switch", "FM-In Left" },
+
+	/* Mic1-In */
+	{ "Right Mixer", "Mic1-In Playback Switch", "Mic1-In" },
+	{ "Left Mixer", "Mic1-In Playback Switch", "Mic1-In" },
+
+	/* Mic2-In */
+	{ "Right Mixer", "Mic2-In Playback Switch", "Mic2-In" },
+	{ "Left Mixer", "Mic2-In Playback Switch", "Mic2-In" },
 };
 
 static struct snd_soc_codec_driver sun4i_codec_codec = {
@@ -537,7 +670,7 @@ static const struct regmap_config sun4i_codec_regmap_config = {
 	.reg_bits	= 32,
 	.reg_stride	= 4,
 	.val_bits	= 32,
-	.max_register	= SUN4I_CODEC_AC_MIC_PHONE_CAL,
+	.max_register	= SUN7I_CODEC_AC_MIC_PHONE_CAL,
 };
 
 static const struct of_device_id sun4i_codec_of_match[] = {
@@ -594,6 +727,20 @@ static int sun4i_codec_probe(struct platform_device *pdev)
 	void __iomem *base;
 	int ret;
 
+	if (of_device_is_compatible(pdev->dev.of_node, "allwinner,sun7i-a20-codec")) {
+		size_t i, j;
+		for (i = 0; i < ARRAY_SIZE(sun7ionly_codec_widgets); ++i) {
+			struct snd_kcontrol_new *new_kcontrol;
+			new_kcontrol = &sun7ionly_codec_widgets[i];
+			for (j = 0; j < ARRAY_SIZE(sun4i_codec_widgets); ++j) {
+				struct snd_kcontrol_new *kcontrol;
+				kcontrol = &sun4i_codec_widgets[j];
+				if (strcmp(kcontrol->name, new_kcontrol->name) == 0)
+					memcpy(kcontrol, new_kcontrol, sizeof(*kcontrol));
+			}
+		}
+	}
+
 	scodec = devm_kzalloc(&pdev->dev, sizeof(*scodec), GFP_KERNEL);
 	if (!scodec)
 		return -ENOMEM;

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v5] sun4i-codec: add inputs
@ 2015-12-08  3:20 ` Danny Milosavljevic
  0 siblings, 0 replies; 8+ messages in thread
From: Danny Milosavljevic @ 2015-12-08  3:20 UTC (permalink / raw)
  To: linux-arm-kernel

Hi,

this is the fifth version of the patch that adds inputs to sun4i-codec.
(Previous versions have been on the linux-sunxi mailing list only)

The inputs added are:
- FM-In Left and Right
- Line-In Left and Right
- Mic1-In
- Mic2-In

Changes compared to v4 are:
- Mic preamplifier controls have more common names now.
- Mic preamplifier scale has a 0 dB entry as well now, as documented in the 
  A20 user manual.
- Mic preamplifier has special cases for A20 and A10 now.
- Gain controls have "Gain" in the name now.

I successfully tested it on an A20 board using alsamixer, headphones, a radio and 
my ears.
Note that because of missing capturing support I tested only the mixing, 
for Mic, Line, and FM.

The patches are on top of <git://git.kernel.org/pub/scm/linux/kernel/git/mripard/linux.git>, 
branch "sunxi/for-next".

Regards,
   Danny

Danny (1):
 b/sound/soc/sunxi/sun4i-codec.c |  153 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 150 insertions(+), 3 deletions(-)

Signed-off-by: Danny Milosavljevic <dannym+a@scratchpost.org>
---
diff --git a/sound/soc/sunxi/sun4i-codec.c b/sound/soc/sunxi/sun4i-codec.c
index bcbf4da..106b568 100644
--- a/sound/soc/sunxi/sun4i-codec.c
+++ b/sound/soc/sunxi/sun4i-codec.c
@@ -57,9 +57,20 @@
 #define SUN4I_CODEC_DAC_ACTL_DACAENR			(31)
 #define SUN4I_CODEC_DAC_ACTL_DACAENL			(30)
 #define SUN4I_CODEC_DAC_ACTL_MIXEN			(29)
+#define SUN4I_CODEC_DAC_ACTL_LNG			(26)
+#define SUN4I_CODEC_DAC_ACTL_FMG			(23)
+#define SUN4I_CODEC_DAC_ACTL_MICG			(20)
+#define SUN4I_CODEC_DAC_ACTL_LLNS			(19)
+#define SUN4I_CODEC_DAC_ACTL_RLNS			(18)
+#define SUN4I_CODEC_DAC_ACTL_LFMS			(17)
+#define SUN4I_CODEC_DAC_ACTL_RFMS			(16)
 #define SUN4I_CODEC_DAC_ACTL_LDACLMIXS			(15)
 #define SUN4I_CODEC_DAC_ACTL_RDACRMIXS			(14)
 #define SUN4I_CODEC_DAC_ACTL_LDACRMIXS			(13)
+#define SUN4I_CODEC_DAC_ACTL_MIC1LS			(12)
+#define SUN4I_CODEC_DAC_ACTL_MIC1RS			(11)
+#define SUN4I_CODEC_DAC_ACTL_MIC2LS			(10)
+#define SUN4I_CODEC_DAC_ACTL_MIC2RS			(9)
 #define SUN4I_CODEC_DAC_ACTL_DACPAS			(8)
 #define SUN4I_CODEC_DAC_ACTL_MIXPAS			(7)
 #define SUN4I_CODEC_DAC_ACTL_PA_MUTE			(6)
@@ -84,8 +95,11 @@
 #define SUN4I_CODEC_ADC_ACTL_PREG1EN			(29)
 #define SUN4I_CODEC_ADC_ACTL_PREG2EN			(28)
 #define SUN4I_CODEC_ADC_ACTL_VMICEN			(27)
+#define SUN4I_CODEC_ADC_ACTL_PREG1_A10			(25)
+#define SUN4I_CODEC_ADC_ACTL_PREG2_A10			(23)
 #define SUN4I_CODEC_ADC_ACTL_VADCG			(20)
 #define SUN4I_CODEC_ADC_ACTL_ADCIS			(17)
+#define SUN4I_CODEC_ADC_ACTL_LNRDF			(16)
 #define SUN4I_CODEC_ADC_ACTL_PA_EN			(4)
 #define SUN4I_CODEC_ADC_ACTL_DDE			(3)
 #define SUN4I_CODEC_ADC_DEBUG			(0x2c)
@@ -94,7 +108,18 @@
 #define SUN4I_CODEC_DAC_TXCNT			(0x30)
 #define SUN4I_CODEC_ADC_RXCNT			(0x34)
 #define SUN4I_CODEC_AC_SYS_VERI			(0x38)
-#define SUN4I_CODEC_AC_MIC_PHONE_CAL		(0x3c)
+
+/* MIC_PHONE_CAL register offsets and bit fields (A20 only) */
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL		(0x3c)
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG1      (29)
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG2      (26)
+/* note: no idea where the output pins for the following are. */
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTG  (5)
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTEN (4)
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS3 (3)
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS2 (2)
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS1 (1)
+#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS0 (0)
 
 struct sun4i_codec {
 	struct device	*dev;
@@ -402,16 +427,94 @@ static const struct snd_kcontrol_new sun4i_codec_pa_mute =
 			SUN4I_CODEC_DAC_ACTL_PA_MUTE, 1, 0);
 
 static DECLARE_TLV_DB_SCALE(sun4i_codec_pa_volume_scale, -6300, 100, 1);
+static DECLARE_TLV_DB_SCALE(sun4i_codec_linein_loopback_gain_scale, -150, 150, 0);
+static DECLARE_TLV_DB_SCALE(sun4i_codec_fmin_loopback_gain_scale, -450, 150, 0);
+static DECLARE_TLV_DB_SCALE(sun4i_codec_micin_loopback_gain_scale, -450, 150, 0);
+static DECLARE_TLV_DB_RANGE(sun7i_codec_micin_preamp_gain_scale,
+	0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
+	1, 7, TLV_DB_SCALE_ITEM(2400, 300, 0)
+);
+static DECLARE_TLV_DB_RANGE(sun4i_codec_micin_preamp_gain_scale_a10,
+	0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
+	1, 7, TLV_DB_SCALE_ITEM(3500, 300, 0)
+);
+
+struct snd_kcontrol_new sun7ionly_codec_widgets[] = {
+	SOC_SINGLE_TLV("Mic1-In Boost Gain",
+		       SUN7I_CODEC_AC_MIC_PHONE_CAL,
+		       SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG1,
+		       7,
+		       0,
+		       sun7i_codec_micin_preamp_gain_scale),
+	SOC_SINGLE_TLV("Mic2-In Boost Gain",
+		       SUN7I_CODEC_AC_MIC_PHONE_CAL,
+		       SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG2,
+		       7,
+		       0,
+		       sun7i_codec_micin_preamp_gain_scale),
+};
 
-static const struct snd_kcontrol_new sun4i_codec_widgets[] = {
+/* Note: this is modified by the sun4i_codec_probe() function. */
+static struct snd_kcontrol_new sun4i_codec_widgets[] = {
 	SOC_SINGLE_TLV("PA Volume", SUN4I_CODEC_DAC_ACTL,
 		       SUN4I_CODEC_DAC_ACTL_PA_VOL, 0x3F, 0,
 		       sun4i_codec_pa_volume_scale),
+	/* Line-In, FM-In, Mic1-In, Mic2-In */
+	SOC_SINGLE_TLV("Line-In Playback Gain",
+		       SUN4I_CODEC_DAC_ACTL,
+		       SUN4I_CODEC_DAC_ACTL_LNG,
+		       1,
+		       0,
+		       sun4i_codec_linein_loopback_gain_scale),
+	SOC_SINGLE_TLV("FM-In Playback Gain",
+		       SUN4I_CODEC_DAC_ACTL,
+		       SUN4I_CODEC_DAC_ACTL_FMG,
+		       3,
+		       0,
+		       sun4i_codec_fmin_loopback_gain_scale),
+	SOC_SINGLE_TLV("Mic-In Playback Gain",
+		       SUN4I_CODEC_DAC_ACTL,
+		       SUN4I_CODEC_DAC_ACTL_MICG,
+		       7,
+		       0,
+		       sun4i_codec_micin_loopback_gain_scale),
+	SOC_SINGLE_TLV("Mic1-In Boost Gain",
+		       SUN4I_CODEC_ADC_ACTL,
+		       SUN4I_CODEC_ADC_ACTL_PREG1_A10,
+		       3,
+		       0,
+		       sun4i_codec_micin_preamp_gain_scale_a10),
+	SOC_SINGLE_TLV("Mic2-In Boost Gain",
+		       SUN4I_CODEC_ADC_ACTL,
+		       SUN4I_CODEC_ADC_ACTL_PREG2_A10,
+		       3,
+		       0,
+		       sun4i_codec_micin_preamp_gain_scale_a10),
+	SOC_SINGLE_TLV("Mic1-In Boost Switch",
+		       SUN4I_CODEC_ADC_ACTL,
+		       SUN4I_CODEC_ADC_ACTL_PREG1EN,
+		       1,
+		       0,
+		       NULL),
+	SOC_SINGLE_TLV("Mic2-In Boost Switch",
+		       SUN4I_CODEC_ADC_ACTL,
+		       SUN4I_CODEC_ADC_ACTL_PREG2EN,
+		       1,
+		       0,
+		       NULL),
 };
 
 static const struct snd_kcontrol_new sun4i_codec_left_mixer_controls[] = {
 	SOC_DAPM_SINGLE("Left DAC Playback Switch", SUN4I_CODEC_DAC_ACTL,
 			SUN4I_CODEC_DAC_ACTL_LDACLMIXS, 1, 0),
+	SOC_DAPM_SINGLE("Left Line-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_LLNS, 1, 0),
+	SOC_DAPM_SINGLE("Left FM-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_LFMS, 1, 0),
+	SOC_DAPM_SINGLE("Mic1-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_MIC1LS, 1, 0),
+	SOC_DAPM_SINGLE("Mic2-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_MIC2LS, 1, 0),
 };
 
 static const struct snd_kcontrol_new sun4i_codec_right_mixer_controls[] = {
@@ -419,6 +522,14 @@ static const struct snd_kcontrol_new sun4i_codec_right_mixer_controls[] = {
 			SUN4I_CODEC_DAC_ACTL_RDACRMIXS, 1, 0),
 	SOC_DAPM_SINGLE("Left DAC Playback Switch", SUN4I_CODEC_DAC_ACTL,
 			SUN4I_CODEC_DAC_ACTL_LDACRMIXS, 1, 0),
+	SOC_DAPM_SINGLE("Right Line-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_RLNS, 1, 0),
+	SOC_DAPM_SINGLE("Right FM-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_RFMS, 1, 0),
+	SOC_DAPM_SINGLE("Mic1-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_MIC1RS, 1, 0),
+	SOC_DAPM_SINGLE("Mic2-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
+			SUN4I_CODEC_DAC_ACTL_MIC2RS, 1, 0),
 };
 
 static const struct snd_kcontrol_new sun4i_codec_pa_mixer_controls[] = {
@@ -462,8 +573,16 @@ static const struct snd_soc_dapm_widget sun4i_codec_dapm_widgets[] = {
 
 	SND_SOC_DAPM_OUTPUT("HP Right"),
 	SND_SOC_DAPM_OUTPUT("HP Left"),
+
+	SND_SOC_DAPM_INPUT("Line-In Right"),
+	SND_SOC_DAPM_INPUT("Line-In Left"),
+	SND_SOC_DAPM_INPUT("FM-In Right"),
+	SND_SOC_DAPM_INPUT("FM-In Left"),
+	SND_SOC_DAPM_INPUT("Mic1-In"),
+	SND_SOC_DAPM_INPUT("Mic2-In"),
 };
 
+/* {sink, control, source} */
 static const struct snd_soc_dapm_route sun4i_codec_dapm_routes[] = {
 	/* Left DAC Routes */
 	{ "Left DAC", NULL, "DAC" },
@@ -490,6 +609,20 @@ static const struct snd_soc_dapm_route sun4i_codec_dapm_routes[] = {
 	{ "Pre-Amplifier Mute", "Switch", "Pre-Amplifier" },
 	{ "HP Right", NULL, "Pre-Amplifier Mute" },
 	{ "HP Left", NULL, "Pre-Amplifier Mute" },
+
+	/* Line-In, FM-In */
+	{ "Right Mixer", "Right Line-In Playback Switch", "Line-In Right" },
+	{ "Left Mixer", "Left Line-In Playback Switch", "Line-In Left" },
+	{ "Right Mixer", "Right FM-In Playback Switch", "FM-In Right" },
+	{ "Left Mixer", "Left FM-In Playback Switch", "FM-In Left" },
+
+	/* Mic1-In */
+	{ "Right Mixer", "Mic1-In Playback Switch", "Mic1-In" },
+	{ "Left Mixer", "Mic1-In Playback Switch", "Mic1-In" },
+
+	/* Mic2-In */
+	{ "Right Mixer", "Mic2-In Playback Switch", "Mic2-In" },
+	{ "Left Mixer", "Mic2-In Playback Switch", "Mic2-In" },
 };
 
 static struct snd_soc_codec_driver sun4i_codec_codec = {
@@ -537,7 +670,7 @@ static const struct regmap_config sun4i_codec_regmap_config = {
 	.reg_bits	= 32,
 	.reg_stride	= 4,
 	.val_bits	= 32,
-	.max_register	= SUN4I_CODEC_AC_MIC_PHONE_CAL,
+	.max_register	= SUN7I_CODEC_AC_MIC_PHONE_CAL,
 };
 
 static const struct of_device_id sun4i_codec_of_match[] = {
@@ -594,6 +727,20 @@ static int sun4i_codec_probe(struct platform_device *pdev)
 	void __iomem *base;
 	int ret;
 
+	if (of_device_is_compatible(pdev->dev.of_node, "allwinner,sun7i-a20-codec")) {
+		size_t i, j;
+		for (i = 0; i < ARRAY_SIZE(sun7ionly_codec_widgets); ++i) {
+			struct snd_kcontrol_new *new_kcontrol;
+			new_kcontrol = &sun7ionly_codec_widgets[i];
+			for (j = 0; j < ARRAY_SIZE(sun4i_codec_widgets); ++j) {
+				struct snd_kcontrol_new *kcontrol;
+				kcontrol = &sun4i_codec_widgets[j];
+				if (strcmp(kcontrol->name, new_kcontrol->name) == 0)
+					memcpy(kcontrol, new_kcontrol, sizeof(*kcontrol));
+			}
+		}
+	}
+
 	scodec = devm_kzalloc(&pdev->dev, sizeof(*scodec), GFP_KERNEL);
 	if (!scodec)
 		return -ENOMEM;

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v5] sun4i-codec: add inputs
  2015-12-08  3:20 ` Danny Milosavljevic
@ 2015-12-10 17:54   ` Maxime Ripard
  -1 siblings, 0 replies; 8+ messages in thread
From: Maxime Ripard @ 2015-12-10 17:54 UTC (permalink / raw)
  To: Danny Milosavljevic
  Cc: Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai,
	Chen-Yu Tsai, alsa-devel, linux-arm-kernel, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 11326 bytes --]

Hi,

On Tue, Dec 08, 2015 at 04:20:13AM +0100, Danny Milosavljevic wrote:
> Hi,
> 
> this is the fifth version of the patch that adds inputs to sun4i-codec.
> (Previous versions have been on the linux-sunxi mailing list only)
> 
> The inputs added are:
> - FM-In Left and Right
> - Line-In Left and Right
> - Mic1-In
> - Mic2-In
> 
> Changes compared to v4 are:
> - Mic preamplifier controls have more common names now.
> - Mic preamplifier scale has a 0 dB entry as well now, as documented in the 
>   A20 user manual.
> - Mic preamplifier has special cases for A20 and A10 now.
> - Gain controls have "Gain" in the name now.
> 
> I successfully tested it on an A20 board using alsamixer, headphones, a radio and 
> my ears.
> Note that because of missing capturing support I tested only the mixing, 
> for Mic, Line, and FM.
> 
> The patches are on top of <git://git.kernel.org/pub/scm/linux/kernel/git/mripard/linux.git>, 
> branch "sunxi/for-next".
> 
> Regards,
>    Danny
> 
> Danny (1):
>  b/sound/soc/sunxi/sun4i-codec.c |  153 +++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 150 insertions(+), 3 deletions(-)
> 
> Signed-off-by: Danny Milosavljevic <dannym+a@scratchpost.org>
> ---
> diff --git a/sound/soc/sunxi/sun4i-codec.c b/sound/soc/sunxi/sun4i-codec.c
> index bcbf4da..106b568 100644
> --- a/sound/soc/sunxi/sun4i-codec.c
> +++ b/sound/soc/sunxi/sun4i-codec.c
> @@ -57,9 +57,20 @@
>  #define SUN4I_CODEC_DAC_ACTL_DACAENR			(31)
>  #define SUN4I_CODEC_DAC_ACTL_DACAENL			(30)
>  #define SUN4I_CODEC_DAC_ACTL_MIXEN			(29)
> +#define SUN4I_CODEC_DAC_ACTL_LNG			(26)
> +#define SUN4I_CODEC_DAC_ACTL_FMG			(23)
> +#define SUN4I_CODEC_DAC_ACTL_MICG			(20)
> +#define SUN4I_CODEC_DAC_ACTL_LLNS			(19)
> +#define SUN4I_CODEC_DAC_ACTL_RLNS			(18)
> +#define SUN4I_CODEC_DAC_ACTL_LFMS			(17)
> +#define SUN4I_CODEC_DAC_ACTL_RFMS			(16)
>  #define SUN4I_CODEC_DAC_ACTL_LDACLMIXS			(15)
>  #define SUN4I_CODEC_DAC_ACTL_RDACRMIXS			(14)
>  #define SUN4I_CODEC_DAC_ACTL_LDACRMIXS			(13)
> +#define SUN4I_CODEC_DAC_ACTL_MIC1LS			(12)
> +#define SUN4I_CODEC_DAC_ACTL_MIC1RS			(11)
> +#define SUN4I_CODEC_DAC_ACTL_MIC2LS			(10)
> +#define SUN4I_CODEC_DAC_ACTL_MIC2RS			(9)
>  #define SUN4I_CODEC_DAC_ACTL_DACPAS			(8)
>  #define SUN4I_CODEC_DAC_ACTL_MIXPAS			(7)
>  #define SUN4I_CODEC_DAC_ACTL_PA_MUTE			(6)
> @@ -84,8 +95,11 @@
>  #define SUN4I_CODEC_ADC_ACTL_PREG1EN			(29)
>  #define SUN4I_CODEC_ADC_ACTL_PREG2EN			(28)
>  #define SUN4I_CODEC_ADC_ACTL_VMICEN			(27)
> +#define SUN4I_CODEC_ADC_ACTL_PREG1_A10			(25)
> +#define SUN4I_CODEC_ADC_ACTL_PREG2_A10			(23)
>  #define SUN4I_CODEC_ADC_ACTL_VADCG			(20)
>  #define SUN4I_CODEC_ADC_ACTL_ADCIS			(17)
> +#define SUN4I_CODEC_ADC_ACTL_LNRDF			(16)
>  #define SUN4I_CODEC_ADC_ACTL_PA_EN			(4)
>  #define SUN4I_CODEC_ADC_ACTL_DDE			(3)
>  #define SUN4I_CODEC_ADC_DEBUG			(0x2c)
> @@ -94,7 +108,18 @@
>  #define SUN4I_CODEC_DAC_TXCNT			(0x30)
>  #define SUN4I_CODEC_ADC_RXCNT			(0x34)
>  #define SUN4I_CODEC_AC_SYS_VERI			(0x38)
> -#define SUN4I_CODEC_AC_MIC_PHONE_CAL		(0x3c)
> +
> +/* MIC_PHONE_CAL register offsets and bit fields (A20 only) */
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL		(0x3c)
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG1      (29)
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG2      (26)
> +/* note: no idea where the output pins for the following are. */
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTG  (5)
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTEN (4)
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS3 (3)
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS2 (2)
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS1 (1)
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS0 (0)
>  
>  struct sun4i_codec {
>  	struct device	*dev;
> @@ -402,16 +427,94 @@ static const struct snd_kcontrol_new sun4i_codec_pa_mute =
>  			SUN4I_CODEC_DAC_ACTL_PA_MUTE, 1, 0);
>  
>  static DECLARE_TLV_DB_SCALE(sun4i_codec_pa_volume_scale, -6300, 100, 1);
> +static DECLARE_TLV_DB_SCALE(sun4i_codec_linein_loopback_gain_scale, -150, 150, 0);
> +static DECLARE_TLV_DB_SCALE(sun4i_codec_fmin_loopback_gain_scale, -450, 150, 0);
> +static DECLARE_TLV_DB_SCALE(sun4i_codec_micin_loopback_gain_scale, -450, 150, 0);
> +static DECLARE_TLV_DB_RANGE(sun7i_codec_micin_preamp_gain_scale,
> +	0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
> +	1, 7, TLV_DB_SCALE_ITEM(2400, 300, 0)
> +);
> +static DECLARE_TLV_DB_RANGE(sun4i_codec_micin_preamp_gain_scale_a10,
> +	0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
> +	1, 7, TLV_DB_SCALE_ITEM(3500, 300, 0)
> +);
> +
> +struct snd_kcontrol_new sun7ionly_codec_widgets[] = {
> +	SOC_SINGLE_TLV("Mic1-In Boost Gain",
> +		       SUN7I_CODEC_AC_MIC_PHONE_CAL,
> +		       SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG1,
> +		       7,
> +		       0,
> +		       sun7i_codec_micin_preamp_gain_scale),
> +	SOC_SINGLE_TLV("Mic2-In Boost Gain",
> +		       SUN7I_CODEC_AC_MIC_PHONE_CAL,
> +		       SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG2,
> +		       7,
> +		       0,
> +		       sun7i_codec_micin_preamp_gain_scale),
> +};
>  
> -static const struct snd_kcontrol_new sun4i_codec_widgets[] = {
> +/* Note: this is modified by the sun4i_codec_probe() function. */
> +static struct snd_kcontrol_new sun4i_codec_widgets[] = {
>  	SOC_SINGLE_TLV("PA Volume", SUN4I_CODEC_DAC_ACTL,
>  		       SUN4I_CODEC_DAC_ACTL_PA_VOL, 0x3F, 0,
>  		       sun4i_codec_pa_volume_scale),
> +	/* Line-In, FM-In, Mic1-In, Mic2-In */
> +	SOC_SINGLE_TLV("Line-In Playback Gain",
> +		       SUN4I_CODEC_DAC_ACTL,
> +		       SUN4I_CODEC_DAC_ACTL_LNG,
> +		       1,
> +		       0,
> +		       sun4i_codec_linein_loopback_gain_scale),
> +	SOC_SINGLE_TLV("FM-In Playback Gain",
> +		       SUN4I_CODEC_DAC_ACTL,
> +		       SUN4I_CODEC_DAC_ACTL_FMG,
> +		       3,
> +		       0,
> +		       sun4i_codec_fmin_loopback_gain_scale),
> +	SOC_SINGLE_TLV("Mic-In Playback Gain",
> +		       SUN4I_CODEC_DAC_ACTL,
> +		       SUN4I_CODEC_DAC_ACTL_MICG,
> +		       7,
> +		       0,
> +		       sun4i_codec_micin_loopback_gain_scale),
> +	SOC_SINGLE_TLV("Mic1-In Boost Gain",
> +		       SUN4I_CODEC_ADC_ACTL,
> +		       SUN4I_CODEC_ADC_ACTL_PREG1_A10,
> +		       3,
> +		       0,
> +		       sun4i_codec_micin_preamp_gain_scale_a10),
> +	SOC_SINGLE_TLV("Mic2-In Boost Gain",
> +		       SUN4I_CODEC_ADC_ACTL,
> +		       SUN4I_CODEC_ADC_ACTL_PREG2_A10,
> +		       3,
> +		       0,
> +		       sun4i_codec_micin_preamp_gain_scale_a10),
> +	SOC_SINGLE_TLV("Mic1-In Boost Switch",
> +		       SUN4I_CODEC_ADC_ACTL,
> +		       SUN4I_CODEC_ADC_ACTL_PREG1EN,
> +		       1,
> +		       0,
> +		       NULL),
> +	SOC_SINGLE_TLV("Mic2-In Boost Switch",
> +		       SUN4I_CODEC_ADC_ACTL,
> +		       SUN4I_CODEC_ADC_ACTL_PREG2EN,
> +		       1,
> +		       0,
> +		       NULL),
>  };
>  
>  static const struct snd_kcontrol_new sun4i_codec_left_mixer_controls[] = {
>  	SOC_DAPM_SINGLE("Left DAC Playback Switch", SUN4I_CODEC_DAC_ACTL,
>  			SUN4I_CODEC_DAC_ACTL_LDACLMIXS, 1, 0),
> +	SOC_DAPM_SINGLE("Left Line-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_LLNS, 1, 0),
> +	SOC_DAPM_SINGLE("Left FM-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_LFMS, 1, 0),
> +	SOC_DAPM_SINGLE("Mic1-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_MIC1LS, 1, 0),
> +	SOC_DAPM_SINGLE("Mic2-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_MIC2LS, 1, 0),
>  };
>  
>  static const struct snd_kcontrol_new sun4i_codec_right_mixer_controls[] = {
> @@ -419,6 +522,14 @@ static const struct snd_kcontrol_new sun4i_codec_right_mixer_controls[] = {
>  			SUN4I_CODEC_DAC_ACTL_RDACRMIXS, 1, 0),
>  	SOC_DAPM_SINGLE("Left DAC Playback Switch", SUN4I_CODEC_DAC_ACTL,
>  			SUN4I_CODEC_DAC_ACTL_LDACRMIXS, 1, 0),
> +	SOC_DAPM_SINGLE("Right Line-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_RLNS, 1, 0),
> +	SOC_DAPM_SINGLE("Right FM-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_RFMS, 1, 0),
> +	SOC_DAPM_SINGLE("Mic1-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_MIC1RS, 1, 0),
> +	SOC_DAPM_SINGLE("Mic2-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_MIC2RS, 1, 0),
>  };

Do we need the -In part of FM, Mic1 and Mic2?

>  
>  static const struct snd_kcontrol_new sun4i_codec_pa_mixer_controls[] = {
> @@ -462,8 +573,16 @@ static const struct snd_soc_dapm_widget sun4i_codec_dapm_widgets[] = {
>  
>  	SND_SOC_DAPM_OUTPUT("HP Right"),
>  	SND_SOC_DAPM_OUTPUT("HP Left"),
> +
> +	SND_SOC_DAPM_INPUT("Line-In Right"),
> +	SND_SOC_DAPM_INPUT("Line-In Left"),
> +	SND_SOC_DAPM_INPUT("FM-In Right"),
> +	SND_SOC_DAPM_INPUT("FM-In Left"),
> +	SND_SOC_DAPM_INPUT("Mic1-In"),

Mic1 is already defined a few lines above.

> +	SND_SOC_DAPM_INPUT("Mic2-In"),
>  };
>  
> +/* {sink, control, source} */
>  static const struct snd_soc_dapm_route sun4i_codec_dapm_routes[] = {
>  	/* Left DAC Routes */
>  	{ "Left DAC", NULL, "DAC" },
> @@ -490,6 +609,20 @@ static const struct snd_soc_dapm_route sun4i_codec_dapm_routes[] = {
>  	{ "Pre-Amplifier Mute", "Switch", "Pre-Amplifier" },
>  	{ "HP Right", NULL, "Pre-Amplifier Mute" },
>  	{ "HP Left", NULL, "Pre-Amplifier Mute" },
> +
> +	/* Line-In, FM-In */
> +	{ "Right Mixer", "Right Line-In Playback Switch", "Line-In Right" },
> +	{ "Left Mixer", "Left Line-In Playback Switch", "Line-In Left" },
> +	{ "Right Mixer", "Right FM-In Playback Switch", "FM-In Right" },
> +	{ "Left Mixer", "Left FM-In Playback Switch", "FM-In Left" },
> +
> +	/* Mic1-In */
> +	{ "Right Mixer", "Mic1-In Playback Switch", "Mic1-In" },
> +	{ "Left Mixer", "Mic1-In Playback Switch", "Mic1-In" },
> +
> +	/* Mic2-In */
> +	{ "Right Mixer", "Mic2-In Playback Switch", "Mic2-In" },
> +	{ "Left Mixer", "Mic2-In Playback Switch", "Mic2-In" },

And you have the Mixers routes a bit above too.

>  };
>  
>  static struct snd_soc_codec_driver sun4i_codec_codec = {
> @@ -537,7 +670,7 @@ static const struct regmap_config sun4i_codec_regmap_config = {
>  	.reg_bits	= 32,
>  	.reg_stride	= 4,
>  	.val_bits	= 32,
> -	.max_register	= SUN4I_CODEC_AC_MIC_PHONE_CAL,
> +	.max_register	= SUN7I_CODEC_AC_MIC_PHONE_CAL,
>  };
>  
>  static const struct of_device_id sun4i_codec_of_match[] = {
> @@ -594,6 +727,20 @@ static int sun4i_codec_probe(struct platform_device *pdev)
>  	void __iomem *base;
>  	int ret;
>  
> +	if (of_device_is_compatible(pdev->dev.of_node, "allwinner,sun7i-a20-codec")) {
> +		size_t i, j;
> +		for (i = 0; i < ARRAY_SIZE(sun7ionly_codec_widgets); ++i) {
> +			struct snd_kcontrol_new *new_kcontrol;
> +			new_kcontrol = &sun7ionly_codec_widgets[i];
> +			for (j = 0; j < ARRAY_SIZE(sun4i_codec_widgets); ++j) {
> +				struct snd_kcontrol_new *kcontrol;
> +				kcontrol = &sun4i_codec_widgets[j];
> +				if (strcmp(kcontrol->name, new_kcontrol->name) == 0)
> +					memcpy(kcontrol, new_kcontrol, sizeof(*kcontrol));
> +			}
> +		}
> +	}
> +

We'll need to fix that, see the other discussion.

Thanks!
Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v5] sun4i-codec: add inputs
@ 2015-12-10 17:54   ` Maxime Ripard
  0 siblings, 0 replies; 8+ messages in thread
From: Maxime Ripard @ 2015-12-10 17:54 UTC (permalink / raw)
  To: linux-arm-kernel

Hi,

On Tue, Dec 08, 2015 at 04:20:13AM +0100, Danny Milosavljevic wrote:
> Hi,
> 
> this is the fifth version of the patch that adds inputs to sun4i-codec.
> (Previous versions have been on the linux-sunxi mailing list only)
> 
> The inputs added are:
> - FM-In Left and Right
> - Line-In Left and Right
> - Mic1-In
> - Mic2-In
> 
> Changes compared to v4 are:
> - Mic preamplifier controls have more common names now.
> - Mic preamplifier scale has a 0 dB entry as well now, as documented in the 
>   A20 user manual.
> - Mic preamplifier has special cases for A20 and A10 now.
> - Gain controls have "Gain" in the name now.
> 
> I successfully tested it on an A20 board using alsamixer, headphones, a radio and 
> my ears.
> Note that because of missing capturing support I tested only the mixing, 
> for Mic, Line, and FM.
> 
> The patches are on top of <git://git.kernel.org/pub/scm/linux/kernel/git/mripard/linux.git>, 
> branch "sunxi/for-next".
> 
> Regards,
>    Danny
> 
> Danny (1):
>  b/sound/soc/sunxi/sun4i-codec.c |  153 +++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 150 insertions(+), 3 deletions(-)
> 
> Signed-off-by: Danny Milosavljevic <dannym+a@scratchpost.org>
> ---
> diff --git a/sound/soc/sunxi/sun4i-codec.c b/sound/soc/sunxi/sun4i-codec.c
> index bcbf4da..106b568 100644
> --- a/sound/soc/sunxi/sun4i-codec.c
> +++ b/sound/soc/sunxi/sun4i-codec.c
> @@ -57,9 +57,20 @@
>  #define SUN4I_CODEC_DAC_ACTL_DACAENR			(31)
>  #define SUN4I_CODEC_DAC_ACTL_DACAENL			(30)
>  #define SUN4I_CODEC_DAC_ACTL_MIXEN			(29)
> +#define SUN4I_CODEC_DAC_ACTL_LNG			(26)
> +#define SUN4I_CODEC_DAC_ACTL_FMG			(23)
> +#define SUN4I_CODEC_DAC_ACTL_MICG			(20)
> +#define SUN4I_CODEC_DAC_ACTL_LLNS			(19)
> +#define SUN4I_CODEC_DAC_ACTL_RLNS			(18)
> +#define SUN4I_CODEC_DAC_ACTL_LFMS			(17)
> +#define SUN4I_CODEC_DAC_ACTL_RFMS			(16)
>  #define SUN4I_CODEC_DAC_ACTL_LDACLMIXS			(15)
>  #define SUN4I_CODEC_DAC_ACTL_RDACRMIXS			(14)
>  #define SUN4I_CODEC_DAC_ACTL_LDACRMIXS			(13)
> +#define SUN4I_CODEC_DAC_ACTL_MIC1LS			(12)
> +#define SUN4I_CODEC_DAC_ACTL_MIC1RS			(11)
> +#define SUN4I_CODEC_DAC_ACTL_MIC2LS			(10)
> +#define SUN4I_CODEC_DAC_ACTL_MIC2RS			(9)
>  #define SUN4I_CODEC_DAC_ACTL_DACPAS			(8)
>  #define SUN4I_CODEC_DAC_ACTL_MIXPAS			(7)
>  #define SUN4I_CODEC_DAC_ACTL_PA_MUTE			(6)
> @@ -84,8 +95,11 @@
>  #define SUN4I_CODEC_ADC_ACTL_PREG1EN			(29)
>  #define SUN4I_CODEC_ADC_ACTL_PREG2EN			(28)
>  #define SUN4I_CODEC_ADC_ACTL_VMICEN			(27)
> +#define SUN4I_CODEC_ADC_ACTL_PREG1_A10			(25)
> +#define SUN4I_CODEC_ADC_ACTL_PREG2_A10			(23)
>  #define SUN4I_CODEC_ADC_ACTL_VADCG			(20)
>  #define SUN4I_CODEC_ADC_ACTL_ADCIS			(17)
> +#define SUN4I_CODEC_ADC_ACTL_LNRDF			(16)
>  #define SUN4I_CODEC_ADC_ACTL_PA_EN			(4)
>  #define SUN4I_CODEC_ADC_ACTL_DDE			(3)
>  #define SUN4I_CODEC_ADC_DEBUG			(0x2c)
> @@ -94,7 +108,18 @@
>  #define SUN4I_CODEC_DAC_TXCNT			(0x30)
>  #define SUN4I_CODEC_ADC_RXCNT			(0x34)
>  #define SUN4I_CODEC_AC_SYS_VERI			(0x38)
> -#define SUN4I_CODEC_AC_MIC_PHONE_CAL		(0x3c)
> +
> +/* MIC_PHONE_CAL register offsets and bit fields (A20 only) */
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL		(0x3c)
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG1      (29)
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG2      (26)
> +/* note: no idea where the output pins for the following are. */
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTG  (5)
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTEN (4)
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS3 (3)
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS2 (2)
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS1 (1)
> +#define SUN7I_CODEC_AC_MIC_PHONE_CAL_PHONEOUTS0 (0)
>  
>  struct sun4i_codec {
>  	struct device	*dev;
> @@ -402,16 +427,94 @@ static const struct snd_kcontrol_new sun4i_codec_pa_mute =
>  			SUN4I_CODEC_DAC_ACTL_PA_MUTE, 1, 0);
>  
>  static DECLARE_TLV_DB_SCALE(sun4i_codec_pa_volume_scale, -6300, 100, 1);
> +static DECLARE_TLV_DB_SCALE(sun4i_codec_linein_loopback_gain_scale, -150, 150, 0);
> +static DECLARE_TLV_DB_SCALE(sun4i_codec_fmin_loopback_gain_scale, -450, 150, 0);
> +static DECLARE_TLV_DB_SCALE(sun4i_codec_micin_loopback_gain_scale, -450, 150, 0);
> +static DECLARE_TLV_DB_RANGE(sun7i_codec_micin_preamp_gain_scale,
> +	0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
> +	1, 7, TLV_DB_SCALE_ITEM(2400, 300, 0)
> +);
> +static DECLARE_TLV_DB_RANGE(sun4i_codec_micin_preamp_gain_scale_a10,
> +	0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
> +	1, 7, TLV_DB_SCALE_ITEM(3500, 300, 0)
> +);
> +
> +struct snd_kcontrol_new sun7ionly_codec_widgets[] = {
> +	SOC_SINGLE_TLV("Mic1-In Boost Gain",
> +		       SUN7I_CODEC_AC_MIC_PHONE_CAL,
> +		       SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG1,
> +		       7,
> +		       0,
> +		       sun7i_codec_micin_preamp_gain_scale),
> +	SOC_SINGLE_TLV("Mic2-In Boost Gain",
> +		       SUN7I_CODEC_AC_MIC_PHONE_CAL,
> +		       SUN7I_CODEC_AC_MIC_PHONE_CAL_PREG2,
> +		       7,
> +		       0,
> +		       sun7i_codec_micin_preamp_gain_scale),
> +};
>  
> -static const struct snd_kcontrol_new sun4i_codec_widgets[] = {
> +/* Note: this is modified by the sun4i_codec_probe() function. */
> +static struct snd_kcontrol_new sun4i_codec_widgets[] = {
>  	SOC_SINGLE_TLV("PA Volume", SUN4I_CODEC_DAC_ACTL,
>  		       SUN4I_CODEC_DAC_ACTL_PA_VOL, 0x3F, 0,
>  		       sun4i_codec_pa_volume_scale),
> +	/* Line-In, FM-In, Mic1-In, Mic2-In */
> +	SOC_SINGLE_TLV("Line-In Playback Gain",
> +		       SUN4I_CODEC_DAC_ACTL,
> +		       SUN4I_CODEC_DAC_ACTL_LNG,
> +		       1,
> +		       0,
> +		       sun4i_codec_linein_loopback_gain_scale),
> +	SOC_SINGLE_TLV("FM-In Playback Gain",
> +		       SUN4I_CODEC_DAC_ACTL,
> +		       SUN4I_CODEC_DAC_ACTL_FMG,
> +		       3,
> +		       0,
> +		       sun4i_codec_fmin_loopback_gain_scale),
> +	SOC_SINGLE_TLV("Mic-In Playback Gain",
> +		       SUN4I_CODEC_DAC_ACTL,
> +		       SUN4I_CODEC_DAC_ACTL_MICG,
> +		       7,
> +		       0,
> +		       sun4i_codec_micin_loopback_gain_scale),
> +	SOC_SINGLE_TLV("Mic1-In Boost Gain",
> +		       SUN4I_CODEC_ADC_ACTL,
> +		       SUN4I_CODEC_ADC_ACTL_PREG1_A10,
> +		       3,
> +		       0,
> +		       sun4i_codec_micin_preamp_gain_scale_a10),
> +	SOC_SINGLE_TLV("Mic2-In Boost Gain",
> +		       SUN4I_CODEC_ADC_ACTL,
> +		       SUN4I_CODEC_ADC_ACTL_PREG2_A10,
> +		       3,
> +		       0,
> +		       sun4i_codec_micin_preamp_gain_scale_a10),
> +	SOC_SINGLE_TLV("Mic1-In Boost Switch",
> +		       SUN4I_CODEC_ADC_ACTL,
> +		       SUN4I_CODEC_ADC_ACTL_PREG1EN,
> +		       1,
> +		       0,
> +		       NULL),
> +	SOC_SINGLE_TLV("Mic2-In Boost Switch",
> +		       SUN4I_CODEC_ADC_ACTL,
> +		       SUN4I_CODEC_ADC_ACTL_PREG2EN,
> +		       1,
> +		       0,
> +		       NULL),
>  };
>  
>  static const struct snd_kcontrol_new sun4i_codec_left_mixer_controls[] = {
>  	SOC_DAPM_SINGLE("Left DAC Playback Switch", SUN4I_CODEC_DAC_ACTL,
>  			SUN4I_CODEC_DAC_ACTL_LDACLMIXS, 1, 0),
> +	SOC_DAPM_SINGLE("Left Line-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_LLNS, 1, 0),
> +	SOC_DAPM_SINGLE("Left FM-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_LFMS, 1, 0),
> +	SOC_DAPM_SINGLE("Mic1-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_MIC1LS, 1, 0),
> +	SOC_DAPM_SINGLE("Mic2-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_MIC2LS, 1, 0),
>  };
>  
>  static const struct snd_kcontrol_new sun4i_codec_right_mixer_controls[] = {
> @@ -419,6 +522,14 @@ static const struct snd_kcontrol_new sun4i_codec_right_mixer_controls[] = {
>  			SUN4I_CODEC_DAC_ACTL_RDACRMIXS, 1, 0),
>  	SOC_DAPM_SINGLE("Left DAC Playback Switch", SUN4I_CODEC_DAC_ACTL,
>  			SUN4I_CODEC_DAC_ACTL_LDACRMIXS, 1, 0),
> +	SOC_DAPM_SINGLE("Right Line-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_RLNS, 1, 0),
> +	SOC_DAPM_SINGLE("Right FM-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_RFMS, 1, 0),
> +	SOC_DAPM_SINGLE("Mic1-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_MIC1RS, 1, 0),
> +	SOC_DAPM_SINGLE("Mic2-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> +			SUN4I_CODEC_DAC_ACTL_MIC2RS, 1, 0),
>  };

Do we need the -In part of FM, Mic1 and Mic2?

>  
>  static const struct snd_kcontrol_new sun4i_codec_pa_mixer_controls[] = {
> @@ -462,8 +573,16 @@ static const struct snd_soc_dapm_widget sun4i_codec_dapm_widgets[] = {
>  
>  	SND_SOC_DAPM_OUTPUT("HP Right"),
>  	SND_SOC_DAPM_OUTPUT("HP Left"),
> +
> +	SND_SOC_DAPM_INPUT("Line-In Right"),
> +	SND_SOC_DAPM_INPUT("Line-In Left"),
> +	SND_SOC_DAPM_INPUT("FM-In Right"),
> +	SND_SOC_DAPM_INPUT("FM-In Left"),
> +	SND_SOC_DAPM_INPUT("Mic1-In"),

Mic1 is already defined a few lines above.

> +	SND_SOC_DAPM_INPUT("Mic2-In"),
>  };
>  
> +/* {sink, control, source} */
>  static const struct snd_soc_dapm_route sun4i_codec_dapm_routes[] = {
>  	/* Left DAC Routes */
>  	{ "Left DAC", NULL, "DAC" },
> @@ -490,6 +609,20 @@ static const struct snd_soc_dapm_route sun4i_codec_dapm_routes[] = {
>  	{ "Pre-Amplifier Mute", "Switch", "Pre-Amplifier" },
>  	{ "HP Right", NULL, "Pre-Amplifier Mute" },
>  	{ "HP Left", NULL, "Pre-Amplifier Mute" },
> +
> +	/* Line-In, FM-In */
> +	{ "Right Mixer", "Right Line-In Playback Switch", "Line-In Right" },
> +	{ "Left Mixer", "Left Line-In Playback Switch", "Line-In Left" },
> +	{ "Right Mixer", "Right FM-In Playback Switch", "FM-In Right" },
> +	{ "Left Mixer", "Left FM-In Playback Switch", "FM-In Left" },
> +
> +	/* Mic1-In */
> +	{ "Right Mixer", "Mic1-In Playback Switch", "Mic1-In" },
> +	{ "Left Mixer", "Mic1-In Playback Switch", "Mic1-In" },
> +
> +	/* Mic2-In */
> +	{ "Right Mixer", "Mic2-In Playback Switch", "Mic2-In" },
> +	{ "Left Mixer", "Mic2-In Playback Switch", "Mic2-In" },

And you have the Mixers routes a bit above too.

>  };
>  
>  static struct snd_soc_codec_driver sun4i_codec_codec = {
> @@ -537,7 +670,7 @@ static const struct regmap_config sun4i_codec_regmap_config = {
>  	.reg_bits	= 32,
>  	.reg_stride	= 4,
>  	.val_bits	= 32,
> -	.max_register	= SUN4I_CODEC_AC_MIC_PHONE_CAL,
> +	.max_register	= SUN7I_CODEC_AC_MIC_PHONE_CAL,
>  };
>  
>  static const struct of_device_id sun4i_codec_of_match[] = {
> @@ -594,6 +727,20 @@ static int sun4i_codec_probe(struct platform_device *pdev)
>  	void __iomem *base;
>  	int ret;
>  
> +	if (of_device_is_compatible(pdev->dev.of_node, "allwinner,sun7i-a20-codec")) {
> +		size_t i, j;
> +		for (i = 0; i < ARRAY_SIZE(sun7ionly_codec_widgets); ++i) {
> +			struct snd_kcontrol_new *new_kcontrol;
> +			new_kcontrol = &sun7ionly_codec_widgets[i];
> +			for (j = 0; j < ARRAY_SIZE(sun4i_codec_widgets); ++j) {
> +				struct snd_kcontrol_new *kcontrol;
> +				kcontrol = &sun4i_codec_widgets[j];
> +				if (strcmp(kcontrol->name, new_kcontrol->name) == 0)
> +					memcpy(kcontrol, new_kcontrol, sizeof(*kcontrol));
> +			}
> +		}
> +	}
> +

We'll need to fix that, see the other discussion.

Thanks!
Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20151210/c26ec51a/attachment.sig>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v5] sun4i-codec: add inputs
  2015-12-10 17:54   ` Maxime Ripard
@ 2015-12-10 20:52     ` Danny Milosavljevic
  -1 siblings, 0 replies; 8+ messages in thread
From: Danny Milosavljevic @ 2015-12-10 20:52 UTC (permalink / raw)
  To: Maxime Ripard
  Cc: Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai,
	Chen-Yu Tsai, alsa-devel, linux-arm-kernel, linux-kernel

Hi Maxime,

On Thu, 10 Dec 2015 18:54:20 +0100
Maxime Ripard <maxime.ripard@free-electrons.com> wrote:
> > +	SOC_DAPM_SINGLE("Mic1-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> > +			SUN4I_CODEC_DAC_ACTL_MIC1RS, 1, 0),
> > +	SOC_DAPM_SINGLE("Mic2-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> > +			SUN4I_CODEC_DAC_ACTL_MIC2RS, 1, 0),
> >  };
> 
> Do we need the -In part of FM, Mic1 and Mic2?

For consistency to what's in linux-sunxi.git, I will remove the "-In" from 
the Mic names in v7.

For FM, do we? I don't know. Are there ALSA devices which output to FM?

> Mic1 is already defined a few lines above.
> And you have the Mixers routes a bit above too.

Aha, Mic1 is there in <https://github.com/linux-sunxi/linux-sunxi.git> 
branch "sunxi-next".
In <git://git.kernel.org/pub/scm/linux/kernel/git/mripard/linux.git> 
branch "sunxi/for-next", it's not there. 
This patch is for the latter.

I'm currently rebasing on the former, but it will take some time. 
The differences between these driver versions are:
- Mic1 Preamplifier is registered as PGA instead of switch in the former.
- Mic1 is already an input in the former.
- VMIC is handled in the former.
- ADC Capturing support exists in the former.
That's it.

I'll retest a patch based on the former...

> [global mutation]
> We'll need to fix that, see the other discussion.

Yeah, I think I found a nicer way to do it in v6.

Thanks,
   Danny

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v5] sun4i-codec: add inputs
@ 2015-12-10 20:52     ` Danny Milosavljevic
  0 siblings, 0 replies; 8+ messages in thread
From: Danny Milosavljevic @ 2015-12-10 20:52 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Maxime,

On Thu, 10 Dec 2015 18:54:20 +0100
Maxime Ripard <maxime.ripard@free-electrons.com> wrote:
> > +	SOC_DAPM_SINGLE("Mic1-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> > +			SUN4I_CODEC_DAC_ACTL_MIC1RS, 1, 0),
> > +	SOC_DAPM_SINGLE("Mic2-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
> > +			SUN4I_CODEC_DAC_ACTL_MIC2RS, 1, 0),
> >  };
> 
> Do we need the -In part of FM, Mic1 and Mic2?

For consistency to what's in linux-sunxi.git, I will remove the "-In" from 
the Mic names in v7.

For FM, do we? I don't know. Are there ALSA devices which output to FM?

> Mic1 is already defined a few lines above.
> And you have the Mixers routes a bit above too.

Aha, Mic1 is there in <https://github.com/linux-sunxi/linux-sunxi.git> 
branch "sunxi-next".
In <git://git.kernel.org/pub/scm/linux/kernel/git/mripard/linux.git> 
branch "sunxi/for-next", it's not there. 
This patch is for the latter.

I'm currently rebasing on the former, but it will take some time. 
The differences between these driver versions are:
- Mic1 Preamplifier is registered as PGA instead of switch in the former.
- Mic1 is already an input in the former.
- VMIC is handled in the former.
- ADC Capturing support exists in the former.
That's it.

I'll retest a patch based on the former...

> [global mutation]
> We'll need to fix that, see the other discussion.

Yeah, I think I found a nicer way to do it in v6.

Thanks,
   Danny

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v5] sun4i-codec: add inputs
  2015-12-10 20:52     ` Danny Milosavljevic
@ 2015-12-11  2:45       ` Chen-Yu Tsai
  -1 siblings, 0 replies; 8+ messages in thread
From: Chen-Yu Tsai @ 2015-12-11  2:45 UTC (permalink / raw)
  To: Danny Milosavljevic
  Cc: Maxime Ripard, Liam Girdwood, Mark Brown, Jaroslav Kysela,
	Takashi Iwai, Chen-Yu Tsai, alsa-devel, linux-arm-kernel,
	linux-kernel

On Fri, Dec 11, 2015 at 4:52 AM, Danny Milosavljevic
<dannym@scratchpost.org> wrote:
> Hi Maxime,
>
> On Thu, 10 Dec 2015 18:54:20 +0100
> Maxime Ripard <maxime.ripard@free-electrons.com> wrote:
>> > +   SOC_DAPM_SINGLE("Mic1-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
>> > +                   SUN4I_CODEC_DAC_ACTL_MIC1RS, 1, 0),
>> > +   SOC_DAPM_SINGLE("Mic2-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
>> > +                   SUN4I_CODEC_DAC_ACTL_MIC2RS, 1, 0),
>> >  };
>>
>> Do we need the -In part of FM, Mic1 and Mic2?
>
> For consistency to what's in linux-sunxi.git, I will remove the "-In" from
> the Mic names in v7.
>
> For FM, do we? I don't know. Are there ALSA devices which output to FM?
>
>> Mic1 is already defined a few lines above.
>> And you have the Mixers routes a bit above too.
>
> Aha, Mic1 is there in <https://github.com/linux-sunxi/linux-sunxi.git>
> branch "sunxi-next".
> In <git://git.kernel.org/pub/scm/linux/kernel/git/mripard/linux.git>
> branch "sunxi/for-next", it's not there.
> This patch is for the latter.

linux-sunxi/sunxi-next is a branch we maintain that has "most" new features
and patches aimed at the next release. It is not an official kernel branch,
nor is it always up to date (though we try to merge new things in).

mripard/linux sunxi/for-next is Maxime's sunxi branches, which is mostly
clock and dts patches.

You should always base your patches on the "next" branch of the maintainer
that will take your patches. In this case, ASoC:

    https://git.kernel.org/cgit/linux/kernel/git/broonie/sound.git/log/?h=for-next

There's also a sunxi topic branch:

    https://git.kernel.org/cgit/linux/kernel/git/broonie/sound.git/log/?h=topic/sunxi

Or you can just base them off linux-next.


Regards
ChenYu

>
> I'm currently rebasing on the former, but it will take some time.
> The differences between these driver versions are:
> - Mic1 Preamplifier is registered as PGA instead of switch in the former.
> - Mic1 is already an input in the former.
> - VMIC is handled in the former.
> - ADC Capturing support exists in the former.
> That's it.
>
> I'll retest a patch based on the former...
>
>> [global mutation]
>> We'll need to fix that, see the other discussion.
>
> Yeah, I think I found a nicer way to do it in v6.
>
> Thanks,
>    Danny

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v5] sun4i-codec: add inputs
@ 2015-12-11  2:45       ` Chen-Yu Tsai
  0 siblings, 0 replies; 8+ messages in thread
From: Chen-Yu Tsai @ 2015-12-11  2:45 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Dec 11, 2015 at 4:52 AM, Danny Milosavljevic
<dannym@scratchpost.org> wrote:
> Hi Maxime,
>
> On Thu, 10 Dec 2015 18:54:20 +0100
> Maxime Ripard <maxime.ripard@free-electrons.com> wrote:
>> > +   SOC_DAPM_SINGLE("Mic1-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
>> > +                   SUN4I_CODEC_DAC_ACTL_MIC1RS, 1, 0),
>> > +   SOC_DAPM_SINGLE("Mic2-In Playback Switch", SUN4I_CODEC_DAC_ACTL,
>> > +                   SUN4I_CODEC_DAC_ACTL_MIC2RS, 1, 0),
>> >  };
>>
>> Do we need the -In part of FM, Mic1 and Mic2?
>
> For consistency to what's in linux-sunxi.git, I will remove the "-In" from
> the Mic names in v7.
>
> For FM, do we? I don't know. Are there ALSA devices which output to FM?
>
>> Mic1 is already defined a few lines above.
>> And you have the Mixers routes a bit above too.
>
> Aha, Mic1 is there in <https://github.com/linux-sunxi/linux-sunxi.git>
> branch "sunxi-next".
> In <git://git.kernel.org/pub/scm/linux/kernel/git/mripard/linux.git>
> branch "sunxi/for-next", it's not there.
> This patch is for the latter.

linux-sunxi/sunxi-next is a branch we maintain that has "most" new features
and patches aimed at the next release. It is not an official kernel branch,
nor is it always up to date (though we try to merge new things in).

mripard/linux sunxi/for-next is Maxime's sunxi branches, which is mostly
clock and dts patches.

You should always base your patches on the "next" branch of the maintainer
that will take your patches. In this case, ASoC:

    https://git.kernel.org/cgit/linux/kernel/git/broonie/sound.git/log/?h=for-next

There's also a sunxi topic branch:

    https://git.kernel.org/cgit/linux/kernel/git/broonie/sound.git/log/?h=topic/sunxi

Or you can just base them off linux-next.


Regards
ChenYu

>
> I'm currently rebasing on the former, but it will take some time.
> The differences between these driver versions are:
> - Mic1 Preamplifier is registered as PGA instead of switch in the former.
> - Mic1 is already an input in the former.
> - VMIC is handled in the former.
> - ADC Capturing support exists in the former.
> That's it.
>
> I'll retest a patch based on the former...
>
>> [global mutation]
>> We'll need to fix that, see the other discussion.
>
> Yeah, I think I found a nicer way to do it in v6.
>
> Thanks,
>    Danny

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-12-11  2:46 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-12-08  3:20 [PATCH v5] sun4i-codec: add inputs Danny Milosavljevic
2015-12-08  3:20 ` Danny Milosavljevic
2015-12-10 17:54 ` Maxime Ripard
2015-12-10 17:54   ` Maxime Ripard
2015-12-10 20:52   ` Danny Milosavljevic
2015-12-10 20:52     ` Danny Milosavljevic
2015-12-11  2:45     ` Chen-Yu Tsai
2015-12-11  2:45       ` Chen-Yu Tsai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.