Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/615846/?format=api
{ "id": 615846, "url": "http://patchwork.ozlabs.org/api/patches/615846/?format=api", "web_url": "http://patchwork.ozlabs.org/project/uboot/patch/1461793169-5526-2-git-send-email-eddy.petrisor@nxp.com/", "project": { "id": 18, "url": "http://patchwork.ozlabs.org/api/projects/18/?format=api", "name": "U-Boot", "link_name": "uboot", "list_id": "u-boot.lists.denx.de", "list_email": "u-boot@lists.denx.de", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<1461793169-5526-2-git-send-email-eddy.petrisor@nxp.com>", "list_archive_url": null, "date": "2016-04-27T21:39:28", "name": "[U-Boot,1/2] serial: Introduce linflex uart support", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "d208457c69bb74ac1a2ae4968b6a1757dafef0f6", "submitter": { "id": 68289, "url": "http://patchwork.ozlabs.org/api/people/68289/?format=api", "name": "Eddy Petrisor", "email": "eddy.petrisor@nxp.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/uboot/patch/1461793169-5526-2-git-send-email-eddy.petrisor@nxp.com/mbox/", "series": [], "comments": "http://patchwork.ozlabs.org/api/patches/615846/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/615846/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<u-boot-bounces@lists.denx.de>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org", "Received": [ "from theia.denx.de (theia.denx.de [85.214.87.163])\n\tby ozlabs.org (Postfix) with ESMTP id 3qwDJj2WKvz9t3k\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 28 Apr 2016 07:54:44 +1000 (AEST)", "from localhost (localhost [127.0.0.1])\n\tby theia.denx.de (Postfix) with ESMTP id 230DDA77B0;\n\tWed, 27 Apr 2016 23:54:39 +0200 (CEST)", "from theia.denx.de ([127.0.0.1])\n\tby localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id mILeWx_eSv5N; Wed, 27 Apr 2016 23:54:38 +0200 (CEST)", "from theia.denx.de (localhost [127.0.0.1])\n\tby theia.denx.de (Postfix) with ESMTP id 7114AA779D;\n\tWed, 27 Apr 2016 23:54:38 +0200 (CEST)", "from localhost (localhost [127.0.0.1])\n\tby theia.denx.de (Postfix) with ESMTP id CD75CA779D\n\tfor <u-boot@lists.denx.de>; Wed, 27 Apr 2016 23:54:34 +0200 (CEST)", "from theia.denx.de ([127.0.0.1])\n\tby localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id b6SAP9GO5Epo for <u-boot@lists.denx.de>;\n\tWed, 27 Apr 2016 23:54:34 +0200 (CEST)", "from na01-by2-obe.outbound.protection.outlook.com\n\t(mail-by2on0089.outbound.protection.outlook.com [207.46.100.89])\n\tby theia.denx.de (Postfix) with ESMTPS id 5B480A778E\n\tfor <u-boot@lists.denx.de>; Wed, 27 Apr 2016 23:54:29 +0200 (CEST)", "from DM2PR03CA0033.namprd03.prod.outlook.com (10.141.96.32) by\n\tDM2PR0301MB1230.namprd03.prod.outlook.com (10.160.219.19) with\n\tMicrosoft SMTP\n\tServer (TLS) id 15.1.477.8; Wed, 27 Apr 2016 21:40:20 +0000", "from BY2FFO11OLC003.protection.gbl (2a01:111:f400:7c0c::177) by\n\tDM2PR03CA0033.outlook.office365.com (2a01:111:e400:2428::32) with\n\tMicrosoft SMTP Server (TLS) id 15.1.477.8 via Frontend Transport;\n\tWed, 27 Apr 2016 21:40:20 +0000", "from tx30smr01.am.freescale.net (192.88.168.50) by\n\tBY2FFO11OLC003.mail.protection.outlook.com (10.1.15.183) with\n\tMicrosoft SMTP Server (TLS) id 15.1.477.4 via Frontend Transport;\n\tWed, 27 Apr 2016 21:40:19 +0000", "from fsr-ub1264-014.ea.freescale.net\n\t(fsr-ub1264-014.ea.freescale.net [10.171.81.44])\n\tby tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id\n\tu3RLdtTw019072; Wed, 27 Apr 2016 14:40:17 -0700" ], "X-Greylist": "delayed 868 seconds by postgrey-1.34 at theia;\n\tWed, 27 Apr 2016 23:54:29 CEST", "X-policyd-weight": "NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5\n\tNOT_IN_BL_NJABL=-1.5 (only DNSBL check requested)", "Authentication-Results": "spf=fail (sender IP is 192.88.168.50)\n\tsmtp.mailfrom=nxp.com; gmail.com; dkim=none (message not signed)\n\theader.d=none; gmail.com; dmarc=none action=none header.from=nxp.com; ", "Received-SPF": "Fail (protection.outlook.com: domain of nxp.com does not\n\tdesignate 192.88.168.50 as permitted sender)\n\treceiver=protection.outlook.com; \n\tclient-ip=192.88.168.50; helo=tx30smr01.am.freescale.net;", "From": "=?UTF-8?q?Eddy=20Petri=C8=99or?= <eddy.petrisor@nxp.com>", "To": "U-Boot Mailing List <u-boot@lists.denx.de>", "Date": "Thu, 28 Apr 2016 00:39:28 +0300", "Message-ID": "<1461793169-5526-2-git-send-email-eddy.petrisor@nxp.com>", "X-Mailer": "git-send-email 1.9.2.459.g68773ac", "In-Reply-To": "<1459642206-20101-1-git-send-email-eddy.petrisor@gmail.com>", "References": "<1459642206-20101-1-git-send-email-eddy.petrisor@gmail.com>", "MIME-Version": "1.0", "X-EOPAttributedMessage": "0", "X-Matching-Connectors": "131062668199404615;\n\t(91ab9b29-cfa4-454e-5278-08d120cd25b8); ()", "X-Forefront-Antispam-Report": "CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI;\n\tSFV:NSPM;\n\tSFS:(10009020)(6009001)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(92566002)(1220700001)(1096002)(2950100001)(110136002)(2870700001)(6806005)(81166005)(23676002)(5820100001)(189998001)(11100500001)(104016004)(87936001)(77096005)(86362001)(76176999)(586003)(2906002)(575784001)(50986999)(85426001)(5008740100001)(47776003)(4326007)(19580405001)(33646002)(36756003)(106466001)(19580395003)(105606002)(50226002)(229853001)(21314002);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:DM2PR0301MB1230;\n\tH:tx30smr01.am.freescale.net; \n\tFPR:; SPF:Fail; MLV:sfv; A:1; MX:1; LANG:en; ", "X-Microsoft-Exchange-Diagnostics": [ "1; BY2FFO11OLC003;\n\t1:S7yr2k8Gvj3oYYudAyMs0m2tdAyYHz8qe2wJ1+GYkWj0GAroyu181UZBpdQYcKqQI+YwsI/A5C4TiBUQ5wSUWPmCp2lXuRaHRpNVxQQ/fis0EM9BgE/EbyINw22x/VFevdWYtdbdZWvV4+xzp2gF79c84TW4ZJGtuw4VKyldZHw0eW9OclRKNtArwGbxiv19Z660wdS3kMbxZpdrDr/4PNuP80Q407KYw3O/4qLvx5k8yf2rJ3QjCJe6cNVdCD9XIuRBXDJ+dEk2qzzNUlBjVxH6uO05a/KFF5k5U8dJuEcuBh8QaNn7vqM6IG9p8utHZMLo8X1RC5m1uEYoaC/AM7hLwmHt1ehBcCEMIenfdxd8BjHBhHQfubFi6FjLhypYH4GZwSoOMpEn/SL9aH9hLuVz6p1FYMLvxuS71itX2bySVSQyXrwmLdABoS22+JcMbyCykz7q+3XfhVD6jzhOqlqvd3yzVKd9XwrZs6gZiXgiJbqhnU7JUgNpW2hpM60bzTT7Emy1db5Vr9qH/P4mbxtJJWoQPX/H/zoe7wf4tLNLIfx+rXlTU7Y9mpkbcs4jJAgrgQbCT+8wPiCZff0q+bakXsAUiLmtYe8WAzGTTjaD4VcvtIB0+pczC9gBs9+8", "1; DM2PR0301MB1230;\n\t2:4/1tf9fEjxCliq3TTaIb2sldYawzMPccXFSpEmnlxgd76jlMwjKTCKwA/q3lT7VLRm5swPizp3qgVzNPL8Y+1Lc3e1AADSIhIMF2CN1UUlY3oa2IOkY4HVn1qwOyqNzIca15sivtD5Sq7naHPi8uS8wA2fODcQhXG8tDlfiugCQzDdMvg+UNghHU81KSZ7PQ;\n\t3:LywUenliO9yqdoXYW8WV5GLVbsCw0z6Rwmey3EwgDXvYgrA4x5zIFmmALVzw2ONJt5O4BwMqc/xMHcjqjHPsQjPvz4dlWVa0h0TKaThOYiJAb0W+2/RThvNFExxizJKPNoOX2/9C/mt5ajaFQ+M6Fay+bzuYEb5qW/3/pQ0jK2a5B5gHia5tup2MlfNEj+y/SHsWUAmjH2MyQU3CZSSKjLOCt+oAw1rSKGtiYo2fIwI=", "1; DM2PR0301MB1230;\n\t25:vWt62H5xE72fDmXTCGJNAguiJ05NDNzitwZu5Vt9K7H5InuQwLg14LO1DnYpJICRN5AwIectDs2ooSs41JmwFn3QPih1WpDPJgtSz/ejJjGIkZCzJ72aBxvv4AFN3RNwpg5vfBoTZ1zGEO47+O85eVoVVKNUUTy/olU4WIO/zppgk39QZwpXUaSQKwUYyp1y1tADW49az8Z/fIcs2evO0PdDxOVeSGpdX0bcGmlIRoJ6V5HpE65emHFrqVTfRJHYhbfPfkLRIM4MyuOTpD/E9HJMED15EkshC5L95chTuGqcA48vqeGiEP+cf4niHia6djbiuFKWpE+k2KJPghqfvfa9Hix0iZfFqwupct3YdvKsHw7chmS/rVO/Jd+jmLjI/HL+Vw+1Ax5DCpxvaDmS9xY3zuNP1g0DDl3ks2dDF2NmYmRmc/noM1zzF63rLnUEKlDBsmAViiPRHQIvgNX0zAq7sGvPRw7+EyhgYyPHuyUmKs/5p0rkOh1/z75QnNR6p4WQbb2DJHXjP6wEtA/No7Z0BPn7Ji5gy1IYYO7md1XqCG9HTf94EIYFpEl1u5fg01qFq4JQfa95myq6PSH3/53fBJcLf1f0AO4gyJFxJBfr5XWnLBplbcz3D9146LSbKg27S6rCT8PQMe8DptD63w==", "1; DM2PR0301MB1230;\n\t4:asOHKAQPI88JLjWXXe1f9UvCAmPU0bnv8YTgeyRwxNig6LIgsK32RbYRRD9kf04wF5CfqdQ2Un71NQM2whWqjw4I80Bt141y2TsGVpyvn6hlugF9TRchkFsPAWhwohRRzEodGlZjIkr/d8sug0guInzMFY2ZY0cTiaf2/lCar1ircujgbhQsWkNPcZtziQzAPZXiXIjltmZWVmE9Ku1CxqVXN5zsTKQxn8JAmxu/dKEoRpEhKaahRfzHOT1qUY6Na+gme2BIlS0k7bnH4Avrhupn0LvJiW71DwmOzJjTycNBeSNCHpVbecJdi6yPZdhSi5zaSUOqHqjJ6go0nSpYtLVmATGN+pK9/jQWtttGtrtkfzZYv90qugvV4tRJXCCE0XEDlvjNHEssyFMrDQiRMLFQqJI/ARbOnXsyl3P8lk4f0lYdCYveLmD5gqrpLn8dsvS2do4p08HIiXiMBRI3H5mpIbgP8OOCxeYP6ZU/R9M=", "=?utf-8?B?MTtETTJQUjAzMDFNQjEyMzA7MjM6SnByMjJnN3BKTTc4OVZDYTdFYi8xdnkz?=\n\t=?utf-8?B?UUF6bVpZK011R3pqS2M1cHYvUEt2WTkwdEx4RjdSbFV1djVVaXllNFk0UHVa?=\n\t=?utf-8?B?cGdEeGFSaXkrcHRqbHBTdTAwU0RFakg1MmNYbVF0VlgwdmIxWm9VbE0vQ0ph?=\n\t=?utf-8?B?Tm9rdEhObDB4OEJaTGlRMDErNFZlOEZRTC9zOURVOGllQmdIQTdrSU9aQmxD?=\n\t=?utf-8?B?VlRQRklYbkxrUVIzcXRUQ2pVbDVleTRRZVBVK2xpNDBwTnlKRFpHSkl3NDZs?=\n\t=?utf-8?B?OEwyNUJxZDVSbXl3U0dQZFdpQmlKK1lDaFNBZWlsYTN4bzJWb2RPQjFCb1Vh?=\n\t=?utf-8?B?WThUNU1ZYkpIM24wdTU4TFd4a2FBMi8wQWM0SUdKWThJaUozVC9IY1dRRnVx?=\n\t=?utf-8?B?T2lzSkRKMGthWld0WWlFWm1wU0lyL0ZMZnNMQStLT2htSFVWS0JhZ3h5RmZu?=\n\t=?utf-8?B?ZkFtbkRtL2VJU0luR3ZnTWF3dEhRSHBXU2tETnd4aCsydVZ2ZDNySnRyRlgz?=\n\t=?utf-8?B?ZG81dTJUeTVzd291MmdFdkZBZ2o3d2RkVUpGclk2N01mem12cnU2M0Z2dXgy?=\n\t=?utf-8?B?Zyt3UGZybGFkMmV1THFCTS9hUGRkd3BkVkwvQ3lTZUg4Y1puNHJncS9oRzI3?=\n\t=?utf-8?B?aFNldHoxazk5SlVnRzR2eWFXWlQrWDNNaWdBUUQ0d0hPaFBRek5wdHNPR25B?=\n\t=?utf-8?B?bFhHNWUwaVVLT0RPZnlsVUlFYUhDNDJ6TkREWWlKTWlINm5WcFp4TUsrNnRm?=\n\t=?utf-8?B?alc5bVZmV1lRRHVLUklidDNWRGxJVm1jbTY4WGp3QWJwK2ZKbUkrbUVqMlRu?=\n\t=?utf-8?B?dDFMTzFSL3N0OVgxeHlCcE1od05WOEp3K09YVklHSGs1aDBjcmlubkZ0MmMx?=\n\t=?utf-8?B?SW9uNHRZV0kvbUJSOUM5YWhIZmM5YS9YQWJUa3Zlc1o0UTc5MkRoelRLUTdN?=\n\t=?utf-8?B?V2NhTS9xYTVaOVRMeGNVNDRRNWZacXpSMVRRZzdkbW5lbm44b3U1S1hSQkdY?=\n\t=?utf-8?B?cCs5T1U1b2VoWkxlZ0RvMmZPVXNPamswQUtHQU5zVmdHeG15TTBhNWFZOEdv?=\n\t=?utf-8?B?STZCY3NXb3ZuVFZoeDQ4Tko1TTNubjVMVWNGUExVTGdJWWpBQ2hzREwrazRm?=\n\t=?utf-8?B?NXhPRS9VRm1GOTVMY1lNZlVPbExDb0xKazFOYmxuU3o2VDRnNHRaQ0JXaEx1?=\n\t=?utf-8?B?alNPR3JlNHRSVm80RmpBMVlER3o3dU1NVitYNk1CQkg4dkRSYkc3VXNhK3Va?=\n\t=?utf-8?B?NjVRWFp4cjh5RGY3UUluZzhNN3ZQVjlkUFU3R0RGSThveTgweG4xT1B4aWt6?=\n\t=?utf-8?B?ODRKRWFubll6eFVrQlF2YWc4S1VsUXM1T3hJUGNqTktqRmxNRkVBMjJQNm0z?=\n\t=?utf-8?B?NWZwdmJ5Y0dhcjA2QVJxOUhPc2lXYkhVUHh2ODVncldzTzVUL1AvYk4vd0ZF?=\n\t=?utf-8?Q?qbkJT94YGzS7MF5fsP8cLka9lBQqk?=", "1; DM2PR0301MB1230;\n\t5:DfQsc20HRifqBdRWJM8qfKVrHRPrJBNHrr0ONHdLc7sW6ufRwsjaK0ENTA5H31/cpXexs41jzOkfmc1U7hwgS3KVtzrZLk1PyQsSyWyrAqgu+j2SdFJrEmmL31ZzexPwAlvl6eAveoHkIuBT2Q27cPFHMNA94KUa+gW3GjYQJoE=;\n\t24:xj3tU1ZppTcabptBH1HrGSbXi34LNqzOi5xyE6runQZlvbcci6qLzORy0abkDLmZz36rAJ1OEu/8b55JD+CMLjnQv5aAZRVjh9Qv21436Qw=;\n\t7:Q4+2kweGHZ3Wm+x9R4ZZrnkIbGwd+TLLLire/FKwy09wOCn3sGk5RCqO2yNRIsnPsF6AjmRThg7v7P45GfodDGBBvmiT2dWt0jy98JvVZTMkZTRLCxXFAMVEsVa1B9UxFXWGnowCEWkHTPIRHcIyIQWVFa8XtrDN7fChoFikU0A3Mvn9yfnY5R2a46JHfn9Z" ], "X-MS-Office365-Filtering-Correlation-Id": "e1ee17cc-db67-40aa-2447-08d36ee487ce", "X-Microsoft-Antispam": "UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM2PR0301MB1230;", "X-Microsoft-Antispam-PRVS": "<DM2PR0301MB1230E04677B26D4638967F85F5640@DM2PR0301MB1230.namprd03.prod.outlook.com>", "X-Exchange-Antispam-Report-Test": "UriScan:;", "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(601004)(2401047)(13018025)(13024025)(13015025)(5005006)(8121501046)(13017025)(13023025)(3002001)(10201501046)(6055026);\n\tSRVR:DM2PR0301MB1230; BCL:0; PCL:0; RULEID:(400006);\n\tSRVR:DM2PR0301MB1230; ", "X-Forefront-PRVS": "0925081676", "SpamDiagnosticOutput": "1:23", "SpamDiagnosticMetadata": "NSPM", "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "27 Apr 2016 21:40:19.6284\n\t(UTC)", "X-MS-Exchange-CrossTenant-Id": "5afe0b00-7697-4969-b663-5eab37d5f47e", "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;\n\tIp=[192.88.168.50]; \n\tHelo=[tx30smr01.am.freescale.net]", "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem", "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DM2PR0301MB1230", "Cc": "trini@konsulko.com,\n\t=?UTF-8?q?Eddy=20Petri=C8=99or?= <eddy.petrisor@gmail.com>,\n\tStoica Cosmin-Stefan <cosminstefan.stoica@freescale.com>,\n\tEddy Petrisor <eddy.petrisor+patches@gmail.com>", "Subject": "[U-Boot] [PATCH 1/2] serial: Introduce linflex uart support", "X-BeenThere": "u-boot@lists.denx.de", "X-Mailman-Version": "2.1.15", "Precedence": "list", "List-Id": "U-Boot discussion <u-boot.lists.denx.de>", "List-Unsubscribe": "<http://lists.denx.de/mailman/options/u-boot>,\n\t<mailto:u-boot-request@lists.denx.de?subject=unsubscribe>", "List-Archive": "<http://lists.denx.de/pipermail/u-boot/>", "List-Post": "<mailto:u-boot@lists.denx.de>", "List-Help": "<mailto:u-boot-request@lists.denx.de?subject=help>", "List-Subscribe": "<http://lists.denx.de/mailman/listinfo/u-boot>,\n\t<mailto:u-boot-request@lists.denx.de?subject=subscribe>", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "base64", "Errors-To": "u-boot-bounces@lists.denx.de", "Sender": "\"U-Boot\" <u-boot-bounces@lists.denx.de>" }, "content": "From: Stoica Cosmin-Stefan <cosminstefan.stoica@freescale.com>\n\nThe Linflex module is integrated on some NXP automotive SoCs part of the former\nFreescale portfolio, like S32V234, an SoC for Advanced Driver Assistance\nSystems.\n\nOriginal-signed-off-by: Stoica Cosmin-Stefan <cosminstefan.stoica@freescale.com>\nOriginal-signed-off-by: Chircu Bogdan <Bogdan.Chircu@freescale.com>\nOriginal-signed-off-by: Depons Eric <eric.depons@freescale.com>\nOriginal-signed-off-by: Eddy Petrișor <eddy.petrisor@gmail.com>\n\nSigned-off-by: Eddy Petrișor <eddy.petrisor@gmail.com>\n---\n drivers/serial/Makefile | 1 +\n drivers/serial/serial_linflexuart.c | 274 ++++++++++++++++++++++++++++++++++++\n 2 files changed, 275 insertions(+)\n create mode 100644 drivers/serial/serial_linflexuart.c", "diff": "diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile\nindex b0ac9d8..98a00b9 100644\n--- a/drivers/serial/Makefile\n+++ b/drivers/serial/Makefile\n@@ -33,6 +33,7 @@ obj-$(CONFIG_SCIF_CONSOLE) += serial_sh.o\n obj-$(CONFIG_ZYNQ_SERIAL) += serial_zynq.o\n obj-$(CONFIG_BFIN_SERIAL) += serial_bfin.o\n obj-$(CONFIG_FSL_LPUART) += serial_lpuart.o\n+obj-$(CONFIG_FSL_LINFLEXUART) += serial_linflexuart.o\n obj-$(CONFIG_ARC_SERIAL) += serial_arc.o\n obj-$(CONFIG_UNIPHIER_SERIAL) += serial_uniphier.o\n obj-$(CONFIG_STM32_SERIAL) += serial_stm32.o\ndiff --git a/drivers/serial/serial_linflexuart.c b/drivers/serial/serial_linflexuart.c\nnew file mode 100644\nindex 0000000..a7dc89f\n--- /dev/null\n+++ b/drivers/serial/serial_linflexuart.c\n@@ -0,0 +1,274 @@\n+/*\n+ * (C) Copyright 2013-2016 Freescale Semiconductor, Inc.\n+ *\n+ * SPDX-License-Identifier: GPL-2.0+\n+ */\n+\n+#include <common.h>\n+#include <dm.h>\n+#include <errno.h>\n+#include <watchdog.h>\n+#include <asm/io.h>\n+#include <serial.h>\n+#include <linux/compiler.h>\n+#include <asm/arch/imx-regs.h>\n+#include <asm/arch/clock.h>\n+\n+#define US1_TDRE (1 << 7)\n+#define US1_RDRF (1 << 5)\n+#define UC2_TE (1 << 3)\n+#define LINCR1_INIT (1 << 0)\n+#define LINCR1_MME (1 << 4)\n+#define LINCR1_BF (1 << 7)\n+#define LINSR_LINS_INITMODE (0x00001000)\n+#define LINSR_LINS_MASK (0x0000F000)\n+#define UARTCR_UART (1 << 0)\n+#define UARTCR_WL0 (1 << 1)\n+#define UARTCR_PCE (1 << 2)\n+#define UARTCR_PC0 (1 << 3)\n+#define UARTCR_TXEN (1 << 4)\n+#define UARTCR_RXEN (1 << 5)\n+#define UARTCR_PC1 (1 << 6)\n+#define UARTSR_DTF (1 << 1)\n+#define UARTSR_DRF (1 << 2)\n+#define UARTSR_RMB (1 << 9)\n+\n+DECLARE_GLOBAL_DATA_PTR;\n+\n+#ifndef CONFIG_DM_SERIAL\n+struct linflex_fsl *lfbase = (struct linflex_fsl *)LINFLEXUART_BASE;\n+#endif\n+\n+static void _linflex_serial_setbrg(struct linflex_fsl *base, int baudrate)\n+{\n+\tu32 clk = mxc_get_clock(MXC_UART_CLK);\n+\tu32 ibr, fbr;\n+\n+\tif (!baudrate)\n+\t\tbaudrate = CONFIG_BAUDRATE;\n+\n+\tibr = (u32) (clk / (16 * gd->baudrate));\n+\tfbr = (u32) (clk % (16 * gd->baudrate)) * 16;\n+\n+\t__raw_writel(ibr, &base->linibrr);\n+\t__raw_writel(fbr, &base->linfbrr);\n+}\n+\n+static int _linflex_serial_getc(struct linflex_fsl *base)\n+{\n+\tchar c;\n+\n+#ifndef CONFIG_DM_SERIAL\n+\t/* waiting for data reception complete - TODO: add a timeout */\n+\twhile ((__raw_readb(&base->uartsr) & UARTSR_DRF) != UARTSR_DRF);\n+\n+\t/* waiting for data buffer to be ready - TODO: add a timeout */\n+\twhile ((__raw_readl(&base->uartsr) & UARTSR_RMB) != UARTSR_RMB);\n+#else\n+\tif (!(__raw_readb(&base->uartsr) & UARTSR_DRF))\n+\t\treturn -EAGAIN;\n+\n+\tif (!(__raw_readl(&base->uartsr) & UARTSR_RMB))\n+\t\treturn -EAGAIN;\n+\n+#endif\n+\n+\tc = __raw_readl(&base->bdrm);\n+\t__raw_writeb((__raw_readb(&base->uartsr) | (UARTSR_DRF | UARTSR_RMB)),\n+\t\t &base->uartsr);\n+\treturn c;\n+}\n+\n+static int _linflex_serial_putc(struct linflex_fsl *base, const char c)\n+{\n+\t#ifndef CONFIG_DM_SERIAL\n+\tif (c == '\\n')\n+\t\tserial_putc('\\r');\n+\t#endif\n+\n+\t__raw_writeb(c, &base->bdrl);\n+\n+\n+#ifndef CONFIG_DM_SERIAL\n+\t/* waiting for data transmission completed - TODO: add a timeout */\n+\twhile ((__raw_readb(&base->uartsr) & UARTSR_DTF) != UARTSR_DTF);\n+#else\n+\tif (!(__raw_readb(&base->uartsr) & UARTSR_DTF))\n+\t\treturn -EAGAIN;\n+#endif\n+\n+\t__raw_writeb((__raw_readb(&base->uartsr) | UARTSR_DTF), &base->uartsr);\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * Initialise the serial port with the given baudrate. The settings\n+ * are always 8 data bits, no parity, 1 stop bit, no start bits.\n+ */\n+static int _linflex_serial_init(struct linflex_fsl *base)\n+{\n+\tvolatile u32 ctrl;\n+\n+\t/* set the Linflex in master mode amd activate by-pass filter */\n+\tctrl = LINCR1_BF | LINCR1_MME;\n+\t__raw_writel(ctrl, &base->lincr1);\n+\n+\t/* init mode */\n+\tctrl |= LINCR1_INIT;\n+\t__raw_writel(ctrl, &base->lincr1);\n+\n+\t/* waiting for init mode entry - TODO: add a timeout */\n+\twhile ((__raw_readl(&base->linsr) & LINSR_LINS_MASK) !=\n+\t LINSR_LINS_INITMODE);\n+\n+\t/* set UART bit to allow writing other bits */\n+\t__raw_writel(UARTCR_UART, &base->uartcr);\n+\n+\t/* provide data bits, parity, stop bit, etc */\n+\tserial_setbrg();\n+\n+\t/* 8 bit data, no parity, Tx and Rx enabled, UART mode */\n+\t__raw_writel(UARTCR_PC1 | UARTCR_RXEN | UARTCR_TXEN | UARTCR_PC0\n+\t\t | UARTCR_WL0 | UARTCR_UART, &base->uartcr);\n+\n+\tctrl = __raw_readl(&base->lincr1);\n+\tctrl &= ~LINCR1_INIT;\n+\t__raw_writel(ctrl, &base->lincr1);\t/* end init mode */\n+\n+\treturn 0;\n+}\n+\n+#ifndef CONFIG_DM_SERIAL\n+/*\n+ * Test whether a character is in the RX buffer\n+ */\n+static int _linflex_serial_tstc(void)\n+{\n+\treturn 0;\n+}\n+\n+static struct serial_device linflex_serial_drv = {\n+\t.name = \"linflex_serial\",\n+\t.start = nondm_linflex_serial_init,\n+\t.stop = NULL,\n+\t.setbrg = nondm_linflex_serial_setbrg,\n+\t.putc = nondm_linflex_serial_putc,\n+\t.puts = default_serial_puts,\n+\t.getc = nondm_linflex_serial_getc,\n+\t.tstc = _linflex_serial_tstc,\n+};\n+\n+void linflex_serial_initialize(void)\n+{\n+\tserial_register(&linflex_serial_drv);\n+}\n+\n+__weak struct serial_device *default_serial_console(void)\n+{\n+\treturn &linflex_serial_drv;\n+}\n+#endif /* ifndef(CONFIG_DM_SERIAL) */\n+\n+#ifdef CONFIG_DM_SERIAL\n+\n+struct linflex_serial_platdata {\n+\tstruct linflex_fsl *base_addr;\n+\tu8 port_id; /* do we need this? */\n+};\n+\n+struct linflex_serial_priv {\n+\tstruct linflex_fsl *lfuart;\n+};\n+\n+int linflex_serial_setbrg(struct udevice *dev, int baudrate)\n+{\n+\tstruct linflex_serial_priv *priv = dev_get_priv(dev);\n+\n+\t_linflex_serial_setbrg(priv->lfuart, baudrate);\n+\n+\treturn 0;\n+}\n+\n+static int linflex_serial_getc(struct udevice *dev)\n+{\n+\tstruct linflex_serial_priv *priv = dev_get_priv(dev);\n+\n+\treturn _linflex_serial_getc(priv->lfuart);\n+}\n+\n+static int linflex_serial_putc(struct udevice *dev, const char ch)\n+{\n+\n+\tstruct linflex_serial_priv *priv = dev_get_priv(dev);\n+\n+\treturn _linflex_serial_putc(priv->lfuart, ch);\n+}\n+\n+static int linflex_serial_pending(struct udevice *dev, bool input)\n+{\n+\tstruct linflex_serial_priv *priv = dev_get_priv(dev);\n+\tuint32_t uartsr = __raw_readl(&priv->lfuart->uartsr);\n+\n+\tif (input)\n+\t\treturn ((uartsr & UARTSR_DRF) && (uartsr & UARTSR_RMB)) ? 1 : 0;\n+\telse\n+\t\treturn uartsr & UARTSR_DTF ? 0 : 1;\n+}\n+\n+static void linflex_serial_init_internal(struct linflex_fsl *lfuart)\n+{\n+\t_linflex_serial_init(lfuart);\n+\t_linflex_serial_setbrg(lfuart, CONFIG_BAUDRATE);\n+\treturn;\n+}\n+\n+static int linflex_serial_probe(struct udevice *dev)\n+{\n+\tstruct linflex_serial_platdata *plat = dev->platdata;\n+\tstruct linflex_serial_priv *priv = dev_get_priv(dev);\n+\n+\tpriv->lfuart = (struct linflex_fsl *)plat->base_addr;\n+\tlinflex_serial_init_internal(priv->lfuart);\n+\n+\treturn 0;\n+}\n+\n+static const struct dm_serial_ops linflex_serial_ops = {\n+\t.putc = linflex_serial_putc,\n+\t.pending = linflex_serial_pending,\n+\t.getc = linflex_serial_getc,\n+\t.setbrg = linflex_serial_setbrg,\n+};\n+\n+U_BOOT_DRIVER(serial_linflex) = {\n+\t.name\t= \"serial_linflex\",\n+\t.id\t= UCLASS_SERIAL,\n+\t.probe = linflex_serial_probe,\n+\t.ops\t= &linflex_serial_ops,\n+\t.flags = DM_FLAG_PRE_RELOC,\n+\t.priv_auto_alloc_size\t= sizeof(struct linflex_serial_priv),\n+};\n+#endif\n+\n+#ifdef CONFIG_DEBUG_UART_LINFLEXUART\n+\n+#include <debug_uart.h>\n+\n+\n+static inline void _debUG_uart_init(void)\n+{\n+\tstruct linflex_fsl *base = (struct linflex_fsl *)CONFIG_DEBUG_UART_BASE;\n+\n+\tlinflex_serial_init_internal(base);\n+}\n+\n+static inline void _debug_uart_putc(int ch)\n+{\n+\tstruct linflex_fsl *base = (struct linflex_fsl *)CONFIG_DEBUG_UART_BASE;\n+\n+\t/* XXX: Is this OK? Should this use the non-DM version? */\n+\t_linflex_serial_putc(base, ch);\n+}\n+\n+#endif /* CONFIG_DEBUG_UART_LINFLEXUART */\n", "prefixes": [ "U-Boot", "1/2" ] }