From patchwork Thu Mar 29 13:42:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Neil Armstrong X-Patchwork-Id: 892791 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 (mailfrom) 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=none (p=none dis=none) header.from=baylibre.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=baylibre-com.20150623.gappssmtp.com header.i=@baylibre-com.20150623.gappssmtp.com header.b="psfrdZBX"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 40BmDx4r6dz9s0m for ; Fri, 30 Mar 2018 00:44:01 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 633D7C22028; Thu, 29 Mar 2018 13:42:48 +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_DNSWL_NONE, 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 AA511C22014; Thu, 29 Mar 2018 13:42:34 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 65437C21FF4; Thu, 29 Mar 2018 13:42:31 +0000 (UTC) Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by lists.denx.de (Postfix) with ESMTPS id 1E8EFC21E63 for ; Thu, 29 Mar 2018 13:42:28 +0000 (UTC) Received: by mail-wm0-f68.google.com with SMTP id l201so10887988wmg.0 for ; Thu, 29 Mar 2018 06:42:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=IWbsubU+XKl+9iW47Y/J6wb9Dqi0SqhjJ9NHADMJYbc=; b=psfrdZBXVAg64/XGptJnU/ClPRIhV/fVENpZFmaaGneOSuEwgUM7ybzDkwO4uo0TfO NX7KrUQDj1rYatqSJpl6lhsWmUuUZbblKkYQ7rjWIyOia1wYKl1ASwbpxToLyA+x/fOL Q7x0bSCse6gT1bxWxLF5qQuZCG6gn11Zz9CylwE68Etxmo35w9YRT3ELX3kE3poMaN5R YKS7WxYU/NvJbrPc1wFyFGyd93KjZ4d6SX9fXQcCg5enZVJB1z6PICES3XWhKy+EXmwo whzVbJ7zUh1ZP4drn0qvZsU4xWcElmJM4IA8OudwIb1lAm4NJt0Z/+dr7KrUPm21j9a4 J6cQ== 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=IWbsubU+XKl+9iW47Y/J6wb9Dqi0SqhjJ9NHADMJYbc=; b=WXj5q9UCOEy/gIwVUT7CdjZ2tbw4HrDmTKIrTZcbqxl77RR0Kq+qr2l113Wv5BLaqg agsOHpQ4TytsDAX9om3M1nUbdlhMYeaDE8nG8skSF0D5iuuDUmCB/YIP8hThoT4AY0JZ xfRaC1ksThxR34L1ZouY7rC5sXLav52mP2eu/prCWjnmD4xXYFVa+XHGxqhtpFTixCdx FdPGdb18ERK05g+5tf0jAShlulTkxK62erDfcG65VxhqY3+hcXptm2SqbR9EiP3gRc0f GGK++1oRjgliQbWl8jsTw+8XH1peDjyMMsm53FE6xCc4EpqHFJkSh7eVWcXtf4OaifX0 Kmjg== X-Gm-Message-State: AElRT7GAGlUNQSWX7rW+d1tDNvkk6vhGEsUHPnG9ZW9M899RUPCMKoEc 05Dnc64CFCdcPjPKfJT/DuYNP6cwcv4= X-Google-Smtp-Source: AIpwx49yXihcNZ1zr8Xdjjgvd4ocU0fZuwHDlH6uSFztLQnIV7vS5b74NmGxKRbqfZxv0jD9c2SHyw== X-Received: by 10.28.20.140 with SMTP id 134mr5680754wmu.87.1522330947185; Thu, 29 Mar 2018 06:42:27 -0700 (PDT) Received: from bender.home ([2a01:cb1d:4ce:ea00:35c7:f264:355a:6031]) by smtp.gmail.com with ESMTPSA id w74sm1220769wmd.27.2018.03.29.06.42.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 29 Mar 2018 06:42:26 -0700 (PDT) From: Neil Armstrong To: u-boot@lists.denx.de, marex@denx.de, bmeng.cn@gmail.com Date: Thu, 29 Mar 2018 15:42:18 +0200 Message-Id: <1522330940-25062-2-git-send-email-narmstrong@baylibre.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1522330940-25062-1-git-send-email-narmstrong@baylibre.com> References: <1522330940-25062-1-git-send-email-narmstrong@baylibre.com> Cc: linux-amlogic@lists.infradead.org Subject: [U-Boot] [PATCH u-boot 1/3] usb: host: Add simple of glue driver for DWC3 USB Controllers integration 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" Signed-off-by: Neil Armstrong --- drivers/usb/host/Kconfig | 7 ++ drivers/usb/host/Makefile | 1 + drivers/usb/host/dwc3-of-simple.c | 187 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 195 insertions(+) create mode 100644 drivers/usb/host/dwc3-of-simple.c diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index a7249b7..6caa615 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -21,6 +21,13 @@ config USB_XHCI_DWC3 Say Y or if your system has a Dual Role SuperSpeed USB controller based on the DesignWare USB3 IP Core. +config USB_XHCI_DWC3_OF_SIMPLE + bool "DesignWare USB3 DRD Generic OF Simple Glue Layer" + select MISC + help + Support USB2/3 functionality in simple SoC integrations with + USB controller based on the DesignWare USB3 IP Core. + config USB_XHCI_MVEBU bool "MVEBU USB 3.0 support" default y diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index 9819489..abe4f90 100644 --- a/drivers/usb/host/Makefile +++ b/drivers/usb/host/Makefile @@ -49,6 +49,7 @@ obj-$(CONFIG_USB_EHCI_ZYNQ) += ehci-zynq.o # xhci 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 obj-$(CONFIG_USB_XHCI_ROCKCHIP) += xhci-rockchip.o obj-$(CONFIG_USB_XHCI_ZYNQMP) += xhci-zynqmp.o obj-$(CONFIG_USB_XHCI_KEYSTONE) += xhci-keystone.o diff --git a/drivers/usb/host/dwc3-of-simple.c b/drivers/usb/host/dwc3-of-simple.c new file mode 100644 index 0000000..826a996 --- /dev/null +++ b/drivers/usb/host/dwc3-of-simple.c @@ -0,0 +1,187 @@ +/* + * dwc3-of-simple.c - OF glue layer for simple integrations + * + * Copyright (c) 2015 Texas Instruments Incorporated - http://www.ti.com + * + * Author: Felipe Balbi + * + * Copyright (C) 2018 BayLibre, SAS + * Author: Neil Armstrong + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +struct dwc3_of_simple { +#if CONFIG_IS_ENABLED(CLK) + struct clk *clks; + int num_clocks; +#endif +#if CONFIG_IS_ENABLED(DM_RESET) + struct reset_ctl *resets; + int num_resets; +#endif +}; + +#if CONFIG_IS_ENABLED(DM_RESET) +static int dwc3_of_simple_reset_init(struct udevice *dev, + struct dwc3_of_simple *simple, + int count) +{ + int i, ret, err; + + if (!count) + return 0; + + simple->resets = devm_kcalloc(dev, count, sizeof(struct reset_ctl), + GFP_KERNEL); + if (!simple->resets) + return -ENOMEM; + + for (i = 0; i < count; i++) { + ret = reset_get_by_index(dev, i, &simple->resets[i]); + if (ret < 0) + break; + + ret = reset_request(&simple->resets[i]); + if (ret) { + pr_err("failed to request reset line %d\n", i); + reset_free(&simple->resets[i]); + goto reset_err; + } + + + ++simple->num_resets; + } + + for (i = 0; i < simple->num_resets; i++) { + ret = reset_deassert(&simple->resets[i]); + if (ret && ret != -ENOSYS && ret != -ENOTSUPP) { + pr_err("failed to deassert reset line %d\n", i); + goto reset_err; + } + } + + return 0; + +reset_err: + err = reset_release_all(simple->resets, simple->num_resets); + if (err) + pr_err("failed to disable all clocks\n"); + + return ret; +} +#endif + +#if CONFIG_IS_ENABLED(CLK) +static int dwc3_of_simple_clk_init(struct udevice *dev, + struct dwc3_of_simple *simple, + int count) +{ + int i, ret, err; + + if (!count) + return 0; + + simple->clks = devm_kcalloc(dev, count, sizeof(struct clk), + GFP_KERNEL); + if (!simple->clks) + return -ENOMEM; + + for (i = 0; i < count; i++) { + ret = clk_get_by_index(dev, i, &simple->clks[i]); + if (ret < 0) + break; + + ret = clk_enable(&simple->clks[i]); + if (ret && ret != -ENOSYS && ret != -ENOTSUPP) { + pr_err("failed to enable clock %d\n", i); + clk_free(&simple->clks[i]); + goto clk_err; + } + + ++simple->num_clocks; + } + + return 0; + +clk_err: + err = clk_release_all(simple->clks, simple->num_clocks); + if (err) + pr_err("failed to disable all clocks\n"); + + return ret; +} +#endif + +static int dwc3_of_simple_probe(struct udevice *dev) +{ +#if CONFIG_IS_ENABLED(DM_RESET) || CONFIG_IS_ENABLED(CLK) + struct dwc3_of_simple *simple = dev_get_platdata(dev); + int ret; +#endif + +#if CONFIG_IS_ENABLED(CLK) + ret = dwc3_of_simple_clk_init(dev, simple, + dev_count_phandle_with_args(dev, "clocks", "#clock-cells")); + if (ret) + return ret; +#endif + +#if CONFIG_IS_ENABLED(DM_RESET) + ret = dwc3_of_simple_reset_init(dev, simple, + dev_count_phandle_with_args(dev, "resets", "#reset-cells")); + if (ret) + return ret; +#endif + + return 0; +} + +static int dwc3_of_simple_remove(struct udevice *dev) +{ +#if CONFIG_IS_ENABLED(DM_RESET) || CONFIG_IS_ENABLED(CLK) + struct dwc3_of_simple *simple = dev_get_platdata(dev); + int i; +#endif + +#if CONFIG_IS_ENABLED(DM_RESET) + for (i = 0; i < simple->num_resets; i++) + reset_assert(&simple->resets[i]); + + if (simple->num_resets) + reset_release_all(simple->resets, simple->num_resets); +#endif + +#if CONFIG_IS_ENABLED(CLK) + for (i = 0; i < simple->num_clocks; i++) + clk_disable(&simple->clks[i]); + + if (simple->num_clocks) + clk_release_all(simple->clks, simple->num_clocks); +#endif + + return dm_scan_fdt_dev(dev); +} + +static const struct udevice_id dwc3_of_simple_ids[] = { + { .compatible = "amlogic,meson-gxl-dwc3" }, + { } +}; + +U_BOOT_DRIVER(dwc3_of_simple) = { + .name = "dwc3-of-simple", + .id = UCLASS_SIMPLE_BUS, + .of_match = dwc3_of_simple_ids, + .probe = dwc3_of_simple_probe, + .remove = dwc3_of_simple_remove, + .platdata_auto_alloc_size = sizeof(struct dwc3_of_simple), + .flags = DM_FLAG_ALLOC_PRIV_DMA, +};