Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp762917ybk; Wed, 13 May 2020 12:24:37 -0700 (PDT) X-Google-Smtp-Source: ABdhPJytwiojJfAG2mPSRwGpKD2MJhN8M4jlXzuFV2Mt2yvFdZ4pFvavh+HxrfJyD8tnjKQ9Lqac X-Received: by 2002:a17:906:3048:: with SMTP id d8mr515619ejd.97.1589397877596; Wed, 13 May 2020 12:24:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589397877; cv=none; d=google.com; s=arc-20160816; b=AVNFEUxCx248b5/x70/S3b1u5n8x8u649bL5Dua5m0ciXJ7nD6eQmobvUrTtd4cIJC JD0MqISC1fIBzynXpww/2omXPYNwbYLf624fk2UQ2eZcZg1nCW2wQLdTYbifsNNJJ5Fn sOsumnsNAbl5+CfYUmSN+qLEnlk+xtHUPDLNUelOKMYxLypc5V8ZXTjAxrYTDZtnnrtu +6z0dL/y0uX12xX2+dxd438JV57x3bgJGJHhOmIoCkxPdnv8RdPm/FwNbQ1L6R9OSmod 5GaEPpWVraX6qf+CLavem8cCe0lIAKlMtidzL1mYa1cWX0mGgJmgN/+V7kIU+6AhJefr qQ1g== 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:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=xJ0/kVLgd2XGmGl/2Yf51DVqklc7Fd5xTLD8Gz5eOGs=; b=oXjv7p4oleFJW9j+pMuv9+MVKgjXKgdu+zKCjZ+D+TZ+fyo0L+Ms5+LYswGHeSe052 BFjBUUS0HxUhWFAMdcoVHK8rKbqd5ip/tRSnmcvqe6R3G8Rw/gCrag0IPAOHFsu4Ospp 3X5Pm7dDFf6wkP8MerwmdZ5t2u0Ge5exZ2G5zBO7pp4GboyHFCqCUSA+IDWnPZ7cJGkz m2U4h3zSGKd9q/cczACglze/Qt1W9IqAcjR4H18ga5ok24cYX80YP0DotwC05J8IXVcN hDFZChyty4kfpkGMvqlHB2vWgyB8J0eZMuk2rWzF8TIW6ZYxt0tyzyyVkEsBWO0CaPv6 ok3A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@semihalf-com.20150623.gappssmtp.com header.s=20150623 header.b=sgR1zSAR; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id me7si416149ejb.191.2020.05.13.12.24.13; Wed, 13 May 2020 12:24:37 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@semihalf-com.20150623.gappssmtp.com header.s=20150623 header.b=sgR1zSAR; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390443AbgEMTUa (ORCPT + 99 others); Wed, 13 May 2020 15:20:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53800 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S2390289AbgEMTUa (ORCPT ); Wed, 13 May 2020 15:20:30 -0400 Received: from mail-lj1-x243.google.com (mail-lj1-x243.google.com [IPv6:2a00:1450:4864:20::243]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 57FC4C061A0C for ; Wed, 13 May 2020 12:20:28 -0700 (PDT) Received: by mail-lj1-x243.google.com with SMTP id j3so826357ljg.8 for ; Wed, 13 May 2020 12:20:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=xJ0/kVLgd2XGmGl/2Yf51DVqklc7Fd5xTLD8Gz5eOGs=; b=sgR1zSARIfNb5fmO42UIoCiOlBOwG/mW+CjWTciqdhRmacNax0zJx/8WqkW3M4LtvL iioqJ6NsaRunXfeiPr9NG/jArKqHdg2jNzHvOdJnqI813AK8ktGknxDkeDjYtqMTzrgt X6jAUwDbQURSF0gCNRt8YlUykbf+MxlnauLPHqUNMjWvBCckfwH5ISARtErxudxCwQRX St1fXVglOdzssSF2uGH8Od6/8Yx3aOJltIPPheBeqCGNhxaas/QirBJomNKVosyHPjnT zAgS2gRk3/Vo9xToor1UCNa9aXQ0V7msn3kiMNgSeUpZOUxNngUAX42VW9SJzjF3WhY0 PYEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=xJ0/kVLgd2XGmGl/2Yf51DVqklc7Fd5xTLD8Gz5eOGs=; b=HD5NL6QA86PVoKX+jzz3qKB10/pJieYRxtE0AkQPABJr98how9tA9Asmte50Bzc+Ai 08/fv4D6e7ZppaaNkf/ZzdwpT0ZS1s0c5zna+mKh9kAk1K9xLMQKNuiyXD84fr/HUnWI W8qR31mHO/cuveb9LnWB07VynlrXPpcQhSC9teMNZQjJvjuE+nhsCQ5gHeuI5JrKv2TQ tUwgcxOfGouHHJDg4qIYM3iKLhXR5/Z1NzyBBFyoT62tvonvpDA07kBYGV+atuMIySRi acvBalF1uQ8SmVAaIVDzjNbixgWHhxfEQnD+y/aE5E5xEHnPUX8253xBF5nrQ1Laa28l OcjA== X-Gm-Message-State: AOAM531EQwlybiHv3aMOCGDXxawUxcc/2hHm06QFzT82cihfSNpgYLVy Vxo8/i7z410XumY8hPyKPeL5WQ== X-Received: by 2002:a05:651c:490:: with SMTP id s16mr374721ljc.152.1589397626676; Wed, 13 May 2020 12:20:26 -0700 (PDT) Received: from deadpool.semihalf.local (89-70-221-122.dynamic.chello.pl. [89.70.221.122]) by smtp.gmail.com with ESMTPSA id w24sm288397lfk.47.2020.05.13.12.20.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 May 2020 12:20:26 -0700 (PDT) From: Lukasz Majczak To: Pierre-Louis Bossart , Liam Girdwood , Jie Yang Cc: Bob Brandt , Alex Levin , Ross Zwisler , Marcin Wojtas , Radoslaw Biernacki , Lukasz Majczak , alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org Subject: [PATCH] ASoC: Intel: kbl_rt5663_rt5514_max98927: Split be_hw_params_fixup function Date: Wed, 13 May 2020 21:20:20 +0200 Message-Id: <20200513192020.544928-1-lma@semihalf.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Split be_hw_params_fixup function for different codecs as current common function, leads to crash while trying to get snd_soc_dpcm with container_of() macro in kabylake_ssp_fixup(). The crash call path looks as below: soc_pcm_hw_params() snd_soc_dai_hw_params(codec_dai, substream, &codec_params); rtd->dai_link->be_hw_params_fixup(rtd, params) kabylake_ssp_fixup() In this case, codec_params is just a copy of an internal structure and is not embedded into struct snd_soc_dpcm thus we cannot use container_of() on it. Signed-off-by: Lukasz Majczak --- .../intel/boards/kbl_rt5663_rt5514_max98927.c | 68 +++++++++++-------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c index 1b1f8d7a4ea3..2e0ae724122c 100644 --- a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c +++ b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c @@ -328,46 +328,55 @@ static const struct snd_soc_ops kabylake_rt5663_fe_ops = { .startup = kbl_fe_startup, }; -static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) +static void kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd, + struct snd_pcm_hw_params *params, snd_pcm_format_t pcm_fmt) { struct snd_interval *rate = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE); - struct snd_interval *chan = hw_param_interval(params, + struct snd_interval *channels = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS); struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); - struct snd_soc_dpcm *dpcm = container_of( - params, struct snd_soc_dpcm, hw_params); - struct snd_soc_dai_link *fe_dai_link = dpcm->fe->dai_link; - struct snd_soc_dai_link *be_dai_link = dpcm->be->dai_link; /* * The ADSP will convert the FE rate to 48k, stereo, 24 bit */ - if (!strcmp(fe_dai_link->name, "Kbl Audio Port") || - !strcmp(fe_dai_link->name, "Kbl Audio Headset Playback") || - !strcmp(fe_dai_link->name, "Kbl Audio Capture Port")) { - rate->min = rate->max = 48000; - chan->min = chan->max = 2; - snd_mask_none(fmt); - snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S24_LE); - } else if (!strcmp(fe_dai_link->name, "Kbl Audio DMIC cap")) { - if (params_channels(params) == 2 || - DMIC_CH(dmic_constraints) == 2) - chan->min = chan->max = 2; - else - chan->min = chan->max = 4; - } - /* - * The speaker on the SSP0 supports S16_LE and not S24_LE. - * thus changing the mask here - */ - if (!strcmp(be_dai_link->name, "SSP0-Codec")) - snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S16_LE); + rate->min = rate->max = 48000; + channels->min = channels->max = 2; + + snd_mask_none(fmt); + snd_mask_set_format(fmt, pcm_fmt); +} + +static int kabylake_ssp0_fixup(struct snd_soc_pcm_runtime *rtd, + struct snd_pcm_hw_params *params) +{ + kabylake_ssp_fixup(rtd, params, SNDRV_PCM_FORMAT_S16_LE); return 0; } +static int kabylake_ssp1_fixup(struct snd_soc_pcm_runtime *rtd, + struct snd_pcm_hw_params *params) +{ + + kabylake_ssp_fixup(rtd, params, SNDRV_PCM_FORMAT_S24_LE); + return 0; +} + +static int kabylake_dmic_cap_fixup(struct snd_soc_pcm_runtime *rtd, + struct snd_pcm_hw_params *params) +{ + struct snd_interval *channels = hw_param_interval(params, + SNDRV_PCM_HW_PARAM_CHANNELS); + + if (params_channels(params) == 2 || + DMIC_CH(dmic_constraints) == 2) + channels->min = channels->max = 2; + else + channels->min = channels->max = 4; + + return 0; +} static int kabylake_rt5663_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { @@ -582,6 +591,7 @@ static struct snd_soc_dai_link kabylake_dais[] = { .dpcm_capture = 1, .nonatomic = 1, .dynamic = 1, + .be_hw_params_fixup = kabylake_dmic_cap_fixup, .ops = &kabylake_dmic_ops, SND_SOC_DAILINK_REG(dmic, dummy, platform), }, @@ -618,7 +628,7 @@ static struct snd_soc_dai_link kabylake_dais[] = { SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS, .ignore_pmdown_time = 1, - .be_hw_params_fixup = kabylake_ssp_fixup, + .be_hw_params_fixup = kabylake_ssp0_fixup, .dpcm_playback = 1, .dpcm_capture = 1, .ops = &kabylake_ssp0_ops, @@ -632,7 +642,7 @@ static struct snd_soc_dai_link kabylake_dais[] = { .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS, .ignore_pmdown_time = 1, - .be_hw_params_fixup = kabylake_ssp_fixup, + .be_hw_params_fixup = kabylake_ssp1_fixup, .ops = &kabylake_rt5663_ops, .dpcm_playback = 1, .dpcm_capture = 1, -- 2.25.1