From patchwork Sun Jun 17 12:49:46 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aisheng Dong X-Patchwork-Id: 10468881 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id C7FB260532 for ; Sun, 17 Jun 2018 12:53:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B3DF62870B for ; Sun, 17 Jun 2018 12:53:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A588D28A07; Sun, 17 Jun 2018 12:53:05 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED, DKIM_VALID, MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 050E52870B for ; Sun, 17 Jun 2018 12:53:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=pDvD0BCAG/V8qQhkElKFO78qYhz+5qpGj/7C6MInwVM=; b=M3thQWpIgr1VvB BHrYx9bplUCdELbKVpyXAKbF6KfLq1ErkCcHPKSbrWRsyIlzcrKKhT3oG9X1lB/9VOVRS5yq47q7q anROlnI1QhSIAuCz90brDNP/ygMzc5tH2UXaRH6S4ucH1N5IOU0RZhvQ1kDnb/H5DX8pGsApzD9Si L3BuzvF/o4+hj6Pi/sdmAcdk7WamXVYtTVN5Q3iq2qWaD4VhgW58cs02urbXh0w8gWKoa+qXdqhbu h2IPqXN2K8M4heeTdAG7LIf+x+ktt0C+Ez89Ll89AsBbd2O91rel5f/s09wR8OVZIXc22ls1f0YFh aKyvJdMyMO+GdMlUey8w==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fUXAs-0000Kg-Bt; Sun, 17 Jun 2018 12:52:54 +0000 Received: from mail-he1eur01on0073.outbound.protection.outlook.com ([104.47.0.73] helo=EUR01-HE1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fUXAJ-0008R2-6S for linux-arm-kernel@lists.infradead.org; Sun, 17 Jun 2018 12:52:20 +0000 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=SsuBl+M1O4aJVbQRqfHNhmfHhnX1/fCU9kRsFEg/l2A=; b=tLfMuLXqC/pjS7vLAZhotQ/r/9FtHk3kB7ubdtiIr4ToVRNmCsROZVn2Hr3Ve627/eqPKR1ZNeMFNA3i72dxvbDIRBIQWlPBUA1HDluykVIwWA7/sEHY4ME+tI5EmJdZUFsbHV9b01ZB79utvdcQ3S528WqV0MXocvIwFOC1xQw= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=aisheng.dong@nxp.com; Received: from b29396-OptiPlex-7040.ap.freescale.net (119.31.174.66) by AM6PR04MB4215.eurprd04.prod.outlook.com (2603:10a6:209:4f::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.863.19; Sun, 17 Jun 2018 12:52:00 +0000 From: Dong Aisheng To: linux-arm-kernel@lists.infradead.org Subject: [PATCH V2 1/4] soc: imx: add mu library functions support Date: Sun, 17 Jun 2018 20:49:46 +0800 Message-Id: <1529239789-26849-2-git-send-email-aisheng.dong@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1529239789-26849-1-git-send-email-aisheng.dong@nxp.com> References: <1529239789-26849-1-git-send-email-aisheng.dong@nxp.com> MIME-Version: 1.0 X-Originating-IP: [119.31.174.66] X-ClientProxiedBy: HK0PR04CA0006.apcprd04.prod.outlook.com (2603:1096:203:36::18) To AM6PR04MB4215.eurprd04.prod.outlook.com (2603:10a6:209:4f::13) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0f4ac45f-38c2-4492-dd8a-08d5d4511fb0 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(4627221)(201703031133081)(201702281549075)(5600026)(711020)(48565401081)(2017052603328)(7153060)(7193020); SRVR:AM6PR04MB4215; X-Microsoft-Exchange-Diagnostics: 1; AM6PR04MB4215; 3:GsHeru5SxFaFLNDhJ8preoh4OitJiXhhMvEy0jI0UYjbaQjpFpvkYwvSTdJ6CZfK3w6sm0pPrTkTxDjxlaTLTpi9B+7hXVE1n7NNTDnt3pMoABnNrZIoh/xFEX/wk7gvyZSuni0TcpagoQokZp54NGC/rW5VbIsC3tt6j+19Mvqoz0KwDLcZHTLVbkmc+PGtl1AcMZ/AKZReAQ7GYMHjmK37UxQMrO4k6CGzyx889Mui9d5zFCkHXQ4j/OAHMqvZ; 25:5HhXNBrL1T1G+BpH34XeaAut+17Zv81rdoI6uSkO63GMyud0b/WXfm1oPushsaJTCZXTTbWrvHxNPWKIgBtcenQZz3f/ZBhl5knQ5nhD549Gju1XEo4dMQnvhJhfpWc+IJLlHYxkIAtWXr7LjzyEBsjBXbu+6zrXkKBXZZen19ZSj3HT0Cknl1AfbyE2WARiKyOu9AIFLXRvptORB9DtgvZ48wxGnMTm5b/6TSwMV4gQGfTMzNI6no8cmmPe4v9cr/SC0JDbgShhqQ6I0v0efNi9cUCm+uVXom8llWaEYstI1Moy8x2G8EPDNl2PEuEIV8+CQFpma4p+e7H0to/u2w==; 31:Ek4d8vR42giPHnPgdwehOKf1iNtVzFLEjm9yVN1xbwCmHt0bg8Jfgsy0A1PBBzkiPrRmQhw4Kxp1cRRngBlqc5pKAwcXiax+vwymJjpLKHNAI2zrXdDPpmt+xKm5qFVYpo95yJPDclyqtaH2R3c3XQvT6kBJLyoE0JqNrmYiqKMREy/QJI08iZtjJA1SGel6EpqmG7wMWZKz6aKEv7QxL7DFEzENKRJyFaYtA9rH0Zw= X-MS-TrafficTypeDiagnostic: AM6PR04MB4215: X-Microsoft-Exchange-Diagnostics: 1; AM6PR04MB4215; 20:CTvdVH1gjD9a6SHdUoyyS2qILrha1aYNKDHZ1rY3IzaLETn+bxd7LS+LJwVfm/e6MIzEP79eR0ibGiAMTLiK/DBKxNagcEikh6rGGH1zQa8uC1yvsXfahO82fnyNXKgkbCpuBvJxjj2OTZ1zxEIrcuSJnsNntzRSSHq75ckTh9duq3FWmp81u9Gq+NUALMG1HgJoNBk4AgrgNXpUPoL4pw+kssTbmHO2OeHvlzVrRpb4ny4X6wmqKHL6WsZE4j/XvXuljuHj22xho+I0FA2NVd2lCEmJ6KAGMattREGKUYTrAJJN4gIMtzK6PhhVapORggmHd/ZCdVI47KDZMCT2yEW11+rA509TXH9KKnIvkcB3LcHBembWhodG0xYnNcQnS1/CnINoAlwVaXsW4SPPiES6VSJ0a+Tj+2aRPlaKgG47mkIkhkHr4itaR3RKMKMqOIUSmTeviGSQnK5O1YFULgrgGN0TTJowzJqNbZD4SG7PpygTdDwJg/GnrV6/m61b; 4:y/KUem4x5VHQSFjaxmqdQsNKGxgQoxed22z3xBcq0G5WUxdHskG4XRkqVqd/V+iraTwPLCRi4EKoDD+swIFMuHgxs5lCHLbb8RfsvA7YTJldQYShjUncWZiBYeUIA4KJ0rsTwLBPPm9wEHaZYQ7YRWWvyoWVM09nt6sKQ9F+k5I33GrPW4/lJQyYb26sVfqAZC1UD9Ho/j4DF9FKP/RdPNbb+/NY/VvVR2NU5SHCtzlA7Q3vxj8rk6K/zF7itj5eaEzJRZz4D+/bLFHrSg/9yBLhDzuRc4oIDBZb7yuCkhnnaMWA9pnSILM60FZLnyOD 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)(10201501046)(3002001)(93006095)(93001095)(3231254)(944501410)(52105095)(6055026)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123562045)(20161123558120)(20161123564045)(6072148)(201708071742011)(7699016); SRVR:AM6PR04MB4215; BCL:0; PCL:0; RULEID:; SRVR:AM6PR04MB4215; X-Forefront-PRVS: 07063A0A30 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(396003)(366004)(346002)(376002)(39380400002)(39860400002)(189003)(199004)(2361001)(305945005)(97736004)(47776003)(5660300001)(7736002)(66066001)(2351001)(86362001)(8676002)(81166006)(48376002)(8936002)(81156014)(68736007)(50226002)(105586002)(50466002)(106356001)(478600001)(3846002)(6116002)(2906002)(39060400002)(6666003)(76176011)(486006)(4326008)(25786009)(53936002)(6512007)(36756003)(52116002)(6506007)(386003)(956004)(2616005)(476003)(11346002)(446003)(16526019)(6486002)(16586007)(6916009)(26005)(51416003)(316002)(186003); DIR:OUT; SFP:1101; SCL:1; SRVR:AM6PR04MB4215; H:b29396-OptiPlex-7040.ap.freescale.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; AM6PR04MB4215; 23:cQ//99RF0vg9gb2wFTbukXxa7SuwAYlRQjXyPETQB?= =?us-ascii?Q?NwxzDWJS/85/WfnDaptmktFTGpxJqwk8LZXSeputBFlRdwrFUCoRMh9g78G7?= =?us-ascii?Q?9D6Zqhm6zKDn8w1Axsf3FuN37J/KKFiqEpJmRr/rel7e0GXgIjFkp0LRk0tu?= =?us-ascii?Q?Q03NZpVDqC0pKXdXzvsSOD2mnzD9LSPlJiCaEnpNvt/FjeaX0sd3c4kCPkxf?= =?us-ascii?Q?m3ivsXqwokVhGTjJC0yaa0GMUtMyPRcgzIfgMhQhkxdOBjRncRV6BBQs7jMN?= =?us-ascii?Q?21abiwngJ2RFAcRy1vL+thoZdJk6Absspe9r0J2lZpcp4quLXUsAgNCkaabj?= =?us-ascii?Q?O3Pm6DFYEEW9wxOgcTxNa1HstHorrmShi4dK9Jh3sUHGvJMX6ziMiaxRBBZx?= =?us-ascii?Q?oI00X0Od5mke6mggQtYYnPrzzsk0U9Fh489y70SFXktuYbLMA2O81sp9nu8w?= =?us-ascii?Q?nVPoRvs4ecMqt5zjLsjox8qtPL/XOTO/PODcvH50HPBUHoV3uMlePEeeRXDo?= =?us-ascii?Q?/OlvsDnuUMu2CREu0pKZPZ/QGZVZhEASCln3aqFUmY/3dWjbRuss04HOBjCH?= =?us-ascii?Q?lboEbUEFqci6Q08jOhwC8hBwynaBG2zaP5tAaydurMdfSaUDfFKCB45OR1At?= =?us-ascii?Q?13aWHjYPtB9dCNICASJds7mw4CGhiDiUseq8QZu2KpDvHKuyHG4vhsRwO3JV?= =?us-ascii?Q?RkN3sU2ELXjrhCmbX0eugr08wZL+/7woALLnXy3Oz13q0vIzhFxpv/sgYi7q?= =?us-ascii?Q?dGBSWRns5VQDzZO2LoCNy62DQRe7yPcSb5F6Rw3dgzXyXUlP1+ObYHw4PBO7?= =?us-ascii?Q?lsnXcfvRuO84XwW9uc64k92dEr4eb0sumkNlin40YnkAQ58OHWssAS00rUy3?= =?us-ascii?Q?AN7NyOPAmRtjLPJ204VOD7QVD4pay1mFHzUV1CBnQGKcIESMR6x5m9B87Vf4?= =?us-ascii?Q?O2yuAj2e2+JVSWXLtYucQviYAYusqr+VFi0O7pxMu7tjd9PC0dxZiLxvbPa2?= =?us-ascii?Q?Ur45uUPpFjldPxKPx6C4H2KazT27KGNhDkg0u0NdrI3b0AXK489p9wckv7xc?= =?us-ascii?Q?/pmF+gfjU7+hW3RLGJWpdYuyZg+CPSy3xgfWbb8yDtXVkkZ07z/l6rWhI73v?= =?us-ascii?Q?zueCYYKPUkPmcNufxp9EexZ/o5LMjqusJOELfjjk/zO+ML/OJSdqrtYKYcGW?= =?us-ascii?Q?FhTR4hAJSfjbVbKufocXEPO3vfeR1m3BRr/J8MMItDFsqGiFu5WAzra5u6fl?= =?us-ascii?Q?FmQpKEozVxUU5o9bA8=3D?= X-Microsoft-Antispam-Message-Info: DXh0lNs2fN4uP+2FuKRH8r/qx4tH0jpQeswuThqstT2BCT1P/gUySaAb5q+Vcp7QG7yEm2gPYPY9ESOn9HrDf7Ki2wC+LenQIgXnZMoso6l04+gb0b5xwznkWVgYFDKYSMe4BoIOpLH3qVeN3/TkDpmk9iXDT0gqUpsFlQnXxX+bO73rBCIqr44FhY3EJoCs X-Microsoft-Exchange-Diagnostics: 1; AM6PR04MB4215; 6:gMHUf7F4TpV60dWnMp359M/NU4kUSAhk3m1zvHf/LUtEr8+N4GGpZgNptczPp0w3XHDp/8LKVZK5olyDPtvmuXwTpSJ22KuNrsokDiL4pPDrLXSnwvCGy7VaQWiV7+HmGNVO2/wVg5be5nNrcFlXsY6dV2LBM5+c+nOI93b8BVhy9U3WaSdTqQVgBl8s4dfHU0tEspumYJaN4yE3Axpc3bEz/ozoKDnc9J8QxspRSOtbs04zHDLqppqwcB2sMDQYCedon93EOjWlxA3SZPjCnpzFwyDgCx95CAZYBD09eAdgQ9E01HCft5N5160VaaWhUnG8eIzDHXd7H1xq653wbPWV5wV103FcInT2eQV4Q5ppR//QmLLjsldZ3IgQ8yh0wBopXRJqhW6W4t81mzHcghP+a5KQB8B8iunUwg5siy18ppZnsb+IK2MwIOkd4zbglRhqUbVTojidAW/WJYjaCw==; 5:INoigAOISqns4e7Gs5SPzpSpN3L3gx1653Vdy404088NyNygcRbAaS4rMe4w83jgseI48WeDpLIdD2EiClBp5rNNHATZGBJ47I4Bnn8JhqO0uPRkN/oTx9Qbc5av/4E+8vUm+Uh/zP3ENf5pJTm2jo2w9YjBqvr6BTQt5KgDnNo=; 24:vj9W2rDjh92qWfQEG8U1pNYmcrG7r3V/UqBJJ8LpJoafYOuY0+3e+0ltP6ex9lMNPTsyHVLcAU8AkgiMbpng6NlSKNFNzGZApfXaBK9b0as= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; AM6PR04MB4215; 7:RLwnLpqLZWM0t3bjIKYBApZ5ak82c8T8wPvJoe9lXLOyeIuB1eC2oKmmCgJNWtEtNy/kqIaqqoIwj7+AfqR6ZmcgqPTYEMa98IcvaqgthrThIA6DZaAfpcD4apw2XOVX1nz5HxK3YaDtFLhgLk4a5iT+Eb6abquWlpOsX2yF/DvNaIknbfv56UZ1muf1OTJ3CtwIeMoMG/t6+3sdEs1oDHxAU43y9XdMWOKN6kbbIRutEUzGqkMFaQG8yNHYEMrg X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jun 2018 12:52:00.9371 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0f4ac45f-38c2-4492-dd8a-08d5d4511fb0 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR04MB4215 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180617_055219_250132_D69A6A3F X-CRM114-Status: GOOD ( 16.09 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Dong Aisheng , dongas86@gmail.com, linux-imx@nxp.com, kernel@pengutronix.de, fabio.estevam@nxp.com, shawnguo@kernel.org Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP This is used for i.MX multi core communication. e.g. A core to SCU firmware(M core) on MX8. Cc: Shawn Guo Cc: Sascha Hauer Cc: Fabio Estevam Signed-off-by: Dong Aisheng --- v1->v2: * introduce struct mu_priv to keep the private iomem info * add the corresponding mu_exit() --- drivers/soc/imx/Kconfig | 3 + drivers/soc/imx/Makefile | 1 + drivers/soc/imx/imx_mu.c | 165 +++++++++++++++++++++++++++++++++++++++++++++++ include/soc/imx/mu.h | 24 +++++++ 4 files changed, 193 insertions(+) create mode 100644 drivers/soc/imx/imx_mu.c create mode 100644 include/soc/imx/mu.h diff --git a/drivers/soc/imx/Kconfig b/drivers/soc/imx/Kconfig index a5b86a2..4858cd7 100644 --- a/drivers/soc/imx/Kconfig +++ b/drivers/soc/imx/Kconfig @@ -7,4 +7,7 @@ config IMX7_PM_DOMAINS select PM_GENERIC_DOMAINS default y if SOC_IMX7D +config HAVE_IMX_MU + bool + endmenu diff --git a/drivers/soc/imx/Makefile b/drivers/soc/imx/Makefile index aab41a5c..113dc7f 100644 --- a/drivers/soc/imx/Makefile +++ b/drivers/soc/imx/Makefile @@ -1,2 +1,3 @@ obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o obj-$(CONFIG_IMX7_PM_DOMAINS) += gpcv2.o +obj-$(CONFIG_HAVE_IMX_MU) += imx_mu.o diff --git a/drivers/soc/imx/imx_mu.c b/drivers/soc/imx/imx_mu.c new file mode 100644 index 0000000..44294d1 --- /dev/null +++ b/drivers/soc/imx/imx_mu.c @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2016 Freescale Semiconductor, Inc. + * Copyright 2017~2018 NXP + * Dong Aisheng + */ + +#include +#include +#include +#include + +#define MU_ATR0 0x0 +#define MU_ARR0 0x10 +#define MU_ASR 0x20 +#define MU_ACR 0x24 + +#define MU_CR_GIEn_MASK (0xf << 28) +#define MU_CR_RIEn_MASK (0xf << 24) +#define MU_CR_TIEn_MASK (0xf << 20) +#define MU_CR_GIRn_MASK (0xf << 16) +#define MU_CR_NMI_MASK (1 << 3) +#define MU_CR_Fn_MASK 0x7 + +#define MU_SR_TE0_MASK BIT(23) +#define MU_SR_RF0_MASK BIT(27) + +#define MU_CR_RIE0_MASK BIT(27) +#define MU_CR_GIE0_MASK BIT(31) + +struct mu_priv { + struct device_node *np; + void __iomem *base; +}; + +/* + * This function sets the Flag n of the MU. + */ +int32_t mu_set_fn(struct mu_priv *priv, uint32_t fn) +{ + uint32_t reg; + + reg = fn & (~MU_CR_Fn_MASK); + if (reg > 0) + return -EINVAL; + + reg = readl_relaxed(priv->base + MU_ACR); + /* Clear ABFn. */ + reg &= ~MU_CR_Fn_MASK; + reg |= fn; + writel_relaxed(reg, priv->base + MU_ACR); + + return 0; +} +EXPORT_SYMBOL_GPL(mu_set_fn); + +/* + * This function reads the status from status register. + */ +uint32_t mu_read_status(struct mu_priv *priv) +{ + return readl_relaxed(priv->base + MU_ASR); +} +EXPORT_SYMBOL_GPL(mu_read_status); + +/* + * This function enables specific RX full interrupt. + */ +void mu_enable_rx_full_int(struct mu_priv *priv, uint32_t index) +{ + uint32_t reg; + + reg = readl_relaxed(priv->base + MU_ACR); + reg &= ~(MU_CR_GIRn_MASK | MU_CR_NMI_MASK); + reg |= MU_CR_RIE0_MASK >> index; + writel_relaxed(reg, priv->base + MU_ACR); +} +EXPORT_SYMBOL_GPL(mu_enable_rx_full_int); + +/* + * This function enables specific general purpose interrupt. + */ +void mu_enable_general_int(struct mu_priv *priv, uint32_t index) +{ + uint32_t reg; + + reg = readl_relaxed(priv->base + MU_ACR); + reg &= ~(MU_CR_GIRn_MASK | MU_CR_NMI_MASK); + reg |= MU_CR_GIE0_MASK >> index; + writel_relaxed(reg, priv->base + MU_ACR); +} +EXPORT_SYMBOL_GPL(mu_enable_general_int); + +/* + * Wait and send message to the other core. + */ +void mu_send_msg(struct mu_priv *priv, uint32_t index, uint32_t msg) +{ + uint32_t mask = MU_SR_TE0_MASK >> index; + + /* Wait TX register to be empty. */ + while (!(readl_relaxed(priv->base + MU_ASR) & mask)) + ; + writel_relaxed(msg, priv->base + MU_ATR0 + (index * 4)); +} +EXPORT_SYMBOL_GPL(mu_send_msg); + +/* + * Wait to receive message from the other core. + */ +void mu_receive_msg(struct mu_priv *priv, uint32_t index, uint32_t *msg) +{ + uint32_t mask = MU_SR_RF0_MASK >> index; + + /* Wait RX register to be full. */ + while (!(readl_relaxed(priv->base + MU_ASR) & mask)) + ; + *msg = readl_relaxed(priv->base + MU_ARR0 + (index * 4)); +} +EXPORT_SYMBOL_GPL(mu_receive_msg); + +struct device_node *mu_node(struct mu_priv *priv) +{ + return priv ? priv->np : NULL; +} +EXPORT_SYMBOL_GPL(mu_node); + +struct mu_priv *mu_init(struct device_node *np) +{ + struct mu_priv *priv; + uint32_t reg; + + if (WARN_ON(!np)) + return NULL; + + priv = kzalloc(sizeof(*priv), GFP_KERNEL); + if (!priv) + return ERR_PTR(-ENOMEM); + + priv->np = np; + priv->base = of_iomap(np, 0); + if (!priv->base) { + kfree(priv); + return ERR_PTR(-ENOMEM); + } + + reg = readl_relaxed(priv->base + MU_ACR); + /* Clear GIEn, RIEn, TIEn, GIRn and ABFn. */ + reg &= ~(MU_CR_GIEn_MASK | MU_CR_RIEn_MASK | MU_CR_TIEn_MASK + | MU_CR_GIRn_MASK | MU_CR_NMI_MASK | MU_CR_Fn_MASK); + writel_relaxed(reg, priv->base + MU_ACR); + + return priv; +} +EXPORT_SYMBOL_GPL(mu_init); + +void mu_exit(struct mu_priv *priv) +{ + if (WARN_ON(!priv)) + return; + + iounmap(priv->base); + kfree(priv); +} +EXPORT_SYMBOL_GPL(mu_exit); diff --git a/include/soc/imx/mu.h b/include/soc/imx/mu.h new file mode 100644 index 0000000..0802193 --- /dev/null +++ b/include/soc/imx/mu.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (C) 2016 Freescale Semiconductor, Inc. + * Copyright 2017-2018 NXP + */ + +#ifndef IMX_MU_H +#define IMX_MU_H + +#define MU_TR_COUNT 4 +#define MU_RR_COUNT 4 + +struct mu_priv; + +void mu_exit(struct mu_priv *priv); +struct mu_priv *mu_init(struct device_node *np); +struct device_node *mu_node(struct mu_priv *priv); +void mu_send_msg(struct mu_priv *priv, uint32_t index, uint32_t msg); +void mu_receive_msg(struct mu_priv *priv, uint32_t index, uint32_t *msg); +void mu_enable_general_int(struct mu_priv *priv, uint32_t index); +void mu_enable_rx_full_int(struct mu_priv *priv, uint32_t index); +uint32_t mu_read_status(struct mu_priv *priv); +int32_t mu_set_fn(struct mu_priv *priv, uint32_t Fn); +#endif