From patchwork Sat Feb 3 16:52:42 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Ford X-Patchwork-Id: 196343 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:9bc1:b0:106:209c:c626 with SMTP id op1csp1108679dyc; Sat, 3 Feb 2024 08:58:33 -0800 (PST) X-Google-Smtp-Source: AGHT+IFxxrv2+42wziaKdjPnbBQpyU/Ib1S2iuMqUssFWPgcP+z6sTg4dyDN0H5489gIVp+E/eTW X-Received: by 2002:a05:6a21:3418:b0:19e:5df2:6ca0 with SMTP id yn24-20020a056a21341800b0019e5df26ca0mr1263630pzb.20.1706979513584; Sat, 03 Feb 2024 08:58:33 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706979513; cv=pass; d=google.com; s=arc-20160816; b=DkmCjXfDSRpBzl4gwNFoZzwFwVgRCebUhB2/wjvPaeNUqv6hEBYB0JRvql7vH+gVY/ 5dss8EmcnNAnLhrp2SflFfUNCRYBfxmnBs1l6zE4NWPhtYx8FsPk/RLiHPytXAtQayD+ JmLvaLHWmROycLmOlx7j2PrmveCnzCiUTp+2sVfADUnTtG1ZAVmFmjxUxN40+D83fdA8 R8IuyxfA/86ECuKKKDT+xGYKdu+gQXELiXWrIHHHBssLeob44ei55TJDn2z1UUOIjowA d42aBvo/wfAJ2xf3V6tXm6aVPxOo9owtQPCb+JgNg7M8eqR834mzmkGfe1m1YOwufRqk Bj/g== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=sTt4IustaYWqtf43/+p8t7gMS/7f10DukH4cFzdIOfE=; fh=FE7B1ERpZSIuP4SEAh5GhqyQBeaUXml+spfXxHRs2UA=; b=EXkP2BnJDNE31CD3QGTLDRkA1AKB2rX1oGrDzO8Kg2XzCcAw+3TUpUtyvK+R30+Kl4 tM5t2cFJJqi/YPSJdDtmMXuDbW2/SrBG8GyreJtI/9UvpnIm8U5QY9yHqpFvWNCf9Pf6 VUdtcq6ICgJztGaUGti69G1a7jf1U6QNqVB36aYV5A9kBGxDuu1XAhZt3glDEoYRU5BE qR8FUasBmUgMZVj1sa0MtLJ8Ix7ANLb5zlmjUTQwGGI9u/M7dZXUP8pxdUf/nah3CkmC lJOYA6M9X136d2x+Ms8VFTP/BVngTT4DBz4fsgH8njR4o+Dt6t2EWGipe0E7XaH9px2D NEuw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=AYcHVGRT; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-51192-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-51192-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com X-Forwarded-Encrypted: i=1; AJvYcCXMDKnitaDDnTQQFtOO+4nIFLpjG/qGy481SjbIGYrTxzi2S+9Ls3isPNGldRJH7owxh/HnxJ1Nwtr7tMFJEoXWrsSQjg== Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [147.75.48.161]) by mx.google.com with ESMTPS id w23-20020aa78597000000b006dda13478d1si3289807pfn.359.2024.02.03.08.58.33 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Feb 2024 08:58:33 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-51192-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) client-ip=147.75.48.161; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=AYcHVGRT; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-51192-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-51192-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id EFC4BB24E13 for ; Sat, 3 Feb 2024 16:55:10 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B6A735FF06; Sat, 3 Feb 2024 16:53:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="AYcHVGRT" Received: from mail-io1-f42.google.com (mail-io1-f42.google.com [209.85.166.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C599E5FBB7; Sat, 3 Feb 2024 16:53:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706979226; cv=none; b=rQY7kBUprKP+JoajFx7KmGKVOj6xTrEnvzxVU+9/Q9k3SZJAp48Bn0Qbv8OiJV2lEovUGMVEGYPA6Z0m0IHrJo5lXW8JadjcOL2s6edSTd6M+czoggoqa44gL1ap6SpwK+dO9t8hJ5hsUVqe8MCpwLZHNhQYETrKGNpEwJTBpDc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706979226; c=relaxed/simple; bh=3og9jY2jsM92w2Vwj2T57h5hMsTDq2VKhiryF9bEL/0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Rhp+DitTPYIn67EjOhNa9JlhgK3kWcLsxJn5hT0mYklXNKV+cBc5QNA260BM3gJLRxppx8V1+P5dUvtMLE0E5l0Fv8z6mlvLiUMe8cC5qTNOGdWeCKDCSkRR7PhFynj2ElkCnYiiI7FKSRwCFlH6aToyyJOP8tMngGIoGEndVM4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=AYcHVGRT; arc=none smtp.client-ip=209.85.166.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-io1-f42.google.com with SMTP id ca18e2360f4ac-7c029beb8efso37213539f.0; Sat, 03 Feb 2024 08:53:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706979223; x=1707584023; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=sTt4IustaYWqtf43/+p8t7gMS/7f10DukH4cFzdIOfE=; b=AYcHVGRTAv1UP1ec6xSCJOCYSW8t17vQRlL55pWtMyKZOv+P2BsFysBOcYvUOZ0ey+ 3A+A7eslBE/89ie1AalqyIsekCX8y06LiUmZXPcS6dempZvBzeuRepfZM9OJuSB21IBZ ZkYx85OBg0hIJWQ2SPPv2W/vAjI4+spW7j8G8FaZffYtQuxxZfum+lWC4No34DpXT8aa pZcb4z5kxOfLZw4dAfsQ94SUD0c3UjFNxS50ili/2P0O45rE1X7h5QGzAWDUBBQWFe+z 8h5ubn+71N52kSlamldSU1jsm0WQT+qQ0I1i7k7Zncselvnce0mbdwkC/0QcE5rJEm+s WrOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706979223; x=1707584023; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=sTt4IustaYWqtf43/+p8t7gMS/7f10DukH4cFzdIOfE=; b=kCYgxxoCrht5irLEUalkYlZok7YRvw2+lpBYR+vM26h14L3rOZb7VcFcBWmUy6VTGn grI1/Jo1vy3zHex3PvTFlVUBg3W5dArNPAXnSxciOVY+s8TNim3lleHV5JP3HSjb44qP Ut0a+v+ieOIVhETQzQ5VVykxhraHt4/3Cx682CKiE2uh4dxAiEEe+5DrjeOtkjPKah1H 0YaxqM1ulvt8IjmVzp/sVL76Vf35w1gmYE2GPI4hQ/Ku8HwAa+Xc3PKJr8n1MzZeedzi SlEFcgelOZ42evb77qfAcXtF3fvRjqVsMlFJ2ryZ3V9fBHzek1WxRkTFQMTiGmJkAUpb mTNw== X-Gm-Message-State: AOJu0YzKnmJMwcyldrMvwuwQ7RXDHQlKQbgpJSLzbKefvzcxFPvYy8MU 9tDV1CRLRtswuqi9naiuC1aKIrHvJyJ3eAlSMv1HUGCEUxo57iBH X-Received: by 2002:a05:6602:1549:b0:7c0:3d0f:b7cf with SMTP id h9-20020a056602154900b007c03d0fb7cfmr1459386iow.8.1706979222475; Sat, 03 Feb 2024 08:53:42 -0800 (PST) X-Forwarded-Encrypted: i=0; AJvYcCXKufmlinHDuxRoWwZ8laTspUhQscwgvcjE5WqzVcaL+HG8o+QTOZekKNUncYftgZYRsS26IMoJJlEtJlbKJ9usp1Rnw2LKqBrU1fz8S3kisR4l8vxGo1Dj1LRaeqBtfch+2/TvaWmYXwSPxykgTayaloVlrpRLN40wmoCjPNpc7+0AiQ0CLMuflwNRZ8+PLQaG+UJT/ICfCXWbd0Xjf9zJLl1C4HH49JNs76dHIE8aznpfSq0MkniUNTdXODmE8pyo5Oe3S0n+jil2E50EBK2iwwPVY8Ma6imDEnPWCOuK1Z9QD7fwODW/CwAQZvP6iTGQ8qeVn1Gebsj2Ya2Umjzta/r2V9PN9VZnGtWqn7PmrFImaK28r2jRxixjOjzXem42TqkDWfe0Fm9olG0SHaNmO4r5N1iZ4EdrWasqjIDGLWYf13JeSSeJa85FGiP1GnPNz4mxg+k9Quehg6g+wEicL3Ja8oKtIbAAhdlcyzMqqza+cCX39dc7X7QVpLmsHFP5+yaCgeQXER5JJ95zpewOYeOttWUYJwCZqkXpEs/1KtBX4KGDGuJAGqkOtNj8aaiRImk3ezdD3P1g2USQQwyLMNxDWSqJ8YiTKf/pQvI1JGQDBc+ZMKQJYiLUrmiIuJ9K4CYvdSMbVygPqeBJKB44GHtg8/dX2FJBE5WiBuJNcMvTiGy0VOpFy6XrgxlnGR/wsRz5VJCddYYwZw2L87Oome6jyA2EQYOX22RmQSIHuRINW3n3SpboXwgzhT6kTFnhOvKki+3nBGR87hNRcsyxqFmhJZ7EO1gRcVB8ZbCAn7W/SE3838nKhxJUCxMTq7bu4DqpA4sPqr5AsIdMxHOZNvb46snKyozFivPlev0LnqfQnMDa1LhBNU9Hxl2lMFetxxqcht365fYEj/UpMJ6xueztmUunGnZ5atkziXdk5WZ8JYTTy54xy6nBdnkYwxjUvT C0UjN28EhI7I0mT13lI28H5KAjyUMgFpwiAJX6QBnXibQ9Dzi2w01LHsw2yGFc7eTilcxzCB8IeUpeHtXc3OIv2oyTP7pgUza4289YJqyP/0C03fFhNZD8QGCtznXx0OEuaVO+QbrfXek2QH5bbY9pM6TfEWi3TwTN2A43ojLDJW+NMvzdTdKYU2C2ORpFnQdO5XCNjGGKGFadsfzhhi8llUKVTejPvg== Received: from aford-System-Version.lan ([2601:447:d002:5be:d9b2:bb4f:5531:6aa9]) by smtp.gmail.com with ESMTPSA id t30-20020a05663836de00b00470b29b82b1sm1086256jau.154.2024.02.03.08.53.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Feb 2024 08:53:39 -0800 (PST) From: Adam Ford To: linux-arm-kernel@lists.infradead.org Cc: marex@denx.de, alexander.stein@ew.tq-group.com, frieder.schrempf@kontron.de, Lucas Stach , Adam Ford , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , David Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , Philipp Zabel , Vinod Koul , Kishon Vijay Abraham I , Catalin Marinas , Will Deacon , Liu Ying , Ulf Hansson , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-pm@vger.kernel.org Subject: [PATCH V8 02/12] phy: freescale: add Samsung HDMI PHY Date: Sat, 3 Feb 2024 10:52:42 -0600 Message-ID: <20240203165307.7806-3-aford173@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240203165307.7806-1-aford173@gmail.com> References: <20240203165307.7806-1-aford173@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1789897750221359645 X-GMAIL-MSGID: 1789897750221359645 From: Lucas Stach This adds the driver for the Samsung HDMI PHY found on the i.MX8MP SoC. Signed-off-by: Lucas Stach Signed-off-by: Adam Ford Tested-by: Alexander Stein --- V4: Make lookup table hex values lower case. V3: Re-order the Makefile to keep it alphabetical Remove unused defines V2: Fixed some whitespace found from checkpatch Change error handling when enabling apbclk to use dev_err_probe Rebase on Linux-Next I (Adam) tried to help move this along, so I took Lucas' patch and attempted to apply fixes based on feedback. I don't have all the history, so apologies for that. --- drivers/phy/freescale/Kconfig | 6 + drivers/phy/freescale/Makefile | 1 + drivers/phy/freescale/phy-fsl-samsung-hdmi.c | 1075 ++++++++++++++++++ 3 files changed, 1082 insertions(+) create mode 100644 drivers/phy/freescale/phy-fsl-samsung-hdmi.c diff --git a/drivers/phy/freescale/Kconfig b/drivers/phy/freescale/Kconfig index 853958fb2c06..5c2b73042dfc 100644 --- a/drivers/phy/freescale/Kconfig +++ b/drivers/phy/freescale/Kconfig @@ -35,6 +35,12 @@ config PHY_FSL_IMX8M_PCIE Enable this to add support for the PCIE PHY as found on i.MX8M family of SOCs. +config PHY_FSL_SAMSUNG_HDMI_PHY + tristate "Samsung HDMI PHY support" + depends on OF && HAS_IOMEM + help + Enable this to add support for the Samsung HDMI PHY in i.MX8MP. + endif config PHY_FSL_LYNX_28G diff --git a/drivers/phy/freescale/Makefile b/drivers/phy/freescale/Makefile index cedb328bc4d2..79e5f16d3ce8 100644 --- a/drivers/phy/freescale/Makefile +++ b/drivers/phy/freescale/Makefile @@ -4,3 +4,4 @@ obj-$(CONFIG_PHY_MIXEL_LVDS_PHY) += phy-fsl-imx8qm-lvds-phy.o obj-$(CONFIG_PHY_MIXEL_MIPI_DPHY) += phy-fsl-imx8-mipi-dphy.o obj-$(CONFIG_PHY_FSL_IMX8M_PCIE) += phy-fsl-imx8m-pcie.o obj-$(CONFIG_PHY_FSL_LYNX_28G) += phy-fsl-lynx-28g.o +obj-$(CONFIG_PHY_FSL_SAMSUNG_HDMI_PHY) += phy-fsl-samsung-hdmi.o diff --git a/drivers/phy/freescale/phy-fsl-samsung-hdmi.c b/drivers/phy/freescale/phy-fsl-samsung-hdmi.c new file mode 100644 index 000000000000..bf0e2299d00f --- /dev/null +++ b/drivers/phy/freescale/phy-fsl-samsung-hdmi.c @@ -0,0 +1,1075 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2020 NXP + * Copyright 2022 Pengutronix, Lucas Stach + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PHY_REG_33 0x84 +#define REG33_MODE_SET_DONE BIT(7) +#define REG33_FIX_DA BIT(1) + +#define PHY_REG_34 0x88 +#define REG34_PHY_READY BIT(7) +#define REG34_PLL_LOCK BIT(6) +#define REG34_PHY_CLK_READY BIT(5) + + +#define PHY_PLL_REGS_NUM 48 + +struct phy_config { + u32 clk_rate; + u8 regs[PHY_PLL_REGS_NUM]; +}; + +const struct phy_config phy_pll_cfg[] = { + { 22250000, { + 0x00, 0xd1, 0x4b, 0xf1, 0x89, 0x88, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0x15, 0x25, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8f, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 23750000, { + 0x00, 0xd1, 0x50, 0xf1, 0x86, 0x85, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0x03, 0x25, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8f, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 24000000, { + 0x00, 0xd1, 0x50, 0xf0, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0x01, 0x25, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8f, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 24024000, { + 0x00, 0xd1, 0x50, 0xf1, 0x99, 0x02, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0x00, 0x25, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8f, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 25175000, { + 0x00, 0xd1, 0x54, 0xfc, 0xcc, 0x91, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0xf5, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8f, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 25200000, { + 0x00, 0xd1, 0x54, 0xf0, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0xf4, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8f, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 26750000, { + 0x00, 0xd1, 0x5a, 0xf2, 0x89, 0x88, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0xe6, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8f, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 27000000, { + 0x00, 0xd1, 0x5a, 0xf0, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0xe4, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8f, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 27027000, { + 0x00, 0xd1, 0x5a, 0xf2, 0xfd, 0x0c, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0xe4, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8f, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 29500000, { + 0x00, 0xd1, 0x62, 0xf4, 0x95, 0x08, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0xd1, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8f, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 30750000, { + 0x00, 0xd1, 0x66, 0xf4, 0x82, 0x01, 0x88, 0x45, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0xc8, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8f, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 30888000, { + 0x00, 0xd1, 0x66, 0xf4, 0x99, 0x18, 0x88, 0x45, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0xc7, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8f, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 33750000, { + 0x00, 0xd1, 0x70, 0xf4, 0x82, 0x01, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0xb7, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8f, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 35000000, { + 0x00, 0xd1, 0x58, 0xb8, 0x8b, 0x88, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0xb0, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8b, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 36000000, { + 0x00, 0xd1, 0x5a, 0xb0, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0xab, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8b, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 36036000, { + 0x00, 0xd1, 0x5a, 0xb2, 0xfd, 0x0c, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0xab, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8b, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 40000000, { + 0x00, 0xd1, 0x64, 0xb0, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0x9a, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x8b, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 43200000, { + 0x00, 0xd1, 0x5a, 0x90, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0x8f, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x89, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 43243200, { + 0x00, 0xd1, 0x5a, 0x92, 0xfd, 0x0c, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0x8f, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x89, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 44500000, { + 0x00, 0xd1, 0x5c, 0x92, 0x98, 0x11, 0x84, 0x41, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0x8b, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x89, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 47000000, { + 0x00, 0xd1, 0x62, 0x94, 0x95, 0x82, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0x83, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x89, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 47500000, { + 0x00, 0xd1, 0x63, 0x96, 0xa1, 0x82, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x00, 0x82, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x89, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 50349650, { + 0x00, 0xd1, 0x54, 0x7c, 0xc3, 0x8f, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xf5, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x87, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 50400000, { + 0x00, 0xd1, 0x54, 0x70, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xf4, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x87, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 53250000, { + 0x00, 0xd1, 0x58, 0x72, 0x84, 0x03, 0x82, 0x41, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xe7, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x87, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 53500000, { + 0x00, 0xd1, 0x5a, 0x72, 0x89, 0x88, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xe6, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x87, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 54000000, { + 0x00, 0xd1, 0x5a, 0x70, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xe4, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x87, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 54054000, { + 0x00, 0xd1, 0x5a, 0x72, 0xfd, 0x0c, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xe4, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x87, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 59000000, { + 0x00, 0xd1, 0x62, 0x74, 0x95, 0x08, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xd1, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x87, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 59340659, { + 0x00, 0xd1, 0x62, 0x74, 0xdb, 0x52, 0x88, 0x47, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xd0, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x87, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 59400000, { + 0x00, 0xd1, 0x63, 0x70, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xcf, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x87, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 61500000, { + 0x00, 0xd1, 0x66, 0x74, 0x82, 0x01, 0x88, 0x45, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xc8, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x87, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 63500000, { + 0x00, 0xd1, 0x69, 0x74, 0x89, 0x08, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xc2, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x87, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 67500000, { + 0x00, 0xd1, 0x54, 0x52, 0x87, 0x03, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xb7, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x85, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 70000000, { + 0x00, 0xd1, 0x58, 0x58, 0x8b, 0x88, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xb0, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x85, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 72000000, { + 0x00, 0xd1, 0x5a, 0x50, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xab, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x85, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 72072000, { + 0x00, 0xd1, 0x5a, 0x52, 0xfd, 0x0c, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xab, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x85, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 74176000, { + 0x00, 0xd1, 0x5d, 0x58, 0xdb, 0xa2, 0x88, 0x41, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xa6, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x85, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 74250000, { + 0x00, 0xd1, 0x5c, 0x52, 0x90, 0x0d, 0x84, 0x41, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0xa6, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x85, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 78500000, { + 0x00, 0xd1, 0x62, 0x54, 0x87, 0x01, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0x9d, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x85, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 80000000, { + 0x00, 0xd1, 0x64, 0x50, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0x9a, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x85, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 82000000, { + 0x00, 0xd1, 0x66, 0x54, 0x82, 0x01, 0x88, 0x45, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0x96, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x85, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 82500000, { + 0x00, 0xd1, 0x67, 0x54, 0x88, 0x01, 0x90, 0x49, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0x95, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x85, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 89000000, { + 0x00, 0xd1, 0x70, 0x54, 0x84, 0x83, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0x8b, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x85, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 90000000, { + 0x00, 0xd1, 0x70, 0x54, 0x82, 0x01, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0x89, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x85, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 94000000, { + 0x00, 0xd1, 0x4e, 0x32, 0xa7, 0x10, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0x83, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 95000000, { + 0x00, 0xd1, 0x50, 0x31, 0x86, 0x85, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0x82, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 98901099, { + 0x00, 0xd1, 0x52, 0x3a, 0xdb, 0x4c, 0x88, 0x47, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0x7d, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 99000000, { + 0x00, 0xd1, 0x52, 0x32, 0x82, 0x01, 0x88, 0x47, + 0x4f, 0x30, 0x33, 0x65, 0x10, 0x7d, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 100699300, { + 0x00, 0xd1, 0x54, 0x3c, 0xc3, 0x8f, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xf5, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 100800000, { + 0x00, 0xd1, 0x54, 0x30, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xf4, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 102500000, { + 0x00, 0xd1, 0x55, 0x32, 0x8c, 0x05, 0x90, 0x4b, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xf0, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 104750000, { + 0x00, 0xd1, 0x57, 0x32, 0x98, 0x07, 0x90, 0x49, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xeb, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 106500000, { + 0x00, 0xd1, 0x58, 0x32, 0x84, 0x03, 0x82, 0x41, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xe7, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 107000000, { + 0x00, 0xd1, 0x5a, 0x32, 0x89, 0x88, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xe6, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 108000000, { + 0x00, 0xd1, 0x5a, 0x30, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xe4, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 108108000, { + 0x00, 0xd1, 0x5a, 0x32, 0xfd, 0x0c, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xe4, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 118000000, { + 0x00, 0xd1, 0x62, 0x34, 0x95, 0x08, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xd1, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 118800000, { + 0x00, 0xd1, 0x63, 0x30, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xcf, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 123000000, { + 0x00, 0xd1, 0x66, 0x34, 0x82, 0x01, 0x88, 0x45, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xc8, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 127000000, { + 0x00, 0xd1, 0x69, 0x34, 0x89, 0x08, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xc2, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 135000000, { + 0x00, 0xd1, 0x70, 0x34, 0x82, 0x01, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xb7, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 135580000, { + 0x00, 0xd1, 0x71, 0x39, 0xe9, 0x82, 0x9c, 0x5b, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xb6, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 137520000, { + 0x00, 0xd1, 0x72, 0x38, 0x99, 0x10, 0x85, 0x41, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xb3, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 138750000, { + 0x00, 0xd1, 0x73, 0x35, 0x88, 0x05, 0x90, 0x4d, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xb2, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 140000000, { + 0x00, 0xd1, 0x75, 0x36, 0xa7, 0x90, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xb0, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 144000000, { + 0x00, 0xd1, 0x78, 0x30, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xab, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 148352000, { + 0x00, 0xd1, 0x7b, 0x35, 0xdb, 0x39, 0x90, 0x45, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xa6, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 148500000, { + 0x00, 0xd1, 0x7b, 0x35, 0x84, 0x03, 0x90, 0x45, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xa6, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x83, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 154000000, { + 0x00, 0xd1, 0x40, 0x18, 0x83, 0x01, 0x00, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0xa0, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 157000000, { + 0x00, 0xd1, 0x41, 0x11, 0xa7, 0x14, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0x9d, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 160000000, { + 0x00, 0xd1, 0x42, 0x12, 0xa1, 0x20, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0x9a, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 162000000, { + 0x00, 0xd1, 0x43, 0x18, 0x8b, 0x08, 0x96, 0x55, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0x98, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 164000000, { + 0x00, 0xd1, 0x45, 0x11, 0x83, 0x82, 0x90, 0x4b, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0x96, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 165000000, { + 0x00, 0xd1, 0x45, 0x11, 0x84, 0x81, 0x90, 0x4b, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0x95, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 180000000, { + 0x00, 0xd1, 0x4b, 0x10, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0x89, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 185625000, { + 0x00, 0xd1, 0x4e, 0x12, 0x9a, 0x95, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0x85, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 188000000, { + 0x00, 0xd1, 0x4e, 0x12, 0xa7, 0x10, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0x83, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 198000000, { + 0x00, 0xd1, 0x52, 0x12, 0x82, 0x01, 0x88, 0x47, + 0x4f, 0x30, 0x33, 0x65, 0x20, 0x7d, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 205000000, { + 0x00, 0xd1, 0x55, 0x12, 0x8c, 0x05, 0x90, 0x4b, + 0x4f, 0x30, 0x33, 0x65, 0x30, 0xf0, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 209500000, { + 0x00, 0xd1, 0x57, 0x12, 0x98, 0x07, 0x90, 0x49, + 0x4f, 0x30, 0x33, 0x65, 0x30, 0xeb, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 213000000, { + 0x00, 0xd1, 0x58, 0x12, 0x84, 0x03, 0x82, 0x41, + 0x4f, 0x30, 0x33, 0x65, 0x30, 0xe7, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 216000000, { + 0x00, 0xd1, 0x5a, 0x10, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x30, 0xe4, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 216216000, { + 0x00, 0xd1, 0x5a, 0x12, 0xfd, 0x0c, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x30, 0xe4, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 237600000, { + 0x00, 0xd1, 0x63, 0x10, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x30, 0xcf, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 254000000, { + 0x00, 0xd1, 0x69, 0x14, 0x89, 0x08, 0x80, 0x40, + 0x4f, 0x30, 0x33, 0x65, 0x30, 0xc2, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 277500000, { + 0x00, 0xd1, 0x73, 0x15, 0x88, 0x05, 0x90, 0x4d, + 0x4f, 0x30, 0x33, 0x65, 0x30, 0xb2, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 288000000, { + 0x00, 0xd1, 0x78, 0x10, 0x00, 0x00, 0x80, 0x00, + 0x4f, 0x30, 0x33, 0x65, 0x30, 0xab, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, { + 297000000, { + 0x00, 0xd1, 0x7b, 0x15, 0x84, 0x03, 0x90, 0x45, + 0x4f, 0x30, 0x33, 0x65, 0x30, 0xa6, 0x24, 0x80, + 0x6c, 0xf2, 0x67, 0x00, 0x10, 0x81, 0x30, 0x32, + 0x60, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x83, 0x0f, 0x3e, 0xf8, 0x00, 0x00, + }, + }, +}; + +struct fsl_samsung_hdmi_phy { + struct device *dev; + void __iomem *regs; + struct clk *apbclk; + struct clk *refclk; + + /* clk provider */ + struct clk_hw hw; + const struct phy_config *cur_cfg; +}; + +static inline struct fsl_samsung_hdmi_phy * +to_fsl_samsung_hdmi_phy(struct clk_hw *hw) +{ + return container_of(hw, struct fsl_samsung_hdmi_phy, hw); +} + +static int fsl_samsung_hdmi_phy_configure(struct fsl_samsung_hdmi_phy *phy, + const struct phy_config *cfg) +{ + int i, ret; + u8 val; + + /* HDMI PHY init */ + writeb(REG33_FIX_DA, phy->regs + PHY_REG_33); + + for (i = 0; i < PHY_PLL_REGS_NUM; i++) + writeb(cfg->regs[i], phy->regs + i * 4); + + writeb(REG33_FIX_DA | REG33_MODE_SET_DONE, phy->regs + PHY_REG_33); + + ret = readb_poll_timeout(phy->regs + PHY_REG_34, val, + val & REG34_PLL_LOCK, + 50, 20000); + if (ret) + dev_err(phy->dev, "PLL failed to lock\n"); + + return ret; +} + +static unsigned long phy_clk_recalc_rate(struct clk_hw *hw, + unsigned long parent_rate) +{ + struct fsl_samsung_hdmi_phy *phy = to_fsl_samsung_hdmi_phy(hw); + + if (!phy->cur_cfg) + return 74250000; + + return phy->cur_cfg->clk_rate; +} + +static long phy_clk_round_rate(struct clk_hw *hw, + unsigned long rate, unsigned long *parent_rate) +{ + int i; + + for (i = ARRAY_SIZE(phy_pll_cfg) - 1; i >= 0; i--) + if (phy_pll_cfg[i].clk_rate <= rate) + return phy_pll_cfg[i].clk_rate; + + return -EINVAL; +} + +static int phy_clk_set_rate(struct clk_hw *hw, + unsigned long rate, unsigned long parent_rate) +{ + struct fsl_samsung_hdmi_phy *phy = to_fsl_samsung_hdmi_phy(hw); + int i; + + for (i = ARRAY_SIZE(phy_pll_cfg) - 1; i >= 0; i--) + if (phy_pll_cfg[i].clk_rate <= rate) + break; + + if (i < 0) + return -EINVAL; + + phy->cur_cfg = &phy_pll_cfg[i]; + + return fsl_samsung_hdmi_phy_configure(phy, phy->cur_cfg); +} + +static const struct clk_ops phy_clk_ops = { + .recalc_rate = phy_clk_recalc_rate, + .round_rate = phy_clk_round_rate, + .set_rate = phy_clk_set_rate, +}; + +static int phy_clk_register(struct fsl_samsung_hdmi_phy *phy) +{ + struct device *dev = phy->dev; + struct device_node *np = dev->of_node; + struct clk_init_data init; + const char *parent_name; + struct clk *phyclk; + int ret; + + parent_name = __clk_get_name(phy->refclk); + + init.parent_names = &parent_name; + init.num_parents = 1; + init.flags = 0; + init.name = "hdmi_pclk"; + init.ops = &phy_clk_ops; + + phy->hw.init = &init; + + phyclk = devm_clk_register(dev, &phy->hw); + if (IS_ERR(phyclk)) + return dev_err_probe(dev, PTR_ERR(phyclk), + "failed to register clock\n"); + + ret = of_clk_add_provider(np, of_clk_src_simple_get, phyclk); + if (ret) + return dev_err_probe(dev, ret, + "failed to register clock provider\n"); + + return 0; +} + +static int fsl_samsung_hdmi_phy_probe(struct platform_device *pdev) +{ + struct fsl_samsung_hdmi_phy *phy; + int ret; + + phy = devm_kzalloc(&pdev->dev, sizeof(*phy), GFP_KERNEL); + if (!phy) + return -ENOMEM; + + platform_set_drvdata(pdev, phy); + phy->dev = &pdev->dev; + + phy->regs = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(phy->regs)) + return PTR_ERR(phy->regs); + + phy->apbclk = devm_clk_get(phy->dev, "apb"); + if (IS_ERR(phy->apbclk)) + return dev_err_probe(phy->dev, PTR_ERR(phy->apbclk), + "failed to get apb clk\n"); + + phy->refclk = devm_clk_get(phy->dev, "ref"); + if (IS_ERR(phy->refclk)) + return dev_err_probe(phy->dev, PTR_ERR(phy->refclk), + "failed to get ref clk\n"); + + ret = clk_prepare_enable(phy->apbclk); + if (ret) { + dev_err(phy->dev, "failed to enable apbclk\n"); + return ret; + } + + pm_runtime_get_noresume(phy->dev); + pm_runtime_set_active(phy->dev); + pm_runtime_enable(phy->dev); + + ret = phy_clk_register(phy); + if (ret) { + dev_err(&pdev->dev, "register clk failed\n"); + goto register_clk_failed; + } + + pm_runtime_put(phy->dev); + + return 0; + +register_clk_failed: + clk_disable_unprepare(phy->apbclk); + + return ret; +} + +static int fsl_samsung_hdmi_phy_remove(struct platform_device *pdev) +{ + of_clk_del_provider(pdev->dev.of_node); + + return 0; +} + +#ifdef CONFIG_PM +static int fsl_samsung_hdmi_phy_suspend(struct device *dev) +{ + struct fsl_samsung_hdmi_phy *phy = dev_get_drvdata(dev); + + clk_disable_unprepare(phy->apbclk); + + return 0; +} + +static int fsl_samsung_hdmi_phy_resume(struct device *dev) +{ + struct fsl_samsung_hdmi_phy *phy = dev_get_drvdata(dev); + int ret = 0; + + ret = clk_prepare_enable(phy->apbclk); + if (ret) { + dev_err(phy->dev, "failed to enable apbclk\n"); + return ret; + } + + if (phy->cur_cfg) + ret = fsl_samsung_hdmi_phy_configure(phy, phy->cur_cfg); + + return ret; + +} +#endif + +static const struct dev_pm_ops fsl_samsung_hdmi_phy_pm_ops = { + SET_RUNTIME_PM_OPS(fsl_samsung_hdmi_phy_suspend, + fsl_samsung_hdmi_phy_resume, NULL) + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) +}; + +static const struct of_device_id fsl_samsung_hdmi_phy_of_match[] = { + { + .compatible = "fsl,imx8mp-hdmi-phy", + }, { + /* sentinel */ + } +}; +MODULE_DEVICE_TABLE(of, fsl_samsung_hdmi_phy_of_match); + +static struct platform_driver fsl_samsung_hdmi_phy_driver = { + .probe = fsl_samsung_hdmi_phy_probe, + .remove = fsl_samsung_hdmi_phy_remove, + .driver = { + .name = "fsl-samsung-hdmi-phy", + .of_match_table = fsl_samsung_hdmi_phy_of_match, + .pm = &fsl_samsung_hdmi_phy_pm_ops, + }, +}; +module_platform_driver(fsl_samsung_hdmi_phy_driver); + +MODULE_AUTHOR("Sandor Yu "); +MODULE_DESCRIPTION("SAMSUNG HDMI 2.0 Transmitter PHY Driver"); +MODULE_LICENSE("GPL v2"); From patchwork Sat Feb 3 16:52:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Ford X-Patchwork-Id: 196340 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:9bc1:b0:106:209c:c626 with SMTP id op1csp1107587dyc; Sat, 3 Feb 2024 08:54:54 -0800 (PST) X-Google-Smtp-Source: AGHT+IFq6E2dZyxQsmXpiXWm8fItyO6mPqnE9ErBeh4gCZcbyf7J0ZViVg6B2pFKoZhlM9CQHaWR X-Received: by 2002:a17:902:d551:b0:1d9:4883:b3a5 with SMTP id z17-20020a170902d55100b001d94883b3a5mr9878826plf.46.1706979294718; Sat, 03 Feb 2024 08:54:54 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706979294; cv=pass; d=google.com; s=arc-20160816; b=mP/bdne66auR3sD5kqrrZeQNQc9AduEUsJyFyQ02E070gIrWMRVbs8xPJkP9Dwf5Ta kYC4vCET8OBezHH1VRRq+O9hhjWcoBXJ3zH6A6/I4gUGRNbJYDCmKdNp65CYo/C49vac ye8rw70NvxugAKtjdABCB0Wve/eICnHvO7DF39jRYUe3l4UtujGWZOzp2yAJyFzadVJY DaTrmxNVY5NjZw45ul0y+FxiSOuDYdvFf9lxFKo9AKAxJeumqxVfcHEFPcIDbvI0SdvA t3fQu7JCiB4Fz2RSfvyCUfl1q3GPB+clHZbh/MBLMRMSBc4wLL5eoWijhiBaT+eQmye8 OaPQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=5yxNJ6iw10E/jIc+eH30kqf5Ccz8IbGrYAyBw9Fu8JA=; fh=aUXDb6yfG1K0tYjdt8RuIeFvxm98AFHNUtQLF2/8hYc=; b=xn8trS35WT6hU8k6aIXOpOm7Dt+8LFesl7/ZvpyYCuinpOOF6HHDguVMrD5YJywZDl evEJdxA1ry5S5Gn0H49RHX9hWTBvEpMYmFVhxJyci2ND2x7oljsInuSH5h1W/uh18yH7 Z7MP8PVGhaIQv16OgzPGRs78XGD27nmcQlbKvBLPxnZ9YPBpaCbTzjg3XRN2W+GVD2FY CNqroQiTE0YR22oQRE1p1xIeimhk9NDw0VWELcysoPamUh0A/eBeAcv27DMl+RnDQ4lV 4Kw3RXkdhVDvOhxDRE6vBdbEGg/1345O1oXmxY/FiopN8Xgadb6MEHgwlcX9/tc/2zfv E70A==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=L5aJstub; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-51193-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-51193-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com X-Forwarded-Encrypted: i=1; AJvYcCXp4dkUx/nGRYc+yfm4Z1S4qZeG0aldGFULlLpD3CwLNcbdso5c/1uxjOh7AG2vzmtKAkLYirle5qCiueoFDk5ABkd4iA== Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id m12-20020a1709026bcc00b001d751b91dc8si3411881plt.460.2024.02.03.08.54.54 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Feb 2024 08:54:54 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-51193-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=L5aJstub; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-51193-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-51193-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 77B70284A21 for ; Sat, 3 Feb 2024 16:54:54 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 1916E5FDC3; Sat, 3 Feb 2024 16:53:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="L5aJstub" Received: from mail-io1-f41.google.com (mail-io1-f41.google.com [209.85.166.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 084A35F86A; Sat, 3 Feb 2024 16:53:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706979230; cv=none; b=UXD38hYQs/nUvZ+LTYWGSu89+tTDQuLyvXABhYv6ukq6Bv7yRH/iSILC6zLACr3ZqiTfGd2LCle0hYaLerhZwQvWz4QkQ0fcu6xDA6p3WhqZSBwK4IFTok0zRFJ+TEeWsNr+HP+SLgQnkUfEwQeeiPBzbojBEECNnsEASt1qhrk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706979230; c=relaxed/simple; bh=7gxlqI2KBqsjjbAbNX4A60KwR09PCFX3HAv9XPpjNmU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BNefi+HOs3QXwCUnMy+8ZlnuaFefNUIdvxV75suiqZ3OMzM7HnBiil7ezfcBmk/26BLklDzaZanAi5DC3noGBPxnHbe8rLl5unT2mZR2VKe4UQX0pazqE6I4oBC5LJpRY/7896J+Ab/Stl3XEabxeKrnCf0TzI6ZMjxvtldELC0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=L5aJstub; arc=none smtp.client-ip=209.85.166.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-io1-f41.google.com with SMTP id ca18e2360f4ac-7bb5fda069bso155219839f.0; Sat, 03 Feb 2024 08:53:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706979228; x=1707584028; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5yxNJ6iw10E/jIc+eH30kqf5Ccz8IbGrYAyBw9Fu8JA=; b=L5aJstubMykpBps/wC6wz2/fr/pBqz6K7bN1fIIZak7Gq3ERJqjVC0xklN9OuoOXaO CQP2SrU91yZRSovtYGNa4izR8+59qCB6buKNOkFF9SDfVwREyHZiyHed/g+RxY/pEcMs SuEHmfmmcAfFaTGa4Sh7hgJ70LXYckkDP1FedzWxq/mUTdBekBjQXGApB9bGSrW5to5/ Tr9waSE5AzR1zhk8X+yB1JhY6/Ac84zB/GAAxZBHDavX9ET/B2ppAguoCmMSHBOHICTX Es+1ofJPPvnURwMyEqzL1WxZfVSgq6Sr0rCxgbew92dgM+U1ZIflO21jMrlzJSfJLxWS fQLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706979228; x=1707584028; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5yxNJ6iw10E/jIc+eH30kqf5Ccz8IbGrYAyBw9Fu8JA=; b=EDn1rCnV7QpBGu8Nswj34hhQ9OnSY3vA4OUVAkYpc+YQAu38ORYTFAvfOvQe51eQdt clfm1cTD6iIzxPEXQkFUTHG/jto5L63P+YDgSfBBbcsMv4W1In0KTYz8GUW+si02p4K1 aY5oCnVl2ACfnxGGv+8hwhTFB0oOrYFeYNFKentoNhLJP6I04tUehGEk+yTpdcK/8GHt 0HwLOlxVulEFY9rZ4TzRmTNyC4Rtfdb2z9wUO0lcj/oH0LiqR+FyeVpScyTQnLa/R8xK 0N3+jAMXUV3HQ51djZ18LAeyBMXNTt1b7NfFdGcjx/wsQqX/1Z7+cPQMyvrISNrDLbVs oJSw== X-Gm-Message-State: AOJu0YxJmH9arT371qtNUniUGHEttH9+42xxdcmq9NuGXmGQ4TvBoCDN awAzuOPLT3jfQuX43Vw8HAAB+SVhKaluitPHwz9MVZyYOlr00ZFd X-Received: by 2002:a6b:c953:0:b0:7c0:1f36:b164 with SMTP id z80-20020a6bc953000000b007c01f36b164mr12895332iof.15.1706979227992; Sat, 03 Feb 2024 08:53:47 -0800 (PST) X-Forwarded-Encrypted: i=0; AJvYcCVA9CZ4OBFcoM04s5n21XZMv7Q/nxNcmPFO+x1Hx/0kUqPWvHWgXAMhmWWYSeu3FnFFbdWnIQIXkcJ8bvjPe4SRA+PEake0K2o9+SdFQVa0uhauF6xPTPbN6t02ZtR4ijMGSn6bpH/o1D/WhzSp1LNi/qJBO6dUNrXqU0xlwDLjVT0na4dfFVj0vjAP8PLreg0xiTninmHNzxkiLB59Wze+9DOg/GLsJH4TPAUkmXpKZUzkeSul4u9iC6945qk4uxoHVuI4LSZXsQ7y9qiyzP2cMlcs+JP0fV4m5o5JizP5UVba5st/J/YGP/ZOTzDmylMIzpS0bkkba+K1/9SD6wR++0T+vPbWfHEe3wJwDqVW15We868sluUY1Hc5JKoa5QMsz40Hn37WkpB/sCANoznyJeNkPi3K0n1T/KmJJtLTBr1VzyFNKujQekHA3LzIN3TrDhO1XmFYseWfskZ/6n5IdfNiFNYU3rCxUzR6aIYmogpso3AFRoUwnAgAD0esSSDoQ5MCBq/Kh1ck3wd1Rbcu77+yjr6xL/U9pQmqi4sWob0k1ENb/g9aYf8PGpWQaj0vzwjmKo3L3PWIlsYk7bF6hdeM+08pLHa75lJ0UX69ERLEVOhEQ3M+HZOzzmHwP2zGjmSVp6Yf0IOs9xqmJvw32JvuHy+LYGtkK+fWKEw6mjfAYMCyzceYBz8qtTY2se/d98gG3FunwStU6JBNtSDkTHnzjseKe9YQCCR48d63IRE/nASGuG1uzo7Bs6Sti1A252RslipIk7/QB2Is1ulD8+N+9xAvPZqDb25ghHibwI6MlFtaCx66JtMIJsw6TklhYfBvigYAeGRZ9p7yU6jsENqoAhAgA0oJsoBZdtjWtMOkjSu3Sqt+fWW5RpD+GSGtXiVhQ59kCwo59MlPjZfDiPi+XmXRKRrqekWAefFpV8tMcq30iwW+lTh+2VsESwvX7E EIkQFHHCNJraRxEphrKmY5jpUPi2se35+9fzW/8/MJU1JVMVbaJ6Ju3BDhiaaIF9ish60lHhllqGuZQdDOEY3tReKYlh46VVzGRNUoYhknSUM9+VgaYtxzn0LVe7CYPkurkr+0nTkOZ030FUw6CpdAMA2THIwB00py45S/j8jbnvTzvgVIlNAeY0tGiYKzEUfSffiU2FR9K7ClVCD3rJDx42Ni2vHIhw== Received: from aford-System-Version.lan ([2601:447:d002:5be:d9b2:bb4f:5531:6aa9]) by smtp.gmail.com with ESMTPSA id t30-20020a05663836de00b00470b29b82b1sm1086256jau.154.2024.02.03.08.53.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Feb 2024 08:53:46 -0800 (PST) From: Adam Ford To: linux-arm-kernel@lists.infradead.org Cc: marex@denx.de, alexander.stein@ew.tq-group.com, frieder.schrempf@kontron.de, Adam Ford , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , Philipp Zabel , Vinod Koul , Kishon Vijay Abraham I , Catalin Marinas , Will Deacon , Liu Ying , Ulf Hansson , Lucas Stach , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-pm@vger.kernel.org Subject: [PATCH V8 03/12] dt-bindings: soc: imx: add missing clock and power-domains to imx8mp-hdmi-blk-ctrl Date: Sat, 3 Feb 2024 10:52:43 -0600 Message-ID: <20240203165307.7806-4-aford173@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240203165307.7806-1-aford173@gmail.com> References: <20240203165307.7806-1-aford173@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1789897520644631039 X-GMAIL-MSGID: 1789897520644631039 Per guidance from the NXP downstream kernel, if the clock is disabled before HDMI/LCDIF probe, LCDIF will not get pixel clock from HDMI PHY and throw an error: [CRTC:39:crtc-2] vblank wait timed out WARNING: CPU: 2 PID: 9 at drivers/gpu/drm/drm_atomic_helper.c: 1634 drm_atomic_helper_wait_for_vblanks.part.0+0x23c/0x260 Fix this by adding the fdcc clock to the hdmi_blk_ctrl. This should be safe, since neither this power domain nor the dependent HDMI and LCDIF drivers been enabled or added to the SoC device tree yet. According to Sandor Yu from NXP, "the FDCC clock is not for HDMITX in desgin, but it is part of HDMI domain that needed by HDMITX. So I think it is reasonable added it to the power domain driver." The driver also supports two power domains which are missing from the binding that also fix an issue with resuming from suspend. Signed-off-by: Adam Ford Reviewed-by: Rob Herring --- V2: Update commit message to both show error and give a bit more background. Add missing power domains hdcp and hdrv as pointed out by Marek Vasut --- .../soc/imx/fsl,imx8mp-hdmi-blk-ctrl.yaml | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/Documentation/devicetree/bindings/soc/imx/fsl,imx8mp-hdmi-blk-ctrl.yaml b/Documentation/devicetree/bindings/soc/imx/fsl,imx8mp-hdmi-blk-ctrl.yaml index 1be4ce2a45e8..bd1cdaa4f54b 100644 --- a/Documentation/devicetree/bindings/soc/imx/fsl,imx8mp-hdmi-blk-ctrl.yaml +++ b/Documentation/devicetree/bindings/soc/imx/fsl,imx8mp-hdmi-blk-ctrl.yaml @@ -27,8 +27,8 @@ properties: const: 1 power-domains: - minItems: 8 - maxItems: 8 + minItems: 10 + maxItems: 10 power-domain-names: items: @@ -40,10 +40,12 @@ properties: - const: trng - const: hdmi-tx - const: hdmi-tx-phy + - const: hdcp + - const: hrv clocks: - minItems: 4 - maxItems: 4 + minItems: 5 + maxItems: 5 clock-names: items: @@ -51,6 +53,7 @@ properties: - const: axi - const: ref_266m - const: ref_24m + - const: fdcc interconnects: maxItems: 3 @@ -82,12 +85,15 @@ examples: clocks = <&clk IMX8MP_CLK_HDMI_APB>, <&clk IMX8MP_CLK_HDMI_ROOT>, <&clk IMX8MP_CLK_HDMI_REF_266M>, - <&clk IMX8MP_CLK_HDMI_24M>; - clock-names = "apb", "axi", "ref_266m", "ref_24m"; + <&clk IMX8MP_CLK_HDMI_24M>, + <&clk IMX8MP_CLK_HDMI_FDCC_TST>; + clock-names = "apb", "axi", "ref_266m", "ref_24m", "fdcc"; power-domains = <&pgc_hdmimix>, <&pgc_hdmimix>, <&pgc_hdmimix>, <&pgc_hdmimix>, <&pgc_hdmimix>, <&pgc_hdmimix>, - <&pgc_hdmimix>, <&pgc_hdmi_phy>; + <&pgc_hdmimix>, <&pgc_hdmi_phy>, + <&pgc_hdmimix>, <&pgc_hdmimix>; power-domain-names = "bus", "irqsteer", "lcdif", "pai", "pvi", "trng", - "hdmi-tx", "hdmi-tx-phy"; + "hdmi-tx", "hdmi-tx-phy", + "hdcp", "hrv"; #power-domain-cells = <1>; }; From patchwork Sat Feb 3 16:52:47 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Ford X-Patchwork-Id: 196341 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:9bc1:b0:106:209c:c626 with SMTP id op1csp1108087dyc; Sat, 3 Feb 2024 08:56:29 -0800 (PST) X-Google-Smtp-Source: AGHT+IFkkOi/00XC9WdVjHbjIM5tIG4AJBIG9fQ4ByAVZKDgI5biGWBs/oJGwxKeKvniNft6p7mt X-Received: by 2002:a81:ac21:0:b0:603:d575:e2e8 with SMTP id k33-20020a81ac21000000b00603d575e2e8mr8559000ywh.10.1706979389362; Sat, 03 Feb 2024 08:56:29 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706979389; cv=pass; d=google.com; s=arc-20160816; b=loxZVLtQvX2tz9u0DATH8nWK9R1KDcVEwH/OZ3laME7m8XbZHHYLpqGRN8hok5ed7z V21Nt2/cj8Aewv4b+mvCmN3LL7lDAq2laz9+la8+zco9mdakRkInGrUyQj7/cDiMdQSd R0k5PyrCPkHbgVkxPiuabX3vzYlkjpSWiHcokJPcVCCVDwyVRnxcmowOcLeAAKbWQvHe zHAhN6nmoxRiW8irmlFW17p1GRzez8rvMsVFykI+kJMWBPHy4d/RWpuQmHh5ZEq+oa5p pTIjJ5Ti6mwH+E2C/wM8sMZkLfr+kBmHcjxJnQK+oZLLVtW5YUOcoWm/muMeyzTL+egd 2Mqg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=iN7CHiElDXoarw0CBzFnW/ft9HNctCbMZzIXIZ/bUo8=; fh=hP+SPEyfPLetyiTwygd1f6ZWssDugrawkY3D5BnPULk=; b=eAr2+Ew4shmqV7D5rmlCBg8H76jSnvowBhiqM+Jfl7beZ0EF33HIoaJPHa3gmhKtR8 JJ3NjxDOUQvX/wgTxji1ppl0NBcLTTVNhNsvc7t1gjS0Cd6x8X3po8NNeHmCFRXRJfxU e8bsjOy8f4x6VnvaedDT/Ol+0zB+z5hmY73rtPKarQoV2OWswtYPd7h1jxOKMV1/mH69 pBoKXscdR15+98EOan74jMOoo5WkmTuhkA1LWHc0/yIzvTZ0U3IKW+SCpx2xFRKFJmoL 2lcN1uZJtlS2vubtzlsLNaf55gF4U7hC2Faw2JbnnIblDwkG0hAzLA+jOC5/ovNfvZ95 EnuQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=Bkil52Y3; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-51197-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-51197-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com X-Forwarded-Encrypted: i=1; AJvYcCUSwAsO1hUm1OF79K5G3nugB19eWzhMtUu8JnyR5oau0ZuIQtR2aHhhkzU9mw/xnkwwjmeNtqec/CGxF+ZX3sZcdR+V9g== Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id jh26-20020a0562141fda00b00686b151b5dasi4585735qvb.246.2024.02.03.08.56.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Feb 2024 08:56:29 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-51197-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=Bkil52Y3; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-51197-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-51197-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 019501C21FB8 for ; Sat, 3 Feb 2024 16:56:29 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 1B9C560EF1; Sat, 3 Feb 2024 16:54:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Bkil52Y3" Received: from mail-io1-f53.google.com (mail-io1-f53.google.com [209.85.166.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4EF9D60BAC; Sat, 3 Feb 2024 16:54:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706979249; cv=none; b=Vd/igfm4F7mKgkX4VUpiEyCLqhvqPc5Hb11yyqKxMYC8EZqnC4QvXkFIlDtzLVve/EPhrNKkznoJLVB1FkAoW3vqLAzq7labZtXPW97aOYjwKZ+1zY864SmmG553FDKaCzOOY6eapv4k26QieEQzlzf1yPC49V9AGLBkBYdWoxo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706979249; c=relaxed/simple; bh=kYNYlsb04jai6/LjmZrmEG8/03O2GktdBwFdXhJplJc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dsG/eH2+s8nzl3Oe/rW4VWW+Z9m9jJBTfQN6vbGhb8bYiBA+8CJAXP8i/3TQHU66Jeq71vok9pnGNfFzjyb9u1nkdjgo//ucZ7nSlvPfh3z/h6vmnrrj1YnWRYL9mSTMSPwjo9POuCsdiMudYr11CYf1TfLE7X0BVDmyBUSVMoQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Bkil52Y3; arc=none smtp.client-ip=209.85.166.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-io1-f53.google.com with SMTP id ca18e2360f4ac-7bc332d3a8cso165665739f.2; Sat, 03 Feb 2024 08:54:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706979247; x=1707584047; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=iN7CHiElDXoarw0CBzFnW/ft9HNctCbMZzIXIZ/bUo8=; b=Bkil52Y39cxW+Uf2LvG9DvcQ/u6HHvkuiPOLn94ciW9msqOfTgVwj3KrZ5bZy2h6rb UPpTvNAq+S20fUkg7BMrw1bFjdzbE/eYJDKb+j9hNZbacKkVDHD4fXtWMGlo/wocu/zt u9fVfLzXbHx4TJJmdpqcWOpZP3hNv9NVBW5+bXnCf+1c4VlzVGt0R0ArCpeY6zLsWsMZ maLVrqsTB9hKP6F9peK2dkOrsRY+QzMCdTFyNnygyPywcKGrYlUMyLt6JDw+nI/aoZIU G5aiDNsU1KX9fuLBeOONJGbjn6v0Qp7pjymgvOhWEEnPR2QyKuB37FulsLOWm6eocopO rMdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706979247; x=1707584047; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=iN7CHiElDXoarw0CBzFnW/ft9HNctCbMZzIXIZ/bUo8=; b=WIKAEXHoQ4hff3gXV3qz6go1vpj32sTvJM4HCsajXR8rSHxifETyuhb8EumgxE1qzf vBLvuIV0XwpDO2K6AdAsLl3yRv1wZQQ5b/z3h5HThqPDaC8a60JIQ5AFFAKCyy51/MG3 dlJQCJc/XqTG9CNkV15QPHcWjaG4W91ET75zCf42De8jw8TlBT7KHbiznL0rPS7+4l1b +BVG7q8qHmDQwxxeqXO/PZNYG0gEBZcCp4qLAWUEHz6qmCJl7/wZrKuHqeTdhsveiYNc FyvnQM/ZVbNXitAHqls9Lh6N7JahxNO/i7y62R4S7FY52vbiaX+xDWFoUpsa7I1Kc2qH sumQ== X-Gm-Message-State: AOJu0YztHKB6QjemGoMjfk+IdPeW8Wa0fd9jeoTr8ULgA2OBPeRAdcVH jwlWRP2tnnVOx18g/Tk7x4N8tMNaIf9abYOfIhI8cgVzAJjiyP9q X-Received: by 2002:a5e:d915:0:b0:7bc:3cb7:b68b with SMTP id n21-20020a5ed915000000b007bc3cb7b68bmr9293261iop.17.1706979247353; Sat, 03 Feb 2024 08:54:07 -0800 (PST) X-Forwarded-Encrypted: i=0; AJvYcCVWZ3cE3qI9Oj54mFr3sAnVJXSwCFl8jEzpL9ucr/wb7wJtIiD8UuODjyzAMUp0ByTuWPWRCY3gFUaj6Tl1QSSEoFmjcqHnSIJm/CcYV2fBCR2TzZs6oMwGgz5yIoAFA319P7Cu/VvHvowXSFkPvrNG9Nk/p1zhIlaMWQVBz3OSXWpNjQTYmfW/BQolQDULLpBgKPdzTdQSV0JBqGa3HHFXp7F4tkWXzXv1y6RIxVcEbZ3kiXP0iTHuyLXiXyDE4oE+kWbIvORuO/pbkidoXGyPiHMTqHlcHCP6RyLAHu+WtrTwo+g1+tIBsqmnd3WPmnxcuegvPP95EWGHrYIdQSQ5Idbi4CwazuUWx2XpS24CfIaw8kbQLVFgOMCHdlhz9Pvz9XROrEFXVxzlJ1bvLegZgn8gzI1xXH9W9HOzuq1PMFioWzwvJdcCATyJeg2qPCZ0qZmHTBpt4mrW4zoAK/0TSwlUiG4XVET3T0cSJu0+3pOg4A8dzMvmlv9bwJT/FzSWVlGCyECr0tPGwNLcgv5hJ6a0E9vBLE0gA+Zuo671skr3tDr+otnlIdQfBv84iJVTiq/BagoTPx5fjx91RezHWRZi4PLpR88/htGeuFRZKJmoFIW9O+A0i1CMkwW+tpboQCIaRk8nL/tEsGc5GwTjAYBBAYnxrTMIYXQe6J1iCDjMHb50yy0ys1CsDDDN9O/57CQQ4yNiXYw57qtRvh6wglVsdEk2/o9OSlbUtzmv5X+RKM6+Jo5v6ACtTp/2R3Kb5XJX8DBNHt8MLEpAE6H0oiw7YZMxPMfrqUrsQx0rM+vHkHSPYfqbFKv6kSt+4S7NC61JYbp/haR+aVmsLSl9dfvWtwtdXMop/gIejD9oK83qBw6/OQfe3Qd2eZvpRGa7q+KETghsHfoNPq9ANbXAHYAP1lzUKelCh9KJtcEdUT0G9eyxTOPnnWm++V0vH82B46 Op9yK3+Tazd+mB0eyGk7bUQiVbqEL1o+LnXA3pkY2OhBG/HNhjdGW/YhvFGDeSNAwHjh81LUNI122dg4+sDdF5D0ZfPnEwslU0jnCcOQ0rvvfxkXCjqSo0ypjOan2P0+R1Xtrho+l5/mS7NurD/WMxlLi/NHZGM3zN7RAGATKJEfT+oXCbdVquZgIBh5CsV6bN3/B7/E+jpc2JhNIVIy0qd4W//NRD7kGqGSt3b/48KAOc5HsaYPhWjAAPDDbPhE9SKMsAJIWwu5h+hYv8VkCh9cO6E/9aUkv7S+j0YQdt1N2R21dDVg== Received: from aford-System-Version.lan ([2601:447:d002:5be:d9b2:bb4f:5531:6aa9]) by smtp.gmail.com with ESMTPSA id t30-20020a05663836de00b00470b29b82b1sm1086256jau.154.2024.02.03.08.54.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Feb 2024 08:54:06 -0800 (PST) From: Adam Ford To: linux-arm-kernel@lists.infradead.org Cc: marex@denx.de, alexander.stein@ew.tq-group.com, frieder.schrempf@kontron.de, Lucas Stach , Laurent Pinchart , Conor Dooley , Adam Ford , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , Philipp Zabel , Vinod Koul , Kishon Vijay Abraham I , Catalin Marinas , Will Deacon , Liu Ying , Ulf Hansson , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-pm@vger.kernel.org Subject: [PATCH V8 07/12] dt-bindings: display: imx: add binding for i.MX8MP HDMI PVI Date: Sat, 3 Feb 2024 10:52:47 -0600 Message-ID: <20240203165307.7806-8-aford173@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240203165307.7806-1-aford173@gmail.com> References: <20240203165307.7806-1-aford173@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1789897620051502969 X-GMAIL-MSGID: 1789897620051502969 From: Lucas Stach Add binding for the i.MX8MP HDMI parallel video interface block. Signed-off-by: Lucas Stach Reviewed-by: Laurent Pinchart Reviewed-by: Conor Dooley Signed-off-by: Adam Ford Reviewed-by: Luca Ceresoli --- V8: Add interrupt-parent V7: No Change V6: Add s-o-b message for myself (Adam) V5: I tried to help move this along, so I took Lucas' patch and attempted to apply fixes based on feedback. I don't have all the history, so apologies for that. Removed the pipe character from the Description. Increased the register size from 0x40 to 0x44. --- .../display/imx/fsl,imx8mp-hdmi-pvi.yaml | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/imx/fsl,imx8mp-hdmi-pvi.yaml diff --git a/Documentation/devicetree/bindings/display/imx/fsl,imx8mp-hdmi-pvi.yaml b/Documentation/devicetree/bindings/display/imx/fsl,imx8mp-hdmi-pvi.yaml new file mode 100644 index 000000000000..56da1636014c --- /dev/null +++ b/Documentation/devicetree/bindings/display/imx/fsl,imx8mp-hdmi-pvi.yaml @@ -0,0 +1,84 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/imx/fsl,imx8mp-hdmi-pvi.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Freescale i.MX8MP HDMI Parallel Video Interface + +maintainers: + - Lucas Stach + +description: + The HDMI parallel video interface is a timing and sync generator block in the + i.MX8MP SoC, that sits between the video source and the HDMI TX controller. + +properties: + compatible: + const: fsl,imx8mp-hdmi-pvi + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + power-domains: + maxItems: 1 + + ports: + $ref: /schemas/graph.yaml#/properties/ports + + properties: + port@0: + $ref: /schemas/graph.yaml#/properties/port + description: Input from the LCDIF controller. + + port@1: + $ref: /schemas/graph.yaml#/properties/port + description: Output to the HDMI TX controller. + + required: + - port@0 + - port@1 + +required: + - compatible + - reg + - interrupts + - power-domains + - ports + +additionalProperties: false + +examples: + - | + #include + #include + + display-bridge@32fc4000 { + compatible = "fsl,imx8mp-hdmi-pvi"; + reg = <0x32fc4000 0x44>; + interrupt-parent = <&irqsteer_hdmi>; + interrupts = <12 IRQ_TYPE_LEVEL_HIGH>; + power-domains = <&hdmi_blk_ctrl IMX8MP_HDMIBLK_PD_PVI>; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + pvi_from_lcdif3: endpoint { + remote-endpoint = <&lcdif3_to_pvi>; + }; + }; + + port@1 { + reg = <1>; + pvi_to_hdmi_tx: endpoint { + remote-endpoint = <&hdmi_tx_from_pvi>; + }; + }; + }; + }; From patchwork Sat Feb 3 16:52:48 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Ford X-Patchwork-Id: 196344 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:9bc1:b0:106:209c:c626 with SMTP id op1csp1109611dyc; Sat, 3 Feb 2024 09:00:44 -0800 (PST) X-Google-Smtp-Source: AGHT+IERAprQ4CYdQGTjDf5idzu49qJyF/OvOxPig20ICx9Wa3DUmwBSrBEGp7LqCx8NYWIqYiyp X-Received: by 2002:a05:6e02:148:b0:363:c386:194a with SMTP id j8-20020a056e02014800b00363c386194amr314867ilr.25.1706979644595; Sat, 03 Feb 2024 09:00:44 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706979644; cv=pass; d=google.com; s=arc-20160816; b=xa/ZamI7Wex/HarLVlTHEJX8VIrc/VxBFOZMXAm5a+9MYd8tLgeYbRf9Rwe6lQCfQm ke9F6G70xmNfJQKtHL8KWVdll8VsOzZGCDVtpu5hRX9LdAPqjC5QnJmFF7B3ufv8A9vB s+9y1peo6cWXp1RGFgNSei8W4hppKULimwJ9wkXj883NAAt4jIdYAkqAGJ0TBfGOGmov zqfvPXmVZMNxZfmOwsJex+eXCcKN3UR6Yknhrpw9dedhkYvH+5eGrLDgYvu/OqNSUeer 5MewI7dBc7g32MDJ5kBhkm0nB7oDkdvZr16HHc1reNYKCuKkt5lHC+q+7NWbitwKYWXe lsAg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=nS1U6CsEeokUdAK6p14gWlLI/p7zyPtTy5BLbUv6Q3Y=; fh=mfynI14sXJiPp+eGebVv8mqObxnjsHTYY61vYPNz440=; b=QTtr1MOIJdkdNOhOCjMQ/IPb+b+33qjQ6n/9nOG0uvc/EqyoW1cJbd2P+RJbaPNw4K v0uVWxw4sv5RbP6Lzz6SY+u7UN81CHzaLqDexq87FVlPIqt6b9gweKDTCHh+GzRDGqBt UhYndDUrtSknFYrqYn4hZOU4lohT7NG99JBWTE/xFkTz+gYBkbv2WpYQqyVDGJQLUAfp va6irKIUfadQQYYgrUbgJ5jdLEDwUEM1lGTA1NBAyx+QuiELZM8ujXbmI8CXUkEZq9N4 nDVZHU5VSco1jUXzgQ33wJyn8n7D2xegIdvW9ImLpATjEsM21neGNbJL3RpxCPeCf4bz IOwA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=Zx0BSMBc; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-51198-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-51198-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com X-Forwarded-Encrypted: i=1; AJvYcCXfXjZ79t+z6QbNMZb8OHANKOdPC09q6yfcp58zeYo6evTkB77kXw+Mvz3nKqXhtJtrCwwGqlI7s/e6j3I+unNaZGqcVw== Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id t16-20020a63f350000000b005dc071d13c7si875979pgj.273.2024.02.03.09.00.44 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Feb 2024 09:00:44 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-51198-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=Zx0BSMBc; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-51198-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-51198-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id 551A3B26C2F for ; Sat, 3 Feb 2024 16:56:51 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 2750461664; Sat, 3 Feb 2024 16:54:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Zx0BSMBc" Received: from mail-io1-f43.google.com (mail-io1-f43.google.com [209.85.166.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E7D5B60DF1; Sat, 3 Feb 2024 16:54:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706979254; cv=none; b=H7U5j6mwMvRX1uW/A1iUMqeEfmgtLSaGpzyLOxEyJMoUsmaEYBufqcxEt5wR72VPCzbxpLgfdMh696jSHW1BAtGepI73U8UhXEDqt+CJLKGL7X+ZUhtjZFNDcp/BPFYjvqOaTQ+MwQUYejixuWbEyc0ND4JPHrSJuoEo4GnUePM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706979254; c=relaxed/simple; bh=59WPME9T5sG0PHCd9y+jVOtUD9XIM7BE9Xfgh15zm7Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RZukoQ72c6oDtii8Jk7cCufIdMzR/lew4Cavg+4j1l7CEMm4E6yWAh2EOsFKZ/wp9eYKmm7PPeRU9NIp+sOWWMWMs21NrVKOo35YOYmN31imG1zW2n/EgeJRFQALMqiqxJGMgu4nLSOLUynqz1E+8NFyii2gII4VDWfRR457xVg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Zx0BSMBc; arc=none smtp.client-ip=209.85.166.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-io1-f43.google.com with SMTP id ca18e2360f4ac-7bb5fda069bso155233939f.0; Sat, 03 Feb 2024 08:54:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706979252; x=1707584052; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=nS1U6CsEeokUdAK6p14gWlLI/p7zyPtTy5BLbUv6Q3Y=; b=Zx0BSMBco4WarSUM/5MewXr0b3b4bCSQE+eF4PqgPAJl4rfbU5uci+VEPJzzsd0zyN n2zJPweFG2fTGyD1woPTD2fUIB6/bYZZ7jlBsTMru2TEu9JEb4sXcObApoOmvy7ZRla+ L1Yhtg+FKuu8c/2lkpv6khX+yaRzbAt1yWhLc0q1sW9dAModiEJNzfl+6m3EPdo337EO dnsu452owOfwwkziQJ1Zw5C54iniTaBUF+MZ02jKRCfqZX+4ioRaH+WMiOoHDG9TQEVn IsN9kjyEFZvkEjSbSj7XTcIIwS+OOuBvs3qoRKDR4Bs9aVvBURYjTHuN+t20rvQ0P57P dLHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706979252; x=1707584052; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nS1U6CsEeokUdAK6p14gWlLI/p7zyPtTy5BLbUv6Q3Y=; b=NXZySXrv5b8wdEa4h4zNH+1+B5+BCUQ+MX6ejx+AJnoOBZwSpzIETOEelW8lWeNZKW TQprdKF6OEFaRWFAPOHZjUN9976Q3js524Ej4cAtVxckNh8lUEXcXZ5GGeXaAOsjEesb VSHTYdxFsYj2kzAsxLA8X+QdRy0pIAKaubhMooGEg8PWGrwrvXjISw1gQvUvDgUz4ge+ g7AAU+SnKQ7X8jfh61IzB6HUoWFhpzzDKiS0+3NOr9mKgib3GNfx5Ubg34qNcj80R/W5 okLU42XXuXK48J1r5bSTg+A/Yj4O/HNXY5wNso+g8BVgbeCzBqqQ08hWlwmZ4ibCSmTU hSJA== X-Gm-Message-State: AOJu0YyV2hDMQm1FY0oUk0/jlJv20p1kiNLdm+VQPiVojwgt4Hf4O4b4 Xaz/RACubMVt9p77dw2Nw+ug1vrSmik+MQ0JHgYliYi5/qTe1pX2 X-Received: by 2002:a5e:dc43:0:b0:7bf:da4d:3477 with SMTP id s3-20020a5edc43000000b007bfda4d3477mr12909894iop.9.1706979251851; Sat, 03 Feb 2024 08:54:11 -0800 (PST) X-Forwarded-Encrypted: i=0; AJvYcCWtJ3htmPbVibzr6e+4lQlOltg/gjP51UEUwO3KrmFljhhl5pWMKK9VZbywdm8qKxEksEtRtyXaaABe21u/XY9kBnWNeb5ACbwKIezVpe0uAKNNmNZgOrvuPFe4/yko2uwZuaX9ZuRnZEI9ZIZ2doxFNAIAio5aIxeOUm+jS+3hSf6OEkxpi5vGiCS3HUdmWtdwYI13pfK/d2iOyC5IQ6z1dDC70AKp1GY/udpFYQgJg1u3dUh+a3S1VrO2f0mCa/9FoNbBOE6GFbK+/jpZdVPAm7X6Mt0ytgwUbVGQ//znjDMQjA/3BA5QFN4V8+C6Nb/G2uYtH3vZa3oT3hIcRGUzREv0DaqhJkpzarzCjD3iICg+QPOqF7r3eFHuZWgfSE2p/xBckhEuaN5fC/2dr8ljB1uNBxClNLEZHNlAVWJ8Xu1sToM550SOvB1bC1SEm3OXmqqq2QxAdWZv/Y/XCpRdt8+2vFj8t+OagQCXbFco6V+2BJoWnEyTC6bkx5OwE5IALra9l7gE8X4+wQscveFtdwVltDcGq8pH+cBIQAQH6PH/jo6Om/3gRdmX3o6Uq1EzRcNLuXjO4bZj1x5Ej+/IG+lkIakEzBlaMC9lW2ydCYDEV98g+V/tGaQEXPZSuTMJbsm8OuUYJWTee7ZADdRYIJuRlKbHE2qPUL5ZjFyBi0j9iagnpEjKj6MNIx6EBwe76JTUK78e5FcC2jwU4Q54jSi1z7cI1CRHoO+RoeGm5Ef9jnBy5YNhKoFGdZYVrL0A8pjzWmj1FJ07W1MGA8phDBWUgtV6E5kIZ+gyVMD/qCn0Q//t1mYVOFGBmzRNRJE4rb+xvOPafqyZyhj0z2F9ALYwuEX9685QpY1zJC364Gw614rVX/42vo/LBf5t39N/W9WHQQyfitVcqxh7Ee5YkoRC7ge7Bc2TcVKymG4AcEd29eO/Ad8rS+9wVeOR4/nSO1 AA2DxDnPtlcFS0Uyl6gXJ1pvSU98BPb9FuhJT+wtGQECFTYIRCCD3l7aUl7tb+dZIlTSWSRaTECmYXgD/n1twe3NLsnAHnOTOKcsN9mXTPv05Y6ZXEyah6i8LRal+ZShTupWEfcW69K7yX+6l1UNwMboVQ+Qr1kLob2n9LFgMYeF2OHD77j1eU8+rvNJN/WOPn1f2rSD4LS482dhwTTtipgjowm052XOo0JXXEAFIgVIkItlAFuEEbO3beWbvZfBhc5QiXYCsTzs0ovP+HtjWRQOFi3+w8u7msJPr1AFr9wDGdBlmumRUA9ku41IX9jThWYGI6u31VJ7sP9npKHlEJVMo= Received: from aford-System-Version.lan ([2601:447:d002:5be:d9b2:bb4f:5531:6aa9]) by smtp.gmail.com with ESMTPSA id t30-20020a05663836de00b00470b29b82b1sm1086256jau.154.2024.02.03.08.54.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Feb 2024 08:54:10 -0800 (PST) From: Adam Ford To: linux-arm-kernel@lists.infradead.org Cc: marex@denx.de, alexander.stein@ew.tq-group.com, frieder.schrempf@kontron.de, Lucas Stach , Luca Ceresoli , Richard Leitner , Laurent Pinchart , Fabio Estevam , Adam Ford , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , David Airlie , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , NXP Linux Team , Philipp Zabel , Vinod Koul , Kishon Vijay Abraham I , Catalin Marinas , Will Deacon , Liu Ying , Ulf Hansson , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-pm@vger.kernel.org Subject: [PATCH V8 08/12] drm/bridge: imx: add driver for HDMI TX Parallel Video Interface Date: Sat, 3 Feb 2024 10:52:48 -0600 Message-ID: <20240203165307.7806-9-aford173@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240203165307.7806-1-aford173@gmail.com> References: <20240203165307.7806-1-aford173@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1789897887719083792 X-GMAIL-MSGID: 1789897887719083792 From: Lucas Stach This IP block is found in the HDMI subsystem of the i.MX8MP SoC. It has a full timing generator and can switch between different video sources. On the i.MX8MP however the only supported source is the LCDIF. The block just needs to be powered up and told about the polarity of the video sync signals to act in bypass mode. Signed-off-by: Lucas Stach Reviewed-by: Luca Ceresoli (v7) Tested-by: Marek Vasut (v1) Tested-by: Luca Ceresoli (v7) Tested-by: Richard Leitner (v2) Tested-by: Frieder Schrempf (v2) Reviewed-by: Laurent Pinchart (v3) Reviewed-by: Luca Ceresoli Tested-by: Luca Ceresoli Tested-by: Fabio Estevam Signed-off-by: Adam Ford --- V8: No Change V7: Re-do some includes to address build issues after rebasing from Linux-next V6: No change. V5: I (Adam) tried to help move this along, so I took Lucas' patch and attempted to apply fixes based on feedback. I don't have all the history, so apologies for that. No changes from V4 to V5 --- drivers/gpu/drm/bridge/imx/Kconfig | 7 + drivers/gpu/drm/bridge/imx/Makefile | 1 + drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c | 207 +++++++++++++++++++ 3 files changed, 215 insertions(+) create mode 100644 drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c diff --git a/drivers/gpu/drm/bridge/imx/Kconfig b/drivers/gpu/drm/bridge/imx/Kconfig index 5a4f3d58501e..a4d13331e320 100644 --- a/drivers/gpu/drm/bridge/imx/Kconfig +++ b/drivers/gpu/drm/bridge/imx/Kconfig @@ -3,6 +3,13 @@ if ARCH_MXC || COMPILE_TEST config DRM_IMX_LDB_HELPER tristate +config DRM_IMX8MP_HDMI_PVI + tristate "Freescale i.MX8MP HDMI PVI bridge support" + depends on OF + help + Choose this to enable support for the internal HDMI TX Parallel + Video Interface found on the Freescale i.MX8MP SoC. + config DRM_IMX8QM_LDB tristate "Freescale i.MX8QM LVDS display bridge" depends on OF diff --git a/drivers/gpu/drm/bridge/imx/Makefile b/drivers/gpu/drm/bridge/imx/Makefile index 2b0c2e44aa1b..e2c2106509fa 100644 --- a/drivers/gpu/drm/bridge/imx/Makefile +++ b/drivers/gpu/drm/bridge/imx/Makefile @@ -1,4 +1,5 @@ obj-$(CONFIG_DRM_IMX_LDB_HELPER) += imx-ldb-helper.o +obj-$(CONFIG_DRM_IMX8MP_HDMI_PVI) += imx8mp-hdmi-pvi.o obj-$(CONFIG_DRM_IMX8QM_LDB) += imx8qm-ldb.o obj-$(CONFIG_DRM_IMX8QXP_LDB) += imx8qxp-ldb.o obj-$(CONFIG_DRM_IMX8QXP_PIXEL_COMBINER) += imx8qxp-pixel-combiner.o diff --git a/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c b/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c new file mode 100644 index 000000000000..a76b7669fe8a --- /dev/null +++ b/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c @@ -0,0 +1,207 @@ +// SPDX-License-Identifier: GPL-2.0+ + +/* + * Copyright (C) 2022 Pengutronix, Lucas Stach + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define HTX_PVI_CTRL 0x0 +#define PVI_CTRL_OP_VSYNC_POL BIT(18) +#define PVI_CTRL_OP_HSYNC_POL BIT(17) +#define PVI_CTRL_OP_DE_POL BIT(16) +#define PVI_CTRL_INP_VSYNC_POL BIT(14) +#define PVI_CTRL_INP_HSYNC_POL BIT(13) +#define PVI_CTRL_INP_DE_POL BIT(12) +#define PVI_CTRL_MODE_MASK GENMASK(2, 1) +#define PVI_CTRL_MODE_LCDIF 2 +#define PVI_CTRL_EN BIT(0) + +struct imx8mp_hdmi_pvi { + struct drm_bridge bridge; + struct device *dev; + struct drm_bridge *next_bridge; + void __iomem *regs; +}; + +static inline struct imx8mp_hdmi_pvi * +to_imx8mp_hdmi_pvi(struct drm_bridge *bridge) +{ + return container_of(bridge, struct imx8mp_hdmi_pvi, bridge); +} + +static int imx8mp_hdmi_pvi_bridge_attach(struct drm_bridge *bridge, + enum drm_bridge_attach_flags flags) +{ + struct imx8mp_hdmi_pvi *pvi = to_imx8mp_hdmi_pvi(bridge); + + return drm_bridge_attach(bridge->encoder, pvi->next_bridge, + bridge, flags); +} + +static void imx8mp_hdmi_pvi_bridge_enable(struct drm_bridge *bridge, + struct drm_bridge_state *bridge_state) +{ + struct drm_atomic_state *state = bridge_state->base.state; + struct imx8mp_hdmi_pvi *pvi = to_imx8mp_hdmi_pvi(bridge); + struct drm_connector_state *conn_state; + const struct drm_display_mode *mode; + struct drm_crtc_state *crtc_state; + struct drm_connector *connector; + u32 bus_flags, val; + + connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder); + conn_state = drm_atomic_get_new_connector_state(state, connector); + crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc); + + if (WARN_ON(pm_runtime_resume_and_get(pvi->dev))) + return; + + mode = &crtc_state->adjusted_mode; + + val = FIELD_PREP(PVI_CTRL_MODE_MASK, PVI_CTRL_MODE_LCDIF) | PVI_CTRL_EN; + + if (mode->flags & DRM_MODE_FLAG_PVSYNC) + val |= PVI_CTRL_OP_VSYNC_POL | PVI_CTRL_INP_VSYNC_POL; + + if (mode->flags & DRM_MODE_FLAG_PHSYNC) + val |= PVI_CTRL_OP_HSYNC_POL | PVI_CTRL_INP_HSYNC_POL; + + if (pvi->next_bridge->timings) + bus_flags = pvi->next_bridge->timings->input_bus_flags; + else if (bridge_state) + bus_flags = bridge_state->input_bus_cfg.flags; + + if (bus_flags & DRM_BUS_FLAG_DE_HIGH) + val |= PVI_CTRL_OP_DE_POL | PVI_CTRL_INP_DE_POL; + + writel(val, pvi->regs + HTX_PVI_CTRL); +} + +static void imx8mp_hdmi_pvi_bridge_disable(struct drm_bridge *bridge, + struct drm_bridge_state *bridge_state) +{ + struct imx8mp_hdmi_pvi *pvi = to_imx8mp_hdmi_pvi(bridge); + + writel(0x0, pvi->regs + HTX_PVI_CTRL); + + pm_runtime_put(pvi->dev); +} + +static u32 * +imx8mp_hdmi_pvi_bridge_get_input_bus_fmts(struct drm_bridge *bridge, + struct drm_bridge_state *bridge_state, + struct drm_crtc_state *crtc_state, + struct drm_connector_state *conn_state, + u32 output_fmt, + unsigned int *num_input_fmts) +{ + struct imx8mp_hdmi_pvi *pvi = to_imx8mp_hdmi_pvi(bridge); + struct drm_bridge *next_bridge = pvi->next_bridge; + struct drm_bridge_state *next_state; + + if (!next_bridge->funcs->atomic_get_input_bus_fmts) + return 0; + + next_state = drm_atomic_get_new_bridge_state(crtc_state->state, + next_bridge); + + return next_bridge->funcs->atomic_get_input_bus_fmts(next_bridge, + next_state, + crtc_state, + conn_state, + output_fmt, + num_input_fmts); +} + +static const struct drm_bridge_funcs imx_hdmi_pvi_bridge_funcs = { + .attach = imx8mp_hdmi_pvi_bridge_attach, + .atomic_enable = imx8mp_hdmi_pvi_bridge_enable, + .atomic_disable = imx8mp_hdmi_pvi_bridge_disable, + .atomic_get_input_bus_fmts = imx8mp_hdmi_pvi_bridge_get_input_bus_fmts, + .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, + .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, + .atomic_reset = drm_atomic_helper_bridge_reset, +}; + +static int imx8mp_hdmi_pvi_probe(struct platform_device *pdev) +{ + struct device_node *remote; + struct imx8mp_hdmi_pvi *pvi; + + pvi = devm_kzalloc(&pdev->dev, sizeof(*pvi), GFP_KERNEL); + if (!pvi) + return -ENOMEM; + + platform_set_drvdata(pdev, pvi); + pvi->dev = &pdev->dev; + + pvi->regs = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(pvi->regs)) + return PTR_ERR(pvi->regs); + + /* Get the next bridge in the pipeline. */ + remote = of_graph_get_remote_node(pdev->dev.of_node, 1, -1); + if (!remote) + return -EINVAL; + + pvi->next_bridge = of_drm_find_bridge(remote); + of_node_put(remote); + + if (!pvi->next_bridge) + return dev_err_probe(&pdev->dev, -EPROBE_DEFER, + "could not find next bridge\n"); + + pm_runtime_enable(&pdev->dev); + + /* Register the bridge. */ + pvi->bridge.funcs = &imx_hdmi_pvi_bridge_funcs; + pvi->bridge.of_node = pdev->dev.of_node; + pvi->bridge.timings = pvi->next_bridge->timings; + + drm_bridge_add(&pvi->bridge); + + return 0; +} + +static int imx8mp_hdmi_pvi_remove(struct platform_device *pdev) +{ + struct imx8mp_hdmi_pvi *pvi = platform_get_drvdata(pdev); + + drm_bridge_remove(&pvi->bridge); + + pm_runtime_disable(&pdev->dev); + + return 0; +} + +static const struct of_device_id imx8mp_hdmi_pvi_match[] = { + { + .compatible = "fsl,imx8mp-hdmi-pvi", + }, { + /* sentinel */ + } +}; +MODULE_DEVICE_TABLE(of, imx8mp_hdmi_pvi_match); + +static struct platform_driver imx8mp_hdmi_pvi_driver = { + .probe = imx8mp_hdmi_pvi_probe, + .remove = imx8mp_hdmi_pvi_remove, + .driver = { + .name = "imx-hdmi-pvi", + .of_match_table = imx8mp_hdmi_pvi_match, + }, +}; +module_platform_driver(imx8mp_hdmi_pvi_driver); + +MODULE_DESCRIPTION("i.MX8MP HDMI TX Parallel Video Interface bridge driver"); +MODULE_LICENSE("GPL"); From patchwork Sat Feb 3 16:52:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Ford X-Patchwork-Id: 196342 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:9bc1:b0:106:209c:c626 with SMTP id op1csp1108367dyc; Sat, 3 Feb 2024 08:57:30 -0800 (PST) X-Google-Smtp-Source: AGHT+IGPk5WN81DDdWMRA+lPXzOZhlzIWclCJa2Y7eQdUZLfLvsZC3gZU99Dg4ek9v7pV1IZvCRJ X-Received: by 2002:a05:620a:9dd:b0:785:76a1:74c2 with SMTP id y29-20020a05620a09dd00b0078576a174c2mr441096qky.12.1706979450351; Sat, 03 Feb 2024 08:57:30 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706979450; cv=pass; d=google.com; s=arc-20160816; b=GCqPumA5dDjMGFxwPritaP6WIho4CIMQHZAg04d6ekZ8HOqMWamhUkO7U9Cx/97Y3+ Vs3alaCmWQUteqPmvOpQ6yY13ZRpFgSFkqYXOUWHQsi08l1pk5DpSoOPUqfEL0pO9LEz WZVwk5SeJsxGT3omP7ydQ3nyiX34U+C8UAUj8/7B9N6gllLW6A9FdLpSLrR4+YUTFWPj I9cQn07SW2L+0wIaQuyplbH0EU6Rob5+djjsl0+ZsC9HdY/npHM08EjBnj6y+D0SxDH5 R7/eLVN38rfCvoSH9AMdBIsX7u1j4fPcBm2UFCtTW4hpJvMkFeqfl59mxrFcyJ4szUM9 4Gaw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=Pee85pXx8M9QJJ/rvdrRgJpwO1Us9mIqzBO/JdTu/x0=; fh=fYv2Co711xphax6Ci1+B5ESC1Ge68FgjTRGcyLWlzPI=; b=KunfLvXg8Vnctt02BSZ9U+I8ssHyvwnPQPVCoD/mazTbm0JnG7uHMtKTnstimiJIm8 kJBbxem8xVE9C2fUl4fZA44UJs1p3YAAqQIvQrdkfpI5eAhEZbGh7qz83JFrQkwKeLAG UdYtHEudtggpSZT6F28s+JtLgsmaJpwrnLYMvAfpJH12dbNL3p1D66FMjWFgN8/ot+0c u3hxuOcr7h5ZSyKrefQZb8iUsB3dzblV3cJKOAyTzv/JgwDpKyJa5rhgPv8C04rTmPsM L0TlLmucDdnB8dwhiO4xz7XTGn8Q8SnguyFS8c8bq1i5OAAFXrjD9A//XEPb5XBzOp3s zQFw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=NXp5fdc0; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-51200-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-51200-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com X-Forwarded-Encrypted: i=1; AJvYcCX3560xIkbuWxUkWpK+rdNcc8JaHTMT5POkCh9gj0eCz3i5rrLYyOM6JiRottr/9ELdCugvvWP24DLdjl+d/U8khAdEug== Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id bk35-20020a05620a1a2300b00784076c5f89si5260170qkb.516.2024.02.03.08.57.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Feb 2024 08:57:30 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-51200-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=NXp5fdc0; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-51200-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-51200-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 1C1891C21CBE for ; Sat, 3 Feb 2024 16:57:30 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 372F663401; Sat, 3 Feb 2024 16:54:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NXp5fdc0" Received: from mail-il1-f181.google.com (mail-il1-f181.google.com [209.85.166.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7F1866166B; Sat, 3 Feb 2024 16:54:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706979266; cv=none; b=hrE7CT4r44DyF7qeDwrdoaCJ7b/ftCzYZCkGPwLK9AhdNFOsp1nr01tUKa8X565xF4V3dUczkzhakWSW5uO4T5PCgei/Jd2PrrmH1dogIY4utSqVCrifVnxoeriC6VPCc5UyHL2kJagBYkO01Mr/5JC2w0zK0M1RpyO7GlBX8rQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706979266; c=relaxed/simple; bh=WtUrW3LY//k4LuLg6Ijf/Pz5QXrc9NXx7HkOEZgmsIE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fjk34pJN7wLWwPjtF1AlS8TqEVl2Fqc/Kxt+PXcwX4NJRYoa0MmVzmBhYCUK5QKeUVP65RiXrH8XnxL+SmHk+wymEqkbezKZiSvOWMIRKAKJAwHolscqE9yXlrBU3kM1VsDTjtm8HgeJSPBFnCQdzL69D6dG+wirql6vRDNT048= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NXp5fdc0; arc=none smtp.client-ip=209.85.166.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-il1-f181.google.com with SMTP id e9e14a558f8ab-363ac28b375so6658315ab.3; Sat, 03 Feb 2024 08:54:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706979263; x=1707584063; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Pee85pXx8M9QJJ/rvdrRgJpwO1Us9mIqzBO/JdTu/x0=; b=NXp5fdc09sqLiUZJqa6F7KpovfIciMRLnXpnui7Flh1M6rMBqspOOQKmVLNw0vma7R cbWH5HHJYjRYleSJEGDoRBhQEUxdcm46/o4rYiYJUfvci8CPI2OqMU12MdkoG+UfqHvp LsKi5ZHwggm1cTxE0EOlQD/oKsSUphPTp6VGRnXf+/HJLku5jkHrtKpvlkP9v9VcZFUT gPIMoCHB6YG6rAHOrBX98G+i9Ttk8a1IGZ0x/LftIzXoLGUEoxFLus9+VTlJIKZARLqX S7b9zZKek0yy8TzkoqXVFnD2lkXKSP+jt4MFZjT5HcxdYTfsoNALDMoPAbN2XJNug0Ti Jimw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706979263; x=1707584063; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Pee85pXx8M9QJJ/rvdrRgJpwO1Us9mIqzBO/JdTu/x0=; b=CATo7fMokWbgE/URaO7LfRCkzkp7w7RHPnxYpmEf2V8r9KXyAe+WD8XUv6h2xdkss7 0eyCTZ1BvcyWt0b1dCsPI7JkSHeKPM+AShaNF316wKc+rhnt4XvKLrjYPI2yLwGGlLy+ G0v8Hy9+1NNzqoQYo9GanDjW7WG4CwY0Oglj/3Fx0kvD48TsQ+hAG5IHuB8jn45NN8QH sfmxjU+yVJv6Dbtu2PDjqxKLntALLKmmSHUW46j8dbPtQC6Tsm56DWWIbT0bCUJgul0T qT4oQglu/Y9CmlG7fw8C517KsW3UShbjpKQcwI3cN7RupuOCfzPICfanib1hExG85Av5 QIpw== X-Gm-Message-State: AOJu0Yyj+MKBuF9PjYEaMelYT/JuR7Uy/s0YJVWbSfnUyJUJ5l6rbkI9 wWOz4CZockMZ5igJHjtn8FubCUi7ADDzkQ3m4ZHHdM2y9a+LQMw1 X-Received: by 2002:a92:c5ce:0:b0:363:6da9:2bc3 with SMTP id s14-20020a92c5ce000000b003636da92bc3mr5239097ilt.11.1706979263479; Sat, 03 Feb 2024 08:54:23 -0800 (PST) X-Forwarded-Encrypted: i=0; AJvYcCVTi8yyqyf2Habkk9tyCJoPOe9LH5AypnN3NhPkjbPVJALV182rjeRxj4FycC5oyDOecYqR50/JvNFZONhmnUrRWETF5iMlz7YUC4uJUCjOoQObjV6exynOq8X0pQhyNU+pMLtpwMtGsedHX9Z+XeaP1fuuoZ3E4V1EqM3Xw7Yik/SElx47SV21Kar6w86hZQ8JIvRSerSIxojL5fmtbOBJxCqbfm9ZWJ6a2cRemiaqExR+Yu1EZFFARQHk1eR8K6OQ4P0ON2Na9j3f/p0WkN5/ulAWeddoeYpFdUiUX9BfPYrBOOitBbAIjhHnSEn1JiKlut0e6NaVjtt9ZDQQeZGbYgMS80KWY+xTsDfXpGz9cVXcwD6aLwJutnIfKvDn/S8MVY8n+ZkmoB73UwOIc2JlJjuPAQPq0R5GXWAAiVsozOJVxm10vv0+vhT+aW6a80fzM3cbohBjCT3SyhKXkDJtD6NsGd+2B3Wq0e4f2H58gQbpFBSndPlM77Kg9IOr4MQ9VH2VdcsnqyBPp3bMudL2OrVmUDzH3JB6FLwyKDlHXopoTsws3k+av9arIOACAxyNKdXX79qb3dkp+YYTsiZVxssoQRTjNCMBQ4A4gjN23YClZITcro7eTmcA224dIELgSwMbtR8oWXfAP2GmqWMROgq0QJPEAz9TSjk2WgLgawQaylndaqWGGmu4dSNojrahrpy7G8Iy6SfaxYdcgu4mDbDpBoiczdMVyaEg5HRUHIz+EHHU3jdOsMHjjFtMRy4TCdJAqPyGQB/IEhJGkOR0Ud4Z36O7Qe6HobWA1oPfzuVpwFNqtgn2qK55gIBVR0x03BwTYgtVNYfxEqhbFaEWRFpLUd5g0H7RDGoFo2Pg8KWARudtVCCYhZBrrJKfXs1hisDwrqqoV0fVwPa3MzqFnrU9pmuiY9aYm/zEPKvbgOAzla4d4CRZwdqiIlQJ+gZyGL FuHaml/Lvoe8M8XSpOqi35Zh3SY5nJN5p+lr5fRIWPRnqwRW8/J46pdXlWmSsehsybAFVj2YaMI86ecPzwkDxhedXLL04jMmwTBKJO6HKnb4nZqmXCS8D2BeoVbkaVWgBcH2659KRgFRPREi0p0R56XRef4KO6vajRs4lfZxBX6IQcYWV2d5ruxvBcPc5J76unsLw1wXpoZ69CXegazQBg8Y6nrh07x7obUCecPgn9JYiyn5RzduCgAcPlxRh1DiqzwFA+Kp3SQ1PjLrY1IBGto3RQauywZAZfMQBK9AVxhLH9RZaCvNInmwpvXeMY125E4w45wHgLDaEpNeaRtPWa3QU= Received: from aford-System-Version.lan ([2601:447:d002:5be:d9b2:bb4f:5531:6aa9]) by smtp.gmail.com with ESMTPSA id t30-20020a05663836de00b00470b29b82b1sm1086256jau.154.2024.02.03.08.54.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Feb 2024 08:54:22 -0800 (PST) From: Adam Ford To: linux-arm-kernel@lists.infradead.org Cc: marex@denx.de, alexander.stein@ew.tq-group.com, frieder.schrempf@kontron.de, Lucas Stach , Laurent Pinchart , Adam Ford , Richard Leitner , Luca Ceresoli , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , Philipp Zabel , Vinod Koul , Kishon Vijay Abraham I , Catalin Marinas , Will Deacon , Liu Ying , Ulf Hansson , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-pm@vger.kernel.org Subject: [PATCH V8 10/12] drm/bridge: imx: add bridge wrapper driver for i.MX8MP DWC HDMI Date: Sat, 3 Feb 2024 10:52:50 -0600 Message-ID: <20240203165307.7806-11-aford173@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240203165307.7806-1-aford173@gmail.com> References: <20240203165307.7806-1-aford173@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1789897683906507740 X-GMAIL-MSGID: 1789897683906507740 From: Lucas Stach Add a simple wrapper driver for the DWC HDMI bridge driver that implements the few bits that are necessary to abstract the i.MX8MP SoC integration. Signed-off-by: Lucas Stach Reviewed-by: Laurent Pinchart Tested-by: Marek Vasut Tested-by: Adam Ford #imx8mp-beacon Tested-by: Richard Leitner Tested-by: Frieder Schrempf Tested-by: Luca Ceresoli Signed-off-by: Adam Ford Reviewed-by: Luca Ceresoli --- v3: To move this along, I (Adam) took Lucas' V2 and attempted to address concerns: Changed name to imx8mp-hdmi-tx Re-ordered includes to make drm come after linux Removed unused variable build warning Removed fdcc clock since it's part of the power domain now set the phy_force_vendor = true Removed comma after sentinel Also added suspend/resume functions from Marek Vasut Configured Kconfig to select the PVI and PHY automatically since the HDMI-tx is useless without the other two components I apologize that don't have the version history prior to V2. --- drivers/gpu/drm/bridge/imx/Kconfig | 11 ++ drivers/gpu/drm/bridge/imx/Makefile | 1 + drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx.c | 154 ++++++++++++++++++++ 3 files changed, 166 insertions(+) create mode 100644 drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx.c diff --git a/drivers/gpu/drm/bridge/imx/Kconfig b/drivers/gpu/drm/bridge/imx/Kconfig index a4d13331e320..5965e8027529 100644 --- a/drivers/gpu/drm/bridge/imx/Kconfig +++ b/drivers/gpu/drm/bridge/imx/Kconfig @@ -3,6 +3,17 @@ if ARCH_MXC || COMPILE_TEST config DRM_IMX_LDB_HELPER tristate +config DRM_IMX8MP_DW_HDMI_BRIDGE + tristate "Freescale i.MX8MP HDMI-TX bridge support" + depends on OF + depends on COMMON_CLK + select DRM_DW_HDMI + select DRM_IMX8MP_HDMI_PVI + select PHY_FSL_SAMSUNG_HDMI_PHY + help + Choose this to enable support for the internal HDMI encoder found + on the i.MX8MP SoC. + config DRM_IMX8MP_HDMI_PVI tristate "Freescale i.MX8MP HDMI PVI bridge support" depends on OF diff --git a/drivers/gpu/drm/bridge/imx/Makefile b/drivers/gpu/drm/bridge/imx/Makefile index e2c2106509fa..edb0a7b71b30 100644 --- a/drivers/gpu/drm/bridge/imx/Makefile +++ b/drivers/gpu/drm/bridge/imx/Makefile @@ -1,4 +1,5 @@ obj-$(CONFIG_DRM_IMX_LDB_HELPER) += imx-ldb-helper.o +obj-$(CONFIG_DRM_IMX8MP_DW_HDMI_BRIDGE) += imx8mp-hdmi-tx.o obj-$(CONFIG_DRM_IMX8MP_HDMI_PVI) += imx8mp-hdmi-pvi.o obj-$(CONFIG_DRM_IMX8QM_LDB) += imx8qm-ldb.o obj-$(CONFIG_DRM_IMX8QXP_LDB) += imx8qxp-ldb.o diff --git a/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx.c b/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx.c new file mode 100644 index 000000000000..89fc432ac611 --- /dev/null +++ b/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx.c @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: GPL-2.0+ + +/* + * Copyright (C) 2022 Pengutronix, Lucas Stach + */ + +#include +#include +#include +#include +#include +#include + +struct imx8mp_hdmi { + struct dw_hdmi_plat_data plat_data; + struct dw_hdmi *dw_hdmi; + struct clk *pixclk; +}; + +static enum drm_mode_status +imx8mp_hdmi_mode_valid(struct dw_hdmi *dw_hdmi, void *data, + const struct drm_display_info *info, + const struct drm_display_mode *mode) +{ + struct imx8mp_hdmi *hdmi = (struct imx8mp_hdmi *)data; + + if (mode->clock < 13500) + return MODE_CLOCK_LOW; + + if (mode->clock > 297000) + return MODE_CLOCK_HIGH; + + if (clk_round_rate(hdmi->pixclk, mode->clock * 1000) != + mode->clock * 1000) + return MODE_CLOCK_RANGE; + + /* We don't support double-clocked and Interlaced modes */ + if ((mode->flags & DRM_MODE_FLAG_DBLCLK) || + (mode->flags & DRM_MODE_FLAG_INTERLACE)) + return MODE_BAD; + + return MODE_OK; +} + +static int imx8mp_hdmi_phy_init(struct dw_hdmi *dw_hdmi, void *data, + const struct drm_display_info *display, + const struct drm_display_mode *mode) +{ + return 0; +} + +static void imx8mp_hdmi_phy_disable(struct dw_hdmi *dw_hdmi, void *data) +{ +} + +static void im8mp_hdmi_phy_setup_hpd(struct dw_hdmi *hdmi, void *data) +{ + /* + * Just release PHY core from reset, all other power management is done + * by the PHY driver. + */ + dw_hdmi_phy_gen1_reset(hdmi); + + dw_hdmi_phy_setup_hpd(hdmi, data); +} + +static const struct dw_hdmi_phy_ops imx8mp_hdmi_phy_ops = { + .init = imx8mp_hdmi_phy_init, + .disable = imx8mp_hdmi_phy_disable, + .setup_hpd = im8mp_hdmi_phy_setup_hpd, + .read_hpd = dw_hdmi_phy_read_hpd, + .update_hpd = dw_hdmi_phy_update_hpd, +}; + +static int imx8mp_dw_hdmi_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct dw_hdmi_plat_data *plat_data; + struct imx8mp_hdmi *hdmi; + + hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL); + if (!hdmi) + return -ENOMEM; + + plat_data = &hdmi->plat_data; + + hdmi->pixclk = devm_clk_get(dev, "pix"); + if (IS_ERR(hdmi->pixclk)) + return dev_err_probe(dev, PTR_ERR(hdmi->pixclk), + "Unable to get pixel clock\n"); + + plat_data->mode_valid = imx8mp_hdmi_mode_valid; + plat_data->phy_ops = &imx8mp_hdmi_phy_ops; + plat_data->phy_name = "SAMSUNG HDMI TX PHY"; + plat_data->priv_data = hdmi; + plat_data->phy_force_vendor = true; + + hdmi->dw_hdmi = dw_hdmi_probe(pdev, plat_data); + if (IS_ERR(hdmi->dw_hdmi)) + return PTR_ERR(hdmi->dw_hdmi); + + platform_set_drvdata(pdev, hdmi); + + return 0; +} + +static int imx8mp_dw_hdmi_remove(struct platform_device *pdev) +{ + struct imx8mp_hdmi *hdmi = platform_get_drvdata(pdev); + + dw_hdmi_remove(hdmi->dw_hdmi); + + return 0; +} + +static int __maybe_unused imx8mp_dw_hdmi_pm_suspend(struct device *dev) +{ + return 0; +} + +static int __maybe_unused imx8mp_dw_hdmi_pm_resume(struct device *dev) +{ + struct imx8mp_hdmi *hdmi = dev_get_drvdata(dev); + + dw_hdmi_resume(hdmi->dw_hdmi); + + return 0; +} + +static const struct dev_pm_ops imx8mp_dw_hdmi_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(imx8mp_dw_hdmi_pm_suspend, + imx8mp_dw_hdmi_pm_resume) +}; + +static const struct of_device_id imx8mp_dw_hdmi_of_table[] = { + { .compatible = "fsl,imx8mp-hdmi-tx" }, + { /* Sentinel */ } +}; +MODULE_DEVICE_TABLE(of, imx8mp_dw_hdmi_of_table); + +static struct platform_driver imx8mp_dw_hdmi_platform_driver = { + .probe = imx8mp_dw_hdmi_probe, + .remove = imx8mp_dw_hdmi_remove, + .driver = { + .name = "imx8mp-dw-hdmi-tx", + .of_match_table = imx8mp_dw_hdmi_of_table, + .pm = &imx8mp_dw_hdmi_pm_ops, + }, +}; + +module_platform_driver(imx8mp_dw_hdmi_platform_driver); + +MODULE_DESCRIPTION("i.MX8MP HDMI encoder driver"); +MODULE_LICENSE("GPL");