From patchwork Sun Jan 28 20:03:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Blumenstingl X-Patchwork-Id: 10187943 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id BDA1060384 for ; Sun, 28 Jan 2018 20:04:20 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9F7E82870B for ; Sun, 28 Jan 2018 20:04:20 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8FA432870E; Sun, 28 Jan 2018 20:04:20 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 0FFA628700 for ; Sun, 28 Jan 2018 20:04:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=+nN9oF4VodzkEDW1PnF4xDW3sNG+25PZmZEDq6Dnsh0=; b=sa5U8Qs4gXK8ZpUUvIHKNAHN7/ o3NX/CWPobkukwrmgKbP0nQ7qc8Y0XQqJ2KJO9c88ucv+37HII9T+S6KEQnxglAqazTRO/pYjD5EO NumhpSJumLZsUrk+OgzBTRg/qMZFWOUsaxvnBfFwDqOucQ4y6YQnkdwTPp7fsxH+NtJBUp3umICGz wzdqi0K1RGgwlqTiXBPa5AK0cZ9LJVejZ6isv8c2AFbQvdT08rNGrfMiwcWXbt2xVV+oVLd7ddzQO P6V7NR8Z9E/gBAXZMadYLtsv1FAeGbhyCwNV49QSRg6ot6Vcu+PrP4/JvPSlo4ojMocazwA48ehqI tLu4KV7A==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.89 #1 (Red Hat Linux)) id 1eftBQ-0001Yk-EI; Sun, 28 Jan 2018 20:04:08 +0000 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]) by bombadil.infradead.org with esmtps (Exim 4.89 #1 (Red Hat Linux)) id 1eftBL-0001UI-Uo for linux-amlogic@lists.infradead.org; Sun, 28 Jan 2018 20:04:06 +0000 Received: by mail-wm0-x244.google.com with SMTP id g1so10314084wmg.2 for ; Sun, 28 Jan 2018 12:03:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=r3DUG6yo9aM6bjmleh7QDLDMQJlSaaQWvTU1LDkWHbk=; b=SisiGFR5PK8WNNItb0Mf8Gm/jRmtLoPG6X+WZUlT/SbJMhis3NgtNxbiYXWjfcZ130 07OLW916y7HnkLt+Gq2mWDX1bNxtEAZKc4Ap31gIsc5W+WTPhBJta00MES9KsxrMYSVd EJBZl21j3tpBWGVGOPqfzCGbQ9pj19/1b/g+nI9y27f/ImUChDHioguJANz3Y4tdKGS+ 5R1spU7JahFtPYtR1gQ7PQjdUkjR6dfbVghiMa3KSyUX34/dtTZGzM6z6wXUZ4OVgJT4 PItwM1SPX1lO9QgfEwJ2A4jZDq+ws/8Y/k7by2Ays+qk8JzKg9V5FwkPPn6bcjehSOJO 4ttQ== 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=r3DUG6yo9aM6bjmleh7QDLDMQJlSaaQWvTU1LDkWHbk=; b=QFQ1yPuJVRfA1bi2k9lc43HfLkQSon3a2GqbT3Ft3joS8nhbDN7d2Lego1Wdf7tCxH OF8FtQ68fMlKIudu4/Xp8VFidRdZMLSmZVSgYlGpVjyiGJ44V1xNQOBuVPF2D6N/QSsU NjZK8k0G/imL2IsRfkGnUWk/kQ6PVXUy4G5kiMaVX8YDw9p86vMO6qaYQJM0KMxATMXG hwfOSkfe+5sNkYnrWmUJLcHEl9u44jRNY+OWhQ/xl+SqtsBrzl3U+BOro8eZIrpen1X7 cliChOyQoNhlmd4DmIaoHJAK38l/xJdi2UHw3KRuy1QiJeLr3BYVrenvI6ZEZlLYj3+s kJgg== X-Gm-Message-State: AKwxytfQDL8w83Gn68DmpskvekiWarIJN6VAD/ypvcaUhKjK6mMOYD5Q 1hKD+m9bXG9tiaSKuKyIi+SDcjr5 X-Google-Smtp-Source: AH8x2277eKbepQtiY/FoDjMTSQb4kMC/wIWj5KeB1HBPCUvbNKMzWjiKif0rCu7d/WgymTtxJ4nI+g== X-Received: by 10.28.109.10 with SMTP id i10mr17516031wmc.107.1517169832117; Sun, 28 Jan 2018 12:03:52 -0800 (PST) Received: from blackbox.darklights.net (p5DD9B288.dip0.t-ipconnect.de. [93.217.178.136]) by smtp.googlemail.com with ESMTPSA id 19sm1524596wrx.73.2018.01.28.12.03.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 28 Jan 2018 12:03:51 -0800 (PST) From: Martin Blumenstingl To: gregkh@linuxfoundation.org, robh+dt@kernel.org, mark.rutland@arm.com, balbi@kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org Subject: [PATCH 2/3] usb: dwc3: of-simple: add support for shared and pulsed reset lines Date: Sun, 28 Jan 2018 21:03:32 +0100 Message-Id: <20180128200333.20093-3-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.16.1 In-Reply-To: <20180128200333.20093-1-martin.blumenstingl@googlemail.com> References: <20180128200333.20093-1-martin.blumenstingl@googlemail.com> X-BeenThere: linux-amlogic@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Martin Blumenstingl , linux-amlogic@lists.infradead.org MIME-Version: 1.0 Sender: "linux-amlogic" Errors-To: linux-amlogic-bounces+patchwork-linux-amlogic=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Some SoCs (such as Amlogic Meson GXL for example) share the reset line with other components (in case of the Meson GXL example there's a shared reset line between the USB2 PHYs, USB3 PHYs and the dwc3 controller). Additionally SoC implementations may prefer a reset pulse over level resets. Add an internal per-of_device_id struct which can be used to configure whether the reset lines are shared and whether they use level or pulse resets. For now this falls back to the old defaults, which are: - reset lines are exclusive - level resets are being used Signed-off-by: Martin Blumenstingl --- drivers/usb/dwc3/dwc3-of-simple.c | 65 ++++++++++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 11 deletions(-) diff --git a/drivers/usb/dwc3/dwc3-of-simple.c b/drivers/usb/dwc3/dwc3-of-simple.c index 7ae0eefc7cc7..ceb9f0cd822a 100644 --- a/drivers/usb/dwc3/dwc3-of-simple.c +++ b/drivers/usb/dwc3/dwc3-of-simple.c @@ -22,11 +22,22 @@ #include #include +/** + * struct dwc3_of_simple_params - hardware specific parameters + * @shared_resets: indicates that the resets are shared or exclusive + * @pulse_resets: use a reset pulse instead of level based resets + */ +struct dwc3_of_simple_params { + bool shared_resets; + bool pulse_resets; +}; + struct dwc3_of_simple { struct device *dev; struct clk **clks; int num_clocks; struct reset_control *resets; + const struct dwc3_of_simple_params *params; }; static int dwc3_of_simple_clk_init(struct dwc3_of_simple *simple, int count) @@ -90,17 +101,26 @@ static int dwc3_of_simple_probe(struct platform_device *pdev) platform_set_drvdata(pdev, simple); simple->dev = dev; + simple->params = of_device_get_match_data(dev); - simple->resets = of_reset_control_array_get_optional_exclusive(np); + simple->resets = of_reset_control_array_get(np, + simple->params->shared_resets, + true); if (IS_ERR(simple->resets)) { ret = PTR_ERR(simple->resets); dev_err(dev, "failed to get device resets, err=%d\n", ret); return ret; } - ret = reset_control_deassert(simple->resets); - if (ret) - goto err_resetc_put; + if (simple->params->pulse_resets) { + ret = reset_control_reset(simple->resets); + if (ret) + goto err_resetc_put; + } else { + ret = reset_control_deassert(simple->resets); + if (ret) + goto err_resetc_put; + } ret = dwc3_of_simple_clk_init(simple, of_count_phandle_with_args(np, "clocks", "#clock-cells")); @@ -124,7 +144,8 @@ static int dwc3_of_simple_probe(struct platform_device *pdev) return 0; err_resetc_assert: - reset_control_assert(simple->resets); + if (!simple->params->pulse_resets) + reset_control_assert(simple->resets); err_resetc_put: reset_control_put(simple->resets); @@ -144,7 +165,9 @@ static int dwc3_of_simple_remove(struct platform_device *pdev) clk_put(simple->clks[i]); } - reset_control_assert(simple->resets); + if (!simple->params->pulse_resets) + reset_control_assert(simple->resets); + reset_control_put(simple->resets); pm_runtime_put_sync(dev); @@ -189,12 +212,32 @@ static const struct dev_pm_ops dwc3_of_simple_dev_pm_ops = { dwc3_of_simple_runtime_resume, NULL) }; +static const struct dwc3_of_simple_params dwc3_of_simple_default_params = { + .shared_resets = false, + .pulse_resets = false, +}; + static const struct of_device_id of_dwc3_simple_match[] = { - { .compatible = "qcom,dwc3" }, - { .compatible = "rockchip,rk3399-dwc3" }, - { .compatible = "xlnx,zynqmp-dwc3" }, - { .compatible = "cavium,octeon-7130-usb-uctl" }, - { .compatible = "sprd,sc9860-dwc3" }, + { + .compatible = "qcom,dwc3", + .data = &dwc3_of_simple_default_params + }, + { + .compatible = "rockchip,rk3399-dwc3", + .data = &dwc3_of_simple_default_params + }, + { + .compatible = "xlnx,zynqmp-dwc3", + .data = &dwc3_of_simple_default_params + }, + { + .compatible = "cavium,octeon-7130-usb-uctl", + .data = &dwc3_of_simple_default_params + }, + { + .compatible = "sprd,sc9860-dwc3", + .data = &dwc3_of_simple_default_params + }, { /* Sentinel */ } }; MODULE_DEVICE_TABLE(of, of_dwc3_simple_match);