From patchwork Fri Aug 3 17:53:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jolly Shah X-Patchwork-Id: 10555389 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id F28711708 for ; Fri, 3 Aug 2018 17:54:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DE36C2C724 for ; Fri, 3 Aug 2018 17:54:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D18402C921; Fri, 3 Aug 2018 17:54:38 +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=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 56C4B2C724 for ; Fri, 3 Aug 2018 17:54:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731991AbeHCTv4 (ORCPT ); Fri, 3 Aug 2018 15:51:56 -0400 Received: from mail-bn3nam01on0068.outbound.protection.outlook.com ([104.47.33.68]:1854 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727466AbeHCTvU (ORCPT ); Fri, 3 Aug 2018 15:51:20 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=YJzB+KnyFKhLEmWrAsNYQ8EP3hzk/DxRcJ5zh/8+xcg=; b=mXk+Td1iuOAk1N7atBo6MpYVk0W+0zueHhy8hrpuFqra38bJ07s0AqfBfUIiz0ewCxWrwcS7fxXPLQ0kM9e2zOoG6lADpTRjFPvI1dJGw/kFMKyzfwqqFECFDHirr1wdOKJLICE9vcBkSBtz0gJ3N3mzus7wLUvGI2ro2jGBRYU= Received: from BL0PR02CA0041.namprd02.prod.outlook.com (2603:10b6:207:3d::18) by DM6PR02MB4460.namprd02.prod.outlook.com (2603:10b6:5:29::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1017.14; Fri, 3 Aug 2018 17:53:54 +0000 Received: from CY1NAM02FT063.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e45::200) by BL0PR02CA0041.outlook.office365.com (2603:10b6:207:3d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1017.14 via Frontend Transport; Fri, 3 Aug 2018 17:53:54 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by CY1NAM02FT063.mail.protection.outlook.com (10.152.75.161) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.1038.3 via Frontend Transport; Fri, 3 Aug 2018 17:53:52 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGu-0004fj-Fr; Fri, 03 Aug 2018 10:53:52 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1fleGp-0007cn-CX; Fri, 03 Aug 2018 10:53:47 -0700 Received: from [172.19.2.91] (helo=xsjjollys50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGl-0007bh-63; Fri, 03 Aug 2018 10:53:43 -0700 From: Jolly Shah To: , , , , , , , , , , , , , CC: , , , , Jolly Shah Subject: [PATCH v11 01/11] dt-bindings: firmware: Add bindings for ZynqMP firmware Date: Fri, 3 Aug 2018 10:53:18 -0700 Message-ID: <1533318808-10781-2-git-send-email-jollys@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533318808-10781-1-git-send-email-jollys@xilinx.com> References: <1533318808-10781-1-git-send-email-jollys@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(39860400002)(376002)(136003)(346002)(396003)(2980300002)(438002)(199004)(189003)(6666003)(7416002)(8936002)(9786002)(305945005)(50226002)(2906002)(5660300001)(478600001)(2201001)(8676002)(72206003)(47776003)(81166006)(106466001)(81156014)(63266004)(4326008)(39060400002)(446003)(476003)(36756003)(44832011)(186003)(11346002)(2616005)(16586007)(50466002)(316002)(126002)(76176011)(106002)(426003)(107886003)(51416003)(356003)(336012)(26005)(36386004)(7696005)(486006)(77096007)(54906003)(110136005)(48376002)(921003)(107986001)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:DM6PR02MB4460;H:xsj-pvapsmtpgw01;FPR:;SPF:Pass;LANG:en;PTR:unknown-60-83.xilinx.com;A:1;MX:1; X-Microsoft-Exchange-Diagnostics: 1;CY1NAM02FT063;1:Vdzjpv2tvWIIUyrLnkjwnYINNMP3uv4BE92NdjxR4au3XiR+6v9YOb2cNSmKwFOfDlp44j7JAnh5gr2TNWQ3QWtw5LpTaNkvNDohFa1RJOin7FxPjQeoTftlCIfc+xem MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 55c5c80a-6d3d-40b7-469a-08d5f96a1405 X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(7020095)(4652040)(8989117)(5600074)(711020)(4608076)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(2017052603328)(7153060);SRVR:DM6PR02MB4460; X-Microsoft-Exchange-Diagnostics: 1;DM6PR02MB4460;3:QVpC+lNzN99yobD9G43Mn0AfdB7Z+sXIy7KWpdgAjCNrVLU59aRaJ27u0IL4u/ob1tXeZ8Q6YDljvYJzZr/QB//DbqNHLzTIgrNk1foBZpm/BED03r1hL/qVbwSWDZSucI0B2YzZFZn9m7+6q7AlVNPhr/y+icReaa99F2VRBz5pjPl+FH5Wk8BK7/aIHcxs8fd37rXLtvvulKMFOGL+VJoAuAfIcSoT+HtLtxdXXfLK6c3SLw0NmYApKnsROCOgmqYmIqQztAE6tiTr1w2WpeW3gl6O0Uqa2HhXHSw5mdG/BwQpU2dVQb9nD6LkFp1jWg52tmlOM1yU+btrEki4AVAhg3fdXKSUCYL2RWamu88=;25:rgYpWX0/dSzVHZvKg140liiW4U+Qa+D2+xa0Jkl+PYHY5H9pcnMNhBWeok2iDPD8im8MuUj3z5e3yAVU9VwtlpWRC7fRZQLdBT+qVNwwdDgSW9QpUrNeRFmM2sqKhYgKnA7WmIGQvj3TkvJ0w93Jni2B9yC1mldxzLTUcIAhjPnz8nQ+TZzmqC2BOUe8OTvhCU2y3Pc/h9njzkfyL6D7Qsu14NH+JedjYopigSKS/xG0PyJQd7ZAn/1Ms7DTouzdvzXqheFZ+UctUpZ04nKHXVXmmjsMznrfH7xi5To7HEj31eQKcB49AfFuG0G//m7wYpphnO4Pe1bnfw13juDKOg== X-MS-TrafficTypeDiagnostic: DM6PR02MB4460: X-Microsoft-Exchange-Diagnostics: 1;DM6PR02MB4460;31:5QXyfZgC6dyPMbtX4xLjI5dg0arfqz7mDlfBTebhwECZdXkOoE9oz9ZFO8JNXPDtlWKP+E7zlrQ9QsO8Ix9OWawqeq1onbCOgxXFCGGEJ2jpuUNm3JYAcvQ8vRVCwvUOZ/w0KPNg/DQUyoqgFMj6OTqa2EtYAncZK4r2xM/Er3Kzwa4rubwAlTuFYgBFgLM+s/r4M8yvSFW02aCOrb5KrysxKRRJ9EF3k0hJ3kfjZwo=;20:MJre6KRcn3zdHeQc3u08Esx3Alc56RP2k+/eQaMhecAP0OPICJV1s73MfZS9uVFuohTbPoQ637Ut2ukGSi+m7FBl7PGZxp2XnIPVhWP+4kah5fzUNQ50NJkS6A6g/hIjRoPeTOW0TlT7K4qYykeqvU7TBJdE0X78R9xM3CFdI9kNs2ODCfeU+tA7XbHqZ2eoGLcloHkw8iRmAxBs8vxD3WjD+w3sO6gUCrj9IssoyTziQ4A90FvAjzCTKtDnmImSbUyMOBeM2GnGcdwnuHB7G1Etzk/P/OrHPnnDQYemRBtPUg8dzqLBkaakGjHnBxKYhgT2D2Uk3JuyS5Zh1fyMkJ+FlmnI9PRCcqX4TJytOevtE672HonWL2M6y0awpv6ly8Rg71adr1qYaaQlJYGxADxaE4d/9cksTLabmaL0Vo2whoudSEYOLKFRD653UtYflL6yk5qPWpRtjYc72oNMQN6E0efEQyCi08psk46fjV/RuVkJgV0Y62S5tFJ43vtQ X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(93006095)(93004095)(10201501046)(3231311)(944501410)(52105095)(3002001)(6055026)(149027)(150027)(6041310)(20161123560045)(20161123558120)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(6072148)(201708071742011)(7699016);SRVR:DM6PR02MB4460;BCL:0;PCL:0;RULEID:;SRVR:DM6PR02MB4460; X-Microsoft-Exchange-Diagnostics: 1;DM6PR02MB4460;4:r2OWd2cou5EkPqEuZDe4080TVw361TX3MEsXCN8iixg8OEdN0F/J5W8b6P54ahgUgyqB3TIN7is2VLxmAGA6rTHnU7FBnTdEMGv6WcU6/GXk3/qZNNmiT+4UcE4woeghLYdPfEPi07t9E58S+RM7D2kIsb4Cllc/iSpxIglyADFUywSE4jpnUEFSY54mS9yymuvfhJL83R7/uPNzP5M+HPbrWrJ6dOH3un6W6eNi1zAnwWQdFpBg0O7LXR/AWmU8+3J6YRUO60L/frBjBkkrFHgi4h4zkQGCI615NBbiDsd/YGHy8SbnvpA1golBRbiU X-Forefront-PRVS: 0753EA505A X-Microsoft-Exchange-Diagnostics: 1;DM6PR02MB4460;23:RXKJvjhp8K5OZ1WAT+aHnT5SGHvqgBxUS9V94AdVCNfjq5XJ6hDGFX3kstbveK0Beej+qmVhFVdwF0oPete6MDRjKQ36JPIT/AJo5XNw9EltFbg4GD0HELBNteV0/TOYKg9A3oGeJKh3pIQ/Q0caNb2lJ82oyILJ+6KBRtmqKYApp5Uhb0SgNFn17IgsA+FYBDTcYhv6dfvAi6F6cAjp/wHqjcBBNzkpWv/aMv6TmvQR4P11eFjiUXzN+IVB8aHcYOf6pLzEc+Qhxk8T0XecJ6uGU7BEniOTkFAXRZcXGVVY8g4jBWahCqSxzOUrzgOLh/d4UddgdM5U5K7HEximnWX0F6AS/x11iVC6HP4zmQBZWJBFzjougEnnaEJVXxZ/xUXPxM5prk6EJ6gc1OoCBJhTjorDx6dBv1Y/WdFAiNDcx8KXG+rIJPEcGPZHW9B63pWhzrfoQ9cVyFHlfj8OH7NKqmJiQUd1V7YAsIRdGwVSI2ou2mefBZ27nVd+ZQ8ezl5GQWf9BCwxo6INC4gZTtuVunVRup3pz/4hloa82gfmQ+IjlNgoNqR4JuOGvGpgIF5ocys3Mkj9XoWNf4afZJWlQq791/aC/tumlTBISQsnYR8lT9WlSxEAzWH5AoDa7oT7g0vEpj2MbgOOzHJNFh5NSEQqczobMZu0MYEjG5qwlmCIfNvA5E0nmad2A+axEfLJAkE50G+YjgaqfGKw40lPtlB20Ebkrv3F28sf/Kg/DH+rdqi7Gn9KZgnw5cSRhSK5RXE4iBYHz8LYooC5ts3hceC9hnQ/br3Qsp2HJBTPRKq+/gmEPIQjS0/te4omY/16hI5UfAK2Fwwsu9wOTXsA8b+3e7eUQwdPGH5rBFR5ie2iLP66lFv2kFe6cBa3BvAFA9tPztMUnPyGP1tYrkuG1vDe5dS2TLDC7TqqRN5EjGnxKHkHNWL1YCgRJPXBr++l94c/88N3i2Ebcllr6GC+FB+qtR6MeS67N54SSXt3OFxu8W76SmU/Fx3KWXrxuG//zYhepznTosMzFwsWrfKHXKXVKAZhNrrXmKs/MeOk2YT0S0wKhKTYmCjbF7tI9VK28y2b28VI9UgZHl2aoxJWA/gz4UByGwCvAacd6DOze3QxHVEA/GCY3pT/5CA6jin9CADfJ3pY9KTvMXntCp4oc3046LEFLJYGSl222SwkCEoVvnl8dmCmXgb+l1awpFfj4ty6s1M+7rmvbm2p+WzdgTycbTRS0XldYsKP560= X-Microsoft-Antispam-Message-Info: PWc+I1ZimgKrwPFXiHJa/fj+Fkwcsd457dSYLaqSVJ5svsHJBjDvDz5UD9RxUm1EajkLP1WWKszqeKX2oJqhSnybQyGptPSb9U2htHcKGUYT9ePgYE4G1BRyfvOBDU5CsydyeBmIDTwG2RMM7TIzdQF4cLJ0qO3yPfu73/b4jB4GrgnolannhDM9Zm20B6uy3NEXjDp6d5n8XNFg0k40ES/HfCtqx0CkC78ltS+jczOZDt7720OGFpxL7dMbitk85v/FzE7940+NhmEt1juUKcKJl7us1aYOLZunW2XATRmATPfvD9w8ogmJVsFcbzxmxm8nuPosP5Ntv/+qhJOCH8ZB8aVWSXBikKjvFNZQitY= X-Microsoft-Exchange-Diagnostics: 1;DM6PR02MB4460;6:VHBxA6b+iPCQj7btQgmu88Ma0Rn/kRxYjXk8M6wv/oOJvVeOQynuZUZETv9i2KcHvc3wQA55q5BJNHNkkhcM1ro+RLKbmOsbvbL29MP4rk3AzaH3PjmGa/DzwT0v2lkiqjCo6S4p7ShvUsYfQQcWFAf1W7Xiy+gdKyTc5XINUR0b+plwabAV5FHB7Ff6nu8xOe7NPk/qyfcaoWlrY0De4HeyUrdJFqbQ0VisR7F9Ia7+APkA5vWL98yTa06Qb0jVBf6mYV0KVbOiYCH6XUFzOhbP+xmYW9aILzZkd9fuprFdNLOwp5A3Uq54GeNS1mSzGXzsctZXCTtBV+YybC5vfmSY7P6inExoalDN5mYqz/zuYq9ab2sfwSn9cJoPPOiLUsBI85+L28o2hCwWoGH9chclyA0fbJ651sICCODBSsNiAowo2dsO+m9qOk0x2KzSsq4Qn8iLP9OKekaFSfNvOg==;5:A4w4g/McXH1IK9/H+I+hFnPC7PqTWdIEYUKeeDqV8tdnS73RObxsTXsaQtb5sNbdq0+FymsmpMO+Dlj+KLuWk0hNWeccqH45coI+VCkimvrfoNr3tVNTW7YlNC68TKGVZv7icxewUd/RHIVVMxUtvTfzsMmGvUvo5I1leE1jIL4=;7:T1q2oGp7WDec0EgENmQP3yaoRg+mewYI2OUoWdFfY9DGXAGcK2+WjdxfKYcbAVKaJ2yVb1U5NACbS1jB5NOM9JxI78KDFR7UiDfow0UxxuCX9ku10OmuUHMWOUGOUxV1vYogQ5d592LSwcSgDwuTHVz8S+lri1MkxW0Zx4ZRzBgTOGKgBm4UQcddq4bqYI8zGNCOzXtcT82Ote3iVj0ARJbC1AMNgjLv6u6lInDb+2YYNREwCsOvQ8vTqHgaRpnS SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Aug 2018 17:53:52.9907 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 55c5c80a-6d3d-40b7-469a-08d5f96a1405 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR02MB4460 Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Rajan Vaja Add documentation to describe Xilinx ZynqMP firmware driver bindings. Firmware driver provides an interface to firmware APIs. Interface APIs can be used by any driver to communicate to PMUFW (Platform Management Unit). Signed-off-by: Rajan Vaja Signed-off-by: Jolly Shah Reviewed-by: Rob Herring --- .../firmware/xilinx/xlnx,zynqmp-firmware.txt | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 Documentation/devicetree/bindings/firmware/xilinx/xlnx,zynqmp-firmware.txt diff --git a/Documentation/devicetree/bindings/firmware/xilinx/xlnx,zynqmp-firmware.txt b/Documentation/devicetree/bindings/firmware/xilinx/xlnx,zynqmp-firmware.txt new file mode 100644 index 0000000..1b431d9 --- /dev/null +++ b/Documentation/devicetree/bindings/firmware/xilinx/xlnx,zynqmp-firmware.txt @@ -0,0 +1,29 @@ +----------------------------------------------------------------- +Device Tree Bindings for the Xilinx Zynq MPSoC Firmware Interface +----------------------------------------------------------------- + +The zynqmp-firmware node describes the interface to platform firmware. +ZynqMP has an interface to communicate with secure firmware. Firmware +driver provides an interface to firmware APIs. Interface APIs can be +used by any driver to communicate to PMUFW(Platform Management Unit). +These requests include clock management, pin control, device control, +power management service, FPGA service and other platform management +services. + +Required properties: + - compatible: Must contain: "xlnx,zynqmp-firmware" + - method: The method of calling the PM-API firmware layer. + Permitted values are: + - "smc" : SMC #0, following the SMCCC + - "hvc" : HVC #0, following the SMCCC + +------- +Example +------- + +firmware { + zynqmp_firmware: zynqmp-firmware { + compatible = "xlnx,zynqmp-firmware"; + method = "smc"; + }; +}; From patchwork Fri Aug 3 17:53:19 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jolly Shah X-Patchwork-Id: 10555385 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E690815E9 for ; Fri, 3 Aug 2018 17:54:32 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D10262C724 for ; Fri, 3 Aug 2018 17:54:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C4AD12C921; Fri, 3 Aug 2018 17:54:32 +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=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B8E4A2C724 for ; Fri, 3 Aug 2018 17:54:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730028AbeHCTvY (ORCPT ); Fri, 3 Aug 2018 15:51:24 -0400 Received: from mail-dm3nam03on0080.outbound.protection.outlook.com ([104.47.41.80]:49648 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727809AbeHCTvX (ORCPT ); Fri, 3 Aug 2018 15:51:23 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=c6Tqd00q99GCo7Zqz6V0mcAdefcyuAndIi1uNYaDR7M=; b=thQ4eY3QXuVtmncr+GYIZmI4lOHnODT6naiqyNafFJmLDttEFLN62PlzG2b/YiKknIuUFE9wIE1+FdGbIJYn/WLxMg7HDo3IZi/q1VP4jScfx10CysvJTgnF0QQ/4BSK4G64gQLw0HCDs2YT2g9VfwNsuAQbLvhqmq+vHOZ+X/o= Received: from MWHPR0201CA0053.namprd02.prod.outlook.com (2603:10b6:301:73::30) by BL0PR02MB4452.namprd02.prod.outlook.com (2603:10b6:208:45::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1017.15; Fri, 3 Aug 2018 17:53:54 +0000 Received: from CY1NAM02FT056.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e45::209) by MWHPR0201CA0053.outlook.office365.com (2603:10b6:301:73::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1017.15 via Frontend Transport; Fri, 3 Aug 2018 17:53:53 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by CY1NAM02FT056.mail.protection.outlook.com (10.152.74.160) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.1038.3 via Frontend Transport; Fri, 3 Aug 2018 17:53:52 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGt-0004fd-Vc; Fri, 03 Aug 2018 10:53:51 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1fleGo-0007cn-SJ; Fri, 03 Aug 2018 10:53:46 -0700 Received: from [172.19.2.91] (helo=xsjjollys50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGl-0007bh-8F; Fri, 03 Aug 2018 10:53:43 -0700 From: Jolly Shah To: , , , , , , , , , , , , , CC: , , , , Jolly Shah Subject: [PATCH v11 02/11] firmware: xilinx: Add Zynqmp firmware driver Date: Fri, 3 Aug 2018 10:53:19 -0700 Message-ID: <1533318808-10781-3-git-send-email-jollys@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533318808-10781-1-git-send-email-jollys@xilinx.com> References: <1533318808-10781-1-git-send-email-jollys@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(346002)(39860400002)(376002)(396003)(136003)(2980300002)(438002)(189003)(199004)(81156014)(8676002)(6666003)(50466002)(81166006)(5660300001)(2201001)(36386004)(575784001)(48376002)(39060400002)(356003)(4326008)(107886003)(305945005)(63266004)(7416002)(44832011)(106466001)(76176011)(106002)(9786002)(14444005)(16586007)(50226002)(36756003)(77096007)(47776003)(8936002)(316002)(2906002)(26005)(426003)(11346002)(446003)(478600001)(486006)(51416003)(7696005)(336012)(110136005)(54906003)(476003)(126002)(2616005)(72206003)(186003)(921003)(107986001)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:BL0PR02MB4452;H:xsj-pvapsmtpgw01;FPR:;SPF:Pass;LANG:en;PTR:unknown-60-83.xilinx.com;MX:1;A:1; X-Microsoft-Exchange-Diagnostics: 1;CY1NAM02FT056;1:F4jMf6J/39XBmifXqxNtYOZTCZpcJZZ7MSycw/JSWOiK+Wtjsi2dwqcZqUV9h0aPg4Rki7CIrBTUcY0XwQVGuJEcx8xz9UWJN94nfuwCqdSEx6xfT071vWIxylTdBnj9 MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: df491755-30fb-454a-d0fa-08d5f96a13b2 X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(7020095)(4652040)(8989117)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(4608076)(2017052603328)(7153060);SRVR:BL0PR02MB4452; X-Microsoft-Exchange-Diagnostics: 1;BL0PR02MB4452;3:u3DQYeOwlKNEyTS7MxxHk3buRABhOUox/VC7HOVctIBNwPnMSAKIwXNqdNOoWo7uw/ekvkX/hze4JFl1xtvmtGg6BAg3dRo+HoC2CP0Fi2k6Aa5aur4STSN+iBc9pvTnhnixAX5gGxwuyAir3pVWw71c9sh2Cb+8Pyle9CeD8m4gtLpB6bNlZ/pSb8g4gioqVdRRa1mP78N5FxAJIE3Hix/L/N8hSO70ai+w6/sE61pIhy/wvw4zWdAVK/+/PXZIc2HwA4FvrnCuG+9oaMFyo7JAcs1QPss2r3qB2YnwVikz77yfJ9IJ/YWIiQzTLlF2KvhQhLsz1iv/zi1xiSbpSNKJFDBA4ZPduHmO+VHN5P8=;25:LXJ2Vp0S2PhNyuQpuooRWPDEQCDCFctChZ7NtQBffAH7j0HpBmn91ZJf/UvJGyN+WaoKdJaBpJOWInm/kLyzpa2/ra1jyqhBAn2fsPuzZ0Xh7c+5wDJ/qJoW/FedMTKQ7uWhGwb8HGxOavMr7R51Nud12+loQJyUCKrOCkAIcSv+1tA+QMSOEGkDzKsWkEA02WmnzFl7xqKwyMAqLwgw5TZdhL8Wp+EMs7tU5VkMqpxVRVb4/UD5Fy2lLoVZRQO9MY5MJeCv6WIvuA0V4ufw1GhFfJvLRSIVwHWONf9GjGuEmuWl9ho6Wv40bR+2smxGToxoH2xooQnhZxbkLbxVdw== X-MS-TrafficTypeDiagnostic: BL0PR02MB4452: X-Microsoft-Exchange-Diagnostics: 1;BL0PR02MB4452;31:gAD/0l4A22RMMz3cA77FGvYUYsqp7N985YvCQnxLWHoCHncGUMZL+KmuVQcYhKrluSa3gW0YAxB1QQk3b7NHltL454qdM5hlhADX+WeP/k8jkyahuhHWc278gplw74Zi6AiGSbTV9ybUcrYnyTst1AA6QgRd/gUAYLFQ9KhiZIOWfN+xjPjisNhmqjrx3fzaKZsQ2eGPWATXw/IgsnFG88uAapDzoNTzeKbn0H/ZHjw=;20:m6IjijVa+swdSqlECYcegH7AeaWGnFJZJ67tBzrbOBgVOBKKlXLmYQrIyVo3o8Y1iayTFD5fHw4+0xPN14S3QUR8Ie8m8slJvMTi3d6HAH+75z95ngoHvp40xGmnnLFGrahkxoP44ACWkEGr8Y14jyXjnEzZGxuRqD5ewoA84bsH2Ks8V3t1E9MId75x+x5YAk1ITtmvYDdlfkqp/R8V5BjLbVA4iNkpHft/9bYyxEiI7PUT39DpgHjvnHaHXxEj8PfjHHVMObDr0uciKD5EqhviW2GB/RKKnSxU6PHFj0ACl+j3L+NfBkHbaMD/Pc797Z4IV8ZhdJCbTK18Ka+UqIy7hHDDYI9mSMx8FtsMsCGGnTfoDrV6Muj6g66b91/d5CsHMpkFRREI7htfE+wTpB4pNSxnyF13T5iiIsdnxKFWJK4h/Ojoy8Gmh1MqKGguoKbGszzoKwgnWlKW0W9aFYYmZTb863zqWSTtrOwZqsGTls6RX2lXPuKMZtSkEoho X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3231311)(944501410)(52105095)(3002001)(93006095)(93004095)(10201501046)(6055026)(149027)(150027)(6041310)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123562045)(20161123560045)(6072148)(201708071742011)(7699016);SRVR:BL0PR02MB4452;BCL:0;PCL:0;RULEID:;SRVR:BL0PR02MB4452; X-Microsoft-Exchange-Diagnostics: 1;BL0PR02MB4452;4:S1wOMZKx46XEgQla1475Tc9TEw2kgWJkcVsL0CDFGaXSOMIIY736AjSmYireGlAatx9RbgpQFaPlM7TfODrR65ZHyghGtvEDcC/7CukUAsgmZqGxFZZMO83wP1xGYJNrT8L+VM0CtATBCVyiShDY/3nrQBh9CJq0zQpwengwEZLJgGrcLbEm4XbMkIXljMG92NM5qZwqgi14GWXuQL5irl54VviDeeH/in1QGc5GfwwXcpfTOPW5ayhm7NsHZx48kIP48arXJ5yCvptPDFOS8TeI65FU6nbGS8aPo8eh9q5UNCNJDwzXu9n0EE8KoES9 X-Forefront-PRVS: 0753EA505A X-Microsoft-Exchange-Diagnostics: 1;BL0PR02MB4452;23:4SmKEBJfIiPDNKrH/YSFqfMAsxGv8UJjmXMIEw0O1WCrOK0AkD60wh1VrqwSP78kTCrAjLDvbbtFalM2I/LEYfqFfpJwIercxDOEtVgcedzlEIQqUtbC0J2HvDHHoPDsgcBrXIvoobF5RKReA35NCBIeoGiYIcOSNugKQ8FNtMiIZoHeMrDx6S7dkqOZKoheFUXw7KV5hyggAIw8aBqOcU9TfjSpVE1NcLHv3ZYER4p+lZOpzG3JCqZudgIrMMwyveYHy054HnHUFrSEZEsWhiGm95jxUEAy8r6Q7nwXTV5nHSRLEnLhzIHT4IgIVoTLjNKbx3uvEMiR08IOVEvPY5CdqIWTcRk7IqVlu+XL932/hKvLili2xCyHCgnCWJditDGrodQ9KZS/llESbsLq0tBAfjrME9ZDmwLkq/XftOthxOGGbvnD5FIObG3ZUGq9mFCAs+PHtAzXvZ58fBUyLtuewBVVhdJ+Zop2eluuScCthB8Vj/2Ck7l0W08AGUCf0hR6CzV0nLsB03rXYg9c+VgphTBp4dUfpGNPtuWUt/2vs6niIC3QzqjW9cdKbHewQxdSV1ydut5wiHtvNJW928rSigYQnQfXSvsn/rEhEfU4WtgL2eUbwIG8yqy1J53AMPCAoO5sw93MrHfKwkzjTMxbPkmgFQihDTSP6VRLxShXBWXg1NUOM3/LwB2dh4smSrGALhrtH6FxrIi0rFCAXLonC5OqfWRHYEqRvBaXKuPP7x1NSAZNm0IqopC8nGKGq1P5XM++d/WyTJcnUrexbHy/H2Oy5hJ+4IZgQF7ZpmRnNC+5S7+ibKlYI2Ik9KzhzzZHstAJFWlpm1R96f690Ay9srenY9eiNzWFOv02ziKRmVzu5PveAbh+si4TMZI8W6p/uAPAVNTQSavu1i8jfo+yk0Fq9CpulFZ4xFdZyFLVzctNHzadPlBSxPe23iLw09WFtR03WoY777oaeIFr7Ck2qANFcr4ufyfrtZTkBqrcRlQvHBf3er8UXfuZlAUCH6hq7MqqJV+dR/RLXha2j6c/nMVjYzaJClO7SnPYdYHjzd6QHqgwW9rjMAiVOKTlGdc1TK7w5f95aPTj8tUnm2DcG4ETgmwPW+brxFSzI0/NPOZsKwggzEHqUbI38ORgpBgDQIauzfcM7CMkicWjj9e4Mu89+IpWpqfVPG8EusUadmXGIho2Q+o0e5IaTCe4VEtdafXpd0bk0DFYs0Q7tCQs89xLftF0sUZrvNCRUS9iOYZ6Io4cafWKbaO0loT8miGi/ZlI7yS2qjANQ8OoOg== X-Microsoft-Antispam-Message-Info: ObHRcJQ2jkSQpY5UiBfWVcNMi05wJITzCqC3BeHsBgex/Ng76kHth3MQil0pugeSV/naYECXZ/jJV6MKsFPn0O0KxxJOkpJokDW66j++z1RVHu4/DsiZV7HLoGScM3N9WismFf+I+38POpikFCkxOiA0u+ISx6ChMYX7l3nJy5lNqiX9iWwGxeFTuL9IPAaHpEn6DOJYyQ0gCEPEa4FLmSRxhralMue8/12g89chDC6gw95CCsU+VqXz6McDfor9QUHwbNqCmCDLQYsqB80GmqtLMyXElKkdnFFraNMqkWlaacxZnzCx+qthGxJrvezoFmgjJ7R5Ox6pGfMxrG13BHupGYvRiZ4OHz+IwtnPCvw= X-Microsoft-Exchange-Diagnostics: 1;BL0PR02MB4452;6:XK81hQCF+KkaMNSs/mcaTYyR8PWkHLLrI2U4yLLW+SCAFOSUBl3V3qBHu1zpLC80CsqoYXS3ob7XU4T4Oxgk+zVO2MsF/jF0IItrehOOcpVPakCNUdAOuig0tGuWzQ9AusgGk6AnnZg6JisxKeWbLqR7SP7geIiiP7fPICdIJkCZJDiOpO8GKkQWM/1WgS0lZthwl3FuubAJVN9maCr26C42RkdqkrsjxK9MKsXB3bZreynylhxDt3KTtrMB457mWhR++1BQ8D1bX2GjMZcmgOAZWhTRd76e5AhO7jAksiNiboMsnPZwnIralVQTmhas8kbNrWhZ1/xrqwBd27+qz3kmO3Sp75KHpEc1nvXSg5mQjKqmKoq4od9YwzpB8s3SQTQHpkqf9rblumRDL9prSFWy5IU3rleCB+H9HP53PjPA/aIuCasb9/8whaOViYL+wz9dQP+3HqfrGmdW7RVWWw==;5:yJdTcKxVONzB436x1If5l2hQ7Z+9AKUQHyv16QL7ulayvFKr7VOxKbduzJBtAVRmtWSpE6pbGCf35GCfL+/e9KT6PhI2Ja8uuV0Sa3bcRXYU8806QDn8pLkBpb86MoeZO7CSdMuwYMvFMCQn6PUgi7w3lhNY/7knKeT9p3D8T7k=;7:SPj/T83HaBXHdxHbjZhXjfrIFad2yuqhsBePk5KeJyxCv0PRLpg+oMZS0AwhAAQjO13OLGmp2XyNUDEr/OlQUi09vpzUa8clZ3lglOUO73u+G1qVA/MxzAiVSTc7txwSzcrT6mZNnaeTlL5vXLL5MtcN9OlQ2Pu4ojyZZcNBk9x/vN5RrfZ5li5cJi8YgPagcQ8gIEV0lw/eLzJVAhOJqWpqJgC8LLnxKazmlgokh/icMYSTorj5Ubih7ge4gtUZ SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Aug 2018 17:53:52.4503 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: df491755-30fb-454a-d0fa-08d5f96a13b2 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL0PR02MB4452 Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Rajan Vaja This patch is adding communication layer with firmware. Firmware driver provides an interface to firmware APIs. Interface APIs can be used by any driver to communicate to PMUFW(Platform Management Unit). All requests go through ATF. Signed-off-by: Rajan Vaja Signed-off-by: Jolly Shah --- arch/arm64/Kconfig.platforms | 1 + drivers/firmware/Kconfig | 1 + drivers/firmware/Makefile | 1 + drivers/firmware/xilinx/Kconfig | 16 ++ drivers/firmware/xilinx/Makefile | 4 + drivers/firmware/xilinx/zynqmp.c | 337 +++++++++++++++++++++++++++++++++++ include/linux/firmware/xlnx-zynqmp.h | 63 +++++++ 7 files changed, 423 insertions(+) create mode 100644 drivers/firmware/xilinx/Kconfig create mode 100644 drivers/firmware/xilinx/Makefile create mode 100644 drivers/firmware/xilinx/zynqmp.c create mode 100644 include/linux/firmware/xlnx-zynqmp.h diff --git a/arch/arm64/Kconfig.platforms b/arch/arm64/Kconfig.platforms index fbedbd8..6454458 100644 --- a/arch/arm64/Kconfig.platforms +++ b/arch/arm64/Kconfig.platforms @@ -274,6 +274,7 @@ config ARCH_ZX config ARCH_ZYNQMP bool "Xilinx ZynqMP Family" + select ZYNQMP_FIRMWARE help This enables support for Xilinx ZynqMP Family diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig index b7c7482..f41eb0d 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig @@ -257,5 +257,6 @@ source "drivers/firmware/google/Kconfig" source "drivers/firmware/efi/Kconfig" source "drivers/firmware/meson/Kconfig" source "drivers/firmware/tegra/Kconfig" +source "drivers/firmware/xilinx/Kconfig" endmenu diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile index b248238..f90363e 100644 --- a/drivers/firmware/Makefile +++ b/drivers/firmware/Makefile @@ -31,3 +31,4 @@ obj-$(CONFIG_GOOGLE_FIRMWARE) += google/ obj-$(CONFIG_EFI) += efi/ obj-$(CONFIG_UEFI_CPER) += efi/ obj-y += tegra/ +obj-y += xilinx/ diff --git a/drivers/firmware/xilinx/Kconfig b/drivers/firmware/xilinx/Kconfig new file mode 100644 index 0000000..64d976e --- /dev/null +++ b/drivers/firmware/xilinx/Kconfig @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: GPL-2.0 +# Kconfig for Xilinx firmwares + +menu "Zynq MPSoC Firmware Drivers" + depends on ARCH_ZYNQMP + +config ZYNQMP_FIRMWARE + bool "Enable Xilinx Zynq MPSoC firmware interface" + help + Firmware interface driver is used by different + drivers to communicate with the firmware for + various platform management services. + Say yes to enable ZynqMP firmware interface driver. + If in doubt, say N. + +endmenu diff --git a/drivers/firmware/xilinx/Makefile b/drivers/firmware/xilinx/Makefile new file mode 100644 index 0000000..29f7bf2 --- /dev/null +++ b/drivers/firmware/xilinx/Makefile @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0 +# Makefile for Xilinx firmwares + +obj-$(CONFIG_ZYNQMP_FIRMWARE) += zynqmp.o diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c new file mode 100644 index 0000000..edbb84e --- /dev/null +++ b/drivers/firmware/xilinx/zynqmp.c @@ -0,0 +1,337 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Xilinx Zynq MPSoC Firmware layer + * + * Copyright (C) 2014-2018 Xilinx, Inc. + * + * Michal Simek + * Davorin Mista + * Jolly Shah + * Rajan Vaja + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/** + * zynqmp_pm_ret_code() - Convert PMU-FW error codes to Linux error codes + * @ret_status: PMUFW return code + * + * Return: corresponding Linux error code + */ +static int zynqmp_pm_ret_code(u32 ret_status) +{ + switch (ret_status) { + case XST_PM_SUCCESS: + case XST_PM_DOUBLE_REQ: + return 0; + case XST_PM_NO_ACCESS: + return -EACCES; + case XST_PM_ABORT_SUSPEND: + return -ECANCELED; + case XST_PM_INTERNAL: + case XST_PM_CONFLICT: + case XST_PM_INVALID_NODE: + default: + return -EINVAL; + } +} + +static noinline int do_fw_call_fail(u64 arg0, u64 arg1, u64 arg2, + u32 *ret_payload) +{ + return -ENODEV; +} + +/* + * PM function call wrapper + * Invoke do_fw_call_smc or do_fw_call_hvc, depending on the configuration + */ +static int (*do_fw_call)(u64, u64, u64, u32 *ret_payload) = do_fw_call_fail; + +/** + * do_fw_call_smc() - Call system-level platform management layer (SMC) + * @arg0: Argument 0 to SMC call + * @arg1: Argument 1 to SMC call + * @arg2: Argument 2 to SMC call + * @ret_payload: Returned value array + * + * Invoke platform management function via SMC call (no hypervisor present). + * + * Return: Returns status, either success or error+reason + */ +static noinline int do_fw_call_smc(u64 arg0, u64 arg1, u64 arg2, + u32 *ret_payload) +{ + struct arm_smccc_res res; + + arm_smccc_smc(arg0, arg1, arg2, 0, 0, 0, 0, 0, &res); + + if (ret_payload) { + ret_payload[0] = lower_32_bits(res.a0); + ret_payload[1] = upper_32_bits(res.a0); + ret_payload[2] = lower_32_bits(res.a1); + ret_payload[3] = upper_32_bits(res.a1); + } + + return zynqmp_pm_ret_code((enum pm_ret_status)res.a0); +} + +/** + * do_fw_call_hvc() - Call system-level platform management layer (HVC) + * @arg0: Argument 0 to HVC call + * @arg1: Argument 1 to HVC call + * @arg2: Argument 2 to HVC call + * @ret_payload: Returned value array + * + * Invoke platform management function via HVC + * HVC-based for communication through hypervisor + * (no direct communication with ATF). + * + * Return: Returns status, either success or error+reason + */ +static noinline int do_fw_call_hvc(u64 arg0, u64 arg1, u64 arg2, + u32 *ret_payload) +{ + struct arm_smccc_res res; + + arm_smccc_hvc(arg0, arg1, arg2, 0, 0, 0, 0, 0, &res); + + if (ret_payload) { + ret_payload[0] = lower_32_bits(res.a0); + ret_payload[1] = upper_32_bits(res.a0); + ret_payload[2] = lower_32_bits(res.a1); + ret_payload[3] = upper_32_bits(res.a1); + } + + return zynqmp_pm_ret_code((enum pm_ret_status)res.a0); +} + +/** + * zynqmp_pm_invoke_fn() - Invoke the system-level platform management layer + * caller function depending on the configuration + * @pm_api_id: Requested PM-API call + * @arg0: Argument 0 to requested PM-API call + * @arg1: Argument 1 to requested PM-API call + * @arg2: Argument 2 to requested PM-API call + * @arg3: Argument 3 to requested PM-API call + * @ret_payload: Returned value array + * + * Invoke platform management function for SMC or HVC call, depending on + * configuration. + * Following SMC Calling Convention (SMCCC) for SMC64: + * Pm Function Identifier, + * PM_SIP_SVC + PM_API_ID = + * ((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) + * ((SMC_64) << FUNCID_CC_SHIFT) + * ((SIP_START) << FUNCID_OEN_SHIFT) + * ((PM_API_ID) & FUNCID_NUM_MASK)) + * + * PM_SIP_SVC - Registered ZynqMP SIP Service Call. + * PM_API_ID - Platform Management API ID. + * + * Return: Returns status, either success or error+reason + */ +int zynqmp_pm_invoke_fn(u32 pm_api_id, u32 arg0, u32 arg1, + u32 arg2, u32 arg3, u32 *ret_payload) +{ + /* + * Added SIP service call Function Identifier + * Make sure to stay in x0 register + */ + u64 smc_arg[4]; + + smc_arg[0] = PM_SIP_SVC | pm_api_id; + smc_arg[1] = ((u64)arg1 << 32) | arg0; + smc_arg[2] = ((u64)arg3 << 32) | arg2; + + return do_fw_call(smc_arg[0], smc_arg[1], smc_arg[2], ret_payload); +} + +static u32 pm_api_version; +static u32 pm_tz_version; + +/** + * zynqmp_pm_get_api_version() - Get version number of PMU PM firmware + * @version: Returned version value + * + * Return: Returns status, either success or error+reason + */ +static int zynqmp_pm_get_api_version(u32 *version) +{ + u32 ret_payload[PAYLOAD_ARG_CNT]; + int ret; + + if (!version) + return -EINVAL; + + /* Check is PM API version already verified */ + if (pm_api_version > 0) { + *version = pm_api_version; + return 0; + } + ret = zynqmp_pm_invoke_fn(PM_GET_API_VERSION, 0, 0, 0, 0, ret_payload); + *version = ret_payload[1]; + + return ret; +} + +/** + * zynqmp_pm_get_trustzone_version() - Get secure trustzone firmware version + * @version: Returned version value + * + * Return: Returns status, either success or error+reason + */ +static int zynqmp_pm_get_trustzone_version(u32 *version) +{ + u32 ret_payload[PAYLOAD_ARG_CNT]; + int ret; + + if (!version) + return -EINVAL; + + /* Check is PM trustzone version already verified */ + if (pm_tz_version > 0) { + *version = pm_tz_version; + return 0; + } + ret = zynqmp_pm_invoke_fn(PM_GET_TRUSTZONE_VERSION, 0, 0, + 0, 0, ret_payload); + *version = ret_payload[1]; + + return ret; +} + +/** + * get_set_conduit_method() - Choose SMC or HVC based communication + * @np: Pointer to the device_node structure + * + * Use SMC or HVC-based functions to communicate with EL2/EL3. + * + * Return: Returns 0 on success or error code + */ +static int get_set_conduit_method(struct device_node *np) +{ + const char *method; + + if (of_property_read_string(np, "method", &method)) { + pr_warn("%s missing \"method\" property\n", __func__); + return -ENXIO; + } + + if (!strcmp("hvc", method)) { + do_fw_call = do_fw_call_hvc; + } else if (!strcmp("smc", method)) { + do_fw_call = do_fw_call_smc; + } else { + pr_warn("%s Invalid \"method\" property: %s\n", + __func__, method); + return -EINVAL; + } + + return 0; +} + +static const struct zynqmp_eemi_ops eemi_ops = { + .get_api_version = zynqmp_pm_get_api_version, +}; + +/** + * zynqmp_pm_get_eemi_ops - Get eemi ops functions + * + * Return: Pointer of eemi_ops structure + */ +const struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void) +{ + return &eemi_ops; +} +EXPORT_SYMBOL_GPL(zynqmp_pm_get_eemi_ops); + +static int zynqmp_firmware_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + + return of_platform_populate(dev->of_node, NULL, NULL, dev); +} + +static const struct of_device_id zynqmp_firmware_of_match[] = { + {.compatible = "xlnx,zynqmp-firmware"}, + {}, +}; +MODULE_DEVICE_TABLE(of, zynqmp_firmware_of_match); + +static struct platform_driver zynqmp_firmware_driver = { + .driver = { + .name = "zynqmp_firmware", + .of_match_table = zynqmp_firmware_of_match, + }, + .probe = zynqmp_firmware_probe, +}; +module_platform_driver(zynqmp_firmware_driver); + +static int __init zynqmp_plat_init(void) +{ + int ret; + struct device_node *np; + + np = of_find_compatible_node(NULL, NULL, "xlnx,zynqmp"); + if (!np) + return 0; + of_node_put(np); + + /* + * We're running on a ZynqMP machine, + * the zynqmp-firmware node is mandatory. + */ + np = of_find_compatible_node(NULL, NULL, "xlnx,zynqmp-firmware"); + if (!np) { + pr_warn("%s: zynqmp-firmware node not found\n", __func__); + return -ENXIO; + } + + ret = get_set_conduit_method(np); + if (ret) { + of_node_put(np); + return ret; + } + + /* Check PM API version number */ + zynqmp_pm_get_api_version(&pm_api_version); + if (pm_api_version < ZYNQMP_PM_VERSION) { + panic("%s Platform Management API version error. Expected: v%d.%d - Found: v%d.%d\n", + __func__, + ZYNQMP_PM_VERSION_MAJOR, ZYNQMP_PM_VERSION_MINOR, + pm_api_version >> 16, pm_api_version & 0xFFFF); + } + + pr_info("%s Platform Management API v%d.%d\n", __func__, + pm_api_version >> 16, pm_api_version & 0xFFFF); + + /* Check trustzone version number */ + ret = zynqmp_pm_get_trustzone_version(&pm_tz_version); + if (ret) + panic("Legacy trustzone found without version support\n"); + + if (pm_tz_version < ZYNQMP_TZ_VERSION) + panic("%s Trustzone version error. Expected: v%d.%d - Found: v%d.%d\n", + __func__, + ZYNQMP_TZ_VERSION_MAJOR, ZYNQMP_TZ_VERSION_MINOR, + pm_tz_version >> 16, pm_tz_version & 0xFFFF); + + pr_info("%s Trustzone version v%d.%d\n", __func__, + pm_tz_version >> 16, pm_tz_version & 0xFFFF); + + of_node_put(np); + + return ret; +} +early_initcall(zynqmp_plat_init); diff --git a/include/linux/firmware/xlnx-zynqmp.h b/include/linux/firmware/xlnx-zynqmp.h new file mode 100644 index 0000000..cb63bed --- /dev/null +++ b/include/linux/firmware/xlnx-zynqmp.h @@ -0,0 +1,63 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Xilinx Zynq MPSoC Firmware layer + * + * Copyright (C) 2014-2018 Xilinx + * + * Michal Simek + * Davorin Mista + * Jolly Shah + * Rajan Vaja + */ + +#ifndef __FIRMWARE_ZYNQMP_H__ +#define __FIRMWARE_ZYNQMP_H__ + +#define ZYNQMP_PM_VERSION_MAJOR 1 +#define ZYNQMP_PM_VERSION_MINOR 0 + +#define ZYNQMP_PM_VERSION ((ZYNQMP_PM_VERSION_MAJOR << 16) | \ + ZYNQMP_PM_VERSION_MINOR) + +#define ZYNQMP_TZ_VERSION_MAJOR 1 +#define ZYNQMP_TZ_VERSION_MINOR 0 + +#define ZYNQMP_TZ_VERSION ((ZYNQMP_TZ_VERSION_MAJOR << 16) | \ + ZYNQMP_TZ_VERSION_MINOR) + +/* SMC SIP service Call Function Identifier Prefix */ +#define PM_SIP_SVC 0xC2000000 +#define PM_GET_TRUSTZONE_VERSION 0xa03 + +/* Number of 32bits values in payload */ +#define PAYLOAD_ARG_CNT 4U + +enum pm_api_id { + PM_GET_API_VERSION = 1, +}; + +/* PMU-FW return status codes */ +enum pm_ret_status { + XST_PM_SUCCESS = 0, + XST_PM_INTERNAL = 2000, + XST_PM_CONFLICT, + XST_PM_NO_ACCESS, + XST_PM_INVALID_NODE, + XST_PM_DOUBLE_REQ, + XST_PM_ABORT_SUSPEND, +}; + +struct zynqmp_eemi_ops { + int (*get_api_version)(u32 *version); +}; + +#if IS_REACHABLE(CONFIG_ARCH_ZYNQMP) +const struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void); +#else +static inline struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void) +{ + return NULL; +} +#endif + +#endif /* __FIRMWARE_ZYNQMP_H__ */ From patchwork Fri Aug 3 17:53:20 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jolly Shah X-Patchwork-Id: 10555395 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2C1D21708 for ; Fri, 3 Aug 2018 17:54:59 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 168442C724 for ; Fri, 3 Aug 2018 17:54:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0762E2C921; Fri, 3 Aug 2018 17:54:59 +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=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 889D62C91B for ; Fri, 3 Aug 2018 17:54:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727473AbeHCTvT (ORCPT ); Fri, 3 Aug 2018 15:51:19 -0400 Received: from mail-bl2nam02on0072.outbound.protection.outlook.com ([104.47.38.72]:32368 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727479AbeHCTvS (ORCPT ); Fri, 3 Aug 2018 15:51:18 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=iY9q6XzlDsriWHdrcuaPTnv10bXo5ZNfFWWu1fIDmys=; b=PyH+SKJTMqScUwv89VJ+MKfI5lraVw6m7ZZJaAjG+waZ90iLQ2qG0TK7i9aZO39UB23PVtQihAh79ZiFpveFAM+dYBAHo3S4z0lBh8Ni6RBC6wQ3a6p/6zuC4FHVNmIGo6J9Jo1w7ca0jrwyjLfGOs777eDyc/yEo4wjaRkM+Y4= Received: from MWHPR02CA0012.namprd02.prod.outlook.com (2603:10b6:300:4b::22) by DM5PR0201MB3511.namprd02.prod.outlook.com (2603:10b6:4:77::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.995.20; Fri, 3 Aug 2018 17:53:54 +0000 Received: from CY1NAM02FT044.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e45::207) by MWHPR02CA0012.outlook.office365.com (2603:10b6:300:4b::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1017.15 via Frontend Transport; Fri, 3 Aug 2018 17:53:53 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by CY1NAM02FT044.mail.protection.outlook.com (10.152.75.137) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.1038.3 via Frontend Transport; Fri, 3 Aug 2018 17:53:52 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGu-0004fh-7w; Fri, 03 Aug 2018 10:53:52 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1fleGp-0007cn-47; Fri, 03 Aug 2018 10:53:47 -0700 Received: from [172.19.2.91] (helo=xsjjollys50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGl-0007bh-9X; Fri, 03 Aug 2018 10:53:43 -0700 From: Jolly Shah To: , , , , , , , , , , , , , CC: , , , , Jolly Shah Subject: [PATCH v11 03/11] firmware: xilinx: Add zynqmp IOCTL API for device control Date: Fri, 3 Aug 2018 10:53:20 -0700 Message-ID: <1533318808-10781-4-git-send-email-jollys@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533318808-10781-1-git-send-email-jollys@xilinx.com> References: <1533318808-10781-1-git-send-email-jollys@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(346002)(376002)(396003)(136003)(39860400002)(2980300002)(438002)(199004)(189003)(107886003)(2201001)(39060400002)(106466001)(50226002)(217873002)(4326008)(9786002)(63266004)(77096007)(47776003)(5660300001)(26005)(110136005)(446003)(2906002)(426003)(50466002)(486006)(186003)(6666003)(305945005)(356003)(48376002)(336012)(316002)(81166006)(81156014)(76176011)(51416003)(106002)(8676002)(11346002)(2616005)(7696005)(476003)(126002)(72206003)(36386004)(36756003)(478600001)(16586007)(7416002)(44832011)(8936002)(54906003)(107986001)(921003)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:DM5PR0201MB3511;H:xsj-pvapsmtpgw01;FPR:;SPF:Pass;LANG:en;PTR:unknown-60-83.xilinx.com;A:1;MX:1; X-Microsoft-Exchange-Diagnostics: 1;CY1NAM02FT044;1:gZGQQHUnCMARprb6H5I1+asn9Hsgw0Tnc287HYKOHfR5S/7U0ESoiGbRMZTznYI1DBXfcyO2cxS72IPUNBQGR1K2NyehQW9DMkwQObyeUsO50T0munQpAgbHuqKFiy3B MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 01c19963-0a15-47c4-31f0-08d5f96a13ca X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(7020095)(4652040)(8989117)(5600074)(711020)(4608076)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(2017052603328)(7153060);SRVR:DM5PR0201MB3511; X-Microsoft-Exchange-Diagnostics: 1;DM5PR0201MB3511;3:+ceyPEYBjP+JZt8oITNykf5abb8Ux+W3WBMnt4cjJfV/Gc2sIAD1tjtxO1S10Z1hs4B0J95XH2RFwsf80tyZzVGY+Km/vlAi18SyZsC8WqGhO7DJbUko9kKYmmebcalphvyjckHnt7iEEqWmRuDEIGmRj3/wrgX/K+B4YESCmXC95JP0qwcXjtH4oYi0MrGKBb4DND0q29uXRfxtDu3KozcVNgVPAFMLIKwcXD+fYVaSdYjpwHhlWeVblMtOLbMyRCUetfNN0PWYINGuirNmrcMvRLUtQ3Qa7KqEDkHNFPhXUhNHsV6rHY5kEzgKwMbEC16SvLWszVsxKnzpghMZ5NoO5jXZUKoltgQiWHWDoEs=;25:PZ2niHdLF57AVpNChi9dZLZkPq+V/5ucSJ/Quf+crUmpThSuPUIQWpfCVdvyZKB4udTh6VRmZubiJQjebz82WiBz1k7pc8jAzIpQTZQZQyvuHwPBkngHux3NQiOmkxvVEWMoccxLLMQkumlNHzF9NQ51S681D+Vbm3PceXXNSY0Jnyo476zgFM3c2pad8nFOSm1ysNv9vVu0v7U6YJva4o4IR0hLU6hcxqzk9250bzqHyBzcrFpJjE+U3Ie9kW0ek0EGFhxAIDTIPJ78PbfUFYQWoid2vidQ86QFpnVraC2hZc7XmCihB/NalxrUEA6b6v41svtAXsfr4FvWBWivjA== X-MS-TrafficTypeDiagnostic: DM5PR0201MB3511: X-Microsoft-Exchange-Diagnostics: 1;DM5PR0201MB3511;31:vBSqcixlCMiSiE+3CLXO0RYHMNFRPF3D4UWI/1Wtv+R33i2hUd+7nLRq3yGu9phGVFivIVojlEBBmjmseAGQWA8irZYSI+unUquot/j1wfFW6W0z0dzP6QDhF/H6jns2/OBQ4Cf2yCI+cjtMRb1oVsXMprEWntbPA6g5hY8PvPsqs6wAc/ruANZXoQHZNXPnsmt0hf+OldPwfw2USfOK6hawPJlSwLgcn3k0t5YQPvY=;20:UNMQ7s7RJ7vVmVKO+gTiugFJoU3WoiPlXyvr1zOdagfzaMtWMObgAcgifUB/s5kGfKlKHqmnIYIYpGGEF6GpKMtoF+NeBDxPtKO8E8Hy+q7PlJ1MWe8VgCFeDUiNDtCmJcpMJdgsNivOoY2Est/UYsMg/yeA8O3nrpRGTuvP7mErtS3AAfBitSNMyGLWSHdiNoQQqsQ0NmhYZaWu2C/6P43T3pXsWLMovP779/aVL1U5PUGFk4cJm+h44ivKFec/cpJuHzGHfpG6BWEPHZ0IfFG2DXFarUwVN66AbR3hiTBckEHRBzs9ZwK2GPVUxdI75M0E/OYhfBpWGphWlHyC9rtlNZW7um07DaaZ7+5QOTbbWXzMdxb0dK+kgXFWnZoEZNbdyLqDq27/HQyuNgr78egpZfh/eKg6js50jVBSVaZJu2fPoLBG2fcOjGhDw+joAmphB4u+wbFuClZa9fMlk+0sY4YZg8gl/5bQT6Lsfa+MRLpo5eHqIW0wnpRNcuO6 X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(10201501046)(93006095)(93004095)(3231311)(944501410)(52105095)(3002001)(6055026)(149027)(150027)(6041310)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123558120)(20161123562045)(6072148)(201708071742011)(7699016);SRVR:DM5PR0201MB3511;BCL:0;PCL:0;RULEID:;SRVR:DM5PR0201MB3511; X-Microsoft-Exchange-Diagnostics: 1;DM5PR0201MB3511;4:eo5MTD3N7roBUHJvekYRU3IvNUurdAwzI4Fya7jPE/rp01CBkRdE/xNWJxKFRg0G+gtllCV6ShNqZ4719ZlBYrgME8tfezNcQn0x3/wLcp4NrN/AyLx5K55FuJFRtNOOM05OdrEViU9wm1rY/F8zc5/S6XZEM7cyXJR3G4b7JCUqRsv9ZXDW+qM6MUrhvTRdiOUo6gN0d+F2FsyGgqV6GFwsbRH9pJKBuIqlS5/E3iZqxJynkjcIxK5sb0ooo5h/ghexaSxtX0EwoBjaDkx8z1TUE9vuGo96/0IOHbTV9Mj5iyIzofXMdwesDBoiFrjO X-Forefront-PRVS: 0753EA505A X-Microsoft-Exchange-Diagnostics: 1;DM5PR0201MB3511;23:/r1QJbUB8a3/X2RQ2tiC952QbvGBAKqWP/IAKJZ/D2MmjweQC7NCx4jBM5hAS3k9K6PTpXGQtJAPwpLygsj4hVPuTW/CW3AsPs7YHM0ar51rBbg8KfuetOQx+5lip+bhTUS1NFonj9kxqc9GgYfGcJuO3NJ7GReTU55iBb1TWDzMJmHdfZolSVsB02BYKznCinyI6XCp2f6J/fSI6B94SYSs9mL0Pqq6PnQfVMneTGlFEmMyBpLLzlkLBeKmbopVbjfwFmrZ4ozOU+SdRevrLFifZBeB4el23ikLIbxr5YM9euEZeVKK+YTyD1z38rPXteJNOuDz0wv2zdYNcLbQ1IaAmotfb0ees3P/IqLBtLwCXlA5nWPyE6F8aO42XOPBGHs2BMGmwh8r9+RkpLQK9IKPdliVjNsUnI1mO6+DBQHl/S3to8qZUtEm+0/xHMsdhhBqwHJVdtHGeTtz1DDcjPlNMH0RM4/VJb/kyZJOYw3ThG/q1nQRWqQaQlTdnnOK2Gj7Z8ZRKGpEGjTyVEnOColkCRPCgm2STpIGzJujet77vcNH4YKslzL0XjvDsP+g0ZvLiEQ2u4RVE7sK2lqQMvAjojZi6NTwBk1diy883WUCzFwXjL3zA+qigRgmZxs/KrAZQm7OMWV5YNDdxdRKpg52jb3XslwGp7afxN5C5NrcZ6aklBp2cdePPD8IscBWvD9yQ7zJ9DEtYMmwASX4L7+dWgFynbfN9ey6azZb64QA411om3Lm/zfxKbM/q3HAQnjlPWyKqr1GMaMA5iR9CExs2cj790lRBxGQ4CPPrnSiN6RlkSzcbdE/jDeqi2QzLxDktgdLQJElzl74GA+/R7WTRkpB75spnXzgrFjr8nNz+VSsenBfvVUwqc7o05tA8K4Fx1JS6bLnYrzLoCm1rYfYiEXF+9pujH2xnil/7iGnd3RMCCEGpS+tdF0vbqYiroP5eeM2SMIujaIoGzE67Ly7kK3F3Q6u5hmVGS+qV6JMpjL/tdSdbj47IuIeAWHUUVL+j+poMBQcNeWVoPhh/T30cc0yZXnlMZsyZvwzSJQ2JwKKZXVfHQkSBcof/j54Mp3Lr/8O/FmX2nCyYQbPJZen16VTak/9CjJgkPaZ5CKWMql7QcmjZmbHPd7vJVMHrgtCfhrMCGXCsuJ1e7txqsOYcBYof8+w60nfQZW4cJ7eICDXWQZDsolyctv8Zp+xgHW9oazR0k+e2UtXsGSJ8qrQxhTv7CA7NPhMM2vCshhFJCN6avp/kyK/yjj6mGdz X-Microsoft-Antispam-Message-Info: Ovciux+C+MzAlWIrO+/NzJYAt6zE4giyS5pWxJCLoAdwUZAJeHc8FE8ShFdLFVMnj4dqHjXhOOUZhoGrPcpoHdUBRLgqP2mYi3CHDKNboatVtztQwfVkOaRSu8rTFjsQ8QkO+XdOztS4ueWL2PUDiNJtZwJh47VrTtKvyo6U0wYuVuAH+LhjnGftW1y8D4qQkBeV9Kgp8EFEMK7xsziTnVRKOtZoBKd+2eW6inR5M1hFIWxiorr1WzaEAdsEd1qWgkY+qEjwIgY8FAUgzN3Xty0BUhB3o1iEvsI2LqCwPllO3ymOIOcm4PtchH1RwINKSZcazQTpiPpxh9Dyaw3j4VIwDcx/g6zh0fF8KbpFS4s= X-Microsoft-Exchange-Diagnostics: 1;DM5PR0201MB3511;6:3jPHBmOPcVfhQC2FGyfi5sd8IXppoVO4oNCdaSltz8ulULMwrsTpkpdh0bIEVLlExei2T4TYqsC2696G2/k5+JGBN7Xi3Ovupmm4vfpixPXy4+Me/pJ3QleHHscDR8QiDVLQKsJblEl46k//cUF28AVYMam5dBmQktP6f3d/JwX0RAvW7MrsFezgLzVZ0HXoe4O1ltFYLDo5a87JQeshngA2YS9Wia2EY+EPnZlU7lHCNQ/KmkMrs7h2F6eT8z42trL7idsBvlz48P8PczW+qX7XlYCs93PRVNkMCIoyuCSdTQdsU9ifLpenSsKtkFxo/36QOkhMW5SFAHJvSUJQk9cgVRwGDAFOfyN9dClNtlO2NjdUts3oqJyQgYTzdtnodjDbiiYIFMTFIwsvBUqF1fqrrpvuyfovREm/CNq5Qa6bqYGEQ2N4GQbvW3ueRMomPMHb9frK77gRv85ksJAHxg==;5:Lp450hifZ/Nz7ZY/44/zL8XfBA6+yCopissF9iwagzjRuviDP6ENfU8WHJEuFEJvm17N5L2pRV37qzpfWakzkKlrQv3BME+CHHTAd80vqI9L3wJEmAYKDjwQOkuLt2Cu1r8X9tdbd9wsMTcCWcpVeCtUyB4YNPg1ZzcI+cAsSfk=;7:8cxczJaeYNhowMZfCrjvNeD+h4Q3sgGrLgQk/N/44XhFHYUEYQeL1O9WMRLvxgwyKcMuJylLfle2HlP+GAElAD+DD91Ec8SOfu3VphuaVYMl0tCKCi+vYpY8aLxBzRkY0lWJ6HG2Cscv0RCv+fOaiKbGQbAy7vJ6QdqjEbSMDP69U0Z3lY1uTVhLlFXhjzcqLGOFnjgthqa00FS1NeIkt0urZPaEqlomSJKBy4nLnSBwDZ+o0PnAAZdr2T7+gCgz SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Aug 2018 17:53:52.7598 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 01c19963-0a15-47c4-31f0-08d5f96a13ca X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR0201MB3511 Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Rajan Vaja Add ZynqMP firmware IOCTL API to control and configure devices like PLLs, SD, Gem, etc. Signed-off-by: Rajan Vaja Signed-off-by: Jolly Shah --- drivers/firmware/xilinx/zynqmp.c | 20 ++++++++++++++++++++ include/linux/firmware/xlnx-zynqmp.h | 2 ++ 2 files changed, 22 insertions(+) diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c index edbb84e..24cfd9e 100644 --- a/drivers/firmware/xilinx/zynqmp.c +++ b/drivers/firmware/xilinx/zynqmp.c @@ -241,8 +241,28 @@ static int get_set_conduit_method(struct device_node *np) return 0; } +/** + * zynqmp_pm_ioctl() - PM IOCTL API for device control and configs + * @node_id: Node ID of the device + * @ioctl_id: ID of the requested IOCTL + * @arg1: Argument 1 to requested IOCTL call + * @arg2: Argument 2 to requested IOCTL call + * @out: Returned output value + * + * This function calls IOCTL to firmware for device control and configuration. + * + * Return: Returns status, either success or error+reason + */ +static int zynqmp_pm_ioctl(u32 node_id, u32 ioctl_id, u32 arg1, u32 arg2, + u32 *out) +{ + return zynqmp_pm_invoke_fn(PM_IOCTL, node_id, ioctl_id, + arg1, arg2, out); +} + static const struct zynqmp_eemi_ops eemi_ops = { .get_api_version = zynqmp_pm_get_api_version, + .ioctl = zynqmp_pm_ioctl, }; /** diff --git a/include/linux/firmware/xlnx-zynqmp.h b/include/linux/firmware/xlnx-zynqmp.h index cb63bed..2eec6e7 100644 --- a/include/linux/firmware/xlnx-zynqmp.h +++ b/include/linux/firmware/xlnx-zynqmp.h @@ -34,6 +34,7 @@ enum pm_api_id { PM_GET_API_VERSION = 1, + PM_IOCTL = 34, }; /* PMU-FW return status codes */ @@ -49,6 +50,7 @@ enum pm_ret_status { struct zynqmp_eemi_ops { int (*get_api_version)(u32 *version); + int (*ioctl)(u32 node_id, u32 ioctl_id, u32 arg1, u32 arg2, u32 *out); }; #if IS_REACHABLE(CONFIG_ARCH_ZYNQMP) From patchwork Fri Aug 3 17:53:21 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jolly Shah X-Patchwork-Id: 10555379 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 94D2D1708 for ; Fri, 3 Aug 2018 17:54:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 80E452C724 for ; Fri, 3 Aug 2018 17:54:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 74C4F2C921; Fri, 3 Aug 2018 17:54:24 +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=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E96912C724 for ; Fri, 3 Aug 2018 17:54:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727850AbeHCTvg (ORCPT ); Fri, 3 Aug 2018 15:51:36 -0400 Received: from mail-eopbgr720058.outbound.protection.outlook.com ([40.107.72.58]:55104 "EHLO NAM05-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1729987AbeHCTvY (ORCPT ); Fri, 3 Aug 2018 15:51:24 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=HeHcqfhBmNmq3+qiRcWBF2dzjyZqhOAmxkz2chz3+sg=; b=em8vzxLpipjwDvV7ib9NoNojbhR+Y10UI/FtxNc/yXmmBHmcZUeAHgcQfqk1K4b7nuqdrTHD2lqq3w3ijlTqQALO6flKDnss8DqCVtja9OXb+PZ3RVsg8ovHgHphO/H0Uz6NqSl545Li5z+4ewrUDkdPmpPzxiCZX/8BXx8EL3Q= Received: from MWHPR02CA0051.namprd02.prod.outlook.com (2603:10b6:301:60::40) by CY4PR0201MB3506.namprd02.prod.outlook.com (2603:10b6:910:95::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1017.15; Fri, 3 Aug 2018 17:53:54 +0000 Received: from CY1NAM02FT035.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e45::208) by MWHPR02CA0051.outlook.office365.com (2603:10b6:301:60::40) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1017.15 via Frontend Transport; Fri, 3 Aug 2018 17:53:54 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by CY1NAM02FT035.mail.protection.outlook.com (10.152.75.186) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.1038.3 via Frontend Transport; Fri, 3 Aug 2018 17:53:53 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGu-0004fk-MD; Fri, 03 Aug 2018 10:53:52 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1fleGp-0007cn-IW; Fri, 03 Aug 2018 10:53:47 -0700 Received: from [172.19.2.91] (helo=xsjjollys50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGl-0007bh-Bn; Fri, 03 Aug 2018 10:53:43 -0700 From: Jolly Shah To: , , , , , , , , , , , , , CC: , , , , Jolly Shah Subject: [PATCH v11 04/11] firmware: xilinx: Add query data API Date: Fri, 3 Aug 2018 10:53:21 -0700 Message-ID: <1533318808-10781-5-git-send-email-jollys@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533318808-10781-1-git-send-email-jollys@xilinx.com> References: <1533318808-10781-1-git-send-email-jollys@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(39860400002)(346002)(136003)(376002)(396003)(2980300002)(438002)(199004)(189003)(316002)(106466001)(63266004)(14444005)(106002)(54906003)(110136005)(186003)(48376002)(336012)(16586007)(50466002)(47776003)(107886003)(39060400002)(5660300001)(4326008)(76176011)(7416002)(6666003)(7696005)(51416003)(77096007)(26005)(2906002)(476003)(2616005)(356003)(126002)(305945005)(2201001)(446003)(81156014)(81166006)(11346002)(36386004)(8676002)(8936002)(50226002)(426003)(36756003)(486006)(72206003)(9786002)(478600001)(44832011)(107986001)(921003)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:CY4PR0201MB3506;H:xsj-pvapsmtpgw01;FPR:;SPF:Pass;LANG:en;PTR:unknown-60-83.xilinx.com;A:1;MX:1; X-Microsoft-Exchange-Diagnostics: 1;CY1NAM02FT035;1:rHO0CWpu3BkBhjLm5sQEzS8kU4B8BzsZSNTyXn8pPVQZy6q6XTizv8x/hh1yu5wry1vGa936pLJ4AebHHKuktr1GwZURZV5Gtoa9EDRW2u6oEJPuparxwgagFnTk3e5k MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f96ba5b8-4c9b-40ac-b48f-08d5f96a140c X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(7020095)(4652040)(8989117)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(4608076)(2017052603328)(7153060);SRVR:CY4PR0201MB3506; X-Microsoft-Exchange-Diagnostics: 1;CY4PR0201MB3506;3:icf20laLQcgZdqpqBhpbCkReu96OBDGu9KoOR5B3zstZU8lV4txOHYfzZJqka2HbTy3BO7I9Ls1KThGolH4ufqGhaV3UBXRt+nUGUs23bh2S16Osm3yr9IYeIBuEBHW5PiKhoGtHc6jV1J92b4wm3/pGSjPMkgv7C+M6qczYjpqkQ1ErM62iBAYaxG6kWM7zxqxHrByqIEGB42QEh/UUdVvNcEjGqAXyvafTXvUmjpxM82pq8mlBqS+ltvFaE516eVzL2y5PL2GP52FqaGPe0pQ2dXrG/REg8OxbiJ9InA03FatDQZFGyo0G6yA4DDWLTCHAKB6OlZF7kL0k/rOR7OU33SQu9COiqEBXvEl0g3M=;25:snIbKqkfJkhDyWf51lqz+kqNXcYoHqXKskJruUr1unSfP+rieYPSEwzJg+riTjFqnkHTVzJMDQWW9pOwzJvo1RTqWGHuqhs9+IcgPqhOsvg2xhAJOXd6o1XS6LuulnOMKCD0ECcrH7NGtWPBS8FWqfS6iv1nBaXre8fZAFipTsoDSeS4esL176RqefKrPnsOBDhCpbIvBXcXN4Gx4zkqEnPmkSOvbT1eoPBzaUQAacyV2y4Hh/q55AEY8hvvU6L9fKNaebKIqrG45QchzlAsXj+NZlDSDyCccnoXeVQMDUg10NC0O3M9cgUsRnL9hKMiG4sQWwfGDEobVo0NaXVmUw== X-MS-TrafficTypeDiagnostic: CY4PR0201MB3506: X-Microsoft-Exchange-Diagnostics: 1;CY4PR0201MB3506;31:84G5vx0+8ZAwby6IT9aNY8bGeCPuqtIE9Sx0ijSdqocBlbz2VYUIhBP/3IpX1RKMmfGZCGJEdHiSl8ft+q4gODlCVLtU14S3oacBfsotRdhaMBYmmmO/fsU+PTW4Sfpi8RcVAuEHZXqALm9q3LS5noD8ttxBQOkDwoebSZGTl1yVyKc6rGbzGcXvrQKz7d/QQj5pwq6cZNkSlEvCjBMRCkw4qOYtzAah4V1DLLVrhrk=;20:uHnibOv0p9c2GZhcNLdfOwE1EoMsGRtmkKhH0Qqqu5VgIEwx6iceOrpN/WFsJ7SCRDBu6pFY/dId99kb5Q5m7hTkW2ScXBwoOhxDAXDGSZ2ryp2DaiXJ6EJzGDrRgArfdy/Shbb+3BEmchdLVPGzfxoWQZr8VWdGIrrDuXzho/PNsQiWJywexO6Pm5i6H9OFB8tybqgpJcdUV8mSekXeX4MhQLgQ/wEyUeahhLMeIV33UzCkJG8dZ499/Q2/0WsaB1cQxy7w91DdbYqfjKEqD67yhrz6xjnRb2QAJTCXBVI3Q4X6ajQ8ryEPlSt6F/LoenF2IJVOuLTX+aDhkFEg2uToVnt2uLwF+AqA2s3Xkog+cg4BflpcnBfYVJiH0ey04nKKbZXUFjCDsmF6nV7SjriAcqmmiOxOrswQ5HFftKiYLmVJE/mAmkDWUhcBaGpD1/Iw8KwmoDnzZy1dHKZ0Dw2z29IQZja6uEqFZiVjeLxJ6m5HrYLjJ0GYWI+mTz+p X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(93006095)(93004095)(10201501046)(3002001)(3231311)(944501410)(52105095)(6055026)(149027)(150027)(6041310)(20161123564045)(20161123562045)(20161123558120)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011)(7699016);SRVR:CY4PR0201MB3506;BCL:0;PCL:0;RULEID:;SRVR:CY4PR0201MB3506; X-Microsoft-Exchange-Diagnostics: 1;CY4PR0201MB3506;4:f8yeNLyGBcVliADEJi6+6wv81pg1iumiVJILRGKC3y6qFaPNJLAww3Tj3K9JIR+yiMlIHFyv+0RCz9Ub9GyQZj6WkcJUYB+WjkYga9V2Z+twlECgaB3RBNoz/wppsudzTd9RYEuaf1KmEFYKQhzSWnaQXx5L+9lUi76OogHHJX+ZXLR/RL5T89h4P76C4BGGiFhzR4vU9dl/Ey2fU7VRnXrfKwS0LSgnKq7Sy7CdPt51IObIciOBWLFINbanIrN9fBcBMTArdZSuGkv1lR+mDucR1/fzj/vrFzTxihSKX6iCbT1fchDFfhj72uKSq8Ff X-Forefront-PRVS: 0753EA505A X-Microsoft-Exchange-Diagnostics: 1;CY4PR0201MB3506;23:hhCwJI0woEpyaZpm9g72KxA7XZ8ta8no71DnhjsKnczn3Rx9AGJ2FDCKhvKDXACej/b/eW/POMMmL+/3vuKbv3NlbLhac2kdzcNZC0xLQGfF5+DhQA7qxJvKqUq0lDWiiPLrrxwmn0AfJOniBhJXij38ezoAQopZPZoKRvTudGmmCDQKN8oulKLb+/iVxyj5a+KH5PGYGyAc7i1+YlYJ6LVfwgYu/FaqBLAqfuT2Th7oTA+ENbpzQKkQX6NObmKb+nHjeo0LdHCcNMI+fxJvZNLq3TTSPe5rgJagYbUkr8heoTd4fc1aXWhmtzf18xbz+tlMArrVT1598CDagk/FeZOCDsCHoqkqOa/4FBNkgeGOnMhKO5QHD3t1B1b+9ZggPwuSdGKGsOegJPndqqu4EbkqlzFBQELkKh2kCvVFPMkflKZLLyO1VbfaL45eERsGN+fbbI1k6805k2S3p8C4NvKw2pbqtM/aViP6TD+it3NayCky/lM454XyIhY0sK33ghyPuZOth18NrX4y/wzMGc8SVakrsOqBaake4xBT+X6fXqvN6W4jklq2IHRNrrh/Ug9fkJMLefOQoLv+vhkKTrtM2QtGLDjW92lESJO2cCtHsY8sA19VcZBNCZMFCKsQUUFW3ycYmxDnRzbIQ383doIfV4ceFvVcIhcQOEnM7zOtACXmpSnPbZcW4Ed2VAoB4bGSpnI+qLX0OUGn1lN0QP11IbBHcMsfQftsS1wwlvsI14MfO14PcmQ1r/D+S8isVyLXeupAr7QU5xXY+Dzc2ItU+nomqc/74nnJrkxwUGBeXgTD3xTnbnBYjoXaGubdkz9gjusuBni3/zrOHkvx320jotXvlxnX7WRqLyYcOGBHz9rUTteZCNHNOcbQM3AiD6v6FOaGmxrPqXaXYBHcBIppFsENetIPiJR5a0YMNGKkeWG/FpToJzfiXv9eTcxTu6iDZ3+OqO5eC4bFFEPj5kBmwKnp/JUqprqdCszEZplsUC75hs60pKb+GAu5CKudf+u/xsDp37fhvpQBQXXKfY6w5VHIhREqkrOYZ9yRaQSZmuu1eWMGRgWD7yrFFBGoHtivisN4gBnBxqCpb8ZNVJsnYd6BHWijev59RQgo8R4XOj6Fk6AL9suRUOstiJ3N39VPHl+Yt2zqJXq/UBtPWCsIyznqeqjtW8I00J6CDkP1lqJsxhGewtgBHWRNCQWKV2C4q30CiEC6xYjSC2xUh8kUz1bUEKi8f8SrymbEDowsKd91d1K69eacrQy+Qq2a X-Microsoft-Antispam-Message-Info: dyDEXUIAidTbffqF+B2NRr1YzNW0ZHFu9vOnAYHlOhPMuruEK5Witc2qqTGPmU0NWw8RmvHX+TXsO+OxXTloW3qbL9Uu6gB7AgbPYuTrmW4Hv1RWaLJ2mw67NJqs+tYSty/heVylDVRAi9/cFtjsM1fyZzagkfAc0G5dhUP/o+XHlSMbiRZwsXrknNM8+E/i3VC/ZuCtHTk+/AJ6Ri/oIEca9a+c+tiuXbzOM0QcNLNkgIxjE6/VMJ4IuwF7HeoGxRQUT0pYBgG+V42hxL8KbROgn596OGnUUlXEa3nBOVyluENccKtHTiq9GCEKSycC4LAE8gUsvlhW0WQAz+vle/9o0ASpB6m0wCKEHFtGTjc= X-Microsoft-Exchange-Diagnostics: 1;CY4PR0201MB3506;6:1VVkvCNT+b3g6vM3dm0htFRYcoKtBvvfYFnzOnhOhjPlAWtli0yFh5Gm878wViRY0RRnQJU8A2Sw4Xf8vLBOYJuzeQwxVgKzZ6RXKCOTP+vbUhPldnU+0wU6dv6RsdQaaITgPQFPnO9EuefOznd214T1m+4tIasVx3rNAubcAwr1LoYNwdu/8EkL9t7GvoVl6RtgrS0nSWTFfTTZicfeH4BJdHnbUTQBFyhC0aftzqn2Kor9bFPwHS4SCRD1tq6e37sKhmTX2xPUFBESHShvXhU/4o0ki/5+BNWldCkVEdBjqawKGCgA2PI64MJu/aig5P86rZV+KmCKJ+jxZLpHKXkqP51vLsqtdheMAlag4BJJSn8ojYt8NruvMeL27ipYenhBw3kCca/hMmfOosQiwsxlZmqellR4acW1MmSBj4tm/xzXJEkeoKyjXotL0e1wyhN18SkWLOjKK8Jt6l4vQg==;5:PZ908xNnr7uVYTc6nj6XU//v9+/Hr8e2pAI7LwX/9QaSdBkiPtT2bFlO5zZ0yTEtKUkPvklTGJbumeKxB3o8G/MDxZqLJ65Jhgv4+S6i44ujuX/n05SbuId07mxnjach4DhPPsNmh4FVTCalGm4HCDUScP/Tu1uRVVmqxkHaQFU=;7:/JWOKkUw8yvyz5ko4LBiuPNs0mZnQok8sHrZkTHBAHaZGSwLyO2mcu6qWnWT1+PcRv1xhppiLQfQm8h9khykQ6e7CJ678AFAvSGsBEUAarGnULzr2JCOps2lyNlPvLRvA/t1n9AH65U57bQrBB0FG/DXAV5aAOJswB6kDQ2UmckL9/+gULpDmArQ0hrrJDO0+fEMuARcg3IDmt33wALvjHRt2vnYuNUqcLXGj2HcHdonQIC+WYVrKzMPoY7EIEce SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Aug 2018 17:53:53.1800 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f96ba5b8-4c9b-40ac-b48f-08d5f96a140c X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR0201MB3506 Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Rajan Vaja Add ZynqMP firmware query data API to query platform specific information(clocks, pins) from firmware. Signed-off-by: Rajan Vaja Signed-off-by: Jolly Shah --- drivers/firmware/xilinx/zynqmp.c | 14 ++++++++++++++ include/linux/firmware/xlnx-zynqmp.h | 20 ++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c index 24cfd9e..8ec5682 100644 --- a/drivers/firmware/xilinx/zynqmp.c +++ b/drivers/firmware/xilinx/zynqmp.c @@ -260,9 +260,23 @@ static int zynqmp_pm_ioctl(u32 node_id, u32 ioctl_id, u32 arg1, u32 arg2, arg1, arg2, out); } +/** + * zynqmp_pm_query_data() - Get query data from firmware + * @qdata: Variable to the zynqmp_pm_query_data structure + * @out: Returned output value + * + * Return: Returns status, either success or error+reason + */ +static int zynqmp_pm_query_data(struct zynqmp_pm_query_data qdata, u32 *out) +{ + return zynqmp_pm_invoke_fn(PM_QUERY_DATA, qdata.qid, qdata.arg1, + qdata.arg2, qdata.arg3, out); +} + static const struct zynqmp_eemi_ops eemi_ops = { .get_api_version = zynqmp_pm_get_api_version, .ioctl = zynqmp_pm_ioctl, + .query_data = zynqmp_pm_query_data, }; /** diff --git a/include/linux/firmware/xlnx-zynqmp.h b/include/linux/firmware/xlnx-zynqmp.h index 2eec6e7..55ed2ba 100644 --- a/include/linux/firmware/xlnx-zynqmp.h +++ b/include/linux/firmware/xlnx-zynqmp.h @@ -35,6 +35,7 @@ enum pm_api_id { PM_GET_API_VERSION = 1, PM_IOCTL = 34, + PM_QUERY_DATA, }; /* PMU-FW return status codes */ @@ -48,9 +49,28 @@ enum pm_ret_status { XST_PM_ABORT_SUSPEND, }; +enum pm_query_id { + PM_QID_INVALID, +}; + +/** + * struct zynqmp_pm_query_data - PM query data + * @qid: query ID + * @arg1: Argument 1 of query data + * @arg2: Argument 2 of query data + * @arg3: Argument 3 of query data + */ +struct zynqmp_pm_query_data { + u32 qid; + u32 arg1; + u32 arg2; + u32 arg3; +}; + struct zynqmp_eemi_ops { int (*get_api_version)(u32 *version); int (*ioctl)(u32 node_id, u32 ioctl_id, u32 arg1, u32 arg2, u32 *out); + int (*query_data)(struct zynqmp_pm_query_data qdata, u32 *out); }; #if IS_REACHABLE(CONFIG_ARCH_ZYNQMP) From patchwork Fri Aug 3 17:53:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jolly Shah X-Patchwork-Id: 10555383 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AC8371708 for ; Fri, 3 Aug 2018 17:54:31 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 972CD2C724 for ; Fri, 3 Aug 2018 17:54:31 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8AA7B2C921; Fri, 3 Aug 2018 17:54:31 +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=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C58A12C724 for ; Fri, 3 Aug 2018 17:54:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727829AbeHCTvg (ORCPT ); Fri, 3 Aug 2018 15:51:36 -0400 Received: from mail-eopbgr710041.outbound.protection.outlook.com ([40.107.71.41]:29872 "EHLO NAM05-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727850AbeHCTvg (ORCPT ); Fri, 3 Aug 2018 15:51:36 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=MCdLtrA1kN8/0je8FqQpiN8x3unLbKCW3xvP6auRcy0=; b=NbK5o18UsZ+yXgurW0cD8SnVUR3VyCCY0fcVnMfaJ0r5NR891G397FhoX7im+3MKhTpEgcyKxk6qwMETo435uEdN7yHwZuotVu5pxyIkx9MmvgAYyr3K3OTneiankyb63CggahlCCXuskq4Ra8SCvjzwzu4sqBzpCkDfbv9igX8= Received: from MWHPR0201CA0027.namprd02.prod.outlook.com (2603:10b6:301:74::40) by BL0PR02MB4450.namprd02.prod.outlook.com (2603:10b6:208:45::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1017.15; Fri, 3 Aug 2018 17:53:54 +0000 Received: from SN1NAM02FT031.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e44::209) by MWHPR0201CA0027.outlook.office365.com (2603:10b6:301:74::40) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1017.15 via Frontend Transport; Fri, 3 Aug 2018 17:53:54 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by SN1NAM02FT031.mail.protection.outlook.com (10.152.72.116) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.1038.3 via Frontend Transport; Fri, 3 Aug 2018 17:53:53 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGu-0004fm-S0; Fri, 03 Aug 2018 10:53:52 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1fleGp-0007cn-OV; Fri, 03 Aug 2018 10:53:47 -0700 Received: from [172.19.2.91] (helo=xsjjollys50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGl-0007bh-E5; Fri, 03 Aug 2018 10:53:43 -0700 From: Jolly Shah To: , , , , , , , , , , , , , CC: , , , , Jolly Shah Subject: [PATCH v11 05/11] firmware: xilinx: Add clock APIs Date: Fri, 3 Aug 2018 10:53:22 -0700 Message-ID: <1533318808-10781-6-git-send-email-jollys@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533318808-10781-1-git-send-email-jollys@xilinx.com> References: <1533318808-10781-1-git-send-email-jollys@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(376002)(346002)(396003)(136003)(39860400002)(2980300002)(438002)(189003)(199004)(106002)(2906002)(36756003)(6666003)(356003)(107886003)(39060400002)(7416002)(81156014)(305945005)(81166006)(8676002)(54906003)(2201001)(110136005)(50466002)(48376002)(16586007)(478600001)(316002)(36386004)(72206003)(106466001)(7696005)(4326008)(8936002)(51416003)(47776003)(9786002)(76176011)(50226002)(476003)(126002)(486006)(2616005)(44832011)(426003)(11346002)(446003)(5660300001)(77096007)(14444005)(63266004)(336012)(26005)(186003)(921003)(107986001)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:BL0PR02MB4450;H:xsj-pvapsmtpgw01;FPR:;SPF:Pass;LANG:en;PTR:unknown-60-83.xilinx.com;MX:1;A:1; X-Microsoft-Exchange-Diagnostics: 1;SN1NAM02FT031;1:3pze7uAvF87/xESxdQEo6sAKzLZVoTxZgoDo6QcLtiyMbVYsec9squw5C9h9aBOL9lTXH+5hdUDjYh08xRYa+fJRnVvxqjT+O4ZKSMHWt3R3u/fZ60qjG4nXYrK8Euut MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 49efa090-d193-41b4-7655-08d5f96a13f8 X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(7020095)(4652040)(8989117)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(4608076)(2017052603328)(7153060);SRVR:BL0PR02MB4450; X-Microsoft-Exchange-Diagnostics: 1;BL0PR02MB4450;3:3S06KZhJqmoOH7ZqOlk7Zoylmkbi/9DpWNSCXH8wEg2F1N1BH44dR5XD33C0gkmHCLjmz4cqPj4cQqtsou2Rnb3RuoSnWpM0KT+Or1L4SW0rQGQdFXN5GJY3SobytfFtYEVpG/+cQKKHM+j4PYW57MaPaRBg3ua52UVIMQiVEUIJwupIzdHsDkTD4e74CtuCIy1r9wgAnJLtgfPQ69QLabDSIslz85/WW0DFDc5ljbigmPQ6Ta4QDMvn+P90o0DLDI1/LH7i+aJFqKgMpv5ixO+m2MhRHaZDm/rWzzPc6xMVqXWPoVbyqfJ44ChfFjVriYBre9mTW9cvUq1EUrjjQQ+ZJeJ3iWTDJ0oKkt1XYPA=;25:aLItTIcA+ZAK8RWys9N3E8qLBWHlP1CDuFZjuTbYSqNgq+wbQQDBMoA3fn8r7Snviv+kWJo27uNsydeKyfgeg25Jk3FKyhG5Z9jCj0uE1fyilaBtwqb1qE0EI79/IdzRPk0z+Q4iZQmdbZhRqhgQtMivuvFHs51Hn8sgYTpX2oGrCydcfWtx5/CxAu0u10OYg2vR/fYgyDcnbkKh028xLaO4kCASv9daB0AMaTV8J1PKe4gtCNLropvjZ6rTgGfgCi+wbKHir/q0GdwmjvFZZI3Xogn9E+ScAgOJRI2sw2mLEd+hGhw39O6PYuMlQdr+IzDGgY5o/ohTDA6TN2KqKQ== X-MS-TrafficTypeDiagnostic: BL0PR02MB4450: X-Microsoft-Exchange-Diagnostics: 1;BL0PR02MB4450;31:2164MBgNDh0dWmrnNkKw5tf6CM/oMJs21GRYTaoHrrXQ1nhxoMChJg5Mf2qxJetZjFfajJB3XHG3gIoe8BlDprbtd1tw13IxhFRM6FrX/lajKu8hw9JOMU4ZkDn6TFEZcUAu8EgcgsoZCO55rVrJJQ15RZDSNvBo6eapgQTpYsQLcfOdVr6sxolDHEln4SWvaCmBjBnFlVhD2ZKt+XqRSB3iLd0jAjUstK64M0lvDzE=;20:SwjN/aOePbJfA5756uajhQDvZnfiDFPbmGeqZ0SVEnj9za4xydf3INAatDJNNj1NuXnxonYGdrq4AhqD381LYDj74oppYF5ZW0L250biqN+Jic/PabZRClUQUa4C8EJm1JHsJe7W1tYrQ3L1sNlLucgl8iUVDnSSy2WPxkTsx7glopWqwXecOC69MqmzfC7P2yjHForUNhxJs90s6Eu23RaV/mRwEQTnqnb9uwmNP05SHUey6WzNLrx+2kQCxD+LN/3ddIZe6Bza5fupbQxKuyv/niS4LM9Kq5gS8Pfe6pIR7+PWcdRF85V7SY8a0uyibCpgW2FiWNe7UFlVC9WwqaUtrWroKUzFoXO92e4fGCqY1qnV9RqIEuLTE6aAf7z5n6TVTboFOnIYN0VNuQBsXnKprWe9kx8cMGpBpxkAbSLe7HaPpW28K8Kz3jFTX8eqeIJx7AIvq/C6RfoFbq6Hnkk0UTcgjTfQi0+30oWcB09zZNrGvgcp7QCwBb6hM7ML X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(93006095)(93004095)(3002001)(10201501046)(3231311)(944501410)(52105095)(6055026)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123560045)(20161123562045)(20161123564045)(6072148)(201708071742011)(7699016);SRVR:BL0PR02MB4450;BCL:0;PCL:0;RULEID:;SRVR:BL0PR02MB4450; X-Microsoft-Exchange-Diagnostics: 1;BL0PR02MB4450;4:dkMMUYg5ZqnEWIN+XwDwXuI+oZ/E3k0Iwn+LM/LoqUxRO2GCxe1IkgUncQL18NmRXAHyfuj8sXgQ8lsfc1Vr2aJQ8W19snpY2jbKMkoh993dgp2VG/sHq5TfHz1jRqK3WYRN0j23ctyfxrkR5WMgHnqpm/8bRM66N8fkV3RnAHs6q2Eq2+YPHcck+MfpveQyQKRfPtWK3B/geqbP6TFMZz9O0vjkJyVNrlPPO/VFKXf/gVqy/TWk3oE69SjzumOUr6xHTmPTy7BqxpaHP1/I7sJx2tpp5F6Zg4J6Gqm5rXn8AYFmCy50PmXdDFRzZqxT X-Forefront-PRVS: 0753EA505A X-Microsoft-Exchange-Diagnostics: 1;BL0PR02MB4450;23:2+DZQ9fHlOO9bSg+svY+IuM34IAMZtp7s5d1AnV+xZVSdWx4VW9o5WSwTSjMPPpKmYyqOkkb0phwwdEI5t1ubx+to3fOt5YE+AvoNGU/NfYUADJwygpVCEFFD/G4iqM/Uqf9/XgTRM5f8Whce/gylcMBZCAx31BT0ms3xh9LOWCcTZG4n7AgxDA32GCpbDY2nwXo/s5B+8qbaRbT3qsjpODnJpXm7XmfU98w8CL3P72ILqqFzk7GjSSv4vyUSDVaQqclE0sw2K6XULX+tXJmhakWByAEiglY3UTXpHGcZNs9r/FyxnMwWn1iIAavQ8689hi2b7720nWOhSgMxO2wo05QZUfPwu3PglXNP+oZSH8FaQlskhZ3awKYZreezgWWM/viTHfFgDa6uGb+nvjblDDVnPn4wj8Om5FCpBfSweQhBjSqs1RhDBMBwRETbW89iywK+CU/AXz0Fj8v5x4gUYXTjX4jM7qmEz0fqQImBOnZduAf08Fiyfc0Xqr1uTubihkj7JyvI8ZZ0HDE50WPyADjLVQZcdkeioCFaHYWBtIo6E14XQK2hH05aDh17THxmMCh2WP5JYelEF2gm/EucCDUtFlBN/KafPNj7SsDJ92kG9i/a7Sav0EDKEJOoTU9sHhqcGBk/RkHWpvDCgv+H4nJeCDJ7BmndrBOcCWiCOI3fq39FoWJHh4S4NQq+LTe6bKt1vGfS3uWrkq/NGLkvihTnUan5pyhn1PgUhcHHZBxzADuu3O1WPeqs+LxhSURmsCKOv5Ks1slXj95t2sBo/bIgUweQK0GwQo0BdSbVZzV+4thXVzKg9llV5VeP6YyXi1UPfWUXYW8q6Zq0/Hv/TiXBNOMNyz/P8Irb4Y38VUXRJl7YCYZkBwCnlXIvhA5jjT/PALAyaSAqeT+TlR2IyMrk6XOK+sq2t5/Tkt8NHoD4JV8R7ZNKBlIniGj1yhTlwrwX45uTwMqV9EWN4tn+qFWrbQRVshBZbvgPAvLEeaDYUuLVdloWX/uq17zJDfsNgoPT/sW18UWIAncgtAtKbp88/bxU8MeddrBbW/yBZepfLGHS0z422GHQlG9SzPA6Qw2z7d4Fz3xV++RjTFHJXWOSwZg1Yr086Nf1iAvy+MuS+iXP4HzfKVZ/4CnPN1vGIjb4exvRY/6uz8tUP9tRwgPZpX6gQhU0Oo70kO2rpb45efL18ZMWS1IP61G8eUVqFaTryV5N1lNxIfXMcontnwWv6G+KwCHjijeTfvHCDNSjWNSRtkSmT4Q7LlRf3af X-Microsoft-Antispam-Message-Info: aYg+I06gFSiwN2lWsUN9Tb5gOrobyyjTkmeFjynPfg8lyavb9pgYRRFH2HNQuu1DPFZCaKwaywMFkbZjZJgIXl17Kixfl/gVPF7ilZ5Y2bSw4c4D0lAMWD+nTtfM8vKosYKQylHAPlMZSFKkic3BWmv3XDQ0nM5gFZlJiWhlJ0wLWJfPxkbNVU2grtP7gwYJc+6E7fUaCBrGpgGubi9ZYiuTatIfnZfL+Cc+e/LgXR7URVKa5Iz7+oQpDCIEurY6vxmhzJvcC61e2ZE0gJgEvL7aPi/3kr6fTS8q9Nrv74gMuDEpqpN1jQektfUF8xHeOgZfIGqfn3ZkIkZp9Id9lyFSiZWfCQPWsFicyJPuLO8= X-Microsoft-Exchange-Diagnostics: 1;BL0PR02MB4450;6:Ump5bVErqmM0Neg4KPLrIX8ypn71heefl/POhRSq/gPSyw/hfyXmgBeIvDIt0kgLQWiVhzplWQ3nBiQmwqoWQtQjS4RyefijHsS7Nb7ef56VcQ2mHGGfoOO57u1bv5diBxDoYbqJqPlv+vWhL3qZBn73bEi66+Z7SfEXgMBiG8V8ZIXwjFzxY02vpVZ1wEFyuUckSBNMLcd1tn+TcjrO7qEq5Ofr7fwCIp0VyvW9uEVk5xpBuIKxaZuqilRhACJTNT5rzpuZ1g+vFEDFZmk+Hz7PARO1VtzSUdKLunO0RFJ2CvdDpesm89N5Tvpd5aqvR5zkEeEGNaSi7hfyRUXO+fHvVF5BpMCY2DmICS7TicaUruDCbbjNDWrRn0zzW2tL05WHIqXKWcrM6nGnj4m19JN9kYqel68+TtkKPDX4aAH1VoWcHJgRWTl3GK6qwcFQV+B2YgSE4HmwMqROyNu91g==;5:ik7k1b0SC+lC1IqlVvUqUNVsdtURffSMW72ah6+D+vic9YGpycFTPI0IiVdbQ/X7ceqK/I57ZOjniZ4KAIYEwOL3a4V7Admq19G3zUj6OR6spakbtPuB+zqlZXtq0JpAsrZBQYY0U11KnYrlGUAfHF25RiCD2MaMlvGOBYdNhUA=;7:JBCZQ21PguVytYYJQvdyYWscwVWLl2rKhYniQA8blQmjyHuNxI1XkTsc/8JE/OXsecmB7dAZ40FkBshQdZkjzZaLoKEs94T/VDDouj7Cw1IoIq8ZUuw0HCmQtFt8TZbCy+F+r4u+iK6H1SQxdftLacGr1FfFEMcASq1EMv5RoxKMbd0mTmUbq7wmVF6MFkgzldfsAQ5F7GvWT328H7ljBuhfR6kaxenr6hHlkoYWDqP1xj5HtJfuY5nx9lJH4s6e SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Aug 2018 17:53:53.3442 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 49efa090-d193-41b4-7655-08d5f96a13f8 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL0PR02MB4450 Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Rajan Vaja Add clock APIs to control clocks through firmware interface. Signed-off-by: Rajan Vaja Signed-off-by: Jolly Shah --- drivers/firmware/xilinx/zynqmp.c | 186 ++++++++++++++++++++++++++++++++++- include/linux/firmware/xlnx-zynqmp.h | 30 ++++++ 2 files changed, 214 insertions(+), 2 deletions(-) diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c index 8ec5682..41ed800 100644 --- a/drivers/firmware/xilinx/zynqmp.c +++ b/drivers/firmware/xilinx/zynqmp.c @@ -269,14 +269,196 @@ static int zynqmp_pm_ioctl(u32 node_id, u32 ioctl_id, u32 arg1, u32 arg2, */ static int zynqmp_pm_query_data(struct zynqmp_pm_query_data qdata, u32 *out) { - return zynqmp_pm_invoke_fn(PM_QUERY_DATA, qdata.qid, qdata.arg1, - qdata.arg2, qdata.arg3, out); + int ret; + + ret = zynqmp_pm_invoke_fn(PM_QUERY_DATA, qdata.qid, qdata.arg1, + qdata.arg2, qdata.arg3, out); + + /* + * For clock name query, all bytes in SMC response are clock name + * characters and return code is always success. For invalid clocks, + * clock name bytes would be zeros. + */ + return qdata.qid == PM_QID_CLOCK_GET_NAME ? 0 : ret; +} + +/** + * zynqmp_pm_clock_enable() - Enable the clock for given id + * @clock_id: ID of the clock to be enabled + * + * This function is used by master to enable the clock + * including peripherals and PLL clocks. + * + * Return: Returns status, either success or error+reason + */ +static int zynqmp_pm_clock_enable(u32 clock_id) +{ + return zynqmp_pm_invoke_fn(PM_CLOCK_ENABLE, clock_id, 0, 0, 0, NULL); +} + +/** + * zynqmp_pm_clock_disable() - Disable the clock for given id + * @clock_id: ID of the clock to be disable + * + * This function is used by master to disable the clock + * including peripherals and PLL clocks. + * + * Return: Returns status, either success or error+reason + */ +static int zynqmp_pm_clock_disable(u32 clock_id) +{ + return zynqmp_pm_invoke_fn(PM_CLOCK_DISABLE, clock_id, 0, 0, 0, NULL); +} + +/** + * zynqmp_pm_clock_getstate() - Get the clock state for given id + * @clock_id: ID of the clock to be queried + * @state: 1/0 (Enabled/Disabled) + * + * This function is used by master to get the state of clock + * including peripherals and PLL clocks. + * + * Return: Returns status, either success or error+reason + */ +static int zynqmp_pm_clock_getstate(u32 clock_id, u32 *state) +{ + u32 ret_payload[PAYLOAD_ARG_CNT]; + int ret; + + ret = zynqmp_pm_invoke_fn(PM_CLOCK_GETSTATE, clock_id, 0, + 0, 0, ret_payload); + *state = ret_payload[1]; + + return ret; +} + +/** + * zynqmp_pm_clock_setdivider() - Set the clock divider for given id + * @clock_id: ID of the clock + * @divider: divider value + * + * This function is used by master to set divider for any clock + * to achieve desired rate. + * + * Return: Returns status, either success or error+reason + */ +static int zynqmp_pm_clock_setdivider(u32 clock_id, u32 divider) +{ + return zynqmp_pm_invoke_fn(PM_CLOCK_SETDIVIDER, clock_id, divider, + 0, 0, NULL); +} + +/** + * zynqmp_pm_clock_getdivider() - Get the clock divider for given id + * @clock_id: ID of the clock + * @divider: divider value + * + * This function is used by master to get divider values + * for any clock. + * + * Return: Returns status, either success or error+reason + */ +static int zynqmp_pm_clock_getdivider(u32 clock_id, u32 *divider) +{ + u32 ret_payload[PAYLOAD_ARG_CNT]; + int ret; + + ret = zynqmp_pm_invoke_fn(PM_CLOCK_GETDIVIDER, clock_id, 0, + 0, 0, ret_payload); + *divider = ret_payload[1]; + + return ret; +} + +/** + * zynqmp_pm_clock_setrate() - Set the clock rate for given id + * @clock_id: ID of the clock + * @rate: rate value in hz + * + * This function is used by master to set rate for any clock. + * + * Return: Returns status, either success or error+reason + */ +static int zynqmp_pm_clock_setrate(u32 clock_id, u64 rate) +{ + return zynqmp_pm_invoke_fn(PM_CLOCK_SETRATE, clock_id, + lower_32_bits(rate), + upper_32_bits(rate), + 0, NULL); +} + +/** + * zynqmp_pm_clock_getrate() - Get the clock rate for given id + * @clock_id: ID of the clock + * @rate: rate value in hz + * + * This function is used by master to get rate + * for any clock. + * + * Return: Returns status, either success or error+reason + */ +static int zynqmp_pm_clock_getrate(u32 clock_id, u64 *rate) +{ + u32 ret_payload[PAYLOAD_ARG_CNT]; + int ret; + + ret = zynqmp_pm_invoke_fn(PM_CLOCK_GETRATE, clock_id, 0, + 0, 0, ret_payload); + *rate = ((u64)ret_payload[2] << 32) | ret_payload[1]; + + return ret; +} + +/** + * zynqmp_pm_clock_setparent() - Set the clock parent for given id + * @clock_id: ID of the clock + * @parent_id: parent id + * + * This function is used by master to set parent for any clock. + * + * Return: Returns status, either success or error+reason + */ +static int zynqmp_pm_clock_setparent(u32 clock_id, u32 parent_id) +{ + return zynqmp_pm_invoke_fn(PM_CLOCK_SETPARENT, clock_id, + parent_id, 0, 0, NULL); +} + +/** + * zynqmp_pm_clock_getparent() - Get the clock parent for given id + * @clock_id: ID of the clock + * @parent_id: parent id + * + * This function is used by master to get parent index + * for any clock. + * + * Return: Returns status, either success or error+reason + */ +static int zynqmp_pm_clock_getparent(u32 clock_id, u32 *parent_id) +{ + u32 ret_payload[PAYLOAD_ARG_CNT]; + int ret; + + ret = zynqmp_pm_invoke_fn(PM_CLOCK_GETPARENT, clock_id, 0, + 0, 0, ret_payload); + *parent_id = ret_payload[1]; + + return ret; } static const struct zynqmp_eemi_ops eemi_ops = { .get_api_version = zynqmp_pm_get_api_version, .ioctl = zynqmp_pm_ioctl, .query_data = zynqmp_pm_query_data, + .clock_enable = zynqmp_pm_clock_enable, + .clock_disable = zynqmp_pm_clock_disable, + .clock_getstate = zynqmp_pm_clock_getstate, + .clock_setdivider = zynqmp_pm_clock_setdivider, + .clock_getdivider = zynqmp_pm_clock_getdivider, + .clock_setrate = zynqmp_pm_clock_setrate, + .clock_getrate = zynqmp_pm_clock_getrate, + .clock_setparent = zynqmp_pm_clock_setparent, + .clock_getparent = zynqmp_pm_clock_getparent, }; /** diff --git a/include/linux/firmware/xlnx-zynqmp.h b/include/linux/firmware/xlnx-zynqmp.h index 55ed2ba..58a7478 100644 --- a/include/linux/firmware/xlnx-zynqmp.h +++ b/include/linux/firmware/xlnx-zynqmp.h @@ -36,6 +36,15 @@ enum pm_api_id { PM_GET_API_VERSION = 1, PM_IOCTL = 34, PM_QUERY_DATA, + PM_CLOCK_ENABLE, + PM_CLOCK_DISABLE, + PM_CLOCK_GETSTATE, + PM_CLOCK_SETDIVIDER, + PM_CLOCK_GETDIVIDER, + PM_CLOCK_SETRATE, + PM_CLOCK_GETRATE, + PM_CLOCK_SETPARENT, + PM_CLOCK_GETPARENT, }; /* PMU-FW return status codes */ @@ -49,8 +58,20 @@ enum pm_ret_status { XST_PM_ABORT_SUSPEND, }; +enum pm_ioctl_id { + IOCTL_SET_PLL_FRAC_MODE = 8, + IOCTL_GET_PLL_FRAC_MODE, + IOCTL_SET_PLL_FRAC_DATA, + IOCTL_GET_PLL_FRAC_DATA, +}; + enum pm_query_id { PM_QID_INVALID, + PM_QID_CLOCK_GET_NAME, + PM_QID_CLOCK_GET_TOPOLOGY, + PM_QID_CLOCK_GET_FIXEDFACTOR_PARAMS, + PM_QID_CLOCK_GET_PARENTS, + PM_QID_CLOCK_GET_ATTRIBUTES, }; /** @@ -71,6 +92,15 @@ struct zynqmp_eemi_ops { int (*get_api_version)(u32 *version); int (*ioctl)(u32 node_id, u32 ioctl_id, u32 arg1, u32 arg2, u32 *out); int (*query_data)(struct zynqmp_pm_query_data qdata, u32 *out); + int (*clock_enable)(u32 clock_id); + int (*clock_disable)(u32 clock_id); + int (*clock_getstate)(u32 clock_id, u32 *state); + int (*clock_setdivider)(u32 clock_id, u32 divider); + int (*clock_getdivider)(u32 clock_id, u32 *divider); + int (*clock_setrate)(u32 clock_id, u64 rate); + int (*clock_getrate)(u32 clock_id, u64 *rate); + int (*clock_setparent)(u32 clock_id, u32 parent_id); + int (*clock_getparent)(u32 clock_id, u32 *parent_id); }; #if IS_REACHABLE(CONFIG_ARCH_ZYNQMP) From patchwork Fri Aug 3 17:53:23 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jolly Shah X-Patchwork-Id: 10555425 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B295C15E9 for ; Fri, 3 Aug 2018 18:09:17 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9ADB92C955 for ; Fri, 3 Aug 2018 18:09:17 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8B0E52C957; Fri, 3 Aug 2018 18:09:17 +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=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C0CDF2C955 for ; Fri, 3 Aug 2018 18:09:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727792AbeHCUGi (ORCPT ); Fri, 3 Aug 2018 16:06:38 -0400 Received: from mail-by2nam03on0062.outbound.protection.outlook.com ([104.47.42.62]:23648 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727356AbeHCUGi (ORCPT ); Fri, 3 Aug 2018 16:06:38 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=VE114//YUPYxbjun3uPhuQH8U38wde77z/JGyfmsCXc=; b=dq4snkg/uWEhhWRPXKPKRnkIcixnBBHL/oVun5zYPSScd7KwwifYQYPfhcb5F8QGbTRW3YANoVjYtFcZam+jmRITITCMN6nixJSuGD58PO++dabE+ZO5nUDkzlcP5imKo5LzoqYenyl5ZeG8e7gWVpgcKDlzEgbFZEwG7ygB330= Received: from CY4PR02CA0004.namprd02.prod.outlook.com (2603:10b6:903:18::14) by MWHPR0201MB3514.namprd02.prod.outlook.com (2603:10b6:301:77::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1017.14; Fri, 3 Aug 2018 17:53:54 +0000 Received: from CY1NAM02FT024.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e45::207) by CY4PR02CA0004.outlook.office365.com (2603:10b6:903:18::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1017.15 via Frontend Transport; Fri, 3 Aug 2018 17:53:54 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by CY1NAM02FT024.mail.protection.outlook.com (10.152.74.210) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.1038.3 via Frontend Transport; Fri, 3 Aug 2018 17:53:53 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGu-0004fl-Qj; Fri, 03 Aug 2018 10:53:52 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1fleGp-0007cn-N0; Fri, 03 Aug 2018 10:53:47 -0700 Received: from [172.19.2.91] (helo=xsjjollys50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGl-0007bh-Gc; Fri, 03 Aug 2018 10:53:43 -0700 From: Jolly Shah To: , , , , , , , , , , , , , CC: , , , , Jolly Shah Subject: [PATCH v11 06/11] firmware: xilinx: Add debugfs interface Date: Fri, 3 Aug 2018 10:53:23 -0700 Message-ID: <1533318808-10781-7-git-send-email-jollys@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533318808-10781-1-git-send-email-jollys@xilinx.com> References: <1533318808-10781-1-git-send-email-jollys@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(39860400002)(346002)(376002)(136003)(396003)(2980300002)(438002)(189003)(199004)(63266004)(72206003)(16586007)(14444005)(54906003)(110136005)(2201001)(36386004)(9786002)(478600001)(50226002)(4326008)(316002)(47776003)(7416002)(966005)(6666003)(39060400002)(107886003)(6306002)(106002)(2906002)(186003)(336012)(126002)(26005)(44832011)(106466001)(36756003)(51416003)(476003)(426003)(77096007)(76176011)(11346002)(7696005)(446003)(5660300001)(356003)(305945005)(2616005)(486006)(8676002)(48376002)(50466002)(8936002)(81156014)(81166006)(107986001)(921003)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR0201MB3514;H:xsj-pvapsmtpgw01;FPR:;SPF:Pass;LANG:en;PTR:unknown-60-83.xilinx.com;MX:1;A:1; X-Microsoft-Exchange-Diagnostics: 1;CY1NAM02FT024;1:XJtp6mPeAEQzxSzqta74Rf02P94NT3NgcfhV+Ycor8oeXTmBrcMBNt3vLIuJw9viC1xla7+ljFaT82kV3FRpZm4WO8igxlIHKxyr/dbBx6sz5SFqITX4iUW9MbwzBzJG MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 7f1cf7f5-c927-43d7-edf8-08d5f96a1431 X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(7020095)(4652040)(8989117)(5600074)(711020)(4608076)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(2017052603328)(7153060);SRVR:MWHPR0201MB3514; X-Microsoft-Exchange-Diagnostics: 1;MWHPR0201MB3514;3:gWfRNCiVxx6krfkpYUQ4cnxzfyusc7U4ga1svGYbU6p696pzaZ1w5Uaxj3FieLruw17UnPwa/jwT2IHNz5rOSXNXgNMLzHBRtSMqPlX3Vn/WpUFkKOnTFiB5yAXfTfZNcET2O82CxdOsavOjI4kcvnlzClMvpJGUqQBXnlr0slClJyEbKg23qM+IypZJn6vQFt0orFmMeHWMeYF8zkh1HS3EXFg59u8QbhZwkvL4vwwfVtYAu5jcRienQ27qFRLrS7r+Mfu3A2Wzm1ACekZcJnAtFFICN/+jbN5lLRF4yXhZx7qru7v5eF5mrywSRogXrufB9/xQ3eR/P4aETYWdYFD2dN6K/BgKljvEEUs+pPo=;25:IkAkf+HiFbH4CNWRXZix02t8Pyr+ZRXgeOp7c0hj/pz0PlYENWYb0yxcWCik7aaZXWepn79QIU9K+qj8gUpB49dPpWws3Jp8hT+G+1rNJJUJMyyjLaVpwwxhFBvEgKsnNBIeNxlZbU0/QHGXorPPAZNWRPVFNPmOqgJwSE8Ye0j92tuEy8XRJtVA8irQ3arCYaVS1KxBTHSbMNWjDBMENVVZt6bz+nqLPXJjW1Q2dAKkxb0J+OmzuMIN5gfw3GsxbW+pyNKgG8meZrL9/ViAGGKDAyPkSjosMcRM0iIEV0IXvg9EmieBxFTJC6rtdMn3FJ8TdRQ6Y5me6Z2pKZrO0Q== X-MS-TrafficTypeDiagnostic: MWHPR0201MB3514: X-Microsoft-Exchange-Diagnostics: 1;MWHPR0201MB3514;31:Ox2hgllmWiSeAw49wA7h47mGeYvw0MsA9g08QTq7pSS4iCNYwf+l66ELs2n3aYAQAfqNVCeP4AF768gpjgqJrdoDeSSbjKWcUClmLzKEzUZJ2hMZ62gr1GsVnXK5FKY7q2zMcAJ1vNKwQWH4n6COaaJ6kw/MhiXF1qCcmDB0XEh5P3XYy51lH9+N8JSz6xo+Q4xt78m5mu/9cKJKbidMMaeeJYFQQfPtQvJeub0u8Gs=;20:ejEtRfxhPUE4SJRt/Qz4uOHchvN2NgqzC9tzRCcjwfUUALDDL+s+oys/PfqCkt7/4DPWJSUv6JVB8N4k2jUV9ZJgK31zgLbQ8562iPQsd3ZfLlztXQcczhddk9kD8RhfY5zcyhY+IdlSWYadc9U/gOWhks+IKlewxR7ETyOkYQq955zCzGisVbBUsNBLpRilzDOq9tRRaS+iLzckxPbAgPd8QPT7kEt7nK/HFXVtXSr7dEaTYUkzPxnq0UNJjK0bzMUVwdfN91dtjYLwDxNEjiFsWaAHz7kuOshfa0vfmWcwPnkcivtW5K0l2r/b2mcL//ZJ40VFzM/sA0CdR993knaX9IGzA+b7NxJWa6m8g4TEvLBGbfhsX99KiHAg+LYts2UJlnNcwa0K4aIjpXB0Dhkooqh5/JSTWOMyaQe3jn5wdIKQOHxCCgqK4QA/CgTjkwxrFfiMEahPzFFTv9LlIA1VjcuTEkkYCrkXsW1ghsK4o6ASAg/sc7Phlr85KqvR X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592)(189271028609987); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(10201501046)(93006095)(93004095)(3002001)(3231311)(944501410)(52105095)(6055026)(149027)(150027)(6041310)(20161123562045)(20161123560045)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(6072148)(201708071742011)(7699016);SRVR:MWHPR0201MB3514;BCL:0;PCL:0;RULEID:;SRVR:MWHPR0201MB3514; X-Microsoft-Exchange-Diagnostics: 1;MWHPR0201MB3514;4:iv2luY/31yBDz008ORw8GHI2Vz7FdH6vSANVDPIycHRkJvz6usFK7+oXF5VhMfI7DyHY5nhm/IrAEr0+7I37TuUrjkdBFUHrYEMr6dS+RE55S2KlSCWmgQa5DKI5eZ71PX7M1fCx4FdQ46TL5Du0HbtPLyghKkdSUQJRh9n7q7FdLKNKZKQNICp6HBhWRiZCtXWiLexZ8KbngRyEBZCHQYj67yYW8G+Cv2NZ+vi4gU1x3b8kV5CLs23ntu1nyzMTrR0jZ3Lnf7Eut9UOE3ic66OyqMzaSHXAQCBbZgxBBMyC0urnxd6bTL9YjllkrcHoFIwe6RZWRQssuaN4V9Qn2A== X-Forefront-PRVS: 0753EA505A X-Microsoft-Exchange-Diagnostics: 1;MWHPR0201MB3514;23:UT97DfX0QbKmM0nXFp8S2qrIykkIbib9JknwhgmD93UQ7kEWyeUDp4Q0fjoD5xLKs0vCTqpuxKyoBvtBB5puXRHbEgMR5ShyphykZpJS+BA72QVEsddyB98r7sxEPS3xMJP7i6esgKNmrca8Q+odNj0qREFJtoTXunOSPZdlsrS7B5UoRVokNaKrnuRk7u/8kDZqFSA8TkvGXmUMCW+tFkpcvzjCzQlYmyugfmcwecmfHX1+MtKq66uNTm3xtPTx+KGeS85uLwMYLBn3Kb0f210HS0FscrvM+oJ4GerLTpjr48o5VULUxYYbqvr3zvLBEGVC2oPRh43fbWzL9zWRIr3DJyU5aQXb3fEQJTSsEOr7NTYCIaxBEn+eofxDmyDRQJMNwzKFNCEYU/amsIYB7Hx4DXFdbVO3TYJMLpqeD6BysQ23GwKHHjubAEkECeR+BUzYsMmIWHW7Putdjhb7UFuYdB/2rSJf3hhhQR7Ml15Gtkey3pWLMxJute93ovcFbAN1dYM3vrI4LIYZsOZkXMi7GtTxJWiBx0nOmmN+E0mkVts6GYm13aUZdn1cmxUcgBo4wR+WwyE0Wvnh5DUEqCw58Ed+QtBFvL6V64RE/M/iGEX7c02oxeaARnNh81e41fFh8dsAlXw7wibFDM8mHErBIFKCVr8oMyHobkadSld/dUkDHOoPVQOK3tIRuumEHhVFE+YmShXZD30AyKjfqfr4TLzLURe41SnOuewqu39dhYQvqfw5xibdGRRF/XsAtgCUrn3qyf98+1A83wjKhFqT1cHD5s6pzZ4MGPCojPumo1EvRr8eu2nIYNqDoP6+bzqVFPBaki2s+Yv6XC4VyVjSku+42FH6o2HlOz+lgX6bPCtOyXtAcU27O+79G0WHkm91AE+DCSTzb8v/ZvORCGwAjd90FUvS0tpScq2wSheMi7H+ITyIyGS/sLRgKAleJPxLytKqQP7N1oQLHNLoSq1A6TgAuRelehHvoBw6aLNgZxtybsy/ZRIXqQOaCgkEsx6ykoyS4Jc/gKO2qsxJlFIPQEz/lgEynKwjy8NU5KeDns7erET/yaA07S40qAbQFD6iNnQMAZ8R+wS3+pJ8YQb+kr+awJ6GuQmuojsFYLNW1zjF9amsyvgIvq0GNsN8N2sQboH1YZGZDb3fTmuT3JCZA0F6hcy+3W8/2+VSbiwvQjQXMVDMfsEhdPgj1A98SDCCD/8z/levNWxGkRFxEyMgG7gdx319nyfiqZGqsO2fJD4p/5s8hRNAqt5HB7Q3/r0NJib/wY+pfGxLXSRVkA== X-Microsoft-Antispam-Message-Info: NfW6uI57pDT5sdpv/+tcWrWD20sp/nypPYcBYRbbEwGIiQZ51MorUF9VWU/IEu7fmDzo4yEdmlEJB1DkMmBcZjIk5wsbkObXuTgVPqqSXpmQMbdH07WHhMfzlHFlDoEWxs4NCGHdQszNJn3tkd5mO+8D/t6f/hVFvve/S7FzwviscX6ErKXxwKufJXRyR06Vuh8wsb6DT7xOWK0M/jUZkPMoLcq/JfVUajjXYuq3JKE5KX1VK5gSKkQo0bp1zDUafztQB4bYoQPxKwdnJahB171w+AyzW4Cty8AGLGOjB/Wl1ePRcYGzs8kZFl5k4iFcilVwUvF1gBom7silLqzs6VZ6wTXV/SUYqkBZ/0Fjtnw= X-Microsoft-Exchange-Diagnostics: 1;MWHPR0201MB3514;6:zgEz8LeKTh/l1XUu/5+jVJqOcQWWgI92BXjoMc7n74Xq9BSvewzVz/Ju4hwe7s7qs+LSyTSs2l0ss6e4/ukw9nfW0QWXS4ixV0sTrIOb3rLF/8/GC6A5my1hzi0Ql1Shlz98IW0iDmRIajp9GGXp4S+LTadHlBn87THRDUVfcFjLaP2BIx5+ilkmc+J1BWvPeB4+/TiW5NxO7m+9h0lebOfPEsuI1aRkpMiCimn9LFFmhAqkKaus4NqqIaxaKHyxH9DT48PX9ftSlEBu83kwORXMmc86vNav5W7agH5wcf4JWB7rhs6Ilb/QHJREGr1prfgZCbbIGymGgFqaYW7MxPEAcrvy7HNIR7p6p8OrJStPwa6gdJLmfewJ58uhECi6LHpe96UoFXe6xV0g1LminYtd1v0E8IWVg8C11U3+2aT2s/Lob3FutXllOavrUtwtmTVGUqTLNmk/IewxMAvefw==;5:kqpBuNN0jMQLX4JukacwSnruLLAHNyUPNzuibKBoJVDUV7lTHOgGcJQmdcbhnikuPg/3ojrLboGx4nZaUtN3Gy7/gHhSgEcDbWAuqBOnT9dzG/Ue/KGJgxMlKTrjVbeyD9+kzXk/O8KvKoiawPq0oFRDBzT3SY11PTuOpVj95tY=;7:3q5YG446HT0tyNhVkZLO4Ct0aMHkqUkQnwqbqlm1VJqI7Hy71127B4vYrFU5f7rJRqjCSO5xqAeq1dpYx8lLx4esJuqYqeUanY02mDAim5uPnwIAqfrzj7BcEwNcHrwQLVszFIVgdyhcNRdOTlltM5sYJlFJZFKcNs4ZKcK/y5J56JzIE8rXJ9cwnnB+q3oREMEh/kGqDE3fyJ0tK+mXn0W9AVhjxDvzRMaWzMlk29IzMHzSjinQV5OpfpRCxnJl SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Aug 2018 17:53:53.3302 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 7f1cf7f5-c927-43d7-edf8-08d5f96a1431 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR0201MB3514 Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Rajan Vaja Firmware-debug provides debugfs interface to all APIs. Debugfs can be used to call firmware APIs with required parameters. Usage: * Calling firmware API through debugfs: # echo " .. " > /sys/.../zynqmp-firmware/pm * Read output of last called firmware API: # cat /sys/.../zynqmp-firmware/pm Refer ug1200 for more information on these APIs: * https://www.xilinx.com/support/documentation/user_guides/ug1200-eemi-api.pdf Add basic debugfs file to get API version. Signed-off-by: Rajan Vaja Signed-off-by: Jolly Shah --- drivers/firmware/xilinx/Kconfig | 7 ++ drivers/firmware/xilinx/Makefile | 1 + drivers/firmware/xilinx/zynqmp-debug.c | 212 +++++++++++++++++++++++++++++++++ drivers/firmware/xilinx/zynqmp-debug.h | 22 ++++ drivers/firmware/xilinx/zynqmp.c | 9 ++ 5 files changed, 251 insertions(+) create mode 100644 drivers/firmware/xilinx/zynqmp-debug.c create mode 100644 drivers/firmware/xilinx/zynqmp-debug.h diff --git a/drivers/firmware/xilinx/Kconfig b/drivers/firmware/xilinx/Kconfig index 64d976e..8f44b9c 100644 --- a/drivers/firmware/xilinx/Kconfig +++ b/drivers/firmware/xilinx/Kconfig @@ -13,4 +13,11 @@ config ZYNQMP_FIRMWARE Say yes to enable ZynqMP firmware interface driver. If in doubt, say N. +config ZYNQMP_FIRMWARE_DEBUG + bool "Enable Xilinx Zynq MPSoC firmware debug APIs" + depends on ZYNQMP_FIRMWARE && DEBUG_FS + help + Say yes to enable ZynqMP firmware interface debug APIs. + If in doubt, say N. + endmenu diff --git a/drivers/firmware/xilinx/Makefile b/drivers/firmware/xilinx/Makefile index 29f7bf2..875a537 100644 --- a/drivers/firmware/xilinx/Makefile +++ b/drivers/firmware/xilinx/Makefile @@ -2,3 +2,4 @@ # Makefile for Xilinx firmwares obj-$(CONFIG_ZYNQMP_FIRMWARE) += zynqmp.o +obj-$(CONFIG_ZYNQMP_FIRMWARE_DEBUG) += zynqmp-debug.o diff --git a/drivers/firmware/xilinx/zynqmp-debug.c b/drivers/firmware/xilinx/zynqmp-debug.c new file mode 100644 index 0000000..fcbdd6e --- /dev/null +++ b/drivers/firmware/xilinx/zynqmp-debug.c @@ -0,0 +1,212 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Xilinx Zynq MPSoC Firmware layer for debugfs APIs + * + * Copyright (C) 2014-2018 Xilinx, Inc. + * + * Michal Simek + * Davorin Mista + * Jolly Shah + * Rajan Vaja + */ + +#include +#include +#include +#include +#include + +#include +#include "zynqmp-debug.h" + +#define PM_API_NAME_LEN 50 + +struct pm_api_info { + u32 api_id; + char api_name[PM_API_NAME_LEN]; + char api_name_len; +}; + +static char debugfs_buf[PAGE_SIZE]; + +#define PM_API(id) {id, #id, strlen(#id)} +static struct pm_api_info pm_api_list[] = { + PM_API(PM_GET_API_VERSION), +}; + +/** + * zynqmp_pm_argument_value() - Extract argument value from a PM-API request + * @arg: Entered PM-API argument in string format + * + * Return: Argument value in unsigned integer format on success + * 0 otherwise + */ +static u64 zynqmp_pm_argument_value(char *arg) +{ + u64 value; + + if (!arg) + return 0; + + if (!kstrtou64(arg, 0, &value)) + return value; + + return 0; +} + +/** + * get_pm_api_id() - Extract API-ID from a PM-API request + * @pm_api_req: Entered PM-API argument in string format + * @pm_id: API-ID + * + * Return: 0 on success else error code + */ +static int get_pm_api_id(char *pm_api_req, u32 *pm_id) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(pm_api_list) ; i++) { + if (!strncasecmp(pm_api_req, pm_api_list[i].api_name, + pm_api_list[i].api_name_len)) { + *pm_id = pm_api_list[i].api_id; + break; + } + } + + /* If no name was entered look for PM-API ID instead */ + if (i == ARRAY_SIZE(pm_api_list) && kstrtouint(pm_api_req, 10, pm_id)) + return -EINVAL; + + return 0; +} + +static int process_api_request(u32 pm_id, u64 *pm_api_arg, u32 *pm_api_ret) +{ + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + u32 pm_api_version; + int ret; + + if (!eemi_ops) + return -ENXIO; + + switch (pm_id) { + case PM_GET_API_VERSION: + ret = eemi_ops->get_api_version(&pm_api_version); + sprintf(debugfs_buf, "PM-API Version = %d.%d\n", + pm_api_version >> 16, pm_api_version & 0xffff); + break; + default: + sprintf(debugfs_buf, "Unsupported PM-API request\n"); + ret = -EINVAL; + } + + return ret; +} + +/** + * zynqmp_pm_debugfs_api_write() - debugfs write function + * @file: User file + * @ptr: User entered PM-API string + * @len: Length of the userspace buffer + * @off: Offset within the file + * + * Used for triggering pm api functions by writing + * echo > /sys/kernel/debug/zynqmp_pm/power or + * echo > /sys/kernel/debug/zynqmp_pm/power + * + * Return: Number of bytes copied if PM-API request succeeds, + * the corresponding error code otherwise + */ +static ssize_t zynqmp_pm_debugfs_api_write(struct file *file, + const char __user *ptr, size_t len, + loff_t *off) +{ + char *kern_buff, *tmp_buff; + char *pm_api_req; + u32 pm_id = 0; + u64 pm_api_arg[4] = {0, 0, 0, 0}; + /* Return values from PM APIs calls */ + u32 pm_api_ret[4] = {0, 0, 0, 0}; + + int ret; + int i = 0; + + strcpy(debugfs_buf, ""); + + if (*off != 0 || len == 0) + return -EINVAL; + + kern_buff = kzalloc(len, GFP_KERNEL); + if (!kern_buff) + return -ENOMEM; + + tmp_buff = kern_buff; + + ret = strncpy_from_user(kern_buff, ptr, len); + if (ret < 0) { + ret = -EFAULT; + goto err; + } + + /* Read the API name from a user request */ + pm_api_req = strsep(&kern_buff, " "); + + ret = get_pm_api_id(pm_api_req, &pm_id); + if (ret < 0) + goto err; + + /* Read node_id and arguments from the PM-API request */ + pm_api_req = strsep(&kern_buff, " "); + while ((i < ARRAY_SIZE(pm_api_arg)) && pm_api_req) { + pm_api_arg[i++] = zynqmp_pm_argument_value(pm_api_req); + pm_api_req = strsep(&kern_buff, " "); + } + + ret = process_api_request(pm_id, pm_api_arg, pm_api_ret); + +err: + kfree(tmp_buff); + if (ret) + return ret; + + return len; +} + +/** + * zynqmp_pm_debugfs_api_read() - debugfs read function + * @file: User file + * @ptr: Requested pm_api_version string + * @len: Length of the userspace buffer + * @off: Offset within the file + * + * Return: Length of the version string on success + * else error code + */ +static ssize_t zynqmp_pm_debugfs_api_read(struct file *file, char __user *ptr, + size_t len, loff_t *off) +{ + return simple_read_from_buffer(ptr, len, off, debugfs_buf, + strlen(debugfs_buf)); +} + +/* Setup debugfs fops */ +static const struct file_operations fops_zynqmp_pm_dbgfs = { + .owner = THIS_MODULE, + .write = zynqmp_pm_debugfs_api_write, + .read = zynqmp_pm_debugfs_api_read, +}; + +/** + * zynqmp_pm_api_debugfs_init - Initialize debugfs interface + * + * Return: None + */ +void zynqmp_pm_api_debugfs_init(void) +{ + struct dentry *root_dir; + + /* Initialize debugfs interface */ + root_dir = debugfs_create_dir("zynqmp-firmware", NULL); + debugfs_create_file("pm", 0660, root_dir, NULL, + &fops_zynqmp_pm_dbgfs); +} diff --git a/drivers/firmware/xilinx/zynqmp-debug.h b/drivers/firmware/xilinx/zynqmp-debug.h new file mode 100644 index 0000000..3303b37 --- /dev/null +++ b/drivers/firmware/xilinx/zynqmp-debug.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Xilinx Zynq MPSoC Firmware layer + * + * Copyright (C) 2014-2018 Xilinx + * + * Michal Simek + * Davorin Mista + * Jolly Shah + * Rajan Vaja + */ + +#ifndef __FIRMWARE_ZYNQMP_DEBUG_H__ +#define __FIRMWARE_ZYNQMP_DEBUG_H__ + +#if IS_REACHABLE(CONFIG_ZYNQMP_FIRMWARE_DEBUG) +void zynqmp_pm_api_debugfs_init(void); +#else +static inline void zynqmp_pm_api_debugfs_init(void) { } +#endif + +#endif /* __FIRMWARE_ZYNQMP_DEBUG_H__ */ diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c index 41ed800..7ccedf0 100644 --- a/drivers/firmware/xilinx/zynqmp.c +++ b/drivers/firmware/xilinx/zynqmp.c @@ -21,6 +21,7 @@ #include #include +#include "zynqmp-debug.h" /** * zynqmp_pm_ret_code() - Convert PMU-FW error codes to Linux error codes @@ -551,3 +552,11 @@ static int __init zynqmp_plat_init(void) return ret; } early_initcall(zynqmp_plat_init); + +static int zynqmp_firmware_init(void) +{ + zynqmp_pm_api_debugfs_init(); + + return 0; +} +device_initcall(zynqmp_firmware_init); From patchwork Fri Aug 3 17:53:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jolly Shah X-Patchwork-Id: 10555393 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6B4601708 for ; Fri, 3 Aug 2018 17:54:56 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5924E2C724 for ; Fri, 3 Aug 2018 17:54:56 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4DA062C92A; Fri, 3 Aug 2018 17:54:56 +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=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CBAFB2C724 for ; Fri, 3 Aug 2018 17:54:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729595AbeHCTvT (ORCPT ); Fri, 3 Aug 2018 15:51:19 -0400 Received: from mail-co1nam03on0087.outbound.protection.outlook.com ([104.47.40.87]:15968 "EHLO NAM03-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727377AbeHCTvT (ORCPT ); Fri, 3 Aug 2018 15:51:19 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=KfW+TeHXf25KA6qOupiMQV9tPEEtp8syyNbbmMvNliw=; b=t0MYowi7lPBK6x2+g6Mdq8oGFmSACBNuqqmQAzWbQU9URrT8WULaxtOB+C0uR1P5oa6yxSmofIYryB3wJlV8Ee0exwgNMHgfY6X6u0KY00QfXNknDo7x1rkg3z3+DUgkHe68Ih2eDlMeE2Fodhjjho1kREWii951WIOjELL1zdg= Received: from SN6PR02CA0013.namprd02.prod.outlook.com (2603:10b6:805:a2::26) by DM6PR02MB4332.namprd02.prod.outlook.com (2603:10b6:5:2a::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1017.14; Fri, 3 Aug 2018 17:53:53 +0000 Received: from SN1NAM02FT020.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e44::201) by SN6PR02CA0013.outlook.office365.com (2603:10b6:805:a2::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1017.15 via Frontend Transport; Fri, 3 Aug 2018 17:53:53 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.100) smtp.mailfrom=xilinx.com; linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.100 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.100; helo=xsj-pvapsmtpgw02; Received: from xsj-pvapsmtpgw02 (149.199.60.100) by SN1NAM02FT020.mail.protection.outlook.com (10.152.72.139) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.1038.3 via Frontend Transport; Fri, 3 Aug 2018 17:53:52 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66]:50942 helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw02 with esmtp (Exim 4.63) (envelope-from ) id 1fleGu-0003jx-3y; Fri, 03 Aug 2018 10:53:52 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1fleGp-0007cn-0U; Fri, 03 Aug 2018 10:53:47 -0700 Received: from [172.19.2.91] (helo=xsjjollys50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGl-0007bh-JC; Fri, 03 Aug 2018 10:53:43 -0700 From: Jolly Shah To: , , , , , , , , , , , , , CC: , , , , Jolly Shah Subject: [PATCH v11 07/11] firmware: xilinx: Add debugfs for IOCTL API Date: Fri, 3 Aug 2018 10:53:24 -0700 Message-ID: <1533318808-10781-8-git-send-email-jollys@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533318808-10781-1-git-send-email-jollys@xilinx.com> References: <1533318808-10781-1-git-send-email-jollys@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.100;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(39860400002)(136003)(346002)(376002)(396003)(2980300002)(438002)(189003)(199004)(126002)(36756003)(2616005)(476003)(110136005)(48376002)(106002)(426003)(51416003)(7696005)(336012)(44832011)(54906003)(478600001)(186003)(446003)(11346002)(16586007)(26005)(36386004)(50466002)(76176011)(77096007)(39060400002)(486006)(4326008)(107886003)(8676002)(5660300001)(81166006)(72206003)(316002)(81156014)(305945005)(50226002)(356003)(47776003)(2906002)(9786002)(14444005)(2201001)(8936002)(106466001)(63266004)(6666003)(7416002)(107986001)(921003)(5001870100001)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:DM6PR02MB4332;H:xsj-pvapsmtpgw02;FPR:;SPF:Pass;LANG:en;PTR:xapps1.xilinx.com,unknown-60-100.xilinx.com;MX:1;A:1; X-Microsoft-Exchange-Diagnostics: 1;SN1NAM02FT020;1:zasqvSYhsWAhFR8BsQqznPhHZWutS5L27pZRAjx7WftXVjIUELTIoOJpSsSUD+f4Oswo5TGe0mt80EAOljtkOPkYcNn1HyH7b8CbpIqpyOSsOFvajgMgeslMpJUI8FCC MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d82c6346-76fc-439b-9dcf-08d5f96a1370 X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(7020095)(4652040)(8989117)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(4608076)(2017052603328)(7153060);SRVR:DM6PR02MB4332; X-Microsoft-Exchange-Diagnostics: 1;DM6PR02MB4332;3:rqNZDnzIT5q+FET8pFU3tZhPuEQSRuq3R66uNM3S/YQeizIkJUv1TzWFY/cnr16gynASpVkaHVu+NgEqmV99BWHuleFqGU/UausrCgPe5E5iSh6WWpHLt1u/DNN5il1GhmQdvq7PxWaFV/bQBkE4GlFBsxzfBd4N3FbTarL3iPWhYa9vbozJ0M/Nnml87GSgMAapIihLkI2bXcc3ZpBpNl8A9xUekGpdRbs+LqCkiHvyompxXT7o8r8n/FBCgp2mw70SpIe65sNlJFhRnpOdk4Lq+jgv2dAqVTM4/2U5vttyQ6+r2OOUmbtiyk0wYB+kVa6VBJnGimyXT0lhAQ9K5tR5Bi/6J/Kg5JwOaVPCGKk=;25:bB6qzDqu9+vrR++q12i4He5KMFbdkOATwFddZzgEEFaemA3sUuUP/09hiJ5tRK5TVTkFPvdrQA8BMeA/lfr7zfLMSQZxJFcMA/bQ3iHDkOanuBsL+0T+Bjl4msOkUyZgwUND/zZyvOqds/cBKHyASeWm+5bHLnQYAB41FIQR9xdzV0WHJn3kI/rmqpH6gHXCQ/ItMAJF2sjSoIKk7lD44cYZ+DN4EMs8+yvpVx5HJoy4uGe7SeilyHewvq0GYKJvdQAW2wA/NV/g7iqjkoao8nOXmyzngN/IpOyeQ4tOU5994VjHiI8GX/GJekbZhRa4qQqDW2/36ztKwOSMb47qeQ== X-MS-TrafficTypeDiagnostic: DM6PR02MB4332: X-Microsoft-Exchange-Diagnostics: 1;DM6PR02MB4332;31:qIs/qh8ANOYqDxK++Xh+tDxbNjl7bMZ/TxTYtgX8za/VfJ2Cufud4gdaHkzWzDj4vwEqjT4AxbNNxBGFMVryjkwPnjS7pPLnxv8DQPnwpMSaP3n1GeWzrbe1HlOtzVY91LHyKBaiLOkkHD145GrLYEJ1TuygVgK1mpYYbwPlJhPPBRW5kwWagNoR9qBuRwdUvoYyBDm2Y4QrYiWbY/siOAq4VsOKBeSDDpgCqN9zk20=;20:lD7XRVhyJr//IUUVdzyMpO05/HTB8vi75mkal0CDU77BsCQUX6q1zxJrrL1ia5oy58X5YW8ZSkr1TvSCIKuIdsvjh1Czgkwcd8S3TC+gfeNM8LAURdI4kvsKPdjMhNENp/fgHtZSf0GLg8jC9Z72RjSB4Oi9XiZs3kEABq61d2D1RWxrGxVGDoH/6K9jVNELXZ07EDb3K/mwu3PFJe+SYIgxAi+eVkiMqnkGOyW4tzFlYJM4laYuBIe7hIog00zDrofIBJV+bCTzxgpmOK08FoRoeIcwoNJF1n3D7wmnkeQWYf3/amxjspYW9badjBxnG4UpevdTjCJmbAcAlov2AHODAWwdrCx/Rsiaakn5vRe5eQIs6lrQHFbvG3yadfFv2ZguoGXKjknbiElxMscOIXgPzdEUanEUf4qcLsqvvaAYslAYERDIhsUzxQzsTbpPlWFpqKr4/RYZlhGwWelPGEBI0cMpuQCOG/39//ShWspUfdWuIMBuKU/WoRHVR8Wp X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(3231311)(944501410)(52105095)(10201501046)(3002001)(93006095)(93004095)(6055026)(149027)(150027)(6041310)(20161123564045)(20161123562045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(6072148)(201708071742011)(7699016);SRVR:DM6PR02MB4332;BCL:0;PCL:0;RULEID:;SRVR:DM6PR02MB4332; X-Microsoft-Exchange-Diagnostics: 1;DM6PR02MB4332;4:r1bivONgYPOKb/p6qXDOPJBHzyosgdDYXJiNAopmRrSrT+J9jeJgDUCPVVVO3fO1iRcru7EsKw20JNH/de4DnwjPcaERa5BBQ5s+21hoQX1WUdtOAwRBXYVpHtIxcAl+q1Wqdy1wXQnOKyTFmYAfRvARB+ARy9E/xxPv0Ag6YBh86vBVKaLeTgzsrY326j9wAZO+5zfCmLZ/X29Jr6YrDQCIHE87NWE3DIePvOuWpfX+3ViMI9ij10zO17PA/d5Az3XsyJpJQCTByP1CwJYIjgJWu+oBxzOyQRa/Ukk4vtXWZ6CTxQG38q/Ih825CaKx X-Forefront-PRVS: 0753EA505A X-Microsoft-Exchange-Diagnostics: 1;DM6PR02MB4332;23:yjJEuHL1Zlm2Y6bhlYxp/+bQoRoza31Xn8Id0UIf+xZsru2y24PXjkYY9CFICMmincmPADnRcL4CBEQShGlwX3yCgMn6NHhjoJFabw5umqJ/+t4A360PUPD4WN1wi0cBe/V+rF4HT4jdfdqA/+cDFPqmQiuWiDeZbB0d6Mh8fmqAxB3cITyC9KSTTHHe5A/upmPSISNPpLA40ORXQhO2l6CZf813YOirXjIk9FxF0jfhmKQa9fI88iYgbpJQ7cMkQHGDwlNi0RQ5xQFjPc5QXSeUYKuUnpO3oF94rnTPJ7zT52IRbiXNWX0LRu0Q7Ykzth7tVt4gKRdTNN7bjUjepUw0fHFX55O/3fYmOOGnlyAZmhEbve2Lb1MV/p0FSw5hbBNM60a9OLNKviClEH/iFOHCGD+ciOxYrLlmTrx3oJPZEOaeDtgKwzHBrredkK/0tCQEu0yhTIe+Lb8WkJWgathN+CGAy5tWxxv6GbUADwUdN5AWUowbMKqihFwEnIWjRD4M1kqMVdsmqSqlHhVxIRpdS6q05pDifsSRel3Yvb+Bm3eU9m/M6mOastWBb0OU8Lk8rNdCVWZdy/QARCw6MyeQ/GM1bxXWdv9tMPXKa2EoR6jZpAysbXAe83Y5sjWUNzVgs78kYl2SmvAbCDr48ZhA1v/bsUprAt+NUt8VLRRyGFSRNv249eo56gHRTHpEere1YLI07gMYikh9LY78CAI+Sa84+HCAsrWiWG/XdpSvobIPWvBAyXlPPR9xby1SsKTs9BoYHmjfKWFdrEOzqL16r4lXnVAQObrPZCAP++85QmzybVXyxPpwx82Br6cAnqDjuZY6V8sNA/Uf3Rj1VwYrDDm3xypL0LbtG3Uv0KQvudB4reQLMzdGes3LA4GFusfTYW4SKalgceN1gIaguJGtEyiV5FhBzMd39eMZJAPXhyGLO7d9HgJQOPo3z4mbnPstgZ/iskMQn+67t3b9nwFgN2UD8GfK4wh8FWLZX8zQpiWXYBfqmGl2aM3QA2PMNWGHkcH4AE+kYGqZYKhjm1c+h2G+z4s9B1bZ7LHgMZMdOdySH2zSj0g1yLuQDCrXbe7/C1ImlxA/6PqKNVWH6rrd7a4WonupwEyRSAbfBAUaOqx3AdQpXmU+DRc/SLMWCROE+FU+cUfSYedtB42F2mPvqnkPUKngtU4+UCz9n1/JBzsSZURyxuB2Qi6Zy+Os2WXtgrZAd3jTMqUe9hM1b5Xo0AWD4UOefosuplFdXPWwqogC3VME2Y6ryIpcXn+up70NrmSq/+I+8BFRbYglXw== X-Microsoft-Antispam-Message-Info: /fuy1xjv0KizJcWOwWWZKio21Tm0OWKUGQGYM/8rp0e4X0CVVy6xxnGAExzuV5Ox/u6T7W2CH8b1B5DZEvckCAv1Z1Po/ilmVBuPE1MfJRSlPf7zSMXffjjCj3/71x6yNrHYNSiy2z7KkZRtpdxAmQm4BiJVkkQWNBFOqM00ckNQT2aGdFK1C7Z4lyPANgMxt3xoPbN57diSw7VpggC0Nj5GqhEK+FpdoIDbC4u6nbCs19dpH+IK4frIxymx6vNFhK0oKmAy9Kd05gpzY2UzpZiYn5+nuE/EKZKAr+uIp2bSfYM3n9+/ZZL7sWzqpn+uC/1sjitMN8gTzQ9ipYgwFAPHxIlZfuKGiCwd37mxbjs= X-Microsoft-Exchange-Diagnostics: 1;DM6PR02MB4332;6:ldRuO3opcFvbG4gguWdYEfcII4ioht9Jq4+Bt0NfCSGBikgqa22rwhueSkRb6jXQjM2SkHd18v5uFuTCqJE+AgYpiRwGDYRcT9W6B4skznIt/SKyUWC0joGdRWZHilqr6QnyrbRyqMjAR+LEXs/ZMfocn0LnJ2OQeL6mCxiLiwCnoeYyj4S1Jr+lF1WiAaToSpbG8FfOmNnVBhSVPmGaWqXlUIdLKJqmrnkvS/U8buuvywlpypaRhLrosJaLNRSau70JdDksbRONCzPHcNws3APTtbe7/LpoLnq/LdwAnbhPdZt6kYCt9v5jnWKfKUzvvHIUUv45A8HcqdNlKaPSacNVDUtmma+Cr2jfxjyA71E7Ncs7zb4SvnN5P6SGUdEPqKoXVkm6+7YWVgp9fwKBhuHn478RGmVnqCdxv/TIP6HyYN3lp9HENL4Padlf1Umd7LOVbCub0BiCZUhsK1fKgQ==;5:1sqAvkAhnYfJ5v1apPS8BF1oQ4YpqHoYEnpQfpTlHlBgs2/ktnmZAhcQpjGzONI7xcz6Qq7HhjOTbC+aGnGBRZdM+yjI9trZoZmlqRLZmcMfVNwm1TCfvQi2oQkPXtxPdleJ+QBL5pCxPHxZwcyanLNCKtyoRLrxujHM/d6zYFY=;7:f9RyK35JKVZOsu7cmScJStlBTe6BxR+0PzA1lrDxkMco4LpPC29tj17zbwET/LyzsMFpBb2dZJI+aSWg2fR31gB/Oblo9ltnzHHGRUqDU1A4gIptr13dRvPRVJNsg+gi7Uz2F7UJX/LnadCerbKbTaPwOQi7HXaLmHKhCRkWu6VOVf5ty6cNOyGEAdbcTwIDW/xC4M8pdjTVeXICN0fo3YoY3E6jwAdBAqq4hMGQRPoIs1FWoPoC0Kdxm3xdgshw SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Aug 2018 17:53:52.5165 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d82c6346-76fc-439b-9dcf-08d5f96a1370 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.100];Helo=[xsj-pvapsmtpgw02] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR02MB4332 Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Rajan Vaja Add debugfs file to set/get IOCTL using debugfs interface. Signed-off-by: Rajan Vaja Signed-off-by: Jolly Shah --- drivers/firmware/xilinx/zynqmp-debug.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/firmware/xilinx/zynqmp-debug.c b/drivers/firmware/xilinx/zynqmp-debug.c index fcbdd6e..fc11db9 100644 --- a/drivers/firmware/xilinx/zynqmp-debug.c +++ b/drivers/firmware/xilinx/zynqmp-debug.c @@ -32,6 +32,7 @@ static char debugfs_buf[PAGE_SIZE]; #define PM_API(id) {id, #id, strlen(#id)} static struct pm_api_info pm_api_list[] = { PM_API(PM_GET_API_VERSION), + PM_API(PM_IOCTL), }; /** @@ -95,6 +96,15 @@ static int process_api_request(u32 pm_id, u64 *pm_api_arg, u32 *pm_api_ret) sprintf(debugfs_buf, "PM-API Version = %d.%d\n", pm_api_version >> 16, pm_api_version & 0xffff); break; + case PM_IOCTL: + ret = eemi_ops->ioctl(pm_api_arg[0], pm_api_arg[1], + pm_api_arg[2], pm_api_arg[3], + &pm_api_ret[0]); + if (!ret && (pm_api_arg[1] == IOCTL_GET_PLL_FRAC_MODE || + pm_api_arg[1] == IOCTL_GET_PLL_FRAC_DATA)) + sprintf(debugfs_buf, "IOCTL return value: %u\n", + pm_api_ret[1]); + break; default: sprintf(debugfs_buf, "Unsupported PM-API request\n"); ret = -EINVAL; From patchwork Fri Aug 3 17:53:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jolly Shah X-Patchwork-Id: 10555397 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C62F015E9 for ; Fri, 3 Aug 2018 17:55:02 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B10942C91B for ; Fri, 3 Aug 2018 17:55:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A37282C724; Fri, 3 Aug 2018 17:55:02 +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=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2E7F42C724 for ; Fri, 3 Aug 2018 17:55:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728171AbeHCTvS (ORCPT ); Fri, 3 Aug 2018 15:51:18 -0400 Received: from mail-by2nam03on0058.outbound.protection.outlook.com ([104.47.42.58]:26592 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727473AbeHCTvS (ORCPT ); Fri, 3 Aug 2018 15:51:18 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=i0IgDLNWNv5gP6EXKCmjmOTwm0Q6U6uAi73B0G9dCkE=; b=1Zk3qfFsCgO9YbPuv0Y7o2FnuFRcjRqSj091uZbQr++yUbCmzPLaHAbty86zC4wKMTvFzPNzcC3HE85q0dL4w+S9zkVxXYBE0DclgEr500SnHCGR6gW4JopxbDEdNzX/INXyQY0GTC31M9CNwnYbK9/Y8VB62szPYcFX04i9fa8= Received: from MWHPR0201CA0052.namprd02.prod.outlook.com (2603:10b6:301:73::29) by SN6PR02MB4464.namprd02.prod.outlook.com (2603:10b6:805:a8::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1017.15; Fri, 3 Aug 2018 17:53:53 +0000 Received: from CY1NAM02FT029.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e45::205) by MWHPR0201CA0052.outlook.office365.com (2603:10b6:301:73::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1017.15 via Frontend Transport; Fri, 3 Aug 2018 17:53:53 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by CY1NAM02FT029.mail.protection.outlook.com (10.152.75.143) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.1038.3 via Frontend Transport; Fri, 3 Aug 2018 17:53:52 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGu-0004ff-2J; Fri, 03 Aug 2018 10:53:52 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1fleGo-0007cn-VI; Fri, 03 Aug 2018 10:53:47 -0700 Received: from [172.19.2.91] (helo=xsjjollys50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGl-0007bh-LV; Fri, 03 Aug 2018 10:53:43 -0700 From: Jolly Shah To: , , , , , , , , , , , , , CC: , , , , Jolly Shah Subject: [PATCH v11 08/11] firmware: xilinx: Add debugfs for query data API Date: Fri, 3 Aug 2018 10:53:25 -0700 Message-ID: <1533318808-10781-9-git-send-email-jollys@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533318808-10781-1-git-send-email-jollys@xilinx.com> References: <1533318808-10781-1-git-send-email-jollys@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(136003)(376002)(396003)(39860400002)(346002)(2980300002)(438002)(199004)(189003)(7416002)(106466001)(76176011)(63266004)(26005)(8936002)(186003)(36386004)(77096007)(356003)(44832011)(51416003)(14444005)(478600001)(7696005)(16586007)(8676002)(81166006)(81156014)(486006)(476003)(2616005)(305945005)(5660300001)(126002)(11346002)(72206003)(50226002)(39060400002)(48376002)(54906003)(107886003)(2906002)(106002)(6666003)(110136005)(9786002)(36756003)(50466002)(4326008)(2201001)(47776003)(446003)(336012)(316002)(426003)(107986001)(921003)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:SN6PR02MB4464;H:xsj-pvapsmtpgw01;FPR:;SPF:Pass;LANG:en;PTR:unknown-60-83.xilinx.com;A:1;MX:1; X-Microsoft-Exchange-Diagnostics: 1;CY1NAM02FT029;1:tlu558b3azl42+Zy2SjA5Z5SRTd2KPhEWI4kdsDAyBNVxcnxnPyBJ7aOgp7x8ZwBf9bO6jbSFGArDfnY3SRnZkcPOafmo38dlhoG8+CnhSQZY6c4lXkuv2adDiH0tvNk MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 3e9504cb-b74e-4886-28c0-08d5f96a13a8 X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(7020095)(4652040)(8989117)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(4608076)(2017052603328)(7153060);SRVR:SN6PR02MB4464; X-Microsoft-Exchange-Diagnostics: 1;SN6PR02MB4464;3:BVFZRR1SnMLKxNT+SdXRZlaNK6KP+fVbNjKRIBXuWDkRtU56EVpd00nuBcZEK3poMB3Dbh2qkMtsHCidJltSDyV69yvycQ8bgX20CimC0H2HrVIMYVwEa+DX2V1l3esZQDsVdvWJIPq/Wzfh6ZU3MHc7ePoIqetIXj0W80UI/6Zx9hYbOHb0NLlvZXNlZrwx16uwfYNHVNj2BkTuoGAisSSVwdX+FoXwZHKr1iiMx+VnUyUCk/UVnGzJNPfhcABCbLS+dgfiLwYLRR6oayE9JYGpieYAR1KJQCVDChsssQeEfC9Nx73SBiO8334OBkv5nfhZbUzFq4fxmgSFUZBAjp97Wllysx8rUaEjzVdBkQo=;25:P0Y4vUXVx8XBYqewFPdmE2fGmpBW3r0rzq6MXmR/XFUc0BSaqpl6YetHEqwzjZaqOKQta5Jk+wUuqANs3RH/70ThP/UOCJAoCjUSLtvyY4F9+Kk8PFe/cPfoSv7uf8Esqcu4Jl7MqZH4jrxdNacwmFKkuL72xXm7IfNo/HEb2YIFM+sjhoHZJTaioxPF23V6hhHFIMQr8gxuuQi9boVhutaCzWhbL/ptFvCpDvPeELj+hny0SNM5q+5tN5Fz2d9mGiWyRZp6VRcDDPHtzijJjKp2QA7phLJ9kSeLr9PNpl/59D/sXS6FtZmAgkPgTHM4UZ6soDr39u5j1vbmyEaTqA== X-MS-TrafficTypeDiagnostic: SN6PR02MB4464: X-Microsoft-Exchange-Diagnostics: 1;SN6PR02MB4464;31:oT00T/YmZ5EY+GRI+oHKEkzdju4DMXAZgJYQuu+6BI+YmscaVJEwOqimJAwiOnDHwrFuLqALQfsFrs2Q6Uu6XJADRYaHuVik7CMeRIz8b5dbdu00qw7PzsBZ+6JlW+hIABLnCz00Uxy1wH4FAT8SIMyVUagxsr3i29sn5l4xHBMsw5+zCXYSe3cUlsRD7IktGuPwOsan5w255pzI8dgQDb/+M6vMWBYD/ZGyuW5pBYU=;20:PRGLfqeUebhpU3eShXApfNuiBWdOqRB6/txgt9g32mr0iRP03COrXk6dAMiAB6nBgnbs2nT9kwa0WW7ofSNTMCDbyZ0picljMVwzetEMEZxsVojSbGvIGqYlgFFhkVLd7dIeloruXKX+9J+6AT+P3Ifkp6HPNT/YWBIpOq8+n/tVMyfgq1tINCOPrOC2KBu3vRQwXVe7iKMtVrO3DZJ74ZXWU8XoHUlabu20hoYT4xxgtnbl0loMMZZPbhWLVCP35kccsZgVO+MEjVNWzQVyVAHaDny+nK3/+nNQ8KrfCR+c+RHmjQ7hCIlPlD31uxKtlurE/pMPO8FjxIplw7mabHGY/XSdGFogwKJIbyFFqa5OPH0cnna9mYlgw1+nSlM0e5clG3alzoyX3zsBQbD2Xp2T22RkPcFuvUzgBpYxVASD4qrlbJ9ldCM8zEEk/PMI41nSGG7AhySBbpxygvbjnGR/0pmoUWgMiPh9WFJbRTjPvhYYPormij2mUBfRaUWv X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3002001)(10201501046)(3231311)(944501410)(52105095)(93006095)(93004095)(6055026)(149027)(150027)(6041310)(20161123558120)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(6072148)(201708071742011)(7699016);SRVR:SN6PR02MB4464;BCL:0;PCL:0;RULEID:;SRVR:SN6PR02MB4464; X-Microsoft-Exchange-Diagnostics: 1;SN6PR02MB4464;4:Y+H7YhLr3I920ykuDHLeRh1sAoQGMP49ejmWMIGmJkMYHuGB7pFgIpnKVOZNUDN3FNaBZJEw6gnx83xbe/jLNoz63q1s8fnxrltLTAcdqL6tkVt8xcFfcr6xXWEdS/bcROPvsiS+znCrcLF7zxYpvuPmjmRZaDic0fHxtlFIY8j6Kfg9Lkh/j0ARRXtadVYl/JGQM5d0andJ0EswQbcDMsPnAMWHfOchs2l4rTyRpT4a6T+6O8VZFIYUH+uMCv+mYacjocE/TDC8drF+zipK3NoQh5LwLdN5UPGmsINrkYiI4ocAVSasxOk1G7JQJa8+ X-Forefront-PRVS: 0753EA505A X-Microsoft-Exchange-Diagnostics: 1;SN6PR02MB4464;23:TEa1K9fyfzSmHdgGYe5+/dP0WaHySlm3R1xxhNBnKhYmMG6sHFCwZfkYsZhXoDcXoVdjpN6ElmC66pQneuuG6gbcumL0JmwLAYtptBig1/i1o3lGvFYPn/DBqnmJRMJOKDQX5q5A7OpKYqCp7IK2YYEJdvDecMkGnCDBuazdk5ok6+0fxL6ctgsnJAcQce60g0bmjW48KQ6EZCdoQyzrH19xvLk5gFKP1T9COaKNzR3Xp/OjlU0+QOv6mPVQM7m1u8ROBW1MnzNOu//qlWcozrxLqL6Bz99vVPnBE/Kk4FKOuIYrgY0TqvfIafVU46P33H1Xt8Pcyh2B2Xs7ugKqvURnwM+Rgf0s4dhZLtMfUVNobhgjw6uJs4SsqRwPhhReu5PZe9k4nWGG0djYUxaCP6XYVfwxQEW7pdbVN8RlpjdXZkQOy424R4ltRR6bJPfyjmENxrvVnxBGAJIMRE6YstNN4MGLM+b+vzU2kMA/7Il0eVx8xthIEOoQ8b0EslX4YCS5Cnm1hS20hYsp7HvIURuGYaKh0FttS9k6TJvOPD4O7FTieIqZ9aj60Laj1ef+DOEVw/HVM2FWGu94Rv32oOrTUmg+iYAKqQAt/EdojASv1TkvHje3Jd8rKqOaothscagOULy5dMXzB3i/jFB2WqjebPLNQ+D1+8tvwFmR+YwApOT1huiY09z/V61qMqDTIACDuU8+JtP8fE5IzSORfQmBV3EE6nbMBO7BFXXwUQNyXehJmF1fyZE9Z1dWQT6Q3HYQpPJPiBWS1xrg7gZtlDU3nFAYhin9FpyVUSpvt4KMfX3D6I4KcoszasCYZPSF9FLkOx4us09IddvOZ891o1PKCFN7i1uIuBC7APNzVXy2qSURU1iF0pXq+8sRsdpCkhzALKBjKkoPsAF5fYnJAk0T1zGpsd0GGIhu/amxIW5uOc9RSu03dgTWfhVUP6xNfwvGF/7kBcSdXQQS6MtoQBhVcz1Q+3pfAZ7d5PKEg10HzbvFyg25iXGiF7LSVeX6dVs6Y1XaqrQuMS7YkCzBgoTKY8eI0l3RdrQg64pwVJ6scWO0wAuvhtJoNt7V4Sq97Eyy2o6CK4yhvHNpQZJQr/YSfpyxqHaNHc9LAUXsOzudSqSh+UX1HbpaRlBBRwJq5+ScJ5KT9u7ueb1DojHEuXvw2NsM7cbaEqgIKB8jfaRRfi74eub2VU6wL5VAlCMjkE/P9mFYPBF+pyf+AYOq6tbUcARz4lmKyVhfPG5oVzwQOS9BVA3oX++E5JTvc3n8 X-Microsoft-Antispam-Message-Info: KXk/29E9sX9yxslx12jfDV6jikvemRLeu/m+hBhzD2v3WwfpJnlt3GPQNvucaMvTjmsSH92SKNZMlqIGYXdUEwX297XG6M2gj+9/g+HJ4EYOTA8yAI0fHt5DXU4FUi3LR+xoknIQQF7yGc7+AgJeL9PZD3ziaQwqdFAZEXxzJRhZewEew+t/DIottC7z2pW1iYLIT/9/SseUEbELTFiXxV1l0e+AP+KmfyagpkqRgqlbiV8Cwfi1PxPR843FAA6mKArrHY6XGyrnNYP0Mfo1u2Z7IHpKOKP1OqS+Hm0cbffAi7SPFAzenqG6pWje5ptNteJ0lp/1FuIQzQ69DPp2SNsjng9Oj99jk4FuBm1pLMg= X-Microsoft-Exchange-Diagnostics: 1;SN6PR02MB4464;6:jr4BP39GdyR5VuTYYTnZ4ALTzKjKhmpvhkgFbMsKaQvP5KlwXCKPJFBZKJbcidPGFAP4a2jNRb8JDiO1wGfFrmcWjCvnnu4kGuWnluBi6TyXQOss2csvkRreRKv/gOMOb4Wxel6lHcjyijRBGQ/RhS/uuV1cksWBceN9ifiJQRY22/XraGMlATSm1VGHR7NOO/RZhNAZQHWlwgq+wizE60ziZZI1YuxKiKpa7qv576BTRxx+tCsMcQnn1+WxmcnYfgvTipBftReMmhAnpMHz3FaloLA3fI+o+/bgzyvW9rnSQzrCeM99cYA8GTes1HbyqnSH2bnkJSXijG6K/HP0DuQ8UzinsELqjSejOlOoD835GQRjkK1EcmQVLOujqrl0ow7KYlvWWVSQOaTitdau4Oqto3yLJ05F+g1VP8/H0Jtlx2A+jQpd5JEU2rjfKU6rvdbGvCpTRUCzSWJcueixrA==;5:KiobZSTBxMVTESutT8xKPaST7EgV2scp21bCY95nBVr83Adgzd4E7nZ3fjwJjiyosTS8upAeoJZ4CuSXQd7eFW7goqeX+KfmfseDK9+kSaSo/NL4+d8Qzk4bZQocd3AfGz3xRW3hzMiyOvqRRM9VXVN67TgbyfjjRXP6pes3bPo=;7:MWGonpeKE8otT9w5v0SNaGvFqMlnVLcOMI6LnHkKufHiGnil/iMCzipE6MQhommKvUBQXmMsTlYyytjls3wq6KR8tOKD+REfr/reITqSokG72WZKoKjDrQZe00mrCliTARkkZ4ju+VoTQOoWm0Wm3/gOJXGg1mBprjgXhA6fBhBCFNTgfuyFOo3ufOayoIctbhPRpy2wxEmFcqO67vefMbvYLW4dklrvfihwH4/40x3ll2wYwCj+dl0164xo8BRQ SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Aug 2018 17:53:52.5358 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3e9504cb-b74e-4886-28c0-08d5f96a13a8 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN6PR02MB4464 Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Rajan Vaja Add debugfs file to query platform specific data from firmware using debugfs interface. Signed-off-by: Rajan Vaja Signed-off-by: Jolly Shah --- drivers/firmware/xilinx/zynqmp-debug.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/drivers/firmware/xilinx/zynqmp-debug.c b/drivers/firmware/xilinx/zynqmp-debug.c index fc11db9..4532bd0 100644 --- a/drivers/firmware/xilinx/zynqmp-debug.c +++ b/drivers/firmware/xilinx/zynqmp-debug.c @@ -33,6 +33,7 @@ static char debugfs_buf[PAGE_SIZE]; static struct pm_api_info pm_api_list[] = { PM_API(PM_GET_API_VERSION), PM_API(PM_IOCTL), + PM_API(PM_QUERY_DATA), }; /** @@ -105,6 +106,32 @@ static int process_api_request(u32 pm_id, u64 *pm_api_arg, u32 *pm_api_ret) sprintf(debugfs_buf, "IOCTL return value: %u\n", pm_api_ret[1]); break; + case PM_QUERY_DATA: + { + struct zynqmp_pm_query_data qdata = {0}; + + qdata.qid = pm_api_arg[0]; + qdata.arg1 = pm_api_arg[1]; + qdata.arg2 = pm_api_arg[2]; + qdata.arg3 = pm_api_arg[3]; + + ret = eemi_ops->query_data(qdata, pm_api_ret); + if (ret) + break; + + if (qdata.qid == PM_QID_CLOCK_GET_NAME) + sprintf(debugfs_buf, "Clock name = %s\n", + (char *)pm_api_ret); + else if (qdata.qid == PM_QID_CLOCK_GET_FIXEDFACTOR_PARAMS) + sprintf(debugfs_buf, "Multiplier = %d, Divider = %d\n", + pm_api_ret[1], pm_api_ret[2]); + else + sprintf(debugfs_buf, + "data[0] = 0x%08x\ndata[1] = 0x%08x\n data[2] = 0x%08x\ndata[3] = 0x%08x\n", + pm_api_ret[0], pm_api_ret[1], + pm_api_ret[2], pm_api_ret[3]); + break; + } default: sprintf(debugfs_buf, "Unsupported PM-API request\n"); ret = -EINVAL; From patchwork Fri Aug 3 17:53:26 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jolly Shah X-Patchwork-Id: 10555391 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BE80615E9 for ; Fri, 3 Aug 2018 17:54:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AA7422C724 for ; Fri, 3 Aug 2018 17:54:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9E7852C92A; Fri, 3 Aug 2018 17:54:53 +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=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E265D2C724 for ; Fri, 3 Aug 2018 17:54:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731202AbeHCTwE (ORCPT ); Fri, 3 Aug 2018 15:52:04 -0400 Received: from mail-cys01nam02on0056.outbound.protection.outlook.com ([104.47.37.56]:20213 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727843AbeHCTvU (ORCPT ); Fri, 3 Aug 2018 15:51:20 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ae3uMsPM9qWtcPtZCcchHnnmLXzK+8XsulKYSv1xPnQ=; b=FI/EJwAjOiiTYfjgyU0qYCCdSqEqG5UboVtajbpJixXJo8HsUhCNSxSCP0ZXzojQTuZhJh1Mz3kEC9cRfsXv9CEVGXqS+K0R7dK0YDRijdee8CgdJH04tfjODtgceSDZMit6xrALZN/+baeW2l0rRShQyTUKV/rkzUYY4v2bWaE= Received: from BN6PR02CA0088.namprd02.prod.outlook.com (2603:10b6:405:60::29) by DM6PR02MB4458.namprd02.prod.outlook.com (2603:10b6:5:29::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1017.14; Fri, 3 Aug 2018 17:53:54 +0000 Received: from CY1NAM02FT051.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e45::202) by BN6PR02CA0088.outlook.office365.com (2603:10b6:405:60::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1017.14 via Frontend Transport; Fri, 3 Aug 2018 17:53:54 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by CY1NAM02FT051.mail.protection.outlook.com (10.152.74.148) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.1038.3 via Frontend Transport; Fri, 3 Aug 2018 17:53:52 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGu-0004fi-DG; Fri, 03 Aug 2018 10:53:52 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1fleGp-0007cn-9X; Fri, 03 Aug 2018 10:53:47 -0700 Received: from [172.19.2.91] (helo=xsjjollys50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGl-0007bh-No; Fri, 03 Aug 2018 10:53:43 -0700 From: Jolly Shah To: , , , , , , , , , , , , , CC: , , , , Jolly Shah Subject: [PATCH v11 09/11] dt-bindings: clock: Add bindings for ZynqMP clock driver Date: Fri, 3 Aug 2018 10:53:26 -0700 Message-ID: <1533318808-10781-10-git-send-email-jollys@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533318808-10781-1-git-send-email-jollys@xilinx.com> References: <1533318808-10781-1-git-send-email-jollys@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(39860400002)(376002)(136003)(396003)(346002)(2980300002)(438002)(199004)(189003)(110136005)(16586007)(6666003)(81166006)(50226002)(106002)(72206003)(9786002)(36386004)(316002)(8676002)(54906003)(8936002)(305945005)(478600001)(81156014)(7416002)(2906002)(14444005)(356003)(5660300001)(11346002)(51416003)(107886003)(36756003)(77096007)(26005)(426003)(446003)(76176011)(44832011)(4326008)(2616005)(476003)(106466001)(126002)(486006)(7696005)(336012)(186003)(47776003)(50466002)(39060400002)(2201001)(48376002)(63266004)(921003)(107986001)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:DM6PR02MB4458;H:xsj-pvapsmtpgw01;FPR:;SPF:Pass;LANG:en;PTR:unknown-60-83.xilinx.com;A:1;MX:1; X-Microsoft-Exchange-Diagnostics: 1;CY1NAM02FT051;1:r2aaelOlGinHop5AwkglWkdQGiko7SdFguC1UTEs1ZMLw6EOu3O3TR/38D7r8d0yBGJlzhzQnxPuCf70DmEp4uoomt3QCEihRgMc83ykJDqA4j5H+3LV6MEFFZdwi7L/ MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d3e901e9-096d-4104-a2f9-08d5f96a13ef X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(7020095)(4652040)(8989117)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(4608076)(2017052603328)(7153060);SRVR:DM6PR02MB4458; X-Microsoft-Exchange-Diagnostics: 1;DM6PR02MB4458;3:PFwFIbFWgQNHpmBa7jNoZ0zs/Zf4zzFVT9ICaAHrSvZKtI2gWPdnExfaHWU/QtCrQTMNcR7l9kIk+DQVkCyZWNCdiGrPqDmUeVYB0mf2bSvDJtzU6rL6bgtSdE4oEYDf+Hn196zI5uZ0/DWq+on2XqgunWBX4F1bBSFVs1T0Di6r5AKZJxi/AxTgJppOi+/yncQ55Kx3TKDVUzesb0uFt6M5rR04lVto2hSRYZGzorgxqjxqjzYPNg6fZrcWJS9Cxi6e3pGvspF88Mn+aQpVDOPRtHT5VEDwYMygoVM4X5aDy7IVogJbw0GQIQyoDK37mIoNNHOEDClzi/Gh6NgH15sKOTi3FMlWZqIVSsDVdBc=;25:zig4Iv1wWNgO2YBS4QYVsKRamvs9x4tZ5gIPyWPmQ/8DZzpJKRsflVYoSONxM3Qec37xwOM4i52C6fKohfKxi6Xd8772vrYMluXBCm5ZAWRt5GTbNeVVBWsnXIs2QWiXkuEv9qg32XjqmquunP5dfW7yV8Y6Dv4hbbS3WWEkKpBg3ZKqOqz+o5eJ9dWofxxoJXDlDb6kssBLRxZygZ5QCa2+WLWSpAmW2GoM9585XTnf3Qk2E4B1QJlvnSlC1X1vDOco0YjijDAL6Jv1stLkLCREKgZLzYkAuiFw6qH5GkpaDlyRYz/vkZMuqRmCO3P0B79rF6uasVOhQRfi2H95Fg== X-MS-TrafficTypeDiagnostic: DM6PR02MB4458: X-Microsoft-Exchange-Diagnostics: 1;DM6PR02MB4458;31:aPIZIyCms8f+olId4AeZE8pRsFfsvgO5+/q5Wb0zV5SwBML1C7GKWIII87SsIdcv6nuTCK7A7Q/DmJjcj0BtSi3mozaKpbgrgCSMpEoZD4hzdoPFpZEJFjL/bD9lKepLe5ZwDsL4gNaot4zEfL1W6fHEjhoguTroXj+UA7I4lq89BVYLn5t7UtgbY7xHtH1czP1njT2AzS2+/d57rY3LBH7WoSVfjId+FAfSum6sSkA=;20:vRhrabWK/L3tvahM4UVZr3mtapwp+Zd29VQxw+VOXeGI2baTrv61j6nmARvijN1yJFv082sRJQtmIL9lhOQ7tOyKEMpxpX39Dk5UEIosAy4HXxaJoThc5a3p5xdyZLGj7gDMclOgHQFvRV9fmnSTjyZc2C+52sIyvXJj4h26kDNblSfXOoSIL/iaPlGggnnnpYpxlQlBv5awLE3ovK1n+Jp56LChSCnR9AbeKa5O1CzXOvXJmE/gMs80Hz6R3L7xEI+IV7jPKw5ObVDPkMOqvZzT3Vv41YnOVBn80xFy6D8FJ6nx4PRwhGSeHOMxZZU7KmSdAOxQkWCdxoJjPb2SszPXpQ4SwILqLz0X8oV8MTIMThqYbMSHxMamZ2DSyhUi3RTlPFRq1qVqUacj79V1MI0PGTL2HvbdgdX30qPbobtk4lL1GiNn6/pdOMBxDRw3fXIFeuds1+LkEtQiqjT7YXOY2I5hXgzFYfSY+QWvVQl1TpNOU/JRXqDwepwR5l4E X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(3231311)(944501410)(52105095)(10201501046)(93006095)(93004095)(3002001)(6055026)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123564045)(20161123560045)(20161123558120)(6072148)(201708071742011)(7699016);SRVR:DM6PR02MB4458;BCL:0;PCL:0;RULEID:;SRVR:DM6PR02MB4458; X-Microsoft-Exchange-Diagnostics: 1;DM6PR02MB4458;4:/mexK16c4/CPTktwuWtd7fSd04+/Md4/7N6DHUYdIxBprYYDQA30zlVjXjBilUnmIhOid1hVE0s00qJs6DHpNEr/u46rR302iB9yv0s7Q3AVV7QYOcBSmylWgfP17HMkLjvEH6+/Suj9R8KjSdpHp/ARtXUxEdIoLLRizSs141ulsPTsH2tv1wVD/MZepGaiRzzMf1uG4ii9I/lKFsbhw+VVXRFIjZzvB64kYiV4CouZqASeDzq9+1JANgXfrwfphr1HKDPlje1fQ2wHHsBXMT7yIG31GoU9VBYRQ6yRGY71NniMQCzsaS1/JZn+ybst X-Forefront-PRVS: 0753EA505A X-Microsoft-Exchange-Diagnostics: 1;DM6PR02MB4458;23:xwee+5SQDhefFzvX3mraisWTaB2oMx55mZqnSzcxYkGSa5qXC635bSJJoPBmXpDiBA6sB6L0NJToWD7bsSamKMZNyain4qKA8FuK5Cp9FqlGu22CyEVOd4nnU2ICtC9JbloO0Rl/HF+y942lRN9Vz+K5kRNwf6FlnYThY/weyeBjI/kY8wszOVmu2OX/K2YWpdImrZBESoEgNiIiFGvSdq293DQzOlwnRqvnNY/XAkYDgdRndYZhA30Jp5vJXXwLb9Br0ZHvfq8Gn38nEkoBHVbYgntjeL76Vfgk5chYFwJOGXT5EI304e96796FiJK48nNpv5IziH3VbGRhrOy0THwf2Tui6+6IVVmpJ8TljYnFgj8nq2S85Mp9+K9+gbl6RHYz12DV0BIGD5ZwaYl3GUyPw8sD+6EVszHQIanTnBL5mp/2elwfuEg56c8M+Y54IJNBV+Jqm169pJNvLfr74/2TDWUvu32orqtOUrDbzbRo4pp5mLTmpvZEuz5gYmmOXYK/ekg9lT+K9uNH3lYCN3SyPkv/sta4n/YqZrOMd53L9P7P3hZl2SdpDZDs6ZcJRjWPJ9tzHLLmlplv8L/fkVpj2ZV5sADg9JP8DQf8YNppqbW0nkstrPq+JpcltuHit/Gu4XMfqk7DVTcpph3hfpIMwqxJOxtg4e35o0kRaRHhMzs/jOIJrtzirij4S+5aXAqI0A38vfvuuJPmgqD221rsAU90NxGr2tkM1HxfQWm0h3yeJYG1Xs/xxDo9QvFqwNcvueIbeYnoMHlGryHChjRuFktWCgzw83EYBBcfrKv2K7hQpnRmlQIkdr/aqxDlxDsc1dpc7g9e3HQ3NpQezQVIv1Pk6cVbAZA1PNEVax+mLj+KseG7rDexBTIwQ1k9tZhwKIVmPFv6Endo91b9m5nGWNCbwLWT7Fm6119kSoRr0GHdxkzn6EuZYUvcYkl555O7R2mZmPteQNg8Tx6ZA1c+r7705HWXw6Bh2Srgj+PmzeXGAOo2z4mKykGItFF+Xuz+PxehE10HkTJ4qsULyuTBcpJHoy3WJ/z+5NryAporWaSsJ3SxNk4Zu4Oi7BiB/9L9CeMa7X4NEeGhkcXULYlZNihwEaTpIKJY7GATwD+RpDzifLOI3wxNddxI1jwup/6Kw9sStjzAG/FlrIcHTngfWw0etiA6C70UVnF/zZxQgC7bBH1JKlIt5WxG+6+rzbzPi0r+ZFOtZIRpk6Ffz96Zu86McbOMljUQttNbK8kb8zsqqYo2KEtC2CzRaveq X-Microsoft-Antispam-Message-Info: wclvtrzyumn/KBLhIbNujKXB+sBcaJ5At5qeWG1ZQRTQFahoFQd9hq8U6V+k4VMhS84Y+YKobZK7fw0Y8+ZWAay4EgwNFSh/GwsFeaBBm6S+yksBg70LZNJklNotz01kke83jfhoswnSqcssI1ygMtfbXKOWCZBgRIN7zxmvMQbDNevOFow5GxPVeBuUvbexXTyb4zQ6yIspRFYeop2j6Jb+TY6sVwlRZOFi/0fOzb9zNDlHd8GyArD8SO0VwXt0xC8w6anMhaKM4aB0n5gZUJZBzKv/Dcp5QzymxQlNJ0VMuL773AyKTw/l6HiU2jsmSF5czvDpqeWde/m3IZ5QcSD/LjW4WTcTV/C2AKpf+m4= X-Microsoft-Exchange-Diagnostics: 1;DM6PR02MB4458;6:IBHHntVa4dlq5QTh8LURikXic+rbzUx9OsNAR6BsDa1NfyrYA9PLe91CEb8OcXWiATeeAzLZSF9q7OTgfZtqOx/KJ/JS0WOsjjINxvQAGCe258FG/wDg1zQU4NzRTYczH+pjNHKzhfr8GRRtkQMsKM/T2tIeygnUKEH+jNljpVwFoOzSt4BCIcptzFVBA1iyLz/GSoCutHsmfir+weMJj6wHCMn94Q1OiyiOGr7x0lJhIGhFXuVn0e0eXu7CJUmbQEkIy45aQCVSk3xFnpIM1/Lnaao4X3GoyQzPhmOM8T7t9A2FfPobNWAgLIjXAlfEzyCJpzmLYvBWHP0RYiygQQSz7eh7sEzMpm7yL6FOspR7guQK15tRht7vfJuSvg+c3WqtmVF3n//Y8jMfCGZmMsbd3/cQkY22pwvdXlXEY0hiFFmGTKq7cdsA2lEF1F3H/Jm8LRF8Cl+41ZZQV9QFww==;5:JsxYzcQUL1tVyB8Y2WFuzf5CU6PoCtoElkvTcJ2qN2LqjHQ/pCb/ZS7vqVrUQmrcn5rRgsa4ohloleKoOKN6hLLwzH2pjsEMdryZTPRM70Z1dyRu1rfBqKlZS+1YisFtYK8ikc0dEonnjosiGwfYkQfLV6E0jr3rBzJw+muBwpA=;7:SWFVkAVa2OixXXyCLAb2sKQc+8x2cL97GXGkPGS/3oh9Bc4ZCYBB2EZsumpcSltzI2wTxXFq0+FmwJpP1PAIeV2TSc8nqIa1Pyn9hemb8TwbstcZeJKVSZqD23P17cm9x3NBdcjpwGEn27Al3xSSlmGwBIrrtZCscqA80PLwIlDzS8fSHLRRgPc2MrS0Eo1KqppT69Q43eLOR94i7eq9XdkEviwd3lcFzTMpwuGt109mYguNTnW9oBaBvdzsoS7E SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Aug 2018 17:53:52.9427 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d3e901e9-096d-4104-a2f9-08d5f96a13ef X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR02MB4458 Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Rajan Vaja Add documentation to describe Xilinx ZynqMP clock driver bindings. Signed-off-by: Rajan Vaja Signed-off-by: Jolly Shah Reviewed-by: Rob Herring Reviewed-by: Stephen Boyd --- .../firmware/xilinx/xlnx,zynqmp-firmware.txt | 53 ++++++++++ include/dt-bindings/clock/xlnx,zynqmp-clk.h | 116 +++++++++++++++++++++ 2 files changed, 169 insertions(+) create mode 100644 include/dt-bindings/clock/xlnx,zynqmp-clk.h diff --git a/Documentation/devicetree/bindings/firmware/xilinx/xlnx,zynqmp-firmware.txt b/Documentation/devicetree/bindings/firmware/xilinx/xlnx,zynqmp-firmware.txt index 1b431d9..d215d15 100644 --- a/Documentation/devicetree/bindings/firmware/xilinx/xlnx,zynqmp-firmware.txt +++ b/Documentation/devicetree/bindings/firmware/xilinx/xlnx,zynqmp-firmware.txt @@ -17,6 +17,53 @@ Required properties: - "smc" : SMC #0, following the SMCCC - "hvc" : HVC #0, following the SMCCC +-------------------------------------------------------------------------- +Device Tree Clock bindings for the Zynq Ultrascale+ MPSoC controlled using +Zynq MPSoC firmware interface +-------------------------------------------------------------------------- +The clock controller is a h/w block of Zynq Ultrascale+ MPSoC clock +tree. It reads required input clock frequencies from the devicetree and acts +as clock provider for all clock consumers of PS clocks. + +See clock_bindings.txt for more information on the generic clock bindings. + +Required properties: + - #clock-cells: Must be 1 + - compatible: Must contain: "xlnx,zynqmp-clk" + - clocks: List of clock specifiers which are external input + clocks to the given clock controller. Please refer + the next section to find the input clocks for a + given controller. + - clock-names: List of clock names which are exteral input clocks + to the given clock controller. Please refer to the + clock bindings for more details. + +Input clocks for zynqmp Ultrascale+ clock controller: + +The Zynq UltraScale+ MPSoC has one primary and four alternative reference clock +inputs. These required clock inputs are: + - pss_ref_clk (PS reference clock) + - video_clk (reference clock for video system ) + - pss_alt_ref_clk (alternative PS reference clock) + - aux_ref_clk + - gt_crx_ref_clk (transceiver reference clock) + +The following strings are optional parameters to the 'clock-names' property in +order to provide an optional (E)MIO clock source: + - swdt0_ext_clk + - swdt1_ext_clk + - gem0_emio_clk + - gem1_emio_clk + - gem2_emio_clk + - gem3_emio_clk + - mio_clk_XX # with XX = 00..77 + - mio_clk_50_or_51 #for the mux clock to gem tsu from 50 or 51 + + +Output clocks are registered based on clock information received +from firmware. Output clocks indexes are mentioned in +include/dt-bindings/clock/xlnx,zynqmp-clk.h. + ------- Example ------- @@ -25,5 +72,11 @@ firmware { zynqmp_firmware: zynqmp-firmware { compatible = "xlnx,zynqmp-firmware"; method = "smc"; + zynqmp_clk : clock-controller { + #clock-cells = <1>; + compatible = "xlnx,zynqmp-clk"; + clocks = <&pss_ref_clk>, <&video_clk>, <&pss_alt_ref_clk>, <&aux_ref_clk>, <>_crx_ref_clk>; + clock-names = "pss_ref_clk", "video_clk", "pss_alt_ref_clk","aux_ref_clk", "gt_crx_ref_clk"; + }; }; }; diff --git a/include/dt-bindings/clock/xlnx,zynqmp-clk.h b/include/dt-bindings/clock/xlnx,zynqmp-clk.h new file mode 100644 index 0000000..4aebe6e --- /dev/null +++ b/include/dt-bindings/clock/xlnx,zynqmp-clk.h @@ -0,0 +1,116 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Xilinx Zynq MPSoC Firmware layer + * + * Copyright (C) 2014-2018 Xilinx, Inc. + * + */ + +#ifndef _DT_BINDINGS_CLK_ZYNQMP_H +#define _DT_BINDINGS_CLK_ZYNQMP_H + +#define IOPLL 0 +#define RPLL 1 +#define APLL 2 +#define DPLL 3 +#define VPLL 4 +#define IOPLL_TO_FPD 5 +#define RPLL_TO_FPD 6 +#define APLL_TO_LPD 7 +#define DPLL_TO_LPD 8 +#define VPLL_TO_LPD 9 +#define ACPU 10 +#define ACPU_HALF 11 +#define DBF_FPD 12 +#define DBF_LPD 13 +#define DBG_TRACE 14 +#define DBG_TSTMP 15 +#define DP_VIDEO_REF 16 +#define DP_AUDIO_REF 17 +#define DP_STC_REF 18 +#define GDMA_REF 19 +#define DPDMA_REF 20 +#define DDR_REF 21 +#define SATA_REF 22 +#define PCIE_REF 23 +#define GPU_REF 24 +#define GPU_PP0_REF 25 +#define GPU_PP1_REF 26 +#define TOPSW_MAIN 27 +#define TOPSW_LSBUS 28 +#define GTGREF0_REF 29 +#define LPD_SWITCH 30 +#define LPD_LSBUS 31 +#define USB0_BUS_REF 32 +#define USB1_BUS_REF 33 +#define USB3_DUAL_REF 34 +#define USB0 35 +#define USB1 36 +#define CPU_R5 37 +#define CPU_R5_CORE 38 +#define CSU_SPB 39 +#define CSU_PLL 40 +#define PCAP 41 +#define IOU_SWITCH 42 +#define GEM_TSU_REF 43 +#define GEM_TSU 44 +#define GEM0_REF 45 +#define GEM1_REF 46 +#define GEM2_REF 47 +#define GEM3_REF 48 +#define GEM0_TX 49 +#define GEM1_TX 50 +#define GEM2_TX 51 +#define GEM3_TX 52 +#define QSPI_REF 53 +#define SDIO0_REF 54 +#define SDIO1_REF 55 +#define UART0_REF 56 +#define UART1_REF 57 +#define SPI0_REF 58 +#define SPI1_REF 59 +#define NAND_REF 60 +#define I2C0_REF 61 +#define I2C1_REF 62 +#define CAN0_REF 63 +#define CAN1_REF 64 +#define CAN0 65 +#define CAN1 66 +#define DLL_REF 67 +#define ADMA_REF 68 +#define TIMESTAMP_REF 69 +#define AMS_REF 70 +#define PL0_REF 71 +#define PL1_REF 72 +#define PL2_REF 73 +#define PL3_REF 74 +#define WDT 75 +#define IOPLL_INT 76 +#define IOPLL_PRE_SRC 77 +#define IOPLL_HALF 78 +#define IOPLL_INT_MUX 79 +#define IOPLL_POST_SRC 80 +#define RPLL_INT 81 +#define RPLL_PRE_SRC 82 +#define RPLL_HALF 83 +#define RPLL_INT_MUX 84 +#define RPLL_POST_SRC 85 +#define APLL_INT 86 +#define APLL_PRE_SRC 87 +#define APLL_HALF 88 +#define APLL_INT_MUX 89 +#define APLL_POST_SRC 90 +#define DPLL_INT 91 +#define DPLL_PRE_SRC 92 +#define DPLL_HALF 93 +#define DPLL_INT_MUX 94 +#define DPLL_POST_SRC 95 +#define VPLL_INT 96 +#define VPLL_PRE_SRC 97 +#define VPLL_HALF 98 +#define VPLL_INT_MUX 99 +#define VPLL_POST_SRC 100 +#define CAN0_MIO 101 +#define CAN1_MIO 102 + +#endif From patchwork Fri Aug 3 17:53:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jolly Shah X-Patchwork-Id: 10555387 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B052B1708 for ; Fri, 3 Aug 2018 17:54:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 962712C724 for ; Fri, 3 Aug 2018 17:54:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 888522C921; Fri, 3 Aug 2018 17:54:37 +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=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E78CA2C724 for ; Fri, 3 Aug 2018 17:54:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729841AbeHCTvV (ORCPT ); Fri, 3 Aug 2018 15:51:21 -0400 Received: from mail-co1nam03on0042.outbound.protection.outlook.com ([104.47.40.42]:60928 "EHLO NAM03-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727829AbeHCTvV (ORCPT ); Fri, 3 Aug 2018 15:51:21 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=li3FRubunPLaA+VNvRYfjRDgPvfpqEwxNaGspuvg4xE=; b=1mcvAkuXSEgJko04h2nQRxP+U/C6kQPTYgU6LLJflwA3n/ItGO+zw5eLtN2ZfQun0OT1FdC3tsfj/B3W7mf/T0MEEtJd0Bj4YTSF1xWHcidFqCuIw2nsSLKKT85PbV/gudj69Y40O6fTe/eGQGwz1wgHLtW+j9aq9h+fDbyIodg= Received: from BN6PR02CA0028.namprd02.prod.outlook.com (2603:10b6:404:5f::14) by SN6PR02MB4336.namprd02.prod.outlook.com (2603:10b6:805:a4::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1017.15; Fri, 3 Aug 2018 17:53:55 +0000 Received: from SN1NAM02FT061.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e44::200) by BN6PR02CA0028.outlook.office365.com (2603:10b6:404:5f::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1017.14 via Frontend Transport; Fri, 3 Aug 2018 17:53:54 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.100) smtp.mailfrom=xilinx.com; linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.100 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.100; helo=xsj-pvapsmtpgw02; Received: from xsj-pvapsmtpgw02 (149.199.60.100) by SN1NAM02FT061.mail.protection.outlook.com (10.152.72.196) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.1038.3 via Frontend Transport; Fri, 3 Aug 2018 17:53:53 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66]:51041 helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw02 with esmtp (Exim 4.63) (envelope-from ) id 1fleGv-0003jz-26; Fri, 03 Aug 2018 10:53:53 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1fleGp-0007cn-W8; Fri, 03 Aug 2018 10:53:48 -0700 Received: from [172.19.2.91] (helo=xsjjollys50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGl-0007bh-QS; Fri, 03 Aug 2018 10:53:43 -0700 From: Jolly Shah To: , , , , , , , , , , , , , CC: , , , , Jolly Shah , Tejas Patel , Shubhrajyoti Datta , Jolly Shah Subject: [PATCH v11 10/11] drivers: clk: Add ZynqMP clock driver Date: Fri, 3 Aug 2018 10:53:27 -0700 Message-ID: <1533318808-10781-11-git-send-email-jollys@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533318808-10781-1-git-send-email-jollys@xilinx.com> References: <1533318808-10781-1-git-send-email-jollys@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.100;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(136003)(39860400002)(346002)(396003)(376002)(2980300002)(438002)(189003)(199004)(36756003)(110136005)(54906003)(5660300001)(316002)(4326008)(39060400002)(107886003)(14444005)(2201001)(2906002)(575784001)(478600001)(106002)(16586007)(63266004)(72206003)(305945005)(53946003)(77096007)(26005)(106466001)(47776003)(44832011)(186003)(51416003)(7696005)(76176011)(36386004)(9786002)(8676002)(48376002)(50466002)(50226002)(126002)(7416002)(81156014)(426003)(6666003)(476003)(81166006)(11346002)(8936002)(486006)(2616005)(446003)(356003)(336012)(107986001)(921003)(5001870100001)(1121003)(579004)(309714004);DIR:OUT;SFP:1101;SCL:1;SRVR:SN6PR02MB4336;H:xsj-pvapsmtpgw02;FPR:;SPF:Pass;LANG:en;PTR:unknown-60-100.xilinx.com,xapps1.xilinx.com;MX:1;A:1; X-Microsoft-Exchange-Diagnostics: 1;SN1NAM02FT061;1:yFcUYWC4p7wLde1jYMZ2SqnERip37sYNeYVJP/Q/Ug4Dm2wOjhunw1VaHbXiNrwoPUQ5XIX6ExQcrLvBV9Xw46r0W/RkUEgRwLxzPnx88j0XXPRKTAZvTrnTLQujdpkR MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 3c0e7bcd-20e4-40b9-0265-08d5f96a1453 X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(7020095)(4652040)(8989117)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(4608076)(2017052603328)(7153060);SRVR:SN6PR02MB4336; X-Microsoft-Exchange-Diagnostics: 1;SN6PR02MB4336;3:8AAIVN4t4fuHGDyF/MhxgwHv9/actgz0qwVP37PuwNC9jdm4ynwn4qpfrJvysaRqT2R5mZOMaRziJ1XEi3A2KEiU7nhHivAkTB102CppKaJPmmyFGCQVHhWrWGaOAV91SUY/J+IkRNUrMcByK8zE0DhGuZKgW/XsUBtJmCGoAxqz5l3Yifr2t/kL3Y0zRhLg69LOynwIUTmukLqmwu3MIGUenw8y1DJM4pFymUT4tMUrKDpdRQxnV1l5X1uYgjItGw4gKTEbaz6wnjFUXqXofkjOQaCKz9YWeebjEDZ1hnIraEbgmrfOWY1DyKe2HS3RM1ZKG/cL5Yt/3d1nCFhi0cDtDEgwB9uvTFuqQh4O5DI=;25:eM7r5WKxUp4o1GqmX1iZvTg5D9hskkdbRnAQyIIbsKc0/6z4KubVHzX5xUVzz8f4mTl+xDGZz1O+duxldKSQsd7iQ1Dn3lnbKfXQ+KRymkIUPKM2Ixw3hcL1Cxu3dc0nJcSZkRAq/WJu7Jl74452HiMWCCMg/1ygFukG9JW/3n/od95DyK6wiYenVc34QjU2O3rFinv1rSLh06VxXvHunklZetm+pb46cfRZR9Jef8mjQ/Xa7vXTtorZToaMzZSQEKgfUoWzDD81eKWCTJ6Ii/fkT8S83nukc2SjOkR+C2kCTDaDorTrfICCWkJr4xjZe307WpzgZCvzO88Xluoi4Q== X-MS-TrafficTypeDiagnostic: SN6PR02MB4336: X-Microsoft-Exchange-Diagnostics: 1;SN6PR02MB4336;31:Ln7lxM3DMMBgjjMXTam15deXiasgXhOmP3l5t21pYSrEkrvip4aS8/S6pTZyuU7roQEc5cIE2zbwyZ5/+jLdPBdK9lcu3V3+9okGVnR5Dc8JvneJhX9e3v8JI33AVsxYql+c0ZGH3DYzO9surJtvoVLPsy35rVaIC6DNnLjB5dIY2hcasE+DmPRBheu7U6zacwPjomlNbrYzNWmkZeknB4TrOqphZaO9pe8NUpafxfU=;20:PG8a9WtraWs8Mv0yasKj+TSAUQkE7/g6CsBj4v62cxPwHHHd+DKydj30iijzoHnr0MhJysAe/opzwwQkHkQZJ1N9pMR/dBlbgWaY7p5/jja+hYngJIpdUMzD221eaE4OshC6k+4OMDYM0nauaw/DFJHyN57kdfeEzR+06wvH6XqgdDzInw1tb1rtXzjctKp0iI6PWxfWeB81JqAZFIb2PBEYAnEjvIF9Bi9JEqwnWaj6CFD80NYqCK0Y9QMcSaWffuYFpwddEHZXSPz989Se6x70nnz/gwTsBwkCqaM+rNd9THg86+6mzqcI81rT2nMQcK3NU7KAmeGZlxLNuLQR3aKcjhxQvqobaWFsaeSxaU2w1WWtYv5haiXdGTy4/p4IE3kuAgPbnMEgKhZ5eW9k4DTjHfKeodXZCy7mzQkaUGfIq5rZQ6JrhttKgwTCyQz7ZmiqOf67Vj3sAMls8MIGhNOyWTv8NR0bDj4pY8sC2ngN/ySEVqqsE5xWW84eO4Tl X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(10201501046)(3231311)(944501410)(52105095)(93006095)(93004095)(3002001)(6055026)(149027)(150027)(6041310)(20161123564045)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123560045)(6072148)(201708071742011)(7699016);SRVR:SN6PR02MB4336;BCL:0;PCL:0;RULEID:;SRVR:SN6PR02MB4336; X-Microsoft-Exchange-Diagnostics: 1;SN6PR02MB4336;4:2aLwQJpDB+cTmAg78r0cP+SUQUlcOdcfOL2zgLM8vYmbh1wW0UolroF0RfRxR6KLbjh9iUF5sxeXA7epHywtqvvBbA/HBLUFs5CqTJK+3OJeUiWgpPrSL3a/VSosdmH05i+a4QdDrLMezYAibcU3EfWXs/M8Bky70CpP8AUWNotU2b/1AAUM9mkW8E/hIeMs9Mx+itiaMjBmNq8OA0gUZAn4l0GmyCeqq99fUVVJJavnX7X/5XhSHkuRikNZCZrAQQ7wKPjxIQUix91VuknqwTSSyR+PHIX7d78Yxf3EV0G1HpGV2d7mC5L0iielL72/ X-Forefront-PRVS: 0753EA505A X-Microsoft-Exchange-Diagnostics: 1;SN6PR02MB4336;23:gxkRwUStQ/mClf8w5H2xN9/YB2T6E/YLkbHrcqd4T+6GHOZ2e1uDVz58D3BOoCuuOqYGDN3n4iAkrcLnNmN0tPNy0SYaWapEvDFbZg95n6EDsJ3nYm8ebsW3Mzt89QdJE0tDkxOMT+Hy0o+8L2VxdRhIQx707UR+f7ClKn9Hi7zJ2QU1pAkDluInzWjrm5vGjF80uU+tAyePbUFZWJsBFzCzxutUKyc5qEBZf/nFAuvRYePAA/fchoWApxRaej0dFMwoErhT4YoPq8+rMW6MxDjDBO4IBirBbuh94cE9t9NW/746LrBVhOW0RmglD5R7UwIcFUs3U+ddmtKLTDh5FOGn1qX5esI4+Lj5B/3qJK7JaEIp5X/giZLtkZMCr14y5oi0lwOgbsVJoOVlvjLpzGzz+UNEODOdV3qumD8UAVfCQ8abM2pp7+9ZZYn/Cyv7+V32izmFOCxEgMb64j1uQQlp+Kdl4zZPHeX+Gk3CSCq0UDAbhzUHyWdbSARPL0aPINRlomNhs66gE4xbUeNyEY0SMMnYX4z+zgX4K9HjMsuPSLk9PQiz68HDVDhILvdMV/B8YTlgvJMIuHj3Cwjf0dyXyONRR4qwh3RvbuD98q03hqscEo7PhYPdKPjJiT/+rwbmI6v2iG1dDgEGgKTpjheSN9qkklGNm9jRhO2j98Bl8sfPG34nYJgs7rOY+pasQ9zzTrGwpiZIFt+QW60TK4o4nWFFfZhaJUiCGcq5FzNa9VqBYSqDgxAU+m+jJCiqGKMmIS0ICaBBtl4OoDs6jNkiyoPeqy09JDHehzh9wwlHh95QF/8fUrILyko6MMuLaIRUGNJTaSP/fvqtfmjcd7VWkhz1Yp3KM4n9SVt93SEBfNqDPEFgh0FwMQyYs71J7Qr2WbWHShUv+NhE32/iiTSjgI36gYqhvoFVW0u6J0JtU0ObZ61fyXNaWhbjIS9POTcoWzwL3mrtOMtVaO7y38C5poCV6pY7L25do3af8A730DizIMxFdfEPrJ4E/GoUss5rzR6+qwigkQOKywRvhNWrccx2Kdg87hr7tLeKbpfsfpKUqU23Eep00cGl0L53LmjyHbSIaw0eyUXiUEjeqMfZ57osAOimT3kmFueHA5PdaYD/vgkPg6y5TsaC+IuT4ND3oNHqz/X6tods1THckpt9l6qzl7BqtaHmiVN3LWkro+h4zqD6Ecs/y4N1zFBRihNm48sKqMHXoHB21HOZW/vZr+8zFB6jxvfeCCWZNgxqKpZQXKEfW747hoTSRgvDFn4BcCjvij8MjlRKDrXCVnr+9tSbsdf9l/5cj/0tLT6lgusRyUDvytRundHHoIVlhvoW19d8uyxd6B/LpgZJDBZs0ymUf7+g6tE097ws9h8= X-Microsoft-Antispam-Message-Info: kWVuUlkcwWjORVcqf8aWpgEa/C//K/qDToVy9eKyVLXbEG+gYviLN3jdk+RFKZZHdt9ccVCfs5J2MHxs3/Xrh16jToIImXbhTBPXH2JtorqVLEqlUxLYjseDhGHlLTYAb1Mhoc2udBoEK+pI9XIZ86ccPJipc9483Bdc3pnqrS8830Go+tCtvI5OHTb8RiC0U4bUbOqrBfNFMoPvlGnjpzQtIgszEj9UZbyUvhGHm8XJBgQJs9amFycWzsW5Tt+4aozsU93xEkrPbEGwwasJM/j38HYee8Lls8qMONqTBOMGzt/owpKCLw6gXTUv5J2duKD41uq4xu3VczKPsbTgts3koyt37RGsRrpelfWUAJs= X-Microsoft-Exchange-Diagnostics: 1;SN6PR02MB4336;6:MZGV8MdBkOnxtfjk/VLatYtPDNX6+wiTHiJH5Dna25q+u/9q/A1x+cJsfNoDG+edJYqA7vNWoCC967QcojR7FFfRyzZt8mvAXtc92zKwsXDSpHOO9dvc2LdqzmK/Y6ywplrQpsHypqc651yu6hCxavV2hFWRSgREfLXGySyAoPxuVllkO4jHpiIlqRcffGIkyIJo1s6Nw8yhcHMK0l4nil2EENgPG1lkEH1tUWNMQMys1GeJ6ZbpXMNrCzQXTq3p1qow3hEARkqrM1FmDB2mBwyddmh+GyMZu0ytDGBmOUwwahzKZyCfQeIbqMbdTTM+YI6yyE9kIo2H5c4tNxltQAlFUo+ESZ9VNMVAzyyMyE6LXXZotXZPKy+asiOWx5dBiWcNYBsVFfhPgZb3Jf3hzSFfwE6fXkvKjLMjPhkagni+xlPrV9EPEy5QEpafgQaLQZKS8FFTjsQwubXM4M7Sag==;5:+N5o80jlNqqgy573HI70LVhrad0QmNGc4XsN6y7seQeZfUn4TlM/W+rSxJFoHeyerLbwO0Gmv8MWypESJiUTQ6065ZowUVo3sWvdEBUK/S/9V+sMb1ph4QoEXUrJJO+YVMsJEaobJ4U4joXG+eTYHemQU90BxnZtz6JtujGreew=;7:WMqeQpdpFiVmjgkZ9H6j6MpOx/YXWbyEPNF3Izy3TX8uGtC40G2m4qTeCfjN/ohmaXCcupo9++ELP6zNGGFe7PZtqcuQd6POt+BtmivRVdIIVRoyFGWPc1UhpIbaQeIk7oTpTlPud4qNCEzOojytR2a+E29DiupXWpXkqYhwNe6g+OKgDkxHSwl15olDQ5VRogGeyUtzHtgB8LGpoX2ZQu5WRy9+NWUehMlbSNuB4UAqNmuQnIASVI/YBchUVSR6 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Aug 2018 17:53:53.5001 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3c0e7bcd-20e4-40b9-0265-08d5f96a1453 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.100];Helo=[xsj-pvapsmtpgw02] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN6PR02MB4336 Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Jolly Shah This patch adds CCF compliant clock driver for ZynqMP. Clock driver queries supported clock information from firmware and regiters pll and output clocks with CCF. Signed-off-by: Rajan Vaja Signed-off-by: Tejas Patel Signed-off-by: Shubhrajyoti Datta Signed-off-by: Jolly Shah --- drivers/clk/Kconfig | 1 + drivers/clk/Makefile | 1 + drivers/clk/zynqmp/Kconfig | 10 + drivers/clk/zynqmp/Makefile | 4 + drivers/clk/zynqmp/clk-gate-zynqmp.c | 144 +++++++ drivers/clk/zynqmp/clk-mux-zynqmp.c | 141 +++++++ drivers/clk/zynqmp/clk-zynqmp.h | 68 ++++ drivers/clk/zynqmp/clkc.c | 716 +++++++++++++++++++++++++++++++++++ drivers/clk/zynqmp/divider.c | 217 +++++++++++ drivers/clk/zynqmp/pll.c | 335 ++++++++++++++++ include/linux/firmware/xlnx-zynqmp.h | 1 + 11 files changed, 1638 insertions(+) create mode 100644 drivers/clk/zynqmp/Kconfig create mode 100644 drivers/clk/zynqmp/Makefile create mode 100644 drivers/clk/zynqmp/clk-gate-zynqmp.c create mode 100644 drivers/clk/zynqmp/clk-mux-zynqmp.c create mode 100644 drivers/clk/zynqmp/clk-zynqmp.h create mode 100644 drivers/clk/zynqmp/clkc.c create mode 100644 drivers/clk/zynqmp/divider.c create mode 100644 drivers/clk/zynqmp/pll.c diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig index 98ce9fc..ab2ea76 100644 --- a/drivers/clk/Kconfig +++ b/drivers/clk/Kconfig @@ -253,5 +253,6 @@ source "drivers/clk/sunxi-ng/Kconfig" source "drivers/clk/tegra/Kconfig" source "drivers/clk/ti/Kconfig" source "drivers/clk/uniphier/Kconfig" +source "drivers/clk/zynqmp/Kconfig" endmenu diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile index 71ec41e..b6ac0d2 100644 --- a/drivers/clk/Makefile +++ b/drivers/clk/Makefile @@ -100,3 +100,4 @@ obj-$(CONFIG_X86) += x86/ endif obj-$(CONFIG_ARCH_ZX) += zte/ obj-$(CONFIG_ARCH_ZYNQ) += zynq/ +obj-$(CONFIG_COMMON_CLK_ZYNQMP) += zynqmp/ diff --git a/drivers/clk/zynqmp/Kconfig b/drivers/clk/zynqmp/Kconfig new file mode 100644 index 0000000..1708605 --- /dev/null +++ b/drivers/clk/zynqmp/Kconfig @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: GPL-2.0 + +config COMMON_CLK_ZYNQMP + bool "Support for Xilinx ZynqMP Ultrascale+ clock controllers" + depends on ARCH_ZYNQMP || COMPILE_TEST + depends on ZYNQMP_FIRMWARE + help + Support for the Zynqmp Ultrascale clock controller. + It has a dependency on the PMU firmware. + Say Y if you want to include clock support. diff --git a/drivers/clk/zynqmp/Makefile b/drivers/clk/zynqmp/Makefile new file mode 100644 index 0000000..0ec24bf --- /dev/null +++ b/drivers/clk/zynqmp/Makefile @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0 +# Zynq Ultrascale+ MPSoC clock specific Makefile + +obj-$(CONFIG_ARCH_ZYNQMP) += pll.o clk-gate-zynqmp.o divider.o clk-mux-zynqmp.o clkc.o diff --git a/drivers/clk/zynqmp/clk-gate-zynqmp.c b/drivers/clk/zynqmp/clk-gate-zynqmp.c new file mode 100644 index 0000000..83b236f --- /dev/null +++ b/drivers/clk/zynqmp/clk-gate-zynqmp.c @@ -0,0 +1,144 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Zynq UltraScale+ MPSoC clock controller + * + * Copyright (C) 2016-2018 Xilinx + * + * Gated clock implementation + */ + +#include +#include +#include "clk-zynqmp.h" + +/** + * struct clk_gate - gating clock + * @hw: handle between common and hardware-specific interfaces + * @flags: hardware-specific flags + * @clk_id: Id of clock + */ +struct zynqmp_clk_gate { + struct clk_hw hw; + u8 flags; + u32 clk_id; +}; + +#define to_zynqmp_clk_gate(_hw) container_of(_hw, struct zynqmp_clk_gate, hw) + +/** + * zynqmp_clk_gate_enable() - Enable clock + * @hw: handle between common and hardware-specific interfaces + * + * Return: 0 on success else error code + */ +static int zynqmp_clk_gate_enable(struct clk_hw *hw) +{ + struct zynqmp_clk_gate *gate = to_zynqmp_clk_gate(hw); + const char *clk_name = clk_hw_get_name(hw); + u32 clk_id = gate->clk_id; + int ret; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + ret = eemi_ops->clock_enable(clk_id); + + if (ret) + pr_warn_once("%s() clock enabled failed for %s, ret = %d\n", + __func__, clk_name, ret); + + return ret; +} + +/* + * zynqmp_clk_gate_disable() - Disable clock + * @hw: handle between common and hardware-specific interfaces + */ +static void zynqmp_clk_gate_disable(struct clk_hw *hw) +{ + struct zynqmp_clk_gate *gate = to_zynqmp_clk_gate(hw); + const char *clk_name = clk_hw_get_name(hw); + u32 clk_id = gate->clk_id; + int ret; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + ret = eemi_ops->clock_disable(clk_id); + + if (ret) + pr_warn_once("%s() clock disable failed for %s, ret = %d\n", + __func__, clk_name, ret); +} + +/** + * zynqmp_clk_gate_is_enable() - Check clock state + * @hw: handle between common and hardware-specific interfaces + * + * Return: 1 if enabled, 0 if disabled else error code + */ +static int zynqmp_clk_gate_is_enabled(struct clk_hw *hw) +{ + struct zynqmp_clk_gate *gate = to_zynqmp_clk_gate(hw); + const char *clk_name = clk_hw_get_name(hw); + u32 clk_id = gate->clk_id; + int state, ret; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + ret = eemi_ops->clock_getstate(clk_id, &state); + if (ret) { + pr_warn_once("%s() clock get state failed for %s, ret = %d\n", + __func__, clk_name, ret); + return -EIO; + } + + return state ? 1 : 0; +} + +static const struct clk_ops zynqmp_clk_gate_ops = { + .enable = zynqmp_clk_gate_enable, + .disable = zynqmp_clk_gate_disable, + .is_enabled = zynqmp_clk_gate_is_enabled, +}; + +/** + * zynqmp_clk_register_gate() - Register a gate clock with the clock framework + * @name: Name of this clock + * @clk_id: Id of this clock + * @parents: Name of this clock's parents + * @num_parents: Number of parents + * @nodes: Clock topology node + * + * Return: clock hardware of the registered clock gate + */ +struct clk_hw *zynqmp_clk_register_gate(const char *name, u32 clk_id, + const char * const *parents, + u8 num_parents, + const struct clock_topology *nodes) +{ + struct zynqmp_clk_gate *gate; + struct clk_hw *hw; + int ret; + struct clk_init_data init; + + /* allocate the gate */ + gate = kzalloc(sizeof(*gate), GFP_KERNEL); + if (!gate) + return ERR_PTR(-ENOMEM); + + init.name = name; + init.ops = &zynqmp_clk_gate_ops; + init.flags = nodes->flag; + init.parent_names = parents; + init.num_parents = 1; + + /* struct clk_gate assignments */ + gate->flags = nodes->type_flag; + gate->hw.init = &init; + gate->clk_id = clk_id; + + hw = &gate->hw; + ret = clk_hw_register(NULL, hw); + if (ret) { + kfree(gate); + hw = ERR_PTR(ret); + } + + return hw; +} diff --git a/drivers/clk/zynqmp/clk-mux-zynqmp.c b/drivers/clk/zynqmp/clk-mux-zynqmp.c new file mode 100644 index 0000000..4143f56 --- /dev/null +++ b/drivers/clk/zynqmp/clk-mux-zynqmp.c @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Zynq UltraScale+ MPSoC mux + * + * Copyright (C) 2016-2018 Xilinx + */ + +#include +#include +#include "clk-zynqmp.h" + +/* + * DOC: basic adjustable multiplexer clock that cannot gate + * + * Traits of this clock: + * prepare - clk_prepare only ensures that parents are prepared + * enable - clk_enable only ensures that parents are enabled + * rate - rate is only affected by parent switching. No clk_set_rate support + * parent - parent is adjustable through clk_set_parent + */ + +/** + * struct zynqmp_clk_mux - multiplexer clock + * + * @hw: handle between common and hardware-specific interfaces + * @flags: hardware-specific flags + * @clk_id: Id of clock + */ +struct zynqmp_clk_mux { + struct clk_hw hw; + u8 flags; + u32 clk_id; +}; + +#define to_zynqmp_clk_mux(_hw) container_of(_hw, struct zynqmp_clk_mux, hw) + +/** + * zynqmp_clk_mux_get_parent() - Get parent of clock + * @hw: handle between common and hardware-specific interfaces + * + * Return: Parent index + */ +static u8 zynqmp_clk_mux_get_parent(struct clk_hw *hw) +{ + struct zynqmp_clk_mux *mux = to_zynqmp_clk_mux(hw); + const char *clk_name = clk_hw_get_name(hw); + u32 clk_id = mux->clk_id; + u32 val; + int ret; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + ret = eemi_ops->clock_getparent(clk_id, &val); + + if (ret) + pr_warn_once("%s() getparent failed for clock: %s, ret = %d\n", + __func__, clk_name, ret); + + return val; +} + +/** + * zynqmp_clk_mux_set_parent() - Set parent of clock + * @hw: handle between common and hardware-specific interfaces + * @index: Parent index + * + * Return: 0 on success else error+reason + */ +static int zynqmp_clk_mux_set_parent(struct clk_hw *hw, u8 index) +{ + struct zynqmp_clk_mux *mux = to_zynqmp_clk_mux(hw); + const char *clk_name = clk_hw_get_name(hw); + u32 clk_id = mux->clk_id; + int ret; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + ret = eemi_ops->clock_setparent(clk_id, index); + + if (ret) + pr_warn_once("%s() set parent failed for clock: %s, ret = %d\n", + __func__, clk_name, ret); + + return ret; +} + +static const struct clk_ops zynqmp_clk_mux_ops = { + .get_parent = zynqmp_clk_mux_get_parent, + .set_parent = zynqmp_clk_mux_set_parent, + .determine_rate = __clk_mux_determine_rate, +}; + +static const struct clk_ops zynqmp_clk_mux_ro_ops = { + .get_parent = zynqmp_clk_mux_get_parent, +}; + +/** + * zynqmp_clk_register_mux() - Register a mux table with the clock + * framework + * @name: Name of this clock + * @clk_id: Id of this clock + * @parents: Name of this clock's parents + * @num_parents: Number of parents + * @nodes: Clock topology node + * + * Return: clock hardware of the registered clock mux + */ +struct clk_hw *zynqmp_clk_register_mux(const char *name, u32 clk_id, + const char * const *parents, + u8 num_parents, + const struct clock_topology *nodes) +{ + struct zynqmp_clk_mux *mux; + struct clk_hw *hw; + struct clk_init_data init; + int ret; + + mux = kzalloc(sizeof(*mux), GFP_KERNEL); + if (!mux) + return ERR_PTR(-ENOMEM); + + init.name = name; + if (nodes->type_flag & CLK_MUX_READ_ONLY) + init.ops = &zynqmp_clk_mux_ro_ops; + else + init.ops = &zynqmp_clk_mux_ops; + init.flags = nodes->flag; + init.parent_names = parents; + init.num_parents = num_parents; + mux->flags = nodes->type_flag; + mux->hw.init = &init; + mux->clk_id = clk_id; + + hw = &mux->hw; + ret = clk_hw_register(NULL, hw); + if (ret) { + kfree(hw); + hw = ERR_PTR(ret); + } + + return hw; +} +EXPORT_SYMBOL_GPL(zynqmp_clk_register_mux); diff --git a/drivers/clk/zynqmp/clk-zynqmp.h b/drivers/clk/zynqmp/clk-zynqmp.h new file mode 100644 index 0000000..7ab163b --- /dev/null +++ b/drivers/clk/zynqmp/clk-zynqmp.h @@ -0,0 +1,68 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2016-2018 Xilinx + */ + +#ifndef __LINUX_CLK_ZYNQMP_H_ +#define __LINUX_CLK_ZYNQMP_H_ + +#include + +#include + +/* Clock APIs payload parameters */ +#define CLK_GET_NAME_RESP_LEN 16 +#define CLK_GET_TOPOLOGY_RESP_WORDS 3 +#define CLK_GET_PARENTS_RESP_WORDS 3 +#define CLK_GET_ATTR_RESP_WORDS 1 + +enum topology_type { + TYPE_INVALID, + TYPE_MUX, + TYPE_PLL, + TYPE_FIXEDFACTOR, + TYPE_DIV1, + TYPE_DIV2, + TYPE_GATE, +}; + +/** + * struct clock_topology - Clock topology + * @type: Type of topology + * @flag: Topology flags + * @type_flag: Topology type specific flag + */ +struct clock_topology { + u32 type; + u32 flag; + u32 type_flag; +}; + +struct clk_hw *zynqmp_clk_register_pll(const char *name, u32 clk_id, + const char * const *parents, + u8 num_parents, + const struct clock_topology *nodes); + +struct clk_hw *zynqmp_clk_register_gate(const char *name, u32 clk_id, + const char * const *parents, + u8 num_parents, + const struct clock_topology *nodes); + +struct clk_hw *zynqmp_clk_register_divider(const char *name, + u32 clk_id, + const char * const *parents, + u8 num_parents, + const struct clock_topology *nodes); + +struct clk_hw *zynqmp_clk_register_mux(const char *name, u32 clk_id, + const char * const *parents, + u8 num_parents, + const struct clock_topology *nodes); + +struct clk_hw *zynqmp_clk_register_fixed_factor(const char *name, + u32 clk_id, + const char * const *parents, + u8 num_parents, + const struct clock_topology *nodes); + +#endif diff --git a/drivers/clk/zynqmp/clkc.c b/drivers/clk/zynqmp/clkc.c new file mode 100644 index 0000000..1b07d77 --- /dev/null +++ b/drivers/clk/zynqmp/clkc.c @@ -0,0 +1,716 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Zynq UltraScale+ MPSoC clock controller + * + * Copyright (C) 2016-2018 Xilinx + * + * Based on drivers/clk/zynq/clkc.c + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "clk-zynqmp.h" + +#define MAX_PARENT 100 +#define MAX_NODES 6 +#define MAX_NAME_LEN 50 + +#define CLK_TYPE_SHIFT 2 + +#define PM_API_PAYLOAD_LEN 3 + +#define NA_PARENT 0xFFFFFFFF +#define DUMMY_PARENT 0xFFFFFFFE + +#define CLK_TYPE_FIELD_LEN 4 +#define CLK_TOPOLOGY_NODE_OFFSET 16 +#define NODES_PER_RESP 3 + +#define CLK_TYPE_FIELD_MASK 0xF +#define CLK_FLAG_FIELD_MASK GENMASK(21, 8) +#define CLK_TYPE_FLAG_FIELD_MASK GENMASK(31, 24) + +#define CLK_PARENTS_ID_LEN 16 +#define CLK_PARENTS_ID_MASK 0xFFFF + +/* Flags for parents */ +#define PARENT_CLK_SELF 0 +#define PARENT_CLK_NODE1 1 +#define PARENT_CLK_NODE2 2 +#define PARENT_CLK_NODE3 3 +#define PARENT_CLK_NODE4 4 +#define PARENT_CLK_EXTERNAL 5 + +#define END_OF_CLK_NAME "END_OF_CLK" +#define END_OF_TOPOLOGY_NODE 1 +#define END_OF_PARENTS 1 +#define RESERVED_CLK_NAME "" + +#define CLK_VALID_MASK 0x1 + +enum clk_type { + CLK_TYPE_OUTPUT, + CLK_TYPE_EXTERNAL, +}; + +/** + * struct clock_parent - Clock parent + * @name: Parent name + * @id: Parent clock ID + * @flag: Parent flags + */ +struct clock_parent { + char name[MAX_NAME_LEN]; + int id; + u32 flag; +}; + +/** + * struct zynqmp_clock - Clock + * @clk_name: Clock name + * @valid: Validity flag of clock + * @type: Clock type (Output/External) + * @node: Clock topology nodes + * @num_nodes: Number of nodes present in topology + * @parent: Parent of clock + * @num_parents: Number of parents of clock + */ +struct zynqmp_clock { + char clk_name[MAX_NAME_LEN]; + u32 valid; + enum clk_type type; + struct clock_topology node[MAX_NODES]; + u32 num_nodes; + struct clock_parent parent[MAX_PARENT]; + u32 num_parents; +}; + +static const char clk_type_postfix[][10] = { + [TYPE_INVALID] = "", + [TYPE_MUX] = "_mux", + [TYPE_GATE] = "", + [TYPE_DIV1] = "_div1", + [TYPE_DIV2] = "_div2", + [TYPE_FIXEDFACTOR] = "_ff", + [TYPE_PLL] = "" +}; + +static struct clk_hw *(* const clk_topology[]) (const char *name, u32 clk_id, + const char * const *parents, + u8 num_parents, + const struct clock_topology *nodes) + = { + [TYPE_INVALID] = NULL, + [TYPE_MUX] = zynqmp_clk_register_mux, + [TYPE_PLL] = zynqmp_clk_register_pll, + [TYPE_FIXEDFACTOR] = zynqmp_clk_register_fixed_factor, + [TYPE_DIV1] = zynqmp_clk_register_divider, + [TYPE_DIV2] = zynqmp_clk_register_divider, + [TYPE_GATE] = zynqmp_clk_register_gate +}; + +static struct zynqmp_clock *clock; +static struct clk_hw_onecell_data *zynqmp_data; +static unsigned int clock_max_idx; +static const struct zynqmp_eemi_ops *eemi_ops; + +/** + * zynqmp_is_valid_clock() - Check whether clock is valid or not + * @clk_id: Clock index + * + * Return: 1 if clock is valid, 0 if clock is invalid else error code + */ +static inline int zynqmp_is_valid_clock(u32 clk_id) +{ + if (clk_id > clock_max_idx) + return -ENODEV; + + return clock[clk_id].valid; +} + +/** + * zynqmp_get_clock_name() - Get name of clock from Clock index + * @clk_id: Clock index + * @clk_name: Name of clock + * + * Return: 0 on success else error code + */ +static int zynqmp_get_clock_name(u32 clk_id, char *clk_name) +{ + int ret; + + ret = zynqmp_is_valid_clock(clk_id); + if (ret == 1) { + strncpy(clk_name, clock[clk_id].clk_name, MAX_NAME_LEN); + return 0; + } + + return ret == 0 ? -EINVAL : ret; +} + +/** + * zynqmp_get_clock_type() - Get type of clock + * @clk_id: Clock index + * @type: Clock type: CLK_TYPE_OUTPUT or CLK_TYPE_EXTERNAL + * + * Return: 0 on success else error code + */ +static int zynqmp_get_clock_type(u32 clk_id, u32 *type) +{ + int ret; + + ret = zynqmp_is_valid_clock(clk_id); + if (ret == 1) { + *type = clock[clk_id].type; + return 0; + } + + return ret == 0 ? -EINVAL : ret; +} + +/** + * zynqmp_pm_clock_get_num_clocks() - Get number of clocks in system + * @nclocks: Number of clocks in system/board. + * + * Call firmware API to get number of clocks. + * + * Return: 0 on success else error code. + */ +static int zynqmp_pm_clock_get_num_clocks(u32 *nclocks) +{ + struct zynqmp_pm_query_data qdata = {0}; + __le32 ret_payload[PAYLOAD_ARG_CNT]; + int ret; + + qdata.qid = PM_QID_CLOCK_GET_NUM_CLOCKS; + + ret = eemi_ops->query_data(qdata, ret_payload); + *nclocks = ret_payload[1]; + + return ret; +} + +/** + * zynqmp_pm_clock_get_name() - Get the name of clock for given id + * @clock_id: ID of the clock to be queried + * @name: Name of given clock + * + * This function is used to get name of clock specified by given + * clock ID. + * + * Return: Returns 0, in case of error name would be 0 + */ +static int zynqmp_pm_clock_get_name(u32 clock_id, char *name) +{ + struct zynqmp_pm_query_data qdata = {0}; + __le32 ret_payload[PAYLOAD_ARG_CNT]; + + qdata.qid = PM_QID_CLOCK_GET_NAME; + qdata.arg1 = clock_id; + + eemi_ops->query_data(qdata, ret_payload); + memcpy(name, ret_payload, CLK_GET_NAME_RESP_LEN); + + return 0; +} + +/** + * zynqmp_pm_clock_get_topology() - Get the topology of clock for given id + * @clock_id: ID of the clock to be queried + * @index: Node index of clock topology + * @topology: Buffer to store nodes in topology and flags + * + * This function is used to get topology information for the clock + * specified by given clock ID. + * + * This API will return 3 node of topology with a single response. To get + * other nodes, master should call same API in loop with new + * index till error is returned. E.g First call should have + * index 0 which will return nodes 0,1 and 2. Next call, index + * should be 3 which will return nodes 3,4 and 5 and so on. + * + * Return: 0 on success else error+reason + */ +static int zynqmp_pm_clock_get_topology(u32 clock_id, u32 index, u32 *topology) +{ + struct zynqmp_pm_query_data qdata = {0}; + __le32 ret_payload[PAYLOAD_ARG_CNT]; + int ret; + + qdata.qid = PM_QID_CLOCK_GET_TOPOLOGY; + qdata.arg1 = clock_id; + qdata.arg2 = index; + + ret = eemi_ops->query_data(qdata, ret_payload); + memcpy(topology, &ret_payload[1], CLK_GET_TOPOLOGY_RESP_WORDS * 4); + + return ret; +} + +/** + * zynqmp_clk_register_fixed_factor() - Register fixed factor with the + * clock framework + * @name: Name of this clock + * @clk_id: Clock ID + * @parents: Name of this clock's parents + * @num_parents: Number of parents + * @nodes: Clock topology node + * + * Return: clock hardware to the registered clock + */ +struct clk_hw *zynqmp_clk_register_fixed_factor(const char *name, u32 clk_id, + const char * const *parents, + u8 num_parents, + const struct clock_topology *nodes) +{ + u32 mult, div; + struct clk_hw *hw; + struct zynqmp_pm_query_data qdata = {0}; + __le32 ret_payload[PAYLOAD_ARG_CNT]; + int ret; + + qdata.qid = PM_QID_CLOCK_GET_FIXEDFACTOR_PARAMS; + qdata.arg1 = clk_id; + + ret = eemi_ops->query_data(qdata, ret_payload); + mult = ret_payload[1]; + div = ret_payload[2]; + + hw = clk_hw_register_fixed_factor(NULL, name, + parents[0], + nodes->flag, mult, + div); + + return hw; +} + +/** + * zynqmp_pm_clock_get_parents() - Get the first 3 parents of clock for given id + * @clock_id: Clock ID + * @index: Parent index + * @parents: 3 parents of the given clock + * + * This function is used to get 3 parents for the clock specified by + * given clock ID. + * + * This API will return 3 parents with a single response. To get + * other parents, master should call same API in loop with new + * parent index till error is returned. E.g First call should have + * index 0 which will return parents 0,1 and 2. Next call, index + * should be 3 which will return parent 3,4 and 5 and so on. + * + * Return: 0 on success else error+reason + */ +static int zynqmp_pm_clock_get_parents(u32 clock_id, u32 index, u32 *parents) +{ + struct zynqmp_pm_query_data qdata = {0}; + __le32 ret_payload[PAYLOAD_ARG_CNT]; + int ret; + + qdata.qid = PM_QID_CLOCK_GET_PARENTS; + qdata.arg1 = clock_id; + qdata.arg2 = index; + + ret = eemi_ops->query_data(qdata, ret_payload); + memcpy(parents, &ret_payload[1], CLK_GET_PARENTS_RESP_WORDS * 4); + + return ret; +} + +/** + * zynqmp_pm_clock_get_attributes() - Get the attributes of clock for given id + * @clock_id: Clock ID + * @attr: Clock attributes + * + * This function is used to get clock's attributes(e.g. valid, clock type, etc). + * + * Return: 0 on success else error+reason + */ +static int zynqmp_pm_clock_get_attributes(u32 clock_id, u32 *attr) +{ + struct zynqmp_pm_query_data qdata = {0}; + __le32 ret_payload[PAYLOAD_ARG_CNT]; + int ret; + + qdata.qid = PM_QID_CLOCK_GET_ATTRIBUTES; + qdata.arg1 = clock_id; + + ret = eemi_ops->query_data(qdata, ret_payload); + memcpy(attr, &ret_payload[1], CLK_GET_ATTR_RESP_WORDS * 4); + + return ret; +} + +/** + * __zynqmp_clock_get_topology() - Get topology data of clock from firmware + * response data + * @topology: Clock topology + * @data: Clock topology data received from firmware + * @nnodes: Number of nodes + * + * Return: 0 on success else error+reason + */ +static int __zynqmp_clock_get_topology(struct clock_topology *topology, + u32 *data, u32 *nnodes) +{ + int i; + + for (i = 0; i < PM_API_PAYLOAD_LEN; i++) { + if (!(data[i] & CLK_TYPE_FIELD_MASK)) + return END_OF_TOPOLOGY_NODE; + topology[*nnodes].type = data[i] & CLK_TYPE_FIELD_MASK; + topology[*nnodes].flag = FIELD_GET(CLK_FLAG_FIELD_MASK, + data[i]); + topology[*nnodes].type_flag = + FIELD_GET(CLK_TYPE_FLAG_FIELD_MASK, data[i]); + (*nnodes)++; + } + + return 0; +} + +/** + * zynqmp_clock_get_topology() - Get topology of clock from firmware using + * PM_API + * @clk_id: Clock index + * @topology: Clock topology + * @num_nodes: Number of nodes + * + * Return: 0 on success else error+reason + */ +static int zynqmp_clock_get_topology(u32 clk_id, + struct clock_topology *topology, + u32 *num_nodes) +{ + int j, ret; + u32 pm_resp[PM_API_PAYLOAD_LEN] = {0}; + + *num_nodes = 0; + for (j = 0; j <= MAX_NODES; j += 3) { + ret = zynqmp_pm_clock_get_topology(clk_id, j, pm_resp); + if (ret) + return ret; + ret = __zynqmp_clock_get_topology(topology, pm_resp, num_nodes); + if (ret == END_OF_TOPOLOGY_NODE) + return 0; + } + + return 0; +} + +/** + * __zynqmp_clock_get_topology() - Get parents info of clock from firmware + * response data + * @parents: Clock parents + * @data: Clock parents data received from firmware + * @nparent: Number of parent + * + * Return: 0 on success else error+reason + */ +static int __zynqmp_clock_get_parents(struct clock_parent *parents, u32 *data, + u32 *nparent) +{ + int i; + struct clock_parent *parent; + + for (i = 0; i < PM_API_PAYLOAD_LEN; i++) { + if (data[i] == NA_PARENT) + return END_OF_PARENTS; + + parent = &parents[i]; + parent->id = data[i] & CLK_PARENTS_ID_MASK; + if (data[i] == DUMMY_PARENT) { + strcpy(parent->name, "dummy_name"); + parent->flag = 0; + } else { + parent->flag = data[i] >> CLK_PARENTS_ID_LEN; + if (zynqmp_get_clock_name(parent->id, parent->name)) + continue; + } + *nparent += 1; + } + + return 0; +} + +/** + * zynqmp_clock_get_parents() - Get parents info from firmware using PM_API + * @clk_id: Clock index + * @parents: Clock parents + * @num_parents: Total number of parents + * + * Return: 0 on success else error+reason + */ +static int zynqmp_clock_get_parents(u32 clk_id, struct clock_parent *parents, + u32 *num_parents) +{ + int j = 0, ret; + u32 pm_resp[PM_API_PAYLOAD_LEN] = {0}; + + *num_parents = 0; + do { + /* Get parents from firmware */ + ret = zynqmp_pm_clock_get_parents(clk_id, j, pm_resp); + if (ret) + return ret; + + ret = __zynqmp_clock_get_parents(&parents[j], pm_resp, + num_parents); + if (ret == END_OF_PARENTS) + return 0; + j += PM_API_PAYLOAD_LEN; + } while (*num_parents <= MAX_PARENT); + + return 0; +} + +/** + * zynqmp_get_parent_list() - Create list of parents name + * @np: Device node + * @clk_id: Clock index + * @parent_list: List of parent's name + * @num_parents: Total number of parents + * + * Return: 0 on success else error+reason + */ +static int zynqmp_get_parent_list(struct device_node *np, u32 clk_id, + const char **parent_list, u32 *num_parents) +{ + int i = 0, ret; + u32 total_parents = clock[clk_id].num_parents; + struct clock_topology *clk_nodes; + struct clock_parent *parents; + + clk_nodes = clock[clk_id].node; + parents = clock[clk_id].parent; + + for (i = 0; i < total_parents; i++) { + if (!parents[i].flag) { + parent_list[i] = parents[i].name; + } else if (parents[i].flag == PARENT_CLK_EXTERNAL) { + ret = of_property_match_string(np, "clock-names", + parents[i].name); + if (ret < 0) + strcpy(parents[i].name, "dummy_name"); + parent_list[i] = parents[i].name; + } else { + strcat(parents[i].name, + clk_type_postfix[clk_nodes[parents[i].flag - 1]. + type]); + parent_list[i] = parents[i].name; + } + } + + *num_parents = total_parents; + return 0; +} + +/** + * zynqmp_register_clk_topology() - Register clock topology + * @clk_id: Clock index + * @clk_name: Clock Name + * @num_parents: Total number of parents + * @parent_names: List of parents name + * + * Return: Returns either clock hardware or error+reason + */ +static struct clk_hw *zynqmp_register_clk_topology(int clk_id, char *clk_name, + int num_parents, + const char **parent_names) +{ + int j; + u32 num_nodes; + char *clk_out = NULL; + struct clock_topology *nodes; + struct clk_hw *hw = NULL; + + nodes = clock[clk_id].node; + num_nodes = clock[clk_id].num_nodes; + + for (j = 0; j < num_nodes; j++) { + /* + * Clock name received from firmware is output clock name. + * Intermediate clock names are postfixed with type of clock. + */ + if (j != (num_nodes - 1)) { + clk_out = kasprintf(GFP_KERNEL, "%s%s", clk_name, + clk_type_postfix[nodes[j].type]); + } else { + clk_out = kasprintf(GFP_KERNEL, "%s", clk_name); + } + + if (!clk_topology[nodes[j].type]) + continue; + + hw = (*clk_topology[nodes[j].type])(clk_out, clk_id, + parent_names, + num_parents, + &nodes[j]); + if (IS_ERR(hw)) + pr_warn_once("%s() %s register fail with %ld\n", + __func__, clk_name, PTR_ERR(hw)); + + parent_names[0] = clk_out; + } + kfree(clk_out); + return hw; +} + +/** + * zynqmp_register_clocks() - Register clocks + * @np: Device node + * + * Return: 0 on success else error code + */ +static int zynqmp_register_clocks(struct device_node *np) +{ + int ret; + u32 i, total_parents = 0, type = 0; + const char *parent_names[MAX_PARENT]; + + for (i = 0; i < clock_max_idx; i++) { + char clk_name[MAX_NAME_LEN]; + + /* get clock name, continue to next clock if name not found */ + if (zynqmp_get_clock_name(i, clk_name)) + continue; + + /* Check if clock is valid and output clock. + * Do not register invalid or external clock. + */ + ret = zynqmp_get_clock_type(i, &type); + if (ret || type != CLK_TYPE_OUTPUT) + continue; + + /* Get parents of clock*/ + if (zynqmp_get_parent_list(np, i, parent_names, + &total_parents)) { + WARN_ONCE(1, "No parents found for %s\n", + clock[i].clk_name); + continue; + } + + zynqmp_data->hws[i] = + zynqmp_register_clk_topology(i, clk_name, + total_parents, + parent_names); + } + + for (i = 0; i < clock_max_idx; i++) { + if (IS_ERR(zynqmp_data->hws[i])) { + pr_err("Zynq Ultrascale+ MPSoC clk %s: register failed with %ld\n", + clock[i].clk_name, PTR_ERR(zynqmp_data->hws[i])); + WARN_ON(1); + } + } + return 0; +} + +/** + * zynqmp_get_clock_info() - Get clock information from firmware using PM_API + */ +static void zynqmp_get_clock_info(void) +{ + int i, ret; + u32 attr, type = 0; + + for (i = 0; i < clock_max_idx; i++) { + zynqmp_pm_clock_get_name(i, clock[i].clk_name); + if (!strcmp(clock[i].clk_name, RESERVED_CLK_NAME)) + continue; + + ret = zynqmp_pm_clock_get_attributes(i, &attr); + if (ret) + continue; + + clock[i].valid = attr & CLK_VALID_MASK; + clock[i].type = attr >> CLK_TYPE_SHIFT ? CLK_TYPE_EXTERNAL : + CLK_TYPE_OUTPUT; + } + + /* Get topology of all clock */ + for (i = 0; i < clock_max_idx; i++) { + ret = zynqmp_get_clock_type(i, &type); + if (ret || type != CLK_TYPE_OUTPUT) + continue; + + ret = zynqmp_clock_get_topology(i, clock[i].node, + &clock[i].num_nodes); + if (ret) + continue; + + ret = zynqmp_clock_get_parents(i, clock[i].parent, + &clock[i].num_parents); + if (ret) + continue; + } +} + +/** + * zynqmp_clk_setup() - Setup the clock framework and register clocks + * @np: Device node + * + * Return: 0 on success else error code + */ +static int zynqmp_clk_setup(struct device_node *np) +{ + int ret; + + ret = zynqmp_pm_clock_get_num_clocks(&clock_max_idx); + if (ret) + return ret; + + zynqmp_data = kzalloc(sizeof(*zynqmp_data) + sizeof(*zynqmp_data) * + clock_max_idx, GFP_KERNEL); + if (!zynqmp_data) + return -ENOMEM; + + clock = kcalloc(clock_max_idx, sizeof(*clock), GFP_KERNEL); + if (!clock) { + kfree(zynqmp_data); + return -ENOMEM; + } + + zynqmp_get_clock_info(); + zynqmp_register_clocks(np); + + zynqmp_data->num = clock_max_idx; + of_clk_add_hw_provider(np, of_clk_hw_onecell_get, zynqmp_data); + + return 0; +} + +static int zynqmp_clock_probe(struct platform_device *pdev) +{ + int ret; + struct device *dev = &pdev->dev; + + eemi_ops = zynqmp_pm_get_eemi_ops(); + if (!eemi_ops) + return -ENXIO; + + ret = zynqmp_clk_setup(dev->of_node); + + return ret; +} + +static const struct of_device_id zynqmp_clock_of_match[] = { + {.compatible = "xlnx,zynqmp-clk"}, + {}, +}; +MODULE_DEVICE_TABLE(of, zynqmp_clock_of_match); + +static struct platform_driver zynqmp_clock_driver = { + .driver = { + .name = "zynqmp_clock", + .of_match_table = zynqmp_clock_of_match, + }, + .probe = zynqmp_clock_probe, +}; +module_platform_driver(zynqmp_clock_driver); diff --git a/drivers/clk/zynqmp/divider.c b/drivers/clk/zynqmp/divider.c new file mode 100644 index 0000000..a371c66 --- /dev/null +++ b/drivers/clk/zynqmp/divider.c @@ -0,0 +1,217 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Zynq UltraScale+ MPSoC Divider support + * + * Copyright (C) 2016-2018 Xilinx + * + * Adjustable divider clock implementation + */ + +#include +#include +#include +#include "clk-zynqmp.h" + +/* + * DOC: basic adjustable divider clock that cannot gate + * + * Traits of this clock: + * prepare - clk_prepare only ensures that parents are prepared + * enable - clk_enable only ensures that parents are enabled + * rate - rate is adjustable. clk->rate = ceiling(parent->rate / divisor) + * parent - fixed parent. No clk_set_parent support + */ + +#define to_zynqmp_clk_divider(_hw) \ + container_of(_hw, struct zynqmp_clk_divider, hw) + +#define CLK_FRAC BIT(13) /* has a fractional parent */ + +/** + * struct zynqmp_clk_divider - adjustable divider clock + * @hw: handle between common and hardware-specific interfaces + * @flags: Hardware specific flags + * @clk_id: Id of clock + * @div_type: divisor type (TYPE_DIV1 or TYPE_DIV2) + */ +struct zynqmp_clk_divider { + struct clk_hw hw; + u8 flags; + u32 clk_id; + u32 div_type; +}; + +static inline int zynqmp_divider_get_val(unsigned long parent_rate, + unsigned long rate) +{ + return DIV_ROUND_CLOSEST(parent_rate, rate); +} + +/** + * zynqmp_clk_divider_recalc_rate() - Recalc rate of divider clock + * @hw: handle between common and hardware-specific interfaces + * @parent_rate: rate of parent clock + * + * Return: 0 on success else error+reason + */ +static unsigned long zynqmp_clk_divider_recalc_rate(struct clk_hw *hw, + unsigned long parent_rate) +{ + struct zynqmp_clk_divider *divider = to_zynqmp_clk_divider(hw); + const char *clk_name = clk_hw_get_name(hw); + u32 clk_id = divider->clk_id; + u32 div_type = divider->div_type; + u32 div, value; + int ret; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + ret = eemi_ops->clock_getdivider(clk_id, &div); + + if (ret) + pr_warn_once("%s() get divider failed for %s, ret = %d\n", + __func__, clk_name, ret); + + if (div_type == TYPE_DIV1) + value = div & 0xFFFF; + else + value = div >> 16; + + return DIV_ROUND_UP_ULL(parent_rate, value); +} + +/** + * zynqmp_clk_divider_round_rate() - Round rate of divider clock + * @hw: handle between common and hardware-specific interfaces + * @rate: rate of clock to be set + * @prate: rate of parent clock + * + * Return: 0 on success else error+reason + */ +static long zynqmp_clk_divider_round_rate(struct clk_hw *hw, + unsigned long rate, + unsigned long *prate) +{ + struct zynqmp_clk_divider *divider = to_zynqmp_clk_divider(hw); + const char *clk_name = clk_hw_get_name(hw); + u32 clk_id = divider->clk_id; + u32 div_type = divider->div_type; + u32 bestdiv; + int ret; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + /* if read only, just return current value */ + if (divider->flags & CLK_DIVIDER_READ_ONLY) { + ret = eemi_ops->clock_getdivider(clk_id, &bestdiv); + + if (ret) + pr_warn_once("%s() get divider failed for %s, ret = %d\n", + __func__, clk_name, ret); + if (div_type == TYPE_DIV1) + bestdiv = bestdiv & 0xFFFF; + else + bestdiv = bestdiv >> 16; + + return DIV_ROUND_UP_ULL((u64)*prate, bestdiv); + } + + bestdiv = zynqmp_divider_get_val(*prate, rate); + + if ((clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) && + (divider->flags & CLK_FRAC)) + bestdiv = rate % *prate ? 1 : bestdiv; + *prate = rate * bestdiv; + + return rate; +} + +/** + * zynqmp_clk_divider_set_rate() - Set rate of divider clock + * @hw: handle between common and hardware-specific interfaces + * @rate: rate of clock to be set + * @parent_rate: rate of parent clock + * + * Return: 0 on success else error+reason + */ +static int zynqmp_clk_divider_set_rate(struct clk_hw *hw, unsigned long rate, + unsigned long parent_rate) +{ + struct zynqmp_clk_divider *divider = to_zynqmp_clk_divider(hw); + const char *clk_name = clk_hw_get_name(hw); + u32 clk_id = divider->clk_id; + u32 div_type = divider->div_type; + u32 value, div; + int ret; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + value = zynqmp_divider_get_val(parent_rate, rate); + if (div_type == TYPE_DIV1) { + div = value & 0xFFFF; + div |= 0xffff << 16; + } else { + div = 0xffff; + div |= value << 16; + } + + ret = eemi_ops->clock_setdivider(clk_id, div); + + if (ret) + pr_warn_once("%s() set divider failed for %s, ret = %d\n", + __func__, clk_name, ret); + + return ret; +} + +static const struct clk_ops zynqmp_clk_divider_ops = { + .recalc_rate = zynqmp_clk_divider_recalc_rate, + .round_rate = zynqmp_clk_divider_round_rate, + .set_rate = zynqmp_clk_divider_set_rate, +}; + +/** + * zynqmp_clk_register_divider() - Register a divider clock + * @name: Name of this clock + * @clk_id: Id of clock + * @parents: Name of this clock's parents + * @num_parents: Number of parents + * @nodes: Clock topology node + * + * Return: clock hardware to registered clock divider + */ +struct clk_hw *zynqmp_clk_register_divider(const char *name, + u32 clk_id, + const char * const *parents, + u8 num_parents, + const struct clock_topology *nodes) +{ + struct zynqmp_clk_divider *div; + struct clk_hw *hw; + struct clk_init_data init; + int ret; + + /* allocate the divider */ + div = kzalloc(sizeof(*div), GFP_KERNEL); + if (!div) + return ERR_PTR(-ENOMEM); + + init.name = name; + init.ops = &zynqmp_clk_divider_ops; + init.flags = nodes->flag; + init.parent_names = parents; + init.num_parents = 1; + + /* struct clk_divider assignments */ + div->flags = nodes->type_flag; + div->hw.init = &init; + div->clk_id = clk_id; + div->div_type = nodes->type; + + hw = &div->hw; + ret = clk_hw_register(NULL, hw); + if (ret) { + kfree(div); + hw = ERR_PTR(ret); + } + + return hw; +} +EXPORT_SYMBOL_GPL(zynqmp_clk_register_divider); diff --git a/drivers/clk/zynqmp/pll.c b/drivers/clk/zynqmp/pll.c new file mode 100644 index 0000000..626bb5f --- /dev/null +++ b/drivers/clk/zynqmp/pll.c @@ -0,0 +1,335 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Zynq UltraScale+ MPSoC PLL driver + * + * Copyright (C) 2016-2018 Xilinx + */ + +#include +#include +#include +#include "clk-zynqmp.h" + +/** + * struct zynqmp_pll - PLL clock + * @hw: Handle between common and hardware-specific interfaces + * @clk_id: PLL clock ID + */ +struct zynqmp_pll { + struct clk_hw hw; + u32 clk_id; +}; + +#define to_zynqmp_pll(_hw) container_of(_hw, struct zynqmp_pll, hw) + +#define PLL_FBDIV_MIN 25 +#define PLL_FBDIV_MAX 125 + +#define PS_PLL_VCO_MIN 1500000000 +#define PS_PLL_VCO_MAX 3000000000UL + +enum pll_mode { + PLL_MODE_INT, + PLL_MODE_FRAC, +}; + +#define FRAC_OFFSET 0x8 +#define PLLFCFG_FRAC_EN BIT(31) +#define FRAC_DIV BIT(16) /* 2^16 */ + +/** + * zynqmp_pll_get_mode() - Get mode of PLL + * @hw: Handle between common and hardware-specific interfaces + * + * Return: Mode of PLL + */ +static inline enum pll_mode zynqmp_pll_get_mode(struct clk_hw *hw) +{ + struct zynqmp_pll *clk = to_zynqmp_pll(hw); + u32 clk_id = clk->clk_id; + const char *clk_name = clk_hw_get_name(hw); + __le32 ret_payload[PAYLOAD_ARG_CNT]; + int ret; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + ret = eemi_ops->ioctl(0, IOCTL_GET_PLL_FRAC_MODE, clk_id, 0, + ret_payload); + if (ret) + pr_warn_once("%s() PLL get frac mode failed for %s, ret = %d\n", + __func__, clk_name, ret); + + return ret_payload[1]; +} + +/** + * zynqmp_pll_set_mode() - Set the PLL mode + * @hw: Handle between common and hardware-specific interfaces + * @on: Flag to determine the mode + */ +static inline void zynqmp_pll_set_mode(struct clk_hw *hw, bool on) +{ + struct zynqmp_pll *clk = to_zynqmp_pll(hw); + u32 clk_id = clk->clk_id; + const char *clk_name = clk_hw_get_name(hw); + int ret; + u32 mode; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + if (on) + mode = PLL_MODE_FRAC; + else + mode = PLL_MODE_INT; + + ret = eemi_ops->ioctl(0, IOCTL_SET_PLL_FRAC_MODE, clk_id, mode, NULL); + if (ret) + pr_warn_once("%s() PLL set frac mode failed for %s, ret = %d\n", + __func__, clk_name, ret); +} + +/** + * zynqmp_pll_round_rate() - Round a clock frequency + * @hw: Handle between common and hardware-specific interfaces + * @rate: Desired clock frequency + * @prate: Clock frequency of parent clock + * + * Return: Frequency closest to @rate the hardware can generate + */ +static long zynqmp_pll_round_rate(struct clk_hw *hw, unsigned long rate, + unsigned long *prate) +{ + u32 fbdiv; + long rate_div, f; + + /* Enable the fractional mode if needed */ + rate_div = (rate * FRAC_DIV) / *prate; + f = rate_div % FRAC_DIV; + zynqmp_pll_set_mode(hw, !!f); + + if (zynqmp_pll_get_mode(hw) == PLL_MODE_FRAC) { + if (rate > PS_PLL_VCO_MAX) { + fbdiv = rate / PS_PLL_VCO_MAX; + rate = rate / (fbdiv + 1); + } + if (rate < PS_PLL_VCO_MIN) { + fbdiv = DIV_ROUND_UP(PS_PLL_VCO_MIN, rate); + rate = rate * fbdiv; + } + return rate; + } + + fbdiv = DIV_ROUND_CLOSEST(rate, *prate); + fbdiv = clamp_t(u32, fbdiv, PLL_FBDIV_MIN, PLL_FBDIV_MAX); + return *prate * fbdiv; +} + +/** + * zynqmp_pll_recalc_rate() - Recalculate clock frequency + * @hw: Handle between common and hardware-specific interfaces + * @parent_rate: Clock frequency of parent clock + * + * Return: Current clock frequency + */ +static unsigned long zynqmp_pll_recalc_rate(struct clk_hw *hw, + unsigned long parent_rate) +{ + struct zynqmp_pll *clk = to_zynqmp_pll(hw); + u32 clk_id = clk->clk_id; + const char *clk_name = clk_hw_get_name(hw); + u32 fbdiv, data; + unsigned long rate, frac; + __le32 ret_payload[PAYLOAD_ARG_CNT]; + int ret; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + ret = eemi_ops->clock_getdivider(clk_id, &fbdiv); + if (ret) + pr_warn_once("%s() get divider failed for %s, ret = %d\n", + __func__, clk_name, ret); + + rate = parent_rate * fbdiv; + if (zynqmp_pll_get_mode(hw) == PLL_MODE_FRAC) { + eemi_ops->ioctl(0, IOCTL_GET_PLL_FRAC_DATA, clk_id, 0, + ret_payload); + data = ret_payload[1]; + frac = (parent_rate * data) / FRAC_DIV; + rate = rate + frac; + } + + return rate; +} + +/** + * zynqmp_pll_set_rate() - Set rate of PLL + * @hw: Handle between common and hardware-specific interfaces + * @rate: Frequency of clock to be set + * @parent_rate: Clock frequency of parent clock + * + * Set PLL divider to set desired rate. + * + * Returns: rate which is set on success else error code + */ +static int zynqmp_pll_set_rate(struct clk_hw *hw, unsigned long rate, + unsigned long parent_rate) +{ + struct zynqmp_pll *clk = to_zynqmp_pll(hw); + u32 clk_id = clk->clk_id; + const char *clk_name = clk_hw_get_name(hw); + u32 fbdiv; + long rate_div, frac, m, f; + int ret; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + if (zynqmp_pll_get_mode(hw) == PLL_MODE_FRAC) { + rate_div = (rate * FRAC_DIV) / parent_rate; + m = rate_div / FRAC_DIV; + f = rate_div % FRAC_DIV; + m = clamp_t(u32, m, (PLL_FBDIV_MIN), (PLL_FBDIV_MAX)); + rate = parent_rate * m; + frac = (parent_rate * f) / FRAC_DIV; + + ret = eemi_ops->clock_setdivider(clk_id, m); + if (ret) + pr_warn_once("%s() set divider failed for %s, ret = %d\n", + __func__, clk_name, ret); + + eemi_ops->ioctl(0, IOCTL_SET_PLL_FRAC_DATA, clk_id, f, NULL); + + return rate + frac; + } + + fbdiv = DIV_ROUND_CLOSEST(rate, parent_rate); + fbdiv = clamp_t(u32, fbdiv, PLL_FBDIV_MIN, PLL_FBDIV_MAX); + ret = eemi_ops->clock_setdivider(clk_id, fbdiv); + if (ret) + pr_warn_once("%s() set divider failed for %s, ret = %d\n", + __func__, clk_name, ret); + + return parent_rate * fbdiv; +} + +/** + * zynqmp_pll_is_enabled() - Check if a clock is enabled + * @hw: Handle between common and hardware-specific interfaces + * + * Return: 1 if the clock is enabled, 0 otherwise + */ +static int zynqmp_pll_is_enabled(struct clk_hw *hw) +{ + struct zynqmp_pll *clk = to_zynqmp_pll(hw); + const char *clk_name = clk_hw_get_name(hw); + u32 clk_id = clk->clk_id; + unsigned int state; + int ret; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + ret = eemi_ops->clock_getstate(clk_id, &state); + if (ret) { + pr_warn_once("%s() clock get state failed for %s, ret = %d\n", + __func__, clk_name, ret); + return -EIO; + } + + return state ? 1 : 0; +} + +/** + * zynqmp_pll_enable() - Enable clock + * @hw: Handle between common and hardware-specific interfaces + * + * Return: 0 on success else error code + */ +static int zynqmp_pll_enable(struct clk_hw *hw) +{ + struct zynqmp_pll *clk = to_zynqmp_pll(hw); + const char *clk_name = clk_hw_get_name(hw); + u32 clk_id = clk->clk_id; + int ret; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + if (zynqmp_pll_is_enabled(hw)) + return 0; + + ret = eemi_ops->clock_enable(clk_id); + if (ret) + pr_warn_once("%s() clock enable failed for %s, ret = %d\n", + __func__, clk_name, ret); + + return ret; +} + +/** + * zynqmp_pll_disable() - Disable clock + * @hw: Handle between common and hardware-specific interfaces + */ +static void zynqmp_pll_disable(struct clk_hw *hw) +{ + struct zynqmp_pll *clk = to_zynqmp_pll(hw); + const char *clk_name = clk_hw_get_name(hw); + u32 clk_id = clk->clk_id; + int ret; + const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops(); + + if (!zynqmp_pll_is_enabled(hw)) + return; + + ret = eemi_ops->clock_disable(clk_id); + if (ret) + pr_warn_once("%s() clock disable failed for %s, ret = %d\n", + __func__, clk_name, ret); +} + +static const struct clk_ops zynqmp_pll_ops = { + .enable = zynqmp_pll_enable, + .disable = zynqmp_pll_disable, + .is_enabled = zynqmp_pll_is_enabled, + .round_rate = zynqmp_pll_round_rate, + .recalc_rate = zynqmp_pll_recalc_rate, + .set_rate = zynqmp_pll_set_rate, +}; + +/** + * zynqmp_clk_register_pll() - Register PLL with the clock framework + * @name: PLL name + * @clk_id: Clock ID + * @parents: Name of this clock's parents + * @num_parents: Number of parents + * @nodes: Clock topology node + * + * Return: clock hardware to the registered clock + */ +struct clk_hw *zynqmp_clk_register_pll(const char *name, u32 clk_id, + const char * const *parents, + u8 num_parents, + const struct clock_topology *nodes) +{ + struct zynqmp_pll *pll; + struct clk_hw *hw; + struct clk_init_data init; + int ret; + + init.name = name; + init.ops = &zynqmp_pll_ops; + init.flags = nodes->flag; + init.parent_names = parents; + init.num_parents = 1; + + pll = kzalloc(sizeof(*pll), GFP_KERNEL); + if (!pll) + return ERR_PTR(-ENOMEM); + + pll->hw.init = &init; + pll->clk_id = clk_id; + + hw = &pll->hw; + ret = clk_hw_register(NULL, hw); + if (ret) { + kfree(pll); + return ERR_PTR(ret); + } + + clk_hw_set_rate_range(hw, PS_PLL_VCO_MIN, PS_PLL_VCO_MAX); + if (ret < 0) + pr_err("%s:ERROR clk_set_rate_range failed %d\n", name, ret); + + return hw; +} diff --git a/include/linux/firmware/xlnx-zynqmp.h b/include/linux/firmware/xlnx-zynqmp.h index 58a7478..a3ef7d6 100644 --- a/include/linux/firmware/xlnx-zynqmp.h +++ b/include/linux/firmware/xlnx-zynqmp.h @@ -72,6 +72,7 @@ enum pm_query_id { PM_QID_CLOCK_GET_FIXEDFACTOR_PARAMS, PM_QID_CLOCK_GET_PARENTS, PM_QID_CLOCK_GET_ATTRIBUTES, + PM_QID_CLOCK_GET_NUM_CLOCKS = 12, }; /** From patchwork Fri Aug 3 17:53:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jolly Shah X-Patchwork-Id: 10555375 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2C52215E9 for ; Fri, 3 Aug 2018 17:54:16 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 192BE2C724 for ; Fri, 3 Aug 2018 17:54:16 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0C5062C921; Fri, 3 Aug 2018 17:54:16 +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=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 49C8C2C724 for ; Fri, 3 Aug 2018 17:54:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731210AbeHCTv0 (ORCPT ); Fri, 3 Aug 2018 15:51:26 -0400 Received: from mail-by2nam03on0086.outbound.protection.outlook.com ([104.47.42.86]:53408 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727829AbeHCTvZ (ORCPT ); Fri, 3 Aug 2018 15:51:25 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=HocsRqPj2eQGjE2XVpEC9FN28XayA3mpJe4M6gte33A=; b=DVbqTpiA2yXpnQWWPpVJftOa3sDdxP2UsgIvh36sh/022OZPb/2EBvsnOiNqrkkzTEIizFi0jwUEOhnjZTn1QBRwplEsD2CJ8uXcok/IVmB41NKj7jm8hVYKn4MPSUVwh9E8E8QqFObEm4DtZTOnie0kisAvjy+z5odvapQNCuA= Received: from DM6PR02CA0009.namprd02.prod.outlook.com (2603:10b6:5:1c::22) by DM5PR0201MB3512.namprd02.prod.outlook.com (2603:10b6:4:77::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1017.15; Fri, 3 Aug 2018 17:53:53 +0000 Received: from CY1NAM02FT049.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e45::200) by DM6PR02CA0009.outlook.office365.com (2603:10b6:5:1c::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1017.14 via Frontend Transport; Fri, 3 Aug 2018 17:53:53 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by CY1NAM02FT049.mail.protection.outlook.com (10.152.75.83) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.1038.3 via Frontend Transport; Fri, 3 Aug 2018 17:53:52 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGu-0004fe-0k; Fri, 03 Aug 2018 10:53:52 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1fleGo-0007cn-Tn; Fri, 03 Aug 2018 10:53:46 -0700 Received: from [172.19.2.91] (helo=xsjjollys50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1fleGl-0007bh-UD; Fri, 03 Aug 2018 10:53:43 -0700 From: Jolly Shah To: , , , , , , , , , , , , , CC: , , , , Rajan Vaja , Jolly Shah Subject: [PATCH v11 11/11] firmware: xilinx: Replace init call with probe method Date: Fri, 3 Aug 2018 10:53:28 -0700 Message-ID: <1533318808-10781-12-git-send-email-jollys@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533318808-10781-1-git-send-email-jollys@xilinx.com> References: <1533318808-10781-1-git-send-email-jollys@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(39860400002)(376002)(346002)(136003)(396003)(2980300002)(438002)(189003)(199004)(81156014)(48376002)(9786002)(5660300001)(107886003)(81166006)(50226002)(106002)(77096007)(16586007)(8676002)(186003)(110136005)(2906002)(6666003)(50466002)(316002)(44832011)(426003)(39060400002)(47776003)(8936002)(478600001)(4326008)(54906003)(486006)(7696005)(336012)(36386004)(11346002)(26005)(126002)(51416003)(476003)(63266004)(106466001)(356003)(76176011)(36756003)(72206003)(446003)(2201001)(305945005)(7416002)(2616005)(107986001)(921003)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:DM5PR0201MB3512;H:xsj-pvapsmtpgw01;FPR:;SPF:Pass;LANG:en;PTR:unknown-60-83.xilinx.com;MX:1;A:1; X-Microsoft-Exchange-Diagnostics: 1;CY1NAM02FT049;1:Q3IxXRPxJrM39CbL4CERPcH1cxfk1IJkfmcqlkuiAYmyqmzmWXxBSOugUpiPScw3yqROTSsHMBCCLPu2aYih9HcwIVnE9dbiwZv5YTDUkJYU8+bzHCl3ZtAXvefIVJGw MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0045d393-b7d0-410b-a885-08d5f96a13aa X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(7020095)(4652040)(8989117)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(4608076)(2017052603328)(7153060);SRVR:DM5PR0201MB3512; X-Microsoft-Exchange-Diagnostics: 1;DM5PR0201MB3512;3:XuI9a6OU+Wix++X/W4xHpGLHgfrayqtIftW9xwgVabOIZThZL3AJjSrhF8y3EzUe7yPqJVAVf5/1ibvprgN39lOTsOjRab4GJyn/7Z97ZzOjlYMfXcrSu251wFqIhZNFxprkY6nohxGbCqh7PKUq0Hs/1C00Z8XhLT9e03DJC3lYJt8yZV7xJQWsMrheCinyD7wwwswauzy7+DUdIOI6XVrJ0pavF4U9lr3EViPi9G0zq6rcJRLbS1WOOsMafeRsKx5ZFOk4KJxVyoIT+llGcCxEEmzaMAzsFcemh4O0A5HSUSsIefplelPhqq2z1YaRVoGSRr6/aB7SNfKS73qVtMr+DopKEOPgU5qsRlgb1sQ=;25:gysTljDxV5yUd4qWs+8GiPCacf+WxzTD0KkPv8TTXIkE7ENdj7dJZjZJBhUTj8AYYdnBNb+5WbViDUJZeY8ilJ3v5RpNNYmmHqhY3inMp405adRuhVLXPfwkRKzf7jhyagbj7rz7TZ1XXL5bV0epyg/rDKlHOtLXVni5tfzCu/WWdxNsp72B6BBbs/qRTTBA7aA5ucho/Pd0wFKxWO6wJ0OFlugwlcEvI3zHKL7a1/utFp+9UA0H7Ei0smzMOP3jocu6NfwOzWV34VNN7NOfP3xCMbIdv492RcYZXuRzYYNpUZn82+xVIhbj2y6FeyyxSfEpUEzg2/OBHTMREU226w== X-MS-TrafficTypeDiagnostic: DM5PR0201MB3512: X-Microsoft-Exchange-Diagnostics: 1;DM5PR0201MB3512;31:m+GVFACqJrapL5HOpRPocBLFk4ZbV5+J7il/XZiG+65XMR/Rtw3MZEM+SbgFRX484g5X5xpqQHIQIWEPye4HWKWN9hGB8Wq1J2Mgo27fBSMCLg/jns3IOQs29Ey1MyrBbEH84gv4FDRrYxY2gRrrWmlJyp2sGGGeNFY5bvW1IF6Xq//ZXgCV/D+EjKhIu+EJa17PSlyuKufhhGr9XJJ9jSU+/EG4CkcRVlEbPZOp/sM=;20:cL3VcjGdsjeFPiv/AalGXMQBhvGzW7f7pePV/oAYht9i2zTvTVGUMehKQUojvGmXd3c3IhRlaIVMwVWu669YzdEfaQbY0/VlNo4LEhZC2sDV3R4zXCCkPI5DnY+Okxf8xbrtvVsdmbf28ekzWC71QXKC5tMgecldR2biwrPxpkB9/MvWolJLcgep6v2waxW5E4XfsZCRZANWW9HjaScIBT/MGJqMzg4mUxuqmrRTlsv7xaMEAebxDDKT1thUAVR0WIfuhOOApMlZsNTKDgm5870gC8dS8swG4Fr9VYzApkYL6a50LxMhVVZkBXXJpmKwzYPYzV/ay7HAn6Em9uL7We7EQW/dEJHubnh4+j5zQYMlyNBU7ZI3gHPvV3SKBbSRlzeAOJosWvzQWVhhivYbGTWaHoTHP+JbVCGArx4d68zIG5DOBtPPIE4BZsKeaJ8U2xhohSCtyaZSMgh+OqQpD4WLzceDlvJW9A2LXUxQolDkem7TQC8p0I4DgEGMR0R6 X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(788757137089)(192813158149592); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(93006095)(93004095)(10201501046)(3231311)(944501410)(52105095)(3002001)(6055026)(149027)(150027)(6041310)(20161123560045)(20161123558120)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(6072148)(201708071742011)(7699016);SRVR:DM5PR0201MB3512;BCL:0;PCL:0;RULEID:;SRVR:DM5PR0201MB3512; X-Microsoft-Exchange-Diagnostics: 1;DM5PR0201MB3512;4:0l/Jv9e1lvDhvWIGk/ia9KFrX1twnlhZ76AohX/jm3f6Xh9XFgZ2S7wMJt+nvRd/Ib5wPCNU/Qzz3nbyWCEUi/8bw3uJWshcREy2YMtOZNnN36vgS671yuWxEg1ACQnNfVlyJ+Qe4NXX+rXbEwOGiTsWdEKW+DND2tEvmsPYppLg+BS1j+2PmKZr9UAM2Dknm9gMq45UsN2bW9Tg1ARkd0sE0josKC+LmsRUwjkLuMf34CIshUL7/IV+xRrAEXBXgOgIh/+CVFCCqu4HGnZZPT0itExttJGvC9kUvXoMtjJTX9PoLd+IvrotXSa8glKK5YnIZ2RHLtVc2cz+tFNr3w== X-Forefront-PRVS: 0753EA505A X-Microsoft-Exchange-Diagnostics: 1;DM5PR0201MB3512;23:omq/hhH3pNMVCBhAnCz9tF3e7JVKzbi18jEm/z8jIlLu6OT02UXNvQtzoR9LV7LHHvsEOjGFylznycJXeBY1UI7JqCJhWyR/s5yrVPPfHiNTEGq3El2JgFhnwy23zXyPabYWUQ6cQhu9bwc3rxGYpdF/PSbfIDLgxb1yce/Kt4G1GWIhPo5ag/87tDYzJBQz5FllJEm3aqIB87riGEjWMxR+5Uq2YXz8wBfb4R/6Ieu4JGmmB68MMYYUWkbLbcT8ntvMRaH/GJoJjvEnARtXiq+rK07a9aXF9ef5oSfxDTJ6t1ivD1n65ELnPN4bfWhOOJGqX7pgy+/e5l4Gw7N0P8MCe5zggv72MS9KIZ5qqjz8mdP63AvKboW4SKhn3M5Lt2dpvTxHW2sppZLQ2+XuyR9Kf3BIviwcxgoxLYVSr1Yp4G6VTcqRsu7EPE5w33LTZyr1n3i+T/Cq8fmAW7GqLT/hB4M+UXq9ofiOgAu6oqZZuiyzk1yVdhQhCvuMK7qMt09KeTKA3GE1PH7fjQKbTIP5bmL3VkNQf9WrN9zlGhT9M3PWNMTUx86LyBmbxKrQP/al6iabmClurKjdnCGSxGithQ31eoeW2Z8cLT3vtyKi8UF79FBm4lVfK8gF5U6SBHb1xlNiHug7QUaGKQCd9Ue62xTf1Dq8NDXnra8mTf+BnwDiuF6Uw/thLWwKkX8ZovB7r1IxdT46TlMMWtVFun5GEV+LKU3D3YWwWHNxzL/MyG4x5ZbPkENvj9NR63rFhdV+f9qD6LCY9al3HMwmdeJNvEDfBa8EF+YLUUZVgwUCr9JQf9UutQ6fffEYKJeRjTlmuDczITziqjePpjjCVYoEpR0AlCeDiQjg/b5MdD0HAf1exlS8NFey1LWSqyi08VhvupekVK6If6eqwMeW+NFdE3EiUqrN0mWtA1Mf7hB69VY+TlX+QHhBqHQUKhIdVk3w1pJ2Q5LJw2lJPjD2eqKiyGO1nr41OYlsBsnYTgA1lk0UImYLkJvaZF7taJp8YM01HuEqDXOcv0eGAm6KNmxCRNyzHPXTtW1OC9DWEX/qM8rzXO8BKKXSz+YTRrlIHb6cSFliY02OCo2eFduIftx2Mctsu5+O4mIFPJBCXriudnYQoQ05V/s8kJKVi6UYAD8/dWU0YstWIqNuHjh6WBlWfE7zqgna0uzHpQyIY+FUta8PMmpmSBLr3jjG5dnzjNX2JhsNtsLj87qzswzKjmgU1Av6wcI+yEtsgA2hKhI= X-Microsoft-Antispam-Message-Info: he/DjG338vKuajrgDZYI7EwJ8Q6KUQQKX+oeKYnClkaH/ghslFgICr73cmv4e2msKjLmU2aa0Q2usW+CpWEvrUYJ91ccdmZK9V9tIg+gDGZPgY3+EH1D+23OK833ydfBm1VOQ9Cgo8HO5likY/fVqLCq+EwcfSsmb7butphGyDbhaONBoCdMwmsc1/cYZxLkuIwnEBaP4VcgN05mjuLgUUssiYcLQxUBjiXixr4pHTRsb05kCmzrmE5VlcoSWhLjKEE/W9+tR1dmBC9Qu1eRL+M6WdemvRntKLlpK1pxanDUV8ZkDNIckn5x473PJMS2KCaHxHwB/oyeIrN5CiBQYceYfpqeX/7p1rCWY+oYP8s= X-Microsoft-Exchange-Diagnostics: 1;DM5PR0201MB3512;6:aVC82kKHgujRRXR+zVcGqq+dEeufOqubZ1w4mewPXJWhgsy+P1ZoC+GQQ3Wlmv4IMrzt7mKRXXYbzmXr0K9yt3V9yflqDkOGroQF1k7s3+fVrJS6cJrCwjIsljvI2UMxRbxTFlrRs8AJWzwLdeyZnVoGYwpOFJd9QAlSQlnzKAbzUFVczaqTE/NF8cTdoX8QoQLVy5pQmleovFy9MQnnUWwrHLw3WG6AA8jJm6nr19if8Vh0grKf4zpnezrIjVR+UlD0G4ERewRu4AFh0DukfQlyVxMVCLHvsTlEbCIupYws2Olywmt8/CtqDwsTP6HZ5QHx+DeE9d9H1/ZcBd4LOPMjsNPWnNS3k5Khf4ihGvN0MPqtz4ciOFWf9oNQR6fJdFQI2RJOhvECM1RHy7eC0TI72g4CtYP3NFZ1SfYoZrYqcC5WzP8ROgfi0rYD4Z8J35dnl0UiTRTEoOMbIabm/w==;5:jPCXQGaMLKfaV5O43CLVmcJPLLHrSzyZBmhT+foS+PxamKpNbxdMv2wDs64/CC+qxjSVv+pB0szK4NFEP+C7RWQgCOiXVN27ZQGstzLjUZaMdurrheZ1N3rv/pqpb4HbfGadkLXsi5YenEVYk38C4G3wIw/RhNj8cYbwSHulIXw=;7:FSqZFJEiFryyrWsIwcicTfWFBrVNmeEVQWc4TcIrYOTGfyyYlilGQI3hqVFSCyoMNN9WLjzP/ayDDZdetAQPqbb2DiHNAkFI+fm/5xu/lL5KiAVAY4N1EGCHwcDfh2nDcdX2BlZJ0HW6cyHbEKCeaEPwxm4p4lN6EFrDVIDcQLIanqJnMC79O+dPlAQlwQwpo8m6zq8fZuO3IppSFtaDd7E36BxkwQlFPz/mZbfwcjm2m4U2HROhb44cloqPMsKI SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Aug 2018 17:53:52.5062 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0045d393-b7d0-410b-a885-08d5f96a13aa X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.83];Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR0201MB3512 Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Rajan Vaja As of all of child of ZynqMP firmware are platform driver, there is no need of init call in firmware driver. Earlier clock driver was init method so firmware driver had to use init call to make sure firmware init is done in early stage. Signed-off-by: Rajan Vaja Signed-off-by: Jolly Shah --- drivers/firmware/xilinx/zynqmp.c | 63 ++++++++++++---------------------------- 1 file changed, 18 insertions(+), 45 deletions(-) diff --git a/drivers/firmware/xilinx/zynqmp.c b/drivers/firmware/xilinx/zynqmp.c index 7ccedf0..ce6c746 100644 --- a/drivers/firmware/xilinx/zynqmp.c +++ b/drivers/firmware/xilinx/zynqmp.c @@ -476,50 +476,17 @@ EXPORT_SYMBOL_GPL(zynqmp_pm_get_eemi_ops); static int zynqmp_firmware_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; - - return of_platform_populate(dev->of_node, NULL, NULL, dev); -} - -static const struct of_device_id zynqmp_firmware_of_match[] = { - {.compatible = "xlnx,zynqmp-firmware"}, - {}, -}; -MODULE_DEVICE_TABLE(of, zynqmp_firmware_of_match); - -static struct platform_driver zynqmp_firmware_driver = { - .driver = { - .name = "zynqmp_firmware", - .of_match_table = zynqmp_firmware_of_match, - }, - .probe = zynqmp_firmware_probe, -}; -module_platform_driver(zynqmp_firmware_driver); - -static int __init zynqmp_plat_init(void) -{ - int ret; struct device_node *np; + int ret; np = of_find_compatible_node(NULL, NULL, "xlnx,zynqmp"); if (!np) return 0; of_node_put(np); - /* - * We're running on a ZynqMP machine, - * the zynqmp-firmware node is mandatory. - */ - np = of_find_compatible_node(NULL, NULL, "xlnx,zynqmp-firmware"); - if (!np) { - pr_warn("%s: zynqmp-firmware node not found\n", __func__); - return -ENXIO; - } - - ret = get_set_conduit_method(np); - if (ret) { - of_node_put(np); + ret = get_set_conduit_method(dev->of_node); + if (ret) return ret; - } /* Check PM API version number */ zynqmp_pm_get_api_version(&pm_api_version); @@ -547,16 +514,22 @@ static int __init zynqmp_plat_init(void) pr_info("%s Trustzone version v%d.%d\n", __func__, pm_tz_version >> 16, pm_tz_version & 0xFFFF); - of_node_put(np); + zynqmp_pm_api_debugfs_init(); - return ret; + return of_platform_populate(dev->of_node, NULL, NULL, dev); } -early_initcall(zynqmp_plat_init); -static int zynqmp_firmware_init(void) -{ - zynqmp_pm_api_debugfs_init(); +static const struct of_device_id zynqmp_firmware_of_match[] = { + {.compatible = "xlnx,zynqmp-firmware"}, + {}, +}; +MODULE_DEVICE_TABLE(of, zynqmp_firmware_of_match); - return 0; -} -device_initcall(zynqmp_firmware_init); +static struct platform_driver zynqmp_firmware_driver = { + .driver = { + .name = "zynqmp_firmware", + .of_match_table = zynqmp_firmware_of_match, + }, + .probe = zynqmp_firmware_probe, +}; +module_platform_driver(zynqmp_firmware_driver);