From patchwork Mon Oct 17 16:09:40 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Tull X-Patchwork-Id: 9379819 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 866D26086B for ; Mon, 17 Oct 2016 16:13:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 74E4828D0C for ; Mon, 17 Oct 2016 16:13:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 630D228CE2; Mon, 17 Oct 2016 16:13:35 +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=-4.1 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED,RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id B7E8428CE2 for ; Mon, 17 Oct 2016 16:13:34 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1bwAW4-0003Ak-4b; Mon, 17 Oct 2016 16:11:56 +0000 Received: from mail-by2nam03on0046.outbound.protection.outlook.com ([104.47.42.46] helo=NAM03-BY2-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1bwAUe-0001KE-VX for linux-arm-kernel@lists.infradead.org; Mon, 17 Oct 2016 16:10:35 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=altera.onmicrosoft.com; s=selector1-opensource-altera-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=WpybI4v+3nho2+f9rW7X0aRtaGL+DaTMRKk0ao+wo8o=; b=bDSNTeqyg5EmzfQOj4XJrTCAPXprqM/mMgiWSIBiahsEny+SL8ttX7XnhaGtJEvReL6mJEdc/nQhqk2FL1vM+/TRcIyQpqkDpU0UFyf7qj/7Lc3gZpaVXeba7u/I0KWNwcFY/yX/OXdbgclzcl4yhjB7iea2/FseHDeChEfQwE0= Received: from BN3PR0301CA0034.namprd03.prod.outlook.com (10.160.180.172) by BLUPR03MB261.namprd03.prod.outlook.com (10.255.213.12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.669.12; Mon, 17 Oct 2016 16:10:11 +0000 Received: from BN1AFFO11FD027.protection.gbl (2a01:111:f400:7c10::161) by BN3PR0301CA0034.outlook.office365.com (2a01:111:e400:4000::44) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.669.12 via Frontend Transport; Mon, 17 Oct 2016 16:10:10 +0000 Authentication-Results: spf=fail (sender IP is 66.35.236.236) smtp.mailfrom=opensource.altera.com; vger.kernel.org; dkim=pass (signature was verified) header.d=altera.onmicrosoft.com; vger.kernel.org; dmarc=none action=none header.from=opensource.altera.com; Received-SPF: Fail (protection.outlook.com: domain of opensource.altera.com does not designate 66.35.236.236 as permitted sender) receiver=protection.outlook.com; client-ip=66.35.236.236; helo=sj-itexedge04.altera.priv.altera.com; Received: from sj-itexedge04.altera.priv.altera.com (66.35.236.236) by BN1AFFO11FD027.mail.protection.outlook.com (10.58.52.87) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.669.7 via Frontend Transport; Mon, 17 Oct 2016 16:10:10 +0000 Received: from NAM03-BY2-obe.outbound.protection.outlook.com (216.32.180.54) by webmail.altera.com (66.35.236.236) with Microsoft SMTP Server (TLS) id 14.3.174.1; Mon, 17 Oct 2016 09:09:49 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=altera.onmicrosoft.com; s=selector1-opensource-altera-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=WpybI4v+3nho2+f9rW7X0aRtaGL+DaTMRKk0ao+wo8o=; b=bDSNTeqyg5EmzfQOj4XJrTCAPXprqM/mMgiWSIBiahsEny+SL8ttX7XnhaGtJEvReL6mJEdc/nQhqk2FL1vM+/TRcIyQpqkDpU0UFyf7qj/7Lc3gZpaVXeba7u/I0KWNwcFY/yX/OXdbgclzcl4yhjB7iea2/FseHDeChEfQwE0= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=atull@opensource.altera.com; Received: from linuxheads99.altera.com (64.129.157.38) by BN3PR03MB1512.namprd03.prod.outlook.com (10.163.35.150) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.669.16; Mon, 17 Oct 2016 16:09:49 +0000 From: Alan Tull To: Rob Herring Subject: [PATCH v20 09/10] fpga: add altera freeze bridge support Date: Mon, 17 Oct 2016 11:09:40 -0500 Message-ID: <20161017160941.4205-10-atull@opensource.altera.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20161017160941.4205-1-atull@opensource.altera.com> References: <20161017160941.4205-1-atull@opensource.altera.com> MIME-Version: 1.0 X-Originating-IP: [64.129.157.38] X-ClientProxiedBy: BLUPR16CA0005.namprd16.prod.outlook.com (10.164.14.15) To BN3PR03MB1512.namprd03.prod.outlook.com (10.163.35.150) X-MS-Office365-Filtering-Correlation-Id: 2d3b3236-3ebf-4bcd-acab-08d3f6a81208 X-Microsoft-Exchange-Diagnostics-untrusted: 1; BN3PR03MB1512; 2:og6eJB5d2Hxcjtdy2QaZLxtmJx/KbQXP8P6UFQ/MpCaKs6k8MJhzZ9ZAR/12pr4CBLfnrWpcH/Nxcn9r59xaL7D8FO/vF2BxJXbJrkSOLU+1RlNswun/M0tMctgl74ameSaLDixm7jOIGWSsP6VM6PwbRacEkR6BEPkYdYTR5XT0oZ4FLbz9FBTDJ1FyepSMtM29xcupSonZ2+1uAXjbFA==; 3:JZkj+8HNZZITjzhSbciULroZ/po0BhyUsTxKhmtIDA246Z7y+JU+hiwGMi69AS1/KaYw5mrIIwRU1HcsEf7GsnPOSMwu/ys8xmCM4Ywb0MgaS95AYE535AGE9hTi3qwpBj84wRL8+OqFGwtnYx3wLw== X-Microsoft-Antispam-Untrusted: UriScan:; BCL:0; PCL:0; RULEID:; SRVR:BN3PR03MB1512; X-Microsoft-Exchange-Diagnostics-untrusted: 1; BN3PR03MB1512; 25:tB0gYrKWE97OZYnBvQlXuqaBYSHH7RvxoLXZq/dqS4e+9w0XPCQ6ISGo9JrdEZhh7jSQrENtRJ5qgdGTvDoOp69X8ljm6u18WbYwpAuuutDkdSAAjWy2xk0X41bai8+73N0L2PhIN2lQDITaWcfGcX5I7v8QaTNmTa+PhcEZTXnOeeIKBsfzKRTZgnMNGVijir7wSsEOSwxKahaO2GX+14A73RGDohYyGE++r/GoIU7Di/72vq7wkUFOh7dNkK4nGnV2mH6hB3MrcySXhtyF7DPrF5oxb/Im82w5t2n+MNKIOCGcT9U7nc2xp/E2jdvU1LHjgl226fANEiJpWsXCK4Z3QVj0APz0OU8wPQ4s9ke2f2nm0Ee1yGXmVDNRTGEm3IzBDYY7EWWJ4IDR7Dl/+FfpQfxu6PROycE1qh7a54ZTdHL7fCuV+XxUctiSS52s0R9BSj8rWHVVpzDsloz0Kp7GWxeGKC9RId/UMj9Sv9+diX18RcgO3jRhZu4bh+Qfy9eCFKZlyoAXG1Y7aRZwnXC7UPK9N5oIuf9hnfYXxBIAcDOaOvDMnNJ3rGjI0pAQjjXQzOfcJTz03vdK8+eLIANDIeKrqjuxDvGYIi1vS6CJX7qbnAd7C9XPAuCaS7/OfQ2ibe+VHFLK8VSZFeSsMrqLp3BfVo70QBvmQ4fIAbXV06s+PogST25VW5fEMSa4FeDHD6bO2n8NdC/LdaiCbd57oy1p3EB1SdwJxC5KzjTDuitrLyMph6D9G3iWQ1WwNpJ6ek3m6efArYMi4uQttx0z7mRuLURe8icFPOAYChSLHAh+LdoF5pa71u3JTh1aFIgGLyYW+4xBPQ3ciembxfFLYJqQ9vW+dRbCggUGOsbCA3DP7MXdPRSv+kxcyqlz X-Microsoft-Exchange-Diagnostics-untrusted: 1; BN3PR03MB1512; 31:VodpNQv6hxWV4oIYrj8GQNfw2FTaFt8qMXU3z05KBEtnpRpjTalZ28c/0dR0du6N3Y+t2KuWcQ38DjkZEFeekb3/fUWIgyWoHJj8ZTC6hYTmHe1nia323O1YUgd/G54w/C7SV9ntZoLwiYi2uwdn1bEvMsqEc8WqeQ1G92WwkSa0jKsvxBp9fBsTx8vCGGvW1pUMmjTDnouBQ8eRqujNO2CnVZijSHHnDmDhpLnh4KUqSQfJigq0EQqRl76qkAZE5nyi5dTs5gsg54BhzXQYgw==; 20:gdEiFFmlxta+ojui7XNfQsE/7WCxUOoOKMfZ3LxPzw3ODmvQ2rdyfnydxzzEvxBNXF3bklv9e+VhIKvGdZYaUnkAn+D8aqRP0VuXrY+/WXLDjbMdTQ+IiOAIpIEp5BxsGhRaDJKP7u5jWL4gujjU4OhClEJQjS3huP7EYy1gnyY= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(250305191791016)(22074186197030)(80048183373757); UriScan:(250305191791016)(22074186197030)(80048183373757); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6055026); SRVR:BN3PR03MB1512; BCL:0; PCL:0; RULEID:; SRVR:BN3PR03MB1512; BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(13015025)(13024025)(13018025)(13017025)(13023025)(5005006)(8121501046)(3002001)(10201501046)(6055026); SRVR:BLUPR03MB261; BCL:0; PCL:0; RULEID:; SRVR:BLUPR03MB261; X-Microsoft-Exchange-Diagnostics-untrusted: 1; BN3PR03MB1512; 4:EqKCAC7ZxBwKzjR2WYa8GACB9XOpI8dQRLTEjmQaB0FzIFfLS8WWAcVMEKBmMMvCcqqy8505x5sx3X3Djbloqjxgz/bltdfrfEx17dpd9vexBUJFa7lNCUzv/ea+Qp8az1pH43Xity/8VLVE8d92jN8fQSGWsoNDWccNo0WwDmuZOeZBHXZ/EgO5rrcp7wRcJMqcLAZ4ZvssPXiAGiPY0Iou2wgx8A3i4g3k1uBL5n/FaBLDFWFbSoZz73NsSrp7J+FQXkNkZyIJuqxe5mdF4U6Ks5GshBjTlziTpFEgBK+//C8q/HtVlsMVAbEJY2oOmOWQufVyR4oAram1zGILcLZ4+fP0gYbejjn4B61zjY0wuDesB1SpZSekLP84KLuUMNA4qxrHKNe/T0H2eiWD+FDxiDyJzryTuJeQ6B1YexUOLx3eNXRte1bVYY+N6LMvx8bXJuqTdFkINAfK9OFYsAlzGwqH6cM3xBZGXoJ3cOC/Y0EtjoL6pMMOeX9+YZjBNvc7CubGGXdHglC7EP+faMAnYe/xPd3QC3qt2xRgAFg= X-Forefront-PRVS: 0098BA6C6C X-Forefront-Antispam-Report-Untrusted: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(7916002)(199003)(189002)(4326007)(8666005)(5660300001)(53416004)(8676002)(48376002)(50466002)(86362001)(110136003)(42186005)(50226002)(50986999)(76176999)(4001430100002)(101416001)(33646002)(6666003)(2950100002)(42882006)(5003940100001)(229853001)(15975445007)(106356001)(77096005)(68736007)(66066001)(97736004)(7846002)(107886002)(7416002)(189998001)(7736002)(47776003)(92566002)(105586002)(586003)(6116002)(19580405001)(19580395003)(2906002)(81166006)(305945005)(1076002)(69596002)(3846002)(81156014)(7059030)(2004002); DIR:OUT; SFP:1101; SCL:1; SRVR:BN3PR03MB1512; H:linuxheads99.altera.com; FPR:; SPF:None; PTR:InfoNoRecords; A:0; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: opensource.altera.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics-untrusted: =?us-ascii?Q?1; BN3PR03MB1512; 23:HN4CcCzmB8iDRs2fNSGG0mhT3xmN2Um72M67WfO79?= =?us-ascii?Q?JAP0IXloPoONspOm4o/FTZayS7ZlNlv8VslBycZ1NfZ5cdll9XxmbfNGWn6K?= =?us-ascii?Q?gnXlKFCeC/wTZIpRMeNvq91GBfBJkXTQqdcd4DIZfYPSZFbeIxAsq40JjGda?= =?us-ascii?Q?6OJKzdeFddXUkNU3+XwcLgOXoJ3dunhk0gs9hE9zeSRMEfZQ19tLClTAJKSN?= =?us-ascii?Q?1wTnX++qvyFkdRI9it408GjsbxfOe/aONU2LBDjxdiiPETUFvk++jwznZnSK?= =?us-ascii?Q?SPaIX3IEfD0fAQXRtEyxZd1oPazA0DGIIaXvLD5shnBJxY40fJemnznK3FIT?= =?us-ascii?Q?zzwAfjhx9Yw7hkIq6iJWB4MXO5EDPpgmfhyeI/hU3v1fvGu+5CdZpX0NSdVs?= =?us-ascii?Q?eUVZlkX2HbVj04mWghlp51m9ewh2VZ8qLZAJqnHDZad3Y4NqdwOQuAiGac3d?= =?us-ascii?Q?PGQVRSvPBh0wZ/45b8nN7N7+TNGzfk8Z2R4/VGgFxYHe9iA3RmCqR39tgjCS?= =?us-ascii?Q?ajy7a6Mtd1NWk/CcfhbbvrDSV9Aum0kPPk9vtOUJT6IpK6Fe+jTWqqv66gOv?= =?us-ascii?Q?yrDhmuJEyhyC937fIaew+woLwyIdp8jNSf697k6oGJ41QpN+X7ZGNmRgq5/Q?= =?us-ascii?Q?tmxaWIUVsLv/DfWOzmYRPVJYooQGTzVq/hbyTGgwg8nylQTKUv6GcwFpSf/M?= =?us-ascii?Q?M8WOQcJEWnEJ5BPQ1MwYPtgT+G8ZhFXpBAF5iwUqbwGIsGYAqprnVz7e/o47?= =?us-ascii?Q?xcrN9yq2ne6MgRdYIGw/fL2/pd8PYmrxIh1nycmM2ZMGk7ZIgqMNYEZT/sa4?= =?us-ascii?Q?lBl296D0Wa8BXjDi1QkrtQLI1FQQ3x73BKrCWotM2ByilmJ3/QW98doCG0xv?= =?us-ascii?Q?0o7X2lpNPCHS2je7FuQApaMyKaZOqfc7J57+puCDcNvMb+5c3f1hE9u2smLq?= =?us-ascii?Q?JKEE7evNscMaLJpTTEHB5rYsYpkLAB336TczRAStscgE9nZbH1lwrp+s7Row?= =?us-ascii?Q?pM/KYc7tkf8YrMrPCegA50t8EHmnacdgH3izAxP3vYCJ0e11su+0+iB8g3SC?= =?us-ascii?Q?/JjZWJvPeKtYk5xbwnQLUN6D1a+1kj2mB+HV8zXNccpaEooSTG5btg8+pQoh?= =?us-ascii?Q?Nobm2/maFHiwPgvhrK2ppbDheRbKswp508iF32XJ4rkHx/PI18/5e6AbLL0+?= =?us-ascii?Q?bm/558noTY3NjQX1jdYX5kpXGfsYHFk8VxEapzaEAMIoLSvaANzFuYliiI4z?= =?us-ascii?Q?50IvZdrB9ZJx7ymizqU2ZNH6Xv5p55nNrJ3ipqF?= X-Microsoft-Exchange-Diagnostics-untrusted: 1; BN3PR03MB1512; 6:8xi9hrgQafmwz5JhIdD1RqC7I0SNpFg75CGdI2uO6Y95jO6rtbBpVilppns0GkPQX61jjNHEiMR4tAhlQ5maLDNwn5R5724WLCsdQADDXVU26X8LrDnVjtqoktnFkrBXw39HYY9OD2qxFNsMV18FWU5IITgvAbPvwNFBhgQhOlYrualmg4hawTYfSaM+I4zDBjHK7nOGIi1MmRjVcdWcCygbA9OSfJeTZAqLHsCFxwn8xGNCLmVVbPjHwNHiGvXn/0fD7lK1OKLt/PvBVICroFMyXfemqIETiYgCPci/7V1MtoBKMlISGmZxxKz8y+Gp9mhlKZVjgtbNmRDQNc4AnQcmaOaNwslBz92lR76jQV8=; 5:9lDvbXT4qcqHW55q1lzzyp3kRJdXSknLIvxJyGaOvU76ZuwUaU33fI0/z0kjX//jaQe4EwQ36D8oy/qyJKjcDoV30E/Z0URIXk9MHoi9IBGO/VBUrQN+jmAxJ3vIxHUZ2qCOrkPiLIBakn6QNZwjvQ==; 24:3MWogIU6y7zzCUmVbnXkspwHrvdW5+N6i664Kba/TLKmoZAsvfjX8UWDloE5CCsNXokULooOc7owWB/xWZl2nnDn+YH7pmBFZMac9LBd6cI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics-untrusted: 1; BN3PR03MB1512; 7:m/THlXGXOmqi3XkL7reJotDmvaoViqQvZt/DDjdZfS3hPuGi/MZJafIS3pqjT/sfbnZA7w4Vx1bAQA8CTvljA81+6WEscq3K2NMTFuk4lijnht9cEWHgrCtqdf52gIvlZPru7qUFJCH6lIRPq1jYNddLj16/lHPzfm+oKT/ayrHDuhKu2nmcSXSlmRMUNQq420FqFLupT26Ei+X2vhp9tx+/Aek1P7aG3RAs2E8GnMob0RsNLbn+4a4f++rXkMFOzg44AbF+lC4YmI7FGT05TlEFXzMDidrVrGp2Um1i5whjG1PYYVPKMS2CkH2QqaiWoiKk65bKsGm3AL2k5mDAtTyaz5oT/63DegJqS0kqsTw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR03MB1512 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:66.35.236.236; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(33646002)(336002)(3846002)(110136003)(107886002)(8676002)(105606002)(68736007)(586003)(87936001)(11100500001)(4001430100002)(86362001)(5003940100001)(3720700001)(66066001)(81166006)(81156014)(50226002)(85426001)(8936002)(53416004)(47776003)(956001)(97736004)(19580405001)(48376002)(19580395003)(305945005)(6070500001)(15975445007)(92566002)(8666005)(1076002)(4326007)(106466001)(6666003)(2950100002)(76176999)(229853001)(50986999)(7846002)(7736002)(50466002)(2906002)(189998001)(5660300001)(42882006)(7416002)(356003)(6116002)(626004)(77096005)(7099028)(7059030)(2004002); DIR:OUT; SFP:1101; SCL:1; SRVR:BLUPR03MB261; H:sj-itexedge04.altera.priv.altera.com; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:0; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD027; 1:mTXbf3cZqj49YP3J3aeXHyAJL0tKL/PH7VUKxPD2jZ6FU5BpgpD4IsQ/ZhM6pIN+UbCbd/DT20IJ0ePZm7rB329IxZnGOAjr4EKpQnxIgJzM6Pz+XVoJrqP2s7fO5aB3V2WusegvMxQnvSX9fm/5jzm7rVY3SDtbF0mkl09dvGeCQVfXHWzs1KBVt2MYOmylo/hAuuzU9OLSlMLD4YQ+LI8M7AjarcuYfH/8wf/5xA/MCt4isnxlrqmMcbPoztNVNh9V20xmeOVBo9p4lSllEgnDmqBACHBTdpgwa/h/N1iwXdDwvFxITjRNKaAKkPUpps/KFjjcxmjoNR1RerrDjLX8fPZ/c73LzX6GQaV9EIfZT3lpM6sn1gIT+4IocS7iL5SGxzg0W6UX+PsZ/QldU5g65NDbqS3CbAHbPXoBU7M3e2q41ZttbTh+Q92qCy7owL6Hp+HEffmgsL67BVj3PemrU4fbPIdQeTQhw5fxaX/JuE9gNUCGSZj0zqntByFX6HL/IMyjwtg/Xf+z1PCEjCn46Ldplrk0tiHQblkgxQjf6sqfGk1YP0R0DdQG8CuaX66RCCBG30aQTLK7MY4n8KYZfCTspgtHbqy+sbxWZoQAqkUVKzjYTIn8antKnj1s X-MS-Exchange-Transport-CrossTenantHeadersStripped: BN1AFFO11FD027.protection.gbl X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB261; 2:mq2EfxvvH8udwvOL2D5lussUa3r0fiUpEojpr5+g2mI64c+FR4czvKIr9vfNAjYJr1bjc1pGaRhSbZXgJCr7bZrOYArfACBKvdABj8d+Z2GDU0mjeT65gHFLdj84QicOc35RkEOajuIShCkgBC5ecwOIKYzq4qo4D1L6hsQq/g4y+dLD60jJOO7BdIpb0g9Qou+xdu5KhkSBPMw2xAomAg==; 3:+VjLFnmUtTsc5C0U0kHC64f6B32KWoaj1Aa+gG8V1GnH3OQnwaRrLGriF1wL1zEnc9C02C7cbQVeGATk0yg2Q4ccO6/VMObw7nevnP11sYLCKs21tuYXaO9eKdYueJ2ifhZi34b4IQkgLdWQ0GelMKCocA9LIrUJpfccw8ntVzHZRT0OmAtf+h/6r7oaztr8s4wwAzn5XCGrLRs4q5T6TGH9dQkvzwWooSLv88yvIbVI2B2D8qalM50+MAMUBNOeXAw9XPdN9Nhp9X4DkBzJWw==; 25:xE8w94fq/m6pj1hx0dJye3MLQ7u46eHQ518w686EIglvWta9NyyPjY9ZLF+7mxbpASL7bM9JrrKZZZ4iq8l3OizIRbmEXAjTjhlRMkMWeo0W2QAJyexsm1gxzNzTz5V2AJoFJ60SpcSJ52JSNpxDGr7LSCv4CexaQkxV/2S/x4IKUxXG2WszidNTyiu06FscCC6bh+5V7VRq51Zb+SISHuiv02ensxxQt5s641ErrVoFjEpizV6WwH/ICBuFPQj0G1n75PK8b/tnV1UD1BIlVlAgvh7N00NUeVu9w69jv2i3YY0wy/Dv+KLU0/2cFH9o2TCnkrOucm0c0RQ6pIo1Cy+aYJXzxjtOsaoqeRaM+lh4kPQJHCTlAlgnS73IbdKBCgilFw8uAWYh8hPoyD77FSJURnWI0dZ4yOk1krKCqREuZZwHby0p37jGDPHrPBRo2kBmAPCqaLZEuwPfokh1nA== X-DkimResult-Test: Passed X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(3001016); SRVR:BLUPR03MB261; X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB261; 31:BHEwflBWNnKxAkzO7ZmO7Qsrq2bdT39PHNSnlPdrPkNP+XI8X0WgbicbPCEMCGQUJ+diNBHgQrKpe/6b5ICAxJYR6nGIPuUrzTNnqefn85/zEU3kvFenBsXbI79HX9g74W32SoU8AztlWLaKdb/Q/fvK6mMgZZzXWu00UGB8gnrcs9hah4ue2wldEGBJrrwp8rn4PXj4MPjbDeMrKXk+F5R3Y82RdtpcRd/t8d3ZEl9XEaL9+8DohZD65V91eHlz5TZUDq3ARfVA0opMtbYBdfRtZc+BSIFVn8F50jI6NUI=; 20:J3kvkWRmfbp44BaChsp2/9jIf/3ZERRoVZ4MhtqhhZVgn43euujKl5UPEd4/dIZwocGF8kytpRqX4Zzj/2OFR4CFArOKg1zYQU7VJPkLdJNKk7bcHmVtyjYZoro3bKBUwPZieotzRiSCiXUCtgONlutc/oCa9BnC/xI/Ca81eNM= X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB261; 4:bCxNHUQGbXkxEidk6M2Smd963/RDjKp5NjipBI5QI7QABJLyABiQZPc1o7Nj5JaeHGg3zHUy2qJWR3+5ZXq5gWzoT6yDwjOTN1pvIPjWgwUXbqZ6+GiL1pHGamszSSEmo33KPT2BS6jxgIVLCO8r3mkiFbNl4j4zOQHU+xrTtbwSMK3omTlzKhip5zugyrW4YvfPvZLu/9FFbPS4q904drZ01r+ZpmtfGGaBVYglLIkkGUmWu+tqUFmlNkfg8mBD3ETrs3ZBbiczzWghPWC5oeSmY3Mb8RipcB5l0x+a94/q5nf9vnvPxHCmOOGkQ0t1OyFLoM7geh4WVrd5bARTfS1Cx0Fby3U957BIt2eHEIyLjLPCyNQ/17is0LJOje7wpYHK+g8N6DxoCwgfVEi8kv3vTF0BgDch0jUpSrvAsD69gYCAE32Abf/QH//++6rWtHuhzFyDAoCfAZ72wC/Y74PAk/yTZSWIA6gEf/WBPQqd//oA+nhtRnOMNB3MeWgOdbnkk9Nu2kPvFxr+L5pBMjO2D2xm8spJF3DagYlvuTdNLY1lSOukF8Ibl0Zpd9Hius+4EJxxKl5CrrOH8UDYAbwpteqZu0+SeMCRPjZXcBgBhXRnBJ3mvw3NeSmw/qLI X-Forefront-PRVS: 0098BA6C6C X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BLUPR03MB261; 23:GhwVsrp2QT8XGl2WrxNyE3kARFjYTLvZtSGHCuQLt+?= =?us-ascii?Q?l2CCGNS7p7LpFjmDGkG0rtbzde3PTc9f8R0x1SG8uVgkiqy4zRl/1Yl3MPqf?= =?us-ascii?Q?UHRHt5bV2PHFBb62xv8C4erITvNwxulRzaTsu7/d5fIAXqRcjjWBwG++au7j?= =?us-ascii?Q?p7sRmWsilj6RTDvJSw/Yl37y1cMgrn4MJ0nFYiUnK0JpAOg7m3oxiSqpsCgP?= =?us-ascii?Q?CKsA81Wj+NVTQ84z3Pf11FXPxPG2lLdDr/ZVHrdqwydygXCN6nak42RHhfw6?= =?us-ascii?Q?+RcZ9Q3mkaUFACztwdm6V6uX0bBvzbaFgg7U7vippMe/Jv92J3FYP3Pq7zTS?= =?us-ascii?Q?K/0a1ATI85AX5+BP1HtN/HdLLSkYtBLK6no+z8NDI/cVm6lxn7uvBF6grjn/?= =?us-ascii?Q?6QVYyyPl5ecwkwuOJ65JXny4rctBokngNW8mIcGeyigpyJ2EwDkLCvvYIoTF?= =?us-ascii?Q?OoxknVggsaKY0+J1xj5mOV2mqapkA6rXBwlsg7VeBoLsUUbZNxM1oxQ1qOUL?= =?us-ascii?Q?ag4Bdboe0j85j0bBg4MJv0pk1hIVzEUYe/xbMzN46OstSpOENfJ95taXmexM?= =?us-ascii?Q?VPLKPp4jv+N8OPzDuYkVK+ZL0W4dbIXgxu5IBVu+sSjG3FrWqVVzueXoKXZB?= =?us-ascii?Q?SsSSklo1PAnvZQIZay2g/Zt8Nn/QrxwUBwjzYzsKoLkUIr6r7jJSpBYClocF?= =?us-ascii?Q?UKJKlz/pt6jVKtnbp8VaD9/Da0ZGQV+ySpavrXHaHvdEBBYIy+bFvmch06iq?= =?us-ascii?Q?M6Q6URBgXHe9NjjGpJ7geWCPmTxvZdikh6QDX32/iOLXbvDJ+YzPp2HrzgqP?= =?us-ascii?Q?r/UYDErW8He4+TK0zR25chi4ixt1iDxnVavHnFaG8Hcg/hAQI12D6kXEludW?= =?us-ascii?Q?qzJxSVcUH6nL5wep/5bdgNOA8e01Jdh7lt/HrSaPTLFjzcY6T9QeZL8iXGwo?= =?us-ascii?Q?agWERAJSJNbFke46ItRmmi6QX5276vCAJfslWepOCnZ84+XgHXuq2SV2+dab?= =?us-ascii?Q?QaiHagDxw6Yz0W+rPF9G+suymqLj4y+ODRIhgjbwGzFIjVfOPm3mdDOmeobe?= =?us-ascii?Q?vhSb7SZURrct4zP2Kpc5npmj9OsgwRB3pMbNEutmAxxDFv3KuBhU62lyXLAm?= =?us-ascii?Q?WY9mDX5kvomYCTyZ5Am+xyxFUA0qQd4LdXsiUlXKcc33yKCVQJySsJNpAAm2?= =?us-ascii?Q?abjVC+Em3N1m9AZ+7h8ZTJCfjrQWcmLoZHW7gx/mM02omTlsAUmTQG0sHcju?= =?us-ascii?Q?3SAMqgyLgjBPr7B/FXei+tTvXixh/OffdJsgeYeYEElQIoGUr3sCB9n2u0dz?= =?us-ascii?Q?b10uw+3tHisdAocGJxhELZc93bBSiBRvn0iDFZlvR8JViNRNtEu0p9g/Qcze?= =?us-ascii?Q?mDRE4Rw6L1u+E+6bIFD+SXZHdHDt4moNbtN03jVX1AsXk1ILs4iRigjei/fr?= =?us-ascii?Q?HlOD8VCFxgkATh+GOSnKYsQPnUbWWqzrCmt6Q9TUXaM+9n3O5Bnpid326lZ9?= =?us-ascii?Q?UmUarGpGFeFg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB261; 6:P53PFDw4fzPep5L3v5/DLvBEH6HcaT/1MxhPdV5FTFy+AhzLS/6pQu5PTuhUmEZR+VvGs8ezv+Sq/GgJiOF0A7BdXM3dxsJZuBOM3/u2MxPYMx+1dneX/QfFjHqtnXOL8C0lDzUA79gMT40G89hCx6SDf8ohzoJds0NF6OSzJ23Fdj1HBYDKXdzd5qeJBruDkx4CPO2syB5xVfZC92b9c30gsCcsg+lmGYgEQ86Ub6KIFugqSw6hw0kTc7Ha154SNrH0MkQ4Sc7802FV4qSg6KExq0e6oA/WOo1y63sfRSUAXQp/MX9edScPXQJKGVcPXhVtQCkjlox6IjClhXoRLJmDmcfma3VR4OmNWhG2Bbc=; 5:7fGSXygBycOEJHA33juLwQCJeqLxoFeyN8uHlxUq6e87sqGjuntQPxTE3CgxIT9yYxY0W0pzhjA8EVLdMnD8WNprL5UOXfkMwR05AylcGn+S1qjiS4yMjNjbTBWqeovSoN0JDw8v5WNAlZ1PPz8lDQ==; 24:qHp0BV5foLz+t/9DnUG4nbBdTFLNjRPHSnkIJFToGChLjlsYlsfgr/CVmAtLMBjNRhCX12+tHNtJV03dibRoui2tXWhMdRlWrBJKd6JjfFo= X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB261; 7:sPkkcSraA45l8GDIMNzngXQjKPunXMZJYPbaTfnAYfNK9w8ipA5wpVDYnPfAK9IsICu7woorP13zXxJMfJRzVATxPSoJsLdRxYV/Px4eKja+NBlbLXVw/f9qA/wAqxlEJC7VHBcasNRXjNWAjNiG+sWQxipXEXVRjx04YKMRSDbi3RGF7dhNOmpg1wffz6SzH5tGKW7RJIJzv89Q4RsfotjOzoNm9uZWctncJ4df1qpq3z5RkuSkW9ccfW3QUnqYiilBuZbDMNJMNs9Zse+xntlfFckREBQVqJTJ0rv33WmNJVJS7GTGX2RtDkBoGLOxdFJqzTuw0uhdtoniWkLczw== X-OriginatorOrg: opensource.altera.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Oct 2016 16:10:10.2032 (UTC) X-MS-Exchange-CrossTenant-Id: fbd72e03-d4a5-4110-adce-614d51f2077a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=fbd72e03-d4a5-4110-adce-614d51f2077a; Ip=[66.35.236.236]; Helo=[sj-itexedge04.altera.priv.altera.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR03MB261 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20161017_091029_339240_6F4777AB X-CRM114-Status: UNSURE ( 5.34 ) X-CRM114-Notice: Please train this message. X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , Moritz Fischer , delicious.quinoa@gmail.com, Ian Campbell , Alan Tull , Greg Kroah-Hartman , Jonathan Corbet , linux-doc@vger.kernel.org, Michal Simek , linux-kernel@vger.kernel.org, Cyril Chemparathy , devicetree@vger.kernel.org, Jon Masters , Matthew Gerlach , Frank Rowand , Dinh Nguyen , linux-arm-kernel@lists.infradead.org Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Add a low level driver for Altera Freeze Bridges to the FPGA Bridge framework. A freeze bridge is a bridge that exists in the FPGA fabric to isolate one region of the FPGA from the busses while that one region is being reprogrammed. Signed-off-by: Alan Tull Signed-off-by: Matthew Gerlach --- v19: added in v19 of patchset as it needs for fpga info struct v20: No change for this patch in v20 of patchset --- drivers/fpga/Kconfig | 9 ++ drivers/fpga/Makefile | 1 + drivers/fpga/altera-freeze-bridge.c | 273 ++++++++++++++++++++++++++++++++++++ 3 files changed, 283 insertions(+) create mode 100644 drivers/fpga/altera-freeze-bridge.c diff --git a/drivers/fpga/Kconfig b/drivers/fpga/Kconfig index 5605ad6..8fe6a84 100644 --- a/drivers/fpga/Kconfig +++ b/drivers/fpga/Kconfig @@ -47,6 +47,15 @@ config SOCFPGA_FPGA_BRIDGE Say Y to enable drivers for FPGA bridges for Altera SOCFPGA devices. +config ALTERA_FREEZE_BRIDGE + tristate "Altera FPGA Freeze Bridge" + depends on ARCH_SOCFPGA && FPGA_BRIDGE + help + Say Y to enable drivers for Altera FPGA Freeze bridges. A + freeze bridge is a bridge that exists in the FPGA fabric to + isolate one region of the FPGA from the busses while that + region is being reprogrammed. + endif # FPGA endmenu diff --git a/drivers/fpga/Makefile b/drivers/fpga/Makefile index e658436..a6f874d 100644 --- a/drivers/fpga/Makefile +++ b/drivers/fpga/Makefile @@ -12,6 +12,7 @@ obj-$(CONFIG_FPGA_MGR_ZYNQ_FPGA) += zynq-fpga.o # FPGA Bridge Drivers obj-$(CONFIG_FPGA_BRIDGE) += fpga-bridge.o obj-$(CONFIG_SOCFPGA_FPGA_BRIDGE) += altera-hps2fpga.o altera-fpga2sdram.o +obj-$(CONFIG_ALTERA_FREEZE_BRIDGE) += altera-freeze-bridge.o # High Level Interfaces obj-$(CONFIG_FPGA_REGION) += fpga-region.o diff --git a/drivers/fpga/altera-freeze-bridge.c b/drivers/fpga/altera-freeze-bridge.c new file mode 100644 index 0000000..8dcd9fb --- /dev/null +++ b/drivers/fpga/altera-freeze-bridge.c @@ -0,0 +1,273 @@ +/* + * FPGA Freeze Bridge Controller + * + * Copyright (C) 2016 Altera Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +#include +#include +#include +#include +#include +#include + +#define FREEZE_CSR_STATUS_OFFSET 0 +#define FREEZE_CSR_CTRL_OFFSET 4 +#define FREEZE_CSR_ILLEGAL_REQ_OFFSET 8 +#define FREEZE_CSR_REG_VERSION 12 + +#define FREEZE_CSR_SUPPORTED_VERSION 2 + +#define FREEZE_CSR_STATUS_FREEZE_REQ_DONE BIT(0) +#define FREEZE_CSR_STATUS_UNFREEZE_REQ_DONE BIT(1) + +#define FREEZE_CSR_CTRL_FREEZE_REQ BIT(0) +#define FREEZE_CSR_CTRL_RESET_REQ BIT(1) +#define FREEZE_CSR_CTRL_UNFREEZE_REQ BIT(2) + +#define FREEZE_BRIDGE_NAME "freeze" + +struct altera_freeze_br_data { + struct device *dev; + void __iomem *base_addr; + bool enable; +}; + +/* + * Poll status until status bit is set or we have a timeout. + */ +static int altera_freeze_br_req_ack(struct altera_freeze_br_data *priv, + u32 timeout, u32 req_ack) +{ + struct device *dev = priv->dev; + void __iomem *csr_illegal_req_addr = priv->base_addr + + FREEZE_CSR_ILLEGAL_REQ_OFFSET; + u32 status, illegal, ctrl; + int ret = -ETIMEDOUT; + + do { + illegal = readl(csr_illegal_req_addr); + if (illegal) { + dev_err(dev, "illegal request detected 0x%x", illegal); + + writel(1, csr_illegal_req_addr); + + illegal = readl(csr_illegal_req_addr); + if (illegal) + dev_err(dev, "illegal request not cleared 0x%x", + illegal); + + ret = -EINVAL; + break; + } + + status = readl(priv->base_addr + FREEZE_CSR_STATUS_OFFSET); + dev_dbg(dev, "%s %x %x\n", __func__, status, req_ack); + status &= req_ack; + if (status) { + ctrl = readl(priv->base_addr + FREEZE_CSR_CTRL_OFFSET); + dev_dbg(dev, "%s request %x acknowledged %x %x\n", + __func__, req_ack, status, ctrl); + ret = 0; + break; + } + + udelay(1); + } while (timeout--); + + if (ret == -ETIMEDOUT) + dev_err(dev, "%s timeout waiting for 0x%x\n", + __func__, req_ack); + + return ret; +} + +static int altera_freeze_br_do_freeze(struct altera_freeze_br_data *priv, + u32 timeout) +{ + struct device *dev = priv->dev; + void __iomem *csr_ctrl_addr = priv->base_addr + + FREEZE_CSR_CTRL_OFFSET; + u32 status; + int ret; + + status = readl(priv->base_addr + FREEZE_CSR_STATUS_OFFSET); + + dev_dbg(dev, "%s %d %d\n", __func__, status, readl(csr_ctrl_addr)); + + if (status & FREEZE_CSR_STATUS_FREEZE_REQ_DONE) { + dev_dbg(dev, "%s bridge already disabled %d\n", + __func__, status); + return 0; + } else if (!(status & FREEZE_CSR_STATUS_UNFREEZE_REQ_DONE)) { + dev_err(dev, "%s bridge not enabled %d\n", __func__, status); + return -EINVAL; + } + + writel(FREEZE_CSR_CTRL_FREEZE_REQ, csr_ctrl_addr); + + ret = altera_freeze_br_req_ack(priv, timeout, + FREEZE_CSR_STATUS_FREEZE_REQ_DONE); + + if (ret) + writel(0, csr_ctrl_addr); + else + writel(FREEZE_CSR_CTRL_RESET_REQ, csr_ctrl_addr); + + return ret; +} + +static int altera_freeze_br_do_unfreeze(struct altera_freeze_br_data *priv, + u32 timeout) +{ + struct device *dev = priv->dev; + void __iomem *csr_ctrl_addr = priv->base_addr + + FREEZE_CSR_CTRL_OFFSET; + u32 status; + int ret; + + writel(0, csr_ctrl_addr); + + status = readl(priv->base_addr + FREEZE_CSR_STATUS_OFFSET); + + dev_dbg(dev, "%s %d %d\n", __func__, status, readl(csr_ctrl_addr)); + + if (status & FREEZE_CSR_STATUS_UNFREEZE_REQ_DONE) { + dev_dbg(dev, "%s bridge already enabled %d\n", + __func__, status); + return 0; + } else if (!(status & FREEZE_CSR_STATUS_FREEZE_REQ_DONE)) { + dev_err(dev, "%s bridge not frozen %d\n", __func__, status); + return -EINVAL; + } + + writel(FREEZE_CSR_CTRL_UNFREEZE_REQ, csr_ctrl_addr); + + ret = altera_freeze_br_req_ack(priv, timeout, + FREEZE_CSR_STATUS_UNFREEZE_REQ_DONE); + + status = readl(priv->base_addr + FREEZE_CSR_STATUS_OFFSET); + + dev_dbg(dev, "%s %d %d\n", __func__, status, readl(csr_ctrl_addr)); + + writel(0, csr_ctrl_addr); + + return ret; +} + +/* + * enable = 1 : allow traffic through the bridge + * enable = 0 : disable traffic through the bridge + */ +static int altera_freeze_br_enable_set(struct fpga_bridge *bridge, + bool enable) +{ + struct altera_freeze_br_data *priv = bridge->priv; + struct fpga_image_info *info = bridge->info; + u32 timeout = 0; + int ret; + + if (enable) { + if (info) + timeout = info->enable_timeout_us; + + ret = altera_freeze_br_do_unfreeze(bridge->priv, timeout); + } else { + if (info) + timeout = info->disable_timeout_us; + + ret = altera_freeze_br_do_freeze(bridge->priv, timeout); + } + + if (!ret) + priv->enable = enable; + + return ret; +} + +static int altera_freeze_br_enable_show(struct fpga_bridge *bridge) +{ + struct altera_freeze_br_data *priv = bridge->priv; + + return priv->enable; +} + +static struct fpga_bridge_ops altera_freeze_br_br_ops = { + .enable_set = altera_freeze_br_enable_set, + .enable_show = altera_freeze_br_enable_show, +}; + +static const struct of_device_id altera_freeze_br_of_match[] = { + { .compatible = "altr,freeze-bridge-controller", }, + {}, +}; +MODULE_DEVICE_TABLE(of, altera_freeze_br_of_match); + +static int altera_freeze_br_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct device_node *np = pdev->dev.of_node; + struct altera_freeze_br_data *priv; + struct resource *res; + u32 status, revision; + + if (!np) + return -ENODEV; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->dev = dev; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + priv->base_addr = devm_ioremap_resource(dev, res); + if (IS_ERR(priv->base_addr)) + return PTR_ERR(priv->base_addr); + + status = readl(priv->base_addr + FREEZE_CSR_STATUS_OFFSET); + if (status & FREEZE_CSR_STATUS_UNFREEZE_REQ_DONE) + priv->enable = 1; + + revision = readl(priv->base_addr + FREEZE_CSR_REG_VERSION); + if (revision != FREEZE_CSR_SUPPORTED_VERSION) + dev_warn(dev, + "%s Freeze Controller unexpected revision %d != %d\n", + __func__, revision, FREEZE_CSR_SUPPORTED_VERSION); + + return fpga_bridge_register(dev, FREEZE_BRIDGE_NAME, + &altera_freeze_br_br_ops, priv); +} + +static int altera_freeze_br_remove(struct platform_device *pdev) +{ + fpga_bridge_unregister(&pdev->dev); + + return 0; +} + +static struct platform_driver altera_freeze_br_driver = { + .probe = altera_freeze_br_probe, + .remove = altera_freeze_br_remove, + .driver = { + .name = "altera_freeze_br", + .of_match_table = of_match_ptr(altera_freeze_br_of_match), + }, +}; + +module_platform_driver(altera_freeze_br_driver); + +MODULE_DESCRIPTION("Altera Freeze Bridge"); +MODULE_AUTHOR("Alan Tull "); +MODULE_LICENSE("GPL v2");