From patchwork Fri Mar 25 17:44:22 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Felipe Balbi X-Patchwork-Id: 8672661 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id CD3DCC0553 for ; Fri, 25 Mar 2016 17:47:25 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id B0DDE202F0 for ; Fri, 25 Mar 2016 17:47:24 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 91380202EB for ; Fri, 25 Mar 2016 17:47:23 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1ajVn3-0007BB-Kd; Fri, 25 Mar 2016 17:44:53 +0000 Received: from mail-lf0-x231.google.com ([2a00:1450:4010:c07::231]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1ajVmz-0007A3-8D for linux-arm-kernel@lists.infradead.org; Fri, 25 Mar 2016 17:44:50 +0000 Received: by mail-lf0-x231.google.com with SMTP id e133so1502559lfe.3 for ; Fri, 25 Mar 2016 10:44:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:in-reply-to:references:user-agent:date :message-id:mime-version; bh=NT7EbGIWjwl8MKei27iX8RBZiT64bxT0LHvpu95VIOU=; b=XfXZMI4gyNYmy3CGC1xzuYb+AqYoSZ0o8/r5P1z2OR7m9DEA69D6ORD4malLRs0Bsx WK8OBNsmnX/fmaSm1EinV0yt+TdCi+6eVGscLuqMhinp7uyB+katbcKAIxBWrue6Ai7i v/oMgFtn9oCETXHjeiDkpIPEhz9u+YhSSiKc0qPtzvWn4LKY84yEP+XqcEtOw70b0wsY 3JUhNGXKi2m+7QjI6IB5b215KUYyE8FG7GgLAQ7I/N8LqGCrjeeiD6oyGxX8Fdu8LU4K Tza0deNnbL552BzH0MdOlYAfcUI42hdowvo/zT80VqcMHj8uLzCoGt1WHrLasGabYZL6 EwNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:in-reply-to:references :user-agent:date:message-id:mime-version; bh=NT7EbGIWjwl8MKei27iX8RBZiT64bxT0LHvpu95VIOU=; b=FPrjhwRgoPVwGAG87+sxm4d2WiCMofSYbJ4s+i60Xo+TJBDwMbGR/Cjnz5Egb6O/Yy jk7utIhh2jU2r3a9tA9prJpXldvgRTCw28qGzT+Qulfbsek08smTEF8oiqXPpCfuiTmT 0UKv4DCPVWZ5pdKSr196y9qYjl8omi/6JGtlR0wb6TB761eeRrYYlbfJ76vjLRW94xGE ySIZHseFHLkBhwsOAe9VLvnmxk4vY33WwRPtKizGYGXezumPToQ1V8tVjXn11EM0PZ+p 61S+5+coFgR4qRmvFXcGsZjbN/EdiNPT6oYuKAfrel6RAZr/+Lzxzw/M4pXY3GVKfR+n VVdA== X-Gm-Message-State: AD7BkJKZSpvCXYKzn0PUX7DKY17MbKcBh5jJDvHbHYTkBDJzzX2ZGmGMKO+mEaz5tqyR7Q== X-Received: by 10.25.211.75 with SMTP id k72mr5943079lfg.45.1458927866993; Fri, 25 Mar 2016 10:44:26 -0700 (PDT) Received: from localhost (dky89cl39mn--9yczc4-4.rev.dnainternet.fi. [2001:14bb:40:39d1:26fd:52ff:fe80:5416]) by smtp.gmail.com with ESMTPSA id s193sm2168337lfe.29.2016.03.25.10.44.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 Mar 2016 10:44:25 -0700 (PDT) From: Felipe Balbi To: Gregory CLEMENT Subject: Re: [PATCH] usb: host: xhci-plat: Make enum xhci_plat_type start at a non zero value In-Reply-To: <87mvpmlc5e.fsf@free-electrons.com> References: <1458917188-28452-1-git-send-email-peter.griffin@linaro.org> <87mvpm8pfl.fsf@ti.com> <87mvpmlc5e.fsf@free-electrons.com> User-Agent: Notmuch/0.21 (http://notmuchmail.org) Emacs/25.0.91.3 (x86_64-pc-linux-gnu) Date: Fri, 25 Mar 2016 19:44:22 +0200 Message-ID: <87io0a8nbd.fsf@ti.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160325_104449_668180_05258BE3 X-CRM114-Status: GOOD ( 20.35 ) X-Spam-Score: -2.4 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: felipe.balbi@linux.intel.com, mathias.nyman@intel.com, gregkh@linuxfoundation.org, yoshihiro.shimoda.uh@renesas.com, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org, patrice.chotard@st.com, Peter Griffin , lee.jones@linaro.org, linux-arm-kernel@lists.infradead.org, maxime.coquelin@st.com Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-5.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Hi, Gregory CLEMENT writes: >> Peter Griffin writes: >>> Otherwise generic-xhci and xhci-platform which have no data get wrongly >>> detected as XHCI_PLAT_TYPE_MARVELL_ARMADA by xhci_plat_type_is(). >>> >>> This fixes a regression in v4.5 for STiH407 family SoC's which use the >>> synopsis dwc3 IP, whereby the disable_clk error path gets taken due to >>> wrongly being detected as XHCI_PLAT_TYPE_MARVELL_ARMADA and the hcd never >>> gets added. >>> >>> I suspect this will also fix other dwc3 DT platforms such as Exynos, >>> although I've only tested on STih410 SoC. >>> >>> Fixes: 4efb2f694114 ("usb: host: xhci-plat: add struct xhci_plat_priv") >>> Cc: stable@vger.kernel.org >>> Cc: gregory.clement@free-electrons.com >>> Cc: yoshihiro.shimoda.uh@renesas.com >>> Signed-off-by: Peter Griffin >>> --- >>> drivers/usb/host/xhci-plat.h | 2 +- >>> 1 file changed, 1 insertion(+), 1 deletion(-) >>> >>> diff --git a/drivers/usb/host/xhci-plat.h b/drivers/usb/host/xhci-plat.h >>> index 5a2e2e3..529c3c4 100644 >>> --- a/drivers/usb/host/xhci-plat.h >>> +++ b/drivers/usb/host/xhci-plat.h >>> @@ -14,7 +14,7 @@ >>> #include "xhci.h" /* for hcd_to_xhci() */ >>> >>> enum xhci_plat_type { >>> - XHCI_PLAT_TYPE_MARVELL_ARMADA, >>> + XHCI_PLAT_TYPE_MARVELL_ARMADA = 1, >>> XHCI_PLAT_TYPE_RENESAS_RCAR_GEN2, >>> XHCI_PLAT_TYPE_RENESAS_RCAR_GEN3, >> >> aren't these platforms using device tree ? Why aren't these just >> different compatible strings ? > > According to 4efb2f69411456d35051e9047c15157c9a5ba217 "usb: host: > xhci-plat: add struct xhci_plat_priv" : > > This patch adds struct xhci_plat_priv to simplify the code to match > platform specific variables. For now, this patch adds a member "type" in > the structure that's fine but the answer doesn't exactly match my question ;-) My point is that this enum shouldn't be necessary at all. We have compatible flags to make these checks instead. How about below ? (untested, uncompiled, yada yada yada). Note that we DON'T need this xhci_plat_type trickery, just need to be a little bit smarter about how we use driver_data: ps: there might be bugs there, but it's a holiday and I really shouldn't be spending time on this right now ;-) Anyway, have fun testing. Let me know if it doesn't work. Acked-by: Lee Jones diff --git a/drivers/usb/host/xhci-mvebu.c b/drivers/usb/host/xhci-mvebu.c index 1eefc988192d..1ea6c18b74f3 100644 --- a/drivers/usb/host/xhci-mvebu.c +++ b/drivers/usb/host/xhci-mvebu.c @@ -41,8 +41,9 @@ static void xhci_mvebu_mbus_config(void __iomem *base, } } -int xhci_mvebu_mbus_init_quirk(struct platform_device *pdev) +int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd) { + struct platform_device *pdev = to_platform_device(hcd->self.controller); struct resource *res; void __iomem *base; const struct mbus_dram_target_info *dram; diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 5c15e9bc5f7a..adb77c60a9ae 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -47,43 +47,56 @@ static void xhci_plat_quirks(struct device *dev, struct xhci_hcd *xhci) xhci->quirks |= XHCI_PLAT; } +static void xhci_priv_plat_start(struct usb_hcd *hcd) +{ + struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd); + + if (priv->plat_start) + priv->plat_start(hcd); +} + +static int xhci_priv_init_quirk(struct usb_hcd *hcd) +{ + struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd); + + if (!priv->init_quirk) + return 0; + + return priv->init_quirk(hcd); +} + /* called during probe() after chip reset completes */ static int xhci_plat_setup(struct usb_hcd *hcd) { int ret; - if (xhci_plat_type_is(hcd, XHCI_PLAT_TYPE_RENESAS_RCAR_GEN2) || - xhci_plat_type_is(hcd, XHCI_PLAT_TYPE_RENESAS_RCAR_GEN3)) { - ret = xhci_rcar_init_quirk(hcd); - if (ret) - return ret; - } + ret = xhci_priv_init_quirk(hcd); + if (ret) + return ret; return xhci_gen_setup(hcd, xhci_plat_quirks); } static int xhci_plat_start(struct usb_hcd *hcd) { - if (xhci_plat_type_is(hcd, XHCI_PLAT_TYPE_RENESAS_RCAR_GEN2) || - xhci_plat_type_is(hcd, XHCI_PLAT_TYPE_RENESAS_RCAR_GEN3)) - xhci_rcar_start(hcd); - + xhci_priv_plat_start(hcd); return xhci_run(hcd); } #ifdef CONFIG_OF static const struct xhci_plat_priv xhci_plat_marvell_armada = { - .type = XHCI_PLAT_TYPE_MARVELL_ARMADA, + .init_quirk = xhci_mvebu_mbus_init_quirk, }; static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen2 = { - .type = XHCI_PLAT_TYPE_RENESAS_RCAR_GEN2, .firmware_name = XHCI_RCAR_FIRMWARE_NAME_V1, + .init_quirk = xhci_rcar_init_quirk, }; static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen3 = { - .type = XHCI_PLAT_TYPE_RENESAS_RCAR_GEN3, .firmware_name = XHCI_RCAR_FIRMWARE_NAME_V2, + .init_quirk = xhci_rcar_init_quirk, + .plat_start = xhci_rcar_start, }; static const struct of_device_id usb_xhci_of_match[] = { diff --git a/drivers/usb/host/xhci-plat.h b/drivers/usb/host/xhci-plat.h index 5a2e2e3936c4..c4d565980832 100644 --- a/drivers/usb/host/xhci-plat.h +++ b/drivers/usb/host/xhci-plat.h @@ -13,27 +13,13 @@ #include "xhci.h" /* for hcd_to_xhci() */ -enum xhci_plat_type { - XHCI_PLAT_TYPE_MARVELL_ARMADA, - XHCI_PLAT_TYPE_RENESAS_RCAR_GEN2, - XHCI_PLAT_TYPE_RENESAS_RCAR_GEN3, -}; - struct xhci_plat_priv { enum xhci_plat_type type; const char *firmware_name; + void (*plat_start)(struct usb_hcd *); + int (*init_quirk)(struct usb_hcd *); }; #define hcd_to_xhci_priv(h) ((struct xhci_plat_priv *)hcd_to_xhci(h)->priv) -static inline bool xhci_plat_type_is(struct usb_hcd *hcd, - enum xhci_plat_type type) -{ - struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd); - - if (priv && priv->type == type) - return true; - else - return false; -} #endif /* _XHCI_PLAT_H */