From patchwork Wed Sep 5 02:11:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Fan X-Patchwork-Id: 966155 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="DklVnhBm"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 424nL523QMz9s3Z for ; Wed, 5 Sep 2018 12:13:17 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id D425BC21DDC; Wed, 5 Sep 2018 02:12:30 +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 1B192C21E56; Wed, 5 Sep 2018 02:07:08 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 885AAC21E47; Wed, 5 Sep 2018 02:07:03 +0000 (UTC) Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on0069.outbound.protection.outlook.com [104.47.2.69]) by lists.denx.de (Postfix) with ESMTPS id 3639AC21E1A for ; Wed, 5 Sep 2018 02:06:56 +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=5q6Wci+5DKeIN4DQUm53lVvSRFIwr1kyp7oeurxI+LA=; b=DklVnhBmzI1daOCF4Wv2w0At0sryov6axttO8W+SOwNrKso5faLBkbUcZO7sHHPjHG1yD5lO1grm5dLAFyajsiaLiXbULBSq1AB5POQM49Qj7q5mVNhJMg8fSRk3Q4imOB8srrBrS3zEbrBJAVQAwviyoaY/RLu5OYF7EYXJPos= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=peng.fan@nxp.com; Received: from linux-u7w5.ap.freescale.net.net (92.121.68.129) by VI1PR04MB4496.eurprd04.prod.outlook.com (2603:10a6:803:69::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1101.18; Wed, 5 Sep 2018 02:06:52 +0000 From: Peng Fan To: sbabic@denx.de Date: Wed, 5 Sep 2018 10:11:55 +0800 Message-Id: <20180905021219.12828-9-peng.fan@nxp.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180905021219.12828-1-peng.fan@nxp.com> References: <20180905021219.12828-1-peng.fan@nxp.com> MIME-Version: 1.0 X-Originating-IP: [92.121.68.129] X-ClientProxiedBy: HK0PR03CA0022.apcprd03.prod.outlook.com (2603:1096:203:2e::34) To VI1PR04MB4496.eurprd04.prod.outlook.com (2603:10a6:803:69::28) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 83c71cc1-208d-4d51-e5e9-08d612d440a8 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989137)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:VI1PR04MB4496; X-Microsoft-Exchange-Diagnostics: 1; VI1PR04MB4496; 3:Qm1GoF9JjXc9avvGG93kOeUdLlp4YMb5OM3bd5KLYk3q/BWu9M5NdJrRD5d0U+Hg5XvhrmER2VJEwdoSStoMgZyEe/JUtvCwCqRzHoD6owkzj/BpCQ0tAELwPfg30HWA5KMxR01GglYC1xtJeaHQ5Vm4hX883f1LA55rYb7l8AucC/qCKE1EQ5+Mokggtaa16ghZyQ8XPppFZn0IRGw+JQZrxbTpNKK5wNafG3fU248WUdGMX01mZh1kxvSs0bxu; 25:/bUG1iFFJ7iqM83M++LhU995BYTigUnjyOm7G398T3zI+F4XehCHGhOyDTu/EVKjlXFREIkK7D8DzF4rvqm24aIJXoBMTsMcwngdTwMYUurKXGZ0oGfHQWbinYL/+tDv9WCXd58LLAqm4HaSaisjxWgSDSDJ9SL3y/5rkv/yxPxDEA4mo4zmvNOWvjbMz7ap3M0mF8OYMKBkn7EWIgiBC1S7sIGZiDTZoaADbjxVFMGzs8FnkdTGEE/cYIbL8lTf2tP61QGADlthK2Dbzzt4nl4PvhF9nn0cQLSnFgmlvxG4ujyb3nzox12bV6cPTlGMgLUZsEW1KFYwkSdDptiTvA==; 31:3Ogy2Ex1NOfzm8jAC6xMvMabuqrvQ/YiicOoKLIbf9jxsCFA7GZ75aNVNqEkTDiATFmHryOYuiZskp4fVapJjMbkOk34aUdaadQSvtTcqtSGb8ztowDZMhX0pLejRIipO+gafSMm5GTJUGS92Me3JMPa3i3DTrkQ7bKdMYM9HfqW+8AYVOs61wBUU3uF+RacVVs6MkW0hi+5tL0Tu/ZNGuo6KSjRrN/Rg/u0Le+84eA= X-MS-TrafficTypeDiagnostic: VI1PR04MB4496: X-Microsoft-Exchange-Diagnostics: 1; VI1PR04MB4496; 20:SF5rf3sbW5iPEHrX+i9NlmzpBGVxTfKxXRRlnJLQi/hW6DijH2dRYI/1JJMj5wKFQCwZAyZj+qvzXShrs00r4dPUHJodq0qVIGyM9GiDwp4NRUWN/kB1j4gzqydK3XLAGCowzDaJmk7XhUhtXvsi68gvKJxN4+65JQ1RiPzChl5pw9DGYzRaZhHBnRHOGaGavTBnXri1Qf5X9cezr2wGibivr1eUgCt+6og9gYHPm7OVoXGGVO0RQfTaxIsATPoar31Qj1Fiv9hva+PyXTRU2vj/wp7tz7mNDfYqCX96LqugHu2kgVBRa5HnFCVEJ85j62KnqngGMR3gOgTvrFs5CzayVbBpOf5qAnBRw/sNLqOAA3Au1bNShYRB5qLYrSep6eXWGsLDjeXL+hD/sJpaoC3LNLR8BcJnYADEdgLrpL6DD0Qm81j5ReT6bISWQZpsC74fA6h/JwVEgyeFgWOqYHq7sDAvtwB6Jyo0bEE2rpdvSSTrsjdsG/ZcmJQL1nSl; 4:MChTiTI1t8tZiTMUGL26I4YXamZO7LLBj+wUHdrnoZFp9bNueXhHjl3+FWp+zqC3zISKYJerd5tNCb3IOsDFn7eJ5i/VsloS7izsCcbDIUzenuupRXXfpNXcKj58VQVZgN5IaRetQlO0e85LXgZbx54wK+6RRGQSWAza3cMTFhV2asfX6cQW5g3QDAwKy3TH46haWrQ1EUo+rJ+VOQz7agPmqdbGrw4HYIphg0LNGpQkPn8hPKButIanV47Hrg17MIh4FdcwyFsLuaW5HRw3u9pljhbqVBWUKxQItGsDY2rNSqh1EnfvfDm2bIJ6v6Ud 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)(8121501046)(5005006)(823301075)(10201501046)(3002001)(3231311)(944501410)(52105095)(93006095)(93001095)(6055026)(149027)(150027)(6041310)(20161123564045)(20161123558120)(20161123562045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699016); SRVR:VI1PR04MB4496; BCL:0; PCL:0; RULEID:; SRVR:VI1PR04MB4496; X-Forefront-PRVS: 078693968A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(396003)(366004)(136003)(376002)(346002)(39860400002)(189003)(199004)(11346002)(305945005)(25786009)(7736002)(386003)(8936002)(478600001)(26005)(36756003)(6116002)(1076002)(3846002)(476003)(446003)(81166006)(50226002)(86362001)(6506007)(47776003)(50466002)(48376002)(8676002)(2616005)(81156014)(956004)(16526019)(186003)(16586007)(66066001)(53936002)(316002)(4326008)(76176011)(68736007)(5660300001)(6512007)(2361001)(51416003)(486006)(106356001)(97736004)(105586002)(6486002)(6916009)(44832011)(2351001)(2906002)(52116002); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR04MB4496; 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) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR04MB4496; 23:bC6ggtVjE4RLmLWO8OtdAviKgvDC9/X+S8apcGwn0?= 1bHETWcbo4aekqb88F0M6qLybPJLyfEeeGhHTjpg5R0VD+l0mIRcVziMAYpnFtDR8kSl1I8uVvjTCpqSNFjS5DYCeZQWRZMztP6rL891uPZRxp4U19qJXbrATocKngVXxx3LQHFn7hjLp1+qCVab8nJovHIHhTU98jyAZpSBdaGhkIyk0qOrmVA257hMyLrmC1bIdv+t7nB4mgOXHfqILcru5BDrJDnofUYfVkMTdQ2KQ/lovRZMikpUp2bLCZSGj4PfGOR4FMBAFeNRVwaTQmGpDFebxHnfwHBOQAzJ4w06a1zjnhUXmHq4S+RBHgfVkY2WMDgD8BnnwZ++CmUpSy/OCQKKkUkDuWAMZpMUbKFaX/3xkq1CgMxouVv3liokc2Nw8BZRTzW/jm/0aqv4g3dBDdC4WOSlXx0O/II9BcJa7sbtPLuzrEj0p32KVLfdkOpN1/TlRB2Lytp3cBCN7AbnoZq/6ZcM24DwloTZUZDaP7oqw1xupefD+r4b8w49/bSAzYKtHHVSzVHZUZnhtBvuR5IrCX9F4P4LIFZZc1/t+GZk8vrqMnCw+LPdVmV/CCTawZ4E0eOoTM3gKlv4+tzOaIoGtCQhosB/QrSBAfu9dLqJnOgp2oKHOTJChRExN3F4wZgJ8+24h+EbYpL542ul6JhPy4bybCFxWnEmuj0m9q5FJ5rybKDSunSJ687ah+QTKALtiaUIHS0jB87WnpC+CN3AcWRI1P/U04zjcki68ATIYDEDtcRoCcGqSADVUKAzE2H4cOM/Q1tEkiUPmHjeO/wTX3EUdUUJ4gCNp91GwLIOvjYeRmn6EEnlvrFUgyQxIzUQ6I80ZZa5Lz4kaxzUgrT1B95zqJHRLFvb5eXJYJxRR9+AY+fYVRS+CJWCQHqE9NPDUpYmpXE0l4aXI/JWn5+z4Mr7O2NEdhPTe6ATf8Kp1xROcFL3vrwuQAp+Vhes9HBvE8VRI/WJZRMlwGBfO4kkK2PTIfBuW2sMBrXO6QoLRvZXqgm7PHUzREcluPmgD3jFqCxfglBFgbZ2kwXOvc4eDmj+484I1tZcfO6x9THnXvs66bMwELrLsdoOYvias3u5UxCLWfUVxka7iOkmfd+OelsSD6vvSELT5EJvFPqXJSlqFl9I+e1sUomikm4o64N72CZtbuYv8D9DgfmJVuPE/7D/C5EISUS/Ply4Q== X-Microsoft-Antispam-Message-Info: YqWOlH1YQEIftfbEJ1ZYH3L/VMZY+T9lGdPQ+XD08ZsjyM7j0/INc9zAd/d8QYT2D3YjBz8gdvL3TnhWVQRlZ6/O+0ERvrHvwsE44g2aNpiWTNIbGe9h3S5ggyYcbrofoLNMZv+Dvb6m3bn0RGu8mt1rQ3DcvAity4t2evkvAkVppGDTrh7rKCqUSomFgP5uzrRyjJgjERIW8Xc3RcJoozrEGwWKGeyoAwriWgXhWz4/DPtex/FdviQnbD5JwW1/GeGyirndQKjvx6URhMN+3ns6yYhfJBJhIXuZEVkR0p27qGC/pqmwBdw3BNJEv5PbaMSDZLRVpY4so8TMcxtatkd+XzWKP4AGHMrwOsqMs6E= X-Microsoft-Exchange-Diagnostics: 1; VI1PR04MB4496; 6:SChacG4BTm1QZbbaAjYGaSn0WZ9K9bNN5oGySkFiu1eg+Yw0yFPco3ZcluFexQ8MCN9HvTKEdWhsPSF53jvu/rQctwrP/AS1gkB6aYTY6x2HYKE8eXOmdXtFf+Oj6wJhtiObKENWlJrcBEt3V2oJrN84LEH8+uvNirX1BEQbWGmjUBsUHVQrRb0+2Z2efCtAzSBKI+S9RS0BoKiGi0qqNZDeftdnvggQZnw5YGZPkN/t592HRWMiT6+olQXAVa/6yBLibkaERDDIy01BCg5fXk9/gQktQKqUAQVFk2x7W8eUqmiA1Jdqxc8aWqqQDVDHD2ljxDijQl/sZCQCX7DfRsAMWPmiGs2lPRbo/onZesdxHWonx1Nr75VAuQVTNRkgM8MvQGIyPWZFmnCVm14ffQrl3bLBImYAS5gPqny/BWC7lJKFMFPYx+ZCBPW05iJ5h8KH/vaaTpQW/86WHIGy7w==; 5:vjhPMDiMY6lttRzEIJdByhIyiDIImvuYGNk7A1SUN3+M9KPYz1NL5Y6B0cDgxh78w74wDtoBxMOuHvHij+bV/ZbRYtzRs31VlblOpQqUrr2ta5xSoemNA9wu2VKdTV5ISFL+XNdiCu7QBpjQVOH1QMkB74L5o7Pv+zgnlv7gBSs=; 7:GwoJaEBzK3Q5pW1eR5BAZO3moPoO4eYJxI9bK6MBin0g9vdWCbwUGCO+OwySJj3ur1l+rt2ICYjvU1jONNa9ENqsS8ShsWO1KsEtwzHDhC0sqE99xI5aQu+iPFfSWLK1AFIocjRAIT80DqU2Ppkz6BP/SiWZr7AuV/yjF9jIBlpeDBCTn+fHNwBTtGmMsoC8dv9sNCXanZMdLrM5ElDXBZpk3UqE1zBqBW89saKsgrIP38Y5aHb4K3hVpORKTgYa SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Sep 2018 02:06:52.2931 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 83c71cc1-208d-4d51-e5e9-08d612d440a8 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB4496 Cc: fabio.estevam@nxp.com, u-boot@lists.denx.de Subject: [U-Boot] [PATCH V4 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 --- 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 32ef4a53c7..cf997336a6 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, +};