Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp5423804ybi; Wed, 12 Jun 2019 02:12:35 -0700 (PDT) X-Google-Smtp-Source: APXvYqwgn3qcqFzrHOrGG/4OvkByvmSDkX8RzatS1u/C0GAr/tYfqP3g99LoOvxdnr1OsWYPCYtA X-Received: by 2002:a63:cd4c:: with SMTP id a12mr24171036pgj.362.1560330755345; Wed, 12 Jun 2019 02:12:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1560330755; cv=none; d=google.com; s=arc-20160816; b=qkcfaNucvfzoF0Zk6wyyFBowV5td2HEQevdGT2bu11xXULEW5NwRMZy9x/EvDzSITa fPmK+2Wk6cDDNuAt290PP+DRmAriKyaCdQZbiA2tPrq0J/GoMkoaWA2oW6XlbMZWByak hCv+bJ2aWfdMD8tfOMgjx5bTSw+NPBLLg2jJQZ4TzFrdF69Nw1fX1Gr9QHGC3fUKV36i GXlIwDsar5Zibh4bxnOqzY3emEaE7LZS0wIpovxdb+0zydKaWVq21Si8RY0Mwj19Akjv DUQTHnxtbfbUvq7cRjFyzUD6fsnPoTBEAS5GNeMoPFBPO+MJQZKa8SEQ/3rWHnIe4K+2 RfkQ== 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=RSKOs/0s6FR/9oTMsWE0q6h8Dj8JjCFySf1jc9f1nac=; b=fjQx7KC5o0yhvfff8A8JhtYp16H9o7JbUG8zWRMcTHgOQs6DgInNegcXR0cIoscF0m R5StSyvyXGp0dq0bjWpVwYk5+v4dgr71OM1b78fAPaN8VFkYCNIaxGO4Re2dBGaz7tcn zuT0MwyUe1GBr/233azk0dFrjjCSrkbFbgWhpdxWBdwtoPHhuskgenWZk4J9gqKZ+m2E WEYiSDU9AahxMVsia8/MWkn6Ay3DKRq40/dUSHdGMx16HhSwi5Kl+7u/60bnPqYfZ60w XAh4Ms5qcOEHpPhnGopu+EvkynSQRiu+8YqNYCJrm9ZD2/5mJ8gDeMCL/kLGAUIUCqQu umTA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=dp5fYdjM; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f187si15919382pfb.265.2019.06.12.02.12.18; Wed, 12 Jun 2019 02:12:35 -0700 (PDT) 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; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=dp5fYdjM; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2407865AbfFLIvw (ORCPT + 99 others); Wed, 12 Jun 2019 04:51:52 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:36527 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729538AbfFLIvw (ORCPT ); Wed, 12 Jun 2019 04:51:52 -0400 Received: by mail-wr1-f66.google.com with SMTP id n4so15991923wrs.3 for ; Wed, 12 Jun 2019 01:51:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=RSKOs/0s6FR/9oTMsWE0q6h8Dj8JjCFySf1jc9f1nac=; b=dp5fYdjMMNY/KdA9qO5s73CMWXfw8DAreKnFk6nEKvfwIaxrHiPpb2vj6D5xptj9am c79WmDo+GdIjETFTCwSTtx4ceUbLL1MCw//rpanykdrl5xhvJ45V24cuOlrYVChWZ3XX V1tdSCToAm3CDM+e17q3hrpLYnPVOmWFWnO6vzFKql6LIUtgnO7+7BOJKdJ6IHOuWO5C /D9Pzz1hpaIGYWjjSr4Dk9sI7j7bP59zV2js1qoU9fbSRy3b5txPhtA3JglPMTizX8yC KOChxhh06wSr9W6MmhbtJ8aqXshg+LrnfW5lIUvmY9wiNPtv9p4qWjKSNl5zdr39JBDk U+sw== 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=RSKOs/0s6FR/9oTMsWE0q6h8Dj8JjCFySf1jc9f1nac=; b=CekPY5C5TF0bNdCp5sLwD6ugoMwxO3K0w9dpmCEZFzCuC0JyY+h+OIME7hDYmWinfd ZfpbxsYAuqwmVkWf72t2jkB8dxpyNqVq39ndOvl3ubW+KWvmiZ5ENF7TapAxWhE1cFnu PYCaIpm+yk9HirDh8f7vvIXmTiRfnnyoI8VORwm/8r3vOgj/LzP+B2TyJ9qP2yyM5yIC 8cnFHEdK27BsoD6OkTw75vuJmWcWKV278VFnt0W1mRtFSqBHBrvw6aYwqi+feXXPdOvx Xaj6uZQeT2JqF7irfhOV7FW/Ue3hberTDblyDCqKkf2vw2dPai5T7XL55PasPnXNnBZR slQg== X-Gm-Message-State: APjAAAW7RCWvy9fuv2j+SBgZTOrSelFgqohq3p3yAZwygZmHnEl2uTb4 30Z5GRIBwkdF+vKiy5ppzvW8tQ== X-Received: by 2002:adf:fb0b:: with SMTP id c11mr4888821wrr.56.1560329509905; Wed, 12 Jun 2019 01:51:49 -0700 (PDT) Received: from bender.baylibre.local (lmontsouris-657-1-212-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.gmail.com with ESMTPSA id a10sm6218786wrx.17.2019.06.12.01.51.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 12 Jun 2019 01:51:49 -0700 (PDT) From: Neil Armstrong To: a.hajda@samsung.com, Laurent.pinchart@ideasonboard.com Cc: Neil Armstrong , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Jernej Skrabec , Maxime Ripard , Jonas Karlman , Heiko Stuebner , Jerome Brunet Subject: [PATCH] drm/bridge: dw-hdmi: Use automatic CTS generation mode when using non-AHB audio Date: Wed, 12 Jun 2019 10:51:47 +0200 Message-Id: <20190612085147.26971-1-narmstrong@baylibre.com> X-Mailer: git-send-email 2.21.0 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 When using an I2S source using a different clock source (usually the I2S audio HW uses dedicated PLLs, different from the HDMI PHY PLL), fixed CTS values will cause some frequent audio drop-out and glitches as reported on Amlogic, Allwinner and Rockchip SoCs setups. Setting the CTS in automatic mode will let the HDMI controller generate automatically the CTS value to match the input audio clock. The DesignWare DW-HDMI User Guide explains: For Automatic CTS generation Write "0" on the bit field "CTS_manual", Register 0x3205: AUD_CTS3 The DesignWare DW-HDMI Databook explains : If "CTS_manual" bit equals 0b this registers contains "audCTS[19:0]" generated by the Cycle time counter according to specified timing. Cc: Jernej Skrabec Cc: Maxime Ripard Cc: Jonas Karlman Cc: Heiko Stuebner Cc: Jerome Brunet Signed-off-by: Neil Armstrong --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 44 +++++++++++++++-------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index c68b6ed1bb35..6458c3a31d23 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -437,8 +437,14 @@ static void hdmi_set_cts_n(struct dw_hdmi *hdmi, unsigned int cts, /* nshift factor = 0 */ hdmi_modb(hdmi, 0, HDMI_AUD_CTS3_N_SHIFT_MASK, HDMI_AUD_CTS3); - hdmi_writeb(hdmi, ((cts >> 16) & HDMI_AUD_CTS3_AUDCTS19_16_MASK) | - HDMI_AUD_CTS3_CTS_MANUAL, HDMI_AUD_CTS3); + /* Use automatic CTS generation mode when CTS is not set */ + if (cts) + hdmi_writeb(hdmi, ((cts >> 16) & + HDMI_AUD_CTS3_AUDCTS19_16_MASK) | + HDMI_AUD_CTS3_CTS_MANUAL, + HDMI_AUD_CTS3); + else + hdmi_writeb(hdmi, 0, HDMI_AUD_CTS3); hdmi_writeb(hdmi, (cts >> 8) & 0xff, HDMI_AUD_CTS2); hdmi_writeb(hdmi, cts & 0xff, HDMI_AUD_CTS1); @@ -508,24 +514,32 @@ static void hdmi_set_clk_regenerator(struct dw_hdmi *hdmi, { unsigned long ftdms = pixel_clk; unsigned int n, cts; + u8 config3; u64 tmp; n = hdmi_compute_n(sample_rate, pixel_clk); - /* - * Compute the CTS value from the N value. Note that CTS and N - * can be up to 20 bits in total, so we need 64-bit math. Also - * note that our TDMS clock is not fully accurate; it is accurate - * to kHz. This can introduce an unnecessary remainder in the - * calculation below, so we don't try to warn about that. - */ - tmp = (u64)ftdms * n; - do_div(tmp, 128 * sample_rate); - cts = tmp; + config3 = hdmi_readb(hdmi, HDMI_CONFIG3_ID); - dev_dbg(hdmi->dev, "%s: fs=%uHz ftdms=%lu.%03luMHz N=%d cts=%d\n", - __func__, sample_rate, ftdms / 1000000, (ftdms / 1000) % 1000, - n, cts); + /* Only compute CTS when using internal AHB audio */ + if (config3 & HDMI_CONFIG3_AHBAUDDMA) { + /* + * Compute the CTS value from the N value. Note that CTS and N + * can be up to 20 bits in total, so we need 64-bit math. Also + * note that our TDMS clock is not fully accurate; it is + * accurate to kHz. This can introduce an unnecessary remainder + * in the calculation below, so we don't try to warn about that. + */ + tmp = (u64)ftdms * n; + do_div(tmp, 128 * sample_rate); + cts = tmp; + + dev_dbg(hdmi->dev, "%s: fs=%uHz ftdms=%lu.%03luMHz N=%d cts=%d\n", + __func__, sample_rate, + ftdms / 1000000, (ftdms / 1000) % 1000, + n, cts); + } else + cts = 0; spin_lock_irq(&hdmi->audio_lock); hdmi->audio_n = n; -- 2.21.0