Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2195103/?format=api
{ "id": 2195103, "url": "http://patchwork.ozlabs.org/api/patches/2195103/?format=api", "web_url": "http://patchwork.ozlabs.org/project/uboot/patch/20260210090029.728636-7-brian.ruley@gehealthcare.com/", "project": { "id": 18, "url": "http://patchwork.ozlabs.org/api/projects/18/?format=api", "name": "U-Boot", "link_name": "uboot", "list_id": "u-boot.lists.denx.de", "list_email": "u-boot@lists.denx.de", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260210090029.728636-7-brian.ruley@gehealthcare.com>", "list_archive_url": null, "date": "2026-02-10T09:00:28", "name": "[v2,6/6] video: imx: ipuv3: use clock framework", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "93d507667500c3ea4ce29e7ece8e8952e8272eba", "submitter": { "id": 89422, "url": "http://patchwork.ozlabs.org/api/people/89422/?format=api", "name": "Brian Ruley", "email": "brian.ruley@gehealthcare.com" }, "delegate": { "id": 151988, "url": "http://patchwork.ozlabs.org/api/users/151988/?format=api", "username": "festevam", "first_name": "Fabio", "last_name": "Estevam", "email": "festevam@gmail.com" }, "mbox": "http://patchwork.ozlabs.org/project/uboot/patch/20260210090029.728636-7-brian.ruley@gehealthcare.com/mbox/", "series": [ { "id": 491668, "url": "http://patchwork.ozlabs.org/api/series/491668/?format=api", "web_url": "http://patchwork.ozlabs.org/project/uboot/list/?series=491668", "date": "2026-02-10T09:00:24", "name": "Enable the IPUv3 driver to use CCF", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/491668/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2195103/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2195103/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<u-boot-bounces@lists.denx.de>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gehealthcare.com header.i=@gehealthcare.com\n header.a=rsa-sha256 header.s=selector1 header.b=vs8FBxec;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)", "phobos.denx.de;\n dmarc=pass (p=quarantine dis=none) header.from=gehealthcare.com", "phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de", "phobos.denx.de;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gehealthcare.com header.i=@gehealthcare.com\n header.b=\"vs8FBxec\";\n\tdkim-atps=neutral", "phobos.denx.de; dmarc=pass (p=quarantine dis=none)\n header.from=gehealthcare.com", "phobos.denx.de;\n spf=pass smtp.mailfrom=Brian.Ruley@gehealthcare.com" ], "Received": [ "from phobos.denx.de (phobos.denx.de\n [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4f9Lnm5LH9z1xtV\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 10 Feb 2026 23:43:08 +1100 (AEDT)", "from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id 567FE83DDF;\n\tTue, 10 Feb 2026 13:42:03 +0100 (CET)", "by phobos.denx.de (Postfix, from userid 109)\n id 2D14C83CEA; Tue, 10 Feb 2026 10:00:59 +0100 (CET)", "from MW6PR02CU001.outbound.protection.outlook.com\n (mail-westus2azlp170120002.outbound.protection.outlook.com\n [IPv6:2a01:111:f403:c007::2])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id 976A48309A\n for <u-boot@lists.denx.de>; Tue, 10 Feb 2026 10:00:56 +0100 (CET)", "from MN2PR16CA0057.namprd16.prod.outlook.com (2603:10b6:208:234::26)\n by LV3PR22MB5872.namprd22.prod.outlook.com (2603:10b6:408:26e::10)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9587.15; Tue, 10 Feb\n 2026 09:00:51 +0000", "from BL02EPF00021F6F.namprd02.prod.outlook.com\n (2603:10b6:208:234:cafe::39) by MN2PR16CA0057.outlook.office365.com\n (2603:10b6:208:234::26) with Microsoft SMTP Server (version=TLS1_3,\n cipher=TLS_AES_256_GCM_SHA384) id 15.20.9587.19 via Frontend Transport; Tue,\n 10 Feb 2026 09:00:51 +0000", "from mkerelay1.compute.ge-healthcare.net (165.85.157.49) by\n BL02EPF00021F6F.mail.protection.outlook.com (10.167.249.11) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.9611.8 via Frontend Transport; Tue, 10 Feb 2026 09:00:51 +0000", "from zoo11.fihel.lab.ge-healthcare.net\n (zoo11.fihel.lab.ge-healthcare.net [10.168.174.93])\n by builder1.fihel.lab.ge-healthcare.net (Postfix) with ESMTP id 0C145F882B;\n Tue, 10 Feb 2026 11:00:49 +0200 (EET)" ], "X-Spam-Checker-Version": "SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de", "X-Spam-Level": "", "X-Spam-Status": "No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED,\n SPF_HELO_NONE,T_SPF_PERMERROR autolearn=ham autolearn_force=no\n version=3.4.2", "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=DMg250le6TnKa3DhJXbJdy3/ZRuDjtSXLfqh8OZgZDiO/wPtX5T1Od7MOQCspWKfiSKMdEytk5iNOUapVi1Ie+tEvPwvRZVGCcwp2LwrpYHT7gLOYb1mV3/tc8e3HJgTr4SPg/7MyZ3j6vNegiqfyTZu5kArwGjViBEtJgjJqb6vdeZuvFFkY8Q73SJ02yUMsvvvqBTKvqTAP4njZjswY8/vdo4wdTTls1wi+/sIhVrfcRgOCarkkGqdzw8D/1tNiHBlNhzc//VfMzuY3RTNV+DcEl/JhscTftCS6Kt+yBaZsGutLSUvtj7w4vznKRA9jsqlNRw4Pc9Fe18THngI2Q==", "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=WqQOZFNCT5FSCVQbTMxrO20l6tRo9Kz8g660J/tgnUc=;\n b=d7dVQOnM1Uguo0tqldbvIRe/zz9YpXzMmvX2PKhUNTUIwuBH+03Kbt+y+/VUIxBr3x4+lZn61rs+fiqOROMYfWklS9dz3gmswTo95adHkL1cCwvdNleVVI2wvG16TMeuMK05gxH9YC3aU+flDagbueYf+MeG9oPf7hbB8CPv0zDcR1tOe1wdRZpoHBIlEHvh5SyNxNwUbA77v8/zNy+kpJ2UmJ3cJCrwpCkhXFndaZ+ulmf5MG+xujn9YFdWyJ0XP8aNKeZ+Vzm4auIBFcjg9v/MbI2KNv6sFyiI8YPHSkBYcRTYolP6xEF1JEc462XEbqCUD+lu7FyLyksoyWXNCA==", "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=fail (sender ip is\n 165.85.157.49) smtp.rcpttodomain=lists.denx.de\n smtp.mailfrom=gehealthcare.com; dmarc=fail (p=quarantine sp=quarantine\n pct=100) action=quarantine header.from=gehealthcare.com; dkim=none (message\n not signed); arc=none (0)", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gehealthcare.com;\n s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=WqQOZFNCT5FSCVQbTMxrO20l6tRo9Kz8g660J/tgnUc=;\n b=vs8FBxecxqXIcwGAMDI5eG8CSAwOlf+eMfH+mANTcmBD5pMNGzAMWl8O8BV9D5TYPd9bmroN8cxZMel1zNPU7X7HTEXZXlKK0NCH0pYJ99OJ7IztH1P/FPMd2oLX1zW3UBxit9WRI1bQli3ypAwfTt8nhhlnYommPiWhvcGsBpuv4G+/1h1voMxJ/UaKFURNmEvEJ4YysUvn+xjUY7HItXC532WJ9RSzoQszFtVQijvWnG7d61JYvn6o/jvt/EB0ROmh4hJ0LW3l2Amm717sZeRHgCG1ks+pK8HVW4gUo1ZSpXV0Et2L3+jps9DIV1vJVo2qdO9tIZjc1fET+tRh+Q==", "X-MS-Exchange-Authentication-Results": "spf=fail (sender IP is 165.85.157.49)\n smtp.mailfrom=gehealthcare.com; dkim=none (message not signed)\n header.d=none;dmarc=fail action=quarantine header.from=gehealthcare.com;", "Received-SPF": "Fail (protection.outlook.com: domain of gehealthcare.com does\n not designate 165.85.157.49 as permitted sender)\n receiver=protection.outlook.com; client-ip=165.85.157.49;\n helo=mkerelay1.compute.ge-healthcare.net;", "From": "Brian Ruley <brian.ruley@gehealthcare.com>", "To": "u-boot@lists.denx.de, Anatolij Gustschin <ag.dev.uboot@gmail.com>,\n Tom Rini <trini@konsulko.com>", "Cc": "Brian Ruley <brian.ruley@gehealthcare.com>,\n Stefano Babic <sbabic@nabladev.com>", "Subject": "[PATCH v2 6/6] video: imx: ipuv3: use clock framework", "Date": "Tue, 10 Feb 2026 11:00:28 +0200", "Message-Id": "<20260210090029.728636-7-brian.ruley@gehealthcare.com>", "X-Mailer": "git-send-email 2.39.5", "In-Reply-To": "<20260210090029.728636-1-brian.ruley@gehealthcare.com>", "References": "<\"20260205141332.2515996-6-brian.ruley@gehealthcare.com\">\n <20260210090029.728636-1-brian.ruley@gehealthcare.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-EOPAttributedMessage": "0", "X-MS-PublicTrafficType": "Email", "X-MS-TrafficTypeDiagnostic": "BL02EPF00021F6F:EE_|LV3PR22MB5872:EE_", "Content-Type": "text/plain", "X-MS-Office365-Filtering-Correlation-Id": "68853ac9-6175-49ac-2d48-08de6882e407", "X-MS-Exchange-SenderADCheck": "1", "X-MS-Exchange-AntiSpam-Relay": "0", "X-Microsoft-Antispam": "BCL:0;\n ARA:13230040|36860700013|1800799024|82310400026|376014;", "X-Microsoft-Antispam-Message-Info": "\n foMAyw73Y34MiHyxMTzIx2CEHOz9SON+yASQ9cSdRrYAEPxVwnyFAeVxnFw5M08fm+ukUP5y6JCOZPbq//pZPtQxRWyaiPoPkjIC9LNRqBZAGkvRRS/sYUe6ngtXNKnARgiPV71AZ2vjP80yxIvVdM4RKsTpY+ijS1Pim1ZKJCF7zDTjndhpj0TMOwnl44F+P7QNKmyZuC8HxaburaHCVAMsuBpbvf88WAH8xoaPE+UI4HxxHyxwB5hrehpgiHFyAcTkds7/o6cddGE4UDm3bmMpjovdgi0jpoJLyfFE7s0h2R40hYLp4dfSiWiPKZ+6c6lghytLQrMADV5+7gEW9yvfCS+l6L9e1sDTQh0VRUlEMpJN0+nOLqtObrlWHGqPQQPKIkh+BbhqeZqm46369VcVDtDNvK3U6dA6rI22HV7f6tXeNLB+CwyPP2HhJ7KEibQMt13xe1qwLapuk6Qz2A8pWPQ2XqXLBP6N+gs3hn21MsFj8N5sb8iTJMnFBLDAFugFpcIS1kfDtHqmmi3GpukJwhvkCdIbsCjeq8JChG/nPkuxL3n//JY4idnpIyUTAr/weLkFo0ce2l0MwWIz5e4NRdozH8wt1MnYiKrfDK78GkA5S11h3pL1vgoWFLqtPB6uhcQQtT3d2VAddHZMv95BToO+j+p8wPmwpHlr1cpe3WzWF2fwmkZuzY1zrCd8DGCrkBZuoOLTLCo87u0o2ZhTkgjHWqG847cp2tVl2vRa0bXs6Y/7Le7VwhSfMRE40CinpgEceLKwF65dJdIKitfptToEduDqRF2bbpUSDu/EcxIF/rI5lwEiKLIX05EVAXDHnmRAQZbOeuamMy6pPOW6tF4mOnmhtCqSXXPOKGFFl61UMoSlxdb3CIoeH9aBOAPiKClQmFEjWDfm0e/E3ewfTLx1zt5dwDrtSNEi6XOUQNCJj3k64MjDNP4+BFB59sumNthz0a3t4JsakXt2L8l4hACpHY1X/mX8p10KebPKxKU/iGVehsDZ6IK40yi1EGeRxObRZTDACSDwYLHVjzcoIAT9M7wtVQu1hh/z9u5Q2N4wTV2AfmXHvDeZ/SrJNhUCrcWVxVsGF2b62PgWm6jD/4eQntzWQu5gbbYhOzrWdKLA0PMrxLxT1YwDrEXg+IENR8K/ngrphN0ELYOMJDYHxMkxpnKjBMhLcWafxWtW4Ri1w2h45IEF2fYgTSd4PLP1qk248r4U8iZOUTroqMOO2nz3AlRfYsbcnM747KYitcIv/uNKrnwlnp45h+GSLSYI/oDjlHDX6OPoKInK9yA12Zel0bfgwt71VjiY3DoE9PapVtg+WVka0pxwfbc2FFOn8yp/Bf8kCP36dIF5qNtcpUiWY+mqjhEGWj/DWUaYa2R7KpcS+AvdDshlEUsY/ADam5Ul/LpWqDCxVkZeUhzV4pkdVz5gkUqG1mOGKK7sCg+cL9R1BJNDZI1WnOQOvD9zV6nsfkwxk/RELPXjxYqanauCa9D3Fv03E2+i8x+OlJyuo5qbvLVMiFaPDafqXMsBLa1Tk9rTcTiQhBlyTdzQV1tTNtVCWikv1GL+N0HMihMFpjPZQpjII02s/FFv1Ri/4TPph5iQ1Um3+dxT/uVYBBmw/Q0+WeNc5o3NAs/GeQ8Ti/7qt3Exdgjgm3+GHFLUZJjMiLyMgckH/dMumQ==", "X-Forefront-Antispam-Report": "CIP:165.85.157.49; CTRY:US; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:mkerelay1.compute.ge-healthcare.net;\n PTR:InfoDomainNonexistent; CAT:NONE;\n SFS:(13230040)(36860700013)(1800799024)(82310400026)(376014); DIR:OUT;\n SFP:1101;", "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1", "X-MS-Exchange-AntiSpam-MessageData-0": "\n KswyKTANgrA0E0vpmhav7jU7lAyxUbDooHlSW9oF9lNusfT1q18SJ+I0SQnLWvVbf05Zdkf0od9AssWzeUjOZ6yYuGvQoQkH0iXsTvt2ZoPGDf1macbZVrgj+ZROZn+jYeaY+NOJ8cmKvmtiJGAmDvpv2CLjhV4HdBLZaYqgMWkHV2bGJoAusIhP8TsmwKArlDRBzdMyVHYbuYMY3UERSVekccXFTRHSAAqcFjnn6b01qLdC9EYheQmI4H3wDZcXkbWxHdoZzF1++9cXs4sOUZKIgbbrKcpeaflXiLY9bg9h0kZOEolVfFJlquRcDAJXXBy9920WFMASgQeOeWRDAf93YIaK6ohjRkgllphNWuy9MX8uDhVGO8bESJ3psBn8zaLKoTzwTAKB6c5B9ObSEF1AYYTkZtylVVAkzr+834cZAVc8PWZWmzpJvC4dyJwV", "X-OriginatorOrg": "gehealthcare.com", "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "10 Feb 2026 09:00:51.2269 (UTC)", "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 68853ac9-6175-49ac-2d48-08de6882e407", "X-MS-Exchange-CrossTenant-Id": "9a309606-d6ec-4188-a28a-298812b4bbbf", "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=9a309606-d6ec-4188-a28a-298812b4bbbf; Ip=[165.85.157.49];\n Helo=[mkerelay1.compute.ge-healthcare.net]", "X-MS-Exchange-CrossTenant-AuthAs": "Internal", "X-MS-Exchange-CrossTenant-AuthSource": "\n TreatMessagesAsInternal-BL02EPF00021F6F.namprd02.prod.outlook.com", "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem", "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "LV3PR22MB5872", "X-Mailman-Approved-At": "Tue, 10 Feb 2026 13:41:53 +0100", "X-BeenThere": "u-boot@lists.denx.de", "X-Mailman-Version": "2.1.39", "Precedence": "list", "List-Id": "U-Boot discussion <u-boot.lists.denx.de>", "List-Unsubscribe": "<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>", "List-Archive": "<https://lists.denx.de/pipermail/u-boot/>", "List-Post": "<mailto:u-boot@lists.denx.de>", "List-Help": "<mailto:u-boot-request@lists.denx.de?subject=help>", "List-Subscribe": "<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>", "Errors-To": "u-boot-bounces@lists.denx.de", "Sender": "\"U-Boot\" <u-boot-bounces@lists.denx.de>", "X-Virus-Scanned": "clamav-milter 0.103.8 at phobos.denx.de", "X-Virus-Status": "Clean" }, "content": "Clocks are now configurable via the common clock framework, however,\nusers have the option use the legacy clocks if desired. The intent is to\nkeep the changes minimal for this old SoC.\n\nSigned-off-by: Brian Ruley <brian.ruley@gehealthcare.com>\n---\n\nChanges in v2:\n- Removed DEBUG define that was missed\n\n drivers/video/imx/ipu_common.c | 75 +++++++++++++---\n drivers/video/imx/ipu_disp.c | 142 +++++++++++++++++++++++++------\n drivers/video/imx/mxc_ipuv3_fb.c | 17 ++++\n 3 files changed, 196 insertions(+), 38 deletions(-)", "diff": "diff --git a/drivers/video/imx/ipu_common.c b/drivers/video/imx/ipu_common.c\nindex d994053394f..8630374a055 100644\n--- a/drivers/video/imx/ipu_common.c\n+++ b/drivers/video/imx/ipu_common.c\n@@ -101,7 +101,18 @@ struct ipu_ch_param {\n */\n static int ipu_clk_init(struct ipu_ctx *ctx)\n {\n+#if CONFIG_IS_ENABLED(IPU_CLK_LEGACY)\n \treturn ipu_clk_init_legacy(ctx);\n+#else\n+\tstruct clk *clk;\n+\n+\tclk = devm_clk_get(ctx->dev, \"bus\");\n+\tif (IS_ERR(clk))\n+\t\treturn PTR_ERR(clk);\n+\n+\tctx->ipu_clk = clk;\n+\treturn 0;\n+#endif\n }\n \n /*\n@@ -113,7 +124,13 @@ static int ipu_clk_init(struct ipu_ctx *ctx)\n */\n static int ipu_ldb_clk_init(struct ipu_ctx *ctx)\n {\n+#if CONFIG_IS_ENABLED(IPU_CLK_LEGACY)\n \treturn ipu_ldb_clk_init_legacy(ctx);\n+#else\n+\t/* Set this in the FB driver where we know the display id */\n+\tctx->ldb_clk = NULL;\n+\treturn 0;\n+#endif\n }\n \n /* Static functions */\n@@ -150,6 +167,29 @@ static inline void ipu_ch_param_set_buffer(u32 ch, int buf_num,\n #define idma_mask(ch) (idma_is_valid(ch) ? (1UL << (ch & 0x1F)) : 0)\n #define idma_is_set(reg, dma) (__raw_readl(reg(dma)) & idma_mask(dma))\n \n+/*\n+ * Function to initialize the display clocks\n+ *\n+ * @param ctx\t The ipu context for which the function is called\n+ *\n+ * Return: Returns 0 on success or negative error code on error\n+ */\n+static int ipu_di_clk_init(struct ipu_ctx *ctx, int id)\n+{\n+#if CONFIG_IS_ENABLED(IPU_CLK_LEGACY)\n+\tctx->di_clk[id] = NULL;\n+\treturn 0;\n+#else\n+\tstruct clk *clk;\n+\n+\tclk = devm_clk_get(ctx->dev, id ? \"di1\" : \"di0\");\n+\tif (IS_ERR(clk))\n+\t\treturn PTR_ERR(clk);\n+\n+\tctx->di_clk[id] = clk;\n+\treturn 0;\n+#endif\n+}\n /*\n * Function to initialize the pixel clock\n *\n@@ -159,7 +199,12 @@ static inline void ipu_ch_param_set_buffer(u32 ch, int buf_num,\n */\n static int ipu_pixel_clk_init(struct ipu_ctx *ctx, int id)\n {\n+#if CONFIG_IS_ENABLED(IPU_CLK_LEGACY)\n \treturn ipu_pixel_clk_init_legacy(ctx, id);\n+#else\n+\tctx->pixel_clk[id] = ctx->ipu_clk;\n+\treturn 0;\n+#endif\n }\n \n /*\n@@ -230,33 +275,39 @@ struct ipu_ctx *ipu_probe(struct udevice *dev)\n \tipu_cpmem_base = (u32 *)(ipu_base + IPU_CPMEM_REG_BASE);\n \tipu_dc_tmpl_reg = (u32 *)(ipu_base + IPU_DC_TMPL_REG_BASE);\n \n-\tret = ipu_pixel_clk_init(ctx, 0);\n-\tif (ret)\n-\t\tgoto err;\n-\n-\tret = ipu_pixel_clk_init(ctx, 1);\n-\tif (ret)\n-\t\tgoto err;\n+\tfor (int i = 0; i <= 1; i++) {\n+\t\tret = ipu_pixel_clk_init(ctx, i);\n+\t\tif (ret)\n+\t\t\tgoto err;\n+\t}\n \n \tret = ipu_clk_init(ctx);\n \tif (ret)\n \t\tgoto err;\n \n-\tdebug(\"ipu_clk = %u\\n\", clk_get_rate(ctx->ipu_clk));\n+\tdebug(\"ipu_clk = %lu\\n\", (ulong)clk_get_rate(ctx->ipu_clk));\n \n \tret = ipu_ldb_clk_init(ctx);\n \tif (ret)\n \t\tgoto err;\n \n-\tdebug(\"ldb_clk = %u\\n\", clk_get_rate(ctx->ldb_clk));\n+\tif (ctx->ldb_clk)\n+\t\tdebug(\"ldb_clk = %lu\\n\", (ulong)clk_get_rate(ctx->ldb_clk));\n+\n \tipu_reset();\n \n+#if CONFIG_IS_ENABLED(IPU_CLK_LEGACY)\n \tclk_set_parent(ctx->pixel_clk[0], ctx->ipu_clk);\n \tclk_set_parent(ctx->pixel_clk[1], ctx->ipu_clk);\n+\n \tclk_enable(ctx->ipu_clk);\n+#endif\n \n-\tctx->di_clk[0] = NULL;\n-\tctx->di_clk[1] = NULL;\n+\tfor (int i = 0; i <= 1; i++) {\n+\t\tret = ipu_di_clk_init(ctx, i);\n+\t\tif (ret)\n+\t\t\tgoto err;\n+\t}\n \n \t__raw_writel(0x807FFFFF, IPU_MEM_RST);\n \twhile (__raw_readl(IPU_MEM_RST) & 0x80000000)\n@@ -278,7 +329,9 @@ struct ipu_ctx *ipu_probe(struct udevice *dev)\n \t/* Set MCU_T to divide MCU access window into 2 */\n \t__raw_writel(0x00400000L | (IPU_MCU_T_DEFAULT << 18), IPU_DISP_GEN);\n \n+#if CONFIG_IS_ENABLED(IPU_CLK_LEGACY)\n \tclk_disable(ctx->ipu_clk);\n+#endif\n \n \treturn ctx;\n err:\ndiff --git a/drivers/video/imx/ipu_disp.c b/drivers/video/imx/ipu_disp.c\nindex 6a337b13af6..5e78574da9b 100644\n--- a/drivers/video/imx/ipu_disp.c\n+++ b/drivers/video/imx/ipu_disp.c\n@@ -612,6 +612,11 @@ void ipu_dp_dc_enable(struct ipu_ctx *ctx, ipu_channel_t channel)\n \t__raw_writel(reg, DC_WR_CH_CONF(dc_chan));\n \n \tclk_enable(ctx->pixel_clk[di]);\n+#if !CONFIG_IS_ENABLED(IPU_CLK_LEGACY)\n+\treg = __raw_readl(IPU_DISP_GEN);\n+\treg |= di ? DI1_COUNTER_RELEASE : DI0_COUNTER_RELEASE;\n+\t__raw_writel(reg, IPU_DISP_GEN);\n+#endif\n }\n \n static unsigned char dc_swap;\n@@ -702,6 +707,12 @@ void ipu_dp_dc_disable(struct ipu_ctx *ctx, ipu_channel_t channel,\n \n \t\t/* Clock is already off because it must be done quickly, but\n \t\t we need to fix the ref count */\n+#if !CONFIG_IS_ENABLED(IPU_CLK_LEGACY)\n+\t\treg = __raw_readl(IPU_DISP_GEN);\n+\t\treg &= ctx->dc_di_assignment[dc_chan] ? ~DI1_COUNTER_RELEASE :\n+\t\t\t\t\t\t\t~DI0_COUNTER_RELEASE;\n+\t\t__raw_writel(reg, IPU_DISP_GEN);\n+#endif\n \t\tclk_disable(ctx->pixel_clk[ctx->dc_di_assignment[dc_chan]]);\n \t}\n }\n@@ -765,40 +776,21 @@ static int ipu_pixfmt_to_map(u32 fmt)\n *\n * @param\tsig\tBitfield of signal polarities for LCD interface.\n *\n- * Return:\tThis function returns 0 on success or negative error code on\n- *\t\tfail.\n+ * Return:\tThe integer portion of the divider set for the pixel clock.\n */\n-\n-int32_t ipu_init_sync_panel(struct ipu_di_config *di, ipu_di_signal_cfg_t sig)\n+static u32 ipu_di_clk_config(struct ipu_di_config *di, ipu_di_signal_cfg_t sig)\n {\n \tstruct ipu_ctx *ctx = di->ctx;\n \tint disp = di->disp;\n-\tu32 reg;\n-\tu32 di_gen, vsync_cnt;\n-\tu32 div, rounded_pixel_clk;\n-\tu32 h_total, v_total;\n-\tint map;\n-\tstruct clk *di_parent;\n-\n-\tdebug(\"panel size = %d x %d\\n\", di->width, di->height);\n-\n-\tif ((di->v_sync_width == 0) || (di->h_sync_width == 0))\n-\t\treturn -EINVAL;\n-\n-\t/* adapt panel to ipu restricitions */\n-\tif (di->v_end_width < 2) {\n-\t\tdi->v_end_width = 2;\n-\t\tputs(\"WARNING: v_end_width (lower_margin) must be >= 2, adjusted\\n\");\n-\t}\n-\n-\th_total = di->width + di->h_sync_width + di->h_start_width +\n-\t\t di->h_end_width;\n-\tv_total = di->height + di->v_sync_width + di->v_start_width +\n-\t\t di->v_end_width;\n+\tu32 div;\n \n \t/* Init clocking */\n \tdebug(\"pixel clk = %dHz\\n\", di->pixel_clk_rate);\n \n+#if CONFIG_IS_ENABLED(IPU_CLK_LEGACY)\n+\tu32 rounded_pixel_clk;\n+\tstruct clk *di_parent;\n+\n \tif (sig.ext_clk) {\n \t\tif (!(g_di1_tvout && (disp == 1))) { /*not round div for tvout*/\n \t\t\t/*\n@@ -830,13 +822,109 @@ int32_t ipu_init_sync_panel(struct ipu_di_config *di, ipu_di_signal_cfg_t sig)\n \t\tif (clk_get_usecount(ctx->pixel_clk[disp]) != 0)\n \t\t\tclk_set_parent(ctx->pixel_clk[disp], ctx->ipu_clk);\n \t}\n+\n \trounded_pixel_clk =\n \t\tclk_round_rate(ctx->pixel_clk[disp], di->pixel_clk_rate);\n \tclk_set_rate(ctx->pixel_clk[disp], rounded_pixel_clk);\n-\tudelay(5000);\n+\n \t/* Get integer portion of divider */\n \tdiv = clk_get_rate(clk_get_parent(ctx->pixel_clk[disp])) /\n \t rounded_pixel_clk;\n+#else\n+\tstruct clk *clk;\n+\tu32 clkgen0, di_gen;\n+\tulong id;\n+\n+\tif (sig.ext_clk) {\n+\t\t/*\n+\t\t * Bypass the divider, assuming synchronous mode\n+\t\t */\n+\t\tclk = ctx->di_clk[disp];\n+\t\tdiv = 1;\n+\t} else {\n+\n+\t\tulong clk_rate = clk_get_rate(ctx->ipu_clk);\n+\t\tu32 error;\n+\n+\t\tdiv = DIV_ROUND_CLOSEST(clk_rate, di->pixel_clk_rate);\n+\t\tdiv = clamp(div, 1U, 255U);\n+\n+\t\terror = (clk_rate / div) / (di->pixel_clk_rate / 1000);\n+\n+\t\t/*\n+ * Select IPU if the rate is within 1% of requested pixel\n+ * clock, otherwise, use the DI clock\n+ */\n+\t\tif (990 <= error && error < 1010) {\n+\t\t\tclk = ctx->ipu_clk;\n+\t\t} else {\n+\t\t\tclk = ctx->di_clk[disp];\n+\n+\t\t\tclk_set_rate(clk, di->pixel_clk_rate);\n+\t\t\tdiv = DIV_ROUND_CLOSEST(clk_get_rate(clk),\n+\t\t\t\t\t\tdi->pixel_clk_rate);\n+\t\t\tdiv = clamp(div, 1U, 255U);\n+\t\t}\n+\t}\n+\n+\tclkgen0 = div << 4;\n+\n+\tctx->pixel_clk[disp] = clk;\n+\tdebug(\"new pixel rate: %lu Hz\\n\", clk_get_rate(clk));\n+\n+\tid = clk_get_id(clk);\n+\t__raw_writel(clkgen0, DI_BS_CLKGEN0(id));\n+\t__raw_writel((clkgen0 & 0xFFF0) << 12, DI_BS_CLKGEN1(id));\n+\n+\tdi_gen = __raw_readl(DI_GENERAL(id)) & ~DI_GEN_DI_CLK_EXT;\n+\tif (clk == ctx->di_clk[disp])\n+\t\tdi_gen |= DI_GEN_DI_CLK_EXT;\n+\n+\t__raw_writel(di_gen, DI_GENERAL(id));\n+#endif\n+\n+\tudelay(5000);\n+\treturn div;\n+}\n+\n+/*\n+ * This function is called to initialize a synchronous LCD panel.\n+ *\n+ * @param\tdi\tPointer to display data.\n+ *\n+ * @param\tsig\tBitfield of signal polarities for LCD interface.\n+ *\n+ * Return:\tThis function returns 0 on success or negative error code on\n+ *\t\tfail.\n+ */\n+int32_t ipu_init_sync_panel(struct ipu_di_config *di, ipu_di_signal_cfg_t sig)\n+{\n+\tint disp = di->disp;\n+\tu32 reg;\n+\tu32 di_gen, vsync_cnt;\n+\tu32 div;\n+\tu32 h_total, v_total;\n+\tint map;\n+\n+\tdebug(\"panel size = %d x %d\\n\", di->width, di->height);\n+\n+\tif ((di->v_sync_width == 0) || (di->h_sync_width == 0))\n+\t\treturn -EINVAL;\n+\n+\t/* adapt panel to ipu restricitions */\n+\tif (di->v_end_width < 2) {\n+\t\tdi->v_end_width = 2;\n+\t\tputs(\"WARNING: v_end_width (lower_margin) must be >= 2, adjusted\\n\");\n+\t}\n+\n+\th_total = di->width + di->h_sync_width + di->h_start_width +\n+\t\t di->h_end_width;\n+\tv_total = di->height + di->v_sync_width + di->v_start_width +\n+\t\t di->v_end_width;\n+\n+\tdiv = ipu_di_clk_config(di, sig);\n+\tif (div < 0)\n+\t\treturn div;\n \n \tipu_di_data_wave_config(disp, SYNC_WAVE, div - 1, div - 1);\n \tipu_di_data_pin_config(disp, SYNC_WAVE, DI_PIN15, 3, 0, div * 2);\ndiff --git a/drivers/video/imx/mxc_ipuv3_fb.c b/drivers/video/imx/mxc_ipuv3_fb.c\nindex ab416fdd33c..cfc34972ad1 100644\n--- a/drivers/video/imx/mxc_ipuv3_fb.c\n+++ b/drivers/video/imx/mxc_ipuv3_fb.c\n@@ -36,6 +36,7 @@\n #include <dm.h>\n #include <dm/devres.h>\n #include <video.h>\n+#include <dt-bindings/clock/imx6qdl-clock.h>\n \n DECLARE_GLOBAL_DATA_PTR;\n \n@@ -602,6 +603,22 @@ static int ipuv3_video_probe(struct udevice *dev)\n \tif (ret < 0)\n \t\treturn ret;\n \n+#if !CONFIG_IS_ENABLED(IPU_CLK_LEGACY)\n+\tif (of_machine_is_compatible(\"fsl,imx6qp\"))\n+\t\tret = clk_get_by_id(gdisp ? IMX6QDL_CLK_LDB_DI1_PODF :\n+\t\t\t\t\t IMX6QDL_CLK_LDB_DI0_PODF,\n+\t\t\t\t &ctx->ldb_clk);\n+\telse\n+\t\tret = clk_get_by_id(gdisp ? IMX6QDL_CLK_LDB_DI1 :\n+\t\t\t\t\t IMX6QDL_CLK_LDB_DI0,\n+\t\t\t\t &ctx->ldb_clk);\n+\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n+\tdebug(\"ldb_clk = %lu\\n\", clk_get_rate(ctx->ldb_clk));\n+#endif\n+\n \tret = mxcfb_probe(dev, gpixfmt, gdisp, gmode);\n \tif (ret < 0)\n \t\treturn ret;\n", "prefixes": [ "v2", "6/6" ] }