mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-22 23:01:56 +00:00
357 lines
10 KiB
Diff
357 lines
10 KiB
Diff
diff -Nur a/sound/soc/sunxi/audiocodec/sun8iw7_sndcodec.c b/sound/soc/sunxi/audiocodec/sun8iw7_sndcodec.c
|
|
--- a/sound/soc/sunxi/audiocodec/sun8iw7_sndcodec.c 2016-04-24 18:52:22.000000000 +0200
|
|
+++ b/sound/soc/sunxi/audiocodec/sun8iw7_sndcodec.c 2016-05-12 18:28:34.295125768 +0200
|
|
@@ -627,6 +627,10 @@
|
|
/*enable dac digital*/
|
|
codec_wr_control(SUNXI_DAC_DPC, 0x1, DAC_EN, 0x1);
|
|
codec_wr_prcm_control(LINEOUT_PA_GAT, 0x1, PA_CLK_GC, 0x0);
|
|
+
|
|
+ /* This is workaround for loud poping anytime sound is opened */
|
|
+ codec_wr_prcm_control(ROMIXSC, 0x1, RMIXMUTEDACR, 0);
|
|
+ codec_wr_prcm_control(LOMIXSC, 0x1, LMIXMUTEDACL, 0);
|
|
|
|
/*set TX FIFO send drq level*/
|
|
codec_wr_control(SUNXI_DAC_FIFOC ,0x7f, TX_TRI_LEVEL, 0xf);
|
|
diff -Nur a/sound/soc/sunxi/audiohub/sun8iw7-hubaudio.c b/sound/soc/sunxi/audiohub/sun8iw7-hubaudio.c
|
|
--- a/sound/soc/sunxi/audiohub/sun8iw7-hubaudio.c 2016-04-24 18:52:22.000000000 +0200
|
|
+++ b/sound/soc/sunxi/audiohub/sun8iw7-hubaudio.c 2016-05-08 21:01:09.586643642 +0200
|
|
@@ -42,12 +42,10 @@
|
|
static hdmi_audio_t hdmi_para;
|
|
atomic_t pcm_count_num_muti;
|
|
static int sample_resolution = 0;
|
|
-static int hub_used = 0;
|
|
-static bool spdif_used = 0;
|
|
-static bool hdmi_used = 0;
|
|
-static bool hub_codec_en = true;
|
|
-static bool hub_hdmi_en = false;
|
|
-static bool hub_spdif_en = false;
|
|
+static int hub_used = 0;
|
|
+static bool spdif_used = 0;
|
|
+static bool hdmi_used = 0;
|
|
+static bool codec_used = 0;
|
|
static bool hdmiaudio_reset_en = false;
|
|
static struct sunxi_dma_params sunxi_daudio_pcm_stereo_out = {
|
|
.name = "daudio2_play",
|
|
@@ -75,17 +73,17 @@
|
|
case SNDRV_PCM_TRIGGER_RESUME:
|
|
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
|
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
|
- if (hub_codec_en) {
|
|
+ if (codec_used) {
|
|
#ifdef CONFIG_SND_SUN8IW7_SNDCODEC
|
|
audiocodec_hub_enable(1);
|
|
#endif
|
|
}
|
|
- if (hdmi_used && hub_hdmi_en){
|
|
+ if (hdmi_used){
|
|
#ifdef CONFIG_SND_SUN8IW7_HDMIPCM
|
|
tdm2_tx_enable(1, 1);
|
|
#endif
|
|
}
|
|
- if (spdif_used && hub_spdif_en) {
|
|
+ if (spdif_used) {
|
|
#ifdef CONFIG_SND_SUNXI_SOC_SPDIF
|
|
spdif_txctrl_enable(1, substream->runtime->channels, 1);
|
|
#endif
|
|
@@ -98,17 +96,17 @@
|
|
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
|
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
|
|
} else {
|
|
- if (hub_codec_en) {
|
|
+ if (codec_used) {
|
|
#ifdef CONFIG_SND_SUN8IW7_SNDCODEC
|
|
audiocodec_hub_enable(0);
|
|
#endif
|
|
}
|
|
- if (hdmi_used && hub_hdmi_en){
|
|
+ if (hdmi_used){
|
|
#ifdef CONFIG_SND_SUN8IW7_HDMIPCM
|
|
tdm2_tx_enable(0, 0);
|
|
#endif
|
|
}
|
|
- if (spdif_used && hub_spdif_en) {
|
|
+ if (spdif_used) {
|
|
#ifdef CONFIG_SND_SUNXI_SOC_SPDIF
|
|
spdif_txctrl_enable(0, substream->runtime->channels, 0);
|
|
#endif
|
|
@@ -127,7 +125,7 @@
|
|
{
|
|
u32 reg_val;
|
|
/* play or record */
|
|
- if (hdmi_used && hub_hdmi_en) {
|
|
+ if (hdmi_used) {
|
|
#ifdef CONFIG_SND_SUN8IW7_HDMIPCM
|
|
tdm2_prepare(substream);
|
|
#endif
|
|
@@ -191,7 +189,7 @@
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
- if (hdmi_used && hub_hdmi_en) {
|
|
+ if (hdmi_used) {
|
|
#ifdef CONFIG_SND_SUN8IW7_HDMIPCM
|
|
tdm2_hw_params(sample_resolution);
|
|
#endif
|
|
@@ -227,13 +225,13 @@
|
|
}
|
|
}
|
|
|
|
- if (spdif_used && hub_spdif_en) {
|
|
+ if (spdif_used) {
|
|
#ifdef CONFIG_SND_SUNXI_SOC_SPDIF
|
|
spdif_hw_params(sample_resolution);
|
|
#endif
|
|
}
|
|
|
|
- if (hub_hdmi_en) {
|
|
+ if (hdmi_used) {
|
|
/* play or record */
|
|
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
|
dma_data = &sunxi_daudio_pcm_stereo_out;
|
|
@@ -246,12 +244,12 @@
|
|
|
|
static int sunxi_audiohub_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
|
|
{
|
|
- if (hdmi_used && hub_hdmi_en) {
|
|
+ if (hdmi_used) {
|
|
#ifdef CONFIG_SND_SUN8IW7_HDMIPCM
|
|
tdm2_set_fmt(fmt);
|
|
#endif
|
|
}
|
|
- if (spdif_used && hub_spdif_en) {
|
|
+ if (spdif_used) {
|
|
#ifdef CONFIG_SND_SUNXI_SOC_SPDIF
|
|
spdif_set_fmt(0);
|
|
#endif
|
|
@@ -275,13 +273,13 @@
|
|
u32 spdif_mpll=0, spdif_bclk_div=0, spdif_mult_fs=0;
|
|
#endif
|
|
|
|
- if (hdmi_used && hub_hdmi_en) {
|
|
+ if (hdmi_used) {
|
|
#ifdef CONFIG_SND_SUN8IW7_HDMIPCM
|
|
tdm2_set_clkdiv(sample_rate);
|
|
#endif
|
|
}
|
|
|
|
- if (spdif_used && hub_spdif_en) {
|
|
+ if (spdif_used) {
|
|
#ifdef CONFIG_SND_SUNXI_SOC_SPDIF
|
|
get_clock_divder(sample_rate, 32, &spdif_mclk_div, &spdif_mpll, &spdif_bclk_div, &spdif_mult_fs);
|
|
spdif_set_clkdiv(SUNXI_DIV_MCLK, spdif_mclk_div);
|
|
@@ -321,7 +319,7 @@
|
|
struct snd_soc_dai *dai)
|
|
{
|
|
/*hdmi*/
|
|
- if (hdmi_used && hub_hdmi_en && g_hdmi_func.hdmi_audio_enable) {
|
|
+ if (hdmi_used && g_hdmi_func.hdmi_audio_enable) {
|
|
g_hdmi_func.hdmi_audio_enable(0, 1);
|
|
}
|
|
}
|
|
@@ -369,14 +367,23 @@
|
|
type = script_get_item("audiohub", "spdif_used", &val);
|
|
if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
|
|
pr_err("[audiohub] spdif_used type err!\n");
|
|
- }
|
|
- spdif_used = val.val;
|
|
+ spdif_used = 0;
|
|
+ } else
|
|
+ spdif_used = val.val;
|
|
|
|
type = script_get_item("audiohub", "hdmi_used", &val);
|
|
if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
|
|
pr_err("[audiohub] hdmi_used type err!\n");
|
|
- }
|
|
- hdmi_used = val.val;
|
|
+ hdmi_used = 0;
|
|
+ } else
|
|
+ hdmi_used = val.val;
|
|
+
|
|
+ type = script_get_item("audiohub", "codec_used", &val);
|
|
+ if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
|
|
+ pr_err("[audiohub] codec_used type err!\n");
|
|
+ codec_used = 0;
|
|
+ } else
|
|
+ codec_used = val.val;
|
|
|
|
ret = snd_soc_register_dais(&pdev->dev,sunxi_audiohub_dai, ARRAY_SIZE(sunxi_audiohub_dai));
|
|
if (ret) {
|
|
@@ -441,9 +448,6 @@
|
|
}
|
|
module_init(sunxi_audiohub_init);
|
|
|
|
-module_param_named(hub_codec_en, hub_codec_en, bool, S_IRUGO | S_IWUSR);
|
|
-module_param_named(hub_hdmi_en, hub_hdmi_en, bool, S_IRUGO | S_IWUSR);
|
|
-module_param_named(hub_spdif_en, hub_spdif_en, bool, S_IRUGO | S_IWUSR);
|
|
module_param_named(hdmiaudio_reset_en, hdmiaudio_reset_en, bool, S_IRUGO | S_IWUSR);
|
|
|
|
static void __exit sunxi_audiohub_exit(void)
|
|
diff -Nur a/drivers/char/sunxi-di/sunxi-di.c b/drivers/char/sunxi-di/sunxi-di.c
|
|
--- a/drivers/char/sunxi-di/sunxi-di.c 2016-04-12 12:21:19.000000000 +0200
|
|
+++ b/drivers/char/sunxi-di/sunxi-di.c 2016-05-06 20:14:28.846445168 +0200
|
|
@@ -137,7 +137,6 @@
|
|
printk(KERN_ERR "di_clk handle is invalid, just return!\n");
|
|
return;
|
|
} else {
|
|
- clk_disable_unprepare(di_clk);
|
|
clk_put(di_clk);
|
|
di_clk = NULL;
|
|
}
|
|
@@ -202,36 +201,72 @@
|
|
|
|
static void sunxi_di_params_exit(void)
|
|
{
|
|
- di_clk_uncfg();
|
|
- free_irq(SW_INT_IRQNO_DI, di_device);
|
|
- return ;
|
|
+ di_clk_uncfg();
|
|
+ free_irq(SW_INT_IRQNO_DI, di_device);
|
|
}
|
|
|
|
+static void sunxi_di_disabledrv(void)
|
|
+{
|
|
+ di_irq_enable(0);
|
|
+ di_reset();
|
|
+ di_internal_clk_disable();
|
|
+ di_clk_disable();
|
|
+ if (NULL != di_data.in_flag)
|
|
+ sunxi_buf_free(di_data.in_flag, di_data.in_flag_phy, di_data.flag_size);
|
|
+ if (NULL != di_data.out_flag)
|
|
+ sunxi_buf_free(di_data.out_flag, di_data.out_flag_phy, di_data.flag_size);
|
|
+}
|
|
+
|
|
+static int sunxi_di_enabledrv(void)
|
|
+{
|
|
+ int ret;
|
|
+
|
|
+ di_data.flag_size = (FLAG_WIDTH*FLAG_HIGH)/4;
|
|
+
|
|
+ di_data.in_flag = sunxi_buf_alloc(di_data.flag_size, &(di_data.in_flag_phy));
|
|
+ if (!di_data.in_flag) {
|
|
+ printk(KERN_ERR "%s: request in_flag mem failed\n", __func__);
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ di_data.out_flag = sunxi_buf_alloc(di_data.flag_size, &(di_data.out_flag_phy));
|
|
+ if (!di_data.out_flag) {
|
|
+ printk(KERN_ERR "%s: request out_flag mem failed\n", __func__);
|
|
+ sunxi_buf_free(di_data.in_flag, di_data.in_flag_phy, di_data.flag_size);
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ ret = di_clk_enable();
|
|
+ if (ret) {
|
|
+ printk(KERN_ERR "%s: enable clk failed.\n", __func__);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ di_internal_clk_enable();
|
|
+ di_set_init(di_data.mode);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
|
|
#ifdef CONFIG_PM
|
|
static int sunxi_di_suspend(struct device *dev)
|
|
{
|
|
- dprintk(DEBUG_SUSPEND, "enter: sunxi_di_suspend. \n");
|
|
+ dprintk(DEBUG_SUSPEND, "enter: sunxi_di_suspend. \n");
|
|
|
|
- if (atomic_read(&di_data.enable)) {
|
|
- di_irq_enable(0);
|
|
- di_reset();
|
|
- di_internal_clk_disable();
|
|
- di_clk_disable();
|
|
- if (NULL != di_data.in_flag)
|
|
- sunxi_buf_free(di_data.in_flag, di_data.in_flag_phy, di_data.flag_size);
|
|
- if (NULL != di_data.out_flag)
|
|
- sunxi_buf_free(di_data.out_flag, di_data.out_flag_phy, di_data.flag_size);
|
|
- }
|
|
+ if (atomic_read(&di_data.enable))
|
|
+ sunxi_di_disabledrv();
|
|
|
|
- return 0;
|
|
+ return 0;
|
|
}
|
|
|
|
static int sunxi_di_resume(struct device *dev)
|
|
{
|
|
- dprintk(DEBUG_SUSPEND, "enter: sunxi_di_resume. \n");
|
|
+ dprintk(DEBUG_SUSPEND, "enter: sunxi_di_resume. \n");
|
|
+
|
|
+ if (atomic_read(&di_data.enable))
|
|
+ return sunxi_di_enabledrv();
|
|
|
|
- return 0;
|
|
+ return 0;
|
|
}
|
|
#endif
|
|
|
|
@@ -315,54 +350,27 @@
|
|
|
|
static int sunxi_di_open(struct inode *inode, struct file *file)
|
|
{
|
|
- int ret = 0;
|
|
-
|
|
- dprintk(DEBUG_DATA_INFO, "%s: enter!!\n", __func__);
|
|
-
|
|
- atomic_set(&di_data.enable, 1);
|
|
-
|
|
- di_data.flag_size = (FLAG_WIDTH*FLAG_HIGH)/4;
|
|
+ int ret;
|
|
+ dprintk(DEBUG_DATA_INFO, "%s: enter!!\n", __func__);
|
|
|
|
- di_data.in_flag = sunxi_buf_alloc(di_data.flag_size, &(di_data.in_flag_phy));
|
|
- if (!(di_data.in_flag)) {
|
|
- printk(KERN_ERR "%s: request in_flag mem failed\n", __func__);
|
|
- return -1;
|
|
- }
|
|
-
|
|
- di_data.out_flag = sunxi_buf_alloc(di_data.flag_size, &(di_data.out_flag_phy));
|
|
- if (!(di_data.out_flag)) {
|
|
- printk(KERN_ERR "%s: request out_flag mem failed\n", __func__);
|
|
- sunxi_buf_free(di_data.in_flag, di_data.in_flag_phy, di_data.flag_size);
|
|
- return -1;
|
|
- }
|
|
+ //FIXME: This variable should be counter!
|
|
+ atomic_set(&di_data.enable, 1);
|
|
|
|
- ret = di_clk_enable();
|
|
- if (ret) {
|
|
- printk(KERN_ERR "%s: enable clk failed.\n", __func__);
|
|
- return ret;
|
|
- }
|
|
- di_internal_clk_enable();
|
|
- di_set_init(di_data.mode);
|
|
-
|
|
- return 0;
|
|
+ ret = sunxi_di_enabledrv();
|
|
+ if(ret)
|
|
+ return ret;
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
static int sunxi_di_release(struct inode *inode, struct file *file)
|
|
{
|
|
- dprintk(DEBUG_DATA_INFO, "%s: enter!!\n", __func__);
|
|
+ dprintk(DEBUG_DATA_INFO, "%s: enter!!\n", __func__);
|
|
|
|
- atomic_set(&di_data.enable, 0);
|
|
+ atomic_set(&di_data.enable, 0);
|
|
+ sunxi_di_disabledrv();
|
|
|
|
- di_irq_enable(0);
|
|
- di_reset();
|
|
- di_internal_clk_disable();
|
|
- di_clk_disable();
|
|
- if (NULL != di_data.in_flag)
|
|
- sunxi_buf_free(di_data.in_flag, di_data.in_flag_phy, di_data.flag_size);
|
|
- if (NULL != di_data.out_flag)
|
|
- sunxi_buf_free(di_data.out_flag, di_data.out_flag_phy, di_data.flag_size);
|
|
-
|
|
- return 0;
|
|
+ return 0;
|
|
}
|
|
|
|
static const struct file_operations sunxi_di_fops = {
|