From patchwork Thu Jan 3 14:23:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 1020345 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="t82qlmtH"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Vqs95PWLz9s4s for ; Fri, 4 Jan 2019 01:23:25 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731921AbfACOXZ (ORCPT ); Thu, 3 Jan 2019 09:23:25 -0500 Received: from mail-wm1-f66.google.com ([209.85.128.66]:53017 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731920AbfACOXZ (ORCPT ); Thu, 3 Jan 2019 09:23:25 -0500 Received: by mail-wm1-f66.google.com with SMTP id m1so29422130wml.2 for ; Thu, 03 Jan 2019 06:23:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SCSBXukfAa3uMYBaJAwRmDv84Xop7/TLjIMub59pDg8=; b=t82qlmtHOOWxQyEF7f1j5kbnskVSiwP9R5WBMMpysRtKA7WWj3SXZNYQVas+EUEomu 2pd/vzHpjGgjwrcc4Ni75tOVwi5tA14LoqO6+sIy30fWSHqDQl9gpnagCHoBiD1lgZfk AwY2oADW4ldqwa3NPQxxqLlY7mJLXD/cISrwbtYitlOlR8Qonmg/QrqZmMUrqgtuaarJ FvgGKMyuDvM/6ohPZTD1K2GFjs8HuaFkurn4CrHPLogL3ADO4eZtNCxiasJMHyF4saBC E4uL2WWGMfhJ/NULZ/zvAxeXOjRiF2PCmNZG9ky9r+WYPnaCvyLgClb2ci8CCqscy5j+ C3+w== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=SCSBXukfAa3uMYBaJAwRmDv84Xop7/TLjIMub59pDg8=; b=kZkWnpEPrKJNLwd+0md+XKeu5uC1TBpP+3s2a7qp245opj9NYnjYdRsTOP5OlWbNP7 6Z5Zg0ZdoEhoeDeZiG4YUROPm7DJzfzmlEuTrgWIS9qO+iRMQdcTDFoJqqV9XlNvlelZ cXU57S5CuqzYqRha4aJXvu+L5eyFdo00WBIHTRwx3PBQCd6dnZA/f3ZOPu141KDcaYDz egsyL1P7sNKCRvylWDyzRFEBcdsYfDoxPPDG+4cpvdb+dWP3W8Sr/0+M/7qHm55pcD4L lAeUPG6pXL2hN0nnRNlCLbDww6DP9Zt0Qc2kSG3p73gz8k8RMmgQQ05d8/hg6HfeKmLQ lCyQ== X-Gm-Message-State: AJcUukd/IJVJpv38AVRh0yB0L4Ax16IS4FbqxX4QuUyxNt+s1OIKt/qF 2LwzLvbHeuKyA8YZr5p1K/E= X-Google-Smtp-Source: ALg8bN6RAHVTSARDgyPB0WDmMQDDlp/S88nGPot7UYw3NP8WVeMgeXg/fsB5lHn5ZeMub9H4D0cplA== X-Received: by 2002:a1c:f916:: with SMTP id x22mr21866085wmh.87.1546525401941; Thu, 03 Jan 2019 06:23:21 -0800 (PST) Received: from localhost (pD9E51040.dip0.t-ipconnect.de. [217.229.16.64]) by smtp.gmail.com with ESMTPSA id v5sm45988189wrn.71.2019.01.03.06.23.21 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 03 Jan 2019 06:23:21 -0800 (PST) From: Thierry Reding To: Thierry Reding Cc: Mohan Kumar , Ujwal Patel , Sameer Pujar , dri-devel@lists.freedesktop.org, linux-tegra@vger.kernel.org Subject: [PATCH 3/3] drm/tegra: hdmi: Reuse common HDA format parser Date: Thu, 3 Jan 2019 15:23:17 +0100 Message-Id: <20190103142317.26124-3-thierry.reding@gmail.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190103142317.26124-1-thierry.reding@gmail.com> References: <20190103142317.26124-1-thierry.reding@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org From: Thierry Reding Eliminate some duplicate code by reusing the HDA format parser already used by the SOR. Signed-off-by: Thierry Reding --- drivers/gpu/drm/tegra/hdmi.c | 43 +++++++----------------------------- 1 file changed, 8 insertions(+), 35 deletions(-) diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c index d19973945614..8fdff801c6f2 100644 --- a/drivers/gpu/drm/tegra/hdmi.c +++ b/drivers/gpu/drm/tegra/hdmi.c @@ -20,8 +20,7 @@ #include #include -#include - +#include "hda.h" #include "hdmi.h" #include "drm.h" #include "dc.h" @@ -69,8 +68,7 @@ struct tegra_hdmi { const struct tegra_hdmi_config *config; unsigned int audio_source; - unsigned int audio_sample_rate; - unsigned int audio_channels; + struct tegra_hda_format format; unsigned int pixel_clock; bool stereo; @@ -508,7 +506,7 @@ static void tegra_hdmi_write_aval(struct tegra_hdmi *hdmi, u32 value) unsigned int i; for (i = 0; i < ARRAY_SIZE(regs); i++) { - if (regs[i].sample_rate == hdmi->audio_sample_rate) { + if (regs[i].sample_rate == hdmi->format.sample_rate) { tegra_hdmi_writel(hdmi, value, regs[i].offset); break; } @@ -562,7 +560,7 @@ static int tegra_hdmi_setup_audio(struct tegra_hdmi *hdmi) * play back system startup sounds early. It is possibly not * needed on Linux at all. */ - if (hdmi->audio_channels == 2) + if (hdmi->format.channels == 2) value = SOR_AUDIO_CNTRL0_INJECT_NULLSMPL; else value = 0; @@ -593,12 +591,12 @@ static int tegra_hdmi_setup_audio(struct tegra_hdmi *hdmi) tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_AUDIO_SPARE0); } - config = tegra_hdmi_get_audio_config(hdmi->audio_sample_rate, + config = tegra_hdmi_get_audio_config(hdmi->format.sample_rate, hdmi->pixel_clock); if (!config) { dev_err(hdmi->dev, "cannot set audio to %u Hz at %u Hz pixel clock\n", - hdmi->audio_sample_rate, hdmi->pixel_clock); + hdmi->format.sample_rate, hdmi->pixel_clock); return -EINVAL; } @@ -785,7 +783,7 @@ static void tegra_hdmi_setup_audio_infoframe(struct tegra_hdmi *hdmi) return; } - frame.channels = hdmi->audio_channels; + frame.channels = hdmi->format.channels; err = hdmi_audio_infoframe_pack(&frame, buffer, sizeof(buffer)); if (err < 0) { @@ -1587,24 +1585,6 @@ static const struct of_device_id tegra_hdmi_of_match[] = { }; MODULE_DEVICE_TABLE(of, tegra_hdmi_of_match); -static void hda_format_parse(unsigned int format, unsigned int *rate, - unsigned int *channels) -{ - unsigned int mul, div; - - if (format & AC_FMT_BASE_44K) - *rate = 44100; - else - *rate = 48000; - - mul = (format & AC_FMT_MULT_MASK) >> AC_FMT_MULT_SHIFT; - div = (format & AC_FMT_DIV_MASK) >> AC_FMT_DIV_SHIFT; - - *rate = *rate * (mul + 1) / (div + 1); - - *channels = (format & AC_FMT_CHAN_MASK) >> AC_FMT_CHAN_SHIFT; -} - static irqreturn_t tegra_hdmi_irq(int irq, void *data) { struct tegra_hdmi *hdmi = data; @@ -1621,14 +1601,9 @@ static irqreturn_t tegra_hdmi_irq(int irq, void *data) value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_AUDIO_HDA_CODEC_SCRATCH0); if (value & SOR_AUDIO_HDA_CODEC_SCRATCH0_VALID) { - unsigned int sample_rate, channels; - format = value & SOR_AUDIO_HDA_CODEC_SCRATCH0_FMT_MASK; - hda_format_parse(format, &sample_rate, &channels); - - hdmi->audio_sample_rate = sample_rate; - hdmi->audio_channels = channels; + tegra_hda_parse_format(format, &hdmi->format); err = tegra_hdmi_setup_audio(hdmi); if (err < 0) { @@ -1662,8 +1637,6 @@ static int tegra_hdmi_probe(struct platform_device *pdev) hdmi->dev = &pdev->dev; hdmi->audio_source = AUTO; - hdmi->audio_sample_rate = 48000; - hdmi->audio_channels = 2; hdmi->stereo = false; hdmi->dvi = false;