From patchwork Wed Sep 26 13:52:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Fan X-Patchwork-Id: 975129 X-Patchwork-Delegate: sbabic@denx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=nxp.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.b="PnvPmavq"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 42KzvF2J4Kz9s89 for ; Wed, 26 Sep 2018 23:54:16 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 8D15AC21E52; Wed, 26 Sep 2018 13:53:35 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=BAD_ENC_HEADER, SPF_HELO_PASS, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 7B010C21DC1; Wed, 26 Sep 2018 13:47:49 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id EBCBCC21E85; Wed, 26 Sep 2018 13:47:43 +0000 (UTC) Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-eopbgr80075.outbound.protection.outlook.com [40.107.8.75]) by lists.denx.de (Postfix) with ESMTPS id 7997EC21E7F for ; Wed, 26 Sep 2018 13:47:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=OMOxFpeyNv2FEQ3/K0kSOPGpP0dH0yhfLDrFK0cXzkE=; b=PnvPmavqTQY5LrxOZ/MEgrq3rwp5Y+YU8T0HsFYkX+73MKphzhFTTrYzuS7HmLsL4qrhKGNvJPrc3ys9VxbawsirGxxegngT+dSHbj7PIXj/V7ReJ8Zr3tcg6ppjCy741nv5ZRfMi7x739Ifh1+TNc5PWIj7T3YefFI0nmDSXdk= Received: from linux-u7w5.ap.freescale.net.net (92.121.68.129) by AM0PR04MB4482.eurprd04.prod.outlook.com (2603:10a6:208:73::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1164.22; Wed, 26 Sep 2018 13:47:33 +0000 From: Peng Fan To: sbabic@denx.de, agust@denx.de Date: Wed, 26 Sep 2018 21:52:32 +0800 Message-Id: <20180926135256.2098-9-peng.fan@nxp.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180926135256.2098-1-peng.fan@nxp.com> References: <20180926135256.2098-1-peng.fan@nxp.com> MIME-Version: 1.0 X-Originating-IP: [92.121.68.129] X-ClientProxiedBy: HK0PR01CA0053.apcprd01.prod.exchangelabs.com (2603:1096:203:a6::17) To AM0PR04MB4482.eurprd04.prod.outlook.com (2603:10a6:208:73::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 71ba7fb4-e527-456e-7be2-08d623b69d8c X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534165)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:AM0PR04MB4482; X-Microsoft-Exchange-Diagnostics: 1; AM0PR04MB4482; 3:ApPHlGEfIGMqIWWL/BRtxwK24woB8Zix3QuHAHuv87wxeWWZLRk1NqYzXD9k0ZH/r0ongk15zAGnd5Zs3DSWWlT8WFj5X7UdX/U7OiPKlKY3SwR6TFdqpPwQ6XR1DLW5Vodn7pUKBTnBdjQFd5ksc+wkkSc2qPV+Jj5FBQsJNvloXHkmD5+iDUsqA3iHVmPsFz0CSkMaOVVn9uw0T/0XpBmpEG9Z5QJTJszfEWMo+4ZoU0snY/tU8+YOUtRlH/Ab; 25:L3dex7wCHFG5iVLHEFT2i9gimNuCrC3mHpYnsrjhC/fMdQWs9OApuGVwq5KU98FdWQ32+fF22+Y+A1whpOCukrn94nhDcbuTbe+kB0avYcqDV5G/Xq+kIgCLxpUHVpY+CL5pdBbfllJquX+rtocVTdDsUoL4KvbwGzz/CuILhMMAxJ4ml2RBJWIN5EA7teY4LDwNcjk5/NqMAN1zGtehym9TPWGo0nEzXUVmGj+fvRDtCykwslxckHFgKyHmNYWapsyMbbQ7Qr0v+ZMmw3yF2QNsF95/hN8GhPuoH6YYMQRLjo1hVJfrAlpRKggETDfoUoCbYJEap3Wjc8NIPd/SwA==; 31:57wks2qL9B1dQ2umfYSDknUWlZDf97aO+VyaDAkXwPZN8IPdrJhS17xrtRwj9qVpswsU+0ACdwqh0Qe7huWxZXmzXt8gsCJz5OezlDscBxLQF1JXOC2xgycNUi0Uq2nws9JuluDgx5vOFYbMNHly0a2XZ2yM8bPu8GRYJEecMvYJ3wfVoqKyLzB4pjJb8pjuHbligrW3LuCGP1Wqf4Miw0b3+QKx2nHTfaUpJM3h0g8= X-MS-TrafficTypeDiagnostic: AM0PR04MB4482: X-Microsoft-Exchange-Diagnostics: 1; AM0PR04MB4482; 20:idP4Nsy9Ey6vaFb9XEG1ZHwMGrKeA/UOukb//9CxULHqj6ciI5aPqVHBeM1JKTRqecG9szSQ2ABX80v7vZW9PEX+GPH267PPoWylFX+jsXAfMBuWKdg8kl1XFtl/joQn7Pd8doxZgm7YVS1ZRxeWkYbmLhVKVUim+qvJObCSq+MPUIKtvh8nIAAGdICzpoQYzII898sNEzysY0xIzhvqBzy90nxD0CcVMqeEalgvl4yJQoGcFe1LiJwZrYKM/1klH2sDl2nJplNCa3/ccLLuQd2dJVwJzbFxgpRQh5hsI6wuhhlu98RVOo64Da7JHcZEyQvoDqwRifXqsrGLPjga7ZYr7geOTxRjWWLP+BVt0cQ09/VDKZIlEqFJSGy4OzxJCMYMJDhFayoTHUaeno7YjUasLJBHVszHDOsSZyIgsSF+I8Zg+yKepjfzEbX48NqvgYCk8QF84TlENM30/oj/kmkQ8JBu0ql6onDq1CeiYBJlIIzXHsx1GfdemBuHBmWk; 4:ALkLkg4if9QVqD6A4F0WCz1oz/uFtnqCFeQXHtyiBU7/WnycWEdWkGHz8LyyFbZzefc7CscWvzVEhvaGetrHbIjPr7r/0LSfQ3g+na5VujpB+w99F56YlrGlAbEDJrqrYxqc+gkUVf7t9mKSw4vBMWt+WNLSFIa844UG5qJU1TqcZwm5inreZ8jrDbzybBeTibRHV04oyHuPR160qPiq+CywRAhq+xfdGyZXMR4oIKXi40NeNli2CkXNZUmm/yY6TfHv6beGD65kUX65ezqlbu22ovkTgU1rjcTqtK0CKSfHvY74WQiWOiW6+u2dzGfK X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(10201501046)(3002001)(93006095)(93001095)(3231355)(944501410)(52105095)(6055026)(149066)(150057)(6041310)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051)(76991041); SRVR:AM0PR04MB4482; BCL:0; PCL:0; RULEID:; SRVR:AM0PR04MB4482; X-Forefront-PRVS: 08076ABC99 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(136003)(39860400002)(366004)(376002)(346002)(396003)(189003)(199004)(16586007)(34290500001)(3846002)(6116002)(76176011)(51416003)(52116002)(305945005)(7736002)(36756003)(47776003)(66066001)(6486002)(105586002)(53936002)(1076002)(386003)(6506007)(6512007)(106356001)(86362001)(50226002)(186003)(97736004)(478600001)(16526019)(48376002)(486006)(476003)(50466002)(2616005)(446003)(11346002)(8676002)(8936002)(81166006)(44832011)(81156014)(4326008)(2906002)(25786009)(5660300001)(6346003)(26005)(68736007)(316002)(956004); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR04MB4482; H:linux-u7w5.ap.freescale.net.net; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=peng.fan@nxp.com; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM0PR04MB4482; 23:xlEOkqhWVR05NzNxtHqe9EowelHo4sidBwEi/spHF?= NQ+P9/Rx1LiZDjHE40Zywt3hmlc65lfKDP4J6NJOTqCvEr8X8rX5zWv+aryDb/SMYaCmPeWm+iHU41vajup/KDbz39L342i0GTVZdHqZ3aTUxcvn2nuqJj/RyKolVkWAjsAk4MmoHgNQFGoPrNSqOOVDms5nS3U9lrG1bG2pi869OClZT1JTqS6y74HHTavWpoD9+KsdniPAEi4Bbzd1FzQlnJvgSX7hyhRd/didO6pO1LaN+kELHAc4e88cjhjTXjTUoVCMK4ktu0jUJA8hJ3CRNV+3HYDHIa6diFfGZU+1I7W9PLGyDWa3nGn8Ho36k7V7x88Rxiw7aeilWAejk6LY23FPh+wwL1aGk0NKMeUSj02D/Yak71gpvFNSgAlkowziOHup1eWmMNOALHmYxWtRXfr4PZ3cMFGjaLIobjvNsO1dmUP5o+TP7dq87W+Ryfpxdprc/KFo6aYDvKtSDxeMkijxet5EGW2sJhkdGhcTlbrbUNgT20Ajg/HQxqenD9EmO87URguNMNMFILAqr2mBSoXrmtdwBL+kyvqkjxbp6MH84m27MoPxawDQNjMOdg6GNaZ2J3OoSGfOlMTblyNznLN4XrePNQO9I/QcEnxZxAhy3TB2HMgYDnI1RLWaJsowradA9iNSbX8EZg06r12jY088vGPKKzQZmPbx8Av74U1GdBPyFwL9QT9l9fAI9bB6+ut62S7yuZLs8ciX6P5n20diJyBXbospJgQttFEChMSlzhK/PZaAs78ZHen0RPbHv7mgo+FJgO4OcjtcOxO9L8UqZ0ki0FXw9uby2eKISINJJHYb33e+BCMJ4joLQIKbHIjlc63tbG2pL/ez1yyGcSxU6xpY6cloHi3+m2bNOQofHQdAp3g7sCTlSoCxacd5/7LhaylJS2siNsHtZuHdkeqyC4vD0BVOJZwEMoAJdo6a4VnnxxL8odT6FerXau7AhoalSQoHjU8qkocRjxcynWPCtM03diQJwTh5VtvJVZddjOLq5BYkaI1GA4z/Qo4zhKEB7nbTJ8S5dDMNvGPTA+wyZ56+g6Z0KRr+yxE/w5CGtcOGk1qPunnG6lD0PnTUzRbwm+MbTU1TLU0ZJY88Q/Czz2/N9AiHIOPBZ48n51aadSSpVsEupI3+3iHzRZqR9CmdgOuOhGMJye01E6X X-Microsoft-Antispam-Message-Info: z8oorQtxavMdSMrPEoQJH/RYy4zV1zlJ4JDL9ZoO3KWXUb613JLJ1x1ZdO2f8Yrz5/NN2OaVN3QROX9ugFxRO4neW4prYEx+BKWjMxriV4rqx+UQZH3JpYq2ccsv+bUh44x3n0Y5R5egUs7kvgk7MGJwntAa9v87Z+HTn6ZE0yZppKdK7qixbdPl0kd38d6BMXlndfVvGxSSGvsYz64zM5BYqe2JAc491SzPa73lQ4pCRKcH5z5mQnymI+e87Y+Luk0GkXzVONDkIHrkRHFnfNuKvZ3v8tu3bx9fgqBdkb5yn+BtCYCjNypLwc36g2gdvoHFAfEhMhuCpU3fvJko5jrK+nBmSGjikd0iq+NZYkc= X-Microsoft-Exchange-Diagnostics: 1; AM0PR04MB4482; 6:p7TGb/zA4I6lca7t01hscaH+/TzifdLa9wquVb6A+vqS24blI4i6UVOFmVMv2uYtJDRp6awd1g55KKFPahgiVJL8jHAhs3qUCMpcfdAH/cBxL6D2EmwurpJ8Tx5hzWNfIhK7a2XH0NIJO7ILdOR29tbE9vWTSubs+38pA812RXqAwyQh5WviDU8qCzPGfrsiqEb2OPEw8tAHARhZqD6eN5O43vcibScVaNI720BKirMOnRERpkdgCiFrVZsp5zU4p59tg1TuQVVqKc3Il4f03ULHUKWxnfnpFuPtgkQTrU7GHbaImTEcrLWlC7cR8nTGPuWfjzS+nIIzVc3UU5PqWfhBTVE9SmqdWRhtxTgAWbYVYChA8aoGITuxrrhNxCrMq8sZbmRX3no1AVjKpIe3O4kkKCJxw1fJ+SH+tBHcJj2Pfcw7YNwXqsg21PZ2spdqgEqqC1fJeKcZoD8ROkbdVQ==; 5:Hymy4tOIXqbCTFEeBQDstenxEQ2TVSr5+RIdc5XG9E4a3vhIcXEO1XGmXGSyjEWyefeyBbN/lJDbOfzeE3GUV5Jkaqmb6gEfGy/7+4iE5OvPQZxIlOJXFNewpgMUySkshFgszPOwN43vPNKC4j5xVD+XAJFUNuqNTy2yUlsoZqw=; 7:LwuOWdwJjh/UBWxJ0jel6NKe+EMDRYIXulUrJ+J9FmiNjCALHjHYUTyxDx2e2SWvhjGSlalZ57BgLkKNtgRUTLRsJgwjm86f/EWS4mw/8FRqk2y+3Yvuug3DtsOtE8A+aTCE/SuwNtsmcODT3zBfljSklhgLqq4gU37D7Sa/vWLLPrX3RfrWceWSHoFuuCpqSeOeYuUN0wwoS/PQUvl1Z1W0j0+3BnvxZDoHTPfDAeDQtnEP+kRO0jMPfmERvwEN SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Sep 2018 13:47:33.2034 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 71ba7fb4-e527-456e-7be2-08d623b69d8c X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR04MB4482 Cc: u-boot@lists.denx.de Subject: [U-Boot] [PATCH V5 08/32] misc: add i.MX8 misc driver X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Add i.MX8 MISC driver to handle the communication between A35 Core and SCU. Signed-off-by: Peng Fan Reviewed-by: Anatolij Gustschin --- drivers/misc/Makefile | 1 + drivers/misc/imx8/Makefile | 3 + drivers/misc/imx8/scu.c | 266 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 270 insertions(+) create mode 100644 drivers/misc/imx8/Makefile create mode 100644 drivers/misc/imx8/scu.c diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index da4666fdfc..59c816e75a 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -20,6 +20,7 @@ obj-$(CONFIG_FSL_IIM) += fsl_iim.o obj-$(CONFIG_LED_STATUS_GPIO) += gpio_led.o obj-$(CONFIG_$(SPL_)I2C_EEPROM) += i2c_eeprom.o obj-$(CONFIG_FSL_MC9SDZ60) += mc9sdz60.o +obj-$(CONFIG_IMX8) += imx8/ obj-$(CONFIG_MXC_OCOTP) += mxc_ocotp.o obj-$(CONFIG_MXS_OCOTP) += mxs_ocotp.o obj-$(CONFIG_NUVOTON_NCT6102D) += nuvoton_nct6102d.o diff --git a/drivers/misc/imx8/Makefile b/drivers/misc/imx8/Makefile new file mode 100644 index 0000000000..3395340d22 --- /dev/null +++ b/drivers/misc/imx8/Makefile @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0+ + +obj-y += scu.o diff --git a/drivers/misc/imx8/scu.c b/drivers/misc/imx8/scu.c new file mode 100644 index 0000000000..14625ead06 --- /dev/null +++ b/drivers/misc/imx8/scu.c @@ -0,0 +1,266 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright 2018 NXP + * + * Peng Fan + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +struct mu_type { + u32 tr[4]; + u32 rr[4]; + u32 sr; + u32 cr; +}; + +struct imx8_scu { + struct mu_type *base; + struct udevice *clk; + struct udevice *pinclk; +}; + +#define MU_CR_GIE_MASK 0xF0000000u +#define MU_CR_RIE_MASK 0xF000000u +#define MU_CR_GIR_MASK 0xF0000u +#define MU_CR_TIE_MASK 0xF00000u +#define MU_CR_F_MASK 0x7u +#define MU_SR_TE0_MASK BIT(23) +#define MU_SR_RF0_MASK BIT(27) +#define MU_TR_COUNT 4 +#define MU_RR_COUNT 4 + +static inline void mu_hal_init(struct mu_type *base) +{ + /* Clear GIEn, RIEn, TIEn, GIRn and ABFn. */ + clrbits_le32(&base->cr, MU_CR_GIE_MASK | MU_CR_RIE_MASK | + MU_CR_TIE_MASK | MU_CR_GIR_MASK | MU_CR_F_MASK); +} + +static int mu_hal_sendmsg(struct mu_type *base, u32 reg_index, u32 msg) +{ + u32 mask = MU_SR_TE0_MASK >> reg_index; + u32 val; + int ret; + + assert(reg_index < MU_TR_COUNT); + + /* Wait TX register to be empty. */ + ret = readl_poll_timeout(&base->sr, val, val & mask, 10000); + if (ret < 0) { + printf("%s timeout\n", __func__); + return -ETIMEDOUT; + } + + writel(msg, &base->tr[reg_index]); + + return 0; +} + +static int mu_hal_receivemsg(struct mu_type *base, u32 reg_index, u32 *msg) +{ + u32 mask = MU_SR_RF0_MASK >> reg_index; + u32 val; + int ret; + + assert(reg_index < MU_TR_COUNT); + + /* Wait RX register to be full. */ + ret = readl_poll_timeout(&base->sr, val, val & mask, 10000); + if (ret < 0) { + printf("%s timeout\n", __func__); + return -ETIMEDOUT; + } + + *msg = readl(&base->rr[reg_index]); + + return 0; +} + +static int sc_ipc_read(struct mu_type *base, void *data) +{ + struct sc_rpc_msg_s *msg = (struct sc_rpc_msg_s *)data; + int ret; + u8 count = 0; + + if (!msg) + return -EINVAL; + + /* Read first word */ + ret = mu_hal_receivemsg(base, 0, (u32 *)msg); + if (ret) + return ret; + count++; + + /* Check size */ + if (msg->size > SC_RPC_MAX_MSG) { + *((u32 *)msg) = 0; + return -EINVAL; + } + + /* Read remaining words */ + while (count < msg->size) { + ret = mu_hal_receivemsg(base, count % MU_RR_COUNT, + &msg->DATA.u32[count - 1]); + if (ret) + return ret; + count++; + } + + return 0; +} + +static int sc_ipc_write(struct mu_type *base, void *data) +{ + struct sc_rpc_msg_s *msg = (struct sc_rpc_msg_s *)data; + int ret; + u8 count = 0; + + if (!msg) + return -EINVAL; + + /* Check size */ + if (msg->size > SC_RPC_MAX_MSG) + return -EINVAL; + + /* Write first word */ + ret = mu_hal_sendmsg(base, 0, *((u32 *)msg)); + if (ret) + return ret; + count++; + + /* Write remaining words */ + while (count < msg->size) { + ret = mu_hal_sendmsg(base, count % MU_TR_COUNT, + msg->DATA.u32[count - 1]); + if (ret) + return ret; + count++; + } + + return 0; +} + +/* + * Note the function prototype use msgid as the 2nd parameter, here + * we take it as no_resp. + */ +static int imx8_scu_call(struct udevice *dev, int no_resp, void *tx_msg, + int tx_size, void *rx_msg, int rx_size) +{ + struct imx8_scu *priv = dev_get_priv(dev); + sc_err_t result; + int ret; + + /* Expect tx_msg, rx_msg are the same value */ + if (rx_msg && tx_msg != rx_msg) + printf("tx_msg %p, rx_msg %p\n", tx_msg, rx_msg); + + ret = sc_ipc_write(priv->base, tx_msg); + if (ret) + return ret; + if (!no_resp) { + ret = sc_ipc_read(priv->base, rx_msg); + if (ret) + return ret; + } + + result = RPC_R8((struct sc_rpc_msg_s *)tx_msg); + + return sc_err_to_linux(result); +} + +static int imx8_scu_probe(struct udevice *dev) +{ + struct imx8_scu *priv = dev_get_priv(dev); + fdt_addr_t addr; + + debug("%s(dev=%p) (priv=%p)\n", __func__, dev, priv); + + addr = devfdt_get_addr(dev); + if (addr == FDT_ADDR_T_NONE) + return -EINVAL; + + priv->base = (struct mu_type *)addr; + + /* U-Boot not enable interrupts, so need to enable RX interrupts */ + mu_hal_init(priv->base); + + gd->arch.scu_dev = dev; + + device_probe(priv->clk); + device_probe(priv->pinclk); + + return 0; +} + +static int imx8_scu_remove(struct udevice *dev) +{ + return 0; +} + +static int imx8_scu_bind(struct udevice *dev) +{ + struct imx8_scu *priv = dev_get_priv(dev); + int ret; + struct udevice *child; + int node; + + debug("%s(dev=%p)\n", __func__, dev); + + node = fdt_node_offset_by_compatible(gd->fdt_blob, -1, + "fsl,imx8qxp-clk"); + if (node < 0) + panic("No clk node found\n"); + + ret = lists_bind_fdt(dev, offset_to_ofnode(node), &child); + if (ret) + return ret; + + priv->clk = child; + + node = fdt_node_offset_by_compatible(gd->fdt_blob, -1, + "fsl,imx8qxp-iomuxc"); + if (node < 0) + panic("No clk node found\n"); + + ret = lists_bind_fdt(dev, offset_to_ofnode(node), &child); + if (ret) + return ret; + + priv->pinclk = child; + + return 0; +} + +static struct misc_ops imx8_scu_ops = { + .call = imx8_scu_call, +}; + +static const struct udevice_id imx8_scu_ids[] = { + { .compatible = "fsl,imx8qxp-mu" }, + { .compatible = "fsl,imx8-mu" }, + { } +}; + +U_BOOT_DRIVER(imx8_scu) = { + .name = "imx8_scu", + .id = UCLASS_MISC, + .of_match = imx8_scu_ids, + .probe = imx8_scu_probe, + .bind = imx8_scu_bind, + .remove = imx8_scu_remove, + .ops = &imx8_scu_ops, + .priv_auto_alloc_size = sizeof(struct imx8_scu), + .flags = DM_FLAG_PRE_RELOC, +};