build/patch/kernel/sun8i-default/02-0015-openelec-audio-and-video-fixes.patch
2016-06-20 20:53:24 +02:00

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 = {