From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E1EA2C4321D for ; Wed, 22 Aug 2018 20:43:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9902D208B7 for ; Wed, 22 Aug 2018 20:43:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9902D208B7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=v3.sk Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728312AbeHWAJ7 (ORCPT ); Wed, 22 Aug 2018 20:09:59 -0400 Received: from shell.v3.sk ([90.176.6.54]:53271 "EHLO shell.v3.sk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728196AbeHWAJ6 (ORCPT ); Wed, 22 Aug 2018 20:09:58 -0400 Received: from localhost (localhost [127.0.0.1]) by zimbra.v3.sk (Postfix) with ESMTP id 6F77EB5B8E; Wed, 22 Aug 2018 22:43:31 +0200 (CEST) Received: from shell.v3.sk ([127.0.0.1]) by localhost (zimbra.v3.sk [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id YV8KnsStwmzd; Wed, 22 Aug 2018 22:43:16 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by zimbra.v3.sk (Postfix) with ESMTP id ABBE6B5B91; Wed, 22 Aug 2018 22:43:13 +0200 (CEST) X-Virus-Scanned: amavisd-new at zimbra.v3.sk Received: from shell.v3.sk ([127.0.0.1]) by localhost (zimbra.v3.sk [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id FX4bSI4UgD7e; Wed, 22 Aug 2018 22:43:11 +0200 (CEST) Received: from odvarok.lan (ip-89-102-31-34.net.upcbroadband.cz [89.102.31.34]) by zimbra.v3.sk (Postfix) with ESMTPSA id 51912B5B8D; Wed, 22 Aug 2018 22:43:11 +0200 (CEST) From: Lubomir Rintel To: linux-kernel@vger.kernel.org Cc: linux-usb@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Rob Herring , Mark Rutland , Greg Kroah-Hartman , Eric Miao , Haojian Zhuang , Kishon Vijay Abraham I , Alan Stern , Lubomir Rintel Subject: [PATCH 03/14] USB: EHCI: make ehci-mv a separate driver Date: Wed, 22 Aug 2018 22:42:56 +0200 Message-Id: <20180822204307.13251-4-lkundrak@v3.sk> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180822204307.13251-1-lkundrak@v3.sk> References: <20180822204307.13251-1-lkundrak@v3.sk> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is done do that it could be enabled alongside other platform EHCI glue drivers on multiplatform kernels. Signed-off-by: Lubomir Rintel --- drivers/usb/host/Kconfig | 2 +- drivers/usb/host/Makefile | 1 + drivers/usb/host/ehci-hcd.c | 5 -- drivers/usb/host/ehci-mv.c | 98 ++++++++++++++++--------------------- 4 files changed, 44 insertions(+), 62 deletions(-) diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 1a4ea98cac2a..16758b12a5e9 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -276,7 +276,7 @@ config USB_EHCI_EXYNOS Enable support for the Samsung Exynos SOC's on-chip EHCI controller. config USB_EHCI_MV - bool "EHCI support for Marvell PXA/MMP USB controller" + tristate "EHCI support for Marvell PXA/MMP USB controller" depends on (ARCH_PXA || ARCH_MMP) select USB_EHCI_ROOT_HUB_TT ---help--- diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index e6235269c151..84514f71ae44 100644 --- a/drivers/usb/host/Makefile +++ b/drivers/usb/host/Makefile @@ -87,6 +87,7 @@ obj-$(CONFIG_USB_IMX21_HCD) += imx21-hcd.o obj-$(CONFIG_USB_FSL_USB2) += fsl-mph-dr-of.o obj-$(CONFIG_USB_EHCI_FSL) += fsl-mph-dr-of.o obj-$(CONFIG_USB_EHCI_FSL) += ehci-fsl.o +obj-$(CONFIG_USB_EHCI_MV) += ehci-mv.o obj-$(CONFIG_USB_HCD_BCMA) += bcma-hcd.o obj-$(CONFIG_USB_HCD_SSB) += ssb-hcd.o obj-$(CONFIG_USB_FOTG210_HCD) += fotg210-hcd.o diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 8608ac513fb7..e8d7667828eb 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -1286,11 +1286,6 @@ MODULE_LICENSE ("GPL"); #define PLATFORM_DRIVER ehci_grlib_driver #endif -#ifdef CONFIG_USB_EHCI_MV -#include "ehci-mv.c" -#define PLATFORM_DRIVER ehci_mv_driver -#endif - static int __init ehci_hcd_init(void) { int retval = 0; diff --git a/drivers/usb/host/ehci-mv.c b/drivers/usb/host/ehci-mv.c index de764459e05a..77a4ab1dcd07 100644 --- a/drivers/usb/host/ehci-mv.c +++ b/drivers/usb/host/ehci-mv.c @@ -12,12 +12,17 @@ #include #include #include +#include + +#include + +#include "ehci.h" #define CAPLENGTH_MASK (0xff) -struct ehci_hcd_mv { - struct usb_hcd *hcd; +#define hcd_to_ehci_hcd_mv(h) ((struct ehci_hcd_mv *)hcd_to_ehci(h)->priv) +struct ehci_hcd_mv { /* Which mode does this ehci running OTG/Host ? */ int mode; @@ -66,7 +71,7 @@ static void mv_ehci_disable(struct ehci_hcd_mv *ehci_mv) static int mv_ehci_reset(struct usb_hcd *hcd) { struct device *dev = hcd->self.controller; - struct ehci_hcd_mv *ehci_mv = dev_get_drvdata(dev); + struct ehci_hcd_mv *ehci_mv = hcd_to_ehci_hcd_mv(hcd); int retval; if (ehci_mv == NULL) { @@ -83,46 +88,11 @@ static int mv_ehci_reset(struct usb_hcd *hcd) return retval; } -static const struct hc_driver mv_ehci_hc_driver = { - .description = hcd_name, - .product_desc = "Marvell EHCI", - .hcd_priv_size = sizeof(struct ehci_hcd), - - /* - * generic hardware linkage - */ - .irq = ehci_irq, - .flags = HCD_MEMORY | HCD_USB2 | HCD_BH, - - /* - * basic lifecycle operations - */ - .reset = mv_ehci_reset, - .start = ehci_run, - .stop = ehci_stop, - .shutdown = ehci_shutdown, - - /* - * managing i/o requests and associated device resources - */ - .urb_enqueue = ehci_urb_enqueue, - .urb_dequeue = ehci_urb_dequeue, - .endpoint_disable = ehci_endpoint_disable, - .endpoint_reset = ehci_endpoint_reset, - .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, - - /* - * scheduling support - */ - .get_frame_number = ehci_get_frame, - - /* - * root hub support - */ - .hub_status_data = ehci_hub_status_data, - .hub_control = ehci_hub_control, - .bus_suspend = ehci_bus_suspend, - .bus_resume = ehci_bus_resume, +static struct hc_driver __read_mostly ehci_platform_hc_driver; + +static const struct ehci_driver_overrides platform_overrides __initconst = { + .reset = mv_ehci_reset, + .extra_priv_size = sizeof(struct ehci_hcd_mv), }; static int mv_ehci_probe(struct platform_device *pdev) @@ -143,19 +113,13 @@ static int mv_ehci_probe(struct platform_device *pdev) if (usb_disabled()) return -ENODEV; - hcd = usb_create_hcd(&mv_ehci_hc_driver, &pdev->dev, "mv ehci"); + hcd = usb_create_hcd(&ehci_platform_hc_driver, &pdev->dev, "mv ehci"); if (!hcd) return -ENOMEM; - ehci_mv = devm_kzalloc(&pdev->dev, sizeof(*ehci_mv), GFP_KERNEL); - if (ehci_mv == NULL) { - retval = -ENOMEM; - goto err_put_hcd; - } - - platform_set_drvdata(pdev, ehci_mv); + platform_set_drvdata(pdev, hcd); + ehci_mv = hcd_to_ehci_hcd_mv(hcd); ehci_mv->pdata = pdata; - ehci_mv->hcd = hcd; ehci_mv->clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(ehci_mv->clk)) { @@ -262,8 +226,8 @@ static int mv_ehci_probe(struct platform_device *pdev) static int mv_ehci_remove(struct platform_device *pdev) { - struct ehci_hcd_mv *ehci_mv = platform_get_drvdata(pdev); - struct usb_hcd *hcd = ehci_mv->hcd; + struct usb_hcd *hcd = platform_get_drvdata(pdev); + struct ehci_hcd_mv *ehci_mv = hcd_to_ehci_hcd_mv(hcd); if (hcd->rh_registered) usb_remove_hcd(hcd); @@ -295,8 +259,8 @@ static const struct platform_device_id ehci_id_table[] = { static void mv_ehci_shutdown(struct platform_device *pdev) { - struct ehci_hcd_mv *ehci_mv = platform_get_drvdata(pdev); - struct usb_hcd *hcd = ehci_mv->hcd; + struct usb_hcd *hcd = platform_get_drvdata(pdev); + struct ehci_hcd_mv *ehci_mv = hcd_to_ehci_hcd_mv(hcd); if (!hcd->rh_registered) return; @@ -315,3 +279,25 @@ static struct platform_driver ehci_mv_driver = { }, .id_table = ehci_id_table, }; + +static int __init ehci_platform_init(void) +{ + if (usb_disabled()) + return -ENODEV; + + ehci_init_driver(&ehci_platform_hc_driver, &platform_overrides); + return platform_driver_register(&ehci_mv_driver); +} +module_init(ehci_platform_init); + +static void __exit ehci_platform_cleanup(void) +{ + platform_driver_unregister(&ehci_mv_driver); +} +module_exit(ehci_platform_cleanup); + +MODULE_DESCRIPTION("Marvell EHCI driver"); +MODULE_AUTHOR("Chao Xie "); +MODULE_AUTHOR("Neil Zhang "); +MODULE_ALIAS("mv-ehci"); +MODULE_LICENSE("GPL"); -- 2.17.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [03/14] USB: EHCI: make ehci-mv a separate driver From: Lubomir Rintel Message-Id: <20180822204307.13251-4-lkundrak@v3.sk> Date: Wed, 22 Aug 2018 22:42:56 +0200 To: linux-kernel@vger.kernel.org Cc: linux-usb@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Rob Herring , Mark Rutland , Greg Kroah-Hartman , Eric Miao , Haojian Zhuang , Kishon Vijay Abraham I , Alan Stern , Lubomir Rintel List-ID: VGhpcyBpcyBkb25lIGRvIHRoYXQgaXQgY291bGQgYmUgZW5hYmxlZCBhbG9uZ3NpZGUgb3RoZXIg cGxhdGZvcm0gRUhDSQpnbHVlIGRyaXZlcnMgb24gbXVsdGlwbGF0Zm9ybSBrZXJuZWxzLgoKU2ln bmVkLW9mZi1ieTogTHVib21pciBSaW50ZWwgPGxrdW5kcmFrQHYzLnNrPgotLS0KIGRyaXZlcnMv dXNiL2hvc3QvS2NvbmZpZyAgICB8ICAyICstCiBkcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxlICAg fCAgMSArCiBkcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMgfCAgNSAtLQogZHJpdmVycy91c2Iv aG9zdC9laGNpLW12LmMgIHwgOTggKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0t LQogNCBmaWxlcyBjaGFuZ2VkLCA0NCBpbnNlcnRpb25zKCspLCA2MiBkZWxldGlvbnMoLSkKCmRp ZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9ob3N0L0tj b25maWcKaW5kZXggMWE0ZWE5OGNhYzJhLi4xNjc1OGIxMmE1ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvdXNiL2hvc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKQEAgLTI3 Niw3ICsyNzYsNyBAQCBjb25maWcgVVNCX0VIQ0lfRVhZTk9TCiAJRW5hYmxlIHN1cHBvcnQgZm9y IHRoZSBTYW1zdW5nIEV4eW5vcyBTT0MncyBvbi1jaGlwIEVIQ0kgY29udHJvbGxlci4KIAogY29u ZmlnIFVTQl9FSENJX01WCi0JYm9vbCAiRUhDSSBzdXBwb3J0IGZvciBNYXJ2ZWxsIFBYQS9NTVAg VVNCIGNvbnRyb2xsZXIiCisJdHJpc3RhdGUgIkVIQ0kgc3VwcG9ydCBmb3IgTWFydmVsbCBQWEEv TU1QIFVTQiBjb250cm9sbGVyIgogCWRlcGVuZHMgb24gKEFSQ0hfUFhBIHx8IEFSQ0hfTU1QKQog CXNlbGVjdCBVU0JfRUhDSV9ST09UX0hVQl9UVAogCS0tLWhlbHAtLS0KZGlmZiAtLWdpdCBhL2Ry aXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxlCmluZGV4 IGU2MjM1MjY5YzE1MS4uODQ1MTRmNzFhZTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0 L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUKQEAgLTg3LDYgKzg3LDcg QEAgb2JqLSQoQ09ORklHX1VTQl9JTVgyMV9IQ0QpCSs9IGlteDIxLWhjZC5vCiBvYmotJChDT05G SUdfVVNCX0ZTTF9VU0IyKQkrPSBmc2wtbXBoLWRyLW9mLm8KIG9iai0kKENPTkZJR19VU0JfRUhD SV9GU0wpCSs9IGZzbC1tcGgtZHItb2Yubwogb2JqLSQoQ09ORklHX1VTQl9FSENJX0ZTTCkJKz0g ZWhjaS1mc2wubworb2JqLSQoQ09ORklHX1VTQl9FSENJX01WKQkrPSBlaGNpLW12Lm8KIG9iai0k KENPTkZJR19VU0JfSENEX0JDTUEpCSs9IGJjbWEtaGNkLm8KIG9iai0kKENPTkZJR19VU0JfSENE X1NTQikJKz0gc3NiLWhjZC5vCiBvYmotJChDT05GSUdfVVNCX0ZPVEcyMTBfSENEKQkrPSBmb3Rn MjEwLWhjZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMgYi9kcml2 ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKaW5kZXggODYwOGFjNTEzZmI3Li5lOGQ3NjY3ODI4ZWIg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYworKysgYi9kcml2ZXJzL3Vz Yi9ob3N0L2VoY2ktaGNkLmMKQEAgLTEyODYsMTEgKzEyODYsNiBAQCBNT0RVTEVfTElDRU5TRSAo IkdQTCIpOwogI2RlZmluZSBQTEFURk9STV9EUklWRVIJCWVoY2lfZ3JsaWJfZHJpdmVyCiAjZW5k aWYKIAotI2lmZGVmIENPTkZJR19VU0JfRUhDSV9NVgotI2luY2x1ZGUgImVoY2ktbXYuYyIKLSNk ZWZpbmUgICAgICAgIFBMQVRGT1JNX0RSSVZFUiAgICAgICAgIGVoY2lfbXZfZHJpdmVyCi0jZW5k aWYKLQogc3RhdGljIGludCBfX2luaXQgZWhjaV9oY2RfaW5pdCh2b2lkKQogewogCWludCByZXR2 YWwgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLW12LmMgYi9kcml2ZXJz L3VzYi9ob3N0L2VoY2ktbXYuYwppbmRleCBkZTc2NDQ1OWUwNWEuLjc3YTRhYjFkY2QwNyAxMDA2 NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLW12LmMKKysrIGIvZHJpdmVycy91c2IvaG9z dC9laGNpLW12LmMKQEAgLTEyLDEyICsxMiwxNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgog I2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRh L212X3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC91c2Iv aGNkLmg+CisKKyNpbmNsdWRlICJlaGNpLmgiCiAKICNkZWZpbmUgQ0FQTEVOR1RIX01BU0sgICAg ICAgICAoMHhmZikKIAotc3RydWN0IGVoY2lfaGNkX212IHsKLQlzdHJ1Y3QgdXNiX2hjZCAqaGNk OworI2RlZmluZSBoY2RfdG9fZWhjaV9oY2RfbXYoaCkgKChzdHJ1Y3QgZWhjaV9oY2RfbXYgKilo Y2RfdG9fZWhjaShoKS0+cHJpdikKIAorc3RydWN0IGVoY2lfaGNkX212IHsKIAkvKiBXaGljaCBt b2RlIGRvZXMgdGhpcyBlaGNpIHJ1bm5pbmcgT1RHL0hvc3QgPyAqLwogCWludCBtb2RlOwogCkBA IC02Niw3ICs3MSw3IEBAIHN0YXRpYyB2b2lkIG12X2VoY2lfZGlzYWJsZShzdHJ1Y3QgZWhjaV9o Y2RfbXYgKmVoY2lfbXYpCiBzdGF0aWMgaW50IG12X2VoY2lfcmVzZXQoc3RydWN0IHVzYl9oY2Qg KmhjZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoY2QtPnNlbGYuY29udHJvbGxlcjsKLQlz dHJ1Y3QgZWhjaV9oY2RfbXYgKmVoY2lfbXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1 Y3QgZWhjaV9oY2RfbXYgKmVoY2lfbXYgPSBoY2RfdG9fZWhjaV9oY2RfbXYoaGNkKTsKIAlpbnQg cmV0dmFsOwogCiAJaWYgKGVoY2lfbXYgPT0gTlVMTCkgewpAQCAtODMsNDYgKzg4LDExIEBAIHN0 YXRpYyBpbnQgbXZfZWhjaV9yZXNldChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogCXJldHVybiByZXR2 YWw7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGNfZHJpdmVyIG12X2VoY2lfaGNfZHJpdmVy ID0gewotCS5kZXNjcmlwdGlvbiA9IGhjZF9uYW1lLAotCS5wcm9kdWN0X2Rlc2MgPSAiTWFydmVs bCBFSENJIiwKLQkuaGNkX3ByaXZfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZWhjaV9oY2QpLAotCi0J LyoKLQkgKiBnZW5lcmljIGhhcmR3YXJlIGxpbmthZ2UKLQkgKi8KLQkuaXJxID0gZWhjaV9pcnEs Ci0JLmZsYWdzID0gSENEX01FTU9SWSB8IEhDRF9VU0IyIHwgSENEX0JILAotCi0JLyoKLQkgKiBi YXNpYyBsaWZlY3ljbGUgb3BlcmF0aW9ucwotCSAqLwotCS5yZXNldCA9IG12X2VoY2lfcmVzZXQs Ci0JLnN0YXJ0ID0gZWhjaV9ydW4sCi0JLnN0b3AgPSBlaGNpX3N0b3AsCi0JLnNodXRkb3duID0g ZWhjaV9zaHV0ZG93biwKLQotCS8qCi0JICogbWFuYWdpbmcgaS9vIHJlcXVlc3RzIGFuZCBhc3Nv Y2lhdGVkIGRldmljZSByZXNvdXJjZXMKLQkgKi8KLQkudXJiX2VucXVldWUgPSBlaGNpX3VyYl9l bnF1ZXVlLAotCS51cmJfZGVxdWV1ZSA9IGVoY2lfdXJiX2RlcXVldWUsCi0JLmVuZHBvaW50X2Rp c2FibGUgPSBlaGNpX2VuZHBvaW50X2Rpc2FibGUsCi0JLmVuZHBvaW50X3Jlc2V0ID0gZWhjaV9l bmRwb2ludF9yZXNldCwKLQkuY2xlYXJfdHRfYnVmZmVyX2NvbXBsZXRlID0gZWhjaV9jbGVhcl90 dF9idWZmZXJfY29tcGxldGUsCi0KLQkvKgotCSAqIHNjaGVkdWxpbmcgc3VwcG9ydAotCSAqLwot CS5nZXRfZnJhbWVfbnVtYmVyID0gZWhjaV9nZXRfZnJhbWUsCi0KLQkvKgotCSAqIHJvb3QgaHVi IHN1cHBvcnQKLQkgKi8KLQkuaHViX3N0YXR1c19kYXRhID0gZWhjaV9odWJfc3RhdHVzX2RhdGEs Ci0JLmh1Yl9jb250cm9sID0gZWhjaV9odWJfY29udHJvbCwKLQkuYnVzX3N1c3BlbmQgPSBlaGNp X2J1c19zdXNwZW5kLAotCS5idXNfcmVzdW1lID0gZWhjaV9idXNfcmVzdW1lLAorc3RhdGljIHN0 cnVjdCBoY19kcml2ZXIgX19yZWFkX21vc3RseSBlaGNpX3BsYXRmb3JtX2hjX2RyaXZlcjsKKwor c3RhdGljIGNvbnN0IHN0cnVjdCBlaGNpX2RyaXZlcl9vdmVycmlkZXMgcGxhdGZvcm1fb3ZlcnJp ZGVzIF9faW5pdGNvbnN0ID0geworCS5yZXNldCA9CQltdl9laGNpX3Jlc2V0LAorCS5leHRyYV9w cml2X3NpemUgPQlzaXplb2Yoc3RydWN0IGVoY2lfaGNkX212KSwKIH07CiAKIHN0YXRpYyBpbnQg bXZfZWhjaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMTQzLDE5ICsx MTMsMTMgQEAgc3RhdGljIGludCBtdl9laGNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug KnBkZXYpCiAJaWYgKHVzYl9kaXNhYmxlZCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWhjZCA9 IHVzYl9jcmVhdGVfaGNkKCZtdl9laGNpX2hjX2RyaXZlciwgJnBkZXYtPmRldiwgIm12IGVoY2ki KTsKKwloY2QgPSB1c2JfY3JlYXRlX2hjZCgmZWhjaV9wbGF0Zm9ybV9oY19kcml2ZXIsICZwZGV2 LT5kZXYsICJtdiBlaGNpIik7CiAJaWYgKCFoY2QpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZWhj aV9tdiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmVoY2lfbXYpLCBHRlBfS0VS TkVMKTsKLQlpZiAoZWhjaV9tdiA9PSBOVUxMKSB7Ci0JCXJldHZhbCA9IC1FTk9NRU07Ci0JCWdv dG8gZXJyX3B1dF9oY2Q7Ci0JfQotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZWhjaV9t dik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaGNkKTsKKwllaGNpX212ID0gaGNkX3Rv X2VoY2lfaGNkX212KGhjZCk7CiAJZWhjaV9tdi0+cGRhdGEgPSBwZGF0YTsKLQllaGNpX212LT5o Y2QgPSBoY2Q7CiAKIAllaGNpX212LT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVM TCk7CiAJaWYgKElTX0VSUihlaGNpX212LT5jbGspKSB7CkBAIC0yNjIsOCArMjI2LDggQEAgc3Rh dGljIGludCBtdl9laGNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAKIHN0 YXRpYyBpbnQgbXZfZWhjaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsK LQlzdHJ1Y3QgZWhjaV9oY2RfbXYgKmVoY2lfbXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2 KTsKLQlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gZWhjaV9tdi0+aGNkOworCXN0cnVjdCB1c2JfaGNk ICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZWhjaV9oY2RfbXYg KmVoY2lfbXYgPSBoY2RfdG9fZWhjaV9oY2RfbXYoaGNkKTsKIAogCWlmIChoY2QtPnJoX3JlZ2lz dGVyZWQpCiAJCXVzYl9yZW1vdmVfaGNkKGhjZCk7CkBAIC0yOTUsOCArMjU5LDggQEAgc3RhdGlj IGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgZWhjaV9pZF90YWJsZVtdID0gewogCiBz dGF0aWMgdm9pZCBtdl9laGNpX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYp CiB7Ci0Jc3RydWN0IGVoY2lfaGNkX212ICplaGNpX212ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEo cGRldik7Ci0Jc3RydWN0IHVzYl9oY2QgKmhjZCA9IGVoY2lfbXYtPmhjZDsKKwlzdHJ1Y3QgdXNi X2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGVoY2lfaGNk X212ICplaGNpX212ID0gaGNkX3RvX2VoY2lfaGNkX212KGhjZCk7CiAKIAlpZiAoIWhjZC0+cmhf cmVnaXN0ZXJlZCkKIAkJcmV0dXJuOwpAQCAtMzE1LDMgKzI3OSwyNSBAQCBzdGF0aWMgc3RydWN0 IHBsYXRmb3JtX2RyaXZlciBlaGNpX212X2RyaXZlciA9IHsKIAkJICAgfSwKIAkuaWRfdGFibGUg PSBlaGNpX2lkX3RhYmxlLAogfTsKKworc3RhdGljIGludCBfX2luaXQgZWhjaV9wbGF0Zm9ybV9p bml0KHZvaWQpCit7CisJaWYgKHVzYl9kaXNhYmxlZCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwor CWVoY2lfaW5pdF9kcml2ZXIoJmVoY2lfcGxhdGZvcm1faGNfZHJpdmVyLCAmcGxhdGZvcm1fb3Zl cnJpZGVzKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZlaGNpX212X2RyaXZl cik7Cit9Cittb2R1bGVfaW5pdChlaGNpX3BsYXRmb3JtX2luaXQpOworCitzdGF0aWMgdm9pZCBf X2V4aXQgZWhjaV9wbGF0Zm9ybV9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3Vu cmVnaXN0ZXIoJmVoY2lfbXZfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGVoY2lfcGxhdGZvcm1f Y2xlYW51cCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTWFydmVsbCBFSENJIGRyaXZlciIpOwor TU9EVUxFX0FVVEhPUigiQ2hhbyBYaWUgPGNoYW8ueGllQG1hcnZlbGwuY29tPiIpOworTU9EVUxF X0FVVEhPUigiTmVpbCBaaGFuZyA8emhhbmd3bUBtYXJ2ZWxsLmNvbT4iKTsKK01PRFVMRV9BTElB UygibXYtZWhjaSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: lkundrak@v3.sk (Lubomir Rintel) Date: Wed, 22 Aug 2018 22:42:56 +0200 Subject: [PATCH 03/14] USB: EHCI: make ehci-mv a separate driver In-Reply-To: <20180822204307.13251-1-lkundrak@v3.sk> References: <20180822204307.13251-1-lkundrak@v3.sk> Message-ID: <20180822204307.13251-4-lkundrak@v3.sk> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org This is done do that it could be enabled alongside other platform EHCI glue drivers on multiplatform kernels. Signed-off-by: Lubomir Rintel --- drivers/usb/host/Kconfig | 2 +- drivers/usb/host/Makefile | 1 + drivers/usb/host/ehci-hcd.c | 5 -- drivers/usb/host/ehci-mv.c | 98 ++++++++++++++++--------------------- 4 files changed, 44 insertions(+), 62 deletions(-) diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 1a4ea98cac2a..16758b12a5e9 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -276,7 +276,7 @@ config USB_EHCI_EXYNOS Enable support for the Samsung Exynos SOC's on-chip EHCI controller. config USB_EHCI_MV - bool "EHCI support for Marvell PXA/MMP USB controller" + tristate "EHCI support for Marvell PXA/MMP USB controller" depends on (ARCH_PXA || ARCH_MMP) select USB_EHCI_ROOT_HUB_TT ---help--- diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index e6235269c151..84514f71ae44 100644 --- a/drivers/usb/host/Makefile +++ b/drivers/usb/host/Makefile @@ -87,6 +87,7 @@ obj-$(CONFIG_USB_IMX21_HCD) += imx21-hcd.o obj-$(CONFIG_USB_FSL_USB2) += fsl-mph-dr-of.o obj-$(CONFIG_USB_EHCI_FSL) += fsl-mph-dr-of.o obj-$(CONFIG_USB_EHCI_FSL) += ehci-fsl.o +obj-$(CONFIG_USB_EHCI_MV) += ehci-mv.o obj-$(CONFIG_USB_HCD_BCMA) += bcma-hcd.o obj-$(CONFIG_USB_HCD_SSB) += ssb-hcd.o obj-$(CONFIG_USB_FOTG210_HCD) += fotg210-hcd.o diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 8608ac513fb7..e8d7667828eb 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -1286,11 +1286,6 @@ MODULE_LICENSE ("GPL"); #define PLATFORM_DRIVER ehci_grlib_driver #endif -#ifdef CONFIG_USB_EHCI_MV -#include "ehci-mv.c" -#define PLATFORM_DRIVER ehci_mv_driver -#endif - static int __init ehci_hcd_init(void) { int retval = 0; diff --git a/drivers/usb/host/ehci-mv.c b/drivers/usb/host/ehci-mv.c index de764459e05a..77a4ab1dcd07 100644 --- a/drivers/usb/host/ehci-mv.c +++ b/drivers/usb/host/ehci-mv.c @@ -12,12 +12,17 @@ #include #include #include +#include + +#include + +#include "ehci.h" #define CAPLENGTH_MASK (0xff) -struct ehci_hcd_mv { - struct usb_hcd *hcd; +#define hcd_to_ehci_hcd_mv(h) ((struct ehci_hcd_mv *)hcd_to_ehci(h)->priv) +struct ehci_hcd_mv { /* Which mode does this ehci running OTG/Host ? */ int mode; @@ -66,7 +71,7 @@ static void mv_ehci_disable(struct ehci_hcd_mv *ehci_mv) static int mv_ehci_reset(struct usb_hcd *hcd) { struct device *dev = hcd->self.controller; - struct ehci_hcd_mv *ehci_mv = dev_get_drvdata(dev); + struct ehci_hcd_mv *ehci_mv = hcd_to_ehci_hcd_mv(hcd); int retval; if (ehci_mv == NULL) { @@ -83,46 +88,11 @@ static int mv_ehci_reset(struct usb_hcd *hcd) return retval; } -static const struct hc_driver mv_ehci_hc_driver = { - .description = hcd_name, - .product_desc = "Marvell EHCI", - .hcd_priv_size = sizeof(struct ehci_hcd), - - /* - * generic hardware linkage - */ - .irq = ehci_irq, - .flags = HCD_MEMORY | HCD_USB2 | HCD_BH, - - /* - * basic lifecycle operations - */ - .reset = mv_ehci_reset, - .start = ehci_run, - .stop = ehci_stop, - .shutdown = ehci_shutdown, - - /* - * managing i/o requests and associated device resources - */ - .urb_enqueue = ehci_urb_enqueue, - .urb_dequeue = ehci_urb_dequeue, - .endpoint_disable = ehci_endpoint_disable, - .endpoint_reset = ehci_endpoint_reset, - .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, - - /* - * scheduling support - */ - .get_frame_number = ehci_get_frame, - - /* - * root hub support - */ - .hub_status_data = ehci_hub_status_data, - .hub_control = ehci_hub_control, - .bus_suspend = ehci_bus_suspend, - .bus_resume = ehci_bus_resume, +static struct hc_driver __read_mostly ehci_platform_hc_driver; + +static const struct ehci_driver_overrides platform_overrides __initconst = { + .reset = mv_ehci_reset, + .extra_priv_size = sizeof(struct ehci_hcd_mv), }; static int mv_ehci_probe(struct platform_device *pdev) @@ -143,19 +113,13 @@ static int mv_ehci_probe(struct platform_device *pdev) if (usb_disabled()) return -ENODEV; - hcd = usb_create_hcd(&mv_ehci_hc_driver, &pdev->dev, "mv ehci"); + hcd = usb_create_hcd(&ehci_platform_hc_driver, &pdev->dev, "mv ehci"); if (!hcd) return -ENOMEM; - ehci_mv = devm_kzalloc(&pdev->dev, sizeof(*ehci_mv), GFP_KERNEL); - if (ehci_mv == NULL) { - retval = -ENOMEM; - goto err_put_hcd; - } - - platform_set_drvdata(pdev, ehci_mv); + platform_set_drvdata(pdev, hcd); + ehci_mv = hcd_to_ehci_hcd_mv(hcd); ehci_mv->pdata = pdata; - ehci_mv->hcd = hcd; ehci_mv->clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(ehci_mv->clk)) { @@ -262,8 +226,8 @@ static int mv_ehci_probe(struct platform_device *pdev) static int mv_ehci_remove(struct platform_device *pdev) { - struct ehci_hcd_mv *ehci_mv = platform_get_drvdata(pdev); - struct usb_hcd *hcd = ehci_mv->hcd; + struct usb_hcd *hcd = platform_get_drvdata(pdev); + struct ehci_hcd_mv *ehci_mv = hcd_to_ehci_hcd_mv(hcd); if (hcd->rh_registered) usb_remove_hcd(hcd); @@ -295,8 +259,8 @@ static const struct platform_device_id ehci_id_table[] = { static void mv_ehci_shutdown(struct platform_device *pdev) { - struct ehci_hcd_mv *ehci_mv = platform_get_drvdata(pdev); - struct usb_hcd *hcd = ehci_mv->hcd; + struct usb_hcd *hcd = platform_get_drvdata(pdev); + struct ehci_hcd_mv *ehci_mv = hcd_to_ehci_hcd_mv(hcd); if (!hcd->rh_registered) return; @@ -315,3 +279,25 @@ static struct platform_driver ehci_mv_driver = { }, .id_table = ehci_id_table, }; + +static int __init ehci_platform_init(void) +{ + if (usb_disabled()) + return -ENODEV; + + ehci_init_driver(&ehci_platform_hc_driver, &platform_overrides); + return platform_driver_register(&ehci_mv_driver); +} +module_init(ehci_platform_init); + +static void __exit ehci_platform_cleanup(void) +{ + platform_driver_unregister(&ehci_mv_driver); +} +module_exit(ehci_platform_cleanup); + +MODULE_DESCRIPTION("Marvell EHCI driver"); +MODULE_AUTHOR("Chao Xie "); +MODULE_AUTHOR("Neil Zhang "); +MODULE_ALIAS("mv-ehci"); +MODULE_LICENSE("GPL"); -- 2.17.1