From patchwork Wed Jun 12 14:26:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 166575 Delivered-To: patch@linaro.org Received: by 2002:a92:4782:0:0:0:0:0 with SMTP id e2csp3752822ilk; Wed, 12 Jun 2019 07:27:52 -0700 (PDT) X-Google-Smtp-Source: APXvYqxZtt98LmxPYTlOfeke+ohPlaFUiSlRn2tAHE7lxphojIfV11kz1dij7n9xqoK5wuL2aWBt X-Received: by 2002:a65:514a:: with SMTP id g10mr25323770pgq.328.1560349672330; Wed, 12 Jun 2019 07:27:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1560349672; cv=none; d=google.com; s=arc-20160816; b=YJnzjRn35lL+LIDjG8Snemi4e40cP8V0OYXNjo2jeh45ji0siRZwSfjVn2RenR56Zo bq2CXdSPzX8b8xdfxs7bz/8DFyDsVsHWiVTJmenIKweZ71lMJSvy4x+vcla0XngrcdDF X16j1zpcqkurf29yeOUMgHolpMHVfxiuJsBY5VxqM9cfdN7y7ZcNBYJHmn+Q6lLOUHPA Z8btC8YR9q/Wi1U7JiiHJX9wAdgwYeQ5cUJWc8sLCcGoGsJ2hyyme83vGYkiDJdzKBZr Swt7fkbyxmlK97T1YykQrm3Zwq52pvwutVYdoT7GMjYf8QzGvSlyFHbgVQMP1xxVhHnX nLOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=sZgUWoDIjlp1AADdoY2p7F+W0Gj8IYxrvEu+mq9KTCQ=; b=DNDxzH8ErBca/XfDjYtgsYOY8HuvmMQJl9Aujnf6G6yeGgKXvx+Op59Ioegi5xj0bV XAQhVnYKa2ZXAnElgszfLxTpQUkBIj9f79V4md2XV3yrFrYp5zUUepRs/3MKJAMvkuO9 JV1yplyPml2NzK1s9BqIsJQ8lEr3c9BHWyRl6vYgkzaGRbd/2WXBZ/IzUranJuKHH81U JlOo3WOjcaT/MM8FWyX8MX2Rok4cY2+zxcmLQy1YGYKYQLa9mGakNgChBXB0/k05HOhH 0zwDeAzkCKV9IReVumiChpq7n+Kpyt1YMH7HQZuVR0oRvU0oD2+/qBzXwog+aZFJbDPd QhyA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ThCLa8t3; spf=pass (google.com: best guess record for domain of linux-i2c-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-i2c-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f1si16068077pld.78.2019.06.12.07.27.52; Wed, 12 Jun 2019 07:27:52 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-i2c-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ThCLa8t3; spf=pass (google.com: best guess record for domain of linux-i2c-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-i2c-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2439660AbfFLO1D (ORCPT + 2 others); Wed, 12 Jun 2019 10:27:03 -0400 Received: from mail-wm1-f68.google.com ([209.85.128.68]:50891 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2439641AbfFLO1C (ORCPT ); Wed, 12 Jun 2019 10:27:02 -0400 Received: by mail-wm1-f68.google.com with SMTP id c66so6809126wmf.0 for ; Wed, 12 Jun 2019 07:27:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=sZgUWoDIjlp1AADdoY2p7F+W0Gj8IYxrvEu+mq9KTCQ=; b=ThCLa8t3mfLlLTD+JYyjOG6ksSBzbsRKPHrxJlijHkCpRc+/WWHb1OthqzocW1Q84S MpNp8Y/1dFfEsYS7a75G2juDpZzuA+kbzktHPUUG9uWEjmWQUZtj494NWkBUiypWi9yf n4LCAJFKzrB56BTYY41lJ17pCUELOG2TK1at6xcbda8EYVl/FG2i0UNTMxkgt3JpYYif r1NFHKJ2TRQNI4kIyOJIIORlJ0i5XNs5C/Jl+N02cMWrlXkK+HCqWMxLcTESMnd1Ka4p qVsL3oNmOhGVY/Ora0UysqUsr9VkoU4CJj/w9QNDA8hVNYXMGz6ooR1wRVzk4sEiP76M 7lug== 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=sZgUWoDIjlp1AADdoY2p7F+W0Gj8IYxrvEu+mq9KTCQ=; b=Ia7lngCwmMeUREkRmW6wO5cmLfxEencEQyBnTnSUiCcpLvUvM2jDLTw+/mxpfE9x7C XLRM11iHlmq+2bbcHNsa/sHPnvW/wEk7Ezr2dG8jCwORtzuSfJLKTi2Hm+46xPY2Lb9G +tTejbLEfdN+48MptlGlzIQUWksgPVovuJDDZCuj52okPA0wQZm/mA5kvs+ayc9I754/ mLiWYSSjC1winH3LueBzgZ/QJNjuwRXQ6be3FfacvUr6GjiQccCz6G1j1Vu4fduz853t AGq9qy47X+MtaZ29zui+GyVWNw5tvPxK0fgF63Eg3gb+7/ZNR2mHOGamLlA9F6CkHDgh JMxQ== X-Gm-Message-State: APjAAAXYzhakwbiiAo+SZtmypP/JGzWLz5Uztg8/FmqbDaoRXoUjHSii mHixv0SS+Au/jFm4HYsNviYvoQ== X-Received: by 2002:a1c:e0c4:: with SMTP id x187mr21406913wmg.177.1560349620555; Wed, 12 Jun 2019 07:27:00 -0700 (PDT) Received: from dell.watershed.co.uk ([185.80.132.160]) by smtp.gmail.com with ESMTPSA id y18sm203959wmd.29.2019.06.12.07.26.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jun 2019 07:27:00 -0700 (PDT) From: Lee Jones To: alokc@codeaurora.org, agross@kernel.org, david.brown@linaro.org, wsa+renesas@sang-engineering.com, bjorn.andersson@linaro.org, balbi@kernel.org, gregkh@linuxfoundation.org, ard.biesheuvel@linaro.org, jlhugo@gmail.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-i2c@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-gpio@vger.kernel.org, linux-usb@vger.kernel.or, Lee Jones Subject: [PATCH v4 2/6] i2c: i2c-qcom-geni: Signify successful driver probe Date: Wed, 12 Jun 2019 15:26:50 +0100 Message-Id: <20190612142654.9639-3-lee.jones@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190612142654.9639-1-lee.jones@linaro.org> References: <20190612142654.9639-1-lee.jones@linaro.org> Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org The Qualcomm Geni I2C driver currently probes silently which can be confusing when debugging potential issues. Add a low level (INFO) print when each I2C controller is successfully initially set-up. Signed-off-by: Lee Jones Acked-by: Ard Biesheuvel Acked-by: Bjorn Andersson --- drivers/i2c/busses/i2c-qcom-geni.c | 2 ++ 1 file changed, 2 insertions(+) -- 2.17.1 diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c index 9e3b8a98688d..a89bfce5388e 100644 --- a/drivers/i2c/busses/i2c-qcom-geni.c +++ b/drivers/i2c/busses/i2c-qcom-geni.c @@ -596,6 +596,8 @@ static int geni_i2c_probe(struct platform_device *pdev) return ret; } + dev_dbg(&pdev->dev, "Geni-I2C adaptor successfully added\n"); + return 0; } From patchwork Wed Jun 12 14:26:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 166572 Delivered-To: patch@linaro.org Received: by 2002:a92:4782:0:0:0:0:0 with SMTP id e2csp3752055ilk; Wed, 12 Jun 2019 07:27:07 -0700 (PDT) X-Google-Smtp-Source: APXvYqw7gBhni0V0qqbwNP0dAu9G00HvdipjQ1Omm/ygtSl0di0Sp1W6/MebEtaLDyropBJEIAAG X-Received: by 2002:a63:4c0f:: with SMTP id z15mr25061097pga.245.1560349627275; Wed, 12 Jun 2019 07:27:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1560349627; cv=none; d=google.com; s=arc-20160816; b=TG5V43Mf3uafGvOhgGp7ij/9cvdnQMUfYlEmBmQZEy7sqNxwDDQs7Ij7lRXasdr0xF o+Fwd2WC2u0Uxh9c0BKpU7QlTHfIS0YOrIZvK/WT856FQ8ly4uYSFnQhJYIGdwp7w3L1 Fs5zS4Q1pMwAbqUNj5Xz68k1/wC7mxqM7boaW1QfyRBDOAGFGVmKNSRXWfBGelFBD6s2 WgPatoo4JAgHPyE48QiLxoqgI8py0/26iXW6jkU2vP+7Rucb0xUG8tlf4gWs5YldPaD8 NqcWguLNOdTRBvPgxD3GwBpLMMVp8HAxIMFYIGjGBEmZQkJt2LOWSf2rG7cTaFgikSkH QPdQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=bBBjtsXpcEJMfhJ/zGBVzEqJe4/n/LroMtcEMeEwI4E=; b=G3mH/M6GRnJLTnMVay46pIAq0atS8Pw9Jh23eMzcIoobnYXn1xWAZm5m7q588Foq9k jVQtuBh3EwVMZBmpxPyjP4Ook8D13qjT8UGUxxXXLawFwjDrl1LdIn7C7OyMP2nMws2P lkdzjfmDvx6QFvXm12XbBnMxoBAAC3Qf+BVta3XH+gCH44LzeMUTJVsX3jYj3Mug6MMZ m/sdFe8GAtoNO0ZoSWHRjdv1OYY8McOys3Ls8qqC9XPBmyee0Fo/Ufbj7RMsG+Kexvln 8loKN9ktc9LAmPdqpLAvHC3kaVGN+/iZE6FUJlapBKXm/cG57ZwAcmeR6YpC3gjelv8U +asQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=kRBMCZlg; spf=pass (google.com: best guess record for domain of linux-i2c-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-i2c-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j17si5477134pfa.17.2019.06.12.07.27.07; Wed, 12 Jun 2019 07:27:07 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-i2c-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=kRBMCZlg; spf=pass (google.com: best guess record for domain of linux-i2c-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-i2c-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2439686AbfFLO1F (ORCPT + 2 others); Wed, 12 Jun 2019 10:27:05 -0400 Received: from mail-wm1-f67.google.com ([209.85.128.67]:35238 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2439655AbfFLO1F (ORCPT ); Wed, 12 Jun 2019 10:27:05 -0400 Received: by mail-wm1-f67.google.com with SMTP id c6so6790562wml.0 for ; Wed, 12 Jun 2019 07:27:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bBBjtsXpcEJMfhJ/zGBVzEqJe4/n/LroMtcEMeEwI4E=; b=kRBMCZlgun5ZHulsq5/mIT8jt3z3kkkCNI3R56ViL6VJuo2reuzgg8QgNVTDZhdigH I43g5qom1cpzkIlnDF0YFnPg9EvdvAftWVLIroZzrlHiMmeNKQxFBpoaOQfvDo9kUif/ RbtmKHecVMOjsrNxzqENqpnP2aNuTS5C6PKpgkVqFWaY4TSpf6v5/nmfs/3za1z5cMqd tnpgkTb5hySdpzRMBb416aaEUmFd3+gyLEpnKoiQq9xrEvICrBfdmONsBjSFwatJKQ+0 ZBxZy6qSXnu+4WsyTjXGi+BfZ4w0zuRjtbQobzv1pIHoeSJiQVFqB0R156Bs7AEAouGD Gkqw== 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=bBBjtsXpcEJMfhJ/zGBVzEqJe4/n/LroMtcEMeEwI4E=; b=OXtMGq0MpAmmdzcceS0Ts48bLXPLqav348QrWxM5jJfdPVaUIob4koEhLGymL7Z1bS w1RndXOO1K5uSfJLJpx/6wMG08ymBFocYY1LhuZPFYH5rhBY5yYOI4uYCBUILDxkURL5 gYgHP3EOpWgsUD3mZU+qA/NKQvlTxaXlzapnvuDYgkMjCSgdnXARuzM8MyIcr97QPncB lpgDk0icbnrMQivuo4QLe1y3EXlQPas+PLoM6DiEzpb+nP+ZJHYN/EHqV2PTFyu0ngZv DhgD5GfzIPIg4wAPOIGtmZS9TbwxS+0rxPLcFI0WSGvPxYGL2aS5CzfSnTct6Et7Umus zDUg== X-Gm-Message-State: APjAAAX44dFI4sij1mBE74ZElVcLHu/79trRwKUcMsA8SXlD1YjLUsjH zPNaAv8Torqdq5XaGTYV7WT14rcnyic= X-Received: by 2002:a1c:f018:: with SMTP id a24mr3684607wmb.66.1560349622705; Wed, 12 Jun 2019 07:27:02 -0700 (PDT) Received: from dell.watershed.co.uk ([185.80.132.160]) by smtp.gmail.com with ESMTPSA id y18sm203959wmd.29.2019.06.12.07.27.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jun 2019 07:27:02 -0700 (PDT) From: Lee Jones To: alokc@codeaurora.org, agross@kernel.org, david.brown@linaro.org, wsa+renesas@sang-engineering.com, bjorn.andersson@linaro.org, balbi@kernel.org, gregkh@linuxfoundation.org, ard.biesheuvel@linaro.org, jlhugo@gmail.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-i2c@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-gpio@vger.kernel.org, linux-usb@vger.kernel.or, Lee Jones Subject: [PATCH v4 4/6] usb: dwc3: qcom: Add support for booting with ACPI Date: Wed, 12 Jun 2019 15:26:52 +0100 Message-Id: <20190612142654.9639-5-lee.jones@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190612142654.9639-1-lee.jones@linaro.org> References: <20190612142654.9639-1-lee.jones@linaro.org> Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org In Linux, the DWC3 core exists as its own independent platform device. Thus when describing relationships in Device Tree, the current default boot configuration table option, the DWC3 core often resides as a child of the platform specific node. Both of which are given their own address space descriptions and the drivers can be mostly agnostic to each other. However, other Operating Systems have taken a more monolithic approach, which is evident in the configuration ACPI tables for the Qualcomm Snapdragon SDM850, where all DWC3 (core and platform) components are described under a single IO memory region. To ensure successful booting using the supplied ACPI tables, we need to devise a way to chop up the address regions provided and subsequently register the DWC3 core with the resultant information, which is precisely what this patch aims to achieve. Signed-off-by: Lee Jones Reviewed-by: Bjorn Andersson --- drivers/usb/dwc3/Kconfig | 2 +- drivers/usb/dwc3/dwc3-qcom.c | 206 ++++++++++++++++++++++++++++++----- 2 files changed, 179 insertions(+), 29 deletions(-) -- 2.17.1 diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig index 2b1494460d0c..6dab3fd1e233 100644 --- a/drivers/usb/dwc3/Kconfig +++ b/drivers/usb/dwc3/Kconfig @@ -116,7 +116,7 @@ config USB_DWC3_ST config USB_DWC3_QCOM tristate "Qualcomm Platform" depends on EXTCON && (ARCH_QCOM || COMPILE_TEST) - depends on OF + depends on (OF || ACPI) default USB_DWC3 help Some Qualcomm SoCs use DesignWare Core IP for USB2/3 diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c index 184df4daa590..1e1f12b7991d 100644 --- a/drivers/usb/dwc3/dwc3-qcom.c +++ b/drivers/usb/dwc3/dwc3-qcom.c @@ -4,6 +4,7 @@ * Inspired by dwc3-of-simple.c */ +#include #include #include #include @@ -38,6 +39,20 @@ #define PWR_EVNT_LPM_IN_L2_MASK BIT(4) #define PWR_EVNT_LPM_OUT_L2_MASK BIT(5) +#define SDM845_QSCRATCH_BASE_OFFSET 0xf8800 +#define SDM845_QSCRATCH_SIZE 0x400 +#define SDM845_DWC3_CORE_SIZE 0xcd00 + +struct dwc3_acpi_pdata { + u32 qscratch_base_offset; + u32 qscratch_base_size; + u32 dwc3_core_base_size; + int hs_phy_irq_index; + int dp_hs_phy_irq_index; + int dm_hs_phy_irq_index; + int ss_phy_irq_index; +}; + struct dwc3_qcom { struct device *dev; void __iomem *qscratch_base; @@ -56,6 +71,8 @@ struct dwc3_qcom { struct notifier_block vbus_nb; struct notifier_block host_nb; + const struct dwc3_acpi_pdata *acpi_pdata; + enum usb_dr_mode mode; bool is_suspended; bool pm_suspended; @@ -300,12 +317,27 @@ static void dwc3_qcom_select_utmi_clk(struct dwc3_qcom *qcom) PIPE_UTMI_CLK_DIS); } +static int dwc3_qcom_get_irq(struct platform_device *pdev, + const char *name, int num) +{ + struct device_node *np = pdev->dev.of_node; + int ret; + + if (np) + ret = platform_get_irq_byname(pdev, name); + else + ret = platform_get_irq(pdev, num); + + return ret; +} + static int dwc3_qcom_setup_irq(struct platform_device *pdev) { struct dwc3_qcom *qcom = platform_get_drvdata(pdev); + const struct dwc3_acpi_pdata *pdata = qcom->acpi_pdata; int irq, ret; - - irq = platform_get_irq_byname(pdev, "hs_phy_irq"); + irq = dwc3_qcom_get_irq(pdev, "hs_phy_irq", + pdata ? pdata->hs_phy_irq_index : -1); if (irq > 0) { /* Keep wakeup interrupts disabled until suspend */ irq_set_status_flags(irq, IRQ_NOAUTOEN); @@ -320,7 +352,8 @@ static int dwc3_qcom_setup_irq(struct platform_device *pdev) qcom->hs_phy_irq = irq; } - irq = platform_get_irq_byname(pdev, "dp_hs_phy_irq"); + irq = dwc3_qcom_get_irq(pdev, "dp_hs_phy_irq", + pdata ? pdata->dp_hs_phy_irq_index : -1); if (irq > 0) { irq_set_status_flags(irq, IRQ_NOAUTOEN); ret = devm_request_threaded_irq(qcom->dev, irq, NULL, @@ -334,7 +367,8 @@ static int dwc3_qcom_setup_irq(struct platform_device *pdev) qcom->dp_hs_phy_irq = irq; } - irq = platform_get_irq_byname(pdev, "dm_hs_phy_irq"); + irq = dwc3_qcom_get_irq(pdev, "dm_hs_phy_irq", + pdata ? pdata->dm_hs_phy_irq_index : -1); if (irq > 0) { irq_set_status_flags(irq, IRQ_NOAUTOEN); ret = devm_request_threaded_irq(qcom->dev, irq, NULL, @@ -348,7 +382,8 @@ static int dwc3_qcom_setup_irq(struct platform_device *pdev) qcom->dm_hs_phy_irq = irq; } - irq = platform_get_irq_byname(pdev, "ss_phy_irq"); + irq = dwc3_qcom_get_irq(pdev, "ss_phy_irq", + pdata ? pdata->ss_phy_irq_index : -1); if (irq > 0) { irq_set_status_flags(irq, IRQ_NOAUTOEN); ret = devm_request_threaded_irq(qcom->dev, irq, NULL, @@ -371,11 +406,11 @@ static int dwc3_qcom_clk_init(struct dwc3_qcom *qcom, int count) struct device_node *np = dev->of_node; int i; - qcom->num_clocks = count; - - if (!count) + if (!np || !count) return 0; + qcom->num_clocks = count; + qcom->clks = devm_kcalloc(dev, qcom->num_clocks, sizeof(struct clk *), GFP_KERNEL); if (!qcom->clks) @@ -409,12 +444,103 @@ static int dwc3_qcom_clk_init(struct dwc3_qcom *qcom, int count) return 0; } -static int dwc3_qcom_probe(struct platform_device *pdev) +static int dwc3_qcom_acpi_register_core(struct platform_device *pdev) { + struct dwc3_qcom *qcom = platform_get_drvdata(pdev); + struct device *dev = &pdev->dev; + struct resource *res, *child_res = NULL; + int irq; + int ret; + + qcom->dwc3 = platform_device_alloc("dwc3", PLATFORM_DEVID_AUTO); + if (!qcom->dwc3) + return -ENOMEM; + + qcom->dwc3->dev.parent = dev; + qcom->dwc3->dev.type = dev->type; + qcom->dwc3->dev.dma_mask = dev->dma_mask; + qcom->dwc3->dev.dma_parms = dev->dma_parms; + qcom->dwc3->dev.coherent_dma_mask = dev->coherent_dma_mask; + + child_res = kcalloc(2, sizeof(*child_res), GFP_KERNEL); + if (!child_res) + return -ENOMEM; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "failed to get memory resource\n"); + ret = -ENODEV; + goto out; + } + + child_res[0].flags = res->flags; + child_res[0].start = res->start; + child_res[0].end = child_res[0].start + + qcom->acpi_pdata->dwc3_core_base_size; + + irq = platform_get_irq(pdev, 0); + child_res[1].flags = IORESOURCE_IRQ; + child_res[1].start = child_res[1].end = irq; + + ret = platform_device_add_resources(qcom->dwc3, child_res, 2); + if (ret) { + dev_err(&pdev->dev, "failed to add resources\n"); + goto out; + } + + ret = platform_device_add(qcom->dwc3); + if (ret) + dev_err(&pdev->dev, "failed to add device\n"); + +out: + kfree(child_res); + return ret; +} + +static int dwc3_qcom_of_register_core(struct platform_device *pdev) +{ + struct dwc3_qcom *qcom = platform_get_drvdata(pdev); struct device_node *np = pdev->dev.of_node, *dwc3_np; struct device *dev = &pdev->dev; + int ret; + + dwc3_np = of_get_child_by_name(np, "dwc3"); + if (!dwc3_np) { + dev_err(dev, "failed to find dwc3 core child\n"); + return -ENODEV; + } + + ret = of_platform_populate(np, NULL, NULL, dev); + if (ret) { + dev_err(dev, "failed to register dwc3 core - %d\n", ret); + return ret; + } + + qcom->dwc3 = of_find_device_by_node(dwc3_np); + if (!qcom->dwc3) { + dev_err(dev, "failed to get dwc3 platform device\n"); + return -ENODEV; + } + + return 0; +} + +static const struct dwc3_acpi_pdata sdm845_acpi_pdata = { + .qscratch_base_offset = SDM845_QSCRATCH_BASE_OFFSET, + .qscratch_base_size = SDM845_QSCRATCH_SIZE, + .dwc3_core_base_size = SDM845_DWC3_CORE_SIZE, + .hs_phy_irq_index = 1, + .dp_hs_phy_irq_index = 4, + .dm_hs_phy_irq_index = 3, + .ss_phy_irq_index = 2 +}; + +static int dwc3_qcom_probe(struct platform_device *pdev) +{ + struct device_node *np = pdev->dev.of_node; + struct device *dev = &pdev->dev; struct dwc3_qcom *qcom; - struct resource *res; + struct resource *res, *parent_res = NULL; int ret, i; bool ignore_pipe_clk; @@ -425,6 +551,14 @@ static int dwc3_qcom_probe(struct platform_device *pdev) platform_set_drvdata(pdev, qcom); qcom->dev = &pdev->dev; + if (ACPI_HANDLE(dev)) { + qcom->acpi_pdata = acpi_device_get_match_data(dev); + if (!qcom->acpi_pdata) { + dev_err(&pdev->dev, "no supporting ACPI device data\n"); + return -EINVAL; + } + } + qcom->resets = devm_reset_control_array_get_optional_exclusive(dev); if (IS_ERR(qcom->resets)) { ret = PTR_ERR(qcom->resets); @@ -454,7 +588,21 @@ static int dwc3_qcom_probe(struct platform_device *pdev) } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - qcom->qscratch_base = devm_ioremap_resource(dev, res); + + if (np) { + parent_res = res; + } else { + parent_res = kmemdup(res, sizeof(struct resource), GFP_KERNEL); + if (!parent_res) + return -ENOMEM; + + parent_res->start = res->start + + qcom->acpi_pdata->qscratch_base_offset; + parent_res->end = parent_res->start + + qcom->acpi_pdata->qscratch_base_size; + } + + qcom->qscratch_base = devm_ioremap_resource(dev, parent_res); if (IS_ERR(qcom->qscratch_base)) { dev_err(dev, "failed to map qscratch, err=%d\n", ret); ret = PTR_ERR(qcom->qscratch_base); @@ -462,13 +610,8 @@ static int dwc3_qcom_probe(struct platform_device *pdev) } ret = dwc3_qcom_setup_irq(pdev); - if (ret) - goto clk_disable; - - dwc3_np = of_get_child_by_name(np, "dwc3"); - if (!dwc3_np) { - dev_err(dev, "failed to find dwc3 core child\n"); - ret = -ENODEV; + if (ret) { + dev_err(dev, "failed to setup IRQs, err=%d\n", ret); goto clk_disable; } @@ -481,16 +624,13 @@ static int dwc3_qcom_probe(struct platform_device *pdev) if (ignore_pipe_clk) dwc3_qcom_select_utmi_clk(qcom); - ret = of_platform_populate(np, NULL, NULL, dev); - if (ret) { - dev_err(dev, "failed to register dwc3 core - %d\n", ret); - goto clk_disable; - } + if (np) + ret = dwc3_qcom_of_register_core(pdev); + else + ret = dwc3_qcom_acpi_register_core(pdev); - qcom->dwc3 = of_find_device_by_node(dwc3_np); - if (!qcom->dwc3) { - dev_err(&pdev->dev, "failed to get dwc3 platform device\n"); - ret = -ENODEV; + if (ret) { + dev_err(dev, "failed to register DWC3 Core, err=%d\n", ret); goto depopulate; } @@ -514,7 +654,10 @@ static int dwc3_qcom_probe(struct platform_device *pdev) return 0; depopulate: - of_platform_depopulate(&pdev->dev); + if (np) + of_platform_depopulate(&pdev->dev); + else + platform_device_put(pdev); clk_disable: for (i = qcom->num_clocks - 1; i >= 0; i--) { clk_disable_unprepare(qcom->clks[i]); @@ -601,6 +744,12 @@ static const struct of_device_id dwc3_qcom_of_match[] = { }; MODULE_DEVICE_TABLE(of, dwc3_qcom_of_match); +static const struct acpi_device_id dwc3_qcom_acpi_match[] = { + { "QCOM2430", (unsigned long)&sdm845_acpi_pdata }, + { }, +}; +MODULE_DEVICE_TABLE(acpi, dwc3_qcom_acpi_match); + static struct platform_driver dwc3_qcom_driver = { .probe = dwc3_qcom_probe, .remove = dwc3_qcom_remove, @@ -608,6 +757,7 @@ static struct platform_driver dwc3_qcom_driver = { .name = "dwc3-qcom", .pm = &dwc3_qcom_dev_pm_ops, .of_match_table = dwc3_qcom_of_match, + .acpi_match_table = ACPI_PTR(dwc3_qcom_acpi_match), }, }; From patchwork Wed Jun 12 14:26:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 166571 Delivered-To: patch@linaro.org Received: by 2002:a92:4782:0:0:0:0:0 with SMTP id e2csp3752042ilk; Wed, 12 Jun 2019 07:27:06 -0700 (PDT) X-Google-Smtp-Source: APXvYqzedHwDiTzmuasSdqj4ukhy8tu0mkWvoNaHIv1GUgr+S0oFo0DJsOHI4JMORH5FXuMyXhbb X-Received: by 2002:a17:902:2883:: with SMTP id f3mr82062003plb.111.1560349626494; Wed, 12 Jun 2019 07:27:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1560349626; cv=none; d=google.com; s=arc-20160816; b=n/zzZNXP8/n5Q6tK+ah94WSYPQIFRO9Lm8wTkVgdejLPG6z5IM8bHPYQgiY3ukgOhb XeNkK5E3MaO4jhQB2uv1PIQ7Yp1Xfx/5kXd7rzwtfv5MVHDkIChxHProkPKswwF2+flI k5rPy85/ro8Kmzl8rp274AnN6YicTGzgQe396JaaWXQjkMTG9yVvgSmy+DBModXRybYr twJIavrfBz9CjMgVT4voksUCu0ZbEnXrVLt+gV8oyvvGhGW0llqYBuEmj3w+AkSt9mux dKHlbXesGsimvIdMvZckqDqGv/zMN5NsGsObKqtO0akhrY6662M+QLjhUFiNjAZMLogN sSqA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=fy6aQtpj04fOwVei4zMchW/ihmwVQAgPeocDj7znWWs=; b=ZSJi4whS4A/dLt+TO7dXx4MVOE5W5AqQcPnWQdvgOG4gQHP3QLxDnX/+lDCY13Rmf/ JFNuklRupJZK23JdmJ5sQsPuwl265HT7zRhJFpg7xFom9KeX9f5QcQGbV4uN4mFFzz3o U3THn78MdAUJ8e1HAVb6D8PBs5VECCfrDnE8AKROKKq5KI/ZIntK6QbYzHByQvKVsZPF GddO/R+4m8Ya7GadDJfeM/z7rX3DjqL7zMgFsTlyfri49FrYehezk4Zi0npPZIbWyKE4 fUy15iI1xg9F5XfcsNMOo7ind1New4CRGuvU5AasZHumnIvbat0OI0SIcd4YrzdZZ9p1 x/2Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=OrQ5ncDI; spf=pass (google.com: best guess record for domain of linux-i2c-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-i2c-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j17si5477134pfa.17.2019.06.12.07.27.06; Wed, 12 Jun 2019 07:27:06 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-i2c-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=OrQ5ncDI; spf=pass (google.com: best guess record for domain of linux-i2c-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-i2c-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2439680AbfFLO1F (ORCPT + 2 others); Wed, 12 Jun 2019 10:27:05 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:42339 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2439674AbfFLO1F (ORCPT ); Wed, 12 Jun 2019 10:27:05 -0400 Received: by mail-wr1-f66.google.com with SMTP id x17so1865177wrl.9 for ; Wed, 12 Jun 2019 07:27:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=fy6aQtpj04fOwVei4zMchW/ihmwVQAgPeocDj7znWWs=; b=OrQ5ncDIKVyQSJV2lGbcoHTeQSe6MmmBwUcZC5zqV4QZ3vTVA1BtrgPUQ8jbMgb67v /kOxwnETofKRgBNj1b0HtE9u0AFFdOWCcPcAbfIoJnuGIvOw57czbPWLpltqHuWbXWRj fKXJ4DRXKuAYnQjGzz+tj23i+n5DN2bx3mYS5xPRMMAzHx9ZOqGZWEvU0hVNym6SnQL4 Jg4GILy6YS//Erz1lNqcpODAIzqawBCFwBpA+4APbSeGmT0vek59soiMsm8V76nAUrCv Ljz98I133N7M+6ePZoFk6KumhrqC+Uk+SpqdoVV40pdsRct4z0Cgsbt4Rq99N2yIAGwK eWDg== 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=fy6aQtpj04fOwVei4zMchW/ihmwVQAgPeocDj7znWWs=; b=PPsj179k3hDZ3vZPpeo1z28Bn0EIYDhXJhRS5P1vCz8zslZMvRziDd9suJmY7o9vhz KAkoc7+cCOvIw/8rjkOhHX2jdtIeTtBTGpZQODXAsqgBLOXVmm8HVMq0UPTgMSr6qjTl aVjeuajyRDO+tuOAZoO/vnYJJXUAsyCQBjQVpHjA7lm5NYRXf9ZLKRVeB9y2lHbJaY7O MNuZaMa0qEvfx67V3ZrkdK8TFo1Y8asG4zuom7+4JfXtf1ra7dVbzLlecPj1xN9uVUBy dmLQa0F3iRhEXV5g8TZ5kjvOZsvZM25Ls8iP2jaxtp6TSoaKCCrd9oJwRfgnAXsE1W5O 36wA== X-Gm-Message-State: APjAAAWA6KAYV9z5+VbNoi7sAuXqJUvatJLw57p+6Jj6SBpml68GW/QS GJwCKpdZvy6vbEYUs6rXzrwKUA== X-Received: by 2002:a5d:53ca:: with SMTP id a10mr42518942wrw.131.1560349623979; Wed, 12 Jun 2019 07:27:03 -0700 (PDT) Received: from dell.watershed.co.uk ([185.80.132.160]) by smtp.gmail.com with ESMTPSA id y18sm203959wmd.29.2019.06.12.07.27.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jun 2019 07:27:03 -0700 (PDT) From: Lee Jones To: alokc@codeaurora.org, agross@kernel.org, david.brown@linaro.org, wsa+renesas@sang-engineering.com, bjorn.andersson@linaro.org, balbi@kernel.org, gregkh@linuxfoundation.org, ard.biesheuvel@linaro.org, jlhugo@gmail.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-i2c@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-gpio@vger.kernel.org, linux-usb@vger.kernel.or, Lee Jones Subject: [PATCH v4 5/6] usb: dwc3: qcom: Start USB in 'host mode' on the SDM845 Date: Wed, 12 Jun 2019 15:26:53 +0100 Message-Id: <20190612142654.9639-6-lee.jones@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190612142654.9639-1-lee.jones@linaro.org> References: <20190612142654.9639-1-lee.jones@linaro.org> Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org When booting with Device Tree, the current default boot configuration table option, the request to boot via 'host mode' comes from the 'dr_mode' property. A property of the same name can be used inside ACPI tables too. However it is missing from the SDM845's ACPI tables so we have to supply this information using Platform Device Properties instead. This does not change the behaviour of any currently supported devices. The property is only set on ACPI enabled platforms, thus for H/W booting DT, unless a 'dr_mode' property is present, the default is still OTG (On-The-Go) as per [0]. Any new ACPI devices added will also be able to over-ride this implementation by providing a 'dr_mode' property in their ACPI tables. In cases where 'dr_mode' is omitted from the tables AND 'host mode' should not be the default (very unlikely), then we will have to add some way of choosing between them at run time - most likely by ACPI HID. [0] Documentation/devicetree/bindings/usb/generic.txt Signed-off-by: Lee Jones Reviewed-by: Bjorn Andersson --- drivers/usb/dwc3/dwc3-qcom.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) -- 2.17.1 diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c index 1e1f12b7991d..55ba04254e38 100644 --- a/drivers/usb/dwc3/dwc3-qcom.c +++ b/drivers/usb/dwc3/dwc3-qcom.c @@ -444,6 +444,11 @@ static int dwc3_qcom_clk_init(struct dwc3_qcom *qcom, int count) return 0; } +static const struct property_entry dwc3_qcom_acpi_properties[] = { + PROPERTY_ENTRY_STRING("dr_mode", "host"), + {} +}; + static int dwc3_qcom_acpi_register_core(struct platform_device *pdev) { struct dwc3_qcom *qcom = platform_get_drvdata(pdev); @@ -488,6 +493,13 @@ static int dwc3_qcom_acpi_register_core(struct platform_device *pdev) goto out; } + ret = platform_device_add_properties(qcom->dwc3, + dwc3_qcom_acpi_properties); + if (ret < 0) { + dev_err(&pdev->dev, "failed to add properties\n"); + goto out; + } + ret = platform_device_add(qcom->dwc3); if (ret) dev_err(&pdev->dev, "failed to add device\n");