mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-27 17:18:59 +00:00
278 lines
8.4 KiB
Diff
278 lines
8.4 KiB
Diff
|
From df85dac9b4a0855ba40c14fdf7ba93b33fd1db35 Mon Sep 17 00:00:00 2001
|
||
|
From: paul-1 <6473457+paul-1@users.noreply.github.com>
|
||
|
Date: Fri, 2 Apr 2021 10:56:19 -0400
|
||
|
Subject: [PATCH] Update Allo Piano Dac Driver
|
||
|
|
||
|
Add unique names to the individual dac coded drivers
|
||
|
Remove some of the codec controls that are not used.
|
||
|
|
||
|
Signed-off-by: Paul Hermann <paul@picoreplayer.org>
|
||
|
|
||
|
# Conflicts:
|
||
|
# sound/soc/bcm/allo-piano-dac-plus.c
|
||
|
---
|
||
|
sound/soc/bcm/allo-piano-dac-plus.c | 152 +++++++++++++++++++++-------
|
||
|
1 file changed, 114 insertions(+), 38 deletions(-)
|
||
|
|
||
|
--- a/sound/soc/bcm/allo-piano-dac-plus.c
|
||
|
+++ b/sound/soc/bcm/allo-piano-dac-plus.c
|
||
|
@@ -2,7 +2,8 @@
|
||
|
* ALSA ASoC Machine Driver for Allo Piano DAC Plus Subwoofer
|
||
|
*
|
||
|
* Author: Baswaraj K <jaikumar@cem-solutions.net>
|
||
|
- * Copyright 2016
|
||
|
+ * Copyright 2020
|
||
|
+ * based on code by David Knell <david.knell@gmail.com)
|
||
|
* based on code by Daniel Matuschek <info@crazy-audio.com>
|
||
|
* based on code by Florian Meier <florian.meier@koalo.de>
|
||
|
*
|
||
|
@@ -276,8 +277,15 @@ static int snd_allo_piano_dual_mode_put(
|
||
|
PCM512x_DIGITAL_VOLUME_2, 0xff);
|
||
|
|
||
|
list_for_each_entry(kctl, &snd_card_ptr->controls, list) {
|
||
|
- if (!strncmp(kctl->id.name, "Digital Playback Volume",
|
||
|
- sizeof(kctl->id.name))) {
|
||
|
+ if (!strncmp(kctl->id.name, "Main Digital Playback Volume",
|
||
|
+ sizeof(kctl->id.name))) {
|
||
|
+ mc = (struct soc_mixer_control *)
|
||
|
+ kctl->private_value;
|
||
|
+ mc->rreg = mc->reg;
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ if (!strncmp(kctl->id.name, "Sub Digital Playback Volume",
|
||
|
+ sizeof(kctl->id.name))) {
|
||
|
mc = (struct soc_mixer_control *)
|
||
|
kctl->private_value;
|
||
|
mc->rreg = mc->reg;
|
||
|
@@ -291,13 +299,20 @@ static int snd_allo_piano_dual_mode_put(
|
||
|
PCM512x_DIGITAL_VOLUME_3);
|
||
|
|
||
|
list_for_each_entry(kctl, &snd_card_ptr->controls, list) {
|
||
|
- if (!strncmp(kctl->id.name, "Digital Playback Volume",
|
||
|
- sizeof(kctl->id.name))) {
|
||
|
+ if (!strncmp(kctl->id.name, "Main Digital Playback Volume",
|
||
|
+ sizeof(kctl->id.name))) {
|
||
|
mc = (struct soc_mixer_control *)
|
||
|
kctl->private_value;
|
||
|
mc->rreg = PCM512x_DIGITAL_VOLUME_3;
|
||
|
break;
|
||
|
}
|
||
|
+ if (!strncmp(kctl->id.name, "Sub Digital Playback Volume",
|
||
|
+ sizeof(kctl->id.name))) {
|
||
|
+ mc = (struct soc_mixer_control *)
|
||
|
+ kctl->private_value;
|
||
|
+ mc->rreg = PCM512x_DIGITAL_VOLUME_2;
|
||
|
+ break;
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
snd_soc_component_write(asoc_rtd_to_codec(rtd, 0)->component,
|
||
|
@@ -344,13 +359,20 @@ static int snd_allo_piano_mode_put(struc
|
||
|
PCM512x_DIGITAL_VOLUME_2);
|
||
|
|
||
|
list_for_each_entry(kctl, &snd_card_ptr->controls, list) {
|
||
|
- if (!strncmp(kctl->id.name, "Digital Playback Volume",
|
||
|
- sizeof(kctl->id.name))) {
|
||
|
+ if (!strncmp(kctl->id.name, "Main Digital Playback Volume",
|
||
|
+ sizeof(kctl->id.name))) {
|
||
|
mc = (struct soc_mixer_control *)
|
||
|
kctl->private_value;
|
||
|
mc->rreg = PCM512x_DIGITAL_VOLUME_3;
|
||
|
break;
|
||
|
}
|
||
|
+ if (!strncmp(kctl->id.name, "Sub Digital Playback Volume",
|
||
|
+ sizeof(kctl->id.name))) {
|
||
|
+ mc = (struct soc_mixer_control *)
|
||
|
+ kctl->private_value;
|
||
|
+ mc->rreg = PCM512x_DIGITAL_VOLUME_2;
|
||
|
+ break;
|
||
|
+ }
|
||
|
}
|
||
|
snd_soc_component_write(asoc_rtd_to_codec(rtd, 0)->component,
|
||
|
PCM512x_DIGITAL_VOLUME_3, left_val);
|
||
|
@@ -397,6 +419,7 @@ static int pcm512x_get_reg_sub(struct sn
|
||
|
unsigned int left_val = 0;
|
||
|
unsigned int right_val = 0;
|
||
|
rtd = snd_soc_get_pcm_runtime(card, &card->dai_link[0]);
|
||
|
+
|
||
|
right_val = snd_soc_component_read(asoc_rtd_to_codec(rtd, 1)->component,
|
||
|
PCM512x_DIGITAL_VOLUME_3);
|
||
|
if (glb_ptr->dual_mode != 1) {
|
||
|
@@ -428,12 +451,6 @@ static int pcm512x_set_reg_sub(struct sn
|
||
|
int ret = 0;
|
||
|
|
||
|
rtd = snd_soc_get_pcm_runtime(card, &card->dai_link[0]);
|
||
|
- if (glb_ptr->dual_mode != 1) {
|
||
|
- ret = snd_soc_component_write(asoc_rtd_to_codec(rtd, 1)->component,
|
||
|
- PCM512x_DIGITAL_VOLUME_2, (~left_val));
|
||
|
- if (ret < 0)
|
||
|
- return ret;
|
||
|
- }
|
||
|
|
||
|
if (digital_gain_0db_limit) {
|
||
|
ret = snd_soc_limit_volume(card, "Subwoofer Playback Volume",
|
||
|
@@ -443,10 +460,20 @@ static int pcm512x_set_reg_sub(struct sn
|
||
|
ret);
|
||
|
}
|
||
|
|
||
|
- ret = snd_soc_component_write(asoc_rtd_to_codec(rtd, 1)->component,
|
||
|
- PCM512x_DIGITAL_VOLUME_3, (~right_val));
|
||
|
- if (ret < 0)
|
||
|
- return ret;
|
||
|
+ // When in Dual Mono, Sub vol control should not set anything.
|
||
|
+ if (glb_ptr->dual_mode != 1) { //Not in Dual Mono mode
|
||
|
+
|
||
|
+ ret = snd_soc_component_write(asoc_rtd_to_codec(rtd, 1)->component,
|
||
|
+ PCM512x_DIGITAL_VOLUME_2, (~left_val));
|
||
|
+ if (ret < 0)
|
||
|
+ return ret;
|
||
|
+
|
||
|
+ ret = snd_soc_component_write(asoc_rtd_to_codec(rtd, 1)->component,
|
||
|
+ PCM512x_DIGITAL_VOLUME_3, (~right_val));
|
||
|
+ if (ret < 0)
|
||
|
+ return ret;
|
||
|
+
|
||
|
+ }
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
@@ -505,7 +532,7 @@ static int pcm512x_get_reg_master(struct
|
||
|
left_val = snd_soc_component_read(asoc_rtd_to_codec(rtd, 0)->component,
|
||
|
PCM512x_DIGITAL_VOLUME_2);
|
||
|
|
||
|
- if (glb_ptr->dual_mode == 1) {
|
||
|
+ if (glb_ptr->dual_mode == 1) { // in Dual Mono mode
|
||
|
right_val = snd_soc_component_read(asoc_rtd_to_codec(rtd, 1)->component,
|
||
|
PCM512x_DIGITAL_VOLUME_3);
|
||
|
} else {
|
||
|
@@ -543,8 +570,21 @@ static int pcm512x_set_reg_master(struct
|
||
|
ret);
|
||
|
}
|
||
|
|
||
|
- if (glb_ptr->dual_mode != 1) {
|
||
|
+ if (glb_ptr->dual_mode == 1) { //in Dual Mono Mode
|
||
|
+
|
||
|
+ ret = snd_soc_component_write(asoc_rtd_to_codec(rtd, 0)->component,
|
||
|
+ PCM512x_DIGITAL_VOLUME_2, (~left_val));
|
||
|
+ if (ret < 0)
|
||
|
+ return ret;
|
||
|
+
|
||
|
ret = snd_soc_component_write(asoc_rtd_to_codec(rtd, 1)->component,
|
||
|
+ PCM512x_DIGITAL_VOLUME_3, (~right_val));
|
||
|
+ if (ret < 0)
|
||
|
+ return ret;
|
||
|
+
|
||
|
+ } else {
|
||
|
+
|
||
|
+ ret = snd_soc_component_write(asoc_rtd_to_codec(rtd, 0)->component,
|
||
|
PCM512x_DIGITAL_VOLUME_2, (~left_val));
|
||
|
if (ret < 0)
|
||
|
return ret;
|
||
|
@@ -555,16 +595,6 @@ static int pcm512x_set_reg_master(struct
|
||
|
return ret;
|
||
|
|
||
|
}
|
||
|
-
|
||
|
- ret = snd_soc_component_write(asoc_rtd_to_codec(rtd, 1)->component,
|
||
|
- PCM512x_DIGITAL_VOLUME_3, (~right_val));
|
||
|
- if (ret < 0)
|
||
|
- return ret;
|
||
|
-
|
||
|
- ret = snd_soc_component_write(asoc_rtd_to_codec(rtd, 0)->component,
|
||
|
- PCM512x_DIGITAL_VOLUME_2, (~left_val));
|
||
|
- if (ret < 0)
|
||
|
- return ret;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
@@ -680,10 +710,32 @@ static const struct snd_kcontrol_new all
|
||
|
pcm512x_set_reg_master_switch),
|
||
|
};
|
||
|
|
||
|
+static const char * const codec_ctl_pfx[] = { "Main", "Sub" };
|
||
|
+static const char * const codec_ctl_name[] = {
|
||
|
+ "Digital Playback Volume",
|
||
|
+ "Digital Playback Switch",
|
||
|
+ "Auto Mute Mono Switch",
|
||
|
+ "Auto Mute Switch",
|
||
|
+ "Auto Mute Time Left",
|
||
|
+ "Auto Mute Time Right",
|
||
|
+ "Clock Missing Period",
|
||
|
+ "Max Overclock DAC",
|
||
|
+ "Max Overclock DSP",
|
||
|
+ "Max Overclock PLL",
|
||
|
+ "Volume Ramp Down Emergency Rate",
|
||
|
+ "Volume Ramp Down Emergency Step",
|
||
|
+ "Volume Ramp Up Rate",
|
||
|
+ "Volume Ramp Down Rate",
|
||
|
+ "Volume Ramp Up Step",
|
||
|
+ "Volume Ramp Down Step"
|
||
|
+};
|
||
|
+
|
||
|
static int snd_allo_piano_dac_init(struct snd_soc_pcm_runtime *rtd)
|
||
|
{
|
||
|
struct snd_soc_card *card = rtd->card;
|
||
|
struct glb_pool *glb_ptr;
|
||
|
+ struct snd_kcontrol *kctl;
|
||
|
+ int i, j;
|
||
|
|
||
|
glb_ptr = kzalloc(sizeof(struct glb_pool), GFP_KERNEL);
|
||
|
if (!glb_ptr)
|
||
|
@@ -698,12 +750,36 @@ static int snd_allo_piano_dac_init(struc
|
||
|
if (digital_gain_0db_limit) {
|
||
|
int ret;
|
||
|
|
||
|
- ret = snd_soc_limit_volume(card, "Digital Playback Volume",
|
||
|
- 207);
|
||
|
- if (ret < 0)
|
||
|
- dev_warn(card->dev, "Failed to set volume limit: %d\n",
|
||
|
- ret);
|
||
|
+ //Set volume limit on both dacs
|
||
|
+ for (i = 0; i < ARRAY_SIZE(codec_ctl_pfx); i++) {
|
||
|
+ char cname[256];
|
||
|
+
|
||
|
+ sprintf(cname, "%s %s", codec_ctl_pfx[i], codec_ctl_name[0]);
|
||
|
+ ret = snd_soc_limit_volume(card, cname, 207);
|
||
|
+ if (ret < 0)
|
||
|
+ dev_warn(card->dev, "Failed to set volume limit: %d\n",
|
||
|
+ ret);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ // Remove codec controls
|
||
|
+ for (i = 0; i < ARRAY_SIZE(codec_ctl_pfx); i++) {
|
||
|
+ for (j = 0; j < ARRAY_SIZE(codec_ctl_name); j++) {
|
||
|
+ char cname[256];
|
||
|
+
|
||
|
+ sprintf(cname, "%s %s", codec_ctl_pfx[i], codec_ctl_name[j]);
|
||
|
+ kctl = snd_soc_card_get_kcontrol(card, cname);
|
||
|
+ if (!kctl) {
|
||
|
+ dev_err(rtd->card->dev, "Control %s not found\n",
|
||
|
+ cname);
|
||
|
+ } else {
|
||
|
+ kctl->vd[0].access =
|
||
|
+ SNDRV_CTL_ELEM_ACCESS_READWRITE;
|
||
|
+ snd_ctl_remove(card->snd_card, kctl);
|
||
|
+ }
|
||
|
+ }
|
||
|
}
|
||
|
+
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
@@ -842,10 +918,10 @@ static struct snd_soc_dai_link_component
|
||
|
};
|
||
|
|
||
|
SND_SOC_DAILINK_DEFS(allo_piano_dai_plus,
|
||
|
- DAILINK_COMP_ARRAY(COMP_CPU("bcm2708-i2s.0")),
|
||
|
- DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "pcm512x-hifi"),
|
||
|
- COMP_CODEC(NULL, "pcm512x-hifi")),
|
||
|
- DAILINK_COMP_ARRAY(COMP_PLATFORM("bcm2708-i2s.0")));
|
||
|
+ DAILINK_COMP_ARRAY(COMP_EMPTY()),
|
||
|
+ DAILINK_COMP_ARRAY(COMP_CODEC("pcm512x.1-004c", "pcm512x-hifi"),
|
||
|
+ COMP_CODEC("pcm512x.1-004d", "pcm512x-hifi")),
|
||
|
+ DAILINK_COMP_ARRAY(COMP_EMPTY()));
|
||
|
|
||
|
static struct snd_soc_dai_link snd_allo_piano_dac_dai[] = {
|
||
|
{
|