From patchwork Fri Nov 22 23:31:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Olovyannikov X-Patchwork-Id: 1199731 X-Patchwork-Delegate: marek.vasut@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=broadcom.com header.i=@broadcom.com header.b="AA/MA14z"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 47KXld6VQGz9sPn for ; Sat, 23 Nov 2019 10:32:29 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 78D95C21EB9; Fri, 22 Nov 2019 23:31:41 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 2F993C21D9A; Fri, 22 Nov 2019 23:31:40 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id A44D2C21EBD; Fri, 22 Nov 2019 23:31:32 +0000 (UTC) Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by lists.denx.de (Postfix) with ESMTPS id 54312C21E47 for ; Fri, 22 Nov 2019 23:31:29 +0000 (UTC) Received: by mail-wm1-f67.google.com with SMTP id 8so9541865wmo.0 for ; Fri, 22 Nov 2019 15:31:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HYTQeYGO3ybzqxyDD1xQr277aY1yfH6wRwRL93GhJIA=; b=AA/MA14z+4EyVXaJ/gtfvdn7CF1GdejHsBEGuc8B1LssLVvDxhe9Ni3gc1lSWlYS9q 4gilRBjTpKEt0FIdeNYIPDDevhxn6OlRuANdfnvkugYyf8shj1SdpAug1e8qFt54gxHN PFxChyespu/1nziyX3ruvHBQPjO4E5IECWAo8= 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=HYTQeYGO3ybzqxyDD1xQr277aY1yfH6wRwRL93GhJIA=; b=IalM+3yWD+7wJMnnCQ6+FWLvd4E5bBNYFCODpbcqsR1lsStGNbZtig8x3HZ2z4Q8uU HxGCzK9lpTbFH+Acjed0JqzabOhL7IIZRJB1KeHZdmpY1JDLDXwIfAVeEsgWB4b93rfa pfV8s/zNQ3TEe/a4qwadn9LU/CiBpqpAFK+CQJp/4ScHMoSGO69BH10JO8E5C1BaFdur ZBjyEwqKSbJvWr7L8zzxwJTGFOdvgwz2cF3E8mnLu7aKd9534ynnhz6frCRJKGZYitK7 jbUTCqEzb3v1V4ItKhYupQNwbqiJwssOZcibx/B+kS/WsJwrAvwJXS5Gk6fpD0sJrkVr Ia0A== X-Gm-Message-State: APjAAAUSFOi2wxvjV+eLNXdO+wLP30YgQ4cjFubmEbEzflkRzx54N6kS SGcyOzeTdY8EnY6rX4fyD6afqjZYPoVLFSL3oICqBKKK+mLxzyF0QPEClBlzbELzXM+8mt59UUN OuvBc214OvMmilsCC2ZtIMJArlMIbCRIur7NwDaK7QkvXYZl7oKWjsdzlm0zS+v95f13HT5TcN+ ue0+2SyRnGQsU= X-Google-Smtp-Source: APXvYqzsXrwDa4WgBc7qV1T6Pbv2fRV4tt3Ie559dJpOVKBCifPbe0xrpvavT2OManoqSw7xd4MDQg== X-Received: by 2002:a1c:cc1a:: with SMTP id h26mr7634707wmb.40.1574465488375; Fri, 22 Nov 2019 15:31:28 -0800 (PST) Received: from LBRMN-LNXUB114.ric.broadcom.com ([192.19.228.250]) by smtp.gmail.com with ESMTPSA id s9sm627504wmj.22.2019.11.22.15.31.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Nov 2019 15:31:27 -0800 (PST) From: Vladimir Olovyannikov To: u-boot@lists.denx.de Date: Fri, 22 Nov 2019 15:31:08 -0800 Message-Id: <20191122233108.31244-3-vladimir.olovyannikov@broadcom.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191122233108.31244-1-vladimir.olovyannikov@broadcom.com> References: <20191122233108.31244-1-vladimir.olovyannikov@broadcom.com> Cc: Marek Vasut , Bharat Kumar Reddy Gooty Subject: [U-Boot] [PATCH 2/2] drivers: usb: host: Add BRCM xHCI driver X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" From: Bharat Kumar Reddy Gooty Base driver for Broadcom xHCI controllers Signed-off-by: Bharat Kumar Reddy Gooty Signed-off-by: Vladimir Olovyannikov --- drivers/usb/host/Kconfig | 8 +++ drivers/usb/host/Makefile | 1 + drivers/usb/host/xhci-brcm.c | 103 +++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 drivers/usb/host/xhci-brcm.c diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 0987ff25b1..94ac969058 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -88,6 +88,14 @@ config USB_XHCI_FSL depends on !SPL_NO_USB help Enables support for the on-chip xHCI controller on NXP Layerscape SoCs. + +config USB_XHCI_BRCM + bool "Broadcom USB3 Host XHCI controller" + depends on DM_USB + help + USB controller based on the Broadcom USB3 IP Core. + Supports USB2/3 functionality. + endif # USB_XHCI_HCD config USB_EHCI_HCD diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index 7feeff679c..b62f346094 100644 --- a/drivers/usb/host/Makefile +++ b/drivers/usb/host/Makefile @@ -44,6 +44,7 @@ obj-$(CONFIG_USB_EHCI_RMOBILE) += ehci-rmobile.o obj-$(CONFIG_USB_EHCI_ZYNQ) += ehci-zynq.o # xhci +obj-$(CONFIG_USB_XHCI_BRCM) += xhci-brcm.o obj-$(CONFIG_USB_XHCI_HCD) += xhci.o xhci-mem.o xhci-ring.o obj-$(CONFIG_USB_XHCI_DWC3) += xhci-dwc3.o obj-$(CONFIG_USB_XHCI_DWC3_OF_SIMPLE) += dwc3-of-simple.o diff --git a/drivers/usb/host/xhci-brcm.c b/drivers/usb/host/xhci-brcm.c new file mode 100644 index 0000000000..84ec95f804 --- /dev/null +++ b/drivers/usb/host/xhci-brcm.c @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2019 Broadcom. + */ + +#include +#include +#include +#include +#include +#include "xhci.h" + +#define DRD2U3H_XHC_REGS_AXIWRA 0xC08 +#define DRD2U3H_XHC_REGS_AXIRDA 0xC0C + +#define USBAXI_AWCACHE 0xF +#define USBAXI_ARCACHE 0xF +#define USBAXI_AWPROT 0x8 +#define USBAXI_ARPROT 0x8 +#define USBAXIWR_SA_VAL ((USBAXI_AWCACHE << 4 | USBAXI_AWPROT) << 0) +#define USBAXIWR_SA_MASK (0xff) +#define USBAXIWR_UA_VAL ((USBAXI_AWCACHE << 4 | USBAXI_AWPROT) << 16) +#define USBAXIWR_UA_MASK ((0xff) << 16) +#define USBAXIRD_SA_VAL ((USBAXI_ARCACHE << 4 | USBAXI_ARPROT) << 0) +#define USBAXIRD_SA_MASK (0xff) +#define USBAXIRD_UA_VAL ((USBAXI_ARCACHE << 4 | USBAXI_ARPROT) << 16) +#define USBAXIRD_UA_MASK ((0xff) << 16) + +struct brcm_xhci_platdata { + unsigned int arcache; + unsigned int awcache; +}; + +static int xhci_brcm_probe(struct udevice *dev) +{ + struct xhci_hccr *hcd; + struct xhci_hcor *hcor; + struct brcm_xhci_platdata *plat = dev_get_platdata(dev); + int len, ret = 0; + + if (!plat) { + dev_err(dev, "Can't get xHCI Plat data\n"); + return -ENOMEM; + } + + hcd = dev_read_addr_ptr(dev); + if (!hcd) { + dev_err(dev, "Can't get the xHCI register base address\n"); + return -ENXIO; + } + + len = HC_LENGTH(xhci_readl(&(hcd)->cr_capbase)); + hcor = (struct xhci_hcor *)((uintptr_t)hcd + len); + + /* Save the default values of AXI read and write attributes */ + plat->awcache = readl((uintptr_t)hcd + DRD2U3H_XHC_REGS_AXIWRA); + plat->arcache = readl((uintptr_t)hcd + DRD2U3H_XHC_REGS_AXIRDA); + + /* Enable AXI read and write attributes. */ + clrsetbits_le32(((uintptr_t)hcd + DRD2U3H_XHC_REGS_AXIWRA), + (USBAXIWR_UA_MASK | USBAXIWR_SA_MASK), + (USBAXIWR_UA_VAL | USBAXIWR_SA_VAL)); + clrsetbits_le32(((uintptr_t)hcd + DRD2U3H_XHC_REGS_AXIRDA), + (USBAXIRD_UA_MASK | USBAXIRD_SA_MASK), + (USBAXIRD_UA_VAL | USBAXIRD_SA_VAL)); + + ret = xhci_register(dev, hcd, hcor); + if (ret) + dev_err(dev, "Failed to register xHCI\n"); + + return ret; +} + +static int xhci_brcm_deregister(struct udevice *dev) +{ + struct xhci_hccr *hcd; + struct brcm_xhci_platdata *plat = dev_get_platdata(dev); + + hcd = (struct xhci_hccr *)((uintptr_t)dev_read_addr(dev)); + + /* Restore the default values for AXI read and write attributes */ + writel(plat->awcache, ((uintptr_t)hcd + DRD2U3H_XHC_REGS_AXIWRA)); + writel(plat->arcache, ((uintptr_t)hcd + DRD2U3H_XHC_REGS_AXIRDA)); + + return xhci_deregister(dev); +} + +static const struct udevice_id xhci_brcm_ids[] = { + { .compatible = "brcm,generic-xhci" }, + { } +}; + +U_BOOT_DRIVER(usb_xhci) = { + .name = "xhci_brcm", + .id = UCLASS_USB, + .probe = xhci_brcm_probe, + .remove = xhci_brcm_deregister, + .ops = &xhci_usb_ops, + .of_match = xhci_brcm_ids, + .platdata_auto_alloc_size = sizeof(struct brcm_xhci_platdata), + .priv_auto_alloc_size = sizeof(struct xhci_ctrl), + .flags = DM_FLAG_ALLOC_PRIV_DMA, +};