Received: by 2002:a25:31c3:0:0:0:0:0 with SMTP id x186csp1235001ybx; Thu, 7 Nov 2019 09:09:01 -0800 (PST) X-Google-Smtp-Source: APXvYqzDjAGoIkMN3UxKrfmg8UibDwEjcXLasC0CBWRP5z5digikwoR8wGN9AS293az7gqaNMij8 X-Received: by 2002:a05:6402:13d4:: with SMTP id a20mr4755229edx.105.1573146541290; Thu, 07 Nov 2019 09:09:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573146541; cv=none; d=google.com; s=arc-20160816; b=awmu+c3cGBZm16Rvq0/Wpl8+scX4G+zKLSzcOSoTWXQN+cq0q2eTwnkX0ev7uYwnrv eOtp3iLKY2+TvYHI6NV6EHuXJaVovNPLQ2mQ5Ms17vxN1OZssfeIH9m70dh09RIqcskP yokH4VXUnFzcazWpyWa2RJzP6j8iqKY3XTgZe2oo6YKv0J1oPx4R6lXtp25f9YzyTjo2 kTt+xvJwbNFvPmLAzY+rJ3K0w7dges1/t4vNFAHyb7qVdf6hiD1UGQUTRLRbBw5JqY4K eqFz9Ws4UzFGLAJ/WFrmXVVhvLDLMv0Apo8X6VQmztbT3skR2dlSRETIw+Ji2W+V0E1D 5R5Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject; bh=HknmkPOyaHzmpZPxv7YMW7wvbqMaC2QcyTpqtPbkack=; b=TRn9toavP3g+tkZNxGHACnccvp2Q3WEjpwq4zFK760sB87uLb6aCdWU0cikauFmaKV qevdQ2yhNq9S5QKUkUj3PPllrRKblkURbm8ssTEVLFK61ZpY1lloX2MJF1075URxCUNL fJA6/D89XJV6eM59AaPc80Sl3VHEuyDOjwBaBwEu/ZgqzTKKTILmDasAUzS7T2Tm7iKm SgBAm6l3mgDv8INF9KRySllSXGprIEH87GDBYBfMRNL+XKr7ubOzjeyjA7LrcQs/EDdX JCDkiSWwCd1jhvsIu2/KQSGUEb+JuYX2mCZvdasom2+94vMekCPYww8AOjDJJ/UMAd/c tYmA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s1si1923526ejl.235.2019.11.07.09.08.34; Thu, 07 Nov 2019 09:09:01 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389795AbfKGRF0 (ORCPT + 99 others); Thu, 7 Nov 2019 12:05:26 -0500 Received: from mga05.intel.com ([192.55.52.43]:48853 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389652AbfKGRFZ (ORCPT ); Thu, 7 Nov 2019 12:05:25 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 07 Nov 2019 09:05:25 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,278,1569308400"; d="scan'208";a="192880772" Received: from cjense2x-mobl1.amr.corp.intel.com (HELO [10.251.130.63]) ([10.251.130.63]) by orsmga007.jf.intel.com with ESMTP; 07 Nov 2019 09:05:24 -0800 Subject: Re: [alsa-devel] [PATCH v3 3/6] ASoC: amd: Enabling I2S instance in DMA and DAI To: Ravulapati Vishnu vardhan rao Cc: "moderated list:SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEM..." , Maruthi Bayyavarapu , Kuninori Morimoto , open list , Takashi Iwai , YueHaibing , Liam Girdwood , Akshu.Agrawal@amd.com, Mark Brown , djkurtz@google.com, Vijendar Mukunda , Alex Deucher , Colin Ian King References: <1573133093-28208-1-git-send-email-Vishnuvardhanrao.Ravulapati@amd.com> <1573133093-28208-4-git-send-email-Vishnuvardhanrao.Ravulapati@amd.com> From: Pierre-Louis Bossart Message-ID: <73a0569b-7885-3461-4aff-e38e85a06ebf@linux.intel.com> Date: Thu, 7 Nov 2019 09:22:25 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.1.2 MIME-Version: 1.0 In-Reply-To: <1573133093-28208-4-git-send-email-Vishnuvardhanrao.Ravulapati@amd.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { > - val = rv_readl(rtd->acp3x_base + mmACP_BTTDM_ITER); > - val = val | (rtd->xfer_resolution << 3); > - rv_writel(val, rtd->acp3x_base + mmACP_BTTDM_ITER); > + switch (rtd->i2s_instance) { > + case I2S_BT_INSTANCE: > + val = rv_readl(rtd->acp3x_base + mmACP_BTTDM_ITER); > + val = val | (rtd->xfer_resolution << 3); > + rv_writel(val, rtd->acp3x_base + mmACP_BTTDM_ITER); > + break; > + case I2S_SP_INSTANCE: > + default: > + val = rv_readl(rtd->acp3x_base + mmACP_I2STDM_ITER); > + val = val | (rtd->xfer_resolution << 3); > + rv_writel(val, rtd->acp3x_base + mmACP_I2STDM_ITER); > + } > } else { > - val = rv_readl(rtd->acp3x_base + mmACP_BTTDM_IRER); > - val = val | (rtd->xfer_resolution << 3); > - rv_writel(val, rtd->acp3x_base + mmACP_BTTDM_IRER); > + switch (rtd->i2s_instance) { > + case I2S_BT_INSTANCE: > + val = rv_readl(rtd->acp3x_base + mmACP_BTTDM_IRER); > + val = val | (rtd->xfer_resolution << 3); > + rv_writel(val, rtd->acp3x_base + mmACP_BTTDM_IRER); > + break; > + case I2S_SP_INSTANCE: > + default: > + val = rv_readl(rtd->acp3x_base + mmACP_I2STDM_IRER); > + val = val | (rtd->xfer_resolution << 3); > + rv_writel(val, rtd->acp3x_base + mmACP_I2STDM_IRER); > + } You could reduce the code by setting the address in the switch case, then perform the read/modify/write outisde of the switch. > @@ -131,33 +168,104 @@ static int acp3x_i2s_trigger(struct snd_pcm_substream *substream, > rtd->bytescount = acp_get_byte_count(rtd, > substream->stream); > if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { > - rv_writel(period_bytes, rtd->acp3x_base + > + switch (rtd->i2s_instance) { > + case I2S_BT_INSTANCE: > + rv_writel(period_bytes, rtd->acp3x_base + > mmACP_BT_TX_INTR_WATERMARK_SIZE); > - val = rv_readl(rtd->acp3x_base + mmACP_BTTDM_ITER); > - val = val | BIT(0); > - rv_writel(val, rtd->acp3x_base + mmACP_BTTDM_ITER); > + val = rv_readl(rtd->acp3x_base + > + mmACP_BTTDM_ITER); > + val = val | BIT(0); > + rv_writel(val, rtd->acp3x_base + > + mmACP_BTTDM_ITER); > + rv_writel(1, rtd->acp3x_base + > + mmACP_BTTDM_IER); > + break; > + case I2S_SP_INSTANCE: > + default: > + rv_writel(period_bytes, rtd->acp3x_base + > + mmACP_I2S_TX_INTR_WATERMARK_SIZE); > + val = rv_readl(rtd->acp3x_base + > + mmACP_I2STDM_ITER); > + val = val | BIT(0); > + rv_writel(val, rtd->acp3x_base + > + mmACP_I2STDM_ITER); > + rv_writel(1, rtd->acp3x_base + > + mmACP_I2STDM_IER); > + } > } else { > - rv_writel(period_bytes, rtd->acp3x_base + > + switch (rtd->i2s_instance) { > + case I2S_BT_INSTANCE: > + rv_writel(period_bytes, rtd->acp3x_base + > mmACP_BT_RX_INTR_WATERMARK_SIZE); > - val = rv_readl(rtd->acp3x_base + mmACP_BTTDM_IRER); > - val = val | BIT(0); > - rv_writel(val, rtd->acp3x_base + mmACP_BTTDM_IRER); > + val = rv_readl(rtd->acp3x_base + > + mmACP_BTTDM_IRER); > + val = val | BIT(0); > + rv_writel(val, rtd->acp3x_base + > + mmACP_BTTDM_IRER); > + rv_writel(1, rtd->acp3x_base + > + mmACP_BTTDM_IER); > + break; > + case I2S_SP_INSTANCE: > + default: > + rv_writel(period_bytes, rtd->acp3x_base + > + mmACP_I2S_RX_INTR_WATERMARK_SIZE); > + val = rv_readl(rtd->acp3x_base + > + mmACP_I2STDM_IRER); > + val = val | BIT(0); > + rv_writel(val, rtd->acp3x_base + > + mmACP_I2STDM_IRER); > + rv_writel(1, rtd->acp3x_base + > + mmACP_I2STDM_IER); > + } same here, you could set 3 addresses in the switch cases, and perform the operations outside of the switch. > } > - rv_writel(1, rtd->acp3x_base + mmACP_BTTDM_IER); > break; > case SNDRV_PCM_TRIGGER_STOP: > case SNDRV_PCM_TRIGGER_SUSPEND: > case SNDRV_PCM_TRIGGER_PAUSE_PUSH: > if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { > - val = rv_readl(rtd->acp3x_base + mmACP_BTTDM_ITER); > - val = val & ~BIT(0); > - rv_writel(val, rtd->acp3x_base + mmACP_BTTDM_ITER); > + switch (rtd->i2s_instance) { > + case I2S_BT_INSTANCE: > + val = rv_readl(rtd->acp3x_base + > + mmACP_BTTDM_ITER); > + val = val & ~BIT(0); > + rv_writel(val, rtd->acp3x_base + > + mmACP_BTTDM_ITER); > + rv_writel(0, rtd->acp3x_base + > + mmACP_BTTDM_IER); > + break; > + case I2S_SP_INSTANCE: > + default: > + val = rv_readl(rtd->acp3x_base + > + mmACP_I2STDM_ITER); > + val = val & ~BIT(0); > + rv_writel(val, rtd->acp3x_base + > + mmACP_I2STDM_ITER); > + rv_writel(0, rtd->acp3x_base + > + mmACP_I2STDM_IER); > + } > + > } else { > - val = rv_readl(rtd->acp3x_base + mmACP_BTTDM_IRER); > - val = val & ~BIT(0); > - rv_writel(val, rtd->acp3x_base + mmACP_BTTDM_IRER); > + switch (rtd->i2s_instance) { > + case I2S_BT_INSTANCE: > + val = rv_readl(rtd->acp3x_base + > + mmACP_BTTDM_IRER); > + val = val & ~BIT(0); > + rv_writel(val, rtd->acp3x_base + > + mmACP_BTTDM_IRER); > + rv_writel(0, rtd->acp3x_base + > + mmACP_BTTDM_IER); > + break; > + case I2S_SP_INSTANCE: > + default: > + val = rv_readl(rtd->acp3x_base + > + mmACP_I2STDM_IRER); > + val = val & ~BIT(0); > + rv_writel(val, rtd->acp3x_base + > + mmACP_I2STDM_IRER); > + rv_writel(0, rtd->acp3x_base + > + mmACP_I2STDM_IER); > + } and here too... > if (direction == SNDRV_PCM_STREAM_PLAYBACK) { > - /* Config ringbuffer */ > - rv_writel(MEM_WINDOW_START, rtd->acp3x_base + > - mmACP_BT_TX_RINGBUFADDR); > - rv_writel(MAX_BUFFER, rtd->acp3x_base + > - mmACP_BT_TX_RINGBUFSIZE); > - rv_writel(DMA_SIZE, rtd->acp3x_base + mmACP_BT_TX_DMA_SIZE); > - > - /* Config audio fifo */ > - acp_fifo_addr = ACP_SRAM_PTE_OFFSET + (rtd->num_pages * 8) > - + PLAYBACK_FIFO_ADDR_OFFSET; > - rv_writel(acp_fifo_addr, rtd->acp3x_base + > - mmACP_BT_TX_FIFOADDR); > - rv_writel(FIFO_SIZE, rtd->acp3x_base + mmACP_BT_TX_FIFOSIZE); > + switch (rtd->i2s_instance) { > + case I2S_BT_INSTANCE: > + /* Config ringbuffer */ > + rv_writel(I2S_BT_TX_MEM_WINDOW_START, > + rtd->acp3x_base + mmACP_BT_TX_RINGBUFADDR); > + rv_writel(MAX_BUFFER, rtd->acp3x_base + > + mmACP_BT_TX_RINGBUFSIZE); > + rv_writel(DMA_SIZE, > + rtd->acp3x_base + mmACP_BT_TX_DMA_SIZE); > + > + /* Config audio fifo */ > + acp_fifo_addr = ACP_SRAM_PTE_OFFSET + > + BT_PB_FIFO_ADDR_OFFSET; > + rv_writel(acp_fifo_addr, > + rtd->acp3x_base + mmACP_BT_TX_FIFOADDR); > + rv_writel(FIFO_SIZE, > + rtd->acp3x_base + mmACP_BT_TX_FIFOSIZE); > + /* Enable watermark/period interrupt to host */ > + rv_writel(BIT(BT_TX_THRESHOLD), > + rtd->acp3x_base + mmACP_EXTERNAL_INTR_CNTL); > + break; > + > + case I2S_SP_INSTANCE: > + default: > + /* Config ringbuffer */ > + rv_writel(I2S_SP_TX_MEM_WINDOW_START, > + rtd->acp3x_base + mmACP_I2S_TX_RINGBUFADDR); > + rv_writel(MAX_BUFFER, > + rtd->acp3x_base + mmACP_I2S_TX_RINGBUFSIZE); > + rv_writel(DMA_SIZE, > + rtd->acp3x_base + mmACP_I2S_TX_DMA_SIZE); > + > + /* Config audio fifo */ > + acp_fifo_addr = ACP_SRAM_PTE_OFFSET + > + SP_PB_FIFO_ADDR_OFFSET; > + rv_writel(acp_fifo_addr, > + rtd->acp3x_base + mmACP_I2S_TX_FIFOADDR); > + rv_writel(FIFO_SIZE, > + rtd->acp3x_base + mmACP_I2S_TX_FIFOSIZE); > + /* Enable watermark/period interrupt to host */ > + rv_writel(BIT(I2S_TX_THRESHOLD), > + rtd->acp3x_base + mmACP_EXTERNAL_INTR_CNTL); > + } > } else { > - /* Config ringbuffer */ > - rv_writel(MEM_WINDOW_START + MAX_BUFFER, rtd->acp3x_base + > - mmACP_BT_RX_RINGBUFADDR); > - rv_writel(MAX_BUFFER, rtd->acp3x_base + > - mmACP_BT_RX_RINGBUFSIZE); > - rv_writel(DMA_SIZE, rtd->acp3x_base + mmACP_BT_RX_DMA_SIZE); > - > - /* Config audio fifo */ > - acp_fifo_addr = ACP_SRAM_PTE_OFFSET + > - (rtd->num_pages * 8) + CAPTURE_FIFO_ADDR_OFFSET; > - rv_writel(acp_fifo_addr, rtd->acp3x_base + > - mmACP_BT_RX_FIFOADDR); > - rv_writel(FIFO_SIZE, rtd->acp3x_base + mmACP_BT_RX_FIFOSIZE); > + switch (rtd->i2s_instance) { > + case I2S_BT_INSTANCE: > + /* Config ringbuffer */ > + rv_writel(I2S_BT_RX_MEM_WINDOW_START, > + rtd->acp3x_base + mmACP_BT_RX_RINGBUFADDR); > + rv_writel(MAX_BUFFER, > + rtd->acp3x_base + mmACP_BT_RX_RINGBUFSIZE); > + rv_writel(DMA_SIZE, > + rtd->acp3x_base + mmACP_BT_RX_DMA_SIZE); > + > + /* Config audio fifo */ > + acp_fifo_addr = ACP_SRAM_PTE_OFFSET + > + BT_CAPT_FIFO_ADDR_OFFSET; > + rv_writel(acp_fifo_addr, > + rtd->acp3x_base + mmACP_BT_RX_FIFOADDR); > + rv_writel(FIFO_SIZE, > + rtd->acp3x_base + mmACP_BT_RX_FIFOSIZE); > + /* Enable watermark/period interrupt to host */ > + rv_writel(BIT(BT_RX_THRESHOLD), > + rtd->acp3x_base + mmACP_EXTERNAL_INTR_CNTL); > + break; > + > + case I2S_SP_INSTANCE: > + default: > + /* Config ringbuffer */ > + rv_writel(I2S_SP_RX_MEM_WINDOW_START, > + rtd->acp3x_base + mmACP_I2S_RX_RINGBUFADDR); > + rv_writel(MAX_BUFFER, > + rtd->acp3x_base + mmACP_I2S_RX_RINGBUFSIZE); > + rv_writel(DMA_SIZE, > + rtd->acp3x_base + mmACP_I2S_RX_DMA_SIZE); > + > + /* Config audio fifo */ > + acp_fifo_addr = ACP_SRAM_PTE_OFFSET + > + SP_CAPT_FIFO_ADDR_OFFSET; > + rv_writel(acp_fifo_addr, > + rtd->acp3x_base + mmACP_I2S_RX_FIFOADDR); > + rv_writel(FIFO_SIZE, > + rtd->acp3x_base + mmACP_I2S_RX_FIFOSIZE); > + /* Enable watermark/period interrupt to host */ > + rv_writel(BIT(I2S_RX_THRESHOLD), > + rtd->acp3x_base + mmACP_EXTERNAL_INTR_CNTL); > + } and here too. You are doing the same operations with just different offsets.