ralink: fix alsa mic in support

Signed-off-by: John Crispin <blogic@openwrt.org>

git-svn-id: svn://svn.openwrt.org/openwrt/branches/chaos_calmer@48748 3c298f89-4303-0410-b956-a3cf2f4a3e73
master
John Crispin 2016-02-19 16:39:06 +00:00
parent 35a54abc53
commit 2b059d0313
1 changed files with 71 additions and 93 deletions

View File

@ -1,6 +1,6 @@
--- a/sound/soc/Kconfig
+++ b/sound/soc/Kconfig
@@ -56,6 +56,7 @@ source "sound/soc/spear/Kconfig"
@@ -56,6 +56,7 @@
source "sound/soc/tegra/Kconfig"
source "sound/soc/txx9/Kconfig"
source "sound/soc/ux500/Kconfig"
@ -10,14 +10,14 @@
source "sound/soc/codecs/Kconfig"
--- a/sound/soc/Makefile
+++ b/sound/soc/Makefile
@@ -33,3 +33,4 @@ obj-$(CONFIG_SND_SOC) += spear/
@@ -33,3 +33,4 @@
obj-$(CONFIG_SND_SOC) += tegra/
obj-$(CONFIG_SND_SOC) += txx9/
obj-$(CONFIG_SND_SOC) += ux500/
+obj-$(CONFIG_SND_SOC) += mtk/
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -725,7 +725,7 @@ config SND_SOC_WM8955
@@ -725,7 +725,7 @@
tristate
config SND_SOC_WM8960
@ -66,7 +66,7 @@
+
--- /dev/null
+++ b/sound/soc/mtk/Makefile
@@ -0,0 +1,39 @@
@@ -0,0 +1,40 @@
+KBUILD_CFLAGS += -I$(srctree)
+
+ifeq ($(CONFIG_SND_MT76XX_SOC_MT7620),y)
@ -84,7 +84,8 @@
+KBUILD_CFLAGS += -DCONFIG_GDMA_EVERYBODY
+KBUILD_CFLAGS += -DCONFIG_SND_MT76XX_SOC
+KBUILD_CFLAGS += -DCONFIG_I2S_WM8960
+KBUILD_CFLAGS += -DCONFIG_I2S_MCLK_12P288MHZ
+#KBUILD_CFLAGS += -DCONFIG_I2S_MCLK_12P288MHZ
+KBUILD_CFLAGS += -DCONFIG_I2S_MCLK_12MHZ
+KBUILD_CFLAGS += -DCONFIG_GDMA_EVERYBODY
+KBUILD_CFLAGS += -DSURFBOARDINT_DMA=15
+KBUILD_CFLAGS += -DRALINK_INTCTL_DMA=128
@ -7371,7 +7372,7 @@
+#endif
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -1851,7 +1851,8 @@ static int soc_probe(struct platform_dev
@@ -1851,7 +1851,8 @@
/* Bodge while we unpick instantiation */
card->dev = &pdev->dev;
@ -8084,15 +8085,7 @@
+}
--- a/sound/soc/codecs/wm8960.c
+++ b/sound/soc/codecs/wm8960.c
@@ -26,6 +26,7 @@
#include <sound/wm8960.h>
#include "wm8960.h"
+#include "../mtk/i2c_wm8960.h"
/* R25 - Power 1 */
#define WM8960_VMID_MASK 0x180
@@ -53,10 +54,10 @@
@@ -53,10 +53,10 @@
* using 2 wire for device control, so we cache them instead.
*/
static const struct reg_default wm8960_reg_defaults[] = {
@ -8107,7 +8100,7 @@
{ 0x4, 0x0000 },
{ 0x5, 0x0008 },
{ 0x6, 0x0000 },
@@ -88,8 +89,8 @@ static const struct reg_default wm8960_r
@@ -88,8 +88,8 @@
{ 0x25, 0x0050 },
{ 0x26, 0x0000 },
{ 0x27, 0x0000 },
@ -8118,24 +8111,17 @@
{ 0x2a, 0x0040 },
{ 0x2b, 0x0000 },
{ 0x2c, 0x0000 },
@@ -127,8 +128,15 @@ struct wm8960_priv {
@@ -126,8 +126,7 @@
bool deemph;
int playback_fs;
};
+#if 1
+#define wm8960_reset(c) do{ \
+ int i = 0;\
+ snd_soc_write(c, WM8960_RESET, 0);\
+ for(i = 0; i < 1000*HZ; i++);\
+ }while(0)
+#else
#define wm8960_reset(c) snd_soc_write(c, WM8960_RESET, 0)
-
+#endif
-#define wm8960_reset(c) snd_soc_write(c, WM8960_RESET, 0)
+static char init_mtk;
/* enumerated controls */
static const char *wm8960_polarity[] = {"No Inversion", "Left Inverted",
"Right Inverted", "Stereo Inversion"};
@@ -181,8 +189,8 @@ static int wm8960_get_deemph(struct snd_
@@ -181,8 +180,8 @@
struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
@ -8146,33 +8132,29 @@
}
static int wm8960_put_deemph(struct snd_kcontrol *kcontrol,
@@ -200,6 +208,70 @@ static int wm8960_put_deemph(struct snd_
@@ -200,6 +199,65 @@
return wm8960_set_deemph(codec);
}
+static int wm8960_preinit(struct snd_soc_codec *codec)
+static void wm8960_reset(struct snd_soc_codec *codec)
+{
+ //printk("****** %s ******\n", __func__);
+ snd_soc_write(codec, WM8960_RESET, 0);
+ mdelay(500);
+
+ return 0;
+ init_mtk = false;
+}
+
+static int wm8960_postinit(struct snd_soc_codec *codec)
+static int wm8960_init(struct snd_soc_codec *codec)
+{
+ u32 data;
+ //printk("****** %s ******\n", __func__);
+ // In
+ data = snd_soc_read(codec, WM8960_POWER1);
+ snd_soc_write(codec, WM8960_POWER1, data|WM8960_PWR1_ADCL|WM8960_PWR1_ADCR|WM8960_PWR1_AINL |WM8960_PWR1_AINR|WM8960_PWR1_MICB);//0x19
+ snd_soc_write(codec, WM8960_POWER1, data|WM8960_PWR1_ADCL|WM8960_PWR1_ADCR|WM8960_PWR1_AINL |WM8960_PWR1_AINR|WM8960_PWR1_MICB|WM8960_PWR1_VMIDSEL_5K|WM8960_PWR1_VREF);//0x19
+ data = snd_soc_read(codec, WM8960_ADDCTL1);
+ snd_soc_write(codec, WM8960_ADDCTL1, data|ADDITIONAL1_DATSEL(0x01));//0x17
+ snd_soc_write(codec, WM8960_LADC, LEFTGAIN_LDVU|LEFTGAIN_LDACVOL(0xc3));//0x15
+ snd_soc_write(codec, WM8960_RADC, LEFTGAIN_LDVU|LEFTGAIN_LDACVOL(0xc3));//0x16
+ snd_soc_write(codec, WM8960_LINPATH, 0x148);//0x20
+ snd_soc_write(codec, WM8960_RINPATH, 0x148);//0x21
+ snd_soc_write(codec, WM8960_POWER3, WM8960_PWR3_LMIC|WM8960_PWR3_RMIC);//0x2f
+ snd_soc_write(codec, WM8960_LADC, LEFTGAIN_LDVU|LEFTGAIN_LDACVOL(0xce));//0x15
+ snd_soc_write(codec, WM8960_RADC, LEFTGAIN_LDVU|LEFTGAIN_LDACVOL(0xce));//0x16
+ snd_soc_write(codec, WM8960_LINPATH, 0x168);//0x20
+ snd_soc_write(codec, WM8960_RINPATH, 0x168);//0x21
+ snd_soc_write(codec, WM8960_POWER3, WM8960_PWR3_LMIC|WM8960_PWR3_RMIC|WM8960_PWR3_ROMIX|WM8960_PWR3_LOMIX);//0x2f
+
+ // Out
+ data = snd_soc_read(codec, WM8960_POWER2);
@ -8184,23 +8166,22 @@
+ snd_soc_write(codec, WM8960_LOUTMIX, 0x100);//0x22
+ snd_soc_write(codec, WM8960_ROUTMIX, 0x100);//0x25
+
+ data = snd_soc_read(codec, WM8960_POWER3);
+ snd_soc_write(codec, WM8960_POWER3, data|WM8960_PWR3_ROMIX|WM8960_PWR3_LOMIX);//0x2f
+
+ snd_soc_write(codec, WM8960_CLASSD1, 0xf7);//0x31
+ snd_soc_write(codec, WM8960_CLASSD3, 0xad);//0x33
+ snd_soc_write(codec, WM8960_DACCTL1, 0x000);//0x05
+
+ data = snd_soc_read(codec, WM8960_POWER1);
+ snd_soc_write(codec, WM8960_POWER1, data|0x1c0);//0x19
+ snd_soc_write(codec, WM8960_LOUT1, LOUT1_LO1VU|LOUT1_LO1ZC|LOUT1_LOUT1VOL(120));//0x02
+ snd_soc_write(codec, WM8960_ROUT1, ROUT1_RO1VU|ROUT1_RO1ZC|ROUT1_ROUT1VOL(120));//0x03
+
+ data = snd_soc_read(codec, WM8960_LINVOL);
+ data &= ~LINV_LINMUTE;
+ snd_soc_write(codec, WM8960_LINVOL, data|LINV_IPVU|LINV_LINVOL(96));//LINV(0x00)
+
+ snd_soc_write(codec, WM8960_LOUT1, LOUT1_LO1VU|LOUT1_LO1ZC|LOUT1_LOUT1VOL(115));//0x02
+ snd_soc_write(codec, WM8960_ROUT1, ROUT1_RO1VU|ROUT1_RO1ZC|ROUT1_ROUT1VOL(115));//0x03
+
+ snd_soc_write(codec, WM8960_LINVOL, LINV_IPVU|LINV_LINVOL(110)); //LINV(0x00)=>0x12b
+ snd_soc_write(codec, WM8960_RINVOL, RINV_IPVU|RINV_RINVOL(110)); //LINV(0x01)=>0x12b
+ data = snd_soc_read(codec, WM8960_RINVOL);
+ data &= ~RINV_RINMUTE;
+ snd_soc_write(codec, WM8960_RINVOL, data|RINV_IPVU|RINV_RINVOL(96)); //LINV(0x01)
+
+ init_mtk = true;
+ return 0;
+}
+
@ -8217,15 +8198,17 @@
static const DECLARE_TLV_DB_SCALE(adc_tlv, -9700, 50, 0);
static const DECLARE_TLV_DB_SCALE(dac_tlv, -12700, 50, 1);
static const DECLARE_TLV_DB_SCALE(bypass_tlv, -2100, 300, 0);
@@ -542,6 +614,7 @@ static int wm8960_set_dai_fmt(struct snd
@@ -542,6 +600,9 @@
/* set iface */
snd_soc_write(codec, WM8960_IFACE1, iface);
+ wm8960_postinit(codec);
+ if (!init_mtk)
+ wm8960_init(codec);
+
return 0;
}
@@ -623,11 +696,16 @@ static int wm8960_set_bias_level_out3(st
@@ -623,11 +684,15 @@
break;
case SND_SOC_BIAS_PREPARE:
@ -8236,13 +8219,12 @@
break;
case SND_SOC_BIAS_STANDBY:
+#if 1
+ wm8960_preinit(codec);
+#else
+#if 0
+
if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) {
regcache_sync(wm8960->regmap);
@@ -650,9 +728,13 @@ static int wm8960_set_bias_level_out3(st
@@ -650,9 +715,13 @@
/* Set VMID to 2x250k */
snd_soc_update_bits(codec, WM8960_POWER1, 0x180, 0x100);
@ -8250,13 +8232,13 @@
break;
case SND_SOC_BIAS_OFF:
+#if 1
+#if 0
+ wm8960_close(codec);
+#else
+
/* Enable anti-pop features */
snd_soc_write(codec, WM8960_APOP1,
WM8960_POBCTRL | WM8960_SOFT_ST |
@@ -661,6 +743,7 @@ static int wm8960_set_bias_level_out3(st
@@ -661,6 +730,7 @@
/* Disable VMID and VREF, let them discharge */
snd_soc_write(codec, WM8960_POWER1, 0);
msleep(600);
@ -8264,36 +8246,15 @@
break;
}
@@ -853,10 +936,15 @@ static int wm8960_set_dai_pll(struct snd
@@ -853,7 +923,6 @@
if (pll_div.k) {
reg |= 0x20;
-
+#if 1
snd_soc_write(codec, WM8960_PLL2, (pll_div.k >> 16) & 0xff);
snd_soc_write(codec, WM8960_PLL3, (pll_div.k >> 8) & 0xff);
snd_soc_write(codec, WM8960_PLL4, pll_div.k & 0xff);
+#else
+ snd_soc_write(codec, WM8960_PLL2, (pll_div.k >> 16) & 0xff);
+ snd_soc_write(codec, WM8960_PLL3, (pll_div.k >> 8) & 0xff);
+ snd_soc_write(codec, WM8960_PLL4, pll_div.k & 0xff);
+#endif
}
snd_soc_write(codec, WM8960_PLL1, reg);
@@ -888,7 +976,11 @@ static int wm8960_set_dai_clkdiv(struct
snd_soc_write(codec, WM8960_PLL1, reg | div);
break;
case WM8960_DCLKDIV:
+#if 1
reg = snd_soc_read(codec, WM8960_CLOCK2) & 0x03f;
+#else
+ reg = snd_soc_read(codec, WM8960_CLOCK2) & 0x03f;
+#endif
snd_soc_write(codec, WM8960_CLOCK2, reg | div);
break;
case WM8960_TOCLKSEL:
@@ -962,7 +1054,7 @@ static int wm8960_probe(struct snd_soc_c
@@ -962,7 +1031,7 @@
{
struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
struct wm8960_data *pdata = dev_get_platdata(codec->dev);
@ -8302,7 +8263,7 @@
wm8960->set_bias_level = wm8960_set_bias_level_out3;
@@ -973,11 +1065,7 @@ static int wm8960_probe(struct snd_soc_c
@@ -973,26 +1042,9 @@
wm8960->set_bias_level = wm8960_set_bias_level_capless;
}
@ -8311,10 +8272,27 @@
- dev_err(codec->dev, "Failed to issue reset\n");
- return ret;
- }
-
- wm8960->set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
- /* Latch the update bits */
- snd_soc_update_bits(codec, WM8960_LINVOL, 0x100, 0x100);
- snd_soc_update_bits(codec, WM8960_RINVOL, 0x100, 0x100);
- snd_soc_update_bits(codec, WM8960_LADC, 0x100, 0x100);
- snd_soc_update_bits(codec, WM8960_RADC, 0x100, 0x100);
- snd_soc_update_bits(codec, WM8960_LDAC, 0x100, 0x100);
- snd_soc_update_bits(codec, WM8960_RDAC, 0x100, 0x100);
- snd_soc_update_bits(codec, WM8960_LOUT1, 0x100, 0x100);
- snd_soc_update_bits(codec, WM8960_ROUT1, 0x100, 0x100);
- snd_soc_update_bits(codec, WM8960_LOUT2, 0x100, 0x100);
- snd_soc_update_bits(codec, WM8960_ROUT2, 0x100, 0x100);
-
+ wm8960_reset(codec);
wm8960->set_bias_level(codec, SND_SOC_BIAS_STANDBY);
+ //mdelay(400);
+
snd_soc_add_codec_controls(codec, wm8960_snd_controls,
ARRAY_SIZE(wm8960_snd_controls));
wm8960_add_widgets(codec);
--- a/sound/soc/codecs/wm8960.h
+++ b/sound/soc/codecs/wm8960.h
@@ -110,4 +110,68 @@
@ -8384,5 +8362,5 @@
+#define RINV_RINMUTE (1 << 7)
+#define RINV_RIZC (1 << 6)
+#define RINV_RINVOL(x) ((x) & 0x3f)
+
+#define MBSEL (1 << 0)
#endif