From patchwork Sat Jun 4 23:47:20 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ezequiel Garcia X-Patchwork-Id: 9155015 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id C1F5760866 for ; Sat, 4 Jun 2016 23:47:59 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B1A8C281FE for ; Sat, 4 Jun 2016 23:47:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A69D82824A; Sat, 4 Jun 2016 23:47:59 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D8DD928327 for ; Sat, 4 Jun 2016 23:47:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751102AbcFDXrz (ORCPT ); Sat, 4 Jun 2016 19:47:55 -0400 Received: from mail-qk0-f177.google.com ([209.85.220.177]:35099 "EHLO mail-qk0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751365AbcFDXrr (ORCPT ); Sat, 4 Jun 2016 19:47:47 -0400 Received: by mail-qk0-f177.google.com with SMTP id p22so10179343qka.2 for ; Sat, 04 Jun 2016 16:47:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vanguardiasur-com-ar.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ScBTZdIcAIxxM71vP2VutqyFEDm+WFimPB8WFk/MYB4=; b=WQg+4AT80hELKacQuLzZ81dJMdX1/ttDGLBYdqEr2CCTEOhgYL3ozadz6IplCsXvhO Im+4uQVj6ep6g/H+3hlcS5l2ApsCtAWIM8j388+36BzIIHv1by1WYrAM1CJmJTuoHERv yqT2ZPy9HVnlLYzwWPauB8yfD8SPx5ZsRd/gwRRmlwacjD3IVfNv3r8Y1O1pu0mOXlOy Bw8jlRbDzD9R5auONkHFX2Ww93LNWF36orfWnyANZ/CezFCg0DngbCKyobm8T8N1KMB6 XdLLMi0qSlja83Sz/Dta1pMUoMeoAaeK/LIO2QsKcpA+FUGb4jrKkdLd4gDBFQNKTKaL webw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ScBTZdIcAIxxM71vP2VutqyFEDm+WFimPB8WFk/MYB4=; b=Zn0Bbibs3+uccy5b9Q57wxMEXC04aDEt386v+jkYJBmh0ykcxRpmYqTVn6qLkgtTVc 1k1x4du0rPYd4Zn1srEqRRImGR/5xCm2di7dCx/79LVrdef25gwaQdtjuer9XzS6bUjY dodk5C4FavLqP+3VkISa4ErvsjY9TEmdTDhIM+7F4caFN5+XfErGEWs8Wydhj0s3b00J xdMTGBbp8jCiuMaQ7gWS8MQkcp08fGQCoftDsxoT7LoSTM9zhIxMF6LKzSw9nGRYwN75 Ss6p4STkuMHV6a3zowunAwatNlJ+OBK6A/NQzMKSqGxOwWsnluppCrIf7wlK/ZMEBPmC 3lBg== X-Gm-Message-State: ALyK8tIdduMYnLLnonyeCcwZivm9TzWPg0OhTHXrcBNbQinsogdq4KzQxwY2N6rI3OnTZg== X-Received: by 10.55.125.7 with SMTP id y7mr9933204qkc.46.1465084066584; Sat, 04 Jun 2016 16:47:46 -0700 (PDT) Received: from localhost.localdomain ([190.2.108.156]) by smtp.gmail.com with ESMTPSA id i34sm3022786qgd.2.2016.06.04.16.47.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 04 Jun 2016 16:47:45 -0700 (PDT) From: Ezequiel Garcia To: Cc: Hans Verkuil , Ezequiel Garcia Subject: [RESEND/PATCH 6/6] tw686x: audio: Prevent hw param changes while busy Date: Sat, 4 Jun 2016 20:47:20 -0300 Message-Id: <1465084040-6112-7-git-send-email-ezequiel@vanguardiasur.com.ar> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1465084040-6112-1-git-send-email-ezequiel@vanguardiasur.com.ar> References: <1465084040-6112-1-git-send-email-ezequiel@vanguardiasur.com.ar> Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Audio hw params are shared across all DMA channels, so if the user changes any of these while any DMA channel is enabled, it will impact the enabled channels, potentially causing serious instability issues. This commit avoids such situation, by preventing any hw param change (on any DMA channel) if any other DMA audio channel is capturing. Signed-off-by: Ezequiel Garcia --- drivers/media/pci/tw686x/tw686x-audio.c | 20 ++++++++++++++++---- drivers/media/pci/tw686x/tw686x.h | 1 + 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/drivers/media/pci/tw686x/tw686x-audio.c b/drivers/media/pci/tw686x/tw686x-audio.c index 987a22663525..96e444c49173 100644 --- a/drivers/media/pci/tw686x/tw686x-audio.c +++ b/drivers/media/pci/tw686x/tw686x-audio.c @@ -94,10 +94,8 @@ static int tw686x_pcm_hw_free(struct snd_pcm_substream *ss) /* * Audio parameters are global and shared among all - * capture channels. The driver makes no effort to prevent - * any modifications. User is free change the audio rate, - * or period size, thus changing parameters for all capture - * sub-devices. + * capture channels. The driver prevents changes to + * the parameters if any audio channel is capturing. */ static const struct snd_pcm_hardware tw686x_capture_hw = { .info = (SNDRV_PCM_INFO_MMAP | @@ -154,6 +152,14 @@ static int tw686x_pcm_prepare(struct snd_pcm_substream *ss) int i; spin_lock_irqsave(&dev->lock, flags); + /* + * Given the audio parameters are global (i.e. shared across + * DMA channels), we need to check new params are allowed. + */ + if (((dev->audio_rate != rt->rate) || + (dev->period_size != period_size)) && dev->audio_enabled) + goto err_audio_busy; + tw686x_disable_channel(dev, AUDIO_CHANNEL_OFFSET + ac->ch); spin_unlock_irqrestore(&dev->lock, flags); @@ -210,6 +216,10 @@ static int tw686x_pcm_prepare(struct snd_pcm_substream *ss) spin_unlock_irqrestore(&ac->lock, flags); return 0; + +err_audio_busy: + spin_unlock_irqrestore(&dev->lock, flags); + return -EBUSY; } static int tw686x_pcm_trigger(struct snd_pcm_substream *ss, int cmd) @@ -223,6 +233,7 @@ static int tw686x_pcm_trigger(struct snd_pcm_substream *ss, int cmd) case SNDRV_PCM_TRIGGER_START: if (ac->curr_bufs[0] && ac->curr_bufs[1]) { spin_lock_irqsave(&dev->lock, flags); + dev->audio_enabled = 1; tw686x_enable_channel(dev, AUDIO_CHANNEL_OFFSET + ac->ch); spin_unlock_irqrestore(&dev->lock, flags); @@ -235,6 +246,7 @@ static int tw686x_pcm_trigger(struct snd_pcm_substream *ss, int cmd) break; case SNDRV_PCM_TRIGGER_STOP: spin_lock_irqsave(&dev->lock, flags); + dev->audio_enabled = 0; tw686x_disable_channel(dev, AUDIO_CHANNEL_OFFSET + ac->ch); spin_unlock_irqrestore(&dev->lock, flags); diff --git a/drivers/media/pci/tw686x/tw686x.h b/drivers/media/pci/tw686x/tw686x.h index 4acb90543174..35d7bc94f78f 100644 --- a/drivers/media/pci/tw686x/tw686x.h +++ b/drivers/media/pci/tw686x/tw686x.h @@ -141,6 +141,7 @@ struct tw686x_dev { /* Per-device audio parameters */ int audio_rate; int period_size; + int audio_enabled; struct timer_list dma_delay_timer; u32 pending_dma_en; /* must be protected by lock */