From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752463AbdDCNmv (ORCPT ); Mon, 3 Apr 2017 09:42:51 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:41966 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753390AbdDCNmd (ORCPT ); Mon, 3 Apr 2017 09:42:33 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org E635B60DD8 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=vivek.gautam@codeaurora.org From: Vivek Gautam To: linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org, linux-usb@vger.kernel.org Cc: p.zabel@pengutronix.de, swarren@wwwdotorg.org, thierry.reding@gmail.com, balbi@kernel.org, Vivek Gautam Subject: [PATCH v2 3/4] usb: dwc3: of-simple: Add support to get resets for the device Date: Mon, 3 Apr 2017 19:12:01 +0530 Message-Id: <1491226922-20307-4-git-send-email-vivek.gautam@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1491226922-20307-1-git-send-email-vivek.gautam@codeaurora.org> References: <1491226922-20307-1-git-send-email-vivek.gautam@codeaurora.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support to get a list of resets available for the device. These resets must be kept de-asserted until the device is in use. Cc: Felipe Balbi Cc: Philipp Zabel Signed-off-by: Vivek Gautam --- Changes since v1: - Using new APIs for reset control array. - Using the *_get_exclusive() API. - Added reset_control_array_put() to error and driver removal path. drivers/usb/dwc3/dwc3-of-simple.c | 45 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/drivers/usb/dwc3/dwc3-of-simple.c b/drivers/usb/dwc3/dwc3-of-simple.c index fe414e7a9c78..96786f5ede0b 100644 --- a/drivers/usb/dwc3/dwc3-of-simple.c +++ b/drivers/usb/dwc3/dwc3-of-simple.c @@ -29,13 +29,48 @@ #include #include #include +#include struct dwc3_of_simple { struct device *dev; struct clk **clks; int num_clocks; + int num_resets; + struct reset_control_array *resets; }; +static int dwc3_of_simple_reset_init(struct dwc3_of_simple *simple, int count) +{ + struct device *dev = simple->dev; + int ret; + + /* Not all platforms have resets, so don't return a failure */ + if (count < 0) + return 0; + + simple->num_resets = count; + + simple->resets = devm_kcalloc(dev, count, sizeof(simple->resets), + GFP_KERNEL); + if (!simple->resets) + return -ENOMEM; + + ret = of_reset_control_array_get_exclusive(dev->of_node, count, + simple->resets); + if (ret) { + dev_err(dev, "failed to get device resets\n"); + return ret; + } + + ret = reset_control_array_deassert(count, simple->resets); + if (ret) { + reset_control_array_put(count, simple->resets); + return ret; + } + + return 0; +} + static int dwc3_of_simple_clk_init(struct dwc3_of_simple *simple, int count) { struct device *dev = simple->dev; @@ -100,6 +135,10 @@ static int dwc3_of_simple_probe(struct platform_device *pdev) if (ret) return ret; + ret = dwc3_of_simple_reset_init(simple, of_reset_control_get_count(np)); + if (ret) + return ret; + ret = of_platform_populate(np, NULL, NULL, dev); if (ret) { for (i = 0; i < simple->num_clocks; i++) { @@ -107,6 +146,9 @@ static int dwc3_of_simple_probe(struct platform_device *pdev) clk_put(simple->clks[i]); } + reset_control_array_assert(simple->num_resets, simple->resets); + reset_control_array_put(simple->num_resets, simple->resets); + return ret; } @@ -128,6 +170,9 @@ static int dwc3_of_simple_remove(struct platform_device *pdev) clk_put(simple->clks[i]); } + reset_control_array_assert(simple->num_resets, simple->resets); + reset_control_array_put(simple->num_resets, simple->resets); + of_platform_depopulate(dev); pm_runtime_put_sync(dev); -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project