From patchwork Tue Nov 26 18:41:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Olovyannikov X-Patchwork-Id: 1201163 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="EbZKUY20"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 47Mt7r2jdTz9sPV for ; Wed, 27 Nov 2019 05:43:04 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id E6032C21FDB; Tue, 26 Nov 2019 18:42:14 +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 DC4BDC21F35; Tue, 26 Nov 2019 18:42:12 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 2BBA2C21F47; Tue, 26 Nov 2019 18:41:54 +0000 (UTC) Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by lists.denx.de (Postfix) with ESMTPS id D67F7C21F8E for ; Tue, 26 Nov 2019 18:41:52 +0000 (UTC) Received: by mail-wr1-f65.google.com with SMTP id t2so23714772wrr.1 for ; Tue, 26 Nov 2019 10:41:52 -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=c/FQYxVfga8uTn1BtvcexhBMDdy2vPjVxElEocoAoOA=; b=EbZKUY20invsUh1aQDZpte//3Vazamx2wtChjpbbigEKOCJGfs0nTwxftUzeeFvKUC 7clCe2VqB3Eyp+yikPmvgSMPhjLVLVls0S8txxHnGEytUlSSAQWerJHzf5M5tKZ0dzpF J+CzIBgSl31ftr4PXXmebygePrVI6ohtIrbfY= 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=c/FQYxVfga8uTn1BtvcexhBMDdy2vPjVxElEocoAoOA=; b=HSPZryHB3MChTqsrtvNmu2n+nTVcF82Hp1doXyAOTXbb5E1wxr5sF/mAPB7BvirGsi z8Vf5Nn0hfoxHFOJbqvfDuCxMIDe5YICpe72GqIjBG7Jz5mJ2o7XiNgjk+tdLMVx8QF9 XkbTh/JMQPfZPcw6rbpx3oFAhJO6PAKUX0kjQwlnPlYKS0cJvsZRV0FMsgnxR7qmSIcO Q7YXz2T0P6ZZj04qMa/1hChGZ3nsbswbwnjFXo1c3OBkEyPXFLKRdsUQWUk0zG5Xyy6x kAhUzAwtXuSURdPifeIdVcED4sUwRRtuLV3iSk5ACzLrY43iuBm4IGjpJLYeQk4aO9Hg TC4g== X-Gm-Message-State: APjAAAU470RJ6gWtWPEM2gB9EqIYw4CXOs/e7kqxlnvCVMe1cBHp9ohG Ww1KeVj75Lz+DfL8cDE4wDneDOwcSmQYCX2wSpxAKHOnpkq8xrQqGkYJjUuFVs8CAkQYWhWP7qf suyfi5FzQI71T+k2RQ2wcAy84birgZzdAUj8oNz9dMLIu0W0sO2gBVzgW4apBhFoHOpGb+v7WS4 icAwBRH75diOY= X-Google-Smtp-Source: APXvYqyrc0oWE0vnLkHC8+R/I0Hb1IeVo0muI0RenmZfhJd39f8FFYoUSwqWHSLYJ7cGcTmd11aPfQ== X-Received: by 2002:a5d:4b05:: with SMTP id v5mr37948975wrq.210.1574793711945; Tue, 26 Nov 2019 10:41:51 -0800 (PST) Received: from LBRMN-LNXUB114.ric.broadcom.com ([192.19.228.250]) by smtp.gmail.com with ESMTPSA id a64sm4606302wmc.18.2019.11.26.10.41.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 10:41:51 -0800 (PST) From: Vladimir Olovyannikov To: u-boot@lists.denx.de Date: Tue, 26 Nov 2019 10:41:36 -0800 Message-Id: <20191126184136.17370-3-vladimir.olovyannikov@broadcom.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191126184136.17370-1-vladimir.olovyannikov@broadcom.com> References: <20191126184136.17370-1-vladimir.olovyannikov@broadcom.com> Cc: Marek Vasut , Bharat Kumar Reddy Gooty Subject: [U-Boot] [PATCH v3 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 | 105 +++++++++++++++++++++++++++++++++++ 3 files changed, 114 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..c53c93209e --- /dev/null +++ b/drivers/usb/host/xhci-brcm.c @@ -0,0 +1,105 @@ +// 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) +#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) +#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); + uintptr_t hc_base; + 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; + } + + hc_base = (uintptr_t)hcd; + len = HC_LENGTH(xhci_readl(&hcd->cr_capbase)); + hcor = (struct xhci_hcor *)(hc_base + len); + + /* Save the default values of AXI read and write attributes */ + plat->awcache = readl(hc_base + DRD2U3H_XHC_REGS_AXIWRA); + plat->arcache = readl(hc_base + DRD2U3H_XHC_REGS_AXIRDA); + + /* Enable AXI read and write attributes. */ + clrsetbits_le32((hc_base + DRD2U3H_XHC_REGS_AXIWRA), + (USBAXIWR_UA_MASK | USBAXIWR_SA_MASK), + (USBAXIWR_UA_VAL | USBAXIWR_SA_VAL)); + clrsetbits_le32((hc_base + 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 brcm_xhci_platdata *plat = dev_get_platdata(dev); + uintptr_t hc_base; + + hc_base = (uintptr_t)dev_read_addr(dev); + + /* Restore the default values for AXI read and write attributes */ + writel(plat->awcache, hc_base + DRD2U3H_XHC_REGS_AXIWRA); + writel(plat->arcache, hc_base + 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, +};