From patchwork Sun Aug 3 19:36:58 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: thomas schorpp X-Patchwork-Id: 4666141 Return-Path: X-Original-To: patchwork-alsa-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id CC9F2C0338 for ; Sun, 3 Aug 2014 19:37:28 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id BAFE4201C7 for ; Sun, 3 Aug 2014 19:37:27 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.kernel.org (Postfix) with ESMTP id 34195201BF for ; Sun, 3 Aug 2014 19:37:26 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id 79DC8265300; Sun, 3 Aug 2014 21:37:23 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=no version=3.3.1 Received: from alsa0.perex.cz (localhost [IPv6:::1]) by alsa0.perex.cz (Postfix) with ESMTP id C42642652E2; Sun, 3 Aug 2014 21:37:12 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 349912652E3; Sun, 3 Aug 2014 21:37:11 +0200 (CEST) Received: from mail-vc0-f181.google.com (mail-vc0-f181.google.com [209.85.220.181]) by alsa0.perex.cz (Postfix) with ESMTP id B31522652DB for ; Sun, 3 Aug 2014 21:37:03 +0200 (CEST) Received: by mail-vc0-f181.google.com with SMTP id lf12so9608633vcb.26 for ; Sun, 03 Aug 2014 12:37:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:reply-to:user-agent:mime-version:to:cc:subject :content-type:content-transfer-encoding; bh=ilyCjSi8yu9UFvKUeag0yeYa9riXkGn+BO8ewfveI9M=; b=jy8ZmVzm6joxsTBCpQqEoT8yqwb9HuX2pwJkoJ9obiQcGgPvipnLCvfcrEIrk+sZr0 RfJEUAP954hHaRgt7Ztck1RnMIqrT4Hc5NuTTlCj+JyxLkk/34TZLh+lHEZ9utvFMkML sq+TRUnp7BNRcaC4q/shI8auj/mtzpwbbD4PR0JL8KXlbT4jybpk4iKHQxSYHV03REqE FhZBHnWU+gaGxEYELMI7uD4DkZz52fCCWUPYBNa4s/KzagJQJTiS3uRBJ6lX0wHcearA +gmZHRWV/EgMd8NpscLWJ6b4ST40ttfK0En63cqIMIw0VjM2g+/k3ItA8f6bh5qMgWbf Rprw== X-Received: by 10.52.52.136 with SMTP id t8mr16537228vdo.21.1407094622204; Sun, 03 Aug 2014 12:37:02 -0700 (PDT) Received: from [192.168.0.105] (HSI-KBW-109-192-117-071.hsi6.kabel-badenwuerttemberg.de. [109.192.117.71]) by mx.google.com with ESMTPSA id kq8sm11175394veb.11.2014.08.03.12.37.00 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 03 Aug 2014 12:37:01 -0700 (PDT) Message-ID: <53DE8F5A.7030605@gmail.com> Date: Sun, 03 Aug 2014 21:36:58 +0200 From: thomas schorpp User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.0 MIME-Version: 1.0 To: linux-sunxi@googlegroups.com Cc: alsa-devel@alsa-project.org Subject: [alsa-devel] [PATCH] ARM: sun7i: Fix HDMI Audio driver's Alsa interface and do 8CH IEC60958 output X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: thomas.schorpp@gmail.com List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP Version 0.2 -Fix PCM Name -Free up to 8 dma buffers -Alsa driver frontend incomplete? FIXME speaker-test -c8 succeds with output of 6ch, sides are dead and channels are mismapped by center=RL, LFE=RR on my (half broken) receiver in MCH PCM mode. speaker-test -c6 fails with tone frequency doubled, don't use, You may kill your tweeters or amps with up to 40Khz input. Try setup with a respective asound.conf and load an alsa-card module with the correct parameters in Pulseaudio par config file, see ALSA and Pulseaudio docs for more information, suggest the known channel remapping configs for CM106 7.1 chip headsets as example. Signed-off-by: thomas.schorpp@gmail.com ----------- https://github.com/linux-sunxi/linux-sunxi * stage/sunxi-3.4 diff --git a/drivers/video/sunxi/hdmi/drv_hdmi.c b/drivers/video/sunxi/hdmi/drv_hdmi.c index 283d2ae..9cf2cc2 100644 --- a/drivers/video/sunxi/hdmi/drv_hdmi.c +++ b/drivers/video/sunxi/hdmi/drv_hdmi.c @@ -314,7 +314,7 @@ __s32 Hdmi_init(struct platform_device *dev) if (err) return err; - audio_info.channel_num = 2; + audio_info.channel_num = 8; #if 0 { /* for audio test */ hdmi_audio_t audio_para; diff --git a/sound/soc/sunxi/hdmiaudio/sndhdmi.c b/sound/soc/sunxi/hdmiaudio/sndhdmi.c index 1c306d2..4563010 100644 --- a/sound/soc/sunxi/hdmiaudio/sndhdmi.c +++ b/sound/soc/sunxi/hdmiaudio/sndhdmi.c @@ -85,7 +85,9 @@ static int sndhdmi_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - if (4 == hdmi_para.channel_num) + if (2 < hdmi_para.channel_num) + hdmi_para.channel_num = 8; + if (2 > hdmi_para.channel_num) hdmi_para.channel_num = 2; g_hdmi_func.hdmi_set_audio_para(&hdmi_para); @@ -129,11 +131,11 @@ struct snd_soc_dai_ops sndhdmi_dai_ops = { /* codec dai */ struct snd_soc_dai_driver sndhdmi_dai = { .name = "sndhdmi", - /* playback capabilities */ + /* playback capabilities, hdmi_core::audio_config() claims 8ch cap */ .playback = { .stream_name = "Playback", - .channels_min = 1, - .channels_max = 2, + .channels_min = 2, + .channels_max = 8, .rates = SNDHDMI_RATES, .formats = SNDHDMI_FORMATS, }, diff --git a/sound/soc/sunxi/hdmiaudio/sunxi-hdmiaudio.c b/sound/soc/sunxi/hdmiaudio/sunxi-hdmiaudio.c index 12da1a6..80dd3b9 100644 --- a/sound/soc/sunxi/hdmiaudio/sunxi-hdmiaudio.c +++ b/sound/soc/sunxi/hdmiaudio/sunxi-hdmiaudio.c @@ -34,8 +34,8 @@ #include #include -static struct sunxi_dma_params sunxi_hdmiaudio_pcm_stereo_out = { - .client.name = "HDMIAUDIO PCM Stereo out", +static struct sunxi_dma_params sunxi_hdmiaudio_pcm_iec60958_out = { + .client.name = "HDMIAUDIO PCM IEC60958 out", #if defined CONFIG_ARCH_SUN4I || defined CONFIG_ARCH_SUN5I .channel = DMACH_HDMIAUDIO, #endif @@ -67,7 +67,7 @@ static int sunxi_hdmiaudio_hw_params(struct snd_pcm_substream *substream, rtd = substream->private_data; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dma_data = &sunxi_hdmiaudio_pcm_stereo_out; + dma_data = &sunxi_hdmiaudio_pcm_iec60958_out; else printk("error:hdmiaudio can't support capture:%s,line:%d\n", __func__, __LINE__); @@ -182,8 +182,8 @@ static struct snd_soc_dai_driver sunxi_hdmiaudio_dai = { .resume = sunxi_hdmiaudio_resume, .remove = sunxi_hdmiaudio_dai_remove, .playback = { - .channels_min = 1, - .channels_max = 2, + .channels_min = 2, + .channels_max = 8, .rates = SUNXI_HDMI_RATES, .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE, }, diff --git a/sound/soc/sunxi/hdmiaudio/sunxi-hdmipcm.c b/sound/soc/sunxi/hdmiaudio/sunxi-hdmipcm.c index 4916b51..3266061 100644 --- a/sound/soc/sunxi/hdmiaudio/sunxi-hdmipcm.c +++ b/sound/soc/sunxi/hdmiaudio/sunxi-hdmipcm.c @@ -45,8 +45,8 @@ static const struct snd_pcm_hardware sunxi_pcm_hardware = { SNDRV_PCM_RATE_KNOT, .rate_min = 8000, .rate_max = 192000, - .channels_min = 1, - .channels_max = 2, + .channels_min = 2, + .channels_max = 8, .buffer_bytes_max = 128*1024, /* value must be (2^n)Kbyte size */ .period_bytes_min = 1024*4, .period_bytes_max = 1024*32, @@ -347,7 +347,7 @@ static void sunxi_pcm_free_dma_buffers(struct snd_pcm *pcm) struct snd_dma_buffer *buf; struct snd_pcm_substream *substream; - for (stream = 0; stream < 2; stream++) { + for (stream = 0; stream < 8; stream++) { substream = pcm->streams[stream].substream; if (!substream) continue; @@ -375,6 +375,8 @@ static int sunxi_pcm_new(struct snd_soc_pcm_runtime *rtd) if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = 0xffffffff; + strcpy(rtd->pcm->name, "sunxi HDMI PCM"); + if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) { ret = sunxi_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_PLAYBACK);