From patchwork Wed Apr 29 20:08:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Cooper X-Patchwork-Id: 11518245 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3FB9A13B2 for ; Wed, 29 Apr 2020 20:08:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 275D82083B for ; Wed, 29 Apr 2020 20:08:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nr4itP/R" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727028AbgD2UIo (ORCPT ); Wed, 29 Apr 2020 16:08:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58318 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726456AbgD2UIn (ORCPT ); Wed, 29 Apr 2020 16:08:43 -0400 Received: from mail-pj1-x1043.google.com (mail-pj1-x1043.google.com [IPv6:2607:f8b0:4864:20::1043]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DE23AC03C1AE; Wed, 29 Apr 2020 13:08:42 -0700 (PDT) Received: by mail-pj1-x1043.google.com with SMTP id fu13so1196880pjb.5; Wed, 29 Apr 2020 13:08:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=hQqyiz3VgaSkn1orBkc5cYQMmcAyasI8rZi9b6SsAs4=; b=nr4itP/RuFdoWCo2GTledzuUie+48IZRsx7pRVqJHfsFlVrNYgDAzdBAUJbT+jwhju Ods1yOLO/2gl4yQiV9f+mcj3D+r6Jmy9GhvHnTbd3uXqnivZJwqSysKAE6FlxVTD2r1B OBH9qGnjg0x+qKgp0vPbBG27yTcwfpXtHm1hzLEwtJuS2t3tR7J/GgCx9JJitE8UkhQZ 6OEPm/Q8Sl042l4dWEnftUuiUnM19pIvQdLvEfVJtzX1WOGH8CKFNK3GAnJyc4cLNcX4 lG2EPpkIqrQETxis8DwZBDioYM02FfRPMer/Q1sh1yzrd11Js0y7Rp3mBxavPPKJZWKD U9sg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=hQqyiz3VgaSkn1orBkc5cYQMmcAyasI8rZi9b6SsAs4=; b=Ng3AOigYeMY1QUC6iTxkVI2q31gAovwxNV5V1o6j4l3pjH4or5X6og7KU0H1faDcaL wSuRAY5hI29c2WBHHwOAp+Bb5ftOy7hDkiVPLsGDSnorxALD3DrlFEYi97KDs2RlkSFH qdOnHc2us07PhZ596qDRPKO8ipYU6Kgn6meM2WG8SGrWHReSfE16FnuCRzCo0krxjKEU r9Wmj60SpFEPvwf9/EUwGCSh+1+UEYyyFMuLFPUKLi8KEpDnE/VU9zEVDw/vbQvO+bLz PILHsHAiQwF1XxN3dwC2U9V3Zciu1V2DPWf0DoeBYmpnueXi/G6QLuTmmHOBBCL5FTkU RDdg== X-Gm-Message-State: AGi0Pubn+5ZLqVhuDG+zeYTeuSBsY7anlAdsrj1CqC2a1Goq7bjKwG9E GwsA3OHUyIL0vdtTSvEEzgNUROBz3Qc= X-Google-Smtp-Source: APiQypIUeeXRQbzu7qxMvdvwRfG0GMUmBGNrQJ5JcE+D4siPjAHQC+8aQkMTP7h0ZOGLjyvc7ddytw== X-Received: by 2002:a17:902:464:: with SMTP id 91mr40290ple.261.1588190922171; Wed, 29 Apr 2020 13:08:42 -0700 (PDT) Received: from stbsrv-and-01.and.broadcom.net ([192.19.231.250]) by smtp.gmail.com with ESMTPSA id z23sm1638957pfr.136.2020.04.29.13.08.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2020 13:08:41 -0700 (PDT) From: Al Cooper To: linux-kernel@vger.kernel.org Cc: Al Cooper , Alan Stern , Andy Shevchenko , bcm-kernel-feedback-list@broadcom.com, devicetree@vger.kernel.org, Greg Kroah-Hartman , Krzysztof Kozlowski , linux-usb@vger.kernel.org, Mathias Nyman , Rob Herring , Yoshihiro Shimoda , Andy Shevchenko Subject: [PATCH v5 1/4] dt-bindings: Add Broadcom STB USB support Date: Wed, 29 Apr 2020 16:08:23 -0400 Message-Id: <20200429200826.20177-2-alcooperx@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200429200826.20177-1-alcooperx@gmail.com> References: <20200429200826.20177-1-alcooperx@gmail.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org Add DT bindings for Broadcom STB USB EHCI and XHCI drivers. NOTE: The OHCI driver is not included because it uses the generic platform driver. Signed-off-by: Al Cooper Reviewed-by: Rob Herring --- .../bindings/usb/brcm,bcm7445-ehci.yaml | 60 +++++++++++++++++++ .../devicetree/bindings/usb/usb-xhci.txt | 1 + 2 files changed, 61 insertions(+) create mode 100644 Documentation/devicetree/bindings/usb/brcm,bcm7445-ehci.yaml diff --git a/Documentation/devicetree/bindings/usb/brcm,bcm7445-ehci.yaml b/Documentation/devicetree/bindings/usb/brcm,bcm7445-ehci.yaml new file mode 100644 index 000000000000..7c67f7dd7a67 --- /dev/null +++ b/Documentation/devicetree/bindings/usb/brcm,bcm7445-ehci.yaml @@ -0,0 +1,60 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/usb/brcm,bcm7445-ehci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Broadcom STB USB EHCI Controller Device Tree Bindings + +allOf: + - $ref: "usb-hcd.yaml" + +maintainers: + - Al Cooper + +properties: + compatible: + contains: + const: brcm,bcm7445-ehci + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + clocks: + maxItems: 1 + description: Clock specifier for the EHCI clock + + clock-names: + const: sw_usb + + phys: + maxItems: 1 + + phy-names: + const: usbphy + +required: + - compatible + - reg + - interrupts + - phys + - clocks + +additionalProperties: false + +examples: + - | + usb@f0b00300 { + compatible = "brcm,bcm7445-ehci"; + reg = <0xf0b00300 0xa8>; + interrupts = <0x0 0x5a 0x0>; + phys = <&usbphy_0 0x0>; + phy-names = "usbphy"; + clocks = <&usb20>; + clock-names = "sw_usb"; + }; + +... diff --git a/Documentation/devicetree/bindings/usb/usb-xhci.txt b/Documentation/devicetree/bindings/usb/usb-xhci.txt index dc025f126d71..23e89d798b1b 100644 --- a/Documentation/devicetree/bindings/usb/usb-xhci.txt +++ b/Documentation/devicetree/bindings/usb/usb-xhci.txt @@ -24,6 +24,7 @@ Required properties: device - "renesas,rcar-gen3-xhci" for a generic R-Car Gen3 or RZ/G2 compatible device + - "brcm,bcm7445-xhci" for Broadcom STB SoCs with XHCI - "xhci-platform" (deprecated) When compatible with the generic version, nodes must list the From patchwork Wed Apr 29 20:08:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Cooper X-Patchwork-Id: 11518253 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 651F313B2 for ; Wed, 29 Apr 2020 20:08:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4DAE2208E0 for ; Wed, 29 Apr 2020 20:08:59 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="WHrUk0Zl" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727082AbgD2UIq (ORCPT ); Wed, 29 Apr 2020 16:08:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58324 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726456AbgD2UIp (ORCPT ); Wed, 29 Apr 2020 16:08:45 -0400 Received: from mail-pl1-x644.google.com (mail-pl1-x644.google.com [IPv6:2607:f8b0:4864:20::644]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F05BCC03C1AE; Wed, 29 Apr 2020 13:08:44 -0700 (PDT) Received: by mail-pl1-x644.google.com with SMTP id z6so1235504plk.10; Wed, 29 Apr 2020 13:08:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=vkQbZ0OEnEU7UUbpzBp0+WjmUbWo04Z45g1QFzRKmTk=; b=WHrUk0ZlOGYuneAz73utDSCSrYStuw6Byqfn6leJ3x11uSJkVjWPN5951uS1bmwhW/ SgcF6qRDoH1kf7F067nRa9TnjxNH806ns8D+Z3WVNO7H0wyN/B+043gWHzSfoyOZEVL5 cj86N3itmLr6pO0ZzIvrjLRcnOln01DjHsS4MX208txg2hcpSAPGaA73pT/QfdSt1Iih GdGd6Bs7PWYQOCTJITIGK7nkoHIY47Wi9PKhPjCC6NoYlbDtJttPgDuaFI37slyK7HIa OqtWS/09aFDNi6t1J/KDcMdc2jdwHjAK/OhWSlaI043qscLhil1Vh11iaRuDNTFFojY5 Wtqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=vkQbZ0OEnEU7UUbpzBp0+WjmUbWo04Z45g1QFzRKmTk=; b=UxG7mvrLUw9/O5ttLB8QeN9o1xdzV2gBGiHciPMTdvjAPbDUcb2Ie37hptYxsKMt3i Rao89C1oLWDJ9fdhC/qjQCYl9y8Gz4I1hi0A75jfwOMtFOxpnqhbW3LwhkNDXJFPTDDO kHWEM8yX32Elu38rdhqCDCRNO0Bx0geHu2+AbV4Is1QjJsdQA1Cgb2HZFpOffQNxV10v mLRjLq0FNX3oR/8XKPfyjJf2oNMwFzE3q3m+h8KuUKCVQ84BWURaVf2ltO6QbUk+ex88 1J7MbeUvmG5zcF3MlfxdvKSuA//id9MCNMxFkqe2xFQBLN7pjITinX9m/02dd7hMnNlR Mjtg== X-Gm-Message-State: AGi0PuZcuKaOOiIS0+QLI/rSVl36RDIpwYjN3uF0XEof72nFnltxY6kj nGPrpe2dY4WJW3M7K4/l1/5YDASgN2M= X-Google-Smtp-Source: APiQypI15zelGvx7x7Qb1y8Tk52JzvrsGiYoqtPG/TnEyrslxaApytF4oGqsp8ns5Ayiwfi2ZTXumg== X-Received: by 2002:a17:902:8f8b:: with SMTP id z11mr75469plo.208.1588190924269; Wed, 29 Apr 2020 13:08:44 -0700 (PDT) Received: from stbsrv-and-01.and.broadcom.net ([192.19.231.250]) by smtp.gmail.com with ESMTPSA id z23sm1638957pfr.136.2020.04.29.13.08.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2020 13:08:43 -0700 (PDT) From: Al Cooper To: linux-kernel@vger.kernel.org Cc: Al Cooper , Alan Stern , Andy Shevchenko , bcm-kernel-feedback-list@broadcom.com, devicetree@vger.kernel.org, Greg Kroah-Hartman , Krzysztof Kozlowski , linux-usb@vger.kernel.org, Mathias Nyman , Rob Herring , Yoshihiro Shimoda , Andy Shevchenko Subject: [PATCH v5 2/4] usb: xhci: xhci-plat: Add support for Broadcom STB SoC's Date: Wed, 29 Apr 2020 16:08:24 -0400 Message-Id: <20200429200826.20177-3-alcooperx@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200429200826.20177-1-alcooperx@gmail.com> References: <20200429200826.20177-1-alcooperx@gmail.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org Add support for Broadcom STB SoC's to the xhci platform driver Signed-off-by: Al Cooper Acked-by: Mathias Nyman --- drivers/usb/host/xhci-plat.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 1d4f6f85f0fe..44406d0eb317 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -112,6 +112,10 @@ static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen3 = { SET_XHCI_PLAT_PRIV_FOR_RCAR(XHCI_RCAR_FIRMWARE_NAME_V3) }; +static const struct xhci_plat_priv xhci_plat_brcm = { + .quirks = XHCI_RESET_ON_RESUME, +}; + static const struct of_device_id usb_xhci_of_match[] = { { .compatible = "generic-xhci", @@ -147,6 +151,12 @@ static const struct of_device_id usb_xhci_of_match[] = { }, { .compatible = "renesas,rcar-gen3-xhci", .data = &xhci_plat_renesas_rcar_gen3, + }, { + .compatible = "brcm,xhci-brcm-v2", + .data = &xhci_plat_brcm, + }, { + .compatible = "brcm,bcm7445-xhci", + .data = &xhci_plat_brcm, }, {}, }; From patchwork Wed Apr 29 20:08:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Cooper X-Patchwork-Id: 11518247 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E130713B2 for ; Wed, 29 Apr 2020 20:08:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BF56020731 for ; Wed, 29 Apr 2020 20:08:49 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GLLrWNup" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727104AbgD2UIs (ORCPT ); Wed, 29 Apr 2020 16:08:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58336 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726456AbgD2UIr (ORCPT ); Wed, 29 Apr 2020 16:08:47 -0400 Received: from mail-pl1-x643.google.com (mail-pl1-x643.google.com [IPv6:2607:f8b0:4864:20::643]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 501C0C03C1AE; Wed, 29 Apr 2020 13:08:47 -0700 (PDT) Received: by mail-pl1-x643.google.com with SMTP id f15so1251272plr.3; Wed, 29 Apr 2020 13:08:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HE+2cz70DIIBmifPNTOR7pAHERqq84jfyH7NJv1/tAY=; b=GLLrWNup6qCecg31BWpM2TkYOdk5htO+eRrnpx1TUoo03KxuRiKYLmmw3TyP9B18dj 1xYMlVSs7XNfltT25FO1xyzNsS9bt1np+s+m/V26kLFeDLdjJtPCVQZL4iHt8ZksZwZW AXKW2wO1b/9PvJ1nyrO9IJ3s5VNIGUl7z1LEvTFCJEw5bpetT1GT5Cf9kMJricmPuN6y Jx5vqt+f09NlCBDtfZcRlaBdR0V+fwaQwB9AAGrzQXpegWPnxmwWsbXHtqVb0itzGH2s VHpaJETB/ucxv9rXHIl5ygcVsH9M9Vp42MAcXIInRdE2nAJdiolnRymR5RBU4IWsqLFb 8Sew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HE+2cz70DIIBmifPNTOR7pAHERqq84jfyH7NJv1/tAY=; b=hXb//fvTPL/s/q3OE/8naXDirBjKLxoUQI2rigFebslGCl6KVFhKpD7WhpXNBh4G3x 7LXkSX1lsTSXgfmxv0u89wGeq0J+ToJylpEt2FuNq9D5rrkzKMKeGfUkIwJw/EtZ16KX mxjbv2d5QLylPdFa6K+w+uottCOPCZAvOdK+cwOq1eCfNDvaCEYvWzp+qIwNMagbFd9L RbdDr3+0Fmnrcx/0S9ak6QKoty/Y4bzs6yQPOmESoVKvqsDlYzP67pu/b5pLGpY8CZ+g vAkiyjlxt3LgE80MVioyFtmT2WkLgYNBIsb+Z5uc/2gILY8JgdG3J0+vQu9dE67BYEQv xP6g== X-Gm-Message-State: AGi0PuZtzdSabJkQLrsdUDg/YEY4hotY65OA9P/rjLlIAsNBhFz7mcOr c5PQfhhSwp8OGcHuRDiSyTERGp6xuvQ= X-Google-Smtp-Source: APiQypJFoatN8iBUTf8WZGditQaZdceq71JVhA27YzuVN6aL4eEmQ61QC62wdVzIM+ZdlhBsnTnujQ== X-Received: by 2002:a17:90a:ad93:: with SMTP id s19mr163612pjq.73.1588190926403; Wed, 29 Apr 2020 13:08:46 -0700 (PDT) Received: from stbsrv-and-01.and.broadcom.net ([192.19.231.250]) by smtp.gmail.com with ESMTPSA id z23sm1638957pfr.136.2020.04.29.13.08.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2020 13:08:45 -0700 (PDT) From: Al Cooper To: linux-kernel@vger.kernel.org Cc: Al Cooper , Alan Stern , Andy Shevchenko , bcm-kernel-feedback-list@broadcom.com, devicetree@vger.kernel.org, Greg Kroah-Hartman , Krzysztof Kozlowski , linux-usb@vger.kernel.org, Mathias Nyman , Rob Herring , Yoshihiro Shimoda , Andy Shevchenko Subject: [PATCH v5 3/4] usb: ehci: Add new EHCI driver for Broadcom STB SoC's Date: Wed, 29 Apr 2020 16:08:25 -0400 Message-Id: <20200429200826.20177-4-alcooperx@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200429200826.20177-1-alcooperx@gmail.com> References: <20200429200826.20177-1-alcooperx@gmail.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org Add a new EHCI driver for Broadcom STB SoC's. A new EHCI driver was created instead of adding support to the existing ehci platform driver because of the code required to workaround bugs in the EHCI controller. Signed-off-by: Al Cooper Reviewed-by: Andy Shevchenko Acked-by: Alan Stern --- drivers/usb/host/ehci-brcm.c | 290 +++++++++++++++++++++++++++++++++++ 1 file changed, 290 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..381bed5fdab0 --- /dev/null +++ b/drivers/usb/host/ehci-brcm.c @@ -0,0 +1,290 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2020, Broadcom */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ehci.h" + +#define hcd_to_ehci_priv(h) ((struct brcm_priv *)hcd_to_ehci(h)->priv) + +struct brcm_priv { + struct clk *clk; +}; + +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) +{ + u32 frame_idx = ehci_readl(ehci, &ehci->regs->frame_index); + u32 val; + int res; + + /* Wait for next microframe (every 125 usecs) */ + res = readl_relaxed_poll_timeout(&ehci->regs->frame_index, val, + val != frame_idx, 1, 130); + if (res) + dev_err(ehci_to_hcd(ehci)->self.controller, + "Error waiting for SOF\n"); + 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 device *dev = &pdev->dev; + struct resource *res_mem; + struct brcm_priv *priv; + struct usb_hcd *hcd; + int irq; + int err; + + if (usb_disabled()) + return -ENODEV; + + err = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32)); + if (err) + return err; + + irq = platform_get_irq(pdev, 0); + if (irq < 0) + return irq; + + /* Hook the hub control routine to work around a bug */ + if (!org_hub_control) + 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, dev, dev_name(dev)); + if (!hcd) + return -ENOMEM; + + platform_set_drvdata(pdev, hcd); + priv = hcd_to_ehci_priv(hcd); + + priv->clk = devm_clk_get_optional(dev, NULL); + if (IS_ERR(priv->clk)) { + err = PTR_ERR(priv->clk); + goto err_hcd; + } + + err = clk_prepare_enable(priv->clk); + if (err) + goto err_hcd; + + hcd->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res_mem); + if (IS_ERR(hcd->regs)) { + err = PTR_ERR(hcd->regs); + goto err_clk; + } + hcd->rsrc_start = res_mem->start; + hcd->rsrc_len = resource_size(res_mem); + err = usb_add_hcd(hcd, irq, IRQF_SHARED); + if (err) + goto err_clk; + + device_wakeup_enable(hcd->self.controller); + device_enable_async_suspend(hcd->self.controller); + platform_set_drvdata(pdev, hcd); + + return 0; + +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); + clk_disable_unprepare(priv->clk); + usb_put_hcd(hcd); + return 0; +} + +static int __maybe_unused 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); + if (ret) + return ret; + clk_disable_unprepare(priv->clk); + return 0; +} + +static int __maybe_unused 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); + + pm_runtime_disable(dev); + pm_runtime_set_active(dev); + pm_runtime_enable(dev); + + return 0; +} + +static SIMPLE_DEV_PM_OPS(ehci_brcm_pm_ops, ehci_brcm_suspend, + ehci_brcm_resume); + +static const struct of_device_id brcm_ehci_of_match[] = { + { .compatible = "brcm,ehci-brcm-v2", }, + { .compatible = "brcm,bcm7445-ehci", }, + {} +}; + +static struct platform_driver ehci_brcm_driver = { + .probe = ehci_brcm_probe, + .remove = ehci_brcm_remove, + .shutdown = usb_hcd_platform_shutdown, + .driver = { + .name = "ehci-brcm", + .pm = &ehci_brcm_pm_ops, + .of_match_table = brcm_ehci_of_match, + } +}; + +static int __init ehci_brcm_init(void) +{ + if (usb_disabled()) + return -ENODEV; + + 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("EHCI Broadcom STB driver"); +MODULE_AUTHOR("Al Cooper"); +MODULE_LICENSE("GPL"); From patchwork Wed Apr 29 20:08:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Cooper X-Patchwork-Id: 11518249 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D590792C for ; Wed, 29 Apr 2020 20:08:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B8C652137B for ; Wed, 29 Apr 2020 20:08:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Tu1+0hiz" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727124AbgD2UIw (ORCPT ); Wed, 29 Apr 2020 16:08:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58344 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727114AbgD2UIu (ORCPT ); Wed, 29 Apr 2020 16:08:50 -0400 Received: from mail-pj1-x1042.google.com (mail-pj1-x1042.google.com [IPv6:2607:f8b0:4864:20::1042]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 44815C03C1AE; Wed, 29 Apr 2020 13:08:49 -0700 (PDT) Received: by mail-pj1-x1042.google.com with SMTP id t40so1200532pjb.3; Wed, 29 Apr 2020 13:08:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=lpRZMrHTzTW8z6tlIKgNxL8ccVzt5z7E+tVpzahVStY=; b=Tu1+0hizfn13qpIyyhbi0iLwBFLeo8zVhWMQCHnhx14GxWdO8vFfT22DikMm7jSgko z+3N0rPOfFiEhvctI1nsA6c1idvbbEd/4vn/wkChAePFrOyoLePJNOJMHZQT3PxJk7/S QD1+xsX6M8JeP0T/wd8ObzkgEuOPdwzJ6o5tle6AjlJ+FiB1CNo5JfA6Ky99rfp7Z8pN uNPLudSDOEoSS8g3v9vDboK7tjZS3v13MiWcVm9m5uGHupBxw6hcSTAILNfCahkukSgM +c8MItkwH4yifKjzy/l+kHF8ZJXThFw2h0i2LiEEPly4CpPRM/pvUJS8VESMP6OwLMJf jDvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=lpRZMrHTzTW8z6tlIKgNxL8ccVzt5z7E+tVpzahVStY=; b=uRSGkqTl/1uKj0+eYWo/3bVqkNrLr2nOGE8mwmhxdWM+/+4XOs8AVbDrC0S3xtuHe2 lkAC/pn9nIEwrJrTYtz8YLUK+rVchE4hsBwFJLJUlTehHE3d31z2a4muln4Qj04TOkAp IbAnxVHhZcOy1qELOtbqUdQ7SQoQcUcv5dEOjchG9D6yTEldS1vncEe0gPvZp1SCXfh4 4otvP+4506kTwmPF1/0roED/kc6r+5QZPJ7aZzccJjlnCQalhqRCg6nhzGB0ZC9tsoz9 SWeB9kOhXGxLfC7yBOa+sKS8MfJBTBZdmaaZA5UxfEqFMZ7ZH71LhAOPH8SND+0ooCJe XPFw== X-Gm-Message-State: AGi0Puasl1FtHEbMKAwKsdRAUg29E7Kv0+Q477dZCf29apJnqzYX2xxR Bmhf8q8i6EAu2wnFg7L6+rjofe5yiAU= X-Google-Smtp-Source: APiQypJlkuZCmEzQcYaWE+FS4XRGD9/ihnnptsxlQPTyPsLe6ao7XZXj5NjEuTYgfI0uuCmYBvtG8A== X-Received: by 2002:a17:90a:8b:: with SMTP id a11mr136254pja.163.1588190928419; Wed, 29 Apr 2020 13:08:48 -0700 (PDT) Received: from stbsrv-and-01.and.broadcom.net ([192.19.231.250]) by smtp.gmail.com with ESMTPSA id z23sm1638957pfr.136.2020.04.29.13.08.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2020 13:08:48 -0700 (PDT) From: Al Cooper To: linux-kernel@vger.kernel.org Cc: Al Cooper , Alan Stern , Andy Shevchenko , bcm-kernel-feedback-list@broadcom.com, devicetree@vger.kernel.org, Greg Kroah-Hartman , Krzysztof Kozlowski , linux-usb@vger.kernel.org, Mathias Nyman , Rob Herring , Yoshihiro Shimoda , Andy Shevchenko Subject: [PATCH v5 4/4] usb: host: Add ability to build new Broadcom STB USB drivers Date: Wed, 29 Apr 2020 16:08:26 -0400 Message-Id: <20200429200826.20177-5-alcooperx@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200429200826.20177-1-alcooperx@gmail.com> References: <20200429200826.20177-1-alcooperx@gmail.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org Add the build system changes needed to get the Broadcom STB XHCI, EHCI and OHCI functionality working. The OHCI support does not require anything unique to Broadcom so the standard ohci-platform driver is being used. The link order for XHCI was changed in the Makefile because of the way STB XHCI, EHCI and OHCI controllers share a port which requires that the XHCI driver be initialized first. Also update MAINTAINERS. Signed-off-by: Al Cooper --- MAINTAINERS | 8 ++++++++ drivers/usb/host/Kconfig | 16 ++++++++++++++++ drivers/usb/host/Makefile | 16 ++++++++++------ 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 26f281d9f32a..6147ed78d212 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3481,6 +3481,14 @@ S: Supported F: Documentation/devicetree/bindings/i2c/brcm,brcmstb-i2c.yaml F: drivers/i2c/busses/i2c-brcmstb.c +BROADCOM BRCMSTB USB EHCI DRIVER +M: Al Cooper +L: linux-usb@vger.kernel.org +L: bcm-kernel-feedback-list@broadcom.com +S: Maintained +F: Documentation/devicetree/bindings/usb/brcm,bcm7445-ehci.yaml +F: drivers/usb/host/ehci-brcm.* + 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 55bdfdf11e4c..7d58fd66e412 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -97,6 +97,22 @@ config USB_XHCI_TEGRA endif # USB_XHCI_HCD +config USB_EHCI_BRCMSTB + tristate + +config USB_BRCMSTB + tristate "Broadcom STB USB support" + depends on (ARCH_BRCMSTB && PHY_BRCM_USB) || COMPILE_TEST + select USB_OHCI_HCD_PLATFORM if USB_OHCI_HCD + select USB_EHCI_BRCMSTB if USB_EHCI_HCD + select USB_XHCI_PLATFORM if USB_XHCI_HCD + help + Say Y to enable support for XHCI, EHCI and OHCI host controllers + found in Broadcom STB SoC's. + + Disabling this will keep the controllers and corresponding + PHYs powered down. + config USB_EHCI_HCD tristate "EHCI HCD (USB 2.0) support" depends on HAS_DMA && HAS_IOMEM diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index b191361257cc..85fa6ace552a 100644 --- a/drivers/usb/host/Makefile +++ b/drivers/usb/host/Makefile @@ -37,6 +37,15 @@ endif obj-$(CONFIG_USB_PCI) += pci-quirks.o +# NOTE: BRCMSTB systems require that xhci driver be linked before the +# ehci/ohci drivers. +obj-$(CONFIG_USB_XHCI_HCD) += xhci-hcd.o +obj-$(CONFIG_USB_XHCI_PCI) += xhci-pci.o +obj-$(CONFIG_USB_XHCI_PLATFORM) += xhci-plat-hcd.o +obj-$(CONFIG_USB_XHCI_HISTB) += xhci-histb.o +obj-$(CONFIG_USB_XHCI_MTK) += xhci-mtk.o +obj-$(CONFIG_USB_XHCI_TEGRA) += xhci-tegra.o + obj-$(CONFIG_USB_EHCI_HCD) += ehci-hcd.o obj-$(CONFIG_USB_EHCI_PCI) += ehci-pci.o obj-$(CONFIG_USB_EHCI_HCD_PLATFORM) += ehci-platform.o @@ -49,6 +58,7 @@ obj-$(CONFIG_USB_EHCI_HCD_STI) += ehci-st.o obj-$(CONFIG_USB_EHCI_EXYNOS) += ehci-exynos.o obj-$(CONFIG_USB_EHCI_HCD_AT91) += ehci-atmel.o obj-$(CONFIG_USB_EHCI_TEGRA) += ehci-tegra.o +obj-$(CONFIG_USB_EHCI_BRCMSTB) += ehci-brcm.o obj-$(CONFIG_USB_OXU210HP_HCD) += oxu210hp-hcd.o obj-$(CONFIG_USB_ISP116X_HCD) += isp116x-hcd.o @@ -69,12 +79,6 @@ obj-$(CONFIG_USB_OHCI_HCD_DAVINCI) += ohci-da8xx.o obj-$(CONFIG_USB_UHCI_HCD) += uhci-hcd.o obj-$(CONFIG_USB_FHCI_HCD) += fhci.o -obj-$(CONFIG_USB_XHCI_HCD) += xhci-hcd.o -obj-$(CONFIG_USB_XHCI_PCI) += xhci-pci.o -obj-$(CONFIG_USB_XHCI_PLATFORM) += xhci-plat-hcd.o -obj-$(CONFIG_USB_XHCI_HISTB) += xhci-histb.o -obj-$(CONFIG_USB_XHCI_MTK) += xhci-mtk.o -obj-$(CONFIG_USB_XHCI_TEGRA) += xhci-tegra.o obj-$(CONFIG_USB_SL811_HCD) += sl811-hcd.o obj-$(CONFIG_USB_SL811_CS) += sl811_cs.o obj-$(CONFIG_USB_U132_HCD) += u132-hcd.o