From patchwork Wed Sep 26 22:20:10 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Cooper X-Patchwork-Id: 10616991 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 079E215A6 for ; Wed, 26 Sep 2018 22:20:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EB21B28DB3 for ; Wed, 26 Sep 2018 22:20:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DE8712B8C9; Wed, 26 Sep 2018 22:20:38 +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=-7.9 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6E19A28DB3 for ; Wed, 26 Sep 2018 22:20:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726948AbeI0Efm (ORCPT ); Thu, 27 Sep 2018 00:35:42 -0400 Received: from rnd-relay.smtp.broadcom.com ([192.19.229.170]:57312 "EHLO rnd-relay.smtp.broadcom.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726049AbeI0Efk (ORCPT ); Thu, 27 Sep 2018 00:35:40 -0400 Received: from nis-sj1-27.broadcom.com (nis-sj1-27.lvn.broadcom.net [10.75.144.136]) by rnd-relay.smtp.broadcom.com (Postfix) with ESMTP id BB76730C03E; Wed, 26 Sep 2018 15:20:33 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.10.3 rnd-relay.smtp.broadcom.com BB76730C03E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1538000433; bh=oNTv90bne+1o656uULNyNO8Qy1vOOkU8r05YPM6dE2w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=P0YhBrZm7eg55k+2vFL2uSBhg5vRv3HPsHR9y7d2nU4tECmKIXR4Gyd6b8L6p/7l/ t951M1XzdSoW7jLEV6XdDIWQmPbi2MrbnqmKIb17OdM8X//gvakaYnCGKPo+2d3KWs JkHNXsSpO7L4NmIglMJonPhhXvwS+RoKxvWcG61E= Received: from stbsrv-and-3.and.broadcom.com (stbsrv-and-3.and.broadcom.com [10.28.16.21]) by nis-sj1-27.broadcom.com (Postfix) with ESMTP id 8EBBBAC074A; Wed, 26 Sep 2018 15:20:31 -0700 (PDT) From: Al Cooper To: linux-kernel@vger.kernel.org Cc: Al Cooper , Greg Kroah-Hartman , Rob Herring , Mark Rutland , Alan Stern , Mathias Nyman , Mauro Carvalho Chehab , "David S. Miller" , Andrew Morton , Arnd Bergmann , Dmitry Osipenko , Chunfeng Yun , Jianguo Sun , James Hogan , Alban Bedel , Lu Baolu , Avi Fishman , Alex Elder , Hans de Goede , linux-usb@vger.kernel.org, devicetree@vger.kernel.org, bcm-kernel-feedback-list@broadcom.com Subject: [PATCH 1/5] dt-bindings: Add Broadcom STB OHCI, EHCI and XHCI binding document Date: Wed, 26 Sep 2018 18:20:10 -0400 Message-Id: <1538000414-24873-2-git-send-email-alcooperx@gmail.com> X-Mailer: git-send-email 1.9.0.138.g2de3478 In-Reply-To: <1538000414-24873-1-git-send-email-alcooperx@gmail.com> References: <1538000414-24873-1-git-send-email-alcooperx@gmail.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add DT bindings document for Broadcom STB USB OHCI, EHCI and XHCI drivers. Signed-off-by: Al Cooper --- .../devicetree/bindings/usb/brcm,ehci-brcm.txt | 22 +++++++++++++++++++++ .../devicetree/bindings/usb/brcm,ohci-brcm.txt | 22 +++++++++++++++++++++ .../devicetree/bindings/usb/brcm,xhci-brcm.txt | 23 ++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 Documentation/devicetree/bindings/usb/brcm,ehci-brcm.txt create mode 100644 Documentation/devicetree/bindings/usb/brcm,ohci-brcm.txt create mode 100644 Documentation/devicetree/bindings/usb/brcm,xhci-brcm.txt diff --git a/Documentation/devicetree/bindings/usb/brcm,ehci-brcm.txt b/Documentation/devicetree/bindings/usb/brcm,ehci-brcm.txt new file mode 100644 index 000000000000..020b5ec40f5b --- /dev/null +++ b/Documentation/devicetree/bindings/usb/brcm,ehci-brcm.txt @@ -0,0 +1,22 @@ +Broadcom STB USB EHCI controller + +Required properties: +- compatible: should be "brcm,ehci-brcm-v2" +- reg: should contain one register range i.e. start and length +- interrupts: description of the interrupt line +- phys: phandle + phy specifier pair + The specifier should be 0 for the OHCI/EHCI PHY and 1 for the XHCI PHY + +Optional properties: +- clocks: A list of phandles for the clocks + +Example: + +ehci@f0b00300 { + compatible = "brcm,ehci-brcm-v2"; + reg = <0xf0b00300 0xa8>; + interrupts = <0x0 0x5a 0x0>; + interrupt-names = "usb0_ehci_0"; + phys = <&usbphy_0 0x0>; + clocks = <&usb20> +}; diff --git a/Documentation/devicetree/bindings/usb/brcm,ohci-brcm.txt b/Documentation/devicetree/bindings/usb/brcm,ohci-brcm.txt new file mode 100644 index 000000000000..c7bb56f30540 --- /dev/null +++ b/Documentation/devicetree/bindings/usb/brcm,ohci-brcm.txt @@ -0,0 +1,22 @@ +Broadcom STB USB OHCI controller + +Required properties: +- compatible: should be "brcm,ohci-brcm-v2" +- reg: should contain one register range i.e. start and length +- interrupts: description of the interrupt line +- phys: phandle + phy specifier pair + The specifier should be 0 for the OHCI/EHCI PHY and 1 for the XHCI PHY + +Optional properties: +- clocks: A list of phandles for the clocks + +Example: + +ohci@f0b00400 { + compatible = "brcm,ohci-brcm-v2"; + reg = <0xf0b00400 0x58>; + interrupts = <0x0 0x5b 0x0>; + interrupt-names = "usb0_ohci_0"; + phys = <&usbphy_0 0x0>; + clocks = <&usb20>; +}; diff --git a/Documentation/devicetree/bindings/usb/brcm,xhci-brcm.txt b/Documentation/devicetree/bindings/usb/brcm,xhci-brcm.txt new file mode 100644 index 000000000000..7ca5f126c2f6 --- /dev/null +++ b/Documentation/devicetree/bindings/usb/brcm,xhci-brcm.txt @@ -0,0 +1,23 @@ +Broadcom STB USB XHCI controller + +Required properties: +- compatible: should be "brcm,xhci-brcm-v2" +- reg: should contain one register range i.e. start and length +- interrupts: description of the interrupt line +- phys: phandle + phy specifier pair + The specifier should be 0 for the OHCI/EHCI PHY and 1 for the XHCI PHY + +Optional properties: +- clocks: A list of phandles for the clocks +- usb3-lpm-capable: determines if platform is USB3 LPM capable + +Example: + +xhci_0_0: xhci@f0b01000 { + compatible = "brcm,xhci-brcm-v2"; + reg = <0xf0b01000 0x1000>; + interrupts = <0x0 0x5c 0x0>; + interrupt-names = "usb0_xhci_0"; + phys = <&usbphy_0 0x1>; + clocks = <&usb30>; +}; From patchwork Wed Sep 26 22:20:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Cooper X-Patchwork-Id: 10616993 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 29A17913 for ; Wed, 26 Sep 2018 22:20:41 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1A72328DB3 for ; Wed, 26 Sep 2018 22:20:41 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0DA972B8C9; Wed, 26 Sep 2018 22:20:41 +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=-7.9 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7358A28DB3 for ; Wed, 26 Sep 2018 22:20:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727055AbeI0Efn (ORCPT ); Thu, 27 Sep 2018 00:35:43 -0400 Received: from rnd-relay.smtp.broadcom.com ([192.19.229.170]:57388 "EHLO rnd-relay.smtp.broadcom.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726049AbeI0Efm (ORCPT ); Thu, 27 Sep 2018 00:35:42 -0400 Received: from nis-sj1-27.broadcom.com (nis-sj1-27.lvn.broadcom.net [10.75.144.136]) by rnd-relay.smtp.broadcom.com (Postfix) with ESMTP id 3C7C130C013; Wed, 26 Sep 2018 15:20:36 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.10.3 rnd-relay.smtp.broadcom.com 3C7C130C013 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1538000436; bh=C7lYI13DZxtJqIphhxp6WyLtV/c9hUhzMnz5BFFJkZI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Bp1vshm2WyJl/DZAJzuPmcPLpML2IQ5oKSCPWZROmq66j0X4ObQZMpwtw+kEs5d+a K4aBIa0ybMMBAA/946ocLfvrsp/FAzrtuCXMBsw9u6tk23P4rKfVl5UYholGcIca8J /Bk8ZPBSUFd2vektRbJ9SsCE6Gc5bDFmDu8IZVgc= Received: from stbsrv-and-3.and.broadcom.com (stbsrv-and-3.and.broadcom.com [10.28.16.21]) by nis-sj1-27.broadcom.com (Postfix) with ESMTP id ED378AC0729; Wed, 26 Sep 2018 15:20:33 -0700 (PDT) From: Al Cooper To: linux-kernel@vger.kernel.org Cc: Al Cooper , Greg Kroah-Hartman , Rob Herring , Mark Rutland , Alan Stern , Mathias Nyman , Mauro Carvalho Chehab , "David S. Miller" , Andrew Morton , Arnd Bergmann , Dmitry Osipenko , Chunfeng Yun , Jianguo Sun , James Hogan , Alban Bedel , Lu Baolu , Avi Fishman , Alex Elder , Hans de Goede , linux-usb@vger.kernel.org, devicetree@vger.kernel.org, bcm-kernel-feedback-list@broadcom.com Subject: [PATCH 2/5] usb: host: Add OHCI driver for Broadcom STB SoCs Date: Wed, 26 Sep 2018 18:20:11 -0400 Message-Id: <1538000414-24873-3-git-send-email-alcooperx@gmail.com> X-Mailer: git-send-email 1.9.0.138.g2de3478 In-Reply-To: <1538000414-24873-1-git-send-email-alcooperx@gmail.com> References: <1538000414-24873-1-git-send-email-alcooperx@gmail.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This driver enables USB OHCI on Broadcom ARM and MIPS STB SoCs. The drivers depend on a matching "brcm,brcmstb-usb-phy" Broadcom STB USB Phy driver. The standard platform driver can't be used because of differences in PHY and Clock handling. The standard PHY handling in hcd.c will do a phy_exit/phy_init on suspend/resume and this will end up shutting down the PHYs to the point that the host controller registers are no longer accessible and will cause suspend to crash. The clocks specified in device tree for these drivers are not available in mainline so instead of returning EPROBE_DEFER when the specified clock is not found and eventually failing probe, the clock pointer is set to NULL which disables all clock handling. Signed-off-by: Al Cooper --- drivers/usb/host/ohci-brcm.c | 204 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 drivers/usb/host/ohci-brcm.c diff --git a/drivers/usb/host/ohci-brcm.c b/drivers/usb/host/ohci-brcm.c new file mode 100644 index 000000000000..d4de59a56e2c --- /dev/null +++ b/drivers/usb/host/ohci-brcm.c @@ -0,0 +1,204 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2018, Broadcom */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ohci.h" + +#define BRCM_DRIVER_DESC "OHCI Broadcom STB driver" + +static const char hcd_name[] = "ohci-brcm"; + +#define hcd_to_ohci_priv(h) ((struct brcm_priv *)hcd_to_ohci(h)->priv) + +struct brcm_priv { + struct clk *clk; + struct phy *phy; +}; + +static struct hc_driver __read_mostly ohci_brcm_hc_driver; + +static const struct ohci_driver_overrides brcm_overrides __initconst = { + .product_desc = "Broadcom STB OHCI controller", + .extra_priv_size = sizeof(struct brcm_priv), +}; + +static int ohci_brcm_probe(struct platform_device *dev) +{ + struct usb_hcd *hcd; + struct brcm_priv *priv; + struct resource *res_mem; + int irq; + int err; + + if (usb_disabled()) + return -ENODEV; + + err = dma_coerce_mask_and_coherent(&dev->dev, DMA_BIT_MASK(32)); + if (err) + return err; + + irq = platform_get_irq(dev, 0); + if (irq < 0) { + dev_err(&dev->dev, "no irq provided"); + return irq; + } + + /* initialize hcd */ + hcd = usb_create_hcd(&ohci_brcm_hc_driver, + &dev->dev, dev_name(&dev->dev)); + if (!hcd) + return -ENOMEM; + + platform_set_drvdata(dev, hcd); + priv = hcd_to_ohci_priv(hcd); + + priv->clk = devm_clk_get(&dev->dev, NULL); + if (IS_ERR(priv->clk)) { + dev_err(&dev->dev, "Clock not found in Device Tree\n"); + priv->clk = NULL; + } + err = clk_prepare_enable(priv->clk); + if (err) + goto err_hcd; + + priv->phy = devm_of_phy_get_by_index(&dev->dev, dev->dev.of_node, 0); + if (IS_ERR(priv->phy)) { + dev_err(&dev->dev, "USB Phy not found.\n"); + err = PTR_ERR(priv->phy); + goto err_clk; + } + phy_init(priv->phy); + + pm_runtime_set_active(&dev->dev); + pm_runtime_enable(&dev->dev); + + res_mem = platform_get_resource(dev, IORESOURCE_MEM, 0); + hcd->regs = devm_ioremap_resource(&dev->dev, res_mem); + if (IS_ERR(hcd->regs)) { + err = PTR_ERR(hcd->regs); + goto err_phy; + } + hcd->rsrc_start = res_mem->start; + hcd->rsrc_len = resource_size(res_mem); + hcd->skip_phy_initialization = 1; + err = usb_add_hcd(hcd, irq, IRQF_SHARED); + if (err) + goto err_phy; + + device_wakeup_enable(hcd->self.controller); + + platform_set_drvdata(dev, hcd); + + return err; + +err_phy: + pm_runtime_disable(&dev->dev); + phy_exit(priv->phy); +err_clk: + clk_disable_unprepare(priv->clk); +err_hcd: + usb_put_hcd(hcd); + + return err; + +} + +static int ohci_brcm_remove(struct platform_device *dev) +{ + struct usb_hcd *hcd = platform_get_drvdata(dev); + struct brcm_priv *priv = hcd_to_ohci_priv(hcd); + + pm_runtime_get_sync(&dev->dev); + usb_remove_hcd(hcd); + phy_exit(priv->phy); + clk_disable_unprepare(priv->clk); + usb_put_hcd(hcd); + pm_runtime_put_sync(&dev->dev); + pm_runtime_disable(&dev->dev); + return 0; +} + +#ifdef CONFIG_PM_SLEEP + +static int ohci_brcm_suspend(struct device *dev) +{ + int ret; + struct usb_hcd *hcd = dev_get_drvdata(dev); + struct brcm_priv *priv = hcd_to_ohci_priv(hcd); + bool do_wakeup = device_may_wakeup(dev); + + ret = ohci_suspend(hcd, do_wakeup); + clk_disable_unprepare(priv->clk); + return ret; +} + +static int ohci_brcm_resume(struct device *dev) +{ + struct usb_hcd *hcd = dev_get_drvdata(dev); + struct brcm_priv *priv = hcd_to_ohci_priv(hcd); + int err; + + err = clk_prepare_enable(priv->clk); + if (err) + return err; + ohci_resume(hcd, false); + return 0; +} +#endif /* CONFIG_PM_SLEEP */ + +static SIMPLE_DEV_PM_OPS(ohci_brcm_pm_ops, ohci_brcm_suspend, + ohci_brcm_resume); + +#ifdef CONFIG_OF +static const struct of_device_id brcm_ohci_of_match[] = { + { .compatible = "brcm,ohci-brcm-v2", }, + {} +}; + +MODULE_DEVICE_TABLE(of, brcm_ohci_of_match); +#endif /* CONFIG_OF */ + +static struct platform_driver ohci_brcm_driver = { + .probe = ohci_brcm_probe, + .remove = ohci_brcm_remove, + .shutdown = usb_hcd_platform_shutdown, + .driver = { + .owner = THIS_MODULE, + .name = "ohci-brcm", + .pm = &ohci_brcm_pm_ops, + .of_match_table = of_match_ptr(brcm_ohci_of_match), + } +}; + +static int __init ohci_brcm_init(void) +{ + if (usb_disabled()) + return -ENODEV; + + pr_info("%s: " BRCM_DRIVER_DESC "\n", hcd_name); + + ohci_init_driver(&ohci_brcm_hc_driver, &brcm_overrides); + return platform_driver_register(&ohci_brcm_driver); +} +module_init(ohci_brcm_init); + +static void __exit ohci_brcm_exit(void) +{ + platform_driver_unregister(&ohci_brcm_driver); +} +module_exit(ohci_brcm_exit); + +MODULE_ALIAS("platform:ohci-brcm"); +MODULE_DESCRIPTION(BRCM_DRIVER_DESC); +MODULE_AUTHOR("Al Cooper"); +MODULE_LICENSE("GPL"); From patchwork Wed Sep 26 22:20:12 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Cooper X-Patchwork-Id: 10616999 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4BE73913 for ; Wed, 26 Sep 2018 22:21:02 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3B94928DB3 for ; Wed, 26 Sep 2018 22:21:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2EEFE2B8C9; Wed, 26 Sep 2018 22:21:02 +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=-7.9 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 672AB28DB3 for ; Wed, 26 Sep 2018 22:21:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727083AbeI0Efq (ORCPT ); Thu, 27 Sep 2018 00:35:46 -0400 Received: from rnd-relay.smtp.broadcom.com ([192.19.229.170]:57460 "EHLO rnd-relay.smtp.broadcom.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726049AbeI0Efp (ORCPT ); Thu, 27 Sep 2018 00:35:45 -0400 Received: from nis-sj1-27.broadcom.com (nis-sj1-27.lvn.broadcom.net [10.75.144.136]) by rnd-relay.smtp.broadcom.com (Postfix) with ESMTP id B191E30C041; Wed, 26 Sep 2018 15:20:38 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.10.3 rnd-relay.smtp.broadcom.com B191E30C041 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1538000438; bh=oJFEVvZBI5SfE8Sh/7AeFrOLUf7Y/wasyX7ef+0rAVo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YUjv7OveVIhGr+IcpFtlER1u38j6Uot6G6B19hwBQ57r84ZC/wJ0M703eA+Llf22N H0baXTui6fxgxoNVxDcAHOgaJ6Eg1z0QuKUPOcMpC0lShkvt7sPcW4QVPWfKsttHgY IIV04K4lVouj0SidPyNwc/JToQEv4Ztn+MRJ5A7s= Received: from stbsrv-and-3.and.broadcom.com (stbsrv-and-3.and.broadcom.com [10.28.16.21]) by nis-sj1-27.broadcom.com (Postfix) with ESMTP id 6DC55AC074A; Wed, 26 Sep 2018 15:20:36 -0700 (PDT) From: Al Cooper To: linux-kernel@vger.kernel.org Cc: Al Cooper , Greg Kroah-Hartman , Rob Herring , Mark Rutland , Alan Stern , Mathias Nyman , Mauro Carvalho Chehab , "David S. Miller" , Andrew Morton , Arnd Bergmann , Dmitry Osipenko , Chunfeng Yun , Jianguo Sun , James Hogan , Alban Bedel , Lu Baolu , Avi Fishman , Alex Elder , Hans de Goede , linux-usb@vger.kernel.org, devicetree@vger.kernel.org, bcm-kernel-feedback-list@broadcom.com Subject: [PATCH 3/5] usb: host: Add EHCI driver for Broadcom STB SoCs Date: Wed, 26 Sep 2018 18:20:12 -0400 Message-Id: <1538000414-24873-4-git-send-email-alcooperx@gmail.com> X-Mailer: git-send-email 1.9.0.138.g2de3478 In-Reply-To: <1538000414-24873-1-git-send-email-alcooperx@gmail.com> References: <1538000414-24873-1-git-send-email-alcooperx@gmail.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This driver enables USB EHCI on Broadcom ARM and MIPS STB SoCs. The drivers depend on a matching "brcm,brcmstb-usb-phy" Broadcom STB USB Phy driver. The standard platform driver can't be used because of differences in PHY and Clock handling. The standard PHY handling in hcd.c will do a phy_exit/phy_init on suspend/resume and this will end up shutting down the PHYs to the point that the host controller registers are no longer accessible and will cause suspend to crash. The clocks specified in device tree for these drivers are not available in mainline so instead of returning EPROBE_DEFER when the specified clock is not found and eventually failing probe, the clock pointer is set to NULL which disables all clock handling. Signed-off-by: Al Cooper --- drivers/usb/host/ehci-brcm.c | 304 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100644 drivers/usb/host/ehci-brcm.c diff --git a/drivers/usb/host/ehci-brcm.c b/drivers/usb/host/ehci-brcm.c new file mode 100644 index 000000000000..6bee4e0e2cbb --- /dev/null +++ b/drivers/usb/host/ehci-brcm.c @@ -0,0 +1,304 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2018, Broadcom */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ehci.h" + +#define BRCM_DRIVER_DESC "EHCI Broadcom STB driver" + +#define hcd_to_ehci_priv(h) ((struct brcm_priv *)hcd_to_ehci(h)->priv) + +struct brcm_priv { + struct clk *clk; + struct phy *phy; +}; + +static const char brcm_hcd_name[] = "ehci-brcm"; + +static int (*org_hub_control)(struct usb_hcd *hcd, + u16 typeReq, u16 wValue, u16 wIndex, + char *buf, u16 wLength); + +/* ehci_brcm_wait_for_sof + * Wait for start of next microframe, then wait extra delay microseconds + */ +static inline void ehci_brcm_wait_for_sof(struct ehci_hcd *ehci, u32 delay) +{ + int frame_idx = ehci_readl(ehci, &ehci->regs->frame_index); + + while (frame_idx == ehci_readl(ehci, &ehci->regs->frame_index)) + ; + udelay(delay); +} + +/* + * ehci_brcm_hub_control + * Intercept echi-hcd request to complete RESUME and align it to the start + * of the next microframe. + * If RESUME is complete too late in the microframe, host controller + * detects babble on suspended port and resets the port afterwards. + * This s/w workaround allows to avoid this problem. + * See SWLINUX-1909 for more details + */ +static int ehci_brcm_hub_control( + struct usb_hcd *hcd, + u16 typeReq, + u16 wValue, + u16 wIndex, + char *buf, + u16 wLength) +{ + struct ehci_hcd *ehci = hcd_to_ehci(hcd); + int ports = HCS_N_PORTS(ehci->hcs_params); + u32 __iomem *status_reg = &ehci->regs->port_status[ + (wIndex & 0xff) - 1]; + unsigned long flags; + int retval, irq_disabled = 0; + + /* + * RESUME is cleared when GetPortStatus() is called 20ms after start + * of RESUME + */ + if ((typeReq == GetPortStatus) && + (wIndex && wIndex <= ports) && + ehci->reset_done[wIndex-1] && + time_after_eq(jiffies, ehci->reset_done[wIndex-1]) && + (ehci_readl(ehci, status_reg) & PORT_RESUME)) { + + /* + * to make sure we are not interrupted until RESUME bit + * is cleared, disable interrupts on current CPU + */ + ehci_dbg(ehci, "SOF alignment workaround\n"); + irq_disabled = 1; + local_irq_save(flags); + ehci_brcm_wait_for_sof(ehci, 5); + } + retval = (*org_hub_control)(hcd, typeReq, wValue, wIndex, buf, wLength); + if (irq_disabled) + local_irq_restore(flags); + return retval; +} + +static int ehci_brcm_reset(struct usb_hcd *hcd) +{ + struct ehci_hcd *ehci = hcd_to_ehci(hcd); + + ehci->big_endian_mmio = 1; + + ehci->caps = (struct ehci_caps *) hcd->regs; + ehci->regs = (struct ehci_regs *) (hcd->regs + + HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase))); + + /* This fixes the lockup during reboot due to prior interrupts */ + ehci_writel(ehci, CMD_RESET, &ehci->regs->command); + mdelay(10); + + /* + * SWLINUX-1705: Avoid OUT packet underflows during high memory + * bus usage + * port_status[0x0f] = Broadcom-proprietary USB_EHCI_INSNREG00 @ 0x90 + */ + ehci_writel(ehci, 0x00800040, &ehci->regs->port_status[0x10]); + ehci_writel(ehci, 0x00000001, &ehci->regs->port_status[0x12]); + + return ehci_setup(hcd); +} + +static struct hc_driver __read_mostly ehci_brcm_hc_driver; + +static const struct ehci_driver_overrides brcm_overrides __initconst = { + + .reset = ehci_brcm_reset, + .extra_priv_size = sizeof(struct brcm_priv), +}; + +static int ehci_brcm_probe(struct platform_device *pdev) +{ + struct usb_hcd *hcd; + struct resource *res_mem; + struct brcm_priv *priv; + int irq; + int err; + + if (usb_disabled()) + return -ENODEV; + + err = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); + if (err) + return err; + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "no irq provided"); + return irq; + } + + /* Hook the hub control routine to work around a bug */ + if (org_hub_control == NULL) + org_hub_control = ehci_brcm_hc_driver.hub_control; + ehci_brcm_hc_driver.hub_control = ehci_brcm_hub_control; + + /* initialize hcd */ + hcd = usb_create_hcd(&ehci_brcm_hc_driver, + &pdev->dev, dev_name(&pdev->dev)); + if (!hcd) + return -ENOMEM; + + platform_set_drvdata(pdev, hcd); + priv = hcd_to_ehci_priv(hcd); + + priv->clk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(priv->clk)) { + dev_err(&pdev->dev, "Clock not found in Device Tree\n"); + priv->clk = NULL; + } + err = clk_prepare_enable(priv->clk); + if (err) + goto err_hcd; + + priv->phy = devm_of_phy_get_by_index(&pdev->dev, pdev->dev.of_node, 0); + if (IS_ERR(priv->phy)) { + dev_err(&pdev->dev, "USB Phy not found.\n"); + err = PTR_ERR(priv->phy); + goto err_clk; + } + phy_init(priv->phy); + + res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); + hcd->regs = devm_ioremap_resource(&pdev->dev, res_mem); + if (IS_ERR(hcd->regs)) { + err = PTR_ERR(hcd->regs); + goto err_phy; + } + hcd->rsrc_start = res_mem->start; + hcd->rsrc_len = resource_size(res_mem); + hcd->skip_phy_initialization = 1; + err = usb_add_hcd(hcd, irq, IRQF_SHARED); + if (err) + goto err_phy; + + device_wakeup_enable(hcd->self.controller); + device_enable_async_suspend(hcd->self.controller); + platform_set_drvdata(pdev, hcd); + + return err; + +err_phy: + phy_exit(priv->phy); +err_clk: + clk_disable_unprepare(priv->clk); +err_hcd: + usb_put_hcd(hcd); + + return err; +} + +static int ehci_brcm_remove(struct platform_device *dev) +{ + struct usb_hcd *hcd = platform_get_drvdata(dev); + struct brcm_priv *priv = hcd_to_ehci_priv(hcd); + + usb_remove_hcd(hcd); + phy_exit(priv->phy); + clk_disable_unprepare(priv->clk); + usb_put_hcd(hcd); + return 0; +} + +#ifdef CONFIG_PM_SLEEP + +static int ehci_brcm_suspend(struct device *dev) +{ + int ret; + struct usb_hcd *hcd = dev_get_drvdata(dev); + struct brcm_priv *priv = hcd_to_ehci_priv(hcd); + bool do_wakeup = device_may_wakeup(dev); + + ret = ehci_suspend(hcd, do_wakeup); + clk_disable_unprepare(priv->clk); + return ret; +} + +static int ehci_brcm_resume(struct device *dev) +{ + struct usb_hcd *hcd = dev_get_drvdata(dev); + struct ehci_hcd *ehci = hcd_to_ehci(hcd); + struct brcm_priv *priv = hcd_to_ehci_priv(hcd); + int err; + + err = clk_prepare_enable(priv->clk); + if (err) + return err; + /* + * SWLINUX-1705: Avoid OUT packet underflows during high memory + * bus usage + * port_status[0x0f] = Broadcom-proprietary USB_EHCI_INSNREG00 + * @ 0x90 + */ + ehci_writel(ehci, 0x00800040, &ehci->regs->port_status[0x10]); + ehci_writel(ehci, 0x00000001, &ehci->regs->port_status[0x12]); + + ehci_resume(hcd, false); + return 0; +} +#endif /* CONFIG_PM_SLEEP */ + +static SIMPLE_DEV_PM_OPS(ehci_brcm_pm_ops, ehci_brcm_suspend, + ehci_brcm_resume); + +#ifdef CONFIG_OF +static const struct of_device_id brcm_ehci_of_match[] = { + { .compatible = "brcm,ehci-brcm-v2", }, + {} +}; + +MODULE_DEVICE_TABLE(of, brcm_ehci_of_match); +#endif /* CONFIG_OF */ + +static struct platform_driver ehci_brcm_driver = { + .probe = ehci_brcm_probe, + .remove = ehci_brcm_remove, + .shutdown = usb_hcd_platform_shutdown, + .driver = { + .owner = THIS_MODULE, + .name = "ehci-brcm", + .pm = &ehci_brcm_pm_ops, + .of_match_table = of_match_ptr(brcm_ehci_of_match), + } +}; + +static int __init ehci_brcm_init(void) +{ + if (usb_disabled()) + return -ENODEV; + + pr_info("%s: " BRCM_DRIVER_DESC "\n", brcm_hcd_name); + + ehci_init_driver(&ehci_brcm_hc_driver, &brcm_overrides); + return platform_driver_register(&ehci_brcm_driver); +} +module_init(ehci_brcm_init); + +static void __exit ehci_brcm_exit(void) +{ + platform_driver_unregister(&ehci_brcm_driver); +} +module_exit(ehci_brcm_exit); + +MODULE_ALIAS("platform:ehci-brcm"); +MODULE_DESCRIPTION(BRCM_DRIVER_DESC); +MODULE_AUTHOR("Al Cooper"); +MODULE_LICENSE("GPL"); From patchwork Wed Sep 26 22:20:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Cooper X-Patchwork-Id: 10616995 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9B40415A6 for ; Wed, 26 Sep 2018 22:20:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 82EEA28DB3 for ; Wed, 26 Sep 2018 22:20:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 73D582B8C9; Wed, 26 Sep 2018 22:20:47 +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=-7.9 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A431E28DB3 for ; Wed, 26 Sep 2018 22:20:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727201AbeI0Efs (ORCPT ); Thu, 27 Sep 2018 00:35:48 -0400 Received: from rnd-relay.smtp.broadcom.com ([192.19.229.170]:57514 "EHLO rnd-relay.smtp.broadcom.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726049AbeI0Efs (ORCPT ); Thu, 27 Sep 2018 00:35:48 -0400 Received: from nis-sj1-27.broadcom.com (nis-sj1-27.lvn.broadcom.net [10.75.144.136]) by rnd-relay.smtp.broadcom.com (Postfix) with ESMTP id 3146E30C00D; Wed, 26 Sep 2018 15:20:41 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.10.3 rnd-relay.smtp.broadcom.com 3146E30C00D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1538000441; bh=gftS1L1b72gHg/yXMZIjzIR1e/KTIimD8dKSviREaIM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZdfCepP1u2rCieQHRjiKwHex6qexIDDpAN0yXW6uKXEf4ZnT+maUBJTvllpbRRl9r oCxlhXXEjzw6UAHcuzF7NXazG5ZeP3K+lfik1kZznt6KMXfnjo0NDndXT69EjROnBY r8TaPGxTEwAYfS+rGdCdVo52E//IPV0JolCaexHw= Received: from stbsrv-and-3.and.broadcom.com (stbsrv-and-3.and.broadcom.com [10.28.16.21]) by nis-sj1-27.broadcom.com (Postfix) with ESMTP id E26F7AC0729; Wed, 26 Sep 2018 15:20:38 -0700 (PDT) From: Al Cooper To: linux-kernel@vger.kernel.org Cc: Al Cooper , Greg Kroah-Hartman , Rob Herring , Mark Rutland , Alan Stern , Mathias Nyman , Mauro Carvalho Chehab , "David S. Miller" , Andrew Morton , Arnd Bergmann , Dmitry Osipenko , Chunfeng Yun , Jianguo Sun , James Hogan , Alban Bedel , Lu Baolu , Avi Fishman , Alex Elder , Hans de Goede , linux-usb@vger.kernel.org, devicetree@vger.kernel.org, bcm-kernel-feedback-list@broadcom.com Subject: [PATCH 4/5] usb: host: Add XHCI driver for Broadcom STB SoCs Date: Wed, 26 Sep 2018 18:20:13 -0400 Message-Id: <1538000414-24873-5-git-send-email-alcooperx@gmail.com> X-Mailer: git-send-email 1.9.0.138.g2de3478 In-Reply-To: <1538000414-24873-1-git-send-email-alcooperx@gmail.com> References: <1538000414-24873-1-git-send-email-alcooperx@gmail.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This driver enables USB XHCI on Broadcom ARM STB SoCs. The drivers depend on a matching "brcm,brcmstb-usb-phy" Broadcom STB USB Phy driver. The standard platform driver can't be used because of differences in PHY and Clock handling. The standard PHY handling in hcd.c will do a phy_exit/phy_init on suspend/resume and this will end up shutting down the PHYs to the point that the host controller registers are no longer accessible and will cause suspend to crash. The clocks specified in device tree for these drivers are not available in mainline so instead of returning EPROBE_DEFER when the specified clock is not found and eventually failing probe, the clock pointer is set to NULL which disables all clock handling. Signed-off-by: Al Cooper --- drivers/usb/host/xhci-brcm.c | 294 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 294 insertions(+) create mode 100644 drivers/usb/host/xhci-brcm.c diff --git a/drivers/usb/host/xhci-brcm.c b/drivers/usb/host/xhci-brcm.c new file mode 100644 index 000000000000..1a7578b8ef6a --- /dev/null +++ b/drivers/usb/host/xhci-brcm.c @@ -0,0 +1,294 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2018, Broadcom */ + +#include +#include +#include +#include +#include +#include + +#include "xhci.h" + +static struct hc_driver __read_mostly xhci_brcm_hc_driver; + +#define BRCM_DRIVER_DESC "xHCI Broadcom STB driver" +#define BRCM_DRIVER_NAME "xhci-brcm" + +#define hcd_to_xhci_priv(h) ((struct brcm_priv *)hcd_to_xhci(h)->priv) + +struct brcm_priv { + struct phy *phy; +}; + +static void xhci_brcm_quirks(struct device *dev, struct xhci_hcd *xhci) +{ + /* + * As of now platform drivers don't provide MSI support so we ensure + * here that the generic code does not try to make a pci_dev from our + * dev struct in order to setup MSI + */ + xhci->quirks |= XHCI_PLAT; + + /* + * The Broadcom XHCI core does not support save/restore state + * so we need to reset on resume. + */ + xhci->quirks |= XHCI_RESET_ON_RESUME; +} + +/* called during probe() after chip reset completes */ +static int xhci_brcm_setup(struct usb_hcd *hcd) +{ + return xhci_gen_setup(hcd, xhci_brcm_quirks); +} + +static const struct xhci_driver_overrides brcm_overrides __initconst = { + + .extra_priv_size = sizeof(struct brcm_priv), + .reset = xhci_brcm_setup, +}; + +static int xhci_brcm_probe(struct platform_device *pdev) +{ + const struct hc_driver *driver; + struct brcm_priv *priv; + struct xhci_hcd *xhci; + struct resource *res; + struct usb_hcd *hcd; + int ret; + int irq; + + if (usb_disabled()) + return -ENODEV; + + driver = &xhci_brcm_hc_driver; + + irq = platform_get_irq(pdev, 0); + if (irq < 0) + return -ENODEV; + + /* Try to set 64-bit DMA first */ + if (WARN_ON(!pdev->dev.dma_mask)) + /* Platform did not initialize dma_mask */ + ret = dma_coerce_mask_and_coherent(&pdev->dev, + DMA_BIT_MASK(64)); + else + ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); + + /* If seting 64-bit DMA mask fails, fall back to 32-bit DMA mask */ + if (ret) { + ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); + if (ret) + return ret; + } + + pm_runtime_set_active(&pdev->dev); + pm_runtime_enable(&pdev->dev); + pm_runtime_get_noresume(&pdev->dev); + + hcd = __usb_create_hcd(driver, &pdev->dev, &pdev->dev, + dev_name(&pdev->dev), NULL); + if (!hcd) { + return -ENOMEM; + goto disable_runtime; + } + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + hcd->regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(hcd->regs)) { + ret = PTR_ERR(hcd->regs); + goto put_hcd; + } + + hcd->rsrc_start = res->start; + hcd->rsrc_len = resource_size(res); + + /* + * Not all platforms have a clk so it is not an error if the + * clock does not exists. + */ + xhci = hcd_to_xhci(hcd); + xhci->clk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(xhci->clk)) { + dev_err(&pdev->dev, "Clock not found in Device Tree\n"); + xhci->clk = NULL; + } + device_wakeup_enable(hcd->self.controller); + + xhci->main_hcd = hcd; + xhci->shared_hcd = __usb_create_hcd(driver, &pdev->dev, &pdev->dev, + dev_name(&pdev->dev), hcd); + if (!xhci->shared_hcd) { + ret = -ENOMEM; + goto disable_clk; + } + + if (device_property_read_bool(&pdev->dev, "usb3-lpm-capable")) + xhci->quirks |= XHCI_LPM_SUPPORT; + + priv = hcd_to_xhci_priv(hcd); + priv->phy = devm_of_phy_get_by_index(&pdev->dev, pdev->dev.of_node, 0); + if (IS_ERR(priv->phy)) { + dev_err(&pdev->dev, "USB Phy not found.\n"); + ret = PTR_ERR(priv->phy); + goto put_usb3_hcd; + } + ret = phy_init(priv->phy); + if (ret) + goto put_usb3_hcd; + + hcd->skip_phy_initialization = 1; + ret = usb_add_hcd(hcd, irq, IRQF_SHARED); + if (ret) + goto disable_usb_phy; + + if (HCC_MAX_PSA(xhci->hcc_params) >= 4) + xhci->shared_hcd->can_do_streams = 1; + + ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED); + if (ret) + goto dealloc_usb2_hcd; + + device_enable_async_suspend(&pdev->dev); + pm_runtime_put_noidle(&pdev->dev); + + /* + * Prevent runtime pm from being on as default, users should enable + * runtime pm using power/control in sysfs. + */ + pm_runtime_forbid(&pdev->dev); + + return 0; + +dealloc_usb2_hcd: + usb_remove_hcd(hcd); + +disable_usb_phy: + phy_exit(priv->phy); + +put_usb3_hcd: + usb_put_hcd(xhci->shared_hcd); + +disable_clk: + if (!IS_ERR(xhci->clk)) + clk_disable_unprepare(xhci->clk); + +put_hcd: + usb_put_hcd(hcd); + +disable_runtime: + pm_runtime_put_noidle(&pdev->dev); + pm_runtime_disable(&pdev->dev); + + return ret; +} + +static int xhci_brcm_remove(struct platform_device *dev) +{ + struct usb_hcd *hcd = platform_get_drvdata(dev); + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + struct brcm_priv *priv = hcd_to_xhci_priv(hcd); + + xhci->xhc_state |= XHCI_STATE_REMOVING; + + usb_remove_hcd(xhci->shared_hcd); + usb_remove_hcd(hcd); + usb_put_hcd(xhci->shared_hcd); + phy_exit(priv->phy); + clk_disable_unprepare(xhci->clk); + usb_put_hcd(hcd); + + pm_runtime_set_suspended(&dev->dev); + pm_runtime_disable(&dev->dev); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int xhci_brcm_suspend(struct device *dev) +{ + int ret; + struct usb_hcd *hcd = dev_get_drvdata(dev); + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + + ret = xhci_suspend(xhci, device_may_wakeup(dev)); + clk_disable_unprepare(xhci->clk); + return ret; +} + +static int xhci_brcm_resume(struct device *dev) +{ + struct usb_hcd *hcd = dev_get_drvdata(dev); + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + int err; + + err = clk_prepare_enable(xhci->clk); + if (err) + return err; + return xhci_resume(xhci, 0); +} + +static int xhci_brcm_runtime_suspend(struct device *dev) +{ + struct usb_hcd *hcd = dev_get_drvdata(dev); + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + + return xhci_suspend(xhci, true); +} + +static int xhci_brcm_runtime_resume(struct device *dev) +{ + struct usb_hcd *hcd = dev_get_drvdata(dev); + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + + return xhci_resume(xhci, 0); +} + +#endif /* CONFIG_PM_SLEEP */ + + +static const struct dev_pm_ops xhci_brcm_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(xhci_brcm_suspend, xhci_brcm_resume) + + SET_RUNTIME_PM_OPS(xhci_brcm_runtime_suspend, + xhci_brcm_runtime_resume, + NULL) +}; + +#ifdef CONFIG_OF +static const struct of_device_id brcm_xhci_of_match[] = { + { .compatible = "brcm,xhci-brcm-v2" }, + { }, +}; +MODULE_DEVICE_TABLE(of, brcm_xhci_of_match); +#endif + +static struct platform_driver xhci_brcm_driver = { + .probe = xhci_brcm_probe, + .remove = xhci_brcm_remove, + .driver = { + .name = BRCM_DRIVER_NAME, + .pm = &xhci_brcm_pm_ops, + .of_match_table = of_match_ptr(brcm_xhci_of_match), + }, +}; + +static int __init xhci_brcm_init(void) +{ + pr_info("%s: " BRCM_DRIVER_DESC "\n", BRCM_DRIVER_NAME); + xhci_init_driver(&xhci_brcm_hc_driver, &brcm_overrides); + return platform_driver_register(&xhci_brcm_driver); +} +module_init(xhci_brcm_init); + +static void __exit xhci_brcm_exit(void) +{ + platform_driver_unregister(&xhci_brcm_driver); +} +module_exit(xhci_brcm_exit); + +MODULE_ALIAS("platform:xhci-brcm"); +MODULE_DESCRIPTION(BRCM_DRIVER_DESC); +MODULE_AUTHOR("Al Cooper"); +MODULE_LICENSE("GPL"); From patchwork Wed Sep 26 22:20:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Cooper X-Patchwork-Id: 10616997 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7BF5C15A6 for ; Wed, 26 Sep 2018 22:20:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6A35B2B8C8 for ; Wed, 26 Sep 2018 22:20:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5B78E28DB3; Wed, 26 Sep 2018 22:20:53 +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=-7.9 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EA2EF28DB3 for ; Wed, 26 Sep 2018 22:20:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727230AbeI0Efv (ORCPT ); Thu, 27 Sep 2018 00:35:51 -0400 Received: from rnd-relay.smtp.broadcom.com ([192.19.229.170]:57594 "EHLO rnd-relay.smtp.broadcom.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727212AbeI0Efu (ORCPT ); Thu, 27 Sep 2018 00:35:50 -0400 Received: from nis-sj1-27.broadcom.com (nis-sj1-27.lvn.broadcom.net [10.75.144.136]) by rnd-relay.smtp.broadcom.com (Postfix) with ESMTP id A64E530C02D; Wed, 26 Sep 2018 15:20:43 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.10.3 rnd-relay.smtp.broadcom.com A64E530C02D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1538000443; bh=2Wy8IBXJFxcP8I9pNgnTD1wJPstuHPNZgoANhcN/0lo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qshl/CCU9sv5DpMSUm883aFrzWIQYHG22Rn7BFfK0v/UnfiaGG+Xxcrow8vVXhBhc pxIrEy3mmOYoQMJzONFjdyJ+h7uFyna4HcK2ky825JbdhBA9yOnyPoljUmjfdmXPxq xlFvLqcgD+i3tRnQm++WVEY57rs6HttE6A01FvH0= Received: from stbsrv-and-3.and.broadcom.com (stbsrv-and-3.and.broadcom.com [10.28.16.21]) by nis-sj1-27.broadcom.com (Postfix) with ESMTP id 62C78AC074A; Wed, 26 Sep 2018 15:20:41 -0700 (PDT) From: Al Cooper To: linux-kernel@vger.kernel.org Cc: Al Cooper , Greg Kroah-Hartman , Rob Herring , Mark Rutland , Alan Stern , Mathias Nyman , Mauro Carvalho Chehab , "David S. Miller" , Andrew Morton , Arnd Bergmann , Dmitry Osipenko , Chunfeng Yun , Jianguo Sun , James Hogan , Alban Bedel , Lu Baolu , Avi Fishman , Alex Elder , Hans de Goede , linux-usb@vger.kernel.org, devicetree@vger.kernel.org, bcm-kernel-feedback-list@broadcom.com Subject: [PATCH 5/5] usb: host: Enable building of new Broadcom STB USB drivers Date: Wed, 26 Sep 2018 18:20:14 -0400 Message-Id: <1538000414-24873-6-git-send-email-alcooperx@gmail.com> X-Mailer: git-send-email 1.9.0.138.g2de3478 In-Reply-To: <1538000414-24873-1-git-send-email-alcooperx@gmail.com> References: <1538000414-24873-1-git-send-email-alcooperx@gmail.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Changes to Makefile and Kconfig to enable building of the new Broadcom STB OHCI, EHCI and XHCI drivers. Also update MAINTAINERS. Signed-off-by: Al Cooper --- MAINTAINERS | 9 +++++++++ drivers/usb/host/Kconfig | 27 +++++++++++++++++++++++++++ drivers/usb/host/Makefile | 7 +++++++ 3 files changed, 43 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 02a39617ec82..9b8e7caad2ba 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3007,6 +3007,15 @@ S: Supported F: drivers/gpio/gpio-brcmstb.c F: Documentation/devicetree/bindings/gpio/brcm,brcmstb-gpio.txt +BROADCOM BRCMSTB USB XHCI, EHCI and OHCI DRIVERS +M: Al Cooper +L: linux-usb@vger.kernel.org +L: bcm-kernel-feedback-list@broadcom.com +S: Maintained +F: drivers/usb/host/xhci-brcm.c +F: drivers/usb/host/ehci-brcm.c +F: drivers/usb/host/ohci-brcm.c + BROADCOM BRCMSTB USB2 and USB3 PHY DRIVER M: Al Cooper L: linux-kernel@vger.kernel.org diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 1a4ea98cac2a..1693a5076980 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -798,3 +798,30 @@ config USB_HCD_TEST_MODE This option is of interest only to developers who need to validate their USB hardware designs. It is not needed for normal use. If unsure, say N. + +config USB_OHCI_BRCM + tristate + +config USB_EHCI_BRCM + tristate + +config USB_XHCI_BRCM + tristate + +config BRCM_USB_PHY + tristate + +config USB_BRCM + tristate "Broadcom STB USB support" + depends on ARCH_BRCMSTB + select USB_OHCI_BRCM if USB_OHCI_HCD + select USB_EHCI_BRCM if USB_EHCI_HCD + select USB_XHCI_BRCM if USB_XHCI_HCD + select BRCM_USB_PHY if USB_OHCI_HCD || USB_EHCI_HCD || USB_XHCI_HCD + select GENERIC_PHY if BRCM_USB_PHY + default ARCH_BRCMSTB + help + Say Y to enable the drivers for the onchip USB controllers. + + If your chipset supports power management, disabling this driver + will keep the device permanently powered down. diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index e6235269c151..13e4f45a3a1d 100644 --- a/drivers/usb/host/Makefile +++ b/drivers/usb/host/Makefile @@ -91,3 +91,10 @@ obj-$(CONFIG_USB_HCD_BCMA) += bcma-hcd.o obj-$(CONFIG_USB_HCD_SSB) += ssb-hcd.o obj-$(CONFIG_USB_FOTG210_HCD) += fotg210-hcd.o obj-$(CONFIG_USB_MAX3421_HCD) += max3421-hcd.o + +# The order is important here because it controls the order that +# the drivers will be initialized and we always need to init +# the drivers in the order XHCI, EHCI and OHCI. +obj-$(CONFIG_USB_XHCI_BRCM) += xhci-brcm.o +obj-$(CONFIG_USB_EHCI_BRCM) += ehci-brcm.o +obj-$(CONFIG_USB_OHCI_BRCM) += ohci-brcm.o