From patchwork Thu Apr 27 13:58:32 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Amrita Kumari X-Patchwork-Id: 756722 X-Patchwork-Delegate: yorksun@freescale.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3wFTN54H1Hz9s3w for ; Sat, 29 Apr 2017 21:43:32 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 1939AC21C85; Sat, 29 Apr 2017 11:43:28 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 33926C21C27; Sat, 29 Apr 2017 11:43:21 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id BC772C21C2F; Thu, 27 Apr 2017 14:01:17 +0000 (UTC) Received: from NAM01-BN3-obe.outbound.protection.outlook.com (mail-bn3nam01on0087.outbound.protection.outlook.com [104.47.33.87]) by lists.denx.de (Postfix) with ESMTPS id C0F92C21C2E for ; Thu, 27 Apr 2017 14:01:16 +0000 (UTC) Received: from CY1PR03CA0031.namprd03.prod.outlook.com (10.174.128.41) by DM2PR0301MB0607.namprd03.prod.outlook.com (10.160.95.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1034.10; Thu, 27 Apr 2017 14:01:14 +0000 Received: from BL2FFO11FD017.protection.gbl (2a01:111:f400:7c09::150) by CY1PR03CA0031.outlook.office365.com (2603:10b6:600::41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1061.12 via Frontend Transport; Thu, 27 Apr 2017 14:01:14 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BL2FFO11FD017.mail.protection.outlook.com (10.173.161.35) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1047.9 via Frontend Transport; Thu, 27 Apr 2017 14:01:12 +0000 Received: from ubuntu1604.ap.freescale.net (ubuntu1604.ap.freescale.net [10.232.133.7]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id v3RE17lm006531; Thu, 27 Apr 2017 07:01:08 -0700 From: Amrita Kumari To: , Date: Thu, 27 Apr 2017 19:28:32 +0530 Message-ID: <1493301512-29560-1-git-send-email-amrita.kumari@nxp.com> X-Mailer: git-send-email 2.7.4 MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-Matching-Connectors: 131377752741582779; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.158.2; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(336005)(39410400002)(39450400003)(39400400002)(39860400002)(39850400002)(39840400002)(39380400002)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(9170700003)(8936002)(53936002)(47776003)(104016004)(8676002)(81166006)(50226002)(36756003)(305945005)(105606002)(8656002)(85426001)(54906002)(50466002)(106466001)(23676002)(5660300001)(4326008)(33646002)(5820100001)(50986999)(2870700001)(575784001)(38730400002)(77096006)(86362001)(6666003)(189998001)(2906002)(356003)(2101003); DIR:OUT; SFP:1101; SCL:1; SRVR:DM2PR0301MB0607; H:az84smr01.freescale.net; FPR:; SPF:Fail; MLV:ovrnspm; MX:1; A:1; PTR:InfoDomainNonexistent; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD017; 1:mQlINFRKPpgukfvAM0XJobua5Fk9/zNi0GjCucptpyvWRIQWJYobBdh+nNWP+2Q5z0X6Cge+/mTu6jGQqocjnHDI5ZUsW28PO2cijkHSvm1LaW5G2ob19jZ63cY4QfT1ShOL8Pyju4bR/vH/M0XPeTnQFAEuBueeq5EBM0kMgQYbSd7CbxD/CWpzRBeuyca32mL/X0GDTHcCk/7dgH13rQdL3TMojJpdzetk5ulnvc9ZLAHtibCbzQCOQO1uL4n+KtCoeLo9bCd+ULPYuTQXC4j3doE4bkEq96gPB0llTLAnvxDBOTzWnNpWOS7aiBHsmOMRAI22Jlu33hTedrYFfmOywNLGOEFqRgcvdV/HTmJ15DItU23lk298wexzR4LNfi1Q3VMvWG0iFkz+BOry3IMtSLjn5ZleTP0WRIJhPgz9eB8Wpw4FpuRwq1WTD9V24EQUo5WrE2rlLBMUSbipVbHWq/FxS+Kny6qzto4y+fz9HlG2QAQrXFPFadvzPU7pZ4L1+BlOhoytFEu2+mqF7CjsrUqDqWoUHbrWxHZaf6+GJ+BYIfHn29oSLKpFaMP/niqo+fDDwyUyea+EYUWJDF6SIiwAXmtcsqEAliNHBLymQ1S2xMdiUWEK0TlGzfA2C1UspuAOrkT9R8/Z6a48BQ189cAfCpA3UIKhREc/Nl+cm1Fl25p8aVhBzC0uLZx3w/450DxXVuS9ShAI7NAubXu7SqnURWqDZlixhGY+wyg= X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 47ec6f96-9f39-491e-b65a-08d48d75de01 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(201703131430075)(201703131517081); SRVR:DM2PR0301MB0607; X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0607; 3:TEG0bz8XK6+9bA23xZIrUkmiPV7+J6/uhphuAh+6cTDKpJdyax9qz/bV2o1n1WaFqzVE2OEi4JdYhJhAddeo5K0M+9wF/HBPHn3hXDRNIgH/0DiYDcqs/PlftlbZwT/WnSewV4ewtYdZqo7G5O6GUr3ZenFQR9go+5Pe/p0TV+OpVG/G9ftRooEsjPTySpiUxVUqTwNzOud3/D7A1Pu0SGtncloVQzUW4ojQSLo4jiInBe7FtC3t9B9uvil4IURmf+hyLoZIWCLr6w8TUh6zRP1MsepK18Cfhu4uEDxDGM4Hym9kMN8nqCl8hKe7rskvC8pEh34S7RaAjUXMwMETka1Gw031Wz58vJElit63v4e0Pvz/gRd0pOz/GmRvzl7FIGbX2LbxvorQtuSqVNWAAmug1wPsVMDEbhLkF4vGEUj9F9o8Tp7u/6SDnTEwnywm; 25:HBInbewR1FvHB/5woh388mv7H/RwAfVlW7CGE9RFeaBYI8eXhh0dz44FzUJ0Ij0hteO1XL0ykmJtfpppjFs5P2r2B30eVarnBYcbiMuIYVI11TzJc+taUH6Wbu2VR5V+1oYKxvDMZO3ozAMtCXLLRETTWGkAptqCbYESEHjS1Jw9uuLHv+UECSYe3d3QocSqD/BEwzqI1O3ZZDZ8RbxWY07gM5vb1qIZVMHHrH8fOf1kM1p8FHmcTAArUtEzerlYMuyeD8dbATLKYt8dUj2lV2yPOXY/zax+dc4fGQAkacedaYfqP4lMYUsp8jh3qXnfcZnxSiBNh+b7Zu82C+qEYxomus7MryCb/rTaU3+BaWxWkDrKmuNMYHX0QXJy7FnLoi8lBCObOXXk/3Rj/zdeM/Lwkqj/RQ3/A5Bh8rTODWBMDJ2126OJu9pIzxszOrzx X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0607; 31:+ocf/dz1x7xtMZGTcgxsBt8DucNanNPWWbG1FhF5NnR4xxSwaUHJtItpwr6rzIXIdMOn6N2+OAR8h0QAQqZgculNKOJGxSB0n49u6z+2CWZ4YGtafF2lnmk0YtaBpu41sPEeL63WgsFHO2+b2B5MwbfNnngBrk9qkQpMa4wfWeUVlZhEgyYGM3CtYQT8e+l9DKN/XxZkgxQ9clZSBM6JWEfJ9pod23AxKRzsQ2mJLKcRAyN4F4cCvKcZxyozD50D X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095135)(601004)(2401047)(13015025)(8121501046)(5005006)(13017025)(13024025)(13023025)(13018025)(10201501046)(3002001)(93006095)(93001095)(6055026)(6096035)(20161123556025)(20161123563025)(20161123561025)(20161123565025)(201703131430075)(201703131433075)(201703131441075)(201703131448075)(201703161259150); SRVR:DM2PR0301MB0607; BCL:0; PCL:0; RULEID:(400006); SRVR:DM2PR0301MB0607; X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0607; 4:3TrSA2XpZN5WvglSXa0rQgCDhUrDuMt1Cj8mgrVpPVCtHXRMlLYvHOZ4pK0qgNf5SBcZ5unlbBo/DEb2RCknrjW2sDTlULwrp3OP4bXFX+q4YVOy8cqDv9ATRAP8rALM1qCJ5M5wXvDoJPsttGgruVsQ4QB7dSSHmH5kbrevtDKiz4HLgMvuYIchSvVBSq/cBO/UR+v80wbl9vDKejtBkrfNxjWdLj0TXpz1E1hMRDzg8IFBjDnGarJLrWupyEE/9rxgZFPLxeqguICzCgIf2mNZywJ2MnDy0BbEWDSuw9Ef8CBIpWnkwgGgpoUTTNI+Zic77gSDy/cMc/UjHNXk5hjvMIgwdc4JF04N4IctsBVAgxPWh0knBi1rN7Ztg0BL8jEumkqEkN67QmPiCUP11RO52PosdHbD0XGdhDJNRswgNXXS8XN2y3i/Vxi9Wi7yG6xBMGET/ojjVw6x4Lazu/OSmoXwnAXGfwQ9fScEN71PW8U+j12zm8FEmshR/JP+wsp342+2T2xoQSIpFV/yO45pBfkbvda79bPnElZf0KBF/q2hOYAvGxDDA5oNUpdQVOe5eNsDSv46SctZmj/wPRhFGSmYV9WJlRt9U+v2x2wvrJIDC8Lua5UuMusO7XR6hVAfTMgm/+3y0XxWf4R+QzolTe0HmtafJeI3zHjZkCtjB3WVCVWaXjWIdBZIaKDZ+5SfjtgCuTPNOe0Sjb1/NiyxGMEpZjl5QXH6zacrOfLvEYYoKJ5jwQ3euPHy4EMBT9VgMin+4CdVKoqyF9VOVyM3hKcno1+rtH00zFrIJTnK3rsa9cjvFcxfCx43J79Z+ie1esHG1Hw2eiRlt7BUX3gmnJa3UwLjyyRt4IfhzPUkehhHuhuOVWb+RkPXPwPTBpK4inhB7TsxlXobap0al0MT4nw/3CSlJsSOwc5llrk= X-Forefront-PRVS: 029097202E X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtETTJQUjAzMDFNQjA2MDc7MjM6RDhzVXg1eVNDUytsdm5PNmVucklHc0My?= =?utf-8?B?eDNDYVNzbjRUVXZEOXN5MkhLc1NEUVgyT1d3VEYvc3RXT1FyZ201dGxUSEVx?= =?utf-8?B?K1M0akxCbzgrTUcxNTdwQTRXZ2VRS3QxUmtNUUs4REY5YitISk1vcXJyTmpn?= =?utf-8?B?N1Z5TWU2NFJwMW5YaDMrWUkxQlVyQmIwUFBQaHVESDJrdFA4RFl1QVJub2FD?= =?utf-8?B?cjhqRmFNdno1SjZBb0FhOTU0RnRHUHNid1E0NnNSWC85ckZoQXhGcjg1M0dp?= =?utf-8?B?bGtaMWNYZ0FHZmJvcEpXZTdtMmk2dG5wWWhIUk1OYWxsZWJ1OEFQc3BaU21M?= =?utf-8?B?c2x5cUtidUt1RFJIT05RalVHNDNWR2JhTTFNSWJ6S2VnZkhEVG03MWtuampr?= =?utf-8?B?UnRjdTNndGkyMzU3ZXZFODMwdGQ0cTdOUXNzVkxWY2ZiLzAveXZBKzdpWTQy?= =?utf-8?B?c1ZHUTREYzZHMGIrQzlHdHlSa1orcHE3amgvZ01VNHpSdHFQeVdUQk0wYzc4?= =?utf-8?B?bW03RUMrQ0VFVEdobXlsZW9zNW4rNXJiM1JzOGhraTdoRkdqWXFubDh0blR0?= =?utf-8?B?SHRGVTJQMjFGaGE4NzJqUERrQUtCT3BpeVpsWER2anQ4bVUycTRNQXgvMnpr?= =?utf-8?B?QTRPOGUyRWNwWGdJdTgrS2t3RHB1OGg1bE5yeWJQY0o2WkErM01oc3VnV0s3?= =?utf-8?B?aExNUStCdllSS1Z2WDkyb0RNdm5PSW45c0I2VFJXZUlwUGxNcVpiWHBiY2JH?= =?utf-8?B?S1hpV1BqeHVBU3hpbWRQY1ZSN2pQZFJMT0xjME5ZV3ZRaWx1azVTQU94N0Iw?= =?utf-8?B?MVJCS0UrMDZaWmwrOEZaaFkwU1g3bFRyZzFDR2tPLzc2M2gwTUhZSnlqb2FS?= =?utf-8?B?U0VVQ2Y5Q2EwNDQ0YTl5V0NETXJLcVhSaTNyN0JXcUp2VHZ6bHd4UE9jbzZJ?= =?utf-8?B?NllvVjdhaWRvdHdnMnhqN0NGbnBacmdQN0dIa1N3a01ROW9lQ01BSzFaaXNB?= =?utf-8?B?aC9zeTZUdWNZazd1dlZZbmF5QW8vWDFScXpsVjkzWU0yYmk5Vmsrc1c2RUoz?= =?utf-8?B?RHZ4NHA3ZEtpTHhqT2JRSlFQeWdZSG55Z3V0MVRwZVBxY2djMXFNaWpuYlhX?= =?utf-8?B?MXVRTVoxMmhRZTVlejBqMEFWNEZoQU9Fd3AwZStqV3VQOVJVbjlQb0FSaUlC?= =?utf-8?B?cHMydlRwSHkxWTZ5cU96VzRDbGVOMm92VGRQaVR6RW5MTEwxMStPY3R5RUl2?= =?utf-8?B?Mk1BNjVhMUVRWVRmK1Nvak1XdWdCV3RSN3ZrUFhiSFRxakk3RWFyT3J0aXVv?= =?utf-8?B?Uk9TbHZJSWlzUjlYd0hLVU92U0lrRFNoWDBXRTRkS2dKL0VJcmFUVVFrSXNa?= =?utf-8?B?cVZXQm5BSlB1OFZrLzc4a3Y5SXhIYkplNHBtdGFvbkcvQjQ5MlZNamRCQkE5?= =?utf-8?B?MUthaDRoMFJCQ2NlbWJrVnYvTk80eWxuR0x3N05Kano5ZkFKMXF1M1h1QWZw?= =?utf-8?B?L3ZEaVJGbE9MbjNqeVNsdEZhWk9HV1NPeUdDaFREczR4N1l0aUJ1L3FHMm8v?= =?utf-8?B?N1I3VmZHQUwvRHFyNE94UUh0STZhTFJNQT09?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0607; 6:njCURJ028COXVDcM0FebuB7s4S3o6kW5mj9N2iv+C5C05GQK0LY0JNq26g28rOKtFLe6lMhXxE1e6ywtk68VEtTsFvnvtFb1kEwHvomeO1kStKCQE+5SuKhZcT3+B2kCuFi+GdtLprI7G+R7sm/euOt04Rc9BIxPsgBe11rw8Ggh0wNBXSAtbve+Gb0qneTwMvX8F1JgZUjPB8z0FtwAAYXamrH/RbGkwqEkTlxUd5k3dakB0l8OGkbS750+Ow5Hspzq1PzDjrrP7edVDVpHrleuVzouMiadNBAEE8eTpOjDMxJyzeCtcvF8ppK+f8sCoZDhU9SEW+p+/Ifzy3c66JUm1uCzfVt+82cBPW1Qe3dc8bPusbmeYbUmrEq2NsiqejGvnvAaq6A+32KK2OtBfm+v35OZTQ5qfFfLIa3N7aQMo7trOzHXaCIZZtdD5zEjX1ccnHMKSz43Em/SK1xcwylUIhDd0DF/Br/rSaQFN77+HSdlIYY4RX96eNNmVkld7kgEOydcIWxSiDfWH409bQ==; 5:PHp5EJ4KTwH2fHcIZVRwKQQSFsacjicABpbmfDcR4g9MGQ5YMM8LTOkiC7rbhBvrGV8pmSZCRVtgOtHdhKVeOVoQqWauBaDEqIZxZX9ZYagcKWJEaNCKbUcNO0bCmQAk1J9TZ2Yqo94cQDM9BPkl09u+tj5+Tf01fUSpbxvVSEipZjKqD6v/4tYWwChGU4ai; 24:wogmWGThtjLkDl59VJLeIw58CRAc4JHgOptoWZxJIFVDKYPAw3y84Kndm11gEISm3aORztIJIXHIKO7Svf0H9icmh8Ck1j+M3T24OkrUlaU= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0607; 7:UrdiLTQXhyWQAR5DNsjcjDP3ImLoHTG8dhwJOKHR+1T3xLxfXA++aOoVTJ61ohlE+L2JVQ6VTQnIOKRZZKklxjq4Y951eMxXUxWojldwiT3f//liU6OxKYLIB9vtKSklXvmKQJr6d2sg+aPGFnlg4hYa0/NLDwQCZ0fkR9NavaPZLJKmmG0jSaQNEeFCWPlmooRPGTP6l4ngF637ceiSpvtQ7oPsuM1UV6zH7OQ7Lw3gOKBaIH+pTtTpNJ50E1mx76471ZvK+ipj4mweeH2aaQeDLU4iRKfdILapaRnns0coYDdgLw7rice4wwM0YkkL3xxgKQa7nK9nt6xxT/v+gg== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Apr 2017 14:01:12.1770 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR0301MB0607 X-Mailman-Approved-At: Sat, 29 Apr 2017 11:43:19 +0000 Cc: Amrita Kumari , Raghav Dogra Subject: [U-Boot] [Patch v2] ls1088a: add VID support for QDS and RDB platforms X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" This patch adds the support for VID on LS1088AQDS and LS1088ARDB systems. It reads the fusesr register and changes the VDD accordingly by adjusting the voltage via LTC3882 regulator. This patch also takes care of the special case of 0.9V VDD. In that case, it also changes the SERDES voltage by disabling the SERDES, changing the SVDD and then re-enabling SERDES. Signed-off-by: Raghav Dogra Signed-off-by: Ashish Kumar Signed-off-by: Amrita Kumari --- v2: checkpatch errors fixed .../include/asm/arch-fsl-layerscape/immap_lsch3.h | 34 ++ board/freescale/ls1088a/ls1088a.c | 544 +++++++++++++++++++++ include/configs/ls1088aqds.h | 18 + include/configs/ls1088ardb.h | 18 + 4 files changed, 614 insertions(+) diff --git a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch3.h b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch3.h index e181ef2..17161a0 100644 --- a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch3.h +++ b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch3.h @@ -361,5 +361,39 @@ struct ccsr_reset { u32 ip_rev2; /* 0xbfc */ }; +struct ccsr_serdes { + struct { + u32 rstctl; /* Reset Control Register */ + u32 pllcr0; /* PLL Control Register 0 */ + u32 pllcr1; /* PLL Control Register 1 */ + u32 pllcr2; /* PLL Control Register 2 */ + u32 pllcr3; /* PLL Control Register 3 */ + u32 pllcr4; /* PLL Control Register 4 */ + u32 pllcr5; /* PLL Control Register 5 */ + u8 res[0x20 - 0x1c]; + } bank[2]; + u8 res1[0x90 - 0x40]; + u32 srdstcalcr; /* TX Calibration Control */ + u32 srdstcalcr1; /* TX Calibration Control1 */ + u8 res2[0xa0 - 0x98]; + u32 srdsrcalcr; /* RX Calibration Control */ + u32 srdsrcalcr1; /* RX Calibration Control1 */ + u8 res3[0xb0 - 0xa8]; + u32 srdsgr0; /* General Register 0 */ + u8 res4[0x800 - 0xb4]; + struct serdes_lane { + u32 gcr0; /* General Control Register 0 */ + u32 gcr1; /* General Control Register 1 */ + u32 gcr2; /* General Control Register 2 */ + u32 ssc0; /* Speed Switch Control 0 */ + u32 rec0; /* Receive Equalization Control 0 */ + u32 rec1; /* Receive Equalization Control 1 */ + u32 tec0; /* Transmit Equalization Control 0 */ + u32 ssc1; /* Speed Switch Control 1 */ + u8 res1[0x840 - 0x820]; + } lane[8]; + u8 res5[0x19fc - 0xa00]; +}; + #endif /*__ASSEMBLY__*/ #endif /* __ARCH_FSL_LSCH3_IMMAP_H_ */ diff --git a/board/freescale/ls1088a/ls1088a.c b/board/freescale/ls1088a/ls1088a.c index 034ef54..c57d112 100644 --- a/board/freescale/ls1088a/ls1088a.c +++ b/board/freescale/ls1088a/ls1088a.c @@ -20,6 +20,7 @@ #include "../common/qixis.h" #include "ls1088a_qixis.h" +#include DECLARE_GLOBAL_DATA_PTR; @@ -292,6 +293,547 @@ void board_retimer_init(void) /*return the default channel*/ select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT); } +static int i2c_multiplexer_select_vid_channel(u8 channel) +{ + return select_i2c_ch_pca9547(channel); +} + +/* this function set the DDR bit in case of 0.9V VDD */ +static void ddr_enable_0_9_vdd(void) +{ + struct ccsr_ddr *ddr1; + ddr1 = (void *)(CONFIG_SYS_FSL_DDR_ADDR); + u32 tmp; + + tmp = in_le32(&ddr1->ddr_cdr1); + + tmp |= DDR_CDR1_V0PT9_EN; + out_le32(&ddr1->ddr_cdr1, tmp); +} + +/* read the current value of the LTC Regulator Voltage */ +static inline int read_voltage(void) +{ + int ret, vcode = 0; + + /* select the PAGE 0 using PMBus commands PAGE for VDD*/ + ret = i2c_write(I2C_VOL_MONITOR_ADDR, + PMBUS_CMD_PAGE, 1, PWM_CHANNEL0, 1); + if (ret) { + printf("VID: failed to select VDD Page 0\n"); + return ret; + } + /*read the output voltage using PMBus command READ_VOUT*/ + + ret = i2c_read(I2C_VOL_MONITOR_ADDR, + PMBUS_CMD_READ_VOUT, 1, (void *)&vcode, 2); + if (ret) { + printf("VID: failed to read the volatge\n"); + return ret; + } + return vcode; +} + +/* read the current value(SVDD) of the LTM Regulator Voltage */ +static inline int read_svdd_LTM4675(void) +{ + int ret, vcode = 0; + + /* select the PAGE 0 using PMBus commands PAGE for VDD*/ + ret = i2c_write(I2C_SVDD_MONITOR_ADDR, + PMBUS_CMD_PAGE, 1, PWM_CHANNEL0, 1); + if (ret) { + printf("VID: failed to select VDD Page 0\n"); + return ret; + } + + /*read the output voltage using PMBus command READ_VOUT*/ + ret = i2c_read(I2C_SVDD_MONITOR_ADDR, + PMBUS_CMD_READ_VOUT, 1, (void *)&vcode, 2); + if (ret) { + printf("VID: failed to read the volatge\n"); + return ret; + } + return vcode; +} + + +/* returns the Lower byte of the vdd code */ +static u8 get_LSB(int vdd) +{ + u8 *lower = (u8 *)&vdd; + return *(lower); +} + +/*returns the Upper byte of the vdd code*/ +static u8 get_MSB(int vdd) +{ + u8 *lower = (u8 *)&vdd; + ++lower; + return *(lower); +} + + +/* this function sets the 5-byte buffer which needs to be sent following the + * PMBus command PAGE_PLUS_WRITE + */ +static void set_buffer_page_plus_write(u8 *buff, int vid) +{ + buff[0] = 0x04; + + buff[1] = PWM_CHANNEL0; + + buff[2] = PMBUS_CMD_VOUT_COMMAND; + + buff[3] = get_LSB(vid); + + buff[4] = get_MSB(vid); +} +/* this function sets the VDD and returns the value set */ +static int set_voltage_to_LTC(int vid) +{ + int ret, vdd_last; + u8 buff[5]; + + /*number of bytes of the rest of the package*/ + set_buffer_page_plus_write((u8 *)&buff, vid); + + /*write the desired voltage code to the regulator*/ + ret = i2c_write(I2C_VOL_MONITOR_ADDR, + PMBUS_CMD_PAGE_PLUS_WRITE, 1, (void *)&buff, 5); + if (ret) { + printf("VID: I2C failed to write to the volatge regulator\n"); + return -1; + } + + /*wait for the volatge to get to the desired value*/ + + do { + vdd_last = read_voltage(); + if (vdd_last < 0) { + printf("VID: Couldn't read sensor abort VID adjust\n"); + return -1; + } + } while (vdd_last != vid); + + return vdd_last; +} +#ifdef CONFIG_TARGET_LS1088AQDS +static int change_0_9_svddqds(int svdd) +{ + int ret, vdd_last; + u8 buff[5]; + + /*number of bytes of the rest of the package*/ + set_buffer_page_plus_write((u8 *)&buff, svdd); + + /*write the desired voltage code to the SVDD regulator*/ + ret = i2c_write(I2C_SVDD_MONITOR_ADDR, + PMBUS_CMD_PAGE_PLUS_WRITE, 1, (void *)&buff, 5); + if (ret) { + printf("VID: I2C failed to write to the volatge regulator\n"); + return -1; + } + + /*wait for the volatge to get to the desired value*/ + do { + vdd_last = read_svdd_LTM4675(); + if (vdd_last < 0) { + printf("VID: Couldn't read sensor abort VID adjust\n"); + return -1; + } + } while (vdd_last != svdd); + + return 1; +} +#else +static int change_0_9_svddrdb(int svdd) +{ + int ret; + u8 brdcfg4; + + printf("SVDD changing of RDB\n"); + + /*read the BRDCFG54 via CLPD*/ + ret = i2c_read(CONFIG_SYS_I2C_FPGA_ADDR, + QIXIS_BRDCFG4_OFFSET, 1, (void *)&brdcfg4, 1); + if (ret) { + printf("VID: I2C failed to read the CPLD BRDCFG4\n"); + return -1; + } + + brdcfg4 = brdcfg4 | 0x08; + + /* write to the BRDCFG4 */ + ret = i2c_write(CONFIG_SYS_I2C_FPGA_ADDR, + QIXIS_BRDCFG4_OFFSET, 1, (void *)&brdcfg4, 1); + if (ret) { + debug("VID: I2C failed to set the SVDD CPLD BRDCFG4\n"); + return -1; + } + + /*wait for the volatge to get to the desired value*/ + udelay(10000); + + return 1; +} +#endif + +/* this function disables the SERDES, changes the SVDD Voltage and enables it*/ +int switch_svdd(u32 svdd) +{ + struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR); + struct ccsr_serdes *serdes1_base, *serdes2_base; + u32 cfg_rcwsrds1 = gur_in32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR - 1]); + u32 cfg_rcwsrds2 = gur_in32(&gur->rcwsr[FSL_CHASSIS3_SRDS2_REGSR - 1]); + u32 cfg_tmp, reg = 0; + int ret = 1; + int i; + + /* Only support switch SVDD to 900mV */ + if (svdd != 0x0E66) + return -1; + + serdes1_base = (void *)CONFIG_SYS_FSL_LSCH3_SERDES_ADDR; + serdes2_base = (void *)(CONFIG_SYS_FSL_LSCH3_SERDES_ADDR + 0x10000); + + /* Put the all enabled lanes in reset */ + +#ifdef CONFIG_SYS_FSL_SRDS_1 + cfg_tmp = cfg_rcwsrds1 & FSL_CHASSIS3_SRDS1_PRTCL_MASK; + cfg_tmp >>= 16; + + for (i = 0; i < 4 && cfg_tmp & (0xf << (3 - i)); i++) { + reg = in_le32(&serdes1_base->lane[i].gcr0); + reg &= 0xFF9FFFFF; + out_le32(&serdes1_base->lane[i].gcr0, reg); + reg = in_le32(&serdes1_base->lane[i].gcr0); + } +#endif + +#ifdef CONFIG_SYS_FSL_SRDS_2 + cfg_tmp = cfg_rcwsrds2 & FSL_CHASSIS3_SRDS2_PRTCL_MASK; + + for (i = 0; i < 4 && cfg_tmp & (0xf << (3 - i)); i++) { + reg = in_le32(&serdes2_base->lane[i].gcr0); + reg &= 0xFF9FFFFF; + out_le32(&serdes2_base->lane[i].gcr0, reg); + reg = in_le32(&serdes2_base->lane[i].gcr0); + } +#endif + + /* Put the all enabled PLL in reset */ +#ifdef CONFIG_SYS_FSL_SRDS_1 + cfg_tmp = cfg_rcwsrds1 & 0x3; + for (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) { + reg = in_le32(&serdes1_base->bank[i].rstctl); + reg &= 0xFFFFFFBF; + reg |= 0x10000000; + out_le32(&serdes1_base->bank[i].rstctl, reg); + } + udelay(1); + + reg = in_le32(&serdes1_base->bank[i].rstctl); + reg &= 0xFFFFFF1F; + out_le32(&serdes1_base->bank[i].rstctl, reg); +#endif + +#ifdef CONFIG_SYS_FSL_SRDS_2 + + cfg_tmp = cfg_rcwsrds1 & 0xC; + cfg_tmp >>= 2; + for (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) { + reg = in_le32(&serdes2_base->bank[i].rstctl); + reg &= 0xFFFFFFBF; + reg |= 0x10000000; + out_le32(&serdes2_base->bank[i].rstctl, reg); + } + udelay(1); + + reg = in_le32(&serdes2_base->bank[i].rstctl); + reg &= 0xFFFFFF1F; + out_le32(&serdes2_base->bank[i].rstctl, reg); + +#endif + + /* Put the Rx/Tx calibration into reset */ +#ifdef CONFIG_SYS_FSL_SRDS_1 + reg = in_le32(&serdes1_base->srdstcalcr); + reg &= 0xF7FFFFFF; + out_le32(&serdes1_base->srdstcalcr, reg); + reg = in_le32(&serdes1_base->srdsrcalcr); + reg &= 0xF7FFFFFF; + out_le32(&serdes1_base->srdsrcalcr, reg); +#endif + +#ifdef CONFIG_SYS_FSL_SRDS_2 + reg = in_le32(&serdes2_base->srdstcalcr); + reg &= 0xF7FFFFFF; + out_le32(&serdes2_base->srdstcalcr, reg); + reg = in_le32(&serdes2_base->srdsrcalcr); + reg &= 0xF7FFFFFF; + out_le32(&serdes2_base->srdsrcalcr, reg); +#endif + +#ifdef CONFIG_TARGET_LS1088AQDS + ret = change_0_9_svddqds(svdd); + if (ret < 0) { + printf("could not change SVDD\n"); + ret = -1; + } +#else + ret = change_0_9_svddrdb(svdd); + if (ret < 0) { + printf("could not change SVDD\n"); + ret = -1; + } +#endif + + /* For each PLL that’s not disabled via RCW enable the SERDES */ +#ifdef CONFIG_SYS_FSL_SRDS_1 + cfg_tmp = cfg_rcwsrds1 & 0x3; + for (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) { + reg = in_le32(&serdes1_base->bank[i].rstctl); + reg |= 0x00000020; + out_le32(&serdes1_base->bank[i].rstctl, reg); + udelay(1); + + reg = in_le32(&serdes1_base->bank[i].rstctl); + reg |= 0x00000080; + out_le32(&serdes1_base->bank[i].rstctl, reg); + udelay(1); + /* Take the Rx/Tx calibration out of reset */ + if (!(cfg_tmp == 0x3 && i == 1)) { + udelay(1); + reg = in_le32(&serdes1_base->srdstcalcr); + reg |= 0x08000000; + out_le32(&serdes1_base->srdstcalcr, reg); + reg = in_le32(&serdes1_base->srdsrcalcr); + reg |= 0x08000000; + out_le32(&serdes1_base->srdsrcalcr, reg); + } + udelay(1); + } +#endif +#ifdef CONFIG_SYS_FSL_SRDS_2 + cfg_tmp = cfg_rcwsrds1 & 0xC; + cfg_tmp >>= 2; + for (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) { + reg = in_le32(&serdes2_base->bank[i].rstctl); + reg |= 0x00000020; + out_le32(&serdes2_base->bank[i].rstctl, reg); + udelay(1); + + reg = in_le32(&serdes2_base->bank[i].rstctl); + reg |= 0x00000080; + out_le32(&serdes2_base->bank[i].rstctl, reg); + udelay(1); + + /* Take the Rx/Tx calibration out of reset */ + if (!(cfg_tmp == 0x3 && i == 1)) { + udelay(1); + reg = in_le32(&serdes2_base->srdstcalcr); + reg |= 0x08000000; + out_le32(&serdes2_base->srdstcalcr, reg); + reg = in_le32(&serdes2_base->srdsrcalcr); + reg |= 0x08000000; + out_le32(&serdes2_base->srdsrcalcr, reg); + } + + udelay(1); + } +#endif + + /* Wait for at lesat 625us to ensure the PLLs being reset are locked */ + udelay(800); + +#ifdef CONFIG_SYS_FSL_SRDS_1 + cfg_tmp = cfg_rcwsrds1 & 0x3; + for (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) { + /* if the PLL is not locked, set RST_ERR */ + reg = in_le32(&serdes1_base->bank[i].pllcr0); + if (!((reg >> 23) & 0x1)) { + reg = in_le32(&serdes1_base->bank[i].rstctl); + reg |= 0x20000000; + out_le32(&serdes1_base->bank[i].rstctl, reg); + } else { + udelay(1); + reg = in_le32(&serdes1_base->bank[i].rstctl); + reg &= 0xFFFFFFEF; + reg |= 0x00000040; + out_le32(&serdes1_base->bank[i].rstctl, reg); + udelay(1); + } + } +#endif + +#ifdef CONFIG_SYS_FSL_SRDS_2 + cfg_tmp = cfg_rcwsrds1 & 0xC; + cfg_tmp >>= 2; + + for (i = 0; i < 2 && !(cfg_tmp & (0x1 << (1 - i))); i++) { + reg = in_le32(&serdes2_base->bank[i].pllcr0); + if (!((reg >> 23) & 0x1)) { + reg = in_le32(&serdes2_base->bank[i].rstctl); + reg |= 0x20000000; + out_le32(&serdes2_base->bank[i].rstctl, reg); + } else { + udelay(1); + reg = in_le32(&serdes2_base->bank[i].rstctl); + reg &= 0xFFFFFFEF; + reg |= 0x00000040; + out_le32(&serdes2_base->bank[i].rstctl, reg); + udelay(1); + } + } +#endif + /* Take the all enabled lanes out of reset */ +#ifdef CONFIG_SYS_FSL_SRDS_1 + cfg_tmp = cfg_rcwsrds1 & FSL_CHASSIS3_SRDS1_PRTCL_MASK; + cfg_tmp >>= 16; + + for (i = 0; i < 4 && cfg_tmp & (0xf << (3 - i)); i++) { + reg = in_le32(&serdes1_base->lane[i].gcr0); + reg |= 0x00600000; + out_le32(&serdes1_base->lane[i].gcr0, reg); + } +#endif +#ifdef CONFIG_SYS_FSL_SRDS_2 + cfg_tmp = cfg_rcwsrds2 & FSL_CHASSIS3_SRDS2_PRTCL_MASK; + + for (i = 0; i < 4 && cfg_tmp & (0xf << (3 - i)); i++) { + reg = in_le32(&serdes2_base->lane[i].gcr0); + reg |= 0x00600000; + out_le32(&serdes2_base->lane[i].gcr0, reg); + } +#endif + + /* For each PLL being reset, and achieved PLL lock set RST_DONE */ +#ifdef CONFIG_SYS_FSL_SRDS_1 + cfg_tmp = cfg_rcwsrds1 & 0x3; + for (i = 0; i < 2; i++) { + reg = in_le32(&serdes1_base->bank[i].pllcr0); + if (!(cfg_tmp & (0x1 << (1 - i))) && ((reg >> 23) & 0x1)) { + reg = in_le32(&serdes1_base->bank[i].rstctl); + reg |= 0x40000000; + out_le32(&serdes1_base->bank[i].rstctl, reg); + } + } +#endif +#ifdef CONFIG_SYS_FSL_SRDS_2 + cfg_tmp = cfg_rcwsrds1 & 0xC; + cfg_tmp >>= 2; + + for (i = 0; i < 2; i++) { + reg = in_le32(&serdes2_base->bank[i].pllcr0); + if (!(cfg_tmp & (0x1 << (1 - i))) && ((reg >> 23) & 0x1)) { + reg = in_le32(&serdes2_base->bank[i].rstctl); + reg |= 0x40000000; + out_le32(&serdes2_base->bank[i].rstctl, reg); + } + } +#endif + + return 1; +} + +static int adjust_vdd(ulong vdd_override) +{ + int re_enable = disable_interrupts(); + struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR); + u32 fusesr; + u8 vid; + int vdd_target, vdd_last; + int ret; + static const uint16_t vdd[32] = { + 0, /* unused */ + 0x0FCC, /* 0.9875V */ + 0x0F99, /* 0.9750V */ + 9625, + 0x0F33, + 9375, + 9250, + 9125, + 0x0E66, /* 0.9000V */ + 8875, + 8750, + 8625, + 8500, + 8375, + 8250, + 8125, + 0x1000, /* 1.0000V */ + 0x1033, /* 1.0125V */ + 0x1066, /* 1.0250V */ + 10375, + 10500, + 10625, + 10750, + 10875, + 11000, + 0, /* reserved */ + }; + + /*select the channel on which LTC3882 voltage regulator is present*/ + ret = i2c_multiplexer_select_vid_channel(I2C_MUX_CH_VOL_MONITOR); + if (ret) { + debug("VID: I2C failed to switch channel\n"); + ret = -1; + goto exit; + } + + /* get the voltage ID from fuse status register */ + fusesr = in_le32(&gur->dcfg_fusesr); + debug("FUSESR register read %x\n", fusesr); + if (fusesr == 0) { + ret = -1; + goto exit; + } + /*calculate the VID */ + vid = (fusesr >> FSL_CHASSIS3_DCFG_FUSESR_ALTVID_SHIFT) & + FSL_CHASSIS3_DCFG_FUSESR_ALTVID_MASK; + if ((vid == 0) || (vid == FSL_CHASSIS3_DCFG_FUSESR_ALTVID_MASK)) { + vid = (fusesr >> FSL_CHASSIS3_DCFG_FUSESR_VID_SHIFT) & + FSL_CHASSIS3_DCFG_FUSESR_VID_MASK; + } + + + debug("VID = %d\n", vid); + vdd_target = vdd[vid]; + debug("vdd_target read %d\n", vdd_target); +/* + * Read voltage monitor to check real voltage. + */ + vdd_last = read_voltage(); + if (vdd_last < 0) { + printf("VID: Couldn't read sensor abort VID adjustment\n"); + ret = -1; + goto exit; + } + + vdd_last = set_voltage_to_LTC(vdd_target); + if (vdd_last > 0) { + printf("VID: Core voltage after change is %x\n", vdd_last); + } else { + ret = -1; + goto exit; + } + + if (vdd_last == 0x0E66) { + ddr_enable_0_9_vdd(); + ret = switch_svdd(0x0E66); + if (ret < 0) { + ret = -1; + goto exit; + } + } + +exit: + if (re_enable) + enable_interrupts(); + i2c_multiplexer_select_vid_channel(I2C_MUX_CH_DEFAULT); + return ret; +} int board_init(void) { @@ -311,6 +853,8 @@ int board_init(void) /* invert AQR105 IRQ pins polarity */ out_le32(irq_ccsr + IRQCR_OFFSET / 4, AQR105_IRQ_MASK); #endif + if (adjust_vdd(0) < 0) + printf("core voltage not adjusted\n"); return 0; } diff --git a/include/configs/ls1088aqds.h b/include/configs/ls1088aqds.h index 00c91e2..69dee73 100644 --- a/include/configs/ls1088aqds.h +++ b/include/configs/ls1088aqds.h @@ -283,6 +283,24 @@ unsigned long get_board_ddr_clk(void); #define I2C_MUX_CH_DEFAULT 0x8 #define I2C_MUX_CH5 0xD +#define I2C_MUX_CH_VOL_MONITOR 0xA + +/* Voltage monitor on channel 2*/ +#define I2C_VOL_MONITOR_ADDR 0x63 +#define I2C_VOL_MONITOR_BUS_V_OFFSET 0x2 +#define I2C_VOL_MONITOR_BUS_V_OVF 0x1 +#define I2C_VOL_MONITOR_BUS_V_SHIFT 3 +#define I2C_SVDD_MONITOR_ADDR 0x4F + +/* PM Bus commands code for LTC3882*/ + +#define PMBUS_CMD_PAGE 0x0 +#define PMBUS_CMD_READ_VOUT 0x8B +#define PMBUS_CMD_PAGE_PLUS_WRITE 0x05 +#define PMBUS_CMD_VOUT_COMMAND 0x21 + +#define PWM_CHANNEL0 0x0 + /* * RTC configuration */ diff --git a/include/configs/ls1088ardb.h b/include/configs/ls1088ardb.h index 49349f7..b842802 100644 --- a/include/configs/ls1088ardb.h +++ b/include/configs/ls1088ardb.h @@ -145,6 +145,7 @@ #define CONFIG_FSL_QIXIS #define CONFIG_SYS_I2C_FPGA_ADDR 0x66 +#define QIXIS_BRDCFG4_OFFSET 0x54 #define QIXIS_LBMAP_SWITCH 2 #define QIXIS_QMAP_MASK 0xe0 #define QIXIS_QMAP_SHIFT 5 @@ -223,6 +224,23 @@ #define CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS 5000 +#define I2C_MUX_CH_VOL_MONITOR 0xA +/* Voltage monitor on channel 2*/ +#define I2C_VOL_MONITOR_ADDR 0x63 +#define I2C_VOL_MONITOR_BUS_V_OFFSET 0x2 +#define I2C_VOL_MONITOR_BUS_V_OVF 0x1 +#define I2C_VOL_MONITOR_BUS_V_SHIFT 3 +#define I2C_SVDD_MONITOR_ADDR 0x4F + +/* PM Bus commands code for LTC3882*/ + +#define PMBUS_CMD_PAGE 0x0 +#define PMBUS_CMD_READ_VOUT 0x8B +#define PMBUS_CMD_PAGE_PLUS_WRITE 0x05 +#define PMBUS_CMD_VOUT_COMMAND 0x21 + +#define PWM_CHANNEL0 0x0 + /* * I2C bus multiplexer */