Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S941102AbcKNFl7 (ORCPT ); Mon, 14 Nov 2016 00:41:59 -0500 Received: from mail-cys01nam02on0086.outbound.protection.outlook.com ([104.47.37.86]:31328 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S941044AbcKNFly (ORCPT ); Mon, 14 Nov 2016 00:41:54 -0500 Authentication-Results: spf=none (sender IP is 192.88.168.50) smtp.mailfrom=lvd5587.freescale.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=fail action=none header.from=nxp.com; X-IncomingTopHeaderMarker: OriginalChecksum:;UpperCasedChecksum:;SizeAsReceived:1182;Count:11 From: Sriram Dash To: , , , CC: , , , , , , , , , , , Sriram Dash Subject: [PATCH 1/2] drivers: usb: phy: Add qoriq usb 3.0 phy driver support Date: Mon, 14 Nov 2016 10:56:54 +0530 Message-ID: <1479101215-26954-2-git-send-email-sriram.dash@nxp.com> X-Mailer: git-send-email 1.7.7.4 In-Reply-To: <1479101215-26954-1-git-send-email-sriram.dash@nxp.com> References: <1479101215-26954-1-git-send-email-sriram.dash@nxp.com> X-IncomingHeaderCount: 11 X-EOPAttributedMessage: 0 X-Matching-Connectors: 131235748327097366;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.168.50;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6039001)(6009001)(7916002)(2980300002)(428002)(336003)(189002)(199003)(7846002)(33646002)(48376002)(305945005)(50466002)(5660300001)(2906002)(586003)(4326007)(68736007)(6666003)(81156014)(81166006)(4720700003)(42882006)(5001770100001)(97736004)(2950100002)(87936001)(8666005)(50986999)(101416001)(103686003)(356003)(106466001)(52956003)(76176999)(42186005)(105586002)(45336002)(960300001)(46386002)(47776003)(36756003)(2201001)(86372001)(7416002)(92566002)(8676002)(50226002)(5003940100001)(8936002)(626004)(189998001)(90966002)(7059030)(2004002);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR03MB2477;H:tx30smr01.am.freescale.net;FPR:;SPF:None;PTR:InfoDomainNonexistent;MX:1;A:0;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN1BFFO11FD022;1:l67AmeHMg7ARIe+9Qan2Vsc6poIpf4rlE9HIzlT2zxN6fhlvG3Odza8XnCmpYOXErTcK8Oz/Y/YLlYHgat3eOGy3cb/D35S1zz2QP3JFLyv6W5QBLYk81SB98HcSo8ed4wmlryxA3j/uT6hju1Vz5jG1RwO/B/HykvtvR9ya3aa65TCPcVR3GYpq+LNgqVrBXtonYD9gTAYt7CqR5/YCDpbs9Ao/0u73WWOidXC0JaMtt+1kYmXibj+ydEF/anYLvC5jH+Kmc9Bg8/5IECvkXMMkLwqqXecsiyT8+T9ZNWBzB5Dp7vlPJMeHxyD6yLifhRn1EQvAkpPPt5ze2hGF75itV38Kl6DxecWCr1L6WbZjSCCXKYHkhQX7zxRnSmcoQMiLXRcAd9mpHni2+1/LXTWiPUEUUTexWNm89OOSeq4l7rAIW7fvFltl6uSu3zyOMjv/AaYM6MDHljmu0CGJXfQPZYrVwKLlx8WMFfcwZC71EsvDBHvNysHlIPup58NklnlY02KLXHalRUBsvEQglD1PJskJENoek0LWFakidOezIcsA3+xOO8hlWWqw+plOm3Whn1ZWLhWAvCzKCob87QxUoED8MY4GL5mflfpkZSArAo/gMUk0RaCSY2rHqBYcIQwFh36Zzixlt9VxuYTHaQ== MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2477;2:iovvaIdgrxBR8onYdX8WlzYq0fRTLrTDkEZYKNVEwNY0Hnfy/M7wVHhgqBtsxqc5sVhvZkeI68f8BRzbHB75PtwiSOyTDTAOujmzwiZ5uh42TrrqgnhtniincIZWYfPa74CSUPIt1TAXxNMFvKKqmGmox2iChvSLv3jw4PmLunU=;3:zRVabFoCTp2aZu8yTgoW1OHcDYeU7GF/OcJVh5+ZTSX/CXg0llUDhcHcQo72v0sVejdINMVJBGpb6vjqkQmFRTWYpAqs7XA4/HMm2JMswL0zMUTHwCVlPr8obpMaENMnyTjMNMGRwQILHm+jfiUaWPnkxkDO9qN5kwVNi/+lOlvompT1/QwIPQdmTRBJtzljroVNz3UOgAcFxsY0V6kCgZ9NTPNsSN2hTKsvn1Nu7/ilznQWQvZ+Laey4px3hdwWhWUfO8sUVGQsO6PBPar6lQ== X-MS-Office365-Filtering-Correlation-Id: 0dac5e19-e2e1-4fad-22b5-08d40c4ee353 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:MWHPR03MB2477; X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2477;25:L2ip417G1DlUSF7C+xFEEjp5mr2vPXMApzYg9/WiBGAsEo/F8AvncLEPpIYsvqn2kVS1IJgyr2f/j0pfIXd0Sj7OP+QRzaV0YTpcDxAmW64JGIDOYTg1qLsvcVbgsXPUed8EztRWwynvTbhJaoUUTROc8RiKgff3dqZjSZabqAhL8ifWh8qDWlJwT7DiniYUlvly8iRkJx8fluxDbatC1UtvCZVkLCL7b4vAbUCc9w6ldXLbmPEjdpCvF3Y1bV3Skzo2dSd2z4vT2QseTvhsCXwu10XaY6ZA4f4dfcyb5YisPp27MrF4NF//GhQWgTgYQ9KxNv8aXZU29Wz9ggnG0HdHE93f1DNJhzJCilcbdWA3toiMHMQy2tDMEHreA9niLCpONup0TfG1vvX4OCSaTSIJDGZt7DgBTnfsHMWsF28WjfffMi4YnCUKeBZm0WEUJrFxvDXMyWNAtty1ST7TDZoy6jJypORKdlId+KnEn6JOT87RTvYM4JYYMKF46ZDoVUwsDE02/1ZjsobZ7Jejgu1rnS88xcRaaMIys6lSfSDPj1D33DygFyQuH3JEMDxMgPGk+ueWDAyS4OTHb6cgPSKjJDh/b1QY1j8KimkREvE/A9+/RAjIECvtb3QSz61OehXcMLc90aU0XhCVzcQWIuKLrdxaWi8rLD/U8DTsb0SxjLkOl5R9aftrQ7kEMXgm7xo2HK5VWOUS7RY3seu8V+QdiDoJhmTLKFMsPW443JXIO3cPoyx+uRKvGtGp0h0c1RhLDGv63/1dCz7D7IfcrJ3AWJBqsi8TzU0FgNdVQz8= X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2477;31:ocFTQAGtHX++GhhQESfm1yNwnt/kriXsdgCh8bpyvi1Nha+AFjeQGLNrL7z3Y7aT88blhQ7HvUIGLBoAojS9+gApLIKTZ0bjt4FJSdAm2An3deGYP4nza76buLJlnYtaBnr0+ibKDVlhsQadwCnt72YbNt4Nz6+zQOBWVVP0CJRyeaeBBneFVJEIL8li4HpHIopXrTmSOFSLhxWQReIuLEhmwE21wKjqQ3j82RuOhsnVC2IazZ8qA3lmuJJcoSUDXnRsXK45awwoYh5jAEGahA==;4:wZNjnz2vdRgwxg6Qc+YhCVJCaUBsV/2fSldV644hZmii3gziwujj7lvndyzdWedhWKybsnbJXjggLQiTQS+3SiUg6dIg3dgYTcrpuU6t89dsU1p2XzBgHW06WZ65pYNHVW2lER2q4H/SfW+S9hQZhU1yaXkU9eTQj7pe/ow6UxjDT2vTLxNghQ/CJBfDbrx0ZnyzviG9+Lun4kn+flSmZAIr42uhwyU/FMQ/9BZYA/pVqTu8Y/fImEo+iZJLGpI8zGO6mLSIGqywQoCG9OMZ7w9X6W9RL4+x0A9z2MowS8xUrlvVZO5X6YakfYxMtgzMiiMp/ORoYb47tF2mPZHQBstkxjFHUylr36spVaXxwzWetOpqMum3LZSFoTGWq/tc2WtKrUiL4hfEYIIWfJv+3fxmUiGPF0P1erhmITJU4cuq+kyF0v1NoLCbEAtyv86Fv2c3DX73RHpwFlvGalparbFI+3SYO2fsezheg0g20tiAEGV2etOQm5KzgaeNKkRRzpLWMfqI5ieiv9JQTuEP+PZcnBNkA+3pNITTgbsA3uc= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(13017025)(13015025)(13023025)(13024025)(8121501046)(13018025)(5005006)(10201501046)(3002001)(6055026);SRVR:MWHPR03MB2477;BCL:0;PCL:0;RULEID:(400006);SRVR:MWHPR03MB2477; X-Forefront-PRVS: 0126A32F74 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR03MB2477;23:JTF9Tbb6MRPj9GSdsCQrhKLEPohW/GmsINaeIbl52?= =?us-ascii?Q?ABKayZJ94v+vDQrOwj+tJr8PFMsyXLzwCQjRHv4TgM1fnbShmpLZMP5XeRtu?= =?us-ascii?Q?R1PkZkmWf9SoyubUaNQraQuajrqvj/oO5rvfMQhPXkpis9VhPsOp7zeuwTIP?= =?us-ascii?Q?fyT5+NnQ9Z86o4PdDNlpq3REitUqe0w+uW82FWh6SXDIw+lIp/CJyj9ICha7?= =?us-ascii?Q?frLiVHSa74JQLlo5cddg+FDSwwhfj/OFPWA2O0pBnRQ8sD7u5xWkAZPDuJdM?= =?us-ascii?Q?awFmKjn4jDQuPlUbGq3aF6J5q2xlOVBPHc2AjxGjpW3Vtu42YB72oRuBcxy0?= =?us-ascii?Q?xluE8TlA5KoppZ+1DypS76eYM7A8k7Jd0Acx7iNMS5LrFlah3ILTeNC0zz6Y?= =?us-ascii?Q?JT1vUsarto+jtL16RoLD7I6kQMvoSOiDUnS1sRATczyKi/SDwEPgahR6owW0?= =?us-ascii?Q?LYQoWPz9WeHBVvmYqkw5ZewfNKCFLY9NPXwGeiV2UhVL/bUb88Spnk7td5lf?= =?us-ascii?Q?0ww4akEN2vOW6K5uegklWNtkyDsRM+y8CBhK+HXqlWzQWK38XBBhgudaxpvq?= =?us-ascii?Q?w5VKCor/iVh1m7dq26RgohN1uDW2cqBE0kOgJFWcrHUjpi486k/bl3XILQUb?= =?us-ascii?Q?1G/o1tUWl/pVrdaEAOobT6ijNiE5FWNiJD9iDk4VE1f4W+DbToP3FkfolNhc?= =?us-ascii?Q?K18iD/H0Vj3XoKkDwUtCDkFGcuIJhZEsJkvhibp5dwcTpu/Js30UDjBF9+uB?= =?us-ascii?Q?mCtw2Q6UF3g01yxjjDswEJ28AuG4ENhOJi/JtJt7qZLmlMbLIn+NFfuoxGeX?= =?us-ascii?Q?ssTXabfU7i1LSKrAbKm299FpTadcH6dK5f+vj8ZMewFyS99d27KjPQA0F6Dl?= =?us-ascii?Q?IRr959EF3lnXqh2xAdJNE4SwaN8PIJRQa5RT6l478yjMmcWtFkeIfhvbbIjZ?= =?us-ascii?Q?pihWPbBT/oojyuyi0LgxHsxgBnL6uMhqVn8w84CbTRnSerg+YyLMfRs1qpo6?= =?us-ascii?Q?ObjSXLmjC048mmjPXvi/d9NgQu6xlhPWvEH3m1Xsliec+/vRBil7DTwDx4RH?= =?us-ascii?Q?E05eAWnHvUsL62dGpDapEexnCD0LcZWgEIItQ9aTnUOv/SjsplnOdmrX0YE4?= =?us-ascii?Q?uKLCIVwZTMe8dRA57sWhs0QLd8FRV9PFzRr3qsA/Y2ZUkewbmCFYILaVH9N2?= =?us-ascii?Q?hKvMp0tFvrnbGvLDWXx/X7vAJ27mw+jIrn2aYy6GwE46vx/AcZB5c38IT+iW?= =?us-ascii?Q?+yy7x5TtJUkjtKYHLtLi9izAD5rMwP85tuREJD+w3f1b+mlqgiQA4ekzTNZ0?= =?us-ascii?B?UT09?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2477;6:vJt0iBZIybtc7bm46DJlhb+kk/hi1zavI91QYtsvprGpiFd5FsTkdS6YFD+WB7qTIg9huk3nNQwnWuE/7Pok4ZalTI4Dlt5+qTJoVbVjDG/INlvveGRWJV93oYkZxCPWzubFfJwIsotuxlDBsarm+k2Cj2Mw4Tfk58zNDzxqQGa8NvwQQSEnNWi7Z/IFq/aEF4lZIojj+XCLkaQS5kmevHe3WjqyMRopxQBdLnIt4pihug8f0I8RwSrBq+4b2wLzKD+FBETgx99IsGmxApNnESWYguqRI5R1291kiNVHq4CrZtisi+OAgCE2UYYhyNHy;5:DznmVl57gdbsOetDxjXKd6z5D9X8XmCnvxk2n15oEO9gNyQrLrl8WFMeMd9Q1aTKy63TWMCKbZ8cR2NPN3bgNHUH4/g3aHtBc86lLUwf9IgqVnHH29H/awSjXPssi8/mSHgE7LhNHpNZbdhl5bl5UpYr2o/kLsyyNUWxGjVi8LjL6pjYAr8m2QsP6FB2sYS+;24:7pwbRMYV9LddDOkrAhAPp7uW1VDbqD8O9p1mJIwg2GjhtvhtTbgejfjbyE2VRudqUtrmUPT2i1E3Udaj4h3s4N2OhdBChAxAtuBUPbRK9Z4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2477;7:2yLtmTsKETN4UO52yuRqHDwDObpCCprEhNGrTvTMHuhT8BGt+5YOoExucwBw6Qh7pJ5LO6HDJyaOb9ohiBychqfihvLRkNEqMcfl4I69yVJuJ2oJYUtp1DK1NV1soc7GyRcx987xwYN5PhqKBUAMnoyooCVMl5k+okgY5u9o9lSvfvCAXytvfURlPO8nwv7Fa5nDQtXSVqxgWxJffIDC9ouAXtl3msLEIZG/MmoGyGTPWotf7VFNtZ82JDtPswXUPC7nKWgl6FyLNUUuN7zrCHXgq92eeymOKiXEMpm7vT0rGcQ6l6INe5wvtVa+HcCPxjCtCyp1z+pG08qHzInD2VEttRKsoXtyzI+uesMhRUg= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Nov 2016 05:27:12.3509 (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.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR03MB2477 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 8803 Lines: 292 Adds qoriq usb 3.0 phy driver support for LS1043A platform. Describes the qoriq usb 2.0 phy driver binding, currently used for LS1043A platform. Signed-off-by: Sriram Dash --- .../devicetree/bindings/phy/phy-qoriq-usb3.txt | 36 ++++ drivers/phy/Kconfig | 8 + drivers/phy/Makefile | 1 + drivers/phy/phy-qoriq-usb3.c | 202 +++++++++++++++++++++ 4 files changed, 247 insertions(+) create mode 100644 Documentation/devicetree/bindings/phy/phy-qoriq-usb3.txt create mode 100644 drivers/phy/phy-qoriq-usb3.c diff --git a/Documentation/devicetree/bindings/phy/phy-qoriq-usb3.txt b/Documentation/devicetree/bindings/phy/phy-qoriq-usb3.txt new file mode 100644 index 0000000..d934c80 --- /dev/null +++ b/Documentation/devicetree/bindings/phy/phy-qoriq-usb3.txt @@ -0,0 +1,36 @@ +Driver for Freescale USB 3.0 PHY + +Required properties: + +- compatible : fsl,qoriq-usb3-phy +- reg : register mappings for Parameter Configuration Register + and Phy base offset. +- reg-names : "param_ctrl" and "phy_base" +- phy_type : For multi port host USB controllers, should be one of + "ulpi", or "serial". For dual role USB controllers, + should be one of "ulpi", "utmi", "utmi_wide", or "serial". + +Example: + usbphy0: usb3-phy@084F0000 { + compatible = "fsl,qoriq-usb3-phy"; + reg = <0x0 0x01570070 0x0 0xC>, <0x0 0x084F0000 0x0 0x5000>; + reg-names = "param_ctrl", "phy_base"; + #phy-cells = <0>; + phy_type = "utmi"; + }; + + usbphy1: usb3-phy@08500000 { + compatible = "fsl,qoriq-usb3-phy"; + reg = <0x0 0x0157007C 0x0 0xC>, <0x0 0x08500000 0x0 0x5000>; + reg-names = "param_ctrl", "phy_base"; + #phy-cells = <0>; + phy_type = "utmi"; + }; + + usbphy2: usb3-phy@08510000 { + compatible = "fsl,qoriq-usb3-phy"; + reg = <0x0 0x01570088 0x0 0xC>, <0x0 0x08510000 0x0 0x5000>; + reg-names = "param_ctrl", "phy_base"; + #phy-cells = <0>; + phy_type = "utmi"; + }; diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig index fe00f91..4caa91c 100644 --- a/drivers/phy/Kconfig +++ b/drivers/phy/Kconfig @@ -489,4 +489,12 @@ config PHY_NS2_PCIE help Enable this to support the Broadcom Northstar2 PCIe PHY. If unsure, say N. + +config PHY_QORIQ_USB3 + tristate "Freescale QorIQ USB 3.0 PHY driver" + depends on ARCH_LAYERSCAPE + depends on OF + select GENERIC_PHY + help + Enable this to support the USB3.0 PHY on the QorIQ SoC. endmenu diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile index a534cf5..a47ee36b 100644 --- a/drivers/phy/Makefile +++ b/drivers/phy/Makefile @@ -60,3 +60,4 @@ obj-$(CONFIG_PHY_PISTACHIO_USB) += phy-pistachio-usb.o obj-$(CONFIG_PHY_CYGNUS_PCIE) += phy-bcm-cygnus-pcie.o obj-$(CONFIG_ARCH_TEGRA) += tegra/ obj-$(CONFIG_PHY_NS2_PCIE) += phy-bcm-ns2-pcie.o +obj-$(CONFIG_PHY_QORIQ_USB3) += phy-qoriq-usb3.o diff --git a/drivers/phy/phy-qoriq-usb3.c b/drivers/phy/phy-qoriq-usb3.c new file mode 100644 index 0000000..5255089 --- /dev/null +++ b/drivers/phy/phy-qoriq-usb3.c @@ -0,0 +1,202 @@ +/* + * Freescale QorIQ USB3 phy driver + * + * Copyright 2016 Freescale Semiconductor, Inc. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Author: Sriram Dash + * + * This program is distributed in the hope that 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. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Parameter control */ +#define USB3PRM1CR 0x000 +#define USB3PRM1CR_VAL 0x27672b2a + +/* + * struct qoriq_usb3_phy - driver data for USB 3.0 PHY + * @dev: pointer to device instance of this platform device + * @param_ctrl: usb3 phy parameter control register base + * @phy_base: usb3 phy register memory base + * @has_erratum_flag: keeps track of erratum applicable on device + */ +struct qoriq_usb3_phy { + struct device *dev; + void __iomem *param_ctrl; + void __iomem *phy_base; + u32 has_erratum_flag; +}; + +static inline u32 qoriq_usb3_phy_readl(void __iomem *addr, u32 offset) +{ + return __raw_readl(addr + offset); +} + +static inline void qoriq_usb3_phy_writel(void __iomem *addr, u32 offset, + u32 data) +{ + __raw_writel(data, addr + offset); +} + +/* + * Erratum A008751 + * SCFG USB3PRM1CR has incorrect default value + * SCFG USB3PRM1CR reset value should be 32'h27672B2A instead of 32'h25E72B2A. + */ +static void erratum_a008751(struct qoriq_usb3_phy *phy) +{ + qoriq_usb3_phy_writel(phy->param_ctrl, USB3PRM1CR, + USB3PRM1CR_VAL); +} + +/* + * qoriq_usb3_phy_erratum - List of phy erratum + * @qoriq_phy_erratum - erratum application + * @compat - comapt string for erratum + */ + +struct qoriq_usb3_phy_erratum { + void (*qoriq_phy_erratum)(struct qoriq_usb3_phy *phy); + char *compat; +}; + +/* Erratum list */ +struct qoriq_usb3_phy_erratum phy_erratum_tbl[] = { + {&erratum_a008751, "fsl,usb-erratum-a008751"}, + /* Add init time erratum here */ +}; + +static int qoriq_usb3_phy_init(struct phy *x) +{ + struct qoriq_usb3_phy *phy = phy_get_drvdata(x); + int i; + + for (i = 0; i < ARRAY_SIZE(phy_erratum_tbl); i++) + if (phy->has_erratum_flag & 1 << i) + phy_erratum_tbl[i].qoriq_phy_erratum(phy); + return 0; +} + +static const struct phy_ops ops = { + .init = qoriq_usb3_phy_init, + .owner = THIS_MODULE, +}; + +static int qoriq_usb3_phy_probe(struct platform_device *pdev) +{ + struct qoriq_usb3_phy *phy; + struct phy *generic_phy; + struct phy_provider *phy_provider; + const struct of_device_id *of_id; + struct device *dev = &pdev->dev; + struct resource *res; + int i, ret; + + phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL); + if (!phy) + return -ENOMEM; + phy->dev = dev; + + of_id = of_match_device(dev->driver->of_match_table, dev); + if (!of_id) { + dev_err(dev, "failed to get device match\n"); + ret = -EINVAL; + goto err_out; + } + + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "param_ctrl"); + if (!res) { + dev_err(dev, "failed to get param_ctrl memory\n"); + ret = -ENOENT; + goto err_out; + } + + phy->param_ctrl = devm_ioremap_resource(dev, res); + if (!phy->param_ctrl) { + dev_err(dev, "failed to remap param_ctrl memory\n"); + ret = -ENOMEM; + goto err_out; + } + + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "phy_base"); + if (!res) { + dev_err(dev, "failed to get phy_base memory\n"); + ret = -ENOENT; + goto err_out; + } + + phy->phy_base = devm_ioremap_resource(dev, res); + if (!phy->phy_base) { + dev_err(dev, "failed to remap phy_base memory\n"); + ret = -ENOMEM; + goto err_out; + } + + phy->has_erratum_flag = 0; + for (i = 0; i < ARRAY_SIZE(phy_erratum_tbl); i++) + phy->has_erratum_flag |= device_property_read_bool(dev, + phy_erratum_tbl[i].compat) << i; + + platform_set_drvdata(pdev, phy); + + generic_phy = devm_phy_create(dev, NULL, &ops); + if (IS_ERR(generic_phy)) + return PTR_ERR(generic_phy); + + phy_set_drvdata(generic_phy, phy); + + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); + if (IS_ERR(phy_provider)) + return PTR_ERR(phy_provider); + + return 0; +err_out: + return ret; +} + +static const struct of_device_id qoriq_usb3_phy_dt_ids[] = { + { + .compatible = "fsl,qoriq-usb3-phy" + }, + {} +}; +MODULE_DEVICE_TABLE(of, qoriq_usb3_phy_dt_ids); + +static struct platform_driver qoriq_usb3_phy_driver = { + .probe = qoriq_usb3_phy_probe, + .driver = { + .name = "qoriq_usb3_phy", + .of_match_table = qoriq_usb3_phy_dt_ids, + }, +}; + +module_platform_driver(qoriq_usb3_phy_driver); + +MODULE_ALIAS("platform:qoriq_usb3_phy"); +MODULE_AUTHOR("Sriram Dash "); +MODULE_DESCRIPTION("Freescale QorIQ USB3 phy driver"); +MODULE_LICENSE("GPL v2"); -- 2.1.0